blade-code 0.10.7 → 0.10.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blade.js +2 -2
- package/dist/chunk-1w6azndv.js +1 -0
- package/dist/chunk-2gwaqpge.js +1 -0
- package/dist/chunk-2pjd4cys.js +1 -0
- package/dist/{chunk-vafn0spm.js → chunk-2thg3fq1.js} +1 -1
- package/dist/chunk-2zn5en0w.js +1 -0
- package/dist/{chunk-1v7hpr34.js → chunk-33ave20b.js} +1 -1
- package/dist/chunk-3w1z6fwm.js +1 -0
- package/dist/chunk-43x4qbvt.js +1 -0
- package/dist/{chunk-e9ckf8e7.js → chunk-4h9ff923.js} +1 -1
- package/dist/chunk-52csdk21.js +3 -0
- package/dist/{chunk-ahxc3n3g.js → chunk-66hb7kxm.js} +2 -2
- package/dist/chunk-6j8wgp2s.js +2 -0
- package/dist/chunk-6vsszvgg.js +2 -0
- package/dist/chunk-7evtr0yr.js +10 -0
- package/dist/{chunk-tp9zk241.js → chunk-7hbw6q6d.js} +1 -1
- package/dist/chunk-7zsyejr1.js +22 -0
- package/dist/{chunk-x3780wpy.js → chunk-8gcg2z3y.js} +16 -16
- package/dist/{chunk-p3ahf1fh.js → chunk-8gcvpmwk.js} +1 -1
- package/dist/{chunk-w01sec4f.js → chunk-8gnfj89a.js} +2 -2
- package/dist/{chunk-7a200q5g.js → chunk-8h0yxh6y.js} +2 -2
- package/dist/chunk-8sfycn3y.js +194 -0
- package/dist/{chunk-847e0sk9.js → chunk-954vmnrn.js} +1 -1
- package/dist/chunk-a8h3fymk.js +100 -0
- package/dist/chunk-b5szbtmp.js +5 -0
- package/dist/chunk-bxm2hq0m.js +1 -0
- package/dist/chunk-c8da4b3d.js +1 -0
- package/dist/{chunk-tc83e1b0.js → chunk-cbpqcdga.js} +1 -1
- package/dist/{chunk-qycwavck.js → chunk-cf8e7e92.js} +2 -2
- package/dist/{chunk-kqpwz9b7.js → chunk-d0g4t8fw.js} +2 -2
- package/dist/{chunk-1sw9z975.js → chunk-eq2qj9ja.js} +1 -1
- package/dist/{chunk-p0j8994h.js → chunk-fj8v7pep.js} +1 -1
- package/dist/{chunk-tcc3v4n2.js → chunk-fxpq9nh6.js} +1 -1
- package/dist/chunk-g00wj2we.js +4 -0
- package/dist/{chunk-3fdyzgpv.js → chunk-h28ptrrt.js} +1 -1
- package/dist/{chunk-qk2z6gag.js → chunk-h421wzbm.js} +2 -2
- package/dist/{chunk-4hhkbyja.js → chunk-j4tttsaz.js} +2 -2
- package/dist/{chunk-wrbm6rch.js → chunk-kagpk2x5.js} +2 -2
- package/dist/chunk-kvnwhwx3.js +1 -0
- package/dist/{chunk-mt4328yf.js → chunk-m2xrx1je.js} +1 -1
- package/dist/{chunk-g3wgzyhx.js → chunk-nhc49pan.js} +48 -48
- package/dist/{chunk-jpy61wna.js → chunk-nymm525r.js} +1 -1
- package/dist/{chunk-rz9yh6e4.js → chunk-nz57y1ad.js} +3 -3
- package/dist/{chunk-wmdgb5pz.js → chunk-p2m56new.js} +2 -2
- package/dist/{chunk-43j2f1b5.js → chunk-pv9sw79c.js} +1 -1
- package/dist/chunk-qgp08qmz.js +6 -0
- package/dist/{chunk-7pkrwh10.js → chunk-r7tsa2zv.js} +1 -1
- package/dist/{chunk-zjf1z27e.js → chunk-rkvfsx8e.js} +1 -1
- package/dist/{chunk-y573s5r8.js → chunk-rxqft6td.js} +2 -2
- package/dist/{chunk-rn908m3v.js → chunk-s9aj3p11.js} +2 -2
- package/dist/{chunk-0z7q89w7.js → chunk-senkwdh6.js} +1 -1
- package/dist/chunk-v1c58sm6.js +1 -0
- package/dist/{chunk-m86ekqp0.js → chunk-v8pq6qmv.js} +2 -2
- package/dist/chunk-van4ysq6.js +1466 -0
- package/dist/chunk-vgp8m9fg.js +2 -0
- package/dist/{chunk-ne7zdjrh.js → chunk-vsg8f0e6.js} +1 -1
- package/dist/{chunk-0n04bmta.js → chunk-w0nscjd2.js} +2 -2
- package/dist/chunk-w26jhcj9.js +1 -0
- package/dist/{chunk-qqwgb9ja.js → chunk-wmnszjmv.js} +2 -2
- package/dist/chunk-x6wgh726.js +1 -0
- package/dist/{chunk-yyvx1avz.js → chunk-xa05phpw.js} +3 -3
- package/dist/{chunk-0xm8hn2h.js → chunk-xmcsn7y0.js} +2 -2
- package/dist/{chunk-az4b6106.js → chunk-y4c3wwpa.js} +1 -1
- package/dist/{chunk-vcq624qv.js → chunk-yfs9tq3y.js} +2 -2
- package/dist/chunk-ymzcxryf.js +1 -0
- package/dist/{chunk-akev4wsz.js → chunk-zknv3d6y.js} +1 -1
- package/dist/chunk-zp4x2mwj.js +1 -0
- package/dist/chunk-zvk3g177.js +9 -0
- package/dist/web/assets/ChatView-Fqy97qw9.js +7 -0
- package/dist/web/assets/{CodeBlockHighlighter-CC4e9nFc.js → CodeBlockHighlighter-EgdsVoMQ.js} +1 -1
- package/dist/web/assets/{FilePreview-C3HEoLYS.js → FilePreview-xicd9-Sl.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-COycrGUX.js → MarkdownRenderer-DBSjC_z3.js} +18 -18
- package/dist/web/assets/SettingsModal-Bkh5rMAJ.js +5 -0
- package/dist/web/assets/TaskSwitcher-DXcj0iJ_.js +1 -0
- package/dist/web/assets/{TerminalPanel-DqQ-7CTG.js → TerminalPanel-DWVY-Elm.js} +1 -1
- package/dist/web/assets/index-Bi5ijAQP.css +1 -0
- package/dist/web/assets/index-CxEh32hc.js +32 -0
- package/dist/web/assets/{vendor-icons-D_AkWmWB.js → vendor-icons-Cv18Q6rW.js} +72 -67
- package/dist/web/assets/{vendor-radix-DBy9B2DN.js → vendor-radix-DXRuAJHH.js} +1 -1
- package/dist/web/index.html +4 -4
- package/package.json +3 -1
- package/dist/chunk-4rhssb85.js +0 -2
- package/dist/chunk-598egka3.js +0 -22
- package/dist/chunk-5ak9tw83.js +0 -100
- package/dist/chunk-738pkjf8.js +0 -1
- package/dist/chunk-7xfmzvxp.js +0 -1
- package/dist/chunk-867rz2ss.js +0 -1
- package/dist/chunk-a3e97syg.js +0 -3
- package/dist/chunk-f7854pbx.js +0 -187
- package/dist/chunk-fwt0kje3.js +0 -1
- package/dist/chunk-g1q27q6q.js +0 -2
- package/dist/chunk-g4snq0dx.js +0 -1
- package/dist/chunk-ggm04adj.js +0 -1
- package/dist/chunk-hpytxsge.js +0 -1
- package/dist/chunk-htr91q9c.js +0 -1
- package/dist/chunk-hwcp940f.js +0 -1
- package/dist/chunk-j5ysjbyr.js +0 -10
- package/dist/chunk-m8k1mv0j.js +0 -4
- package/dist/chunk-pt659n0v.js +0 -1466
- package/dist/chunk-q1gfeadm.js +0 -1
- package/dist/chunk-rk1w5pry.js +0 -2
- package/dist/chunk-rz2ftt6h.js +0 -5
- package/dist/chunk-tzh4ahry.js +0 -6
- package/dist/chunk-v0rn831t.js +0 -1
- package/dist/chunk-vynsgc2g.js +0 -1
- package/dist/chunk-w0ena7fe.js +0 -9
- package/dist/chunk-ydwjttdz.js +0 -1
- package/dist/chunk-z9fsh3kn.js +0 -1
- package/dist/web/assets/ChatView-BYfHmxKJ.js +0 -7
- package/dist/web/assets/McpModal-CDgr9kVq.js +0 -5
- package/dist/web/assets/SettingsModal-CvdVIbeG.js +0 -1
- package/dist/web/assets/SkillsModal-lSX1ZKTu.js +0 -1
- package/dist/web/assets/TaskSwitcher-peKi9KvN.js +0 -1
- package/dist/web/assets/index-BF5HEN_f.js +0 -32
- package/dist/web/assets/index-BrkTYxtS.css +0 -1
- package/dist/web/assets/useRequest-BvqVDnKl.js +0 -1
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import{e as
|
|
2
|
-
`),
|
|
3
|
-
`;
|
|
1
|
+
import{e as t9,f as s9}from"./chunk-rkvfsx8e.js";import{i as cJ,j as xJ,k as uJ}from"./chunk-m2xrx1je.js";import{r as p8}from"./chunk-d0g4t8fw.js";import{$ as h4,F as O$,H as R4,I as M4,L as $8,M as FJ,N as HJ,Q as WJ,R as LJ,W as L6,X as B6,Y as JY,Z as j4,ba as K6,t as G6,w as s2,x as a2,y as t4,z as QY}from"./chunk-van4ysq6.js";import{fa as M9,ga as C9,ha as I9,ka as $Y}from"./chunk-s9aj3p11.js";import{Ba as x4,Pa as u2}from"./chunk-8sfycn3y.js";import{_a as Y8}from"./chunk-nymm525r.js";import{Ab as v4,Eb as e$,Hb as M0,lb as E4,qb as D8,yb as T4,zb as x2}from"./chunk-a8h3fymk.js";import"./chunk-kagpk2x5.js";import{dc as mJ}from"./chunk-p2m56new.js";import{ec as Z8,fc as c8,hc as I1}from"./chunk-h421wzbm.js";import"./chunk-xmcsn7y0.js";import{Ac as b2,Bc as Q8,Ec as D4,Lc as m0,lc as M$,mc as d0,nc as t1,oc as RQ,pc as k$,qc as V8,rc as a6,sc as uQ,tc as u9,uc as i6,vc as T$,wc as Q1,xc as sJ,yc as r0,zc as gJ}from"./chunk-8gcg2z3y.js";import"./chunk-7hbw6q6d.js";import"./chunk-h28ptrrt.js";import"./chunk-b5szbtmp.js";import{Vc as lQ}from"./chunk-wmnszjmv.js";import"./chunk-eq2qj9ja.js";import"./chunk-rxqft6td.js";import{ad as F6,dd as TJ,jd as NJ,pd as eJ}from"./chunk-cf8e7e92.js";import"./chunk-senkwdh6.js";import"./chunk-vsg8f0e6.js";import"./chunk-4h9ff923.js";import{Bd as IQ,Dd as U1}from"./chunk-xa05phpw.js";import"./chunk-cbpqcdga.js";import{Fd as oJ,Id as o1}from"./chunk-8gnfj89a.js";import{ke as nJ,ue as _J,ve as tJ}from"./chunk-yfs9tq3y.js";import"./chunk-zknv3d6y.js";import{Ge as S$,He as j8,Ie as TQ}from"./chunk-6j8wgp2s.js";import{Me as u0}from"./chunk-y4c3wwpa.js";import{Ne as i9,Oe as o9,Re as D1}from"./chunk-v8pq6qmv.js";import"./chunk-fj8v7pep.js";import{bf as h9}from"./chunk-6vsszvgg.js";import{cf as sQ}from"./chunk-w0nscjd2.js";import"./chunk-33ave20b.js";import"./chunk-66hb7kxm.js";import{of as CQ}from"./chunk-954vmnrn.js";import{useMemoizedFn as f2}from"ahooks";import{useEffect as DX,useState as k2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as K$}from"ink";import{useEffect as q$,useMemo as CX,useRef as I2}from"react";import{useShallow as ZY}from"zustand/react/shallow";import{useStore as YY}from"zustand";function Q0($){return YY(T$,$)}var XY=[],v$=()=>Q0(($)=>$.session.sessionId),C1=()=>Q0(($)=>$.session.workspaceRoot),eQ=()=>Q0(($)=>$.session.messages),$4=()=>Q0(($)=>$.session.clearCount),Q4=()=>Q0(($)=>$.session.isCompacting),J4=()=>Q0(($)=>$.session.tokenUsage.estimatedCostUsd),r1=()=>Q0(($)=>$.session.actions),Y4=()=>Q0(($)=>{let{inputTokens:Q,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Q/Y*100);return Math.round(J)}),Z4=()=>Q0(($)=>$.app.initializationStatus),X4=()=>Q0(($)=>$.app.initializationError),P8=()=>Q0(($)=>$.app.activeModal),G4=()=>Q0(($)=>$.app.tasks),K4=()=>Q0(($)=>$.app.modelEditorTarget),q4=()=>Q0(($)=>$.app.sessionSelectorData),U4=()=>Q0(($)=>$.app.awaitingSecondCtrlC),a1=()=>Q0(($)=>$.app.actions),y8=()=>Q0(($)=>$.app.initializationStatus==="ready"),z4=()=>Q0(($)=>$.app.tasks.length>0),f$=()=>Q0(($)=>$.config.config?.permissionMode||"default"),O4=()=>Q0(($)=>$.config.config?.models??XY),R8=()=>Q0(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),M8=()=>Q0(($)=>$.config.config?.currentModelId),A0=()=>Q0(($)=>{return d0.getTheme()}),_4=()=>Q0(($)=>$.config.config?.theme??"default"),$1=()=>Q0(($)=>$.focus.currentFocus),N4=()=>Q0(($)=>$.focus.actions),i1=()=>Q0(($)=>$.command.isProcessing),F4=()=>Q0(($)=>$.command.actions),C8=()=>Q0(($)=>$.command.pendingCommands),H4=()=>Q0(($)=>$.command.recoveredSteeringCount),I8=()=>Q0(($)=>$.app.thinkingModeEnabled),T8=()=>Q0(($)=>$.app.reasoningEffort),v8=()=>Q0(($)=>$.app.serviceTier),f8=()=>Q0(($)=>$.app.responseVerbosity),k8=()=>Q0(($)=>$.app.communicationStyle),W4=()=>Q0(($)=>$.session.currentThinkingContent),L4=()=>Q0(($)=>$.session.thinkingExpanded),B4=()=>Q0(($)=>$.session.currentStreamingMessageId),w4=()=>Q0(ZY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),b4=()=>Q0(($)=>$.session.finalizingStreamingMessageId),A4=()=>Q0(($)=>$.session.historyExpanded),P4=()=>Q0(($)=>$.session.expandedMessageCount);import{useMemoizedFn as V$}from"ahooks";import{useEffect as p2,useRef as c4}from"react";function GY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let G=JSON.parse(J.responseBody)?.error?.message;if(G){let K=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${G}${K}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function KY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function qY($){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 S8($){let Q=KY($),Y=qY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=GY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as UY,mkdirSync as zY,writeFileSync as OY}from"node:fs";import _Y from"node:os";import j2 from"node:path";var y4=null;function NY(){let $=process.env.BLADE_STORAGE_ROOT||j2.join(_Y.homedir(),".blade");return j2.join($,"logs","stream-debug.log")}function FY($){if(y4===$)return;let Q=j2.dirname($);zY(Q,{recursive:!0,mode:493}),OY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
|
|
2
|
+
`),y4=$}function h2($,Q,Y){try{let J=NY();FY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",G=`[${Z}] [${$}] ${Q}${X}
|
|
3
|
+
`;UY(J,G)}catch{}}var s$=o1("UI");function C4($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,h2("loopEventHandler","onContentDelta",{callCount:Q.contentDeltaCount,deltaLen:J.delta.length,totalLen:Q.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(J.delta);break;case"thinking_delta":if(Y||$.signal.aborted)break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(J.delta);break;case"stream_end":{if(s$.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),h2("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(),G=$.getStreamingMessageId();if(G){if(Z)k$(G,Z);V8(G)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===D8)break;if(s$.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),G=R4(Z.function.name,X);$.sessionActions.addToolMessage(G,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:G,params:X})}catch(X){s$.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===D8)break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",G=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(G,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:G});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===D8)break;s$.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=M4(Z.function.name,J.result);$.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")$.sessionActions.resetContextUsage();break;case"turn_start":s$.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"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(`
|
|
7
7
|
`)});break}case"mcp_instructions_changed":{let Z=`MCP instructions ${J.action}: ${J.serverName}`+(J.truncated?" (truncated)":"");$.sessionActions.addToolMessage(Z,{toolName:"MCP Instructions",phase:"complete",summary:Z,detail:[J.text??"",J.sha256?`sha256: ${J.sha256}`:"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
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
|
-
`)});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((
|
|
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
|
|
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((G)=>G.type==="text"?G.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 g2($){let{text:Q,parts:Y}=$,J=Y.filter((G)=>G.type==="image");if(J.length===0)return Q;if(J.length>S$)throw Error(`最多只能发送 ${S$} 张图片`);if(J.reduce((G,K)=>G+`data:${K.mimeType};base64,`.length+K.base64.length,0)>j8)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let G of Y)if(G.type==="text")X.push({type:"text",text:G.text});else X.push({type:"image_url",image_url:{url:`data:${G.mimeType};base64,${G.base64}`}});return X}function I4($){let Q=v4($.metadata);return{role:$.role,content:Q?T4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function h8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(I4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(I4);return[...$.restoredContextMessages,...Q]}import HY from"node:path";function f4($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function WY($){return HY.resolve($)}function k4($){if(!$||!D4($))return;Q1().config.actions.updateConfig({currentModelId:$})}function S4($){if(!$)return;Q1().config.actions.updateConfig({permissionMode:$})}async function E8($,Q){return M0.listSessions({includeSubagents:!1})}async function g8($,Q,Y,J){let{intent:Z,session:X,newSessionId:G,announceFork:K,permissionModeOverride:q}=$,U=WY(X.projectPath);if(Z==="fork"){let F=await M0.forkSession(X.sessionId,{...G?{newSessionId:G}:{},sourceProjectPath:U,targetProjectPath:U}),O=[...M0.toUISafeMessages(F.messages)];if(K!==!1){let B=Date.parse(F.metadata.lastMessageTime);O.push({id:"fork-announcement-"+F.sessionId,role:"assistant",content:"Forked "+f4(X.sessionId)+" → "+f4(F.sessionId),timestamp:Number.isNaN(B)?0:B})}return await J(),S4(q??F.metadata.permissionMode),k4(F.metadata.selectedModelId),Y.restoreSession(F.sessionId,O,F.messages,F.metadata.projectPath),{sessionId:F.sessionId,messages:F.messages}}await M0.assertSessionWritable(X.sessionId,X.projectPath);let H=await M0.loadSession(X.sessionId,X.projectPath),z=M0.toUISafeMessages(H);return await J(),S4(q??X.permissionMode),k4(X.selectedModelId),Y.restoreSession(X.sessionId,z,H,X.projectPath),{sessionId:X.sessionId,messages:H}}function V4($){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 LY($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function BY($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function wY($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function bY($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function AY($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function PY($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function yY($){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)=>V4(Z))}if(Y==="activate_session")return V4($.session);return!1}function RY($,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} 已归档。`:"当前会话已归档。"),I1(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 I1(0),!0;default:return!1}}async function m2($,Q,Y,J,Z,X,G,K,q,U,H,z,F,O,B=u0(),_){let{text:W}=$;if(!j4(W))return{type:"not_slash"};let N=await h4(W,{cwd:B,surface:"tui",workspaceRoot:B,sessionId:X,messages:G,rewind:K,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),M0.archiveSession(X,B)}},subagents:q,mcp:U,reasoning:H,serviceTier:z,responseVerbosity:F,communicationStyle:O,codeReview:_,signal:J});if(N.success&&yY(N.data)){if(N.data.action==="select_session")return Q.showSessionSelector(N.data.sessions,N.data.intent),{type:"handled",commandResult:{success:!0}};return await g8(N.data,B,Y,Z),{type:"handled",commandResult:{success:!0}}}if(N.success&&PY(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(RY(N.message,N.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(LY(N.data)){let{skillName:C,skillArgs:w}=N.data,v=w?`Please use the "${C}" skill to help me with: ${w}`:`Please use the "${C}" skill.`;return Y.addUserMessage(v),{type:"continue_as_agent",result:{userDisplayMessage:v,agentInput:{displayText:v,text:v,images:[],parts:[{type:"text",text:v}]},userMessageAlreadyAdded:!0}}}if(BY(N.data)){let{commandName:C,processedContent:w}=N.data;Y.addUserMessage(W);let v=`# Custom Command: /${C}
|
|
12
12
|
|
|
13
13
|
The user has invoked the custom command "/${C}". Follow the instructions below to complete the task.
|
|
14
14
|
|
|
@@ -18,7 +18,7 @@ ${w}
|
|
|
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:W,agentInput:{displayText:W,text:v,images:[],parts:[{type:"text",text:v}]},userMessageAlreadyAdded:!0}}}if(
|
|
21
|
+
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:W,agentInput:{displayText:W,text:v,images:[],parts:[{type:"text",text:v}]},userMessageAlreadyAdded:!0}}}if(wY(N.data)){let{commandName:C,pluginName:w,processedContent:v}=N.data;Y.addUserMessage(W);let P=`# Plugin Command: /${C}
|
|
22
22
|
|
|
23
23
|
The user has invoked the plugin command "/${C}" from plugin "${w}". Follow the instructions below to complete the task.
|
|
24
24
|
|
|
@@ -28,16 +28,16 @@ ${v}
|
|
|
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:W,agentInput:{displayText:W,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(wY(N.data)){let{modelId:C,prompt:w}=N.data;return Y.addUserMessage(w),{type:"continue_as_agent",result:{userDisplayMessage:w,agentInput:{displayText:w,text:w,images:[],parts:[{type:"text",text:w}]},userMessageAlreadyAdded:!0,onceModelId:C}}}if(bY(N.data)){let C=N.data.goal.objective;return Y.addUserMessage(W),{type:"continue_as_agent",result:{userDisplayMessage:W,agentInput:{displayText:W,text:C,images:[],parts:[{type:"text",text:C}]},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 k=N.message;if(N.success&&typeof k==="string"&&k.trim()!=="")Y.addAssistantMessage(k);return{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}}}import{useMemoizedFn as y0}from"ahooks";import{useEffect as RY,useRef as g8}from"react";function E4($){let Q=g8(void 0),Y=g8(void 0),J=g8(void 0),Z=g8(void 0),X=y0(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 D=(async()=>{try{await I?.destroy()}finally{await y?.dispose()}})();Z.current=D;try{await D}finally{if(Z.current===D)Z.current=void 0}}),U=y0(async(I)=>{let y=$.workspaceRoot??Y.current?.workspaceRoot??u0();if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==y))await X();if(!Y.current){let D=await M0.findSessionMetadata(I,y),b=D!==void 0&&(await M0.loadSession(I,y)).length>0;Y.current=await z$.create({sessionId:I,workspaceRoot:y,modelId:$.modelId,permissionMode:$.permissionMode??D?.permissionMode,reasoningEffort:D?.reasoningEffort??$.reasoningEffort,serviceTier:D?.serviceTier??$.serviceTier,responseVerbosity:D?.responseVerbosity??$.responseVerbosity,communicationStyle:D?.communicationStyle??$.communicationStyle,communicationStyleDigest:D?.communicationStyleDigest,agents:$.agents,...b?{sessionStart:{isResume:!0,resumeSessionId:I}}:{}});try{J.current={sessionId:I,modelId:D?.selectedModelId,permissionMode:D?.permissionMode,reasoningEffort:D?.reasoningEffort,serviceTier:D?.serviceTier,responseVerbosity:D?.responseVerbosity,communicationStyle:D?.communicationStyle,communicationStyleDigest:D?.communicationStyleDigest},r0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),r0().setServiceTier(Y.current.getServiceTierConfiguration().selection),r0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),r0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(h){let S=Y.current;throw Y.current=void 0,await S.dispose().catch(()=>{return}),h}}return Y.current}),G=y0(async(I)=>{let y=I?.sessionId??$.sessionId,D=!!I?.modelId&&I.modelId!==$.modelId,b;if(!D&&y){let h=Y.current!==void 0,S=await U(y),x=I?.modelId??$.modelId,V=I?.reasoningEffort??(h?$.reasoningEffort:S.getReasoningConfiguration().selection),l=I?.serviceTier??(h?$.serviceTier:S.getServiceTierConfiguration().selection),G0=I?.responseVerbosity??(h?$.responseVerbosity:S.getResponseVerbosityConfiguration().selection),Z0=I?.communicationStyle??(h?$.communicationStyle:S.getCommunicationStyleConfiguration().selection),P0=S.getCurrentModelId(),B0=S.getReasoningConfiguration(),s0=S.getServiceTierConfiguration(),c0=S.getResponseVerbosityConfiguration(),F1=S.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==y||J.current.permissionMode!==$.permissionMode)){let e0=await M0.setSessionPermissionMode(y,S.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:y,permissionMode:e0.permissionMode}}await S.refresh({modelId:x,...V?{reasoningEffort:V}:{},...l?{serviceTier:l}:{},...G0?{responseVerbosity:G0}:{},...Z0?{communicationStyle:Z0}:{}});let M1=S.getCommunicationStyleConfiguration();if(M1.source!=="built-in"&&!M1.contentSha256)throw Error("Custom communication style has no provenance");let I$={...x&&x!=="inherit"&&(J.current?.sessionId!==y||J.current.modelId!==x)?{selectedModelId:x}:{},...V&&(J.current?.sessionId!==y||J.current.reasoningEffort!==V)?{reasoningEffort:V}:{},...l&&(J.current?.sessionId!==y||J.current.serviceTier!==l)?{serviceTier:l}:{},...G0&&(J.current?.sessionId!==y||J.current.responseVerbosity!==G0)?{responseVerbosity:G0}:{},...Z0&&(J.current?.sessionId!==y||J.current.communicationStyle!==Z0||J.current.communicationStyleDigest!==M1.contentSha256)?{communicationStyle:Z0,communicationStyleDigest:M1.source==="built-in"?null:M1.contentSha256}:{}};if(Object.keys(I$).length>0)try{let e0=await M0.updateSessionMetadata(y,S.workspaceRoot,I$);J.current={sessionId:y,modelId:e0.selectedModelId,permissionMode:e0.permissionMode,reasoningEffort:e0.reasoningEffort,serviceTier:e0.serviceTier,responseVerbosity:e0.responseVerbosity,communicationStyle:e0.communicationStyle,communicationStyleDigest:e0.communicationStyleDigest}}catch(e0){throw await S.refresh({...P0?{modelId:P0}:{},reasoningEffort:B0.selection,serviceTier:s0.selection,responseVerbosity:c0.selection,communicationStyle:F1.selection}).catch(()=>{return}),e0}b=await $8.createWithRuntime(S,{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 $8.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}),K=y0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await U($.sessionId)).listRewindCheckpoints()}),q=y0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let D=await(await U($.sessionId)).rewindSession(I);return await X(),D}),H=y0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await U($.sessionId)).listSubagents()}),O=y0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for subagent control");let D=await U($.sessionId),b=!1,h,S=I,x=(l)=>{T$.getState().app.actions.completeSubagentProgress(S,l.status==="completed")},V=D.resumeSubagent({agentId:I,prompt:y,onEvent:(l)=>{if(l.kind==="tool_start"&&"function"in l.toolCall)T$.getState().app.actions.updateSubagentTool(S,l.toolCall.function.name)},onCompleted:(l)=>{if(b)x(l);else h=l}});if(S=V.session.id,T$.getState().app.actions.startSubagentProgress(V.session.id,V.session.subagentType,`Resumed from ${V.source.id}: ${V.session.description}`),b=!0,h)x(h);return V}),F=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await U($.sessionId)).getMcpContentCatalog()}),z=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await U($.sessionId)).refreshMcpContentCatalogs(I)}),B=y0(async(I,y,D)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await U($.sessionId)).getMcpPrompt(I,y,D)}),_=y0(async(I,y,D)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await U($.sessionId)).completeMcpArgument(I,y,D)}),W=y0(async(I,y={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await U($.sessionId)).getMcpLogs(I,y)}),M=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).listMcpTasks(I)}),N=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).getMcpTask(I)}),k=y0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).cancelMcpTask(I,y)}),C=y0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await U($.sessionId)).setMcpLoggingLevel(I,y)}),w=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await U($.sessionId)).getMcpInstructions()}),v=y0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await U($.sessionId)).getReasoningConfiguration()}),P=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let y=await U($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let D=y.getReasoningConfiguration();if(y.resolveReasoningConfiguration(I),D.selection===I)return D;await y.refresh({reasoningEffort:I});try{let b;try{b=await M0.updateSessionMetadata($.sessionId,y.workspaceRoot,{reasoningEffort:I})}catch(h){if(!(h instanceof e$)&&h.code!=="ENOENT")throw h;b=await M0.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},r0().setReasoningEffort(I),y.getReasoningConfiguration()}catch(b){throw await y.refresh({reasoningEffort:D.selection}),b}}),A=y0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await U($.sessionId)).getServiceTierConfiguration()}),T=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for service tier");let y=await U($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let D=y.getServiceTierConfiguration();if(y.resolveServiceTierConfiguration(I),D.selection===I)return D;await y.refresh({serviceTier:I});try{let b;try{b=await M0.updateSessionMetadata($.sessionId,y.workspaceRoot,{serviceTier:I})}catch(h){if(!(h instanceof e$)&&h.code!=="ENOENT")throw h;b=await M0.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},r0().setServiceTier(I),y.getServiceTierConfiguration()}catch(b){throw await y.refresh({serviceTier:D.selection}),b}}),R=y0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await U($.sessionId)).getResponseVerbosityConfiguration()}),L=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let y=await U($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let D=y.getResponseVerbosityConfiguration();if(y.resolveResponseVerbosityConfiguration(I),D.selection===I)return D;await y.refresh({responseVerbosity:I});try{let b;try{b=await M0.updateSessionMetadata($.sessionId,y.workspaceRoot,{responseVerbosity:I})}catch(h){if(!(h instanceof e$)&&h.code!=="ENOENT")throw h;b=await M0.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},r0().setResponseVerbosity(I),y.getResponseVerbosityConfiguration()}catch(b){throw await y.refresh({responseVerbosity:D.selection}),b}}),f=y0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await U($.sessionId)).getCommunicationStyleConfiguration()}),E=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for communication style");let y=await U($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let D=y.getCommunicationStyleConfiguration(),b=y.resolveCommunicationStyleConfiguration(I);if(b.source!=="built-in"&&!b.contentSha256)throw Error("Custom communication style has no provenance");if(D.selection===I)return D;await y.refresh({communicationStyle:I});try{let h;try{h=await M0.updateSessionMetadata($.sessionId,y.workspaceRoot,{communicationStyle:I,communicationStyleDigest:b.source==="built-in"?null:b.contentSha256})}catch(S){if(!(S instanceof e$)&&S.code!=="ENOENT")throw S;h=await M0.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:h.selectedModelId,permissionMode:h.permissionMode,reasoningEffort:h.reasoningEffort,serviceTier:h.serviceTier,responseVerbosity:h.responseVerbosity,communicationStyle:h.communicationStyle,communicationStyleDigest:h.communicationStyleDigest},r0().setCommunicationStyle(I),y.getCommunicationStyleConfiguration()}catch(h){throw await y.refresh({communicationStyle:D.selection}),h}}),t=y0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),u=y0(async(I,y)=>{let D=$.sessionId;if(!D)throw Error("User shell command requires a Session");return(await U(D)).executeUserShellCommand(I,y)}),a=y0(async(I,y)=>{let D=$.sessionId;if(!D)throw Error("Code review requires a Session");let b=await U(D);await m8.recoverInterrupted(b.workspaceRoot,D,b);let h=await m8.start({sessionId:D,projectPath:b.workspaceRoot,runtime:b,request:I,signal:y}),S=await h.completion,x=(await m8.list(b.workspaceRoot,D)).find((V)=>V.start.reviewId===h.reviewId);if(!x)throw Error(`Review not found after completion: ${h.reviewId}`);return{reviewId:h.reviewId,status:S.status,findings:S.findings.length,content:h4(x.start,S)}});return RY(()=>{let I=p8(X);return()=>{I(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:G,cleanupAgent:X,steerActiveTurn:t,runCodeReview:a,executeUserShellCommand:u,listRewindCheckpoints:K,rewindSession:q,listSubagents:H,resumeSubagent:O,getMcpContentCatalog:F,refreshMcpContentCatalogs:z,getMcpPrompt:B,completeMcpArgument:_,listMcpTasks:M,getMcpTask:N,cancelMcpTask:k,getMcpLogs:W,setMcpLoggingLevel:C,getMcpInstructions:w,getReasoningConfiguration:v,setReasoningEffort:P,getServiceTierConfiguration:A,setServiceTier:T,getResponseVerbosityConfiguration:R,setResponseVerbosity:L,getCommunicationStyleConfiguration:f,setCommunicationStyle:E}}import{useMemoizedFn as D$}from"ahooks";import{useEffect as MY,useRef as c8}from"react";function g4($){let Q=0;for(let Y of $)if(Y===`
|
|
32
|
-
`)Q++;return Q}function
|
|
31
|
+
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:W,agentInput:{displayText:W,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(bY(N.data)){let{modelId:C,prompt:w}=N.data;return Y.addUserMessage(w),{type:"continue_as_agent",result:{userDisplayMessage:w,agentInput:{displayText:w,text:w,images:[],parts:[{type:"text",text:w}]},userMessageAlreadyAdded:!0,onceModelId:C}}}if(AY(N.data)){let C=N.data.goal.objective;return Y.addUserMessage(W),{type:"continue_as_agent",result:{userDisplayMessage:W,agentInput:{displayText:W,text:C,images:[],parts:[{type:"text",text:C}]},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 k=N.message;if(N.success&&typeof k==="string"&&k.trim()!=="")Y.addAssistantMessage(k);return{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}}}import{useMemoizedFn as y0}from"ahooks";import{useEffect as MY,useRef as m8}from"react";function g4($){let Q=m8(void 0),Y=m8(void 0),J=m8(void 0),Z=m8(void 0),X=y0(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 D=(async()=>{try{await I?.destroy()}finally{await y?.dispose()}})();Z.current=D;try{await D}finally{if(Z.current===D)Z.current=void 0}}),G=y0(async(I)=>{let y=$.workspaceRoot??Y.current?.workspaceRoot??u0();if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==y))await X();if(!Y.current){let D=await M0.findSessionMetadata(I,y),b=D!==void 0&&(await M0.loadSession(I,y)).length>0;Y.current=await O$.create({sessionId:I,workspaceRoot:y,modelId:$.modelId,permissionMode:$.permissionMode??D?.permissionMode,reasoningEffort:D?.reasoningEffort??$.reasoningEffort,serviceTier:D?.serviceTier??$.serviceTier,responseVerbosity:D?.responseVerbosity??$.responseVerbosity,communicationStyle:D?.communicationStyle??$.communicationStyle,communicationStyleDigest:D?.communicationStyleDigest,agents:$.agents,...b?{sessionStart:{isResume:!0,resumeSessionId:I}}:{}});try{J.current={sessionId:I,modelId:D?.selectedModelId,permissionMode:D?.permissionMode,reasoningEffort:D?.reasoningEffort,serviceTier:D?.serviceTier,responseVerbosity:D?.responseVerbosity,communicationStyle:D?.communicationStyle,communicationStyleDigest:D?.communicationStyleDigest},r0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),r0().setServiceTier(Y.current.getServiceTierConfiguration().selection),r0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),r0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(h){let S=Y.current;throw Y.current=void 0,await S.dispose().catch(()=>{return}),h}}return Y.current}),K=y0(async(I)=>{let y=I?.sessionId??$.sessionId,D=!!I?.modelId&&I.modelId!==$.modelId,b;if(!D&&y){let h=Y.current!==void 0,S=await G(y),x=I?.modelId??$.modelId,V=I?.reasoningEffort??(h?$.reasoningEffort:S.getReasoningConfiguration().selection),l=I?.serviceTier??(h?$.serviceTier:S.getServiceTierConfiguration().selection),K0=I?.responseVerbosity??(h?$.responseVerbosity:S.getResponseVerbosityConfiguration().selection),Z0=I?.communicationStyle??(h?$.communicationStyle:S.getCommunicationStyleConfiguration().selection),P0=S.getCurrentModelId(),B0=S.getReasoningConfiguration(),s0=S.getServiceTierConfiguration(),c0=S.getResponseVerbosityConfiguration(),F1=S.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==y||J.current.permissionMode!==$.permissionMode)){let e0=await M0.setSessionPermissionMode(y,S.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:y,permissionMode:e0.permissionMode}}await S.refresh({modelId:x,...V?{reasoningEffort:V}:{},...l?{serviceTier:l}:{},...K0?{responseVerbosity:K0}:{},...Z0?{communicationStyle:Z0}:{}});let M1=S.getCommunicationStyleConfiguration();if(M1.source!=="built-in"&&!M1.contentSha256)throw Error("Custom communication style has no provenance");let I$={...x&&x!=="inherit"&&(J.current?.sessionId!==y||J.current.modelId!==x)?{selectedModelId:x}:{},...V&&(J.current?.sessionId!==y||J.current.reasoningEffort!==V)?{reasoningEffort:V}:{},...l&&(J.current?.sessionId!==y||J.current.serviceTier!==l)?{serviceTier:l}:{},...K0&&(J.current?.sessionId!==y||J.current.responseVerbosity!==K0)?{responseVerbosity:K0}:{},...Z0&&(J.current?.sessionId!==y||J.current.communicationStyle!==Z0||J.current.communicationStyleDigest!==M1.contentSha256)?{communicationStyle:Z0,communicationStyleDigest:M1.source==="built-in"?null:M1.contentSha256}:{}};if(Object.keys(I$).length>0)try{let e0=await M0.updateSessionMetadata(y,S.workspaceRoot,I$);J.current={sessionId:y,modelId:e0.selectedModelId,permissionMode:e0.permissionMode,reasoningEffort:e0.reasoningEffort,serviceTier:e0.serviceTier,responseVerbosity:e0.responseVerbosity,communicationStyle:e0.communicationStyle,communicationStyleDigest:e0.communicationStyleDigest}}catch(e0){throw await S.refresh({...P0?{modelId:P0}:{},reasoningEffort:B0.selection,serviceTier:s0.selection,responseVerbosity:c0.selection,communicationStyle:F1.selection}).catch(()=>{return}),e0}b=await $8.createWithRuntime(S,{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 $8.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}),q=y0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await G($.sessionId)).listRewindCheckpoints()}),U=y0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let D=await(await G($.sessionId)).rewindSession(I);return await X(),D}),H=y0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await G($.sessionId)).listSubagents()}),z=y0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for subagent control");let D=await G($.sessionId),b=!1,h,S=I,x=(l)=>{T$.getState().app.actions.completeSubagentProgress(S,l.status==="completed")},V=D.resumeSubagent({agentId:I,prompt:y,onEvent:(l)=>{if(l.kind==="tool_start"&&"function"in l.toolCall)T$.getState().app.actions.updateSubagentTool(S,l.toolCall.function.name)},onCompleted:(l)=>{if(b)x(l);else h=l}});if(S=V.session.id,T$.getState().app.actions.startSubagentProgress(V.session.id,V.session.subagentType,`Resumed from ${V.source.id}: ${V.session.description}`),b=!0,h)x(h);return V}),F=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await G($.sessionId)).getMcpContentCatalog()}),O=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await G($.sessionId)).refreshMcpContentCatalogs(I)}),B=y0(async(I,y,D)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await G($.sessionId)).getMcpPrompt(I,y,D)}),_=y0(async(I,y,D)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await G($.sessionId)).completeMcpArgument(I,y,D)}),W=y0(async(I,y={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await G($.sessionId)).getMcpLogs(I,y)}),M=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).listMcpTasks(I)}),N=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).getMcpTask(I)}),k=y0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).cancelMcpTask(I,y)}),C=y0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await G($.sessionId)).setMcpLoggingLevel(I,y)}),w=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await G($.sessionId)).getMcpInstructions()}),v=y0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await G($.sessionId)).getReasoningConfiguration()}),P=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let y=await G($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let D=y.getReasoningConfiguration();if(y.resolveReasoningConfiguration(I),D.selection===I)return D;await y.refresh({reasoningEffort:I});try{let b;try{b=await M0.updateSessionMetadata($.sessionId,y.workspaceRoot,{reasoningEffort:I})}catch(h){if(!(h instanceof e$)&&h.code!=="ENOENT")throw h;b=await M0.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},r0().setReasoningEffort(I),y.getReasoningConfiguration()}catch(b){throw await y.refresh({reasoningEffort:D.selection}),b}}),A=y0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await G($.sessionId)).getServiceTierConfiguration()}),T=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for service tier");let y=await G($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let D=y.getServiceTierConfiguration();if(y.resolveServiceTierConfiguration(I),D.selection===I)return D;await y.refresh({serviceTier:I});try{let b;try{b=await M0.updateSessionMetadata($.sessionId,y.workspaceRoot,{serviceTier:I})}catch(h){if(!(h instanceof e$)&&h.code!=="ENOENT")throw h;b=await M0.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},r0().setServiceTier(I),y.getServiceTierConfiguration()}catch(b){throw await y.refresh({serviceTier:D.selection}),b}}),R=y0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await G($.sessionId)).getResponseVerbosityConfiguration()}),L=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let y=await G($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let D=y.getResponseVerbosityConfiguration();if(y.resolveResponseVerbosityConfiguration(I),D.selection===I)return D;await y.refresh({responseVerbosity:I});try{let b;try{b=await M0.updateSessionMetadata($.sessionId,y.workspaceRoot,{responseVerbosity:I})}catch(h){if(!(h instanceof e$)&&h.code!=="ENOENT")throw h;b=await M0.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},r0().setResponseVerbosity(I),y.getResponseVerbosityConfiguration()}catch(b){throw await y.refresh({responseVerbosity:D.selection}),b}}),f=y0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await G($.sessionId)).getCommunicationStyleConfiguration()}),E=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for communication style");let y=await G($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let D=y.getCommunicationStyleConfiguration(),b=y.resolveCommunicationStyleConfiguration(I);if(b.source!=="built-in"&&!b.contentSha256)throw Error("Custom communication style has no provenance");if(D.selection===I)return D;await y.refresh({communicationStyle:I});try{let h;try{h=await M0.updateSessionMetadata($.sessionId,y.workspaceRoot,{communicationStyle:I,communicationStyleDigest:b.source==="built-in"?null:b.contentSha256})}catch(S){if(!(S instanceof e$)&&S.code!=="ENOENT")throw S;h=await M0.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:h.selectedModelId,permissionMode:h.permissionMode,reasoningEffort:h.reasoningEffort,serviceTier:h.serviceTier,responseVerbosity:h.responseVerbosity,communicationStyle:h.communicationStyle,communicationStyleDigest:h.communicationStyleDigest},r0().setCommunicationStyle(I),y.getCommunicationStyleConfiguration()}catch(h){throw await y.refresh({communicationStyle:D.selection}),h}}),t=y0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),u=y0(async(I,y)=>{let D=$.sessionId;if(!D)throw Error("User shell command requires a Session");return(await G(D)).executeUserShellCommand(I,y)}),a=y0(async(I,y)=>{let D=$.sessionId;if(!D)throw Error("Code review requires a Session");let b=await G(D);await p8.recoverInterrupted(b.workspaceRoot,D,b);let h=await p8.start({sessionId:D,projectPath:b.workspaceRoot,runtime:b,request:I,signal:y}),S=await h.completion,x=(await p8.list(b.workspaceRoot,D)).find((V)=>V.start.reviewId===h.reviewId);if(!x)throw Error(`Review not found after completion: ${h.reviewId}`);return{reviewId:h.reviewId,status:S.status,findings:S.findings.length,content:E4(x.start,S)}});return MY(()=>{let I=c8(X);return()=>{I(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:K,cleanupAgent:X,steerActiveTurn:t,runCodeReview:a,executeUserShellCommand:u,listRewindCheckpoints:q,rewindSession:U,listSubagents:H,resumeSubagent:z,getMcpContentCatalog:F,refreshMcpContentCatalogs:O,getMcpPrompt:B,completeMcpArgument:_,listMcpTasks:M,getMcpTask:N,cancelMcpTask:k,getMcpLogs:W,setMcpLoggingLevel:C,getMcpInstructions:w,getReasoningConfiguration:v,setReasoningEffort:P,getServiceTierConfiguration:A,setServiceTier:T,getResponseVerbosityConfiguration:R,setResponseVerbosity:L,getCommunicationStyleConfiguration:f,setCommunicationStyle:E}}import{useMemoizedFn as D$}from"ahooks";import{useEffect as CY,useRef as x8}from"react";function m4($){let Q=0;for(let Y of $)if(Y===`
|
|
32
|
+
`)Q++;return Q}function p4($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=x8(""),G=x8(null),K=x8(""),q=x8(null),U=D$(()=>{if(X.current){let _=X.current,W=$.appendAssistantContent(_);k$(W,_),X.current=""}if(G.current)clearTimeout(G.current),G.current=null}),H=D$(()=>{if(K.current)$.appendThinkingContent(K.current),K.current="";if(q.current)clearTimeout(q.current),q.current=null}),z=D$((_)=>{X.current+=_;let W=X.current;if(m4(W)>=J||W.length>=Z){U();return}if(!G.current)G.current=setTimeout(U,Y)}),F=D$((_)=>{K.current+=_;let W=K.current;if(m4(W)>=J||W.length>=Z){H();return}if(!q.current)q.current=setTimeout(H,Y)}),O=D$(()=>{if(X.current="",G.current)clearTimeout(G.current),G.current=null;if(K.current="",q.current)clearTimeout(q.current),q.current=null}),B=D$(()=>{if(G.current)clearTimeout(G.current),G.current=null;if(q.current)clearTimeout(q.current),q.current=null;let _=X.current,W=K.current;return X.current="",K.current="",{extraContent:_,extraThinking:W}});return CY(()=>{return()=>{O()}},[O]),{batchAppendContent:z,batchAppendThinking:F,flushContentBuffer:U,flushThinkingBuffer:H,resetStreamingBuffers:O,drainPendingBuffers:B}}var c2=o1("UI"),u4=($,Q,Y,J,Z,X)=>{let G=i1(),K=v$(),q=C1(),U=M8(),H=f$(),z=I8(),F=T8(),O=v8(),B=f8(),_=k8(),W=r1(),M=a1(),N=F4(),k=c4(!1),C=c4(!1),{createAgent:w,cleanupAgent:v,steerActiveTurn:P,listRewindCheckpoints:A,rewindSession:T,listSubagents:R,resumeSubagent:L,getMcpContentCatalog:f,refreshMcpContentCatalogs:E,getMcpPrompt:t,completeMcpArgument:u,listMcpTasks:a,getMcpTask:I,cancelMcpTask:y,getMcpLogs:D,setMcpLoggingLevel:b,getMcpInstructions:h,getReasoningConfiguration:S,setReasoningEffort:x,getServiceTierConfiguration:V,setServiceTier:l,getResponseVerbosityConfiguration:K0,setResponseVerbosity:Z0,getCommunicationStyleConfiguration:P0,setCommunicationStyle:B0,runCodeReview:s0,executeUserShellCommand:c0}=g4({sessionId:K,workspaceRoot:q,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:U,permissionMode:H,reasoningEffort:F,serviceTier:O,responseVerbosity:B,communicationStyle:_,agents:X}),F1=p4(W),M1=V$(async(q0,v0)=>{if(q0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let $0=q0.text.trimStart().slice(1).trim();if(!$0)return{success:!1,error:"User shell command cannot be empty"};W.setCommand(`! ${$0}`);try{let _0=await c0($0,{signal:v0});if(W.addMessage({id:`user-shell-${_0.executionId}`,role:"user",content:x2(_0.record),timestamp:Date.now(),metadata:{userShellCommand:_0.record}}),_0.delivery==="next_turn")C.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{W.setCommand(null)}});p2(()=>{return()=>{F1.resetStreamingBuffers()}},[F1.resetStreamingBuffers]),p2(()=>{if(!z)W.setCurrentThinkingContent(null)},[z,W]);let I$=V$(()=>{if(!G)return;Z?.();let{extraContent:q0,extraThinking:v0}=F1.drainPendingBuffers();N.abort("user-cancel"),M.setTasks([]);let $0=Q1().session.currentStreamingMessageId;if($0){if(q0)k$($0,q0);V8($0)}if(W.finalizeStreamingMessage(q0,v0),!k.current)W.addAssistantMessage("任务已停止"),k.current=!0}),e0=V$(async(q0,v0)=>{let $0={contentDeltaCount:0,contentDeltaTotalLen:0},_0=C4({sessionActions:W,appActions:M,commandActions:N,streamingBuffer:F1,thinkingModeEnabled:z,getStreamingMessageId:()=>Q1().session.currentStreamingMessageId,signal:v0.signal},$0);return{loopResult:await x4(q0,_0),stats:$0}}),S2=V$(async(q0)=>{let v0=!1,$0,_0=!1,x0=q0;try{if(q0.text.trimStart().startsWith("!")){let g0=N.getAbortController()??N.createAbortController();return await M1(q0,g0.signal)}await Q8();let i0=N.getAbortController()??N.createAbortController(),h0=await m2(q0,M,W,i0.signal,v,K,h8(Q1().session),{listCheckpoints:A,execute:T},{list:R,resume:L},{getCatalog:f,refresh:E,getPrompt:t,complete:u,listTasks:a,getTask:I,cancelTask:y,getLogs:D,setLoggingLevel:b,getInstructions:h},{get:S,set:x},{get:V,set:l},{get:K0,set:Z0},{get:P0,set:B0},q,{run:s0});if(h0.type==="handled")return h0.commandResult;if(h0.type==="continue_as_agent")v0=h0.result.userMessageAlreadyAdded,$0=h0.result.onceModelId,_0=h0.result.goalContinuationOnly===!0,x0=h0.result.agentInput;let V2=U1.getInstance(),t$;if(!_0){let g0=await V2.executeUserPromptSubmitHooks(x0.text,{projectDir:q,sessionId:K,permissionMode:H,hasImages:x0.images.length>0,imageCount:x0.images.length});if(!g0.proceed){if(g0.warning)W.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((b8)=>b8.type==="image")]};if(g0.contextInjection)t$=g0.contextInjection}if(!v0)W.addUserMessage(x0.displayText);let L8=g2(x0),B8=await w($0?{modelId:$0}:void 0);if(i0.signal.aborted)return c2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};let r=h8(Q1().session);if(t$)r.push({role:"system",content:`<user-prompt-submit-hook>
|
|
33
33
|
${t$}
|
|
34
|
-
</user-prompt-submit-hook>`});let
|
|
34
|
+
</user-prompt-submit-hook>`});let G0={messages:r,userId:"cli-user",sessionId:K,workspaceRoot:q,signal:i0.signal,confirmationHandler:Y,permissionMode:H,onPermissionModeChange:async(g0)=>{await m0().setPermissionMode(g0)}},{loopResult:f0,stats:w8}=await e0(B8.chatStream(L8,G0,{stream:!0,goalContinuationOnly:_0,onTurnLimitReached:Y?async(g0)=>{let b8=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${g0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:b8.approved,reason:b8.reason}}:void 0}),i0);if(f0.metadata?.outputTruncated)W.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let S1=f0.finalMessage||"";if(c2.debug("[handleCommandSubmit] final reply",{success:f0.success,outputLength:S1.length,turnsCount:f0.metadata?.turnsCount,toolCallsCount:f0.metadata?.toolCallsCount}),!f0.success&&f0.error?.type==="api_error"){let g0=f0.error.message||"请求失败,请检查网络连接和 API 配置";return W.addAssistantMessage(g0),{success:!1,error:g0}}if(!S1||S1.trim()===""){let g0=f0.metadata?.abortReason;if(!k.current&&w8.contentDeltaCount===0&&g0!=="interrupt")return W.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:S1??""}}return{success:!0,output:S1}}catch(i0){if(k.current)return{success:!1,error:"aborted"};let h0=S8(i0);return W.addAssistantMessage(`${h0.displayMessage}`),{success:!1,error:h0.displayMessage}}}),z$=V$(async()=>{if(Q1().command.isProcessing){C.current=!0;return}let q0=await O$.hasPendingInbox(q,K),v0=!q0&&await O$.hasActiveGoal(q,K);if(!q0&&!v0){C.current=!1;return}if(Q1().command.isProcessing){C.current=!0;return}C.current=!1,await Q8();let $0=N.createAbortController();F1.resetStreamingBuffers(),W.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let _0=await w();if($0.signal.aborted)return;let x0={messages:h8(Q1().session),userId:"cli-user",sessionId:K,workspaceRoot:q,signal:$0.signal,confirmationHandler:Y,permissionMode:H,onPermissionModeChange:async(h0)=>{await m0().setPermissionMode(h0)}},{loopResult:i0}=await e0(_0.chatStream("",x0,{stream:!0,pendingInputOnly:q0,goalContinuationOnly:v0}),$0);if(i0.metadata?.outputTruncated)W.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!i0.success&&i0.error?.type==="api_error")W.addAssistantMessage(i0.error.message||"恢复排队指令失败,请检查网络和 API 配置")}catch(_0){let x0=S8(_0);if(!x0.isAbort)W.setError(`恢复排队指令失败: ${x0.displayMessage}`)}finally{if(N.getAbortController()===$0)N.setProcessing(!1),N.clearAbortController($0),W.setCurrentThinkingContent(null);if(C.current)queueMicrotask(()=>{z$()})}}),D2=V$(async(q0)=>{if(!q0.text.trim()&&q0.images.length===0)return;if(q0.text.trimStart().startsWith("!")&&G){let $0=N.getAbortController();if(!$0){W.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let _0=await M1(q0,$0.signal);if(!_0.success&&_0.error&&_0.error!=="aborted")W.setError(_0.error);return}if(G){if(q0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(q0.text.trim())){await Q8();let h0=N.getAbortController()??N.createAbortController();await m2(q0,M,W,h0.signal,v,K,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,q);return}W.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await Q8();let $0=await U1.getInstance().executeUserPromptSubmitHooks(q0.text,{projectDir:q,sessionId:K,permissionMode:H,hasImages:q0.images.length>0,imageCount:q0.images.length});if(!$0.proceed){if($0.warning)W.addAssistantMessage($0.warning);return}let _0=q0;if($0.updatedPrompt)_0={...q0,text:$0.updatedPrompt,parts:[{type:"text",text:$0.updatedPrompt},...q0.parts.filter((h0)=>h0.type==="image")]};if($0.contextInjection){let h0=`<user-prompt-submit-hook>
|
|
35
35
|
${$0.contextInjection}
|
|
36
36
|
</user-prompt-submit-hook>`;_0={..._0,text:`${_0.text}
|
|
37
37
|
|
|
38
38
|
${h0}`,parts:[..._0.parts,{type:"text",text:`
|
|
39
39
|
|
|
40
|
-
${h0}`}]}}let x0=E2(_0),i0=await P(x0);if(!i0.accepted){let h0=i0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";W.addAssistantMessage(h0);return}if(N.enqueueCommand(K0),W.addUserMessage(K0.displayText),i0.delivery==="next_turn"){if(C.current=!0,!Q1().command.isProcessing)queueMicrotask(()=>{O$()})}return}M.setTasks([]),N.setRecoveredSteeringCount(0),k.current=!1;let v0=N.createAbortController();F1.resetStreamingBuffers(),W.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let $0=await k2(K0);if(!$0.success&&$0.error&&$0.error!=="aborted")W.setError($0.error)}catch($0){let _0=S8($0);if(_0.isAbort);else W.setError(`执行失败: ${_0.displayMessage}`)}finally{if(N.getAbortController()===v0){if(N.setProcessing(!1),N.clearAbortController(v0),W.setCurrentThinkingContent(null),C.current)queueMicrotask(()=>{O$()})}}});return m2(()=>{let K0=!1;return(async()=>{if(Y)await x2.resolvePendingWithHandler(K,G,Y);else await x2.cancelPendingNonInteractive(K,G);if(K0)return;let[v0,$0]=await Promise.all([z$.hasPendingInbox(K,G),z$.hasActiveGoal(K,G)]);if(v0||$0)await O$()})().catch((v0)=>{if(!K0)p2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",v0)}),()=>{K0=!0}},[Y,O$,G,K]),{executeCommand:S2,handleAbort:I$,isProcessing:U,cleanupAgent:v}};import{useMemoizedFn as x8}from"ahooks";import{useState as u4}from"react";var l4=()=>{let[$,Q]=u4([]),[Y,J]=u4(-1),Z=x8((K,q)=>{let H={display:K,pasteMappings:q?new Map(q):new Map};Q((O)=>[...O,H]),J(-1)}),X=x8(()=>{if($.length===0)return null;let K=Y===-1?$.length-1:Math.max(0,Y-1);return J(K),$[K]||null}),U=x8(()=>{if(Y===-1)return null;let K=Y+1;if(K>=$.length)return J(-1),null;else return J(K),$[K]||null}),G=x8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:U,resetHistoryIndex:G}};import{useMemoizedFn as J8}from"ahooks";import{useMemo as CY,useRef as d4,useState as IY}from"react";var r4=()=>{let[$,Q]=IY({isVisible:!1,details:null,resolver:null}),Y=d4(null),J=d4([]),Z=J8((H)=>{Y.current=H,Q({isVisible:Boolean(H),details:H?.details??null,resolver:H?.resolve??null})}),X=J8((H,O)=>{if(H.settled)return;if(H.settled=!0,H.signal&&H.abortListener)H.signal.removeEventListener("abort",H.abortListener);H.resolve(O)}),U=J8((H,O)=>{return new Promise((F)=>{let z={details:H,resolve:F,signal:O,settled:!1},B=()=>{if(Y.current===z){X(z,{approved:!1,reason:Y8}),Z(J.current.shift()??null);return}let _=J.current.indexOf(z);if(_>=0)J.current.splice(_,1);X(z,{approved:!1,reason:Y8})};if(z.abortListener=B,O?.aborted){B();return}if(O?.addEventListener("abort",B,{once:!0}),!Y.current){Z(z);return}J.current.push(z)})}),G=J8((H)=>{let O=Y.current;if(O)X(O,H);let F=J.current.shift()??null;Z(F)}),K=J8(()=>{if(Y.current)X(Y.current,{approved:!1,reason:Y8});for(let H of J.current)X(H,{approved:!1,reason:Y8});J.current=[],Z(null)}),q=CY(()=>({requestConfirmation:U}),[U]);return{confirmationState:$,confirmationHandler:q,handleResponse:G,dismissAll:K}};import{useMemoizedFn as _$}from"ahooks";import{useRef as a4,useState as TY}from"react";var u8="␞",l8="␟";function d8($){return`${u8}PASTE:${$}:`}function u2(){return l8}var ZU=new RegExp(`${u8}PASTE:(\\d+):[\\s\\S]*?${l8}`,"g");function vY($){return $.includes(u8)&&$.includes(l8)}function i4($="",Q=0){let[Y,J]=TY({value:$,cursorPosition:Q}),Z=a4(0),X=a4(new Map),U=_$((z)=>{J((B)=>({value:z,cursorPosition:B.cursorPosition}));for(let B of X.current.keys()){let _=d8(B);if(!z.includes(_))X.current.delete(B)}}),G=_$((z)=>{J((B)=>({...B,cursorPosition:Math.max(0,Math.min(z,B.value.length))}))}),K=_$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),q=_$((z)=>{Z.current+=1;let B=Z.current;return X.current.set(B,{type:"text",data:z}),B}),H=_$((z,B)=>{let _=[...X.current.values()].filter((k)=>k.type==="image");if(_.length>=S$)throw Error(`最多只能粘贴 ${S$} 张图片`);let W=_.reduce((k,C)=>k+`data:${C.mimeType};base64,`.length+C.data.length,0),M=`data:${B};base64,`.length+z.length;if(W+M>V8)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let N=Z.current;return X.current.set(N,{type:"image",data:z,mimeType:B}),N}),O=_$((z)=>{for(let[B,_]of z)if(X.current.set(B,_),B>=Z.current)Z.current=B}),F=_$((z)=>{let B=[],_=[];if(!vY(z)){let T=z.trim();if(T)_.push({type:"text",text:T});return{displayText:z,text:z,images:B,parts:_}}let W=new RegExp(`${u8}PASTE:(\\d+):[\\s\\S]*?${l8}`,"g"),M=Array.from(z.matchAll(W)),N=0,k="",C="";for(let T of M){let R=T.index,L=R+T[0].length,f=parseInt(T[1],10),E=X.current.get(f);if(R>N){let t=z.slice(N,R);_.push({type:"text",text:t}),k+=t,C+=t}if(!E)k+=T[0],C+=T[0],_.push({type:"text",text:T[0]});else if(E.type==="text")k+=E.data,C+=E.data,_.push({type:"text",text:E.data});else{let t={id:f,base64:E.data,mimeType:E.mimeType};B.push(t),_.push({type:"image",...t}),C+=`[Image #${f}]`}N=L}if(N<z.length){let T=z.slice(N);_.push({type:"text",text:T}),k+=T,C+=T}let w=[];for(let T of _)if(T.type==="text"&&w.length>0&&w[w.length-1].type==="text")w[w.length-1].text+=T.text;else w.push(T);let v=0,P=w.length;while(v<w.length&&w[v].type==="text"&&w[v].text.trim()==="")v++;while(P>v&&w[P-1].type==="text"&&w[P-1].text.trim()==="")P--;let A=w.slice(v,P);return{displayText:C.trim(),text:k.trim(),images:B,parts:A}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:U,setCursorPosition:G,clear:K,pasteMap:X.current,addPasteMapping:q,addImagePasteMapping:H,restorePasteMappings:O,resolveInput:F}}import{useMemoizedFn as J6}from"ahooks";import{useInput as EY}from"ink";import{useEffect as Y6,useRef as Z6,useState as a2}from"react";function fY($){return{supportsThinking:D1().resolveConfig($).reasoning}}function r8($){return fY($).supportsThinking}import kY from"fast-glob";import SY from"fuse.js";import{useEffect as o4,useMemo as l2,useState as d2}from"react";var j$=null,DY=5000;function VY($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),U=X+Z.length;if(Q>=X&&Q<=U){let G=Z.slice(1),K=!1;if(G.startsWith('"')){if(K=!0,G=G.slice(1),G.endsWith('"'))G=G.slice(0,-1)}return{hasQuery:!0,query:G,startIndex:X,endIndex:U,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var jY=[...r2.map(($)=>`${$}/**`),...r2,...n4.map(($)=>`**/${$}`)];function t4($,Q,Y={}){let{cwd:J=u0(),maxSuggestions:Z=15,ignorePatterns:X=jY,debounceDelay:U=300,fuzzyMatch:G=!0}=Y,[K,q]=d2([]),[H,O]=d2(!1),[F,z]=d2(0),B=l2(()=>JSON.stringify(X),[X]),_=l2(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return VY($,Q)},[$,Q]);o4(()=>{if(!$.includes("@")){q([]),O(!1);return}let M=Date.now();if(j$&&j$.cwd===J&&j$.ignoreKey===B&&M-j$.timestamp<DY){q(j$.files),O(!1);return}let N=!1,C=setTimeout(async()=>{O(!0);try{let v=(await kY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((P)=>P.replace(/\\/g,"/"));if(!N)q(v),j$={cwd:J,ignoreKey:B,files:v,timestamp:M}}catch(w){if(console.error("Failed to load files for @ completion:",w),!N)q([])}finally{if(!N)O(!1)}},U);return()=>{N=!0,clearTimeout(C)}},[$,J,U,B]);let W=l2(()=>{if(!_.hasQuery||K.length===0)return[];let M=_.query.toLowerCase();if(M==="")return K.slice(0,Z);if(G)return new SY(K,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(M).slice(0,Z).map((C)=>C.item);return K.filter((N)=>N.toLowerCase().includes(M)).slice(0,Z)},[_,K,Z,G]);return o4(()=>{z(0)},[W]),{..._,suggestions:W,selectedIndex:F,loading:H}}function hY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function s4($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=hY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),U=Z+J+" "+X,G=Q.startIndex+J.length+1;return{newInput:U,newCursorPos:G}}import{useMemoizedFn as e4}from"ahooks";import{useEffect as $6,useRef as Q6}from"react";var k0=($,Q)=>{let Y=Q6(!1),J=Q6(null),Z=e4(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{Z8().shutdown("SIGINT",0)},U=e4(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();r0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;r0().setAwaitingSecondCtrlC(!1),X()}});return $6(()=>{if($){if(r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),$6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),U};var a8=o1("UI"),G6=($,Q,Y,J,Z,X,U,G,K,q)=>{let O=$1()==="main-input",F=$.value,z=$.setValue,B=$.cursorPosition,_=r1(),W=C1(),M=a1(),N=R8(),k=N?r8(N):!1,[C,w]=a2(!1),[v,P]=a2([]),[A,T]=a2(0),R=t4(F,B,{cwd:W,maxSuggestions:10}),L=k0(U||!1,X),f=Z6(0),E=500,t=Z6(!1);Y6(()=>{if(U)t.current=!1},[U]),Y6(()=>{if(R.hasQuery&&R.suggestions.length>0){let I=R.suggestions.map((y)=>({command:y,description:X6(y)?`Directory: ${y}`:`File: ${y}`,matchScore:1}));P(I),w(!0),T(0)}else if(F.startsWith("/"))if(F.includes(" "))w(!1),P([]);else{let y=U6(F,W);P(y),w(y.length>0),T(0)}else w(!1),P([])},[F,R.hasQuery,R.suggestions,W]);let u=J6(()=>{_.clearMessages(),_.setError(null)}),a=J6(()=>{a8.debug("[DIAG] handleSubmit called:",{input:F,showSuggestions:C});let I=F.trim();if(I){let y=$.resolveInput(I);a8.debug("[DIAG] Submitting command:",{displayText:I,textLength:y.text.length,imageCount:y.images.length}),w(!1),P([]);let D=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(I,D),$.clear(),Q(y),a8.debug("[DIAG] Command submitted to onSubmit callback")}else a8.debug("[DIAG] Empty command, not submitting")});return EY((I,y)=>{if(I==="?"&&!F){K?.(),setTimeout(()=>$.clear(),0);return}if(y.backspace||y.delete||y.leftArrow||y.rightArrow||y.pageUp||y.pageDown||!y.ctrl&&!y.meta&&!y.escape&&!y.tab&&!y.upArrow&&!y.downArrow&&!y.return&&!(I==="?"&&!F))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"){u();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(q)K?.();else if(U&&X){if(t.current)return;t.current=!0,X()}else if(C)w(!1),P([]);else if(F){let b=Date.now();if(b-f.current<500)$.clear(),f.current=0;else f.current=b}return}if(y.tab&&y.shift){G?.();return}if(y.tab){if(C&&v.length>0){let b=v[A].command;if(R.hasQuery&&R.suggestions.includes(b)){let{newInput:h,newCursorPos:S}=s4(F,R,b);z(h),$.setCursorPosition(S)}else{let h=b+" ";z(h),$.setCursorPosition(h.length)}w(!1),P([])}else if(k)M.toggleThinkingMode();return}if(y.return){a();return}if(y.upArrow){if(C&&v.length>0){let b=v.length-1;T((h)=>h>0?h-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(C&&v.length>0){let b=v.length-1;T((h)=>h<b?h+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:C,suggestions:v,selectedSuggestionIndex:A}};import xY from"ansi-escapes";import{useStdout as uY}from"ink";import{useCallback as lY,useEffect as dY,useRef as rY}from"react";import{useStdout as gY}from"ink";import{debounce as mY}from"lodash-es";import{useEffect as pY,useState as cY}from"react";function h$($=200){let{stdout:Q}=gY(),[Y,J]=cY(Q.columns||80);return pY(()=>{let Z=mY(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function K6(){let{stdout:$}=uY(),Q=h$(),Y=rY(!0),J=Q0((X)=>X.session.actions.incrementClearCount),Z=lY(()=>{if($)$.write(xY.clearTerminal);J()},[$,J]);return dY(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import q6 from"node:fs";import aY from"node:os";import i2 from"node:path";import{MultiSelect as iY}from"@inkjs/ui";import{useMemoizedFn as i8}from"ahooks";import{Box as Y0,Text as n,useFocus as oY,useFocusManager as nY,useInput as z6}from"ink";import o8 from"ink-select-input";import tY from"ink-spinner";import X8 from"ink-text-input";import{useEffect as O6,useState as E$}from"react";import{jsxDEV as j}from"react/jsx-dev-runtime";var sY=[{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"}],eY=[{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 $3($){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]=E$(Y?"name":"mode"),[X,U]=E$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[G,K]=E$(""),[q,H]=E$(!1),[O,F]=E$(""),[z,B]=E$(Y?"edit":"manual"),{focus:_}=nY(),M={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];O6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;_(`step-${J}`)},[J,_]);let N=i8(()=>{let P=M.indexOf(J);if(P<M.length-1)Z(M[P+1])}),k=i8(()=>{if(O)F("");if(J==="confirm"&&z==="ai"){Z("aiPrompt");return}let P=M.indexOf(J);if(P>0)Z(M[P-1]);else Q()}),C=i8(async()=>{H(!0),F("");try{let P=await $8.create(),A=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
40
|
+
${h0}`}]}}let x0=g2(_0),i0=await P(x0);if(!i0.accepted){let h0=i0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";W.addAssistantMessage(h0);return}if(N.enqueueCommand(q0),W.addUserMessage(q0.displayText),i0.delivery==="next_turn"){if(C.current=!0,!Q1().command.isProcessing)queueMicrotask(()=>{z$()})}return}M.setTasks([]),N.setRecoveredSteeringCount(0),k.current=!1;let v0=N.createAbortController();F1.resetStreamingBuffers(),W.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let $0=await S2(q0);if(!$0.success&&$0.error&&$0.error!=="aborted")W.setError($0.error)}catch($0){let _0=S8($0);if(_0.isAbort);else W.setError(`执行失败: ${_0.displayMessage}`)}finally{if(N.getAbortController()===v0){if(N.setProcessing(!1),N.clearAbortController(v0),W.setCurrentThinkingContent(null),C.current)queueMicrotask(()=>{z$()})}}});return p2(()=>{let q0=!1;return(async()=>{if(Y)await u2.resolvePendingWithHandler(q,K,Y);else await u2.cancelPendingNonInteractive(q,K);if(q0)return;let[v0,$0]=await Promise.all([O$.hasPendingInbox(q,K),O$.hasActiveGoal(q,K)]);if(v0||$0)await z$()})().catch((v0)=>{if(!q0)c2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",v0)}),()=>{q0=!0}},[Y,z$,K,q]),{executeCommand:D2,handleAbort:I$,isProcessing:G,cleanupAgent:v}};import{useMemoizedFn as u8}from"ahooks";import{useState as l4}from"react";var d4=()=>{let[$,Q]=l4([]),[Y,J]=l4(-1),Z=u8((q,U)=>{let H={display:q,pasteMappings:U?new Map(U):new Map};Q((z)=>[...z,H]),J(-1)}),X=u8(()=>{if($.length===0)return null;let q=Y===-1?$.length-1:Math.max(0,Y-1);return J(q),$[q]||null}),G=u8(()=>{if(Y===-1)return null;let q=Y+1;if(q>=$.length)return J(-1),null;else return J(q),$[q]||null}),K=u8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:G,resetHistoryIndex:K}};import{useMemoizedFn as J8}from"ahooks";import{useMemo as IY,useRef as r4,useState as TY}from"react";var a4=()=>{let[$,Q]=TY({isVisible:!1,details:null,resolver:null}),Y=r4(null),J=r4([]),Z=J8((H)=>{Y.current=H,Q({isVisible:Boolean(H),details:H?.details??null,resolver:H?.resolve??null})}),X=J8((H,z)=>{if(H.settled)return;if(H.settled=!0,H.signal&&H.abortListener)H.signal.removeEventListener("abort",H.abortListener);H.resolve(z)}),G=J8((H,z)=>{return new Promise((F)=>{let O={details:H,resolve:F,signal:z,settled:!1},B=()=>{if(Y.current===O){X(O,{approved:!1,reason:Y8}),Z(J.current.shift()??null);return}let _=J.current.indexOf(O);if(_>=0)J.current.splice(_,1);X(O,{approved:!1,reason:Y8})};if(O.abortListener=B,z?.aborted){B();return}if(z?.addEventListener("abort",B,{once:!0}),!Y.current){Z(O);return}J.current.push(O)})}),K=J8((H)=>{let z=Y.current;if(z)X(z,H);let F=J.current.shift()??null;Z(F)}),q=J8(()=>{if(Y.current)X(Y.current,{approved:!1,reason:Y8});for(let H of J.current)X(H,{approved:!1,reason:Y8});J.current=[],Z(null)}),U=IY(()=>({requestConfirmation:G}),[G]);return{confirmationState:$,confirmationHandler:U,handleResponse:K,dismissAll:q}};import{useMemoizedFn as _$}from"ahooks";import{useRef as i4,useState as vY}from"react";var l8="␞",d8="␟";function r8($){return`${l8}PASTE:${$}:`}function l2(){return d8}var GG=new RegExp(`${l8}PASTE:(\\d+):[\\s\\S]*?${d8}`,"g");function fY($){return $.includes(l8)&&$.includes(d8)}function o4($="",Q=0){let[Y,J]=vY({value:$,cursorPosition:Q}),Z=i4(0),X=i4(new Map),G=_$((O)=>{J((B)=>({value:O,cursorPosition:B.cursorPosition}));for(let B of X.current.keys()){let _=r8(B);if(!O.includes(_))X.current.delete(B)}}),K=_$((O)=>{J((B)=>({...B,cursorPosition:Math.max(0,Math.min(O,B.value.length))}))}),q=_$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),U=_$((O)=>{Z.current+=1;let B=Z.current;return X.current.set(B,{type:"text",data:O}),B}),H=_$((O,B)=>{let _=[...X.current.values()].filter((k)=>k.type==="image");if(_.length>=S$)throw Error(`最多只能粘贴 ${S$} 张图片`);let W=_.reduce((k,C)=>k+`data:${C.mimeType};base64,`.length+C.data.length,0),M=`data:${B};base64,`.length+O.length;if(W+M>j8)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let N=Z.current;return X.current.set(N,{type:"image",data:O,mimeType:B}),N}),z=_$((O)=>{for(let[B,_]of O)if(X.current.set(B,_),B>=Z.current)Z.current=B}),F=_$((O)=>{let B=[],_=[];if(!fY(O)){let T=O.trim();if(T)_.push({type:"text",text:T});return{displayText:O,text:O,images:B,parts:_}}let W=new RegExp(`${l8}PASTE:(\\d+):[\\s\\S]*?${d8}`,"g"),M=Array.from(O.matchAll(W)),N=0,k="",C="";for(let T of M){let R=T.index,L=R+T[0].length,f=parseInt(T[1],10),E=X.current.get(f);if(R>N){let t=O.slice(N,R);_.push({type:"text",text:t}),k+=t,C+=t}if(!E)k+=T[0],C+=T[0],_.push({type:"text",text:T[0]});else if(E.type==="text")k+=E.data,C+=E.data,_.push({type:"text",text:E.data});else{let t={id:f,base64:E.data,mimeType:E.mimeType};B.push(t),_.push({type:"image",...t}),C+=`[Image #${f}]`}N=L}if(N<O.length){let T=O.slice(N);_.push({type:"text",text:T}),k+=T,C+=T}let w=[];for(let T of _)if(T.type==="text"&&w.length>0&&w[w.length-1].type==="text")w[w.length-1].text+=T.text;else w.push(T);let v=0,P=w.length;while(v<w.length&&w[v].type==="text"&&w[v].text.trim()==="")v++;while(P>v&&w[P-1].type==="text"&&w[P-1].text.trim()==="")P--;let A=w.slice(v,P);return{displayText:C.trim(),text:k.trim(),images:B,parts:A}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:G,setCursorPosition:K,clear:q,pasteMap:X.current,addPasteMapping:U,addImagePasteMapping:H,restorePasteMappings:z,resolveInput:F}}import{useMemoizedFn as Y6}from"ahooks";import{useInput as gY}from"ink";import{useEffect as Z6,useRef as X6,useState as i2}from"react";function kY($){return{supportsThinking:D1().resolveConfig($).reasoning}}function a8($){return kY($).supportsThinking}import SY from"fast-glob";import DY from"fuse.js";import{useEffect as n4,useMemo as d2,useState as r2}from"react";var j$=null,VY=5000;function jY($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),G=X+Z.length;if(Q>=X&&Q<=G){let K=Z.slice(1),q=!1;if(K.startsWith('"')){if(q=!0,K=K.slice(1),K.endsWith('"'))K=K.slice(0,-1)}return{hasQuery:!0,query:K,startIndex:X,endIndex:G,quoted:q}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var hY=[...a2.map(($)=>`${$}/**`),...a2,...t4.map(($)=>`**/${$}`)];function s4($,Q,Y={}){let{cwd:J=u0(),maxSuggestions:Z=15,ignorePatterns:X=hY,debounceDelay:G=300,fuzzyMatch:K=!0}=Y,[q,U]=r2([]),[H,z]=r2(!1),[F,O]=r2(0),B=d2(()=>JSON.stringify(X),[X]),_=d2(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return jY($,Q)},[$,Q]);n4(()=>{if(!$.includes("@")){U([]),z(!1);return}let M=Date.now();if(j$&&j$.cwd===J&&j$.ignoreKey===B&&M-j$.timestamp<VY){U(j$.files),z(!1);return}let N=!1,C=setTimeout(async()=>{z(!0);try{let v=(await SY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((P)=>P.replace(/\\/g,"/"));if(!N)U(v),j$={cwd:J,ignoreKey:B,files:v,timestamp:M}}catch(w){if(console.error("Failed to load files for @ completion:",w),!N)U([])}finally{if(!N)z(!1)}},G);return()=>{N=!0,clearTimeout(C)}},[$,J,G,B]);let W=d2(()=>{if(!_.hasQuery||q.length===0)return[];let M=_.query.toLowerCase();if(M==="")return q.slice(0,Z);if(K)return new DY(q,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(M).slice(0,Z).map((C)=>C.item);return q.filter((N)=>N.toLowerCase().includes(M)).slice(0,Z)},[_,q,Z,K]);return n4(()=>{O(0)},[W]),{..._,suggestions:W,selectedIndex:F,loading:H}}function EY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function e4($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=EY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),G=Z+J+" "+X,K=Q.startIndex+J.length+1;return{newInput:G,newCursorPos:K}}import{useMemoizedFn as $6}from"ahooks";import{useEffect as Q6,useRef as J6}from"react";var k0=($,Q)=>{let Y=J6(!1),J=J6(null),Z=$6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{Z8().shutdown("SIGINT",0)},G=$6(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();r0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;r0().setAwaitingSecondCtrlC(!1),X()}});return Q6(()=>{if($){if(r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),Q6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),G};var i8=o1("UI"),q6=($,Q,Y,J,Z,X,G,K,q,U)=>{let z=$1()==="main-input",F=$.value,O=$.setValue,B=$.cursorPosition,_=r1(),W=C1(),M=a1(),N=R8(),k=N?a8(N):!1,[C,w]=i2(!1),[v,P]=i2([]),[A,T]=i2(0),R=s4(F,B,{cwd:W,maxSuggestions:10}),L=k0(G||!1,X),f=X6(0),E=500,t=X6(!1);Z6(()=>{if(G)t.current=!1},[G]),Z6(()=>{if(R.hasQuery&&R.suggestions.length>0){let I=R.suggestions.map((y)=>({command:y,description:G6(y)?`Directory: ${y}`:`File: ${y}`,matchScore:1}));P(I),w(!0),T(0)}else if(F.startsWith("/"))if(F.includes(" "))w(!1),P([]);else{let y=K6(F,W);P(y),w(y.length>0),T(0)}else w(!1),P([])},[F,R.hasQuery,R.suggestions,W]);let u=Y6(()=>{_.clearMessages(),_.setError(null)}),a=Y6(()=>{i8.debug("[DIAG] handleSubmit called:",{input:F,showSuggestions:C});let I=F.trim();if(I){let y=$.resolveInput(I);i8.debug("[DIAG] Submitting command:",{displayText:I,textLength:y.text.length,imageCount:y.images.length}),w(!1),P([]);let D=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(I,D),$.clear(),Q(y),i8.debug("[DIAG] Command submitted to onSubmit callback")}else i8.debug("[DIAG] Empty command, not submitting")});return gY((I,y)=>{if(I==="?"&&!F){q?.(),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==="?"&&!F))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"){u();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)q?.();else if(G&&X){if(t.current)return;t.current=!0,X()}else if(C)w(!1),P([]);else if(F){let b=Date.now();if(b-f.current<500)$.clear(),f.current=0;else f.current=b}return}if(y.tab&&y.shift){K?.();return}if(y.tab){if(C&&v.length>0){let b=v[A].command;if(R.hasQuery&&R.suggestions.includes(b)){let{newInput:h,newCursorPos:S}=e4(F,R,b);O(h),$.setCursorPosition(S)}else{let h=b+" ";O(h),$.setCursorPosition(h.length)}w(!1),P([])}else if(k)M.toggleThinkingMode();return}if(y.return){a();return}if(y.upArrow){if(C&&v.length>0){let b=v.length-1;T((h)=>h>0?h-1:b)}else{let b=Y();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);O(b.display),$.setCursorPosition(b.display.length)}}return}if(y.downArrow){if(C&&v.length>0){let b=v.length-1;T((h)=>h<b?h+1:0)}else{let b=J();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);O(b.display),$.setCursorPosition(b.display.length)}}return}},{isActive:z}),{handleSubmit:a,showSuggestions:C,suggestions:v,selectedSuggestionIndex:A}};import uY from"ansi-escapes";import{useStdout as lY}from"ink";import{useCallback as dY,useEffect as rY,useRef as aY}from"react";import{useStdout as mY}from"ink";import{debounce as pY}from"lodash-es";import{useEffect as cY,useState as xY}from"react";function h$($=200){let{stdout:Q}=mY(),[Y,J]=xY(Q.columns||80);return cY(()=>{let Z=pY(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function U6(){let{stdout:$}=lY(),Q=h$(),Y=aY(!0),J=Q0((X)=>X.session.actions.incrementClearCount),Z=dY(()=>{if($)$.write(uY.clearTerminal);J()},[$,J]);return rY(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import z6 from"node:fs";import iY from"node:os";import o2 from"node:path";import{MultiSelect as oY}from"@inkjs/ui";import{useMemoizedFn as o8}from"ahooks";import{Box as Y0,Text as n,useFocus as nY,useFocusManager as tY,useInput as _6}from"ink";import n8 from"ink-select-input";import sY from"ink-spinner";import X8 from"ink-text-input";import{useEffect as O6,useState as E$}from"react";import{jsxDEV as j}from"react/jsx-dev-runtime";var eY=[{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"}],$3=[{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 Q3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function G8({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=E$(Y?"name":"mode"),[X,G]=E$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[K,q]=E$(""),[U,H]=E$(!1),[z,F]=E$(""),[O,B]=E$(Y?"edit":"manual"),{focus:_}=tY(),M={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[O];O6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;_(`step-${J}`)},[J,_]);let N=o8(()=>{let P=M.indexOf(J);if(P<M.length-1)Z(M[P+1])}),k=o8(()=>{if(z)F("");if(J==="confirm"&&O==="ai"){Z("aiPrompt");return}let P=M.indexOf(J);if(P>0)Z(M[P-1]);else Q()}),C=o8(async()=>{H(!0),F("");try{let P=await $8.create(),A=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
41
41
|
|
|
42
42
|
## 可用工具列表
|
|
43
43
|
|
|
@@ -113,48 +113,48 @@ ${h0}`}]}}let x0=E2(_0),i0=await P(x0);if(!i0.accepted){let h0=i0.reason==="queu
|
|
|
113
113
|
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
114
114
|
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
115
115
|
|
|
116
|
-
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,
|
|
116
|
+
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,K)).trim(),L=R.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(L)R=L[1];let f=JSON.parse(R);if(!f.name||!f.description||!f.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(f.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");G({name:f.name,description:f.description,tools:Array.isArray(f.tools)?f.tools:[],color:f.color||"blue",location:"project",systemPrompt:f.systemPrompt}),Z("confirm")}catch(P){F(P instanceof Error?P.message:String(P))}finally{H(!1)}});O6(()=>{if(J==="aiGenerating"&&!U&&!z)C()},[J,U,z,C]);let w=o8(async()=>{try{let P=X.location==="project"?o2.join(u0(),".blade","agents"):o2.join(iY.homedir(),".blade","agents");await z6.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
|
-
`),R=i2.join(P,`${X.name}.md`);await q6.promises.writeFile(R,T,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),v=k0(!1,Q);if(z6((P,A)=>{if(A.escape)k();else if(A.ctrl&&P==="c"||A.meta&&P==="c")v()},{isActive:J!=="tools"}),J==="mode")return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(o8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(P)=>{if(P.value==="ai")B("ai"),Z("aiPrompt");else B("manual"),Z("name")}},void 0,!1,void 0,this),j(Y0,{marginTop:1,children:j(n,{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 j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:[j(n,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(X8,{value:G,onChange:K,onSubmit:(P)=>{if(!P.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Y0,{children:j(n,{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 j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"yellow",children:[j(tY,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:['根据你的描述:"',G,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{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 j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:["Step 1/7: ",P?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:P?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:[j(n,{color:"green",children:"名称: "},void 0,!1,void 0,this),P?j(n,{children:X.name},void 0,!1,void 0,this):j(X8,{value:X.name,onChange:(A)=>U({...X,name:A}),onSubmit:(A)=>{if($3(A))return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Y0,{children:j(n,{dimColor:!0,children:P?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P&&j(X8,{value:"",onChange:()=>{},onSubmit:N,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:[j(n,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(X8,{value:X.description,onChange:(P)=>U({...X,description:P}),onSubmit:(P)=>{if(!P.trim())return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Y0,{children:j(n,{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 j(Q3,{config:X,setConfig:U,onNext:N,onPrev:k},void 0,!1,void 0,this);if(J==="color")return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(o8,{items:eY,onSelect:(P)=>{let A=P.value==="none"?void 0:P.value;U({...X,color:A}),N()}},void 0,!1,void 0,this),j(Y0,{marginTop:1,children:j(n,{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 j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(o8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(P)=>{U({...X,location:P.value}),N()}},void 0,!1,void 0,this),j(Y0,{marginTop:1,children:j(n,{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 j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:[j(n,{color:"green",children:"提示词: "},void 0,!1,void 0,this),j(X8,{value:X.systemPrompt,onChange:(P)=>U({...X,systemPrompt:P}),onSubmit:()=>N()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Y0,{children:j(n,{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 j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[j(n,{children:[j(n,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),j(n,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),j(n,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),j(n,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),j(n,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),j(n,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),j(n,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(o8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(P)=>{if(P.value==="save")w();else if(P.value==="back")k();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function Q3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=oY({id:"step-tools"});z6((U,G)=>{if(G.escape)J()},{isActive:Z});let X=(U)=>{if(U.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:U});Y()};return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(iY,{options:sY,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import J3 from"node:fs";import{useMemoizedFn as N$}from"ahooks";import{Box as C0,Text as S0,useInput as Y3}from"ink";import o2 from"ink-select-input";import{useEffect as Z3,useMemo as _6,useState as n8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var n2=10;function F6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=N6($),[X,U]=n8(Q),[G,K]=n8(null),[q,H]=n8(0),[O,F]=n8(0),z=N$(()=>{Z.clear(),Z.loadFromStandardLocations(),H((R)=>R+1)}),B=_6(()=>{return Z.getAllSubagents()},[q]),_=Math.ceil(B.length/n2)||1,W=_6(()=>{let R=O*n2;return B.slice(R,R+n2)},[B,O]);Z3(()=>{let R=Math.max(0,_-1);if(O>R)F(R)},[_,O]);let M=N$(()=>{if(O<_-1)F((R)=>R+1)}),N=N$(()=>{if(O>0)F((R)=>R-1)}),k=[{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"}],C=N$((R)=>{if(R.value==="cancel"){J?.();return}U(R.value)}),w=N$((R)=>{if(K(R.value),X==="edit")U("editWizard");else if(X==="delete")U("deleteConfirm")}),v=N$(async()=>{if(!G?.configPath)return;try{await J3.promises.unlink(G.configPath),z(),P()}catch(R){console.error("删除失败:",R)}}),P=N$(()=>{U("menu"),K(null)}),A=k0(!1,J);if(Y3((R,L)=>{if(L.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")F(0),P();else if(X==="deleteConfirm")P()}else if(L.ctrl&&R==="c"||L.meta&&R==="c")A();else if(X==="list"){if(L.leftArrow||R==="h")N();else if(L.rightArrow||R==="l")M()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(o2,{items:k,onSelect:C},void 0,!1,void 0,this),i(C0,{marginTop:1,children:i(S0,{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(B.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(S0,{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(S0,{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(S0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),i(S0,{color:"gray",children:[" (共 ",B.length," 个)"]},void 0,!0,void 0,this),_>1&&i(S0,{color:"yellow",children:[" ","第 ",O+1,"/",_," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W.map((R)=>i(C0,{flexDirection:"column",paddingLeft:2,children:[i(C0,{children:i(S0,{children:[i(S0,{bold:!0,color:R.color||"white",children:["• ",R.name]},void 0,!0,void 0,this),i(S0,{color:"gray",children:[" - ",R.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.tools&&R.tools.length>0&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:["工具: ",R.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.configPath&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",dimColor:!0,children:R.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R.name,!0,void 0,this)),i(C0,{marginTop:1,paddingLeft:2,children:_>1?i(S0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):i(S0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let T=(R)=>{if(B.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(S0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let L=B.map((f)=>({key:f.name,label:`${f.name} - ${f.description}`,value:f}));return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(o2,{items:L,onSelect:w},void 0,!1,void 0,this),i(C0,{marginTop:1,children:i(S0,{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"&&G){let R={name:G.name,description:G.description,tools:G.tools||[],color:G.color,location:G.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:G.systemPrompt||""};return i(U8,{initialConfig:R,onComplete:()=>{z(),P()},onCancel:P},void 0,!1,void 0,this)}if(X==="delete")return T("删除 Agent");if(X==="deleteConfirm"&&G)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{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(S0,{children:["你确定要删除 Agent"," ",i(S0,{bold:!0,color:"yellow",children:G.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(S0,{dimColor:!0,children:["文件路径: ",G.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(S0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(o2,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(R)=>{if(R.value==="confirm")v();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as g$,Text as z0}from"ink";import U3,{useEffect as G3,useState as K3}from"react";import{useEffect as X3,useState as H6}from"react";function B6($=u0(),Q=5000){let[Y,J]=H6(null),[Z,X]=H6(!0);return X3(()=>{let U=!0,G=async()=>{try{let q=await W6($);if(!U)return;if(!q){J(null),X(!1);return}let H=await L6($);if(!U)return;J(H)}catch{if(U)J(null)}finally{if(U)X(!1)}};G();let K=null;if(Q>0)K=setInterval(G,Q);return()=>{if(U=!1,K)clearInterval(K)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as o,Fragment as b1}from"react/jsx-dev-runtime";var w6=U3.memo(()=>{let $=y8(),Q=f$(),J=P8()==="shortcuts",Z=K4(),X=C1(),{branch:U}=B6(X),G=R8(),K=J4(),q=$4(),H=I8(),O=T8(),F=v8(),z=f8(),B=k8(),_=Q4(),W=C8(),M=F4(),N=v$(),[k,C]=K3(null);G3(()=>{let R=!1;new t2(X,N).get().then((E)=>{if(!R)C(E)}).catch(()=>{if(!R)C(null)});let f=t2.subscribe((E)=>{if(!R&&E.sessionId===N&&E.workspaceRoot===X)C(E.goal)});return()=>{R=!0,f()}},[N,X]);let w=G?r8(G):!1,P=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return o(z0,{color:"magenta",children:[">> ","auto edit on ",o(z0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return o(z0,{color:"cyan",children:["‖ plan mode on ",o(z0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return o(z0,{color:"red",children:["yolo mode on ",o(z0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),A=P!==null,T=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return o(g$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?o(g$,{flexDirection:"column",gap:0,children:T.map((R,L)=>o(g$,{flexDirection:"row",children:[R.map((f,E)=>{let[t,u]=f.split(":");return o(g$,{flexDirection:"row",width:20,children:[o(z0,{color:"yellow",children:t},void 0,!1,void 0,this),o(z0,{color:"gray",children:":"},void 0,!1,void 0,this),o(z0,{color:"white",children:u},void 0,!1,void 0,this)]},E,!0,void 0,this)}),L===T.length-1&&o(z0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},L,!0,void 0,this))},void 0,!1,void 0,this):o(g$,{flexDirection:"row",gap:1,children:[U&&o(b1,{children:[o(z0,{color:"gray",children:[" ",U]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P,A&&o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),k&&o(b1,{children:[o(z0,{color:k.status==="active"?"green":k.status==="blocked"||k.status==="budget_limited"?"yellow":"gray",children:["goal:",k.status," ",k.objective.slice(0,32)]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(g$,{flexDirection:"row",gap:1,children:!$?o(z0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):o(b1,{children:[w&&o(b1,{children:[H?o(z0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):o(z0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F!=="auto"&&o(b1,{children:[o(z0,{color:F==="fast"?"yellow":"gray",children:["Speed ",F]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&o(b1,{children:[o(z0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B!=="auto"&&o(b1,{children:[o(z0,{color:"gray",children:["Style ",B]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G&&o(z0,{color:"gray",children:G.model},void 0,!1,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?o(z0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):o(z0,{color:K<20?"red":K<50?"yellow":"gray",children:[K,"%"]},void 0,!0,void 0,this),_>0.001&&o(b1,{children:[o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(z0,{color:"green",children:["$",_<0.01?_.toFixed(4):_.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W.length>0&&o(b1,{children:[o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(z0,{color:"yellow",children:["已排队 ",W.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),M>0&&o(b1,{children:[o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(z0,{color:"cyan",children:["已恢复 ",M," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&o(b1,{children:[o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(z0,{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 s2,Text as e2}from"ink";import q3 from"react";import{jsxDEV as m$}from"react/jsx-dev-runtime";var b6=q3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),U=Q>=$.length;if(Q>=J&&!U)Z=Q-J+1,X=Q+1;let G=$.slice(Z,X),K=$.length>J;return m$(s2,{flexDirection:"column",paddingX:2,paddingY:0,children:[G.map((q,H)=>{let F=Z+H===Q;return m$(s2,{flexDirection:"row",paddingX:1,gap:2,children:[m$(e2,{color:F?"cyan":"white",bold:F,children:q.command},void 0,!1,void 0,this),m$(e2,{color:F?"cyan":"gray",dimColor:!F,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),K&&m$(s2,{paddingX:1,children:m$(e2,{color:U?"cyan":"gray",bold:U,dimColor:!U,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 W1,Text as T1,useInput as QZ,useStdout as JZ}from"ink";import YZ from"ink-select-input";import RQ,{useMemo as i6}from"react";import{Box as O0,Text as b0}from"ink";import W$,{useEffect as PQ,useMemo as H$,useRef as d6}from"react";import{Box as zQ,Text as S6}from"ink";import y3 from"react";import{Text as A1}from"ink";import b3 from"react";import v6 from"string-width";import G8 from"string-width";function $Q({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 O3=$Q();function QQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(O3,"")}var A6=($=0)=>(Q)=>`\x1B[${Q+$}m`,P6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,y6=($=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]}},SG=Object.keys(j0.modifier),z3=Object.keys(j0.color),_3=Object.keys(j0.bgColor),DG=[...z3,..._3];function N3(){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=A6(),j0.color.ansi256=P6(),j0.color.ansi16m=y6(),j0.bgColor.ansi=A6(10),j0.bgColor.ansi256=P6(10),j0.bgColor.ansi16m=y6(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 G=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(G/6)/5,Z=G%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let U=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)U+=60;return U},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=N3(),R6=F3;var s8=new Set(["\x1B",""]),H3=39,YQ="\x07",I6="[",W3="]",T6="m",t8=`${W3}8;;`,M6=($)=>`${s8.values().next().value}${I6}${$}${T6}`,C6=($)=>`${s8.values().next().value}${t8}${$}${YQ}`,L3=($)=>$.split(" ").map((Q)=>G8(Q)),JQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,U=G8(QQ($.at(-1)));for(let[G,K]of J.entries()){let q=G8(K);if(U+q<=Y)$[$.length-1]+=K;else $.push(K),U=0;if(s8.has(K))Z=!0,X=J.slice(G+1,G+1+t8.length).join("")===t8;if(Z){if(X){if(K===YQ)Z=!1,X=!1}else if(K===T6)Z=!1;continue}if(U+=q,U===Y&&G<J.length-1)$.push(""),U=0}if(!U&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},B3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(G8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},w3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,U=L3($),G=[""];for(let[O,F]of $.split(" ").entries()){if(Y.trim!==!1)G[G.length-1]=G.at(-1).trimStart();let z=G8(G.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))G.push(""),z=0;if(z>0||Y.trim===!1)G[G.length-1]+=" ",z++}if(Y.hard&&U[O]>Q){let B=Q-z,_=1+Math.floor((U[O]-B-1)/Q);if(Math.floor((U[O]-1)/Q)<_)G.push("");JQ(G,F,Q);continue}if(z+U[O]>Q&&z>0&&U[O]>0){if(Y.wordWrap===!1&&z<Q){JQ(G,F,Q);continue}G.push("")}if(z+U[O]>Q&&Y.wordWrap===!1){JQ(G,F,Q);continue}G[G.length-1]+=F}if(Y.trim!==!1)G=G.map((O)=>B3(O));let K=G.join(`
|
|
119
|
-
`),
|
|
120
|
-
`){if(X)J+=
|
|
121
|
-
`){if(Z&&
|
|
118
|
+
`),R=o2.join(P,`${X.name}.md`);await z6.promises.writeFile(R,T,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),v=k0(!1,Q);if(_6((P,A)=>{if(A.escape)k();else if(A.ctrl&&P==="c"||A.meta&&P==="c")v()},{isActive:J!=="tools"}),J==="mode")return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(n8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(P)=>{if(P.value==="ai")B("ai"),Z("aiPrompt");else B("manual"),Z("name")}},void 0,!1,void 0,this),j(Y0,{marginTop:1,children:j(n,{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 j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:[j(n,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(X8,{value:K,onChange:q,onSubmit:(P)=>{if(!P.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Y0,{children:j(n,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(z)return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{color:"red",children:z},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"yellow",children:[j(sY,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:['根据你的描述:"',K,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{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=O==="edit";return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:["Step 1/7: ",P?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:P?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:[j(n,{color:"green",children:"名称: "},void 0,!1,void 0,this),P?j(n,{children:X.name},void 0,!1,void 0,this):j(X8,{value:X.name,onChange:(A)=>G({...X,name:A}),onSubmit:(A)=>{if(Q3(A))return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Y0,{children:j(n,{dimColor:!0,children:P?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P&&j(X8,{value:"",onChange:()=>{},onSubmit:N,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:[j(n,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(X8,{value:X.description,onChange:(P)=>G({...X,description:P}),onSubmit:(P)=>{if(!P.trim())return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Y0,{children:j(n,{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 j(J3,{config:X,setConfig:G,onNext:N,onPrev:k},void 0,!1,void 0,this);if(J==="color")return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(n8,{items:$3,onSelect:(P)=>{let A=P.value==="none"?void 0:P.value;G({...X,color:A}),N()}},void 0,!1,void 0,this),j(Y0,{marginTop:1,children:j(n,{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 j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(n8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(P)=>{G({...X,location:P.value}),N()}},void 0,!1,void 0,this),j(Y0,{marginTop:1,children:j(n,{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 j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:[j(n,{color:"green",children:"提示词: "},void 0,!1,void 0,this),j(X8,{value:X.systemPrompt,onChange:(P)=>G({...X,systemPrompt:P}),onSubmit:()=>N()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Y0,{children:j(n,{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 j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[j(n,{children:[j(n,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),j(n,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),j(n,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),j(n,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),j(n,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),j(n,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),j(n,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(n8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(P)=>{if(P.value==="save")w();else if(P.value==="back")k();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function J3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=nY({id:"step-tools"});_6((G,K)=>{if(K.escape)J()},{isActive:Z});let X=(G)=>{if(G.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:G});Y()};return j(Y0,{flexDirection:"column",paddingY:1,children:[j(Y0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Y0,{marginBottom:1,children:j(n,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(oY,{options:eY,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import Y3 from"node:fs";import{useMemoizedFn as N$}from"ahooks";import{Box as C0,Text as S0,useInput as Z3}from"ink";import n2 from"ink-select-input";import{useEffect as X3,useMemo as N6,useState as t8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var t2=10;function H6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=F6($),[X,G]=t8(Q),[K,q]=t8(null),[U,H]=t8(0),[z,F]=t8(0),O=N$(()=>{Z.clear(),Z.loadFromStandardLocations(),H((R)=>R+1)}),B=N6(()=>{return Z.getAllSubagents()},[U]),_=Math.ceil(B.length/t2)||1,W=N6(()=>{let R=z*t2;return B.slice(R,R+t2)},[B,z]);X3(()=>{let R=Math.max(0,_-1);if(z>R)F(R)},[_,z]);let M=N$(()=>{if(z<_-1)F((R)=>R+1)}),N=N$(()=>{if(z>0)F((R)=>R-1)}),k=[{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"}],C=N$((R)=>{if(R.value==="cancel"){J?.();return}G(R.value)}),w=N$((R)=>{if(q(R.value),X==="edit")G("editWizard");else if(X==="delete")G("deleteConfirm")}),v=N$(async()=>{if(!K?.configPath)return;try{await Y3.promises.unlink(K.configPath),O(),P()}catch(R){console.error("删除失败:",R)}}),P=N$(()=>{G("menu"),q(null)}),A=k0(!1,J);if(Z3((R,L)=>{if(L.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")F(0),P();else if(X==="deleteConfirm")P()}else if(L.ctrl&&R==="c"||L.meta&&R==="c")A();else if(X==="list"){if(L.leftArrow||R==="h")N();else if(L.rightArrow||R==="l")M()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:k,onSelect:C},void 0,!1,void 0,this),i(C0,{marginTop:1,children:i(S0,{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(B.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(S0,{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(S0,{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(S0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),i(S0,{color:"gray",children:[" (共 ",B.length," 个)"]},void 0,!0,void 0,this),_>1&&i(S0,{color:"yellow",children:[" ","第 ",z+1,"/",_," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W.map((R)=>i(C0,{flexDirection:"column",paddingLeft:2,children:[i(C0,{children:i(S0,{children:[i(S0,{bold:!0,color:R.color||"white",children:["• ",R.name]},void 0,!0,void 0,this),i(S0,{color:"gray",children:[" - ",R.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.tools&&R.tools.length>0&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:["工具: ",R.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.configPath&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",dimColor:!0,children:R.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R.name,!0,void 0,this)),i(C0,{marginTop:1,paddingLeft:2,children:_>1?i(S0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):i(S0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let T=(R)=>{if(B.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(S0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let L=B.map((f)=>({key:f.name,label:`${f.name} - ${f.description}`,value:f}));return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:L,onSelect:w},void 0,!1,void 0,this),i(C0,{marginTop:1,children:i(S0,{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(G8,{onComplete:()=>{O(),P()},onCancel:P},void 0,!1,void 0,this);if(X==="edit")return T("编辑 Agent");if(X==="editWizard"&&K){let R={name:K.name,description:K.description,tools:K.tools||[],color:K.color,location:K.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:K.systemPrompt||""};return i(G8,{initialConfig:R,onComplete:()=>{O(),P()},onCancel:P},void 0,!1,void 0,this)}if(X==="delete")return T("删除 Agent");if(X==="deleteConfirm"&&K)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{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(S0,{children:["你确定要删除 Agent"," ",i(S0,{bold:!0,color:"yellow",children:K.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(S0,{dimColor:!0,children:["文件路径: ",K.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(S0,{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:(R)=>{if(R.value==="confirm")v();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as g$,Text as O0}from"ink";import K3,{useEffect as q3,useState as U3}from"react";import{useEffect as G3,useState as W6}from"react";function w6($=u0(),Q=5000){let[Y,J]=W6(null),[Z,X]=W6(!0);return G3(()=>{let G=!0,K=async()=>{try{let U=await L6($);if(!G)return;if(!U){J(null),X(!1);return}let H=await B6($);if(!G)return;J(H)}catch{if(G)J(null)}finally{if(G)X(!1)}};K();let q=null;if(Q>0)q=setInterval(K,Q);return()=>{if(G=!1,q)clearInterval(q)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as o,Fragment as b1}from"react/jsx-dev-runtime";var b6=K3.memo(()=>{let $=y8(),Q=f$(),J=P8()==="shortcuts",Z=U4(),X=C1(),{branch:G}=w6(X),K=R8(),q=Y4(),U=Q4(),H=I8(),z=T8(),F=v8(),O=f8(),B=k8(),_=J4(),W=C8(),M=H4(),N=v$(),[k,C]=U3(null);q3(()=>{let R=!1;new s2(X,N).get().then((E)=>{if(!R)C(E)}).catch(()=>{if(!R)C(null)});let f=s2.subscribe((E)=>{if(!R&&E.sessionId===N&&E.workspaceRoot===X)C(E.goal)});return()=>{R=!0,f()}},[N,X]);let w=K?a8(K):!1,P=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return o(O0,{color:"magenta",children:[">> ","auto edit on ",o(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return o(O0,{color:"cyan",children:["‖ plan mode on ",o(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return o(O0,{color:"red",children:["yolo mode on ",o(O0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),A=P!==null,T=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return o(g$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?o(g$,{flexDirection:"column",gap:0,children:T.map((R,L)=>o(g$,{flexDirection:"row",children:[R.map((f,E)=>{let[t,u]=f.split(":");return o(g$,{flexDirection:"row",width:20,children:[o(O0,{color:"yellow",children:t},void 0,!1,void 0,this),o(O0,{color:"gray",children:":"},void 0,!1,void 0,this),o(O0,{color:"white",children:u},void 0,!1,void 0,this)]},E,!0,void 0,this)}),L===T.length-1&&o(O0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},L,!0,void 0,this))},void 0,!1,void 0,this):o(g$,{flexDirection:"row",gap:1,children:[G&&o(b1,{children:[o(O0,{color:"gray",children:[" ",G]},void 0,!0,void 0,this),o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P,A&&o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),k&&o(b1,{children:[o(O0,{color:k.status==="active"?"green":k.status==="blocked"||k.status==="budget_limited"?"yellow":"gray",children:["goal:",k.status," ",k.objective.slice(0,32)]},void 0,!0,void 0,this),o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(O0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(g$,{flexDirection:"row",gap:1,children:!$?o(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):o(b1,{children:[w&&o(b1,{children:[H?o(O0,{color:"cyan",children:["Effort ",z]},void 0,!0,void 0,this):o(O0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F!=="auto"&&o(b1,{children:[o(O0,{color:F==="fast"?"yellow":"gray",children:["Speed ",F]},void 0,!0,void 0,this),o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O!=="auto"&&o(b1,{children:[o(O0,{color:"gray",children:["Output ",O]},void 0,!0,void 0,this),o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B!=="auto"&&o(b1,{children:[o(O0,{color:"gray",children:["Style ",B]},void 0,!0,void 0,this),o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K&&o(O0,{color:"gray",children:K.model},void 0,!1,void 0,this),o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),U?o(O0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):o(O0,{color:q<20?"red":q<50?"yellow":"gray",children:[q,"%"]},void 0,!0,void 0,this),_>0.001&&o(b1,{children:[o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(O0,{color:"green",children:["$",_<0.01?_.toFixed(4):_.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W.length>0&&o(b1,{children:[o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(O0,{color:"yellow",children:["已排队 ",W.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),M>0&&o(b1,{children:[o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(O0,{color:"cyan",children:["已恢复 ",M," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&o(b1,{children:[o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(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 z3 from"react";import{jsxDEV as m$}from"react/jsx-dev-runtime";var A6=z3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),G=Q>=$.length;if(Q>=J&&!G)Z=Q-J+1,X=Q+1;let K=$.slice(Z,X),q=$.length>J;return m$(e2,{flexDirection:"column",paddingX:2,paddingY:0,children:[K.map((U,H)=>{let F=Z+H===Q;return m$(e2,{flexDirection:"row",paddingX:1,gap:2,children:[m$($Q,{color:F?"cyan":"white",bold:F,children:U.command},void 0,!1,void 0,this),m$($Q,{color:F?"cyan":"gray",dimColor:!F,children:["- ",U.description]},void 0,!0,void 0,this)]},U.command,!0,void 0,this)}),q&&m$(e2,{paddingX:1,children:m$($Q,{color:G?"cyan":"gray",bold:G,dimColor:!G,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as W1,Text as T1,useInput as JZ,useStdout as YZ}from"ink";import ZZ from"ink-select-input";import MQ,{useMemo as o6}from"react";import{Box as z0,Text as b0}from"ink";import W$,{useEffect as yQ,useMemo as H$,useRef as r6}from"react";import{Box as _Q,Text as D6}from"ink";import R3 from"react";import{Text as A1}from"ink";import A3 from"react";import f6 from"string-width";import K8 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 O3=QQ();function JQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(O3,"")}var P6=($=0)=>(Q)=>`\x1B[${Q+$}m`,y6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,R6=($=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]}},VK=Object.keys(j0.modifier),_3=Object.keys(j0.color),N3=Object.keys(j0.bgColor),jK=[..._3,...N3];function F3(){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=P6(),j0.color.ansi256=y6(),j0.color.ansi16m=R6(),j0.bgColor.ansi=P6(10),j0.bgColor.ansi256=y6(10),j0.bgColor.ansi16m=R6(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 K=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(K/6)/5,Z=K%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let G=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)G+=60;return G},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 H3=F3(),M6=H3;var e8=new Set(["\x1B",""]),W3=39,ZQ="\x07",T6="[",L3="]",v6="m",s8=`${L3}8;;`,C6=($)=>`${e8.values().next().value}${T6}${$}${v6}`,I6=($)=>`${e8.values().next().value}${s8}${$}${ZQ}`,B3=($)=>$.split(" ").map((Q)=>K8(Q)),YQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,G=K8(JQ($.at(-1)));for(let[K,q]of J.entries()){let U=K8(q);if(G+U<=Y)$[$.length-1]+=q;else $.push(q),G=0;if(e8.has(q))Z=!0,X=J.slice(K+1,K+1+s8.length).join("")===s8;if(Z){if(X){if(q===ZQ)Z=!1,X=!1}else if(q===v6)Z=!1;continue}if(G+=U,G===Y&&K<J.length-1)$.push(""),G=0}if(!G&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},w3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(K8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},b3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,G=B3($),K=[""];for(let[z,F]of $.split(" ").entries()){if(Y.trim!==!1)K[K.length-1]=K.at(-1).trimStart();let O=K8(K.at(-1));if(z!==0){if(O>=Q&&(Y.wordWrap===!1||Y.trim===!1))K.push(""),O=0;if(O>0||Y.trim===!1)K[K.length-1]+=" ",O++}if(Y.hard&&G[z]>Q){let B=Q-O,_=1+Math.floor((G[z]-B-1)/Q);if(Math.floor((G[z]-1)/Q)<_)K.push("");YQ(K,F,Q);continue}if(O+G[z]>Q&&O>0&&G[z]>0){if(Y.wordWrap===!1&&O<Q){YQ(K,F,Q);continue}K.push("")}if(O+G[z]>Q&&Y.wordWrap===!1){YQ(K,F,Q);continue}K[K.length-1]+=F}if(Y.trim!==!1)K=K.map((z)=>w3(z));let q=K.join(`
|
|
119
|
+
`),U=[...q],H=0;for(let[z,F]of U.entries()){if(J+=F,e8.has(F)){let{groups:B}=new RegExp(`(?:\\${T6}(?<code>\\d+)m|\\${s8}(?<uri>.*)${ZQ})`).exec(q.slice(H))||{groups:{}};if(B.code!==void 0){let _=Number.parseFloat(B.code);Z=_===W3?void 0:_}else if(B.uri!==void 0)X=B.uri.length===0?void 0:B.uri}let O=M6.codes.get(Number(Z));if(U[z+1]===`
|
|
120
|
+
`){if(X)J+=I6("");if(Z&&O)J+=C6(O)}else if(F===`
|
|
121
|
+
`){if(Z&&O)J+=C6(Z);if(X)J+=I6(X)}H+=F.length}return J};function XQ($,Q,Y){return String($).normalize().replaceAll(`\r
|
|
122
122
|
`,`
|
|
123
123
|
`).split(`
|
|
124
|
-
`).map((J)=>
|
|
125
|
-
`)}var
|
|
126
|
-
`).filter((
|
|
127
|
-
`);for(let _=0;_<B.length;_++){if(_>0)
|
|
128
|
-
`);for(let
|
|
129
|
-
`))
|
|
130
|
-
`);for(let
|
|
131
|
-
`),
|
|
132
|
-
`),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let
|
|
124
|
+
`).map((J)=>b3(J,Q,Y)).join(`
|
|
125
|
+
`)}var GQ=($)=>{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 f6(Q)};var k6=($)=>{return/[*_~`<[\]https?:]/.test($)},KQ=($)=>{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)=>f6(J)))},$2=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=XQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
|
|
126
|
+
`).filter((G)=>G.length>0);return X.length>0?X:[""]},S6=($,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 H1,Fragment as y3}from"react/jsx-dev-runtime";var qQ=2,UQ=1,zQ=2;function OQ($,Q){return`inline-${$}-${Q}`}var P3=({text:$})=>{let Q=A0();if(!k6($))return H1(A1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,G=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,K;while((K=G.exec($))!==null){if(K.index>J){let z=$.slice(J,K.index);Y.push(H1(A1,{children:z},OQ("text",Z++),!1,void 0,this))}let q=K[0],U=null,H=OQ("match",X++);try{if(q.startsWith("**")&&q.endsWith("**")&&q.length>qQ*2)U=H1(A1,{bold:!0,children:q.slice(qQ,-qQ)},H,!1,void 0,this);else if(q.length>UQ*2&&(q.startsWith("*")&&q.endsWith("*")||q.startsWith("_")&&q.endsWith("_"))){let z=$.substring(K.index-1,K.index),F=$.substring(G.lastIndex,G.lastIndex+1);if(!(/\w/.test(z)||/\w/.test(F)||/[./\\]/.test(z+F)))U=H1(A1,{italic:!0,children:q.slice(UQ,-UQ)},H,!1,void 0,this)}else if(q.startsWith("~~")&&q.endsWith("~~")&&q.length>zQ*2)U=H1(A1,{strikethrough:!0,children:q.slice(zQ,-zQ)},H,!1,void 0,this);else if(q.startsWith("`")&&q.endsWith("`")){let z=q.match(/^(`+)([^`]+)\1$/);if(z&&z[2])U=H1(A1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${z[2]} `},H,!1,void 0,this)}else if(q.startsWith("[")&&q.includes("](")&&q.endsWith(")")){let z=q.match(/\[(.*?)\]\((.*?)\)/);if(z){let F=z[1],O=z[2];U=H1(A1,{children:[F,H1(A1,{color:Q.colors.info,children:[" (",O,")"]},void 0,!0,void 0,this)]},H,!0,void 0,this)}}else if(q.match(/^https?:\/\//))U=H1(A1,{color:Q.colors.info,children:q},H,!1,void 0,this)}catch(z){console.error("InlineRenderer 解析错误:",q,z),U=null}Y.push(U??H1(A1,{children:q},H,!1,void 0,this)),J=G.lastIndex}if(J<$.length){let q=$.slice(J);Y.push(H1(A1,{children:q},OQ("text",Z++),!1,void 0,this))}return H1(y3,{children:Y.filter((q)=>q!==null)},void 0,!1,void 0,this)},P1=A3.memo(P3);import{jsxDEV as p$}from"react/jsx-dev-runtime";var M3="▎",V6=R3.memo(({lines:$,level:Q})=>{let Y=A0(),J=M3.repeat(Q);return p$(_Q,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return p$(_Q,{height:1},X,!1,void 0,this);return p$(_Q,{flexDirection:"row",children:[p$(D6,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),p$(D6,{italic:!0,wrap:"wrap",children:p$(P1,{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 J2,Text as h1}from"ink";import{isPlainObject as LQ}from"lodash-es";import{common as f3,createLowlight as k3}from"lowlight";import m6 from"react";import{Box as Q2,Text as q8}from"ink";import j1,{Fragment as E6}from"react";import C3 from"string-width";var j6=new Map,h6=1000;function FQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=h6){let J=j6.get($);if(J)return J}let Y=Array.from($);if($.length<=h6)j6.set($,Y);return Y}var NQ=new Map;function V1($){if(/^[\x20-\x7E]*$/.test($))return $.length;if(NQ.has($))return NQ.get($);let Q=C3($);return NQ.set($,Q),Q}import{jsxDEV as c$}from"react/jsx-dev-runtime";var HQ=2,g6=j1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=A0(),G=[],K=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),HQ);function q(_){if(!j1.isValidElement(_))return;if(_.type===E6){j1.Children.forEach(_.props.children,q);return}if(_.type===Q2){T3(_,Q,G);return}}j1.Children.forEach($,q);let H=G.length>K||Z>0?K-1:K,z=H!==void 0?Math.max(0,G.length-H):0,F=z+Z,B=(z>0?J==="top"?G.slice(z):G.slice(0,H):G).map((_,W)=>c$(Q2,{children:_.length>0?_.map((M,N)=>c$(q8,{...M.props,children:M.text},N,!1,void 0,this)):c$(q8,{children:" "},void 0,!1,void 0,this)},W,!1,void 0,this));return c$(Q2,{flexDirection:"column",width:Q,flexShrink:0,children:[F>0&&J==="top"&&c$(q8,{color:X.colors.text.muted,dimColor:!0,children:["... ",F," line",F===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),B,F>0&&J==="bottom"&&c$(q8,{color:X.colors.text.muted,dimColor:!0,children:["... ",F," line",F===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function I3($){if(!j1.isValidElement($)||$.type!==Q2)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 H={text:U,props:X??{}};if(X===void 0||X.wrap==="wrap")Y=!0,Q.segments.push(H);else if(!Y)Q.noWrapSegments.push(H);else Q.segments.push(H);return}if(!j1.isValidElement(Z))return;if(Z.type===E6){j1.Children.forEach(Z.props.children,(U)=>J(U,X));return}if(Z.type!==q8)return;let{children:G,...K}=Z.props,q=X===void 0?K:{...X,...K};j1.Children.forEach(G,(U)=>J(U,q))}return j1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function T3($,Q,Y){let J=I3($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let z of J.noWrapSegments)Z+=V1(z.text);if(J.segments.length===0){let z=[],F=[];for(let O of J.noWrapSegments){let B=O.text.split(`
|
|
127
|
+
`);for(let _=0;_<B.length;_++){if(_>0)z.push(F),F=[];if(B[_])F.push({text:B[_],props:O.props})}}if(F.length>0)z.push(F);for(let O of z)Y.push(O);return}let X=Q-Z;if(X<1){v3(J.noWrapSegments,Q,Y);return}let G=[],K=[],q=0;function U(){if(G.length===0)G.push([...J.noWrapSegments,...K]);else if(Z>0)G.push([{text:" ".repeat(Z),props:{}},...K]);else G.push(K);K=[],q=0}function H(z,F){if(K.length>0&&K[K.length-1].props===F)K[K.length-1].text+=z;else K.push({text:z,props:F})}for(let z of J.segments){let F=z.text.split(`
|
|
128
|
+
`);for(let O=0;O<F.length;O++){if(O>0)U();let _=F[O].split(/(\s+)/);for(let W of _){if(!W)continue;let M=V1(W);if(q+M>X&&q>0){if(U(),/^\s+$/.test(W))continue}if(M>X){let k=FQ(W);while(k.length>0){let C=0,w=0;for(let v of k){let P=V1(v);if(q+w+P>X)break;w+=P,C++}if(C>0){let v=k.slice(0,C).join("");H(v,z.props),q+=V1(v),k=k.slice(C)}if(k.length>0)U()}}else H(W,z.props),q+=M}}if(z.text.endsWith(`
|
|
129
|
+
`))U()}if(K.length>0)U();for(let z of G)Y.push(z)}function v3($,Q,Y){let J=[],Z=[],X=0;for(let G of $){let K=G.text.split(`
|
|
130
|
+
`);for(let q=0;q<K.length;q++){if(q>0)J.push(Z),Z=[],X=0;let U=K[q];if(!U)continue;let H=V1(U),z=Math.max(0,Q-V1("…"));if(H<=z&&X===0)Z.push({text:U,props:G.props}),X+=H;else{let F=FQ(U),O=X,B=0;for(let W of F){let M=V1(W);if(O+M>z)break;O+=M,B++}let _=F.slice(0,B).join("");if(_)Z.push({text:_,props:G.props});Z.push({text:"…",props:{}}),X=O+V1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let G of J)Y.push(G)}import{jsxDEV as G1}from"react/jsx-dev-runtime";var WQ=k3(f3),S3=200,F$=new Map;function D3($,Q){let Y=`${Q??"__auto__"}:${$}`,J=F$.get(Y);if(J!==void 0)F$.delete(Y),F$.set(Y,J);return J}function V3($,Q,Y){let J=`${Q??"__auto__"}:${$}`;if(F$.size>=S3){let Z=F$.keys().next().value;if(Z!==void 0)F$.delete(Z)}F$.set(J,Y)}function j3($){return LQ($)&&$.type==="text"&&typeof $.value==="string"}function h3($){return LQ($)&&$.type==="element"}function E3($){return LQ($)&&$.type==="root"&&Array.isArray($.children)}function Y2($,Q,Y=0){if(j3($))return G1(h1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(h3($)){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((G,K)=>Y2(G,Q,K));return G1(h1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(E3($))return G1(m6.Fragment,{children:$.children.map((J,Z)=>Y2(J,Q,Z))},Y,!1,void 0,this);return G1(h1,{},Y,!1,void 0,this)}function g3($,Q,Y){let J=Y||d0.getTheme().colors.syntax;try{let Z=D3($,Q);if(Z)return Y2(Z,J);let X;if(!Q||!WQ.registered(Q))X=WQ.highlightAuto($);else X=WQ.highlight(Q,$);let G=X;if(!G.children||G.children.length===0)return G1(h1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return V3($,Q,X),Y2(X,J)}catch(Z){return G1(h1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var Z2=m6.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=A0(),G=$.split(`
|
|
131
|
+
`),K=0;if(Z&&G.length>Z){let z=Math.max(Z,HQ);if(G.length>z)K=G.length-z,G=G.slice(K)}let q=G.length+K,U=String(q).length+1,H=Math.max(20,J-4);return G1(J2,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&G1(J2,{marginBottom:0,children:G1(h1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),K>0&&G1(J2,{marginBottom:0,children:G1(h1,{color:X.colors.text.muted,dimColor:!0,children:["... ",K," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G1(g6,{maxWidth:H,maxHeight:Z,children:G.map((z,F)=>{let O=F+K+1;return G1(J2,{flexDirection:"row",children:[Y&&G1(h1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(O).padStart(U-1," ")," "]},void 0,!0,void 0,this),z.trim()===""?G1(h1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):g3(z,Q,X.colors.syntax)]},F,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as p6,Text as z1,useInput as m3}from"ink";import p3,{useState as c3}from"react";import{jsxDEV as K1}from"react/jsx-dev-runtime";var c6=400;function x3($){let Q=$.split(`
|
|
132
|
+
`),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let G=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(G)J=parseInt(G[1],10),Z=parseInt(G[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 BQ=p3.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let G=A0(),K=x3($),[q,U]=c3(!1);m3((N)=>{if(N.toLowerCase()==="e")U((k)=>!k)},{isActive:X&&K.length>Z});let z=Math.max(...K.map((N)=>N.lineNumber||0)).toString().length+1,F=K.filter((N)=>N.type==="add").length,O=K.filter((N)=>N.type==="remove").length,B=K.length,_=B>Z,W;if(!_)W=K;else if(q)W=K.slice(0,c6);else W=K.slice(0,Z);let M=B-W.length;return K1(p6,{flexDirection:"column",marginTop:1,marginBottom:1,children:[K1(z1,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),_&&K1(z1,{color:G.colors.info,children:[q?`已展开 ${W.length}/${B} 行`:`显示前 ${Z} 行,共 ${B} 行`," · ",K1(z1,{color:G.colors.success,children:["+",F]},void 0,!0,void 0,this)," ",K1(z1,{color:G.colors.error,children:["-",O]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_&&K1(z1,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),W.map((N,k)=>{if(N.type==="header")return K1(z1,{color:G.colors.muted,dimColor:!0,children:N.content},k,!1,void 0,this);let C=N.lineNumber?N.lineNumber.toString().padStart(z," "):" ".repeat(z),w=" ",v,P;if(N.type==="add")w="+",P=G.colors.success,v=void 0;else if(N.type==="remove")w="-",P=G.colors.error,v=void 0;else P=G.colors.text.primary;let A=Math.max(0,J-z-2),T=N.content;if(T.length>A)T=T.substring(0,A-3)+"...";return K1(z1,{color:P,backgroundColor:v,children:[K1(z1,{dimColor:!0,children:C},void 0,!1,void 0,this),K1(z1,{children:w},void 0,!1,void 0,this),K1(z1,{children:[" ",T]},void 0,!0,void 0,this)]},k,!0,void 0,this)}),_&&K1(p6,{marginTop:1,children:q?K1(z1,{color:G.colors.info,dimColor:!0,children:[M>0?`已达显示上限 ${c6} 行,仍有 ${M} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):K1(z1,{color:G.colors.info,dimColor:!0,children:["已隐藏剩余 ",M," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),K1(z1,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as wQ,Text as x6}from"ink";import u3 from"react";import{jsxDEV as x$}from"react/jsx-dev-runtime";var l3=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,G=J.length;return x$(wQ,{paddingLeft:G+1,flexDirection:"row",children:[x$(wQ,{width:X,children:x$(x6,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),x$(wQ,{flexGrow:1,children:x$(x6,{wrap:"wrap",children:x$(P1,{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)},bQ=u3.memo(l3);import{Text as AQ}from"ink";import d3,{useMemo as r3}from"react";import u6 from"string-width";import{jsxDEV as PQ}from"react/jsx-dev-runtime";var l6=4,u$=3,a3=4,d6=d3.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=A0(),Z=r3(()=>{if($.length===0||Q.length===0)return null;let z=$.length,F=$.map((P,A)=>{let T=Math.max(KQ(P),u$);for(let R of Q)T=Math.max(T,KQ(R[A]||""));return T}),O=$.map((P,A)=>{let T=Math.max(GQ(P),u$);for(let R of Q)T=Math.max(T,GQ(R[A]||""));return T}),B=1+z*3,_=Math.max(Y-B-l6,z*u$),W=F.reduce((P,A)=>P+A,0),M=O.reduce((P,A)=>P+A,0),N=!1,k;if(M<=_)k=O;else if(W<=_){let P=_-W,A=O.map((R,L)=>R-F[L]),T=A.reduce((R,L)=>R+L,0);k=F.map((R,L)=>{if(T===0)return R;let f=Math.floor(A[L]/T*P);return R+f})}else{N=!0;let P=_/W;k=F.map((A)=>Math.max(Math.floor(A*P),u$))}function C(){let P=1;for(let A=0;A<$.length;A++){let T=$2($[A],k[A],N);P=Math.max(P,T.length)}for(let A of Q)for(let T=0;T<A.length;T++){let R=$2(A[T]||"",k[T],N);P=Math.max(P,R.length)}return P}if(C()>a3)return{type:"vertical",columnWidths:k,needsHardWrap:N};return{type:"horizontal",columnWidths:k,needsHardWrap:N}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let z=Math.min(Y-1,40),F="─".repeat(z);return PQ(AQ,{children:Q.map((O,B)=>{let _=[];if(B>0)_.push(F);return O.forEach((W,M)=>{let N=$[M]||`Column ${M+1}`,k=(W||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${k}`)}),_.join(`
|
|
133
133
|
`)}).join(`
|
|
134
|
-
`)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:
|
|
134
|
+
`)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:G}=Z;function K(z){let O={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[z],B=O.left;return X.forEach((_,W)=>{B+=O.h.repeat(_+2),B+=W<X.length-1?O.mid:O.right}),B}function q(z,F){let O=z.map((M,N)=>{let k=X[N]||u$;return $2(M||"",k,G)}),B=Math.max(...O.map((M)=>M.length),1),_=O.map((M)=>Math.floor((B-M.length)/2)),W=[];for(let M=0;M<B;M++){let N="│";for(let k=0;k<z.length;k++){let C=O[k],w=_[k],v=M-w,P=v>=0&&v<C.length?C[v]:"",A=X[k]||u$,T=u6(P),R=S6(F?`\x1B[1m${P}\x1B[22m`:P,T,A,F?"center":"left");N+=` ${R} │`}W.push(N)}return W}let U=[];if(U.push(K("top")),U.push(...q($,!0)),U.push(K("middle")),Q.forEach((z,F)=>{if(U.push(...q(z,!1)),F<Q.length-1)U.push(K("middle"))}),U.push(K("bottom")),Math.max(...U.map((z)=>u6(z)))>Y-l6){let z=Math.min(Y-1,40),F="─".repeat(z);return PQ(AQ,{children:Q.map((O,B)=>{let _=[];if(B>0)_.push(F);return O.forEach((W,M)=>{let N=$[M]||`Column ${M+1}`,k=(W||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${k}`)}),_.join(`
|
|
135
135
|
`)}).join(`
|
|
136
|
-
`)},void 0,!1,void 0,this)}return AQ
|
|
137
|
-
`)},void 0,!1,void 0,this)});import{jsxDEV as g}from"react/jsx-dev-runtime";var
|
|
138
|
-
`),
|
|
139
|
-
`);return g(
|
|
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,
|
|
141
|
-
`),K
|
|
142
|
-
`,
|
|
143
|
-
`);if(b===-1)return{completedContent:"",currentLine:E};return{completedContent:E.slice(0,b+1),currentLine:E.slice(b+1)}},[E,Z,M,z]),y=d6({content:"",blocks:[]}),D=H$(()=>{if(M)return F??[];if(L)return L;if(R.current&&R.current.messageId===O)return R.current.blocks;let b=y.current;if(!Z||!a.startsWith(b.content)){let V=yQ(a);return y.current={content:a,blocks:V},V}if(a===b.content)return b.blocks;let h=a.slice(b.content.length),S=yQ(h),x=[...b.blocks,...S];return y.current={content:a,blocks:x},x},[a,Z,M,F]);return g(O0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[t&&g(O0,{flexDirection:"row",flexShrink:0,children:[g(O0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(b0,{color:W.colors.text.muted,dimColor:!0,children:["^ ",u," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D.map((b,h)=>{if(b.type==="empty")return g(O0,{height:1,flexShrink:0},h,!1,void 0,this);return g(O0,{flexDirection:"row",flexShrink:0,children:[h===0&&!U&&g(O0,{marginRight:1,flexShrink:0,children:g(b0,{color:k,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),(h>0||U)&&g(O0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexGrow:1,flexShrink:0,children:b.type==="code"?_?g(b0,{wrap:"wrap",children:b.content},void 0,!1,void 0,this):g(i3,{content:b.content,language:b.language,terminalWidth:Y-w,isPending:Z,availableHeight:X},void 0,!1,void 0,this):b.type==="table"&&b.tableData?g(l6,{headers:b.tableData.headers,rows:b.tableData.rows,terminalWidth:Y-w},void 0,!1,void 0,this):b.type==="heading"?g(o3,{content:b.content,level:b.level||1},void 0,!1,void 0,this):b.type==="list"?g(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"?g(n3,{terminalWidth:Y-w},void 0,!1,void 0,this):b.type==="diff"&&b.diffData?g(LQ,{patch:b.diffData.patch,startLine:b.diffData.startLine,matchLine:b.diffData.matchLine,terminalWidth:Y-w},void 0,!1,void 0,this):b.type==="command-message"?g(s3,{content:b.content},void 0,!1,void 0,this):b.type==="blockquote"&&b.blockquoteLines?g(D6,{lines:b.blockquoteLines,level:b.blockquoteLevel||1},void 0,!1,void 0,this):g(t3,{content:b.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},h,!0,void 0,this)}),I&&g(O0,{flexDirection:"row",flexShrink:0,children:[D.length===0&&!U?g(O0,{marginRight:1,flexShrink:0,children:g(b0,{color:k,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(O0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexGrow:1,flexShrink:0,children:g(b0,{wrap:"wrap",children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v&&g(O0,{flexDirection:"row",flexShrink:0,children:[g(O0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[g(b0,{color:W.colors.text.muted,children:["Subtask"," ",typeof v.agentType==="string"?`@${v.agentType}`:"",typeof v.status==="string"?` · ${v.status}`:""]},void 0,!0,void 0,this),typeof v.summary==="string"&&v.summary.trim()!==""&&g(b0,{wrap:"wrap",children:v.summary},void 0,!1,void 0,this),typeof v.childSessionId==="string"&&g(b0,{color:W.colors.text.muted,children:["Session ",v.childSessionId]},void 0,!0,void 0,this),typeof v.resumedFrom==="string"&&g(b0,{color:W.colors.text.muted,children:["Resumed from ",v.resumedFrom,typeof v.resumeDepth==="number"?` · depth ${v.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 GZ}from"react/jsx-dev-runtime";var ZZ=RQ.memo(({label:$,isSelected:Q})=>I0(T1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),XZ=RQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(GZ,{children:[I0(W1,{marginBottom:1,children:I0(T1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&I0(W1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[I0(T1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(W1,{marginTop:1,children:I0(s1,{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(W1,{flexDirection:"column",marginBottom:1,children:I0(s1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&I0(W1,{flexDirection:"column",marginBottom:1,children:[I0(T1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,U)=>I0(W1,{marginLeft:2,children:I0(T1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},U,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&I0(W1,{flexDirection:"column",marginBottom:1,children:[I0(T1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,U)=>I0(W1,{marginLeft:2,children:I0(T1,{children:["• ",X]},void 0,!0,void 0,this)},U,!1,void 0,this)),$.affectedFiles.length>3&&I0(W1,{marginLeft:2,children:I0(T1,{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 UZ($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var o6=RQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=JZ(),J=Y.columns||80,X=$1()==="confirmation-prompt",U=k0(!1),G=$.type==="exitPlanMode",K=$.type==="enterPlanMode",q=$.type==="maxTurnsExceeded",H=$.type==="mcpSampling";QZ((z,B)=>{if(B.ctrl&&z==="c"||B.meta&&z==="c"){U();return}if(B.escape){Q({approved:!1,reason:"用户取消"});return}let _=z.toLowerCase();if(G){if(_==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(_==="s"){Q({approved:!0,targetMode:"default"});return}if(_==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(K){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(q){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(H){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=i6(()=>{if(G)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(K)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(q)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(H)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:"用户拒绝"}}]},[G,K,q,H]),F=i6(()=>{if(G)return{color:"cyan",title:"方案审核"};if(K)return{color:"magenta",title:"进入规划模式"};if(q)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[G,K,q,$.title]);return I0(W1,{flexDirection:"column",borderStyle:"round",borderColor:X?F.color:"gray",padding:1,children:[I0(W1,{marginBottom:1,children:I0(T1,{bold:!0,color:F.color,children:F.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(XZ,{details:$,headerColor:F.color,isPlanModeExit:G,isPlanModeEnter:K,terminalWidth:J},void 0,!1,void 0,this),I0(W1,{flexDirection:"column",children:[I0(T1,{color:"gray",children:UZ(G,K,q,H)},void 0,!1,void 0,this),I0(YZ,{items:O,isFocused:X,itemComponent:ZZ,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 X0,useInput as KZ}from"ink";import n6 from"ink-text-input";import{useState as E1}from"react";import{jsxDEV as m}from"react/jsx-dev-runtime";var q8=[{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"}],Z2=[{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"}],X2=[{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"}],qZ=[`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"],t6=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=d0.getTheme(),[X,U]=E1("action"),[G,K]=E1(0),[q,H]=E1(0),[O,F]=E1(0),[z,B]=E1(""),[_,W]=E1(""),[M,N]=E1(null),[k,C]=E1(!1),[w,v]=E1(null),P=q8[G],A=X2[q],T=Z2[O],R=()=>{if(w){v(null);return}switch(X){case"action":Y();break;case"event":U("action");break;case"matcher":U("event");break;case"command":U("matcher");break;case"location":U("command");break;case"confirm":U("location");break}};KZ((D,b)=>{if(b.escape){R();return}if(X==="action"){if(b.upArrow)K((h)=>h>0?h-1:q8.length-1);else if(b.downArrow)K((h)=>h<q8.length-1?h+1:0);else if(b.return)L()}else if(X==="event"){if(b.upArrow)H((h)=>h>0?h-1:X2.length-1);else if(b.downArrow)H((h)=>h<X2.length-1?h+1:0);else if(b.return)U("matcher")}else if(X==="location"){if(b.upArrow)F((h)=>h>0?h-1:Z2.length-1);else if(b.downArrow)F((h)=>h<Z2.length-1?h+1:0);else if(b.return)U("confirm")}else if(X==="confirm"){if(b.return)y()}});let L=()=>{let D=q8[G].action;if(D==="add")U("event");else if(D==="status")f();else if(D==="list")u();else if(D==="enable")q1.getInstance().enableSession(Q,$),v("Hooks enabled for this session");else if(D==="disable")q1.getInstance().disableSession(Q,$),v("Hooks disabled for this session");else if(D==="trust")E();else if(D==="revoke")t()},f=async()=>{let D=q1.getInstance(),b=D.isEnabled($,Q),h=D.getConfig($),S=await D.getTrustStatus($),x={};for(let l of Object.values(CQ)){let G0=h[l];if(G0&&Array.isArray(G0)){let Z0=G0.reduce((P0,B0)=>P0+(B0.hooks?.length||0),0);if(Z0>0)x[l]=Z0}}let V=[`Status: ${b?"Enabled":"Disabled"}`,`Trust: ${S.state}`,`Digest: ${S.currentDigest??"none"}`,""];if(Object.keys(x).length>0){V.push("Configured hooks:");for(let[l,G0]of Object.entries(x))V.push(` ${l}: ${G0} hook(s)`)}else V.push("No hooks configured");v(V.join(`
|
|
144
|
-
`))},E=async()=>{try{let D=await
|
|
145
|
-
Digest: ${D.currentDigest??"none"}`)}catch(D){N(D instanceof Error?D.message:"Failed to trust hooks")}},t=async()=>{try{let D=await
|
|
146
|
-
`))},a=()=>{U("command")},I=()=>{if(!_.trim()){N("Command cannot be empty");return}N(null),U("location")},y=async()=>{C(!0),N(null);try{let D=q1.getInstance(),b=await import("node:fs/promises"),h=await import("node:path"),S=await import("node:os"),x={matcher:z.trim()?{tools:z.trim()}:{},hooks:[{type:"command",command:_.trim()}]},V;switch(T.location){case"local":V=h.join($,".blade","settings.local.json");break;case"project":V=h.join($,".blade","settings.json");break;case"user":V=h.join(S.homedir(),".blade","settings.json");break}await b.mkdir(h.dirname(V),{recursive:!0});let l={};try{let B0=await b.readFile(V,"utf-8");l=JSON.parse(B0)}catch{}let G0=l.hooks||{},Z0=G0[A.event]||[],P0={...G0,enabled:!0,[A.event]:[...Z0,x]};if(l.hooks=P0,await b.writeFile(V,JSON.stringify(l,null,2),"utf-8"),await D.reloadConfig($),J)J({event:A.event,matcher:z.trim(),command:_.trim()});Y()}catch(D){N(`Failed to save hook: ${D instanceof Error?D.message:"Unknown error"}`),C(!1)}};return m(L0,{flexDirection:"column",padding:1,children:[m(L0,{marginBottom:1,children:m(X0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(L0,{marginBottom:1,children:m(X0,{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),w&&m(L0,{flexDirection:"column",marginBottom:1,children:[m(X0,{children:w},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(X0,{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"&&!w&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",marginTop:1,children:q8.map((D,b)=>m(L0,{children:[m(X0,{color:b===G?Z.colors.primary:void 0,bold:b===G,children:[b===G?"> ":" ",D.action]},void 0,!0,void 0,this),m(X0,{color:Z.colors.muted,children:[" - ",D.description]},void 0,!0,void 0,this)]},D.action,!0,void 0,this))},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(X0,{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"&&m(L0,{flexDirection:"column",children:[m(X0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),m(L0,{flexDirection:"column",marginTop:1,children:X2.map((D,b)=>m(L0,{children:[m(X0,{color:b===q?Z.colors.primary:void 0,bold:b===q,children:[b===q?"> ":" ",D.event]},void 0,!0,void 0,this),m(X0,{color:Z.colors.muted,children:[" - ",D.description]},void 0,!0,void 0,this)]},D.event,!0,void 0,this))},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(X0,{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"&&m(L0,{marginBottom:1,children:m(X0,{children:["Event:"," ",m(X0,{bold:!0,color:Z.colors.primary,children:A.event},void 0,!1,void 0,this),m(X0,{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")&&m(L0,{flexDirection:"column",marginBottom:1,children:[m(X0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),m(X0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),m(X0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),m(X0,{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"&&m(L0,{flexDirection:"column",children:[m(L0,{children:[m(X0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),m(n6,{value:z,onChange:B,onSubmit:a,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),m(L0,{marginTop:1,children:m(X0,{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),m(L0,{marginTop:1,children:m(X0,{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")&&m(L0,{marginBottom:1,children:m(X0,{children:["Matcher: ",m(X0,{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"&&m(L0,{flexDirection:"column",children:[m(L0,{children:m(X0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(L0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:m(n6,{value:_,onChange:W,onSubmit:I,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(L0,{flexDirection:"column",marginTop:1,children:[m(X0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),qZ.map((D,b)=>m(X0,{color:Z.colors.muted,children:["• ",D]},b,!0,void 0,this))]},void 0,!0,void 0,this),m(L0,{marginTop:1,children:m(X0,{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"&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[m(X0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),m(X0,{children:" "},void 0,!1,void 0,this),m(X0,{children:[" ","Event: ",A.event," - ",A.description]},void 0,!0,void 0,this),m(X0,{children:[" Matcher: ",z||"(all)"]},void 0,!0,void 0,this),m(X0,{children:[" Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),m(X0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),m(L0,{flexDirection:"column",marginTop:1,children:Z2.map((D,b)=>m(L0,{children:[m(X0,{color:b===O?Z.colors.primary:void 0,bold:b===O,children:[b===O?"> ":" ",b+1,". ",D.name]},void 0,!0,void 0,this),m(X0,{color:Z.colors.muted,children:[" ",D.description]},void 0,!0,void 0,this)]},D.location,!0,void 0,this))},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(X0,{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"&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[m(X0,{bold:!0,children:["Saving hook to ",T.description,"..."]},void 0,!0,void 0,this),m(X0,{children:" "},void 0,!1,void 0,this),m(X0,{children:["Event: ",A.event]},void 0,!0,void 0,this),m(X0,{children:["Matcher: ",z||"(all tools)"]},void 0,!0,void 0,this),m(X0,{children:["Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),m(L0,{marginTop:1,children:m(X0,{color:Z.colors.muted,children:k?"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),M&&m(L0,{marginTop:1,children:m(X0,{color:Z.colors.error,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as H9}from"ahooks";import{Box as CZ,Text as IZ}from"ink";import TZ from"react";import{useMemoizedFn as G2}from"ahooks";import B$ from"chalk";import{Text as AZ,useInput as PZ}from"ink";import{useEffect as _9,useRef as K2}from"react";var U2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var L$="\x1B",OZ=`${L$}[200~`,zZ=`${L$}[201~`,_Z="[200~",NZ="[201~",FZ=[`${L$}[I`,`${L$}[O`,"[I","[O"],$9=`${L$}[?2004h`,Q9=`${L$}[?2004l`,TQ=`${L$}[?1004l`,HZ=[OZ,_Z],WZ=[zZ,NZ];function J9(){return{pasteBuffer:null,pasteOverflowed:!1}}function s6($,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 e6($){return FZ.some((Q)=>$===Q)}function Y9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,U=[];while(Y.length>0){if(J!==null){let q=s6(Y,WZ);if(!q){if(J.length+Y.length>IQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+q.index>IQ)Z=!0;else if(!Z)J+=Y.slice(0,q.index),U.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length);continue}let G=s6(Y,HZ);if(!G){if(e6(Y))X=!0;else U.push({kind:"text",text:Y});Y="";break}let K=Y.slice(0,G.index);if(K&&!e6(K))U.push({kind:"text",text:K});J="",Z=!1,X=!0,Y=Y.slice(G.index+G.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:U}}import{execSync as l$}from"node:child_process";import{existsSync as LZ,readFileSync as vQ}from"node:fs";import{basename as Z9,isAbsolute as BZ}from"node:path";function X9($){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 U9(){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 wZ(){let{commands:$}=U9();try{return l$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function G9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function K9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function fQ($){let Q=G9($.trim()),Y=K9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function bZ($){let Q=G9($.trim()),Y=K9(Q);if(fQ(Y))return Y;return null}async function q9($){let Q=bZ($);if(!Q)return null;let Y;try{if(BZ(Q))Y=vQ(Q);else{let U=wZ();if(U&&Q===Z9(U))Y=vQ(U);else return null}}catch(U){return console.error("Failed to read image file:",U),null}let J=Y.toString("base64"),Z=X9(J),X=Z9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function O9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return l$(Y,{encoding:"utf-8"})||null}catch{return null}}async function z9(){let{commands:$,screenshotPath:Q}=U9();try{if(l$($.checkImage,{stdio:"ignore"}),l$($.saveImage(Q),{stdio:"ignore"}),!LZ(Q))return null;let J=vQ(Q).toString("base64"),Z=X9(J);return l$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{l$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as MZ}from"react/jsx-dev-runtime";var yZ=/\r\n/g,RZ=/\r/g;function kQ($){if(!$.includes("\r"))return $;return $.replace(yZ,`
|
|
147
|
-
`).replace(
|
|
148
|
-
`)}function
|
|
149
|
-
`))&&
|
|
150
|
-
`&&(w.shift||w.meta)){let{newValue:E,newCursorPosition:t}=
|
|
151
|
-
`)))return _(v);f=T.slice(0,R)+v+T.slice(R,T.length),L+=v.length}if(L<0)L=0;if(L>f.length)L=f.length;
|
|
152
|
-
`).length,z=O.length,B=500,_=10;if(z>500||F>10){let W=Z(O),M=O.slice(0,30).replace(/\n/g," "),N=`${z} chars, ${F} lines: ${M}...`;return{prompt:`${d8(W)}${N}${u2()}`}}return{}}),H=H9(async(O,F,z)=>{try{let B=X(O,F);return{prompt:`${d8(B)}[Image #${B}]${u2()}`}}catch(B){return console.error("[Image Paste] Failed to process image:",B),{prompt:`[Image paste failed: ${B instanceof Error?B.message:"Unknown error"}] `}}});return SQ(CZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[SQ(IZ,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),SQ(F9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:q,onImagePaste:H,placeholder:" 输入命令...",focus:G,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as q2,Text as y1}from"ink";import DZ,{useEffect as VZ,useState as jZ}from"react";import{useEffect as SZ,useState as b9}from"react";import{useEffect as vZ,useState as fZ}from"react";var kZ=15000,L9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],B9=["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 w9($,Q,Y=!1){let[J,Z]=fZ("");return vZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let q=Math.floor(Math.random()*B9.length);return B9[q]}let K=Math.floor(Math.random()*L9.length);return L9[K]};Z(X());let U=setInterval(()=>{Z(X())},kZ);return()=>{clearInterval(U)}},[$,Q,Y]),J}function A9($,Q=!1,Y=!1){let[J,Z]=b9(0),[X,U]=b9(null),G=w9($,Q,Y);return SZ(()=>{if(!$){Z(0),U(null);return}if(Y)return;if(X===null)U(Date.now());let K=setInterval(()=>{if(X!==null){let q=Math.floor((Date.now()-X)/1000);Z(q)}},1000);return()=>{clearInterval(K)}},[$,X,Y]),{currentPhrase:G,elapsedTime:J}}import{jsxDEV as J1,Fragment as EZ}from"react/jsx-dev-runtime";var DQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],hZ=80;function P9($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var y9=DZ.memo(({message:$,paused:Q=!1})=>{let Y=i1(),J=y8(),Z=Y||!J,[X,U]=jZ(0),G=A0(),q=h$()>=hZ,{currentPhrase:H,elapsedTime:O}=A9(Z,!1,Q);if(VZ(()=>{if(!Z||Q){U(0);return}let z=setInterval(()=>{U((B)=>(B+1)%DQ.length)},150);return()=>clearInterval(z)},[Z,Q]),!Z)return null;let F=$||H||"正在思考中...";if(q)return J1(q2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[J1(y1,{color:G.colors.warning,bold:!0,children:DQ[X]},void 0,!1,void 0,this),J1(y1,{color:G.colors.text.primary,children:F},void 0,!1,void 0,this),O>0&&J1(EZ,{children:[J1(y1,{color:G.colors.muted,children:"|"},void 0,!1,void 0,this),J1(y1,{color:G.colors.info,children:["已用时: ",P9(O)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J1(y1,{color:G.colors.muted,children:"|"},void 0,!1,void 0,this),J1(y1,{color:G.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return J1(q2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[J1(q2,{flexDirection:"row",gap:1,children:[J1(y1,{color:G.colors.warning,bold:!0,children:DQ[X]},void 0,!1,void 0,this),J1(y1,{color:G.colors.text.primary,children:F},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O>0&&J1(q2,{marginLeft:2,flexDirection:"row",gap:1,children:[J1(y1,{color:G.colors.info,children:["已用时: ",P9(O)]},void 0,!0,void 0,this),J1(y1,{color:G.colors.muted,children:"|"},void 0,!1,void 0,this),J1(y1,{color:G.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as _2,Text as D0,useInput as gZ,useStdout as mZ}from"ink";import pZ from"ink-text-input";import cZ,{useCallback as O2,useEffect as xZ,useMemo as uZ,useState as w$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var I9=cZ.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=mZ(),J=Y.columns||80,Z=$1()==="confirmation-prompt",X=k0(!1),U=$.fields??[],[G,K]=w$("field"),[q,H]=w$(0),[O,F]=w$(()=>R9($)),[z,B]=w$(""),[_,W]=w$(0),[M,N]=w$([]),[k,C]=w$(),w=U[q],v=uZ(()=>lZ(w),[w]);xZ(()=>{if(!w)return;let L=O[w.name];B(typeof L==="string"||typeof L==="number"?String(L):""),N(Array.isArray(L)?[...L]:[]);let f=v.findIndex((E)=>E.value===String(L));W(f>=0?f:0),C(void 0)},[O,w,v]);let P=O2((L)=>{if(F(L),q<U.length-1){H((f)=>f+1);return}K("review")},[q,U.length]),A=O2((L)=>{if(!w)return;let f={...O};if(L===void 0)delete f[w.name];else f[w.name]=L;P(f)},[O,w,P]),T=O2((L)=>{if(!w)return;try{A(M9(w,L))}catch(f){C(f instanceof Error?f.message:String(f))}},[w,A]),R=O2(()=>{try{let L=C9($,{action:"accept",content:O});Q({action:L.action,...L.content?{content:L.content}:{}})}catch(L){C(L instanceof Error?L.message:String(L))}},[O,$,Q]);if(gZ((L,f)=>{if(f.ctrl&&L==="c"||f.meta&&L==="c"){X();return}if(f.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(G==="review"){if(L.toLowerCase()==="y"||f.return)R();else if(L.toLowerCase()==="e")H(0),K("field");else if(L.toLowerCase()==="d")Q({action:"decline"});return}if(!w){if(f.return)R();return}if(VQ(w))return;if(L.toLowerCase()==="d"){Q({action:"decline"});return}if(f.upArrow){W((E)=>E>0?E-1:Math.max(v.length-1,0));return}if(f.downArrow||f.tab){W((E)=>E<v.length-1?E+1:0);return}if(L===" "&&w.type==="multi-select"){let E=v[_];if(E)N((t)=>t.includes(E.value)?t.filter((u)=>u!==E.value):[...t,E.value]);return}if(f.return)if(w.type==="multi-select")A(M);else{let E=v[_];if(E)A(E.typedValue)}},{isActive:Z}),$.mode==="url")return F0(z2,{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(G==="review")return F0(z2,{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),U.map((L)=>F0(D0,{children:[L.title,": ",rZ(O[L.name])]},L.name,!0,void 0,this)),k&&F0(D0,{color:"red",children:k},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(!w)return F0(z2,{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(z2,{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(_2,{flexDirection:"column",marginTop:1,children:[F0(D0,{bold:!0,children:[w.title,w.required?" *":""]},void 0,!0,void 0,this),w.description&&F0(D0,{color:"gray",children:w.description},void 0,!1,void 0,this),F0(D0,{color:"gray",children:dZ(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),VQ(w)?F0(_2,{children:[F0(D0,{color:"cyan",children:"> "},void 0,!1,void 0,this),F0(pZ,{value:z,onChange:B,onSubmit:T,focus:Z,placeholder:w.defaultValue===void 0?w.required?"Required":"Optional":String(w.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):F0(_2,{flexDirection:"column",children:v.map((L,f)=>{let E=w.type==="multi-select"&&M.includes(L.value);return F0(D0,{color:_===f?"yellow":void 0,children:[_===f?"> ":" ",w.type==="multi-select"?E?"(*) ":"( ) ":"",L.label]},L.value,!0,void 0,this)})},void 0,!1,void 0,this),k&&F0(D0,{color:"red",children:k},void 0,!1,void 0,this),F0(D0,{color:"gray",children:[VQ(w)?"Enter to continue":w.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 ",q+1," of ",U.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function z2({children:$,width:Q,color:Y}){return F0(_2,{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 lZ($){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 dZ($){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 rZ($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import W2 from"ansi-escapes";import{Box as $$,Static as p9,useStdout as G5}from"ink";import K5,{useEffect as p1,useMemo as c9,useRef as Q$,useState as cQ}from"react";import{useStdout as aZ}from"ink";import{debounce as iZ}from"lodash-es";import{useEffect as oZ,useState as nZ}from"react";function T9($=200){let{stdout:Q}=aZ(),[Y,J]=nZ(Q.rows||24);return oZ(()=>{let Z=iZ(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import b$ from"chalk";import tZ from"string-width";var N0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},F2="\x1B",jQ=`${F2}[2K`,N2=($)=>$>0?`${F2}[${$}A`:"",v9=`${F2}[?25l`,f9=`${F2}[?25h`;function k9($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function S9($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function D9($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),U=[],G=d0.getTheme(),K=" ".repeat(N0.prefixIndent),q=b$.dim.hex(G.colors.border.light);if(Q>0)U.push(`${K}${b$.dim.hex(G.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let H=Y==="code",O=Y==="diff",F="",z=$;if(H&&$.length>0)F=$[0].match(/^```(\w+)?/)?.[1]||"",z=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")z=$.slice(1);let B=z.slice(-X);if(H&&Q===0){let W=F?` ${b$.hex(G.colors.text.secondary)(F)}`:"";U.push(`${K}${q("╭─")}${W}`)}for(let W=0;W<B.length;W++){let M=B[W],N=K;if(W===0&&!J&&N0.isFirstRender&&!H&&!O)N=b$.bold.hex(G.colors.success)("• ")+" ",N0.isFirstRender=!1;let k=H?4:0,C=N0.terminalWidth-N0.prefixIndent-2-k,w=M;if(tZ(M)>C)w=M.slice(0,C);if(H)U.push(`${K}${q("│")} ${w}`);else if(O){let v=w;if(v.startsWith("+"))U.push(`${N}${b$.green(w)}`);else if(v.startsWith("-"))U.push(`${N}${b$.red(w)}`);else if(v.startsWith("@@"))U.push(`${N}${b$.dim(w)}`);else U.push(`${N}${w}`)}else U.push(`${N}${w}`);if(W===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let _=[];if(_.push(v9),N0.renderedLineCount>0)_.push(N2(N0.renderedLineCount)),_.push("\r");for(let W=0;W<U.length;W++){let M=U[W],N=N0.lastRenderedLines[W];if(M!==N)_.push(jQ),_.push(M);if(W<U.length-1)_.push(`
|
|
153
|
-
`)}if(
|
|
154
|
-
`),_.push(
|
|
155
|
-
`);if(N0.renderedLineCount>1)$.push(
|
|
156
|
-
`)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function
|
|
157
|
-
`).length}var pQ=Z5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=m9(()=>U5($),[$]),X=m9(()=>X5($),[$]),U=J.colors.info,G=J.colors.muted;return m1(mQ,{flexDirection:"column",marginBottom:1,children:[m1(mQ,{flexDirection:"row",children:[m1(d$,{color:U,children:Y?"v":">"},void 0,!1,void 0,this),m1(d$,{children:" "},void 0,!1,void 0,this),m1(d$,{color:G,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&m1(d$,{color:G,children:[" - ",X]},void 0,!0,void 0,this),m1(d$,{color:G,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&m1(mQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:m1(d$,{color:G,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 a0}from"react/jsx-dev-runtime";var u9=K5.memo(()=>{let $=sQ(),Q=L4(),Y=B4(),J=w4(),Z=i1(),X=X4(),U=q4(),G=C8(),K=H4(),q=W4(),H=eQ(),O=A4(),F=b4(),z=h$(),B=T9(),{stdout:_}=G5(),W=r1(),[M,N]=cQ(null),[k,C]=cQ([]),[w,v]=cQ(new Set),P=Q$(F),A=Q$(null),T=Q$(0),R=Q$(0),L=Q$(new Set),f=Q$(new Set),E=Q$([]),t=Q$(null);p1(()=>{if(P.current!==F){if(v1())g1();if(_)_.write(W2.clearTerminal);W.incrementClearCount(),P.current=F}},[F,_,W]);let u=$,a=J;p1(()=>{if(!J||Z){t.current=null;return}if(t.current===J)return;if(t.current=J,v1())g1();if(_)_.write(W2.eraseScreen+W2.cursorTo(0,0));L.current=new Set,f.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),A.current=null,T.current=0,R.current=0,E.current=[],C([]),v(new Set),W.incrementClearCount(),W.clearFinalizingStreamingMessageId()},[J,Z,_,W,u]);let I=Q??J;p1(()=>{if(v1())g1();A.current=null,T.current=0,R.current=0,L.current=new Set,f.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),E.current=[],C([]),v(new Set)},[H]),p1(()=>{if(!I)return;if(A.current===I)return;A.current=I,T.current=0,R.current=0,f.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),E.current=[],C([])},[I,u]),p1(()=>{if(!I)return;let S=xQ(I);if(!S||S.length<=T.current)return;let x=S.slice(T.current);T.current=S.length;let V=x,l=E.current;if(l.length>0)if(V.some((B0)=>B0.type!=="empty"))V=[...l,...V],E.current=[];else{E.current=[...l,...V];return}let G0=V.length;while(G0>0&&V[G0-1].type==="empty")G0-=1;if(G0!==V.length)E.current=V.slice(G0),V=V.slice(0,G0);if(V.length===0)return;let Z0=R.current;R.current+=1;let P0=Z0>0;if(v1())g1();v((B0)=>{if(!I||B0.has(I))return B0;let s0=new Set(B0);return s0.add(I),s0}),C((B0)=>[...B0,a0($$,{flexDirection:"column",children:a0(s1,{content:"",role:"assistant",terminalWidth:z,isPending:!1,hidePrefix:P0,noMargin:!0,blocksOverride:V,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${Z0}`,!1,void 0,this)])},[I,Y.version,z,H]),p1(()=>{if(!I)return;let S=f.current,x=u.filter((V)=>V.role==="tool"&&!S.has(V.id)&&!L.current.has(V.id));if(x.length===0)return;if(v1())g1();for(let V of x)L.current.add(V.id);C((V)=>[...V,...x.map((l)=>a0($$,{flexDirection:"column",children:a0(s1,{content:l.content,role:l.role,terminalWidth:z,metadata:l.metadata,isPending:!1,messageId:l.id},void 0,!1,void 0,this)},`streaming-tool-${l.id}`,!1,void 0,this))])},[I,u,z]),p1(()=>{if(!I){if(v1())g1();return}if(!v1())k9(z,B);else S9(z,B);let S=x9(I);if(!S||S.lines.length===0)return;let V=Math.max(1,B-8),l=Math.max(0,S.lines.length-V),G0=S.lines.slice(-V),Z0=(xQ(I)?.length??0)>0;D9(G0,l,S.mode,Z0)},[I,Y.version,B,z]),p1(()=>{if(!I&&v1())g1()},[I]),p1(()=>{if(M===null&&u.length>O){if(N(u.length),v1())g1();if(_)_.write(W2.clearTerminal);W.incrementClearCount()}},[u.length,O,M,_,W]);let y=c9(()=>{return X.some((S)=>S.status==="pending"||S.status==="in_progress")},[X]),D=F?0:M??0,b=D,h=c9(()=>{let S=[];if(S.push(a0(h9,{},"header",!1,void 0,this)),b>0)S.push(a0(EQ,{collapsedCount:b},"collapsed-summary",!1,void 0,this));for(let x=D;x<u.length;x++){let V=u[x];if(a&&V.id===a)continue;if(V.role==="tool"&&L.current.has(V.id))continue;if(V.role==="assistant"&&w.has(V.id))continue;S.push(a0($$,{flexDirection:"column",children:a0(s1,{content:V.content,role:V.role,terminalWidth:z,metadata:V.metadata,isPending:!1,messageId:V.id},void 0,!1,void 0,this)},V.id,!1,void 0,this))}return S},[u,D,b,z,a,w]);return a0($$,{flexDirection:"column",paddingX:2,children:a0($$,{flexDirection:"column",children:[a0(p9,{items:h,children:(S)=>S},H,!1,void 0,this),K&&a0($$,{marginBottom:1,children:a0(pQ,{content:K,isStreaming:Z,isExpanded:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),k.length>0&&a0(p9,{items:k,children:(S)=>S},`streaming-${H}`,!1,void 0,this),U&&y&&a0($$,{marginTop:1,children:a0(g9,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.map((S,x)=>a0($$,{flexDirection:"column",children:a0(s1,{content:S.displayText,role:"user",terminalWidth:z},void 0,!1,void 0,this)},`pending-${x}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as L2,useMount as q5}from"ahooks";import{Box as B1,Text as H0,useFocus as O5,useFocusManager as z5,useInput as _5}from"ink";import N5 from"ink-select-input";import{memo as F5,useMemo as H5,useState as B2}from"react";import{jsxDEV as s,Fragment as B5}from"react/jsx-dev-runtime";var W5=({isSelected:$})=>s(B1,{marginRight:1,children:s(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),L5=({isSelected:$,label:Q})=>s(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),l9=F5(({onClose:$,onEdit:Q})=>{let Y=O4(),J=M8()??"",{isFocused:Z}=O5({id:"model-selector"}),X=z5(),[U,G]=B2(""),[K,q]=B2(!1),[H,O]=B2(null),F=k0(!1),[z]=B2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});q5(()=>{if(X?.focus("model-selector"),Y.length>0)G(Y[0].id)}),_5((P,A)=>{if(K)return;if(A.ctrl&&P==="c"||A.meta&&P==="c"){F();return}if(A.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){_();return}if((P==="e"||P==="E")&&Q)W()},{isActive:!0});let B=L2(async(P)=>{if(K)return;let A=P.value;if(A===J){$();return}q(!0),O(null);try{await m0().setCurrentModel(A),$()}catch(T){O(T.message),q(!1)}}),_=L2(async()=>{if(K||U===J)return;q(!0),O(null);try{if(await m0().removeModel(U),Y.length<=1)$()}catch(P){O(P.message)}finally{q(!1)}}),W=L2(()=>{if(K||!Q)return;let P=Y.find((A)=>A.id===U);if(!P)return;Q(P)}),M=L2((P)=>{G(P.value)}),N=H5(()=>{return Y.find((P)=>P.id===U)},[Y,U]),k=N?w2()?.modelProviders[N.provider]:void 0,C=Y.map((P)=>{let A=P.id===J?" (当前)":"";return{label:uQ(P)+A,value:P.id}}),w=U===J;return s(B1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[s(B1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[s(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),s(H0,{dimColor:!0,children:[K?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(B1,{flexDirection:"row",children:[s(B1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[s(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),s(B1,{marginTop:1,children:s(N5,{items:C,onSelect:B,onHighlight:M,indicatorComponent:W5,itemComponent:L5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(B1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[s(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),s(B1,{marginY:1,children:s(H0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N?s(B1,{flexDirection:"column",children:[s(H0,{children:[s(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),s(H0,{bold:!0,color:"cyan",children:uQ(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(H0,{children:[s(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),s(H0,{bold:!0,children:k?.name??N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k&&s(B5,{children:[s(H0,{children:[s(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),s(H0,{children:N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(H0,{children:[s(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),s(H0,{children:k.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(H0,{children:[s(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),s(H0,{color:"blueBright",children:k.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(H0,{children:[s(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),s(H0,{bold:!0,children:N.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.overrides?.baseUrl&&s(H0,{children:[s(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),s(H0,{color:"blueBright",children:N.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(H0,{children:[s(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),s(H0,{children:D1().resolveConfig(N).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):s(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H&&s(B1,{marginTop:1,children:s(H0,{color:"red",children:H},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(B1,{justifyContent:"center",marginTop:1,children:s(H0,{dimColor:!0,children:"─".repeat(z)},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(B1,{justifyContent:"center",children:s(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 lQ}from"ahooks";import{Box as m5,Text as dQ,useInput as p5}from"ink";import{useState as y$}from"react";import{Box as A$,Text as c1,useInput as w5}from"ink";import b5 from"ink-text-input";import{jsxDEV as o0}from"react/jsx-dev-runtime";var d9=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return w5((U,G)=>{if(G.escape)Z()}),o0(A$,{flexDirection:"column",children:[o0(A$,{marginBottom:1,children:o0(c1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(A$,{marginBottom:1,children:o0(c1,{children:["Provider: ",o0(c1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o0(A$,{marginBottom:1,children:o0(c1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(A$,{children:[o0(c1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),o0(b5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&o0(A$,{marginTop:1,children:o0(c1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(A$,{marginTop:1,children:o0(c1,{dimColor:!0,children:["输入完成后按 ",o0(c1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",o0(c1,{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 b2,Text as J$,useInput as A5}from"ink";import P5 from"ink-text-input";import{useState as A2}from"react";import{jsxDEV as z1}from"react/jsx-dev-runtime";var P2=["id","name","baseUrl","model"];function r9($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function y5($,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 R5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=i9(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 o9=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,U]=A2(Q?3:0),[G,K]=A2(Q?.model??""),[q,H]=A2(Z),[O,F]=A2(),z=P2[X];A5((_,W)=>{if(!W.escape)return;if(F(void 0),X===0){J();return}let M=X-1,N=P2[M];U(M),K(q[N])});let B=(_)=>{let W=_.trim();if(z==="id"&&!a9.test(W)){F("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(z==="baseUrl")try{let N=new URL(W);if(!["http:","https:"].includes(N.protocol))throw Error()}catch{F("Base URL 必须是绝对 HTTP(S) URL");return}if(z==="model"&&!W){F("Model ID 不能为空");return}let M={...q,[z]:z==="name"&&!W?q.id:W};if(H(M),F(void 0),X===P2.length-1){try{Y(R5(M,$))}catch(N){F(N instanceof Error?N.message:"渠道配置无效")}return}U(X+1),K("")};return z1(b2,{flexDirection:"column",children:[z1(b2,{marginBottom:1,children:z1(J$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z1(J$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),P2.slice(0,X).map((_)=>z1(J$,{children:[r9(_),": ",z1(J$,{color:"cyan",children:q[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),z1(b2,{marginTop:1,children:[z1(J$,{bold:!0,children:[r9(z),": "]},void 0,!0,void 0,this),z1(P5,{value:G,onChange:(_)=>{K(_),F(void 0)},onSubmit:B,placeholder:y5(z,$,q.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z==="name"&&z1(J$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&z1(J$,{color:"red",children:O},void 0,!1,void 0,this),z1(b2,{marginTop:1,children:z1(J$,{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 s9,useState as r$}from"react";var e9=()=>{let[$,Q]=r$([]),[Y,J]=r$(!0),[Z,X]=r$(null);return s9(()=>{(async()=>{try{Q(await n9())}catch(G){X(G instanceof Error?G.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},$J=($)=>{let[Q,Y]=r$([]),[J,Z]=r$(!1),[X,U]=r$(null);return s9(()=>{if(!$){Y([]);return}(async()=>{Z(!0),U(null);try{Y(await t9($))}catch(K){U(K instanceof Error?K.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as x1,Text as R1,useInput as M5}from"ink";import C5 from"ink-select-input";import I5 from"ink-text-input";import{useMemo as QJ,useState as T5}from"react";import{jsxDEV as E0,Fragment as S5}from"react/jsx-dev-runtime";var v5=({isSelected:$})=>E0(x1,{marginRight:1,children:E0(R1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),f5=($)=>{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(" ")},k5=({isSelected:$,label:Q})=>E0(R1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),JJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[U,G]=T5("");M5((H,O)=>{if(O.escape)if(U)G("");else X()});let K=QJ(()=>{if(!U)return Q;let H=U.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(H)||O.id.toLowerCase().includes(H))},[Q,U]),q=QJ(()=>K.map((H)=>({key:H.id,label:f5(H),value:H})),[K]);if(Y)return E0(x1,{flexDirection:"column",children:E0(R1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return E0(x1,{flexDirection:"column",children:[E0(R1,{color:"red",children:J},void 0,!1,void 0,this),E0(R1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E0(x1,{flexDirection:"column",children:[E0(x1,{marginBottom:1,children:E0(R1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(x1,{marginBottom:1,children:E0(R1,{children:["Provider: ",E0(R1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E0(S5,{children:[E0(x1,{marginBottom:1,children:[E0(R1,{color:"cyan",children:"> "},void 0,!1,void 0,this),E0(I5,{value:U,onChange:G,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(x1,{marginBottom:1,children:E0(R1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(x1,{flexDirection:"column",height:12,children:E0(C5,{items:q,onSelect:(H)=>Z(H.value),indicatorComponent:v5,itemComponent:k5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&E0(R1,{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 P$,Text as Y$,useInput as D5}from"ink";import V5 from"ink-select-input";import j5 from"ink-text-input";import{useMemo as YJ,useState as h5}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var E5=({isSelected:$})=>n0(P$,{marginRight:1,children:n0(Y$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),g5=({isSelected:$,label:Q})=>n0(Y$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),ZJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,U]=h5("");D5((q,H)=>{if(H.escape)if(X)U("");else Z()});let G=YJ(()=>{if(!X)return $;let q=X.toLowerCase();return $.filter((H)=>H.name.toLowerCase().includes(q)||H.id.toLowerCase().includes(q))},[$,X]),K=YJ(()=>G.map((q)=>({key:q.id,label:`${q.name} - ${q.modelCount} models${q.configured?" [configured]":""}`,value:q})),[G]);if(Q)return n0(P$,{flexDirection:"column",children:n0(Y$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(P$,{flexDirection:"column",children:[n0(Y$,{color:"red",children:Y},void 0,!1,void 0,this),n0(Y$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(P$,{flexDirection:"column",children:[n0(P$,{marginBottom:1,children:n0(Y$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(P$,{marginBottom:1,children:[n0(Y$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(j5,{value:X,onChange:U,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(P$,{flexDirection:"column",height:12,children:n0(V5,{items:K,onSelect:(q)=>J(q.value),indicatorComponent:E5,itemComponent:g5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&n0(Y$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function XJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as Z$}from"react/jsx-dev-runtime";var rQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,U]=y$("provider"),[G,K]=y$(),[q,H]=y$(),[O,F]=y$(),[z,B]=y$(""),[_,W]=y$(),[M,N]=y$(!1),k=e9(),C=$J(G?.id),w=k0(!1);p5((T,R)=>{if(R.ctrl&&T==="c"||R.meta&&T==="c")$==="setup"?w():Z()});let v=lQ(async(T)=>{if(!G)return;let R=O??(q?{provider:G.id,model:q.id,displayName:Q?.displayName}:void 0);if(!R)return;N(!0),W(void 0);try{if(R.modelProvider)D1().registerModelProvider(R.provider,R.modelProvider,[R.model]);if(T?.trim())await D1().setApiKey(R.provider,T.trim());let L={displayName:R.displayName,provider:R.provider,model:R.model,overrides:R.overrides};if($==="setup")await J(R);else if($==="add"){let f=R.modelProvider?await m0().addModelWithProvider(L,R.modelProvider):await m0().addModel(L);await m0().setCurrentModel(f.id),await J(R)}else if(Y){if(R.modelProvider)await m0().updateModelWithProvider(Y,L,R.modelProvider);else await m0().updateModel(Y,L);await J(R)}}catch(L){if(R.modelProvider){await D1().credentials.delete(R.provider);let f=w2();D1().configureModelProviders(f?.modelProviders??{},f?.models??[])}W(L instanceof Error?L.message:"保存配置失败"),N(!1)}}),P=lQ((T)=>{if(H(T),G?.configured)v();else if(G?.supportsApiKey)U("credential");else W(`${G?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),A=lQ(()=>{if(W(void 0),X==="credential"&&O){U("custom");return}let T=XJ(X);if(T)U(T)});return Z$(m5,{flexDirection:"column",padding:1,children:[Z$(dQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&Z$(ZJ,{...k,onSelect:(T)=>{K(T),H(void 0),F(void 0),U(T.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&G?.factoryWireApi&&Z$(o9,{wireApi:G.factoryWireApi,initialConfig:O,onSubmit:(T)=>{F(T),U("credential")},onCancel:A},void 0,!1,void 0,this),X==="model"&&G&&Z$(JJ,{provider:G,...C,onSelect:P,onCancel:A},void 0,!1,void 0,this),X==="credential"&&G&&Z$(d9,{provider:G,value:z,onChange:B,onSubmit:()=>void v(z),onCancel:A,error:_},void 0,!1,void 0,this),M&&Z$(dQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&Z$(dQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as _8}from"ahooks";import{promises as qJ}from"fs";import{Box as _1,Text as V0,useInput as c5}from"ink";import UJ from"ink-select-input";import x5 from"ink-text-input";import u5 from"os";import y2 from"path";import{useEffect as l5,useMemo as R2,useRef as d5,useState as X$}from"react";import{jsxDEV as q0}from"react/jsx-dev-runtime";var N8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],r5={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},a5={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},GJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},i5=["project","global","local"],o5={allow:[],ask:[],deny:[]},n5={localExists:!1,projectExists:!1,globalExists:!1},KJ={allow:[],ask:[],deny:[]};function t5($){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 s5($){try{let Q=await qJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:t5(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...KJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...KJ}}}}function e5($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${GJ[Q]} <- 可删除`:GJ[Q];return`${Y} ${J}`}var OJ=({onClose:$})=>{let Y=$1()==="permissions-manager",J=k0(!1),[Z,X]=X$(0),U=N8[Z].key,[G,K]=X$(o5),[q,H]=X$(n5),[O,F]=X$(!0),[z,B]=X$("list"),[_,W]=X$(""),[M,N]=X$(null),[k,C]=X$(null),w=d5(!1),v=R2(()=>y2.join(u0(),".blade","settings.local.json"),[]),P=R2(()=>y2.join(u0(),".blade","settings.json"),[]),A=R2(()=>y2.join(u5.homedir(),".blade","settings.json"),[]),T=_8(async()=>{F(!0);let x=await Promise.all([{source:"local",path:v},{source:"project",path:P},{source:"global",path:A}].map(async({source:Z0,path:P0})=>{let B0=await s5(P0);return{source:Z0,path:P0,...B0}})),V={localExists:x.find((Z0)=>Z0.source==="local")?.exists??!1,projectExists:x.find((Z0)=>Z0.source==="project")?.exists??!1,globalExists:x.find((Z0)=>Z0.source==="global")?.exists??!1};H(V);let l={allow:[],ask:[],deny:[]},G0=Object.fromEntries(x.map((Z0)=>[Z0.source,Z0]));["allow","ask","deny"].forEach((Z0)=>{i5.forEach((P0)=>{(G0[P0]?.permissions[Z0]??[]).forEach((s0,c0)=>{let F1={key:`${P0}:${c0}:${s0}`,rule:s0,source:P0};l[Z0].push(F1)})})}),K(l),F(!1)});l5(()=>{T()},[T]);let R=_8(async(S,x)=>{try{let V=y2.join(u0(),".blade","settings.local.json"),l={allow:[],ask:[],deny:[]};try{let Z0=await qJ.readFile(V,"utf-8"),B0=JSON.parse(Z0).permissions||{};l={allow:Array.isArray(B0.allow)?B0.allow:[],ask:Array.isArray(B0.ask)?B0.ask:[],deny:Array.isArray(B0.deny)?B0.deny:[]}}catch(Z0){}let G0=x(l);await m0().updateConfig({permissions:G0},{scope:"local",immediate:!0}),await T()}catch(V){throw console.error("[PermissionsManager] 修改权限规则失败:",V),V}});c5((S,x)=>{if(x.ctrl&&S==="c"||x.meta&&S==="c"){J();return}if(z==="locked"){if(w.current){w.current=!1;return}B("list"),N(null),C(null);return}if(x.escape){if(z==="list"||U==="info")$();else B("list"),W(""),N(null),C(null);return}if(z==="list"){if(x.tab&&x.shift)X((V)=>(V-1+N8.length)%N8.length);else if(x.tab)X((V)=>(V+1)%N8.length);else if(S?.toLowerCase()==="q")$()}},{isActive:Y});let L=_8((S)=>{let x=S.value;if(U==="info")return;if(x.type==="add"){B("add"),W(""),C(null);return}if(x.entry.source!=="local"){B("locked"),w.current=!0,N({tab:U,entry:x.entry}),C({type:"error",text:x.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}B("confirm-delete"),N({tab:U,entry:x.entry}),C(null)}),f=_8(async()=>{if(U==="info")return;let S=_.trim();if(!S){C({type:"error",text:"Permission rule 不能为空"});return}if(G[U].map((V)=>V.rule).includes(S)){C({type:"error",text:"该规则已存在"});return}try{await R(U,(V)=>{let l={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return l[U]=[...new Set([...V[U],S])],l}),B("list"),W(""),C({type:"success",text:"已添加本地权限规则"})}catch(V){C({type:"error",text:`保存失败: ${V instanceof Error?V.message:"未知错误"}`})}}),E=_8(async()=>{if(!M)return;let{tab:S,entry:x}=M;try{await R(S,(V)=>{let l={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return l[S]=V[S].filter((G0)=>G0!==x.rule),l}),B("list"),N(null),C({type:"success",text:"已删除本地权限规则"})}catch(V){C({type:"error",text:`删除失败: ${V instanceof Error?V.message:"未知错误"}`})}}),t=R2(()=>{if(U==="info")return[];let S=U;return[{key:"add-new-rule",label:`› ${r5[S]}`,value:{type:"add"}},...G[S].map((V)=>({key:V.key,label:e5(V.rule,V.source),value:{type:"rule",entry:V}}))]},[U,G]),u=()=>q0(_1,{marginBottom:1,children:N8.map((S,x)=>q0(_1,{marginRight:2,children:q0(V0,{color:x===Z?"yellow":"gray",children:["[",S.label,"]"]},void 0,!0,void 0,this)},S.key,!1,void 0,this))},void 0,!1,void 0,this),a=()=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),q0(_1,{flexDirection:"column",marginLeft:2,children:[q0(V0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",q.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),q0(V0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",q.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),q0(V0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",q.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q0(V0,{children:"说明:"},void 0,!1,void 0,this),q0(_1,{flexDirection:"column",marginLeft:2,children:[q0(V0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),q0(V0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),q0(V0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),I=(S)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{bold:!0,children:a5[S]},void 0,!1,void 0,this),q0(V0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),q0(V0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),q0(_1,{marginTop:1,children:q0(x5,{value:_,onChange:W,onSubmit:f},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y=(S,x)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{bold:!0,children:["Delete ",S," permission rule?"]},void 0,!0,void 0,this),q0(V0,{children:x.rule},void 0,!1,void 0,this),q0(V0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),q0(V0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),q0(UJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(V)=>{if(V.value==="yes")E();else B("list"),N(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D=(S)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),q0(V0,{children:S.rule},void 0,!1,void 0,this),q0(V0,{color:"gray",children:S.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),q0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b=(S)=>q0(UJ,{items:t,isFocused:z==="list",onSelect:L},void 0,!1,void 0,this),h=()=>{if(O)return q0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(U==="info")return a();if(z==="add")return I(U);if(z==="confirm-delete"&&M)return y(M.tab,M.entry);if(z==="locked"&&M)return D(M.entry);return b(U)};return q0(_1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[q0(V0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),u(),q0(_1,{flexDirection:"column",gap:1,children:h()},void 0,!1,void 0,this),k&&q0(_1,{marginTop:1,children:q0(V0,{color:k.type==="success"?"green":"red",children:k.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(_1,{marginTop:1,children:q0(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 w0,Text as J0,useInput as $X}from"ink";import{useEffect as QX,useState as R$}from"react";import{jsxDEV as p}from"react/jsx-dev-runtime";var aQ=["local","project","global"];function LJ({workspaceRoot:$,onCancel:Q}){let Y=_J($),J=Y.getAll(),[Z,X]=R$(0),[U,G]=R$(!1),[K,q]=R$(""),[H,O]=R$(null),[F,z]=R$("local"),[B,_]=R$(null),[W,M]=R$(0),N=Y.getBySource(),k=Y.getStats(),C=Y.getSourcePolicy(),w=k0(!1,Q);QX(()=>{let L=!0;return zJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((f)=>{if(L)_(f.settings)}).catch((f)=>{if(L)q(f instanceof Error?f.message:"无法读取插件作用域配置")}),()=>{L=!1}},[Y,W]);let v=()=>{z((L)=>{let f=aQ.indexOf(L);return aQ[(f+1)%aQ.length]}),O(null)},P=async()=>{let L=J[Z];if(!L||U)return;if(L.source==="cli"){q(`${L.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(L.status==="error"){q(L.error??`${L.manifest.name} 当前不可用`);return}G(!0),q("");try{let f=await NJ(Y.getWorkspaceRoot(),L.manifest.name,L.status!=="active",F);q(f.effectiveEnabled?`已启用 ${L.manifest.name} · 生效层级 ${f.effectiveScope}`:`已禁用 ${L.manifest.name} · 生效层级 ${f.effectiveScope}`),M((E)=>E+1)}catch(f){q(f instanceof Error?f.message:String(f))}finally{G(!1)}},A=async()=>{if(U)return;G(!0),q("");try{await FJ(Y.getWorkspaceRoot()),X(0),q("插件列表已刷新"),M((L)=>L+1)}catch(L){q(L instanceof Error?L.message:String(L))}finally{G(!1)}},T=async()=>{let L=J[Z];if(!L||U)return;if(!L.installation){q(`${L.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}G(!0),O(null),q("");try{let{result:f}=await HJ(Y.getWorkspaceRoot(),L.manifest.name,{trusted:!0});if(!f.success)throw Error(f.error);q(f.changed?`已更新 ${L.manifest.name} 到 ${f.installation?.revision}`:`${L.manifest.name} 已是最新版本`),M((E)=>E+1)}catch(f){q(f instanceof Error?f.message:String(f))}finally{G(!1)}},R=async()=>{let L=J[Z];if(!L||U)return;if(!L.installation){q(`${L.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(H!==L.manifest.name){O(L.manifest.name),q(`再次按 x 确认卸载 ${L.manifest.name}`);return}G(!0),q("");try{let{result:f}=await WJ(Y.getWorkspaceRoot(),L.manifest.name,!0);if(!f.success)throw Error(f.error);O(null),X(0),q(`已卸载 ${L.manifest.name}`),M((E)=>E+1)}catch(f){q(f instanceof Error?f.message:String(f))}finally{G(!1)}};if($X((L,f)=>{if(f.escape)Q?.();else if(f.ctrl&&L==="c"||f.meta&&L==="c")w();else if((f.upArrow||L==="k")&&J.length>0)O(null),X((E)=>(E-1+J.length)%J.length);else if((f.downArrow||L==="j")&&J.length>0)O(null),X((E)=>(E+1)%J.length);else if(L===" "||f.return)P();else if(L==="r")A();else if(L==="s")v();else if(L==="u")T();else if(L==="x")R()}),J.length===0)return p(w0,{flexDirection:"column",paddingY:1,children:[p(w0,{marginBottom:1,children:p(J0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[p(J0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{marginTop:1,paddingLeft:2,children:p(J0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{marginTop:1,children:p(J0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return p(w0,{flexDirection:"column",paddingY:1,children:[p(w0,{marginBottom:1,children:[p(J0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),p(J0,{color:"gray",children:[" (共 ",k.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,marginBottom:1,children:p(J0,{color:"gray",children:["启用: ",k.active," | 禁用: ",k.inactive," | 命令: ",k.commands," | 技能:"," ",k.skills," | 代理: ",k.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,marginBottom:1,children:p(J0,{color:"gray",children:["来源策略: ",C.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",C.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,marginBottom:1,children:p(J0,{color:"gray",children:["写入层级: ",p(J0,{color:"cyan",children:F},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),N.cli.length>0&&p(w0,{flexDirection:"column",marginBottom:1,children:[p(w0,{paddingLeft:1,children:[p(J0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),p(J0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.cli.map((L)=>{let f=L.status==="active"?"[on]":"[off]",E=J.indexOf(L)===Z;return p(w0,{flexDirection:"column",paddingLeft:2,children:[p(J0,{children:[p(J0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),p(J0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&p(w0,{paddingLeft:2,children:p(J0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.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&&p(w0,{flexDirection:"column",marginBottom:1,children:[p(w0,{paddingLeft:1,children:[p(J0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),p(J0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.project.map((L)=>{let f=L.status==="active"?"[on]":"[off]",E=J.indexOf(L)===Z;return p(w0,{flexDirection:"column",paddingLeft:2,children:[p(J0,{children:[p(J0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),p(J0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&p(w0,{paddingLeft:2,children:p(J0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.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&&p(w0,{flexDirection:"column",marginBottom:1,children:[p(w0,{paddingLeft:1,children:[p(J0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),p(J0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.user.map((L)=>{let f=L.status==="active"?"[on]":"[off]",E=J.indexOf(L)===Z;return p(w0,{flexDirection:"column",paddingLeft:2,children:[p(J0,{children:[p(J0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),p(J0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&p(w0,{paddingLeft:2,children:p(J0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.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),p(w0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[p(J0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{marginTop:1,children:p(J0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&p(w0,{marginTop:1,children:p(J0,{color:K.includes("失败")?"red":"cyan",children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&p(J0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as Y1,Text as Z1,useInput as BJ,useStdout as JX}from"ink";import YX from"ink-text-input";import iQ,{useCallback as F8,useMemo as ZX,useState as U$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var XX=iQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>W0(Y1,{flexDirection:"column",marginBottom:1,children:[W0(Z1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),W0(Y1,{marginLeft:4,children:W0(Z1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),UX=iQ.memo(({questions:$,answers:Q})=>W0(Y1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return W0(Y1,{marginBottom:1,children:[W0(Z1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),W0(Z1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),wJ=iQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=JX(),Z=J.columns||80,U=$1()==="confirmation-prompt",G=k0(!1),[K,q]=U$("answering"),[H,O]=U$(0),[F,z]=U$({}),[B,_]=U$(0),[W,M]=U$([]),[N,k]=U$(!1),[C,w]=U$(""),[v,P]=U$(0),A=$[H],T=ZX(()=>{if(!A)return[];return[...A.options.map((u)=>({label:u.label,value:u.label,description:u.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[A]),R=F8((u)=>{let a={...F,[A.header]:u};if(z(a),H<$.length-1)O(H+1),_(0),M([]),k(!1),w("");else q("submit"),P(0)},[F,A?.header,H,$.length]),L=F8((u)=>{let a=T[u];if(!a)return;if(a.value==="__other__"){k(!0);return}if(A.multiSelect)M((I)=>I.includes(a.value)?I.filter((y)=>y!==a.value):[...I,a.value]);else R(a.value)},[T,A?.multiSelect,R]),f=F8((u)=>{if(u.trim())R(u.trim())},[R]),E=F8(()=>{q("answering"),O(0),_(0),M([]),k(!1)},[]),t=F8(()=>{Q(F)},[F,Q]);if(BJ((u,a)=>{if(a.ctrl&&u==="c"||a.meta&&u==="c"){G();return}if(N){if(a.escape)k(!1),w("");return}if(a.escape){Y();return}let I=parseInt(u);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&&W.length>0)R(W);else L(B);return}if(u===" "&&A.multiSelect){let y=T[B];if(y&&y.value!=="__other__")M((D)=>D.includes(y.value)?D.filter((b)=>b!==y.value):[...D,y.value]);return}},{isActive:U&&K==="answering"&&!N}),BJ((u,a)=>{if(a.ctrl&&u==="c"||a.meta&&u==="c"){G();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){P((I)=>I===0?1:0);return}if(a.return){if(v===0)t();else E();return}if(u.toLowerCase()==="y"){t();return}if(u.toLowerCase()==="e"){E();return}},{isActive:U&&K==="submit"}),K==="submit")return W0(Y1,{flexDirection:"column",borderStyle:"round",borderColor:U?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(Y1,{marginBottom:1,children:W0(Z1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W0(UX,{questions:$,answers:F},void 0,!1,void 0,this),W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:v===0?"yellow":void 0,bold:v===0,children:[v===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Z1,{color:v===1?"yellow":void 0,bold:v===1,children:[v===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(Y1,{marginTop:1,children:W0(Z1,{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(Y1,{flexDirection:"column",borderStyle:"round",borderColor:U?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(Y1,{marginBottom:1,children:[W0(Z1,{backgroundColor:"blue",color:"white",children:[" ",A.header," "]},void 0,!0,void 0,this),W0(Z1,{children:[" ",A.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N?W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),W0(Y1,{marginTop:1,children:[W0(Z1,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0(YX,{value:C,onChange:w,onSubmit:f,focus:U},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(Y1,{marginTop:1,children:W0(Z1,{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(Y1,{flexDirection:"column",children:T.map((u,a)=>W0(XX,{option:u,index:a,isSelected:W.includes(u.value),isMultiSelect:A.multiSelect,isHighlighted:B===a},u.value,!1,void 0,this))},void 0,!1,void 0,this),!N&&W0(Y1,{marginTop:1,flexDirection:"column",children:[W0(Z1,{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&&W.length>0&&W0(Z1,{color:"green",children:["Selected: ",W.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&W0(Y1,{marginTop:1,children:W0(Z1,{color:"gray",children:["Question ",H+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as GX}from"node:path";import{Box as i$,Text as w1,useInput as KX}from"ink";import qX from"ink-select-input";import{useEffect as oQ,useMemo as a$,useRef as MJ,useState as M2}from"react";function bJ($){return`${$.projectPath}\x00${$.sessionId}`}function AJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function PJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function yJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function RJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as l0}from"react/jsx-dev-runtime";function OX($){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 zX($){return GX($)}function _X($){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 NX=({isSelected:$})=>l0(i$,{marginRight:1,children:l0(w1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),FX=({isSelected:$,label:Q})=>l0(w1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),H8=20,CJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=M2([]),[U,G]=M2(!1),[K,q]=M2(0),[H,O]=M2(!1),F=MJ(!1),z=MJ(!0);oQ(()=>{return z.current=!0,()=>{z.current=!1}},[]);let _=$1()==="session-selector",W=k0(!1);KX((A,T)=>{if(T.ctrl&&A==="c"||T.meta&&A==="c"){W();return}if(F.current)return;if(T.escape&&J){J();return}if(T.leftArrow||A==="h"||A==="H"){if(K>0)q((R)=>R-1);return}if(T.rightArrow||A==="l"||A==="L"){if(K<C-1)q((R)=>R+1);return}},{isActive:_}),oQ(()=>{if(Q){X(Q);return}(async()=>{G(!0);try{let T=await M0.listSessions({includeSubagents:!1});X(T)}catch(T){console.error("[SessionSelector] Failed to load sessions:",T),X([])}finally{G(!1)}})()},[Q]);let M=a$(()=>yJ(Q||Z,$),[$,Q,Z]),N=a$(()=>RJ($),[$]),k=a$(()=>{return M.map((A)=>{let T=zX(A.taskSourceProjectPath??A.projectPath),R=OX(A.lastMessageTime),L=AJ(A),f=`[${_X(A.taskStatus)}]`,E=A.gitBranch?` (${A.gitBranch})`:"",t=A.hasErrors?" [!]":"",u=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}`:"",D=PJ(A);return{key:bJ(A),label:`${f} ${L} · ${R} | ${T}${E} | ${A.messageCount} 条消息${a}${y}${I}${D}${t}${u}`,value:A}})},[M]),C=a$(()=>Math.max(1,Math.ceil(k.length/H8)),[k.length]),w=a$(()=>{let A=K*H8;return k.slice(A,A+H8)},[k,K]),v=a$(()=>({start:K*H8+1,end:Math.min((K+1)*H8,k.length)}),[K,k.length]);oQ(()=>{q(0)},[M.length]);let P=(A)=>{if(F.current)return;F.current=!0,O(!0);let T=()=>{if(!z.current)return;F.current=!1,O(!1)};Promise.resolve().then(()=>Y(A.value)).then(T,T)};if(U)return l0(i$,{flexDirection:"column",paddingX:2,paddingY:1,children:l0(w1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(M.length===0)return l0(i$,{flexDirection:"column",paddingX:2,paddingY:1,children:[l0(w1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),l0(w1,{dimColor:!0,children:[`
|
|
136
|
+
`)},void 0,!1,void 0,this)}return PQ(AQ,{color:J.colors.text.primary,children:U.join(`
|
|
137
|
+
`)},void 0,!1,void 0,this)});import{jsxDEV as g}from"react/jsx-dev-runtime";var i3=($,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:" "}}},o3=W$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=A0();if(J&&Z!==void 0){let G=$.split(`
|
|
138
|
+
`),K=4,q=Math.max(1,Z-4);if(G.length>q){let U=G.slice(0,q).join(`
|
|
139
|
+
`);return g(z0,{flexDirection:"column",flexShrink:0,children:[g(Z2,{content:U,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),g(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 g(Z2,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),n3=W$.memo(({content:$,level:Q})=>{let Y=A0();switch(Q){case 1:return g(b0,{bold:!0,color:Y.colors.primary,children:g(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return g(b0,{bold:!0,color:Y.colors.primary,children:g(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return g(b0,{bold:!0,color:Y.colors.text.primary,children:g(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return g(b0,{italic:!0,color:Y.colors.text.muted,children:g(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return g(b0,{children:g(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),t3=W$.memo(({terminalWidth:$})=>{let Q=A0(),Y=Math.max(0,Math.min($-4,80));return g(b0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),s3=W$.memo(({content:$})=>{return g(b0,{wrap:"wrap",children:g(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),e3=W$.memo(({content:$})=>{let Q=A0();return g(z0,{flexDirection:"row",gap:1,children:[g(b0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),g(b0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),$Z=W$.memo(({detail:$,terminalWidth:Q})=>{let Y=A0(),J=50,Z=$.split(`
|
|
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,G=X?Z.slice(0,50):Z,K=G.join(`
|
|
141
|
+
`),q=K.includes("<<<DIFF>>>"),U=K.includes("```");if(q){let H=K.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(H)try{let z=JSON.parse(H[1]);return g(z0,{flexDirection:"column",children:[g(BQ,{patch:z.patch,startLine:z.startLine,matchLine:z.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&g(z0,{marginTop:1,children:g(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 H=K.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(H){let z=H[1]||"text",F=H[2];return g(z0,{flexDirection:"column",children:[g(Z2,{content:F,language:z,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&g(z0,{marginTop:1,children:g(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 g(z0,{flexDirection:"column",children:[G.map((H,z)=>g(b0,{color:Y.colors.text.primary,children:H},z,!1,void 0,this)),X&&g(z0,{marginTop:1,children:g(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 QZ($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),G=Math.max(40,J*0.8),K=X*G;if($.length<=K)return{content:$,isTruncated:!1,hiddenLines:0};let q=Math.floor(K*0.9),U=$.length-q,H=U,z=$.indexOf(`
|
|
142
|
+
`,U);if(z!==-1&&z-U<G)H=z+1;let F=$.slice(H),B=($.slice(0,H).match(/\n/g)||[]).length+1;return{content:F,isTruncated:!0,hiddenLines:B}}var s1=W$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:G=!1,noMargin:K=!1,renderPlainTextOnly:q=!1,streamingLines:U,streamingHiddenLines:H,messageId:z,blocksOverride:F,currentLineOverride:O,streamingMode:B="text",renderCodeBlocksAsPlainText:_=!1})=>{let W=A0(),M=F!==void 0,N=H$(()=>i3(Q,W.colors,J),[Q,W.colors,J]),{color:k,prefix:C}=N,w=C.length+1,v=H$(()=>{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=!K&&!P,T=H$(()=>{if(!q)return[];return $.split(/\r?\n/)},[$,q]);if(!M&&Z){let b=U??$.split(/\r?\n/),h=H??0,S=!1,x=!1,V=!1;if(B!=="text")S=B==="code",x=B==="diff",V=B==="table";return g(z0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[h>0&&g(z0,{flexDirection:"row",flexShrink:0,children:[g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(b0,{color:W.colors.text.muted,dimColor:!0,children:["^ ",h," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b.map((l,K0)=>{if(B==="text"){if(l.match(t1.codeBlock))S=!S;else if(l.match(t1.diffStart))x=!0;else if(l.match(t1.diffEnd))x=!1;else if(l.match(t1.table))V=!0;else if(V&&!l.match(t1.table))V=!1}let Z0=B==="text"&&!S&&!x&&!V,P0=Z0?l.match(t1.ulItem):null,B0=Z0?l.match(t1.olItem):null,s0=P0??B0;return g(z0,{flexDirection:"row",flexShrink:0,children:[K0===0&&!G?g(z0,{marginRight:1,flexShrink:0,children:g(b0,{color:k,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:s0?g(bQ,{type:P0?"ul":"ol",marker:s0[2],itemText:s0[3],leadingWhitespace:s0[1]},void 0,!1,void 0,this):g(b0,{wrap:"wrap",children:l===""?" ":l},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!M&&q)return g(z0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:T.map((b,h)=>g(z0,{flexDirection:"row",flexShrink:0,children:[h===0&&!G?g(z0,{marginRight:1,flexShrink:0,children:g(b0,{color:k,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:g(b0,{wrap:"wrap",children:b===""?" ":b},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},h,!0,void 0,this))},void 0,!1,void 0,this);let R=r6(null);yQ(()=>{R.current=null},[z]);let L=H$(()=>{if(M)return null;if(!z)return null;return a6(z)},[z,M]);yQ(()=>{if(M)return;if(!L||!z)return;R.current={messageId:z,blocks:L}},[L,z,M]),yQ(()=>{if(M)return;if(!L||!z)return;i6(z)},[L,z,M]);let f=H$(()=>M?{content:$,isTruncated:!1,hiddenLines:0}:QZ($,X,Z,Y),[$,X,Z,Y,M]),{content:E,isTruncated:t,hiddenLines:u}=f;if(!M&&Q==="tool"&&J&&"detail"in J){let b=J;if(b.detail)return g(z0,{flexDirection:"column",marginBottom:K?0:1,children:[g(z0,{flexDirection:"row",children:[g(z0,{marginRight:1,children:g(b0,{color:k,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{color:k,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(z0,{marginLeft:C.length+1,children:g($Z,{detail:b.detail,terminalWidth:Y-(C.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:a,currentLine:I}=H$(()=>{if(M)return{completedContent:"",currentLine:O??""};if(!Z)return{completedContent:E,currentLine:""};let b=E.lastIndexOf(`
|
|
143
|
+
`);if(b===-1)return{completedContent:"",currentLine:E};return{completedContent:E.slice(0,b+1),currentLine:E.slice(b+1)}},[E,Z,M,O]),y=r6({content:"",blocks:[]}),D=H$(()=>{if(M)return F??[];if(L)return L;if(R.current&&R.current.messageId===z)return R.current.blocks;let b=y.current;if(!Z||!a.startsWith(b.content)){let V=RQ(a);return y.current={content:a,blocks:V},V}if(a===b.content)return b.blocks;let h=a.slice(b.content.length),S=RQ(h),x=[...b.blocks,...S];return y.current={content:a,blocks:x},x},[a,Z,M,F]);return g(z0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[t&&g(z0,{flexDirection:"row",flexShrink:0,children:[g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(b0,{color:W.colors.text.muted,dimColor:!0,children:["^ ",u," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D.map((b,h)=>{if(b.type==="empty")return g(z0,{height:1,flexShrink:0},h,!1,void 0,this);return g(z0,{flexDirection:"row",flexShrink:0,children:[h===0&&!G&&g(z0,{marginRight:1,flexShrink:0,children:g(b0,{color:k,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),(h>0||G)&&g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:b.type==="code"?_?g(b0,{wrap:"wrap",children:b.content},void 0,!1,void 0,this):g(o3,{content:b.content,language:b.language,terminalWidth:Y-w,isPending:Z,availableHeight:X},void 0,!1,void 0,this):b.type==="table"&&b.tableData?g(d6,{headers:b.tableData.headers,rows:b.tableData.rows,terminalWidth:Y-w},void 0,!1,void 0,this):b.type==="heading"?g(n3,{content:b.content,level:b.level||1},void 0,!1,void 0,this):b.type==="list"?g(bQ,{type:b.listType||"ul",marker:b.marker||"-",itemText:b.content,leadingWhitespace:" ".repeat(b.indentation||0)},void 0,!1,void 0,this):b.type==="hr"?g(t3,{terminalWidth:Y-w},void 0,!1,void 0,this):b.type==="diff"&&b.diffData?g(BQ,{patch:b.diffData.patch,startLine:b.diffData.startLine,matchLine:b.diffData.matchLine,terminalWidth:Y-w},void 0,!1,void 0,this):b.type==="command-message"?g(e3,{content:b.content},void 0,!1,void 0,this):b.type==="blockquote"&&b.blockquoteLines?g(V6,{lines:b.blockquoteLines,level:b.blockquoteLevel||1},void 0,!1,void 0,this):g(s3,{content:b.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},h,!0,void 0,this)}),I&&g(z0,{flexDirection:"row",flexShrink:0,children:[D.length===0&&!G?g(z0,{marginRight:1,flexShrink:0,children:g(b0,{color:k,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:g(b0,{wrap:"wrap",children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v&&g(z0,{flexDirection:"row",flexShrink:0,children:[g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[g(b0,{color:W.colors.text.muted,children:["Subtask"," ",typeof v.agentType==="string"?`@${v.agentType}`:"",typeof v.status==="string"?` · ${v.status}`:""]},void 0,!0,void 0,this),typeof v.summary==="string"&&v.summary.trim()!==""&&g(b0,{wrap:"wrap",children:v.summary},void 0,!1,void 0,this),typeof v.childSessionId==="string"&&g(b0,{color:W.colors.text.muted,children:["Session ",v.childSessionId]},void 0,!0,void 0,this),typeof v.resumedFrom==="string"&&g(b0,{color:W.colors.text.muted,children:["Resumed from ",v.resumedFrom,typeof v.resumeDepth==="number"?` · depth ${v.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 qZ}from"react/jsx-dev-runtime";var XZ=MQ.memo(({label:$,isSelected:Q})=>I0(T1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),GZ=MQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(qZ,{children:[I0(W1,{marginBottom:1,children:I0(T1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&I0(W1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[I0(T1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(W1,{marginTop:1,children:I0(s1,{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(W1,{flexDirection:"column",marginBottom:1,children:I0(s1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&I0(W1,{flexDirection:"column",marginBottom:1,children:[I0(T1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,G)=>I0(W1,{marginLeft:2,children:I0(T1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},G,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&I0(W1,{flexDirection:"column",marginBottom:1,children:[I0(T1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,G)=>I0(W1,{marginLeft:2,children:I0(T1,{children:["• ",X]},void 0,!0,void 0,this)},G,!1,void 0,this)),$.affectedFiles.length>3&&I0(W1,{marginLeft:2,children:I0(T1,{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 KZ($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var n6=MQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=YZ(),J=Y.columns||80,X=$1()==="confirmation-prompt",G=k0(!1),K=$.type==="exitPlanMode",q=$.type==="enterPlanMode",U=$.type==="maxTurnsExceeded",H=$.type==="mcpSampling";JZ((O,B)=>{if(B.ctrl&&O==="c"||B.meta&&O==="c"){G();return}if(B.escape){Q({approved:!1,reason:"用户取消"});return}let _=O.toLowerCase();if(K){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(q){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(H){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 z=o6(()=>{if(K)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(q)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(H)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:"用户拒绝"}}]},[K,q,U,H]),F=o6(()=>{if(K)return{color:"cyan",title:"方案审核"};if(q)return{color:"magenta",title:"进入规划模式"};if(U)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[K,q,U,$.title]);return I0(W1,{flexDirection:"column",borderStyle:"round",borderColor:X?F.color:"gray",padding:1,children:[I0(W1,{marginBottom:1,children:I0(T1,{bold:!0,color:F.color,children:F.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(GZ,{details:$,headerColor:F.color,isPlanModeExit:K,isPlanModeEnter:q,terminalWidth:J},void 0,!1,void 0,this),I0(W1,{flexDirection:"column",children:[I0(T1,{color:"gray",children:KZ(K,q,U,H)},void 0,!1,void 0,this),I0(ZZ,{items:z,isFocused:X,itemComponent:XZ,onSelect:(O)=>{Q(O.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 X0,useInput as UZ}from"ink";import t6 from"ink-text-input";import{useState as E1}from"react";import{jsxDEV as m}from"react/jsx-dev-runtime";var U8=[{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"}],X2=[{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"}],G2=[{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"}],zZ=[`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"],s6=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=d0.getTheme(),[X,G]=E1("action"),[K,q]=E1(0),[U,H]=E1(0),[z,F]=E1(0),[O,B]=E1(""),[_,W]=E1(""),[M,N]=E1(null),[k,C]=E1(!1),[w,v]=E1(null),P=U8[K],A=G2[U],T=X2[z],R=()=>{if(w){v(null);return}switch(X){case"action":Y();break;case"event":G("action");break;case"matcher":G("event");break;case"command":G("matcher");break;case"location":G("command");break;case"confirm":G("location");break}};UZ((D,b)=>{if(b.escape){R();return}if(X==="action"){if(b.upArrow)q((h)=>h>0?h-1:U8.length-1);else if(b.downArrow)q((h)=>h<U8.length-1?h+1:0);else if(b.return)L()}else if(X==="event"){if(b.upArrow)H((h)=>h>0?h-1:G2.length-1);else if(b.downArrow)H((h)=>h<G2.length-1?h+1:0);else if(b.return)G("matcher")}else if(X==="location"){if(b.upArrow)F((h)=>h>0?h-1:X2.length-1);else if(b.downArrow)F((h)=>h<X2.length-1?h+1:0);else if(b.return)G("confirm")}else if(X==="confirm"){if(b.return)y()}});let L=()=>{let D=U8[K].action;if(D==="add")G("event");else if(D==="status")f();else if(D==="list")u();else if(D==="enable")U1.getInstance().enableSession(Q,$),v("Hooks enabled for this session");else if(D==="disable")U1.getInstance().disableSession(Q,$),v("Hooks disabled for this session");else if(D==="trust")E();else if(D==="revoke")t()},f=async()=>{let D=U1.getInstance(),b=D.isEnabled($,Q),h=D.getConfig($),S=await D.getTrustStatus($),x={};for(let l of Object.values(IQ)){let K0=h[l];if(K0&&Array.isArray(K0)){let Z0=K0.reduce((P0,B0)=>P0+(B0.hooks?.length||0),0);if(Z0>0)x[l]=Z0}}let V=[`Status: ${b?"Enabled":"Disabled"}`,`Trust: ${S.state}`,`Digest: ${S.currentDigest??"none"}`,""];if(Object.keys(x).length>0){V.push("Configured hooks:");for(let[l,K0]of Object.entries(x))V.push(` ${l}: ${K0} hook(s)`)}else V.push("No hooks configured");v(V.join(`
|
|
144
|
+
`))},E=async()=>{try{let D=await U1.getInstance().trustProject($);v(`Trust: ${D.state}
|
|
145
|
+
Digest: ${D.currentDigest??"none"}`)}catch(D){N(D instanceof Error?D.message:"Failed to trust hooks")}},t=async()=>{try{let D=await U1.getInstance().revokeProjectTrust($);v(`Trust: ${D.state}`)}catch(D){N(D instanceof Error?D.message:"Failed to revoke hook trust")}},u=()=>{let b=U1.getInstance().getConfig($),h=[],S=!1;for(let x of Object.values(IQ)){let V=b[x];if(!V||!Array.isArray(V)||V.length===0)continue;S=!0,h.push(`${x}:`);for(let l of V){let K0=l.matcher,Z0="all";if(K0?.tools)Z0=`tools: ${Array.isArray(K0.tools)?K0.tools.join(", "):K0.tools}`;h.push(` [${Z0}]`);for(let P0 of l.hooks||[])if(P0.type==="command")h.push(` -> ${P0.command}`)}h.push("")}if(!S)h.push("No hooks configured"),h.push(""),h.push("Configure hooks in .blade/settings.local.json");v(h.join(`
|
|
146
|
+
`))},a=()=>{G("command")},I=()=>{if(!_.trim()){N("Command cannot be empty");return}N(null),G("location")},y=async()=>{C(!0),N(null);try{let D=U1.getInstance(),b=await import("node:fs/promises"),h=await import("node:path"),S=await import("node:os"),x={matcher:O.trim()?{tools:O.trim()}:{},hooks:[{type:"command",command:_.trim()}]},V;switch(T.location){case"local":V=h.join($,".blade","settings.local.json");break;case"project":V=h.join($,".blade","settings.json");break;case"user":V=h.join(S.homedir(),".blade","settings.json");break}await b.mkdir(h.dirname(V),{recursive:!0});let l={};try{let B0=await b.readFile(V,"utf-8");l=JSON.parse(B0)}catch{}let K0=l.hooks||{},Z0=K0[A.event]||[],P0={...K0,enabled:!0,[A.event]:[...Z0,x]};if(l.hooks=P0,await b.writeFile(V,JSON.stringify(l,null,2),"utf-8"),await D.reloadConfig($),J)J({event:A.event,matcher:O.trim(),command:_.trim()});Y()}catch(D){N(`Failed to save hook: ${D instanceof Error?D.message:"Unknown error"}`),C(!1)}};return m(L0,{flexDirection:"column",padding:1,children:[m(L0,{marginBottom:1,children:m(X0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(L0,{marginBottom:1,children:m(X0,{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),w&&m(L0,{flexDirection:"column",marginBottom:1,children:[m(X0,{children:w},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(X0,{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"&&!w&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",marginTop:1,children:U8.map((D,b)=>m(L0,{children:[m(X0,{color:b===K?Z.colors.primary:void 0,bold:b===K,children:[b===K?"> ":" ",D.action]},void 0,!0,void 0,this),m(X0,{color:Z.colors.muted,children:[" - ",D.description]},void 0,!0,void 0,this)]},D.action,!0,void 0,this))},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(X0,{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"&&m(L0,{flexDirection:"column",children:[m(X0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),m(L0,{flexDirection:"column",marginTop:1,children:G2.map((D,b)=>m(L0,{children:[m(X0,{color:b===U?Z.colors.primary:void 0,bold:b===U,children:[b===U?"> ":" ",D.event]},void 0,!0,void 0,this),m(X0,{color:Z.colors.muted,children:[" - ",D.description]},void 0,!0,void 0,this)]},D.event,!0,void 0,this))},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(X0,{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"&&m(L0,{marginBottom:1,children:m(X0,{children:["Event:"," ",m(X0,{bold:!0,color:Z.colors.primary,children:A.event},void 0,!1,void 0,this),m(X0,{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")&&m(L0,{flexDirection:"column",marginBottom:1,children:[m(X0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),m(X0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),m(X0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),m(X0,{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"&&m(L0,{flexDirection:"column",children:[m(L0,{children:[m(X0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),m(t6,{value:O,onChange:B,onSubmit:a,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),m(L0,{marginTop:1,children:m(X0,{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),m(L0,{marginTop:1,children:m(X0,{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")&&m(L0,{marginBottom:1,children:m(X0,{children:["Matcher: ",m(X0,{bold:!0,children:O||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X==="command"&&m(L0,{flexDirection:"column",children:[m(L0,{children:m(X0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(L0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:m(t6,{value:_,onChange:W,onSubmit:I,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(L0,{flexDirection:"column",marginTop:1,children:[m(X0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),zZ.map((D,b)=>m(X0,{color:Z.colors.muted,children:["• ",D]},b,!0,void 0,this))]},void 0,!0,void 0,this),m(L0,{marginTop:1,children:m(X0,{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"&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[m(X0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),m(X0,{children:" "},void 0,!1,void 0,this),m(X0,{children:[" ","Event: ",A.event," - ",A.description]},void 0,!0,void 0,this),m(X0,{children:[" Matcher: ",O||"(all)"]},void 0,!0,void 0,this),m(X0,{children:[" Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),m(X0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),m(L0,{flexDirection:"column",marginTop:1,children:X2.map((D,b)=>m(L0,{children:[m(X0,{color:b===z?Z.colors.primary:void 0,bold:b===z,children:[b===z?"> ":" ",b+1,". ",D.name]},void 0,!0,void 0,this),m(X0,{color:Z.colors.muted,children:[" ",D.description]},void 0,!0,void 0,this)]},D.location,!0,void 0,this))},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(X0,{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"&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[m(X0,{bold:!0,children:["Saving hook to ",T.description,"..."]},void 0,!0,void 0,this),m(X0,{children:" "},void 0,!1,void 0,this),m(X0,{children:["Event: ",A.event]},void 0,!0,void 0,this),m(X0,{children:["Matcher: ",O||"(all tools)"]},void 0,!0,void 0,this),m(X0,{children:["Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),m(L0,{marginTop:1,children:m(X0,{color:Z.colors.muted,children:k?"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),M&&m(L0,{marginTop:1,children:m(X0,{color:Z.colors.error,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as W9}from"ahooks";import{Box as IZ,Text as TZ}from"ink";import vZ from"react";import{useMemoizedFn as q2}from"ahooks";import B$ from"chalk";import{Text as PZ,useInput as yZ}from"ink";import{useEffect as N9,useRef as U2}from"react";var K2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var L$="\x1B",OZ=`${L$}[200~`,_Z=`${L$}[201~`,NZ="[200~",FZ="[201~",HZ=[`${L$}[I`,`${L$}[O`,"[I","[O"],Q9=`${L$}[?2004h`,J9=`${L$}[?2004l`,vQ=`${L$}[?1004l`,WZ=[OZ,NZ],LZ=[_Z,FZ];function Y9(){return{pasteBuffer:null,pasteOverflowed:!1}}function e6($,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 $9($){return HZ.some((Q)=>$===Q)}function Z9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,G=[];while(Y.length>0){if(J!==null){let U=e6(Y,LZ);if(!U){if(J.length+Y.length>TQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+U.index>TQ)Z=!0;else if(!Z)J+=Y.slice(0,U.index),G.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(U.index+U.marker.length);continue}let K=e6(Y,WZ);if(!K){if($9(Y))X=!0;else G.push({kind:"text",text:Y});Y="";break}let q=Y.slice(0,K.index);if(q&&!$9(q))G.push({kind:"text",text:q});J="",Z=!1,X=!0,Y=Y.slice(K.index+K.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:G}}import{execSync as l$}from"node:child_process";import{existsSync as BZ,readFileSync as fQ}from"node:fs";import{basename as X9,isAbsolute as wZ}from"node:path";function G9($){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 K9(){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 bZ(){let{commands:$}=K9();try{return l$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function q9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function U9($){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=q9($.trim()),Y=U9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function AZ($){let Q=q9($.trim()),Y=U9(Q);if(kQ(Y))return Y;return null}async function z9($){let Q=AZ($);if(!Q)return null;let Y;try{if(wZ(Q))Y=fQ(Q);else{let G=bZ();if(G&&Q===X9(G))Y=fQ(G);else return null}}catch(G){return console.error("Failed to read image file:",G),null}let J=Y.toString("base64"),Z=G9(J),X=X9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function O9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return l$(Y,{encoding:"utf-8"})||null}catch{return null}}async function _9(){let{commands:$,screenshotPath:Q}=K9();try{if(l$($.checkImage,{stdio:"ignore"}),l$($.saveImage(Q),{stdio:"ignore"}),!BZ(Q))return null;let J=fQ(Q).toString("base64"),Z=G9(J);return l$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{l$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as CZ}from"react/jsx-dev-runtime";var RZ=/\r\n/g,MZ=/\r/g;function SQ($){if(!$.includes("\r"))return $;return $.replace(RZ,`
|
|
147
|
+
`).replace(MZ,`
|
|
148
|
+
`)}function F9($,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 H9({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:G,onImagePaste:K,disabledKeys:q=[]}){let U=U2(Y9()),H=U2($),z=U2(Z),F=U2(null);N9(()=>{H.current=$,z.current=Z},[$,Z]),N9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let O=q2((C,w)=>{let v=H.current,P=z.current;if(H.current=C,z.current=w,C!==v)J(C);if(w!==P)X(w)}),B=q2((C)=>{if(!C)return;let{newValue:w,newCursorPosition:v}=F9(SQ(C),H.current,z.current);O(w,v)}),_=q2(async(C)=>{let w=SQ(C);if(!w)return;if(K&&kQ(w))try{let P=await z9(w);if(P){let A=await K(P.base64,P.mediaType,P.filename);if(A?.prompt)B(A.prompt);return}}catch(P){console.error("Failed to process image path:",P)}if((w.length>K2.LARGE_INPUT_THRESHOLD||w.includes(`
|
|
149
|
+
`))&&G){let P=await G(w);if(P?.prompt){B(P.prompt);return}}B(w)}),W=q2((C)=>{let w=F.current;if(!w){try{let P=C();if(!P)return;let A=P.catch(()=>{return});F.current=A,A.finally(()=>{if(F.current===A)F.current=null})}catch{}return}let v=w.then(C).then(()=>{return}).catch(()=>{return});F.current=v,v.finally(()=>{if(F.current===v)F.current=null})});yZ((C,w)=>{W(()=>{let v=SQ(C),P=Z9(U.current,v);if(U.current=P.state,P.handled)return(async()=>{for(let E of P.segments)if(E.kind==="paste")await _(E.text);else B(E.text)})();if(q.some((E)=>w[E])||w.ctrl&&C==="c"||w.ctrl&&C==="l"||w.ctrl&&C==="t"||w.ctrl&&C==="o"||w.meta&&C==="l"||w.meta&&C==="t"||w.meta&&C==="o"||w.shift&&w.tab||v==="?"&&H.current==="")return;let T=H.current,R=z.current,L=R,f=T;if(w.leftArrow)L--;else if(w.rightArrow)L++;else if(w.backspace||w.delete){if(C===""){if(R>0)f=T.slice(0,R-1)+T.slice(R,T.length),L--}else if(R<T.length)f=T.slice(0,R)+T.slice(R+1,T.length)}else if(w.ctrl&&v==="a")L=0;else if(w.ctrl&&v==="e")L=T.length;else if(w.ctrl&&v==="k")f=T.slice(0,R);else if(w.ctrl&&v==="u")f=T.slice(R),L=0;else if(w.ctrl&&v==="w"){let t=T.slice(0,R).match(/\s*\S+\s*$/);if(t){let u=t[0].length;f=T.slice(0,R-u)+T.slice(R),L-=u}}else if(w.ctrl&&v==="v"){let E=process.platform==="darwin";return(async()=>{if(K){let u=await _9();if(u){let a=await K(u.base64,u.mediaType,"clipboard.png");if(a?.prompt)B(a.prompt);return}}if(E)return;let t=await O9();if(t)await _(t)})()}else if(w.pageUp)L=0;else if(w.pageDown)L=T.length;else if(v===`
|
|
150
|
+
`&&(w.shift||w.meta)){let{newValue:E,newCursorPosition:t}=F9(v,T,R);O(E,t);return}else if(!w.ctrl&&!w.meta){if(G&&(v.length>K2.LARGE_INPUT_THRESHOLD||v.includes(`
|
|
151
|
+
`)))return _(v);f=T.slice(0,R)+v+T.slice(R,T.length),L+=v.length}if(L<0)L=0;if(L>f.length)L=f.length;O(f,L)})},{isActive:Y});let M=Y,N=$,k=Q?B$.grey(Q):void 0;if(M)if(k=Q.length>0?B$.inverse(Q[0])+B$.grey(Q.slice(1)):B$.inverse(" "),$.length===0)N=B$.inverse(" ");else{N="";for(let C=0;C<$.length;C++)if(C===Z&&Z<$.length)N+=B$.inverse($[C]);else N+=$[C];if(Z>=$.length)N+=B$.inverse(" ")}return CZ(PZ,{children:Q?$.length>0?N:k:N},void 0,!1,void 0,this)}import{jsxDEV as DQ}from"react/jsx-dev-runtime";var L9=vZ.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let K=$1()==="main-input",q=$.trimStart().startsWith("!"),U=W9((z)=>{let F=z.split(`
|
|
152
|
+
`).length,O=z.length,B=500,_=10;if(O>500||F>10){let W=Z(z),M=z.slice(0,30).replace(/\n/g," "),N=`${O} chars, ${F} lines: ${M}...`;return{prompt:`${r8(W)}${N}${l2()}`}}return{}}),H=W9(async(z,F,O)=>{try{let B=X(z,F);return{prompt:`${r8(B)}[Image #${B}]${l2()}`}}catch(B){return console.error("[Image Paste] Failed to process image:",B),{prompt:`[Image paste failed: ${B instanceof Error?B.message:"Unknown error"}] `}}});return DQ(IZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:q?"yellow":"gray",children:[DQ(TZ,{color:q?"yellow":"blue",bold:!0,children:q?"$ ":"> "},void 0,!1,void 0,this),DQ(H9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:U,onImagePaste:H,placeholder:" 输入命令...",focus:K,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as z2,Text as y1}from"ink";import VZ,{useEffect as jZ,useState as hZ}from"react";import{useEffect as DZ,useState as A9}from"react";import{useEffect as fZ,useState as kZ}from"react";var SZ=15000,B9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],w9=["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 b9($,Q,Y=!1){let[J,Z]=kZ("");return fZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let U=Math.floor(Math.random()*w9.length);return w9[U]}let q=Math.floor(Math.random()*B9.length);return B9[q]};Z(X());let G=setInterval(()=>{Z(X())},SZ);return()=>{clearInterval(G)}},[$,Q,Y]),J}function P9($,Q=!1,Y=!1){let[J,Z]=A9(0),[X,G]=A9(null),K=b9($,Q,Y);return DZ(()=>{if(!$){Z(0),G(null);return}if(Y)return;if(X===null)G(Date.now());let q=setInterval(()=>{if(X!==null){let U=Math.floor((Date.now()-X)/1000);Z(U)}},1000);return()=>{clearInterval(q)}},[$,X,Y]),{currentPhrase:K,elapsedTime:J}}import{jsxDEV as J1,Fragment as gZ}from"react/jsx-dev-runtime";var VQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],EZ=80;function y9($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var R9=VZ.memo(({message:$,paused:Q=!1})=>{let Y=i1(),J=y8(),Z=Y||!J,[X,G]=hZ(0),K=A0(),U=h$()>=EZ,{currentPhrase:H,elapsedTime:z}=P9(Z,!1,Q);if(jZ(()=>{if(!Z||Q){G(0);return}let O=setInterval(()=>{G((B)=>(B+1)%VQ.length)},150);return()=>clearInterval(O)},[Z,Q]),!Z)return null;let F=$||H||"正在思考中...";if(U)return J1(z2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[J1(y1,{color:K.colors.warning,bold:!0,children:VQ[X]},void 0,!1,void 0,this),J1(y1,{color:K.colors.text.primary,children:F},void 0,!1,void 0,this),z>0&&J1(gZ,{children:[J1(y1,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),J1(y1,{color:K.colors.info,children:["已用时: ",y9(z)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J1(y1,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),J1(y1,{color:K.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return J1(z2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[J1(z2,{flexDirection:"row",gap:1,children:[J1(y1,{color:K.colors.warning,bold:!0,children:VQ[X]},void 0,!1,void 0,this),J1(y1,{color:K.colors.text.primary,children:F},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z>0&&J1(z2,{marginLeft:2,flexDirection:"row",gap:1,children:[J1(y1,{color:K.colors.info,children:["已用时: ",y9(z)]},void 0,!0,void 0,this),J1(y1,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),J1(y1,{color:K.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 N2,Text as D0,useInput as mZ,useStdout as pZ}from"ink";import cZ from"ink-text-input";import xZ,{useCallback as O2,useEffect as uZ,useMemo as lZ,useState as w$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var T9=xZ.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=pZ(),J=Y.columns||80,Z=$1()==="confirmation-prompt",X=k0(!1),G=$.fields??[],[K,q]=w$("field"),[U,H]=w$(0),[z,F]=w$(()=>M9($)),[O,B]=w$(""),[_,W]=w$(0),[M,N]=w$([]),[k,C]=w$(),w=G[U],v=lZ(()=>dZ(w),[w]);uZ(()=>{if(!w)return;let L=z[w.name];B(typeof L==="string"||typeof L==="number"?String(L):""),N(Array.isArray(L)?[...L]:[]);let f=v.findIndex((E)=>E.value===String(L));W(f>=0?f:0),C(void 0)},[z,w,v]);let P=O2((L)=>{if(F(L),U<G.length-1){H((f)=>f+1);return}q("review")},[U,G.length]),A=O2((L)=>{if(!w)return;let f={...z};if(L===void 0)delete f[w.name];else f[w.name]=L;P(f)},[z,w,P]),T=O2((L)=>{if(!w)return;try{A(C9(w,L))}catch(f){C(f instanceof Error?f.message:String(f))}},[w,A]),R=O2(()=>{try{let L=I9($,{action:"accept",content:z});Q({action:L.action,...L.content?{content:L.content}:{}})}catch(L){C(L instanceof Error?L.message:String(L))}},[z,$,Q]);if(mZ((L,f)=>{if(f.ctrl&&L==="c"||f.meta&&L==="c"){X();return}if(f.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(K==="review"){if(L.toLowerCase()==="y"||f.return)R();else if(L.toLowerCase()==="e")H(0),q("field");else if(L.toLowerCase()==="d")Q({action:"decline"});return}if(!w){if(f.return)R();return}if(jQ(w))return;if(L.toLowerCase()==="d"){Q({action:"decline"});return}if(f.upArrow){W((E)=>E>0?E-1:Math.max(v.length-1,0));return}if(f.downArrow||f.tab){W((E)=>E<v.length-1?E+1:0);return}if(L===" "&&w.type==="multi-select"){let E=v[_];if(E)N((t)=>t.includes(E.value)?t.filter((u)=>u!==E.value):[...t,E.value]);return}if(f.return)if(w.type==="multi-select")A(M);else{let E=v[_];if(E)A(E.typedValue)}},{isActive:Z}),$.mode==="url")return F0(_2,{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(K==="review")return F0(_2,{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),G.map((L)=>F0(D0,{children:[L.title,": ",aZ(z[L.name])]},L.name,!0,void 0,this)),k&&F0(D0,{color:"red",children:k},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(!w)return F0(_2,{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(_2,{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(N2,{flexDirection:"column",marginTop:1,children:[F0(D0,{bold:!0,children:[w.title,w.required?" *":""]},void 0,!0,void 0,this),w.description&&F0(D0,{color:"gray",children:w.description},void 0,!1,void 0,this),F0(D0,{color:"gray",children:rZ(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),jQ(w)?F0(N2,{children:[F0(D0,{color:"cyan",children:"> "},void 0,!1,void 0,this),F0(cZ,{value:O,onChange:B,onSubmit:T,focus:Z,placeholder:w.defaultValue===void 0?w.required?"Required":"Optional":String(w.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):F0(N2,{flexDirection:"column",children:v.map((L,f)=>{let E=w.type==="multi-select"&&M.includes(L.value);return F0(D0,{color:_===f?"yellow":void 0,children:[_===f?"> ":" ",w.type==="multi-select"?E?"(*) ":"( ) ":"",L.label]},L.value,!0,void 0,this)})},void 0,!1,void 0,this),k&&F0(D0,{color:"red",children:k},void 0,!1,void 0,this),F0(D0,{color:"gray",children:[jQ(w)?"Enter to continue":w.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 ",G.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function _2({children:$,width:Q,color:Y}){return F0(N2,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function jQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function dZ($){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 rZ($){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 aZ($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import L2 from"ansi-escapes";import{Box as $$,Static as c9,useStdout as q5}from"ink";import U5,{useEffect as p1,useMemo as x9,useRef as Q$,useState as xQ}from"react";import{useStdout as iZ}from"ink";import{debounce as oZ}from"lodash-es";import{useEffect as nZ,useState as tZ}from"react";function v9($=200){let{stdout:Q}=iZ(),[Y,J]=tZ(Q.rows||24);return nZ(()=>{let Z=oZ(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import b$ from"chalk";import sZ from"string-width";var N0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},H2="\x1B",hQ=`${H2}[2K`,F2=($)=>$>0?`${H2}[${$}A`:"",f9=`${H2}[?25l`,k9=`${H2}[?25h`;function S9($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function D9($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function V9($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),G=[],K=d0.getTheme(),q=" ".repeat(N0.prefixIndent),U=b$.dim.hex(K.colors.border.light);if(Q>0)G.push(`${q}${b$.dim.hex(K.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let H=Y==="code",z=Y==="diff",F="",O=$;if(H&&$.length>0)F=$[0].match(/^```(\w+)?/)?.[1]||"",O=$.slice(1);else if(z&&$.length>0&&$[0]==="<<<DIFF>>>")O=$.slice(1);let B=O.slice(-X);if(H&&Q===0){let W=F?` ${b$.hex(K.colors.text.secondary)(F)}`:"";G.push(`${q}${U("╭─")}${W}`)}for(let W=0;W<B.length;W++){let M=B[W],N=q;if(W===0&&!J&&N0.isFirstRender&&!H&&!z)N=b$.bold.hex(K.colors.success)("• ")+" ",N0.isFirstRender=!1;let k=H?4:0,C=N0.terminalWidth-N0.prefixIndent-2-k,w=M;if(sZ(M)>C)w=M.slice(0,C);if(H)G.push(`${q}${U("│")} ${w}`);else if(z){let v=w;if(v.startsWith("+"))G.push(`${N}${b$.green(w)}`);else if(v.startsWith("-"))G.push(`${N}${b$.red(w)}`);else if(v.startsWith("@@"))G.push(`${N}${b$.dim(w)}`);else G.push(`${N}${w}`)}else G.push(`${N}${w}`);if(W===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let _=[];if(_.push(f9),N0.renderedLineCount>0)_.push(F2(N0.renderedLineCount)),_.push("\r");for(let W=0;W<G.length;W++){let M=G[W],N=N0.lastRenderedLines[W];if(M!==N)_.push(hQ),_.push(M);if(W<G.length-1)_.push(`
|
|
153
|
+
`)}if(G.length<N0.renderedLineCount){for(let M=G.length;M<N0.renderedLineCount;M++)_.push(`
|
|
154
|
+
`),_.push(hQ);let W=N0.renderedLineCount-G.length;_.push(F2(W))}_.push(k9),process.stdout.write(_.join("")),N0.renderedLineCount=G.length,N0.lastRenderedLines=G}function g1(){if(!N0.active)return;if(N0.renderedLineCount>0){let $=[];$.push(f9),$.push(F2(N0.renderedLineCount)),$.push("\r");for(let Q=0;Q<N0.renderedLineCount;Q++)if($.push(hQ),Q<N0.renderedLineCount-1)$.push(`
|
|
155
|
+
`);if(N0.renderedLineCount>1)$.push(F2(N0.renderedLineCount-1)),$.push("\r");$.push(k9),process.stdout.write($.join(""))}N0.active=!1,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.isFirstRender=!0}function v1(){return N0.active}import{Box as eZ,Text as j9}from"ink";import $5 from"react";import{jsxDEV as EQ}from"react/jsx-dev-runtime";var gQ=$5.memo(({collapsedCount:$})=>{let Q=A0();if($<=0)return null;let Y=Q.colors.text.muted;return EQ(eZ,{flexDirection:"row",marginBottom:1,children:[EQ(j9,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),EQ(j9,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});gQ.displayName="CollapsedHistorySummary";import{Box as z8,Text as O8}from"ink";import Q5 from"ink-big-text";import J5 from"ink-gradient";import Y5 from"react";import{jsxDEV as L1}from"react/jsx-dev-runtime";var E9=Y5.memo(()=>{return L1(z8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[L1(z8,{flexDirection:"column",children:L1(J5,{name:"pastel",children:L1(Q5,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(z8,{marginBottom:1,children:L1(O8,{color:"white",dimColor:!0,children:h9()},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(z8,{flexDirection:"column",marginBottom:1,children:[L1(z8,{marginBottom:1,children:L1(O8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(O8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),L1(O8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),L1(O8,{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 W2,Text as mQ}from"ink";import g9 from"react";import{jsxDEV as e1}from"react/jsx-dev-runtime";var m9=g9.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 e1(W2,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[e1(W2,{marginBottom:Y?0:1,children:[e1(mQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),e1(mQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e1(W2,{flexDirection:"column",children:$.map((X,G)=>e1(Z5,{task:X,compact:Y},X.id||G,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),Z5=g9.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 e1(W2,{paddingY:Q?0:0,children:e1(mQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as pQ,Text as d$}from"ink";import X5,{useMemo as p9}from"react";import{jsxDEV as m1}from"react/jsx-dev-runtime";function G5($,Q=60){if(!$)return"";let Y=$.split(`
|
|
156
|
+
`)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function K5($){if(!$)return 0;return $.split(`
|
|
157
|
+
`).length}var cQ=X5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=p9(()=>K5($),[$]),X=p9(()=>G5($),[$]),G=J.colors.info,K=J.colors.muted;return m1(pQ,{flexDirection:"column",marginBottom:1,children:[m1(pQ,{flexDirection:"row",children:[m1(d$,{color:G,children:Y?"v":">"},void 0,!1,void 0,this),m1(d$,{children:" "},void 0,!1,void 0,this),m1(d$,{color:K,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&m1(d$,{color:K,children:[" - ",X]},void 0,!0,void 0,this),m1(d$,{color:K,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&m1(pQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:m1(d$,{color:K,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});cQ.displayName="ThinkingBlock";import{jsxDEV as a0}from"react/jsx-dev-runtime";var l9=U5.memo(()=>{let $=eQ(),Q=B4(),Y=w4(),J=b4(),Z=i1(),X=G4(),G=z4(),K=C8(),q=W4(),U=L4(),H=$4(),z=P4(),F=A4(),O=h$(),B=v9(),{stdout:_}=q5(),W=r1(),[M,N]=xQ(null),[k,C]=xQ([]),[w,v]=xQ(new Set),P=Q$(F),A=Q$(null),T=Q$(0),R=Q$(0),L=Q$(new Set),f=Q$(new Set),E=Q$([]),t=Q$(null);p1(()=>{if(P.current!==F){if(v1())g1();if(_)_.write(L2.clearTerminal);W.incrementClearCount(),P.current=F}},[F,_,W]);let u=$,a=J;p1(()=>{if(!J||Z){t.current=null;return}if(t.current===J)return;if(t.current=J,v1())g1();if(_)_.write(L2.eraseScreen+L2.cursorTo(0,0));L.current=new Set,f.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),A.current=null,T.current=0,R.current=0,E.current=[],C([]),v(new Set),W.incrementClearCount(),W.clearFinalizingStreamingMessageId()},[J,Z,_,W,u]);let I=Q??J;p1(()=>{if(v1())g1();A.current=null,T.current=0,R.current=0,L.current=new Set,f.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),E.current=[],C([]),v(new Set)},[H]),p1(()=>{if(!I)return;if(A.current===I)return;A.current=I,T.current=0,R.current=0,f.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),E.current=[],C([])},[I,u]),p1(()=>{if(!I)return;let S=uQ(I);if(!S||S.length<=T.current)return;let x=S.slice(T.current);T.current=S.length;let V=x,l=E.current;if(l.length>0)if(V.some((B0)=>B0.type!=="empty"))V=[...l,...V],E.current=[];else{E.current=[...l,...V];return}let K0=V.length;while(K0>0&&V[K0-1].type==="empty")K0-=1;if(K0!==V.length)E.current=V.slice(K0),V=V.slice(0,K0);if(V.length===0)return;let Z0=R.current;R.current+=1;let P0=Z0>0;if(v1())g1();v((B0)=>{if(!I||B0.has(I))return B0;let s0=new Set(B0);return s0.add(I),s0}),C((B0)=>[...B0,a0($$,{flexDirection:"column",children:a0(s1,{content:"",role:"assistant",terminalWidth:O,isPending:!1,hidePrefix:P0,noMargin:!0,blocksOverride:V,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${Z0}`,!1,void 0,this)])},[I,Y.version,O,H]),p1(()=>{if(!I)return;let S=f.current,x=u.filter((V)=>V.role==="tool"&&!S.has(V.id)&&!L.current.has(V.id));if(x.length===0)return;if(v1())g1();for(let V of x)L.current.add(V.id);C((V)=>[...V,...x.map((l)=>a0($$,{flexDirection:"column",children:a0(s1,{content:l.content,role:l.role,terminalWidth:O,metadata:l.metadata,isPending:!1,messageId:l.id},void 0,!1,void 0,this)},`streaming-tool-${l.id}`,!1,void 0,this))])},[I,u,O]),p1(()=>{if(!I){if(v1())g1();return}if(!v1())S9(O,B);else D9(O,B);let S=u9(I);if(!S||S.lines.length===0)return;let V=Math.max(1,B-8),l=Math.max(0,S.lines.length-V),K0=S.lines.slice(-V),Z0=(uQ(I)?.length??0)>0;V9(K0,l,S.mode,Z0)},[I,Y.version,B,O]),p1(()=>{if(!I&&v1())g1()},[I]),p1(()=>{if(M===null&&u.length>z){if(N(u.length),v1())g1();if(_)_.write(L2.clearTerminal);W.incrementClearCount()}},[u.length,z,M,_,W]);let y=x9(()=>{return X.some((S)=>S.status==="pending"||S.status==="in_progress")},[X]),D=F?0:M??0,b=D,h=x9(()=>{let S=[];if(S.push(a0(E9,{},"header",!1,void 0,this)),b>0)S.push(a0(gQ,{collapsedCount:b},"collapsed-summary",!1,void 0,this));for(let x=D;x<u.length;x++){let V=u[x];if(a&&V.id===a)continue;if(V.role==="tool"&&L.current.has(V.id))continue;if(V.role==="assistant"&&w.has(V.id))continue;S.push(a0($$,{flexDirection:"column",children:a0(s1,{content:V.content,role:V.role,terminalWidth:O,metadata:V.metadata,isPending:!1,messageId:V.id},void 0,!1,void 0,this)},V.id,!1,void 0,this))}return S},[u,D,b,O,a,w]);return a0($$,{flexDirection:"column",paddingX:2,children:a0($$,{flexDirection:"column",children:[a0(c9,{items:h,children:(S)=>S},H,!1,void 0,this),q&&a0($$,{marginBottom:1,children:a0(cQ,{content:q,isStreaming:Z,isExpanded:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),k.length>0&&a0(c9,{items:k,children:(S)=>S},`streaming-${H}`,!1,void 0,this),G&&y&&a0($$,{marginTop:1,children:a0(m9,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.map((S,x)=>a0($$,{flexDirection:"column",children:a0(s1,{content:S.displayText,role:"user",terminalWidth:O},void 0,!1,void 0,this)},`pending-${x}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as B2,useMount as z5}from"ahooks";import{Box as B1,Text as H0,useFocus as O5,useFocusManager as _5,useInput as N5}from"ink";import F5 from"ink-select-input";import{memo as H5,useMemo as W5,useState as w2}from"react";import{jsxDEV as s,Fragment as w5}from"react/jsx-dev-runtime";var L5=({isSelected:$})=>s(B1,{marginRight:1,children:s(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),B5=({isSelected:$,label:Q})=>s(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),d9=H5(({onClose:$,onEdit:Q})=>{let Y=O4(),J=M8()??"",{isFocused:Z}=O5({id:"model-selector"}),X=_5(),[G,K]=w2(""),[q,U]=w2(!1),[H,z]=w2(null),F=k0(!1),[O]=w2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});z5(()=>{if(X?.focus("model-selector"),Y.length>0)K(Y[0].id)}),N5((P,A)=>{if(q)return;if(A.ctrl&&P==="c"||A.meta&&P==="c"){F();return}if(A.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){_();return}if((P==="e"||P==="E")&&Q)W()},{isActive:!0});let B=B2(async(P)=>{if(q)return;let A=P.value;if(A===J){$();return}U(!0),z(null);try{await m0().setCurrentModel(A),$()}catch(T){z(T.message),U(!1)}}),_=B2(async()=>{if(q||G===J)return;U(!0),z(null);try{if(await m0().removeModel(G),Y.length<=1)$()}catch(P){z(P.message)}finally{U(!1)}}),W=B2(()=>{if(q||!Q)return;let P=Y.find((A)=>A.id===G);if(!P)return;Q(P)}),M=B2((P)=>{K(P.value)}),N=W5(()=>{return Y.find((P)=>P.id===G)},[Y,G]),k=N?b2()?.modelProviders[N.provider]:void 0,C=Y.map((P)=>{let A=P.id===J?" (当前)":"";return{label:lQ(P)+A,value:P.id}}),w=G===J;return s(B1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[s(B1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[s(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),s(H0,{dimColor:!0,children:[q?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(B1,{flexDirection:"row",children:[s(B1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[s(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),s(B1,{marginTop:1,children:s(F5,{items:C,onSelect:B,onHighlight:M,indicatorComponent:L5,itemComponent:B5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(B1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[s(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),s(B1,{marginY:1,children:s(H0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N?s(B1,{flexDirection:"column",children:[s(H0,{children:[s(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),s(H0,{bold:!0,color:"cyan",children:lQ(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(H0,{children:[s(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),s(H0,{bold:!0,children:k?.name??N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k&&s(w5,{children:[s(H0,{children:[s(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),s(H0,{children:N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(H0,{children:[s(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),s(H0,{children:k.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(H0,{children:[s(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),s(H0,{color:"blueBright",children:k.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(H0,{children:[s(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),s(H0,{bold:!0,children:N.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.overrides?.baseUrl&&s(H0,{children:[s(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),s(H0,{color:"blueBright",children:N.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(H0,{children:[s(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),s(H0,{children:D1().resolveConfig(N).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):s(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H&&s(B1,{marginTop:1,children:s(H0,{color:"red",children:H},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(B1,{justifyContent:"center",marginTop:1,children:s(H0,{dimColor:!0,children:"─".repeat(O)},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(B1,{justifyContent:"center",children:s(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 p5,Text as rQ,useInput as c5}from"ink";import{useState as y$}from"react";import{Box as A$,Text as c1,useInput as b5}from"ink";import A5 from"ink-text-input";import{jsxDEV as o0}from"react/jsx-dev-runtime";var r9=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return b5((G,K)=>{if(K.escape)Z()}),o0(A$,{flexDirection:"column",children:[o0(A$,{marginBottom:1,children:o0(c1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(A$,{marginBottom:1,children:o0(c1,{children:["Provider: ",o0(c1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o0(A$,{marginBottom:1,children:o0(c1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(A$,{children:[o0(c1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),o0(A5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&o0(A$,{marginTop:1,children:o0(c1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(A$,{marginTop:1,children:o0(c1,{dimColor:!0,children:["输入完成后按 ",o0(c1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",o0(c1,{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 A2,Text as J$,useInput as P5}from"ink";import y5 from"ink-text-input";import{useState as P2}from"react";import{jsxDEV as O1}from"react/jsx-dev-runtime";var y2=["id","name","baseUrl","model"];function a9($){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 M5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=o9(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 n9=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,G]=P2(Q?3:0),[K,q]=P2(Q?.model??""),[U,H]=P2(Z),[z,F]=P2(),O=y2[X];P5((_,W)=>{if(!W.escape)return;if(F(void 0),X===0){J();return}let M=X-1,N=y2[M];G(M),q(U[N])});let B=(_)=>{let W=_.trim();if(O==="id"&&!i9.test(W)){F("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(O==="baseUrl")try{let N=new URL(W);if(!["http:","https:"].includes(N.protocol))throw Error()}catch{F("Base URL 必须是绝对 HTTP(S) URL");return}if(O==="model"&&!W){F("Model ID 不能为空");return}let M={...U,[O]:O==="name"&&!W?U.id:W};if(H(M),F(void 0),X===y2.length-1){try{Y(M5(M,$))}catch(N){F(N instanceof Error?N.message:"渠道配置无效")}return}G(X+1),q("")};return O1(A2,{flexDirection:"column",children:[O1(A2,{marginBottom:1,children:O1(J$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O1(J$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),y2.slice(0,X).map((_)=>O1(J$,{children:[a9(_),": ",O1(J$,{color:"cyan",children:U[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),O1(A2,{marginTop:1,children:[O1(J$,{bold:!0,children:[a9(O),": "]},void 0,!0,void 0,this),O1(y5,{value:K,onChange:(_)=>{q(_),F(void 0)},onSubmit:B,placeholder:R5(O,$,U.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O==="name"&&O1(J$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),z&&O1(J$,{color:"red",children:z},void 0,!1,void 0,this),O1(A2,{marginTop:1,children:O1(J$,{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 e9,useState as r$}from"react";var $J=()=>{let[$,Q]=r$([]),[Y,J]=r$(!0),[Z,X]=r$(null);return e9(()=>{(async()=>{try{Q(await t9())}catch(K){X(K instanceof Error?K.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},QJ=($)=>{let[Q,Y]=r$([]),[J,Z]=r$(!1),[X,G]=r$(null);return e9(()=>{if(!$){Y([]);return}(async()=>{Z(!0),G(null);try{Y(await s9($))}catch(q){G(q instanceof Error?q.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as x1,Text as R1,useInput as C5}from"ink";import I5 from"ink-select-input";import T5 from"ink-text-input";import{useMemo as JJ,useState as v5}from"react";import{jsxDEV as E0,Fragment as D5}from"react/jsx-dev-runtime";var f5=({isSelected:$})=>E0(x1,{marginRight:1,children:E0(R1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),k5=($)=>{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(" ")},S5=({isSelected:$,label:Q})=>E0(R1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),YJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[G,K]=v5("");C5((H,z)=>{if(z.escape)if(G)K("");else X()});let q=JJ(()=>{if(!G)return Q;let H=G.toLowerCase();return Q.filter((z)=>z.name.toLowerCase().includes(H)||z.id.toLowerCase().includes(H))},[Q,G]),U=JJ(()=>q.map((H)=>({key:H.id,label:k5(H),value:H})),[q]);if(Y)return E0(x1,{flexDirection:"column",children:E0(R1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return E0(x1,{flexDirection:"column",children:[E0(R1,{color:"red",children:J},void 0,!1,void 0,this),E0(R1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E0(x1,{flexDirection:"column",children:[E0(x1,{marginBottom:1,children:E0(R1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(x1,{marginBottom:1,children:E0(R1,{children:["Provider: ",E0(R1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E0(D5,{children:[E0(x1,{marginBottom:1,children:[E0(R1,{color:"cyan",children:"> "},void 0,!1,void 0,this),E0(T5,{value:G,onChange:K,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(x1,{marginBottom:1,children:E0(R1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(x1,{flexDirection:"column",height:12,children:E0(I5,{items:U,onSelect:(H)=>Z(H.value),indicatorComponent:f5,itemComponent:S5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.length===0&&E0(R1,{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 P$,Text as Y$,useInput as V5}from"ink";import j5 from"ink-select-input";import h5 from"ink-text-input";import{useMemo as ZJ,useState as E5}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var g5=({isSelected:$})=>n0(P$,{marginRight:1,children:n0(Y$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),m5=({isSelected:$,label:Q})=>n0(Y$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),XJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,G]=E5("");V5((U,H)=>{if(H.escape)if(X)G("");else Z()});let K=ZJ(()=>{if(!X)return $;let U=X.toLowerCase();return $.filter((H)=>H.name.toLowerCase().includes(U)||H.id.toLowerCase().includes(U))},[$,X]),q=ZJ(()=>K.map((U)=>({key:U.id,label:`${U.name} - ${U.modelCount} models${U.configured?" [configured]":""}`,value:U})),[K]);if(Q)return n0(P$,{flexDirection:"column",children:n0(Y$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(P$,{flexDirection:"column",children:[n0(Y$,{color:"red",children:Y},void 0,!1,void 0,this),n0(Y$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(P$,{flexDirection:"column",children:[n0(P$,{marginBottom:1,children:n0(Y$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(P$,{marginBottom:1,children:[n0(Y$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(h5,{value:X,onChange:G,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(P$,{flexDirection:"column",height:12,children:n0(j5,{items:q,onSelect:(U)=>J(U.value),indicatorComponent:g5,itemComponent:m5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&n0(Y$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function GJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as Z$}from"react/jsx-dev-runtime";var aQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,G]=y$("provider"),[K,q]=y$(),[U,H]=y$(),[z,F]=y$(),[O,B]=y$(""),[_,W]=y$(),[M,N]=y$(!1),k=$J(),C=QJ(K?.id),w=k0(!1);c5((T,R)=>{if(R.ctrl&&T==="c"||R.meta&&T==="c")$==="setup"?w():Z()});let v=dQ(async(T)=>{if(!K)return;let R=z??(U?{provider:K.id,model:U.id,displayName:Q?.displayName}:void 0);if(!R)return;N(!0),W(void 0);try{if(R.modelProvider)D1().registerModelProvider(R.provider,R.modelProvider,[R.model]);if(T?.trim())await D1().setApiKey(R.provider,T.trim());let L={displayName:R.displayName,provider:R.provider,model:R.model,overrides:R.overrides};if($==="setup")await J(R);else if($==="add"){let f=R.modelProvider?await m0().addModelWithProvider(L,R.modelProvider):await m0().addModel(L);await m0().setCurrentModel(f.id),await J(R)}else if(Y){if(R.modelProvider)await m0().updateModelWithProvider(Y,L,R.modelProvider);else await m0().updateModel(Y,L);await J(R)}}catch(L){if(R.modelProvider){await D1().credentials.delete(R.provider);let f=b2();D1().configureModelProviders(f?.modelProviders??{},f?.models??[])}W(L instanceof Error?L.message:"保存配置失败"),N(!1)}}),P=dQ((T)=>{if(H(T),K?.configured)v();else if(K?.supportsApiKey)G("credential");else W(`${K?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),A=dQ(()=>{if(W(void 0),X==="credential"&&z){G("custom");return}let T=GJ(X);if(T)G(T)});return Z$(p5,{flexDirection:"column",padding:1,children:[Z$(rQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&Z$(XJ,{...k,onSelect:(T)=>{q(T),H(void 0),F(void 0),G(T.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&K?.factoryWireApi&&Z$(n9,{wireApi:K.factoryWireApi,initialConfig:z,onSubmit:(T)=>{F(T),G("credential")},onCancel:A},void 0,!1,void 0,this),X==="model"&&K&&Z$(YJ,{provider:K,...C,onSelect:P,onCancel:A},void 0,!1,void 0,this),X==="credential"&&K&&Z$(r9,{provider:K,value:O,onChange:B,onSubmit:()=>void v(O),onCancel:A,error:_},void 0,!1,void 0,this),M&&Z$(rQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&Z$(rQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as _8}from"ahooks";import{promises as zJ}from"fs";import{Box as _1,Text as V0,useInput as x5}from"ink";import KJ from"ink-select-input";import u5 from"ink-text-input";import l5 from"os";import R2 from"path";import{useEffect as d5,useMemo as M2,useRef as r5,useState as X$}from"react";import{jsxDEV as U0}from"react/jsx-dev-runtime";var N8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],a5={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},i5={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},qJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},o5=["project","global","local"],n5={allow:[],ask:[],deny:[]},t5={localExists:!1,projectExists:!1,globalExists:!1},UJ={allow:[],ask:[],deny:[]};function s5($){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 e5($){try{let Q=await zJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:s5(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...UJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...UJ}}}}function $X($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${qJ[Q]} <- 可删除`:qJ[Q];return`${Y} ${J}`}var OJ=({onClose:$})=>{let Y=$1()==="permissions-manager",J=k0(!1),[Z,X]=X$(0),G=N8[Z].key,[K,q]=X$(n5),[U,H]=X$(t5),[z,F]=X$(!0),[O,B]=X$("list"),[_,W]=X$(""),[M,N]=X$(null),[k,C]=X$(null),w=r5(!1),v=M2(()=>R2.join(u0(),".blade","settings.local.json"),[]),P=M2(()=>R2.join(u0(),".blade","settings.json"),[]),A=M2(()=>R2.join(l5.homedir(),".blade","settings.json"),[]),T=_8(async()=>{F(!0);let x=await Promise.all([{source:"local",path:v},{source:"project",path:P},{source:"global",path:A}].map(async({source:Z0,path:P0})=>{let B0=await e5(P0);return{source:Z0,path:P0,...B0}})),V={localExists:x.find((Z0)=>Z0.source==="local")?.exists??!1,projectExists:x.find((Z0)=>Z0.source==="project")?.exists??!1,globalExists:x.find((Z0)=>Z0.source==="global")?.exists??!1};H(V);let l={allow:[],ask:[],deny:[]},K0=Object.fromEntries(x.map((Z0)=>[Z0.source,Z0]));["allow","ask","deny"].forEach((Z0)=>{o5.forEach((P0)=>{(K0[P0]?.permissions[Z0]??[]).forEach((s0,c0)=>{let F1={key:`${P0}:${c0}:${s0}`,rule:s0,source:P0};l[Z0].push(F1)})})}),q(l),F(!1)});d5(()=>{T()},[T]);let R=_8(async(S,x)=>{try{let V=R2.join(u0(),".blade","settings.local.json"),l={allow:[],ask:[],deny:[]};try{let Z0=await zJ.readFile(V,"utf-8"),B0=JSON.parse(Z0).permissions||{};l={allow:Array.isArray(B0.allow)?B0.allow:[],ask:Array.isArray(B0.ask)?B0.ask:[],deny:Array.isArray(B0.deny)?B0.deny:[]}}catch(Z0){}let K0=x(l);await m0().updateConfig({permissions:K0},{scope:"local",immediate:!0}),await T()}catch(V){throw console.error("[PermissionsManager] 修改权限规则失败:",V),V}});x5((S,x)=>{if(x.ctrl&&S==="c"||x.meta&&S==="c"){J();return}if(O==="locked"){if(w.current){w.current=!1;return}B("list"),N(null),C(null);return}if(x.escape){if(O==="list"||G==="info")$();else B("list"),W(""),N(null),C(null);return}if(O==="list"){if(x.tab&&x.shift)X((V)=>(V-1+N8.length)%N8.length);else if(x.tab)X((V)=>(V+1)%N8.length);else if(S?.toLowerCase()==="q")$()}},{isActive:Y});let L=_8((S)=>{let x=S.value;if(G==="info")return;if(x.type==="add"){B("add"),W(""),C(null);return}if(x.entry.source!=="local"){B("locked"),w.current=!0,N({tab:G,entry:x.entry}),C({type:"error",text:x.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}B("confirm-delete"),N({tab:G,entry:x.entry}),C(null)}),f=_8(async()=>{if(G==="info")return;let S=_.trim();if(!S){C({type:"error",text:"Permission rule 不能为空"});return}if(K[G].map((V)=>V.rule).includes(S)){C({type:"error",text:"该规则已存在"});return}try{await R(G,(V)=>{let l={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return l[G]=[...new Set([...V[G],S])],l}),B("list"),W(""),C({type:"success",text:"已添加本地权限规则"})}catch(V){C({type:"error",text:`保存失败: ${V instanceof Error?V.message:"未知错误"}`})}}),E=_8(async()=>{if(!M)return;let{tab:S,entry:x}=M;try{await R(S,(V)=>{let l={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return l[S]=V[S].filter((K0)=>K0!==x.rule),l}),B("list"),N(null),C({type:"success",text:"已删除本地权限规则"})}catch(V){C({type:"error",text:`删除失败: ${V instanceof Error?V.message:"未知错误"}`})}}),t=M2(()=>{if(G==="info")return[];let S=G;return[{key:"add-new-rule",label:`› ${a5[S]}`,value:{type:"add"}},...K[S].map((V)=>({key:V.key,label:$X(V.rule,V.source),value:{type:"rule",entry:V}}))]},[G,K]),u=()=>U0(_1,{marginBottom:1,children:N8.map((S,x)=>U0(_1,{marginRight:2,children:U0(V0,{color:x===Z?"yellow":"gray",children:["[",S.label,"]"]},void 0,!0,void 0,this)},S.key,!1,void 0,this))},void 0,!1,void 0,this),a=()=>U0(_1,{flexDirection:"column",gap:1,children:[U0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),U0(_1,{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(_1,{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=(S)=>U0(_1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:i5[S]},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(_1,{marginTop:1,children:U0(u5,{value:_,onChange:W,onSubmit:f},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=(S,x)=>U0(_1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:["Delete ",S," permission rule?"]},void 0,!0,void 0,this),U0(V0,{children:x.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(KJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(V)=>{if(V.value==="yes")E();else B("list"),N(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D=(S)=>U0(_1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),U0(V0,{children:S.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:S.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b=(S)=>U0(KJ,{items:t,isFocused:O==="list",onSelect:L},void 0,!1,void 0,this),h=()=>{if(z)return U0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(G==="info")return a();if(O==="add")return I(G);if(O==="confirm-delete"&&M)return y(M.tab,M.entry);if(O==="locked"&&M)return D(M.entry);return b(G)};return U0(_1,{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),u(),U0(_1,{flexDirection:"column",gap:1,children:h()},void 0,!1,void 0,this),k&&U0(_1,{marginTop:1,children:U0(V0,{color:k.type==="success"?"green":"red",children:k.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(_1,{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 w0,Text as J0,useInput as QX}from"ink";import{useEffect as JX,useState as R$}from"react";import{jsxDEV as p}from"react/jsx-dev-runtime";var iQ=["local","project","global"];function BJ({workspaceRoot:$,onCancel:Q}){let Y=NJ($),J=Y.getAll(),[Z,X]=R$(0),[G,K]=R$(!1),[q,U]=R$(""),[H,z]=R$(null),[F,O]=R$("local"),[B,_]=R$(null),[W,M]=R$(0),N=Y.getBySource(),k=Y.getStats(),C=Y.getSourcePolicy(),w=k0(!1,Q);JX(()=>{let L=!0;return _J.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((f)=>{if(L)_(f.settings)}).catch((f)=>{if(L)U(f instanceof Error?f.message:"无法读取插件作用域配置")}),()=>{L=!1}},[Y,W]);let v=()=>{O((L)=>{let f=iQ.indexOf(L);return iQ[(f+1)%iQ.length]}),z(null)},P=async()=>{let L=J[Z];if(!L||G)return;if(L.source==="cli"){U(`${L.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(L.status==="error"){U(L.error??`${L.manifest.name} 当前不可用`);return}K(!0),U("");try{let f=await FJ(Y.getWorkspaceRoot(),L.manifest.name,L.status!=="active",F);U(f.effectiveEnabled?`已启用 ${L.manifest.name} · 生效层级 ${f.effectiveScope}`:`已禁用 ${L.manifest.name} · 生效层级 ${f.effectiveScope}`),M((E)=>E+1)}catch(f){U(f instanceof Error?f.message:String(f))}finally{K(!1)}},A=async()=>{if(G)return;K(!0),U("");try{await HJ(Y.getWorkspaceRoot()),X(0),U("插件列表已刷新"),M((L)=>L+1)}catch(L){U(L instanceof Error?L.message:String(L))}finally{K(!1)}},T=async()=>{let L=J[Z];if(!L||G)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}K(!0),z(null),U("");try{let{result:f}=await WJ(Y.getWorkspaceRoot(),L.manifest.name,{trusted:!0});if(!f.success)throw Error(f.error);U(f.changed?`已更新 ${L.manifest.name} 到 ${f.installation?.revision}`:`${L.manifest.name} 已是最新版本`),M((E)=>E+1)}catch(f){U(f instanceof Error?f.message:String(f))}finally{K(!1)}},R=async()=>{let L=J[Z];if(!L||G)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(H!==L.manifest.name){z(L.manifest.name),U(`再次按 x 确认卸载 ${L.manifest.name}`);return}K(!0),U("");try{let{result:f}=await LJ(Y.getWorkspaceRoot(),L.manifest.name,!0);if(!f.success)throw Error(f.error);z(null),X(0),U(`已卸载 ${L.manifest.name}`),M((E)=>E+1)}catch(f){U(f instanceof Error?f.message:String(f))}finally{K(!1)}};if(QX((L,f)=>{if(f.escape)Q?.();else if(f.ctrl&&L==="c"||f.meta&&L==="c")w();else if((f.upArrow||L==="k")&&J.length>0)z(null),X((E)=>(E-1+J.length)%J.length);else if((f.downArrow||L==="j")&&J.length>0)z(null),X((E)=>(E+1)%J.length);else if(L===" "||f.return)P();else if(L==="r")A();else if(L==="s")v();else if(L==="u")T();else if(L==="x")R()}),J.length===0)return p(w0,{flexDirection:"column",paddingY:1,children:[p(w0,{marginBottom:1,children:p(J0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[p(J0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{marginTop:1,paddingLeft:2,children:p(J0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{marginTop:1,children:p(J0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return p(w0,{flexDirection:"column",paddingY:1,children:[p(w0,{marginBottom:1,children:[p(J0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),p(J0,{color:"gray",children:[" (共 ",k.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,marginBottom:1,children:p(J0,{color:"gray",children:["启用: ",k.active," | 禁用: ",k.inactive," | 命令: ",k.commands," | 技能:"," ",k.skills," | 代理: ",k.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,marginBottom:1,children:p(J0,{color:"gray",children:["来源策略: ",C.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",C.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,marginBottom:1,children:p(J0,{color:"gray",children:["写入层级: ",p(J0,{color:"cyan",children:F},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),N.cli.length>0&&p(w0,{flexDirection:"column",marginBottom:1,children:[p(w0,{paddingLeft:1,children:[p(J0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),p(J0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.cli.map((L)=>{let f=L.status==="active"?"[on]":"[off]",E=J.indexOf(L)===Z;return p(w0,{flexDirection:"column",paddingLeft:2,children:[p(J0,{children:[p(J0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),p(J0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&p(w0,{paddingLeft:2,children:p(J0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.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&&p(w0,{flexDirection:"column",marginBottom:1,children:[p(w0,{paddingLeft:1,children:[p(J0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),p(J0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.project.map((L)=>{let f=L.status==="active"?"[on]":"[off]",E=J.indexOf(L)===Z;return p(w0,{flexDirection:"column",paddingLeft:2,children:[p(J0,{children:[p(J0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),p(J0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&p(w0,{paddingLeft:2,children:p(J0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.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&&p(w0,{flexDirection:"column",marginBottom:1,children:[p(w0,{paddingLeft:1,children:[p(J0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),p(J0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.user.map((L)=>{let f=L.status==="active"?"[on]":"[off]",E=J.indexOf(L)===Z;return p(w0,{flexDirection:"column",paddingLeft:2,children:[p(J0,{children:[p(J0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),p(J0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&p(w0,{paddingLeft:2,children:p(J0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.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),p(w0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[p(J0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{marginTop:1,children:p(J0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q&&p(w0,{marginTop:1,children:p(J0,{color:q.includes("失败")?"red":"cyan",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&p(J0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as Y1,Text as Z1,useInput as wJ,useStdout as YX}from"ink";import ZX from"ink-text-input";import oQ,{useCallback as F8,useMemo as XX,useState as G$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var GX=oQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>W0(Y1,{flexDirection:"column",marginBottom:1,children:[W0(Z1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),W0(Y1,{marginLeft:4,children:W0(Z1,{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(Y1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return W0(Y1,{marginBottom:1,children:[W0(Z1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),W0(Z1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),bJ=oQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=YX(),Z=J.columns||80,G=$1()==="confirmation-prompt",K=k0(!1),[q,U]=G$("answering"),[H,z]=G$(0),[F,O]=G$({}),[B,_]=G$(0),[W,M]=G$([]),[N,k]=G$(!1),[C,w]=G$(""),[v,P]=G$(0),A=$[H],T=XX(()=>{if(!A)return[];return[...A.options.map((u)=>({label:u.label,value:u.label,description:u.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[A]),R=F8((u)=>{let a={...F,[A.header]:u};if(O(a),H<$.length-1)z(H+1),_(0),M([]),k(!1),w("");else U("submit"),P(0)},[F,A?.header,H,$.length]),L=F8((u)=>{let a=T[u];if(!a)return;if(a.value==="__other__"){k(!0);return}if(A.multiSelect)M((I)=>I.includes(a.value)?I.filter((y)=>y!==a.value):[...I,a.value]);else R(a.value)},[T,A?.multiSelect,R]),f=F8((u)=>{if(u.trim())R(u.trim())},[R]),E=F8(()=>{U("answering"),z(0),_(0),M([]),k(!1)},[]),t=F8(()=>{Q(F)},[F,Q]);if(wJ((u,a)=>{if(a.ctrl&&u==="c"||a.meta&&u==="c"){K();return}if(N){if(a.escape)k(!1),w("");return}if(a.escape){Y();return}let I=parseInt(u);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&&W.length>0)R(W);else L(B);return}if(u===" "&&A.multiSelect){let y=T[B];if(y&&y.value!=="__other__")M((D)=>D.includes(y.value)?D.filter((b)=>b!==y.value):[...D,y.value]);return}},{isActive:G&&q==="answering"&&!N}),wJ((u,a)=>{if(a.ctrl&&u==="c"||a.meta&&u==="c"){K();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){P((I)=>I===0?1:0);return}if(a.return){if(v===0)t();else E();return}if(u.toLowerCase()==="y"){t();return}if(u.toLowerCase()==="e"){E();return}},{isActive:G&&q==="submit"}),q==="submit")return W0(Y1,{flexDirection:"column",borderStyle:"round",borderColor:G?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(Y1,{marginBottom:1,children:W0(Z1,{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:F},void 0,!1,void 0,this),W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:v===0?"yellow":void 0,bold:v===0,children:[v===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Z1,{color:v===1?"yellow":void 0,bold:v===1,children:[v===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(Y1,{marginTop:1,children:W0(Z1,{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(Y1,{flexDirection:"column",borderStyle:"round",borderColor:G?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(Y1,{marginBottom:1,children:[W0(Z1,{backgroundColor:"blue",color:"white",children:[" ",A.header," "]},void 0,!0,void 0,this),W0(Z1,{children:[" ",A.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N?W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),W0(Y1,{marginTop:1,children:[W0(Z1,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0(ZX,{value:C,onChange:w,onSubmit:f,focus:G},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(Y1,{marginTop:1,children:W0(Z1,{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(Y1,{flexDirection:"column",children:T.map((u,a)=>W0(GX,{option:u,index:a,isSelected:W.includes(u.value),isMultiSelect:A.multiSelect,isHighlighted:B===a},u.value,!1,void 0,this))},void 0,!1,void 0,this),!N&&W0(Y1,{marginTop:1,flexDirection:"column",children:[W0(Z1,{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&&W.length>0&&W0(Z1,{color:"green",children:["Selected: ",W.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&W0(Y1,{marginTop:1,children:W0(Z1,{color:"gray",children:["Question ",H+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as qX}from"node:path";import{Box as i$,Text as w1,useInput as UX}from"ink";import zX from"ink-select-input";import{useEffect as nQ,useMemo as a$,useRef as CJ,useState as C2}from"react";function AJ($){return`${$.projectPath}\x00${$.sessionId}`}function PJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function yJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function RJ($,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 l0}from"react/jsx-dev-runtime";function OX($){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 _X($){return qX($)}function NX($){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 FX=({isSelected:$})=>l0(i$,{marginRight:1,children:l0(w1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),HX=({isSelected:$,label:Q})=>l0(w1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),H8=20,IJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=C2([]),[G,K]=C2(!1),[q,U]=C2(0),[H,z]=C2(!1),F=CJ(!1),O=CJ(!0);nQ(()=>{return O.current=!0,()=>{O.current=!1}},[]);let _=$1()==="session-selector",W=k0(!1);UX((A,T)=>{if(T.ctrl&&A==="c"||T.meta&&A==="c"){W();return}if(F.current)return;if(T.escape&&J){J();return}if(T.leftArrow||A==="h"||A==="H"){if(q>0)U((R)=>R-1);return}if(T.rightArrow||A==="l"||A==="L"){if(q<C-1)U((R)=>R+1);return}},{isActive:_}),nQ(()=>{if(Q){X(Q);return}(async()=>{K(!0);try{let T=await M0.listSessions({includeSubagents:!1});X(T)}catch(T){console.error("[SessionSelector] Failed to load sessions:",T),X([])}finally{K(!1)}})()},[Q]);let M=a$(()=>RJ(Q||Z,$),[$,Q,Z]),N=a$(()=>MJ($),[$]),k=a$(()=>{return M.map((A)=>{let T=_X(A.taskSourceProjectPath??A.projectPath),R=OX(A.lastMessageTime),L=PJ(A),f=`[${NX(A.taskStatus)}]`,E=A.gitBranch?` (${A.gitBranch})`:"",t=A.hasErrors?" [!]":"",u=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}`:"",D=yJ(A);return{key:AJ(A),label:`${f} ${L} · ${R} | ${T}${E} | ${A.messageCount} 条消息${a}${y}${I}${D}${t}${u}`,value:A}})},[M]),C=a$(()=>Math.max(1,Math.ceil(k.length/H8)),[k.length]),w=a$(()=>{let A=q*H8;return k.slice(A,A+H8)},[k,q]),v=a$(()=>({start:q*H8+1,end:Math.min((q+1)*H8,k.length)}),[q,k.length]);nQ(()=>{U(0)},[M.length]);let P=(A)=>{if(F.current)return;F.current=!0,z(!0);let T=()=>{if(!O.current)return;F.current=!1,z(!1)};Promise.resolve().then(()=>Y(A.value)).then(T,T)};if(G)return l0(i$,{flexDirection:"column",paddingX:2,paddingY:1,children:l0(w1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(M.length===0)return l0(i$,{flexDirection:"column",paddingX:2,paddingY:1,children:[l0(w1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),l0(w1,{dimColor:!0,children:[`
|
|
158
158
|
`,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return l0(i$,{flexDirection:"column",paddingX:2,paddingY:1,children:[l0(w1,{bold:!0,color:"cyan",children:N.title},void 0,!1,void 0,this),l0(w1,{dimColor:!0,children:[`
|
|
159
159
|
`,N.instructions,`
|
|
160
|
-
`]},void 0,!0,void 0,this),l0(qX,{items:w,onSelect:P,isFocused:_&&!H,indicatorComponent:NX,itemComponent:FX},void 0,!1,void 0,this),H&&l0(w1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),l0(i$,{marginTop:1,flexDirection:"column",children:[l0(w1,{dimColor:!0,children:["第 ",K+1,"/",C," 页 · 共 ",M.length," 个会话 · 显示"," ",v.start,"-",v.end]},void 0,!0,void 0,this),C>1&&l0(i$,{marginTop:1,children:[l0(w1,{color:K>0?"cyan":"gray",children:K>0?"<< 上一页":" "},void 0,!1,void 0,this),l0(w1,{children:" "},void 0,!1,void 0,this),l0(w1,{color:K<C-1?"cyan":"gray",children:K<C-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 HX}from"ink";import{jsxDEV as e}from"react/jsx-dev-runtime";function TJ({onCancel:$}){let Q=C1(),J=IJ({cwd:Q}).getAll(),Z=J.filter((K)=>K.source==="builtin"),X=J.filter((K)=>K.source==="user"),U=J.filter((K)=>K.source==="project"),G=k0(!1,$);if(HX((K,q)=>{if(q.escape)$?.();else if(q.ctrl&&K==="c"||q.meta&&K==="c")G()}),J.length===0)return e(p0,{flexDirection:"column",paddingY:1,children:[e(p0,{marginBottom:1,children:e(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(p0,{paddingLeft:2,children:e(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(p0,{marginTop:1,paddingLeft:2,children:e(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(p0,{marginTop:1,children:e(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return e(p0,{flexDirection:"column",paddingY:1,children:[e(p0,{marginBottom:1,children:[e(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),e(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U.length>0&&e(p0,{flexDirection:"column",marginBottom:1,children:[e(p0,{paddingLeft:1,children:[e(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),e(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return e(p0,{flexDirection:"column",paddingLeft:2,children:[e(T0,{children:[e(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),e(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&e(p0,{paddingLeft:2,children:e(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),e(p0,{paddingLeft:2,children:e(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&e(p0,{flexDirection:"column",marginBottom:1,children:[e(p0,{paddingLeft:1,children:[e(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),e(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return e(p0,{flexDirection:"column",paddingLeft:2,children:[e(T0,{children:[e(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),e(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&e(p0,{paddingLeft:2,children:e(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),e(p0,{paddingLeft:2,children:e(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&e(p0,{flexDirection:"column",marginBottom:1,children:[e(p0,{paddingLeft:1,children:[e(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),e(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return e(p0,{flexDirection:"column",paddingLeft:2,children:[e(T0,{children:[e(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),e(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&e(p0,{paddingLeft:2,children:e(T0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),e(p0,{marginTop:1,children:e(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 vJ,Text as u1}from"ink";import WX,{useEffect as LX,useMemo as BX,useState as fJ}from"react";import{jsxDEV as N1,Fragment as SJ}from"react/jsx-dev-runtime";var kJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function wX($){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 DJ=WX.memo(()=>{let $=Q0((q)=>q.app.subagentProgresses),Q=Q0((q)=>q.app.subagentProgress),Y=A0(),[J,Z]=fJ(0),[X,U]=fJ(()=>Date.now()),G=BX(()=>{let q=Object.values($);return q.length>0?q:Q?[Q]:[]},[Q,$]),K=G.some((q)=>q.status==="running");if(LX(()=>{if(!K){Z(0);return}let q=setInterval(()=>{Z((O)=>(O+1)%kJ.length)},80),H=setInterval(()=>{U(Date.now())},1000);return()=>{clearInterval(q),clearInterval(H)}},[K]),G.length===0)return null;return N1(vJ,{paddingX:2,paddingY:0,flexDirection:"column",children:G.map((q)=>{let H=q.status==="running"?kJ[J]:q.status==="completed"?"[OK]":"[X]",O=q.status==="running"?Y.colors.info:q.status==="completed"?Y.colors.success:Y.colors.error,F=Math.max(0,X-q.startTime);return N1(vJ,{flexDirection:"row",gap:1,children:[N1(u1,{color:O,bold:!0,children:H},void 0,!1,void 0,this),N1(u1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),N1(u1,{color:Y.colors.text.primary,bold:!0,children:q.type},void 0,!1,void 0,this),N1(u1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(u1,{color:Y.colors.text.secondary,children:q.description},void 0,!1,void 0,this),q.currentTool&&N1(SJ,{children:[N1(u1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(u1,{color:Y.colors.warning,children:q.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="running"&&F>0&&N1(SJ,{children:[N1(u1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(u1,{color:Y.colors.info,children:wX(F)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},q.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as bX}from"ahooks";import{Box as f1,Text as d,useInput as AX}from"ink";import PX from"ink-select-input";import{useState as VJ}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var jJ=M$.map(($)=>({label:$.label,value:$.id})),yX=({theme:$})=>{let{colors:Q}=$;return c(f1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(d,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),c(d,{children:[c(d,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),c(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),c(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{color:Q.error,children:["- print(",c(d,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),c(d,{color:Q.success,children:["+ print(",c(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)},RX=({theme:$})=>{let{colors:Q}=$;return c(f1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(d,{children:" "},void 0,!1,void 0,this),c(d,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),c(d,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),c(d,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),c(d,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),c(d,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),c(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)},hJ=()=>{let $=a1(),Q=d0.getCurrentThemeName(),Y=M$.findIndex((B)=>B.label===Q),J=Y>=0?M$[Y].theme:M$[0].theme,[Z,X]=VJ(J),[U,G]=VJ(!1),K=bX(async(B)=>{if(U)return;G(!0);try{await m0().setTheme(B.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{G(!1)}}),q=(B)=>{let _=M$.find((W)=>W.id===B.value);if(_)X(_.theme)},O=$1()==="theme-selector",F=k0(!1);AX((B,_)=>{if(_.ctrl&&B==="c"||_.meta&&B==="c"){F();return}if(_.escape&&!U)$.closeModal()},{isActive:O});let z=(B)=>{let{isSelected:_,label:W}=B,N=W===Q?"[OK]":" ";return c(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[N," ",W]},void 0,!0,void 0,this)};return c(f1,{flexDirection:"column",height:"100%",children:[c(f1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:c(d,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(f1,{flexDirection:"row",flexGrow:1,children:[c(f1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:c(f1,{flexDirection:"column",children:[c(f1,{paddingTop:1,paddingBottom:1,children:c(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",jJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(PX,{items:jJ,initialIndex:Y>=0?Y:0,onSelect:K,onHighlight:q,itemComponent:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(f1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[c(yX,{theme:Z},void 0,!1,void 0,this),c(RX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(f1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:c(d,{color:Z.colors.text.muted,children:U?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as R0}from"react/jsx-dev-runtime";var K1=o1("UI"),mJ=({debug:$,continue:Q,...Y})=>{if($)K1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=C2(!1),Z=C2(!1),X=C2(!1),U=C2(null),G=Y4(),K=Z4(),q=P8(),H=G4(),O=U4(),F=a1(),z=r1(),B=v$(),_=C1(),W=_4(),M=f$(),N=i1(),k=z4();K$(()=>{if(d0.getCurrentThemeName()!==k)try{d0.setTheme(k)}catch{}},[k]);let C=G==="ready",w=G==="needsSetup",v=G==="idle",P=MX(()=>Y.agents?gJ(Y.agents):void 0,[Y.agents]),{confirmationState:A,confirmationHandler:T,handleResponse:R,dismissAll:L}=r4(),{executeCommand:f,handleAbort:E,cleanupAgent:t}=x4(Y.systemPrompt,Y.appendSystemPrompt,T,Y.maxTurns,L,P),{getPreviousCommand:u,getNextCommand:a,addToHistory:I}=l4();K6();let y=i4("",0),D=t0(async()=>{let r=M,U0;if(r==="default")U0="autoEdit";else if(r==="autoEdit")U0="plan";else if(r==="plan")U0="default";else U0="default";try{await M0.setSessionPermissionMode(B,_,U0),await m0().setPermissionMode(U0)}catch(f0){K1.error("权限模式切换失败:",f0 instanceof Error?f0.message:f0)}}),b=t0(async(r)=>{try{let U0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await m0().addModelWithProvider(U0,r.modelProvider);else await m0().addModel(U0);F.setInitializationStatus("ready")}catch(U0){throw K1.error("初始化配置保存失败:",U0 instanceof Error?U0.message:U0),U0}}),h=t0(()=>{if(q==="shortcuts")F.closeModal();else F.setActiveModal("shortcuts")}),S=t0(async(r,U0,f0)=>{return E8({intent:U0,session:r,newSessionId:f0?.newSessionId,announceFork:f0?.announceFork,permissionModeOverride:Y.permissionMode},_,z,t)}),x=t0(async(r,U0)=>{let S1=(await h8(U0,_)).filter((g0)=>g0.sessionId===r);if(S1.length===0)throw Error(`Session not found: ${r}`);if(S1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return S1[0]}),{showSuggestions:V,suggestions:l,selectedSuggestionIndex:G0}=G6(y,f,u,a,I,E,N,D,h,q==="shortcuts");K$(()=>{if(y.value&&q==="shortcuts")F.closeModal()},[y.value,q,F]);let Z0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",U0=await h8(r,_);if(U0.length===0){if(Y.forkSession){K1.error("没有可供 fork 的历史会话"),I1(1);return}z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let f0=U0[0];await S(f0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(K1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){I1(1);return}z.addAssistantMessage("继续会话失败,开始新对话。")}}),P0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let f0=Y.forkSession?"fork":"resume",w8=await x(Y.resume,f0);await S(w8,f0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",U0=await h8(r,_);if(U0.length===0)K1.error("没有找到历史会话"),I1(1);F.showSessionSelector(U0,r)}catch(r){K1.error("[BladeInterface] 加载会话失败:",r),I1(1)}});K$(()=>{if(J.current)return;if(Q){J.current=!0,Z0();return}if(Y.resume)J.current=!0,P0()},[Q,Y.resume,Z0,P0]);let B0=t0(async(r)=>{let U0=A.details?.type;if(U0==="enterPlanMode"&&r.approved)try{await M0.setSessionPermissionMode(B,_,"plan"),await m0().setPermissionMode("plan"),K1.debug("[BladeInterface] Entered Plan mode")}catch(f0){K1.error("[BladeInterface] Failed to enter Plan mode:",f0)}if(U0==="exitPlanMode"&&r.approved)K1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");R(r)}),s0=t0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),I1(0)}),c0=t0(()=>{F.closeModal()}),F1=t0(async(r)=>{try{await S(r,H?.intent??"resume"),F.closeModal()}catch(U0){K1.error("[BladeInterface] Failed to restore session:",U0),z.addAssistantMessage(`会话操作失败: ${U0 instanceof Error?U0.message:"未知错误"}`),F.closeModal()}}),M1=t0(()=>{if(Y.resume)I1(0);else F.closeModal()}),I$=t0((r)=>{F.showModelEditWizard(r)}),e0=t0((r)=>{z.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),c0()}),k2=t0((r)=>{z.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),c0()});K$(()=>{if(w){W.setFocus("model-config-wizard");return}if(A.isVisible)W.setFocus("confirmation-prompt");else if(q==="sessionSelector")W.setFocus("session-selector");else if(q==="themeSelector")W.setFocus("theme-selector");else if(q==="modelSelector")W.setFocus("model-selector");else if(q==="modelAddWizard"||q==="modelEditWizard")W.setFocus("model-config-wizard");else if(q==="permissionsManager")W.setFocus("permissions-manager");else if(q==="agentsManager")W.setFocus("agents-manager");else if(q==="agentCreationWizard")W.setFocus("agent-creation-wizard");else if(q==="hooksManager")W.setFocus("hooks-manager");else if(q==="shortcuts")W.setFocus("main-input");else W.setFocus("main-input")},[w,A.isVisible,q,W.setFocus]),K$(()=>{if(!C||X.current)return;if(EJ().length>0){X.current=!0;return}X.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[C]),K$(()=>{if(!K)return;if(U.current===K)return;if(U.current=K,G==="error")z.addAssistantMessage(`初始化失败: ${K}`);else z.addAssistantMessage(`${K}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,G,z.addAssistantMessage]);let O$=t0(async(r)=>{try{await f({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(U0){let f0=U0 instanceof Error?U0.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${f0}`)}});K$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!C||w)return;Z.current=!0,I(r),O$(r)},[Y.initialMessage,C,w,f,I]);let S2=t0(async(r)=>{try{await m0().setPermissionMode(r)}catch(U0){K1.error("权限模式初始化失败:",U0 instanceof Error?U0.message:U0)}});if(K$(()=>{let r=Y.permissionMode;if($)K1.debug("[Debug] permissionMode from CLI:",r),K1.debug("[Debug] current permissionMode:",M);if(!r||r===M)return;S2(r)},[Y.permissionMode,M]),v)return null;if(w)return R0(rQ,{mode:"setup",onComplete:b,onCancel:s0},void 0,!1,void 0,this);if($)K1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:A.isVisible,activeModal:q});let K0=q==="modelSelector",v0=O,$0=q==="modelAddWizard"?"add":q==="modelEditWizard"&&v0?"edit":null,_0=K0||Boolean($0),x0=q==="agentsManager",i0=q==="agentCreationWizard",h0=q==="skillsManager",D2=q==="pluginsManager",t$=v0?{displayName:v0.displayName,provider:v0.provider,model:v0.model,overrides:v0.overrides}:void 0,L8=A.isVisible&&A.details?A.details.type==="mcpElicitation"&&A.details.mcpElicitation?R0(I9,{details:A.details.mcpElicitation,onComplete:(r,U0)=>B0({approved:r.action==="accept",elicitation:r,...U0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):A.details.type==="askUserQuestion"&&A.details.questions?R0(wJ,{questions:A.details.questions,onComplete:(r)=>B0({approved:!0,answers:r}),onCancel:()=>B0({approved:!1})},void 0,!1,void 0,this):R0(o6,{details:A.details,onResponse:B0},void 0,!1,void 0,this):q==="themeSelector"?R0(hJ,{},void 0,!1,void 0,this):q==="permissionsManager"?R0(OJ,{onClose:c0},void 0,!1,void 0,this):q==="sessionSelector"?R0(CJ,{intent:H?.intent??"resume",sessions:H?.sessions,onSelect:F1,onCancel:M1},void 0,!1,void 0,this):q==="hooksManager"?R0(t6,{workspaceRoot:_,sessionId:B,onClose:c0},void 0,!1,void 0,this):null,B8=Boolean(L8);return R0(G$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[L8,R0(G$,{flexDirection:"column",display:B8?"none":"flex",children:[R0(u9,{},void 0,!1,void 0,this),R0(DJ,{},void 0,!1,void 0,this),R0(y9,{paused:B8},void 0,!1,void 0,this),R0(W9,{input:y.value,cursorPosition:y.cursorPosition,onChange:y.setValue,onChangeCursorPosition:y.setCursorPosition,onAddPasteMapping:y.addPasteMapping,onAddImagePasteMapping:y.addImagePasteMapping},void 0,!1,void 0,this),K0&&R0(G$,{marginTop:1,paddingX:2,children:R0(l9,{onClose:c0,onEdit:I$},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0&&R0(G$,{marginTop:1,paddingX:2,children:R0(rQ,{mode:$0,modelId:v0?.id,initialConfig:$0==="edit"?t$:void 0,onComplete:$0==="edit"?k2:e0,onCancel:c0},void 0,!1,void 0,this)},void 0,!1,void 0,this),x0&&R0(G$,{marginTop:1,paddingX:2,children:R0(F6,{workspaceRoot:_,onComplete:c0,onCancel:c0},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0&&R0(G$,{marginTop:1,paddingX:2,children:R0(U8,{onComplete:c0,onCancel:c0},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0&&R0(G$,{marginTop:1,paddingX:2,children:R0(TJ,{onComplete:c0,onCancel:c0},void 0,!1,void 0,this)},void 0,!1,void 0,this),D2&&R0(G$,{marginTop:1,paddingX:2,children:R0(LJ,{workspaceRoot:_,onComplete:c0,onCancel:c0},void 0,!1,void 0,this)},void 0,!1,void 0,this),R0(b6,{suggestions:l,selectedIndex:G0,visible:V&&!_0},void 0,!1,void 0,this),R0(w6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as CX,Text as q$}from"ink";import IX from"react";import{jsxDEV as l1}from"react/jsx-dev-runtime";class W8 extends IX.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 l1(CX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[l1(q$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),l1(q$,{children:" "},void 0,!1,void 0,this),l1(q$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),l1(q$,{children:" "},void 0,!1,void 0,this),l1(q$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),l1(q$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),l1(q$,{children:" "},void 0,!1,void 0,this),l1(q$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as C$,Text as d1,useInput as TX}from"ink";import{useState as nQ}from"react";import{jsxDEV as X1}from"react/jsx-dev-runtime";var I2=[{key:"update",label:"Update now",description:`runs \`${cJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],uJ=({versionInfo:$,onComplete:Q})=>{let[Y,J]=nQ(0),[Z,X]=nQ(!1),[U,G]=nQ(null);TX((q,H)=>{if(H.ctrl&&q==="c"){Z8().shutdown("SIGINT",0);return}if(Z||U)return;if(H.upArrow||q==="k")J((O)=>O>0?O-1:I2.length-1);else if(H.downArrow||q==="j")J((O)=>O<I2.length-1?O+1:0);else if(H.return)K(I2[Y].key);else if(q==="1")K("update");else if(q==="2")K("skip");else if(q==="3")K("skip_until_next")});let K=async(q)=>{switch(q){case"update":{X(!0);let H=await xJ();G(H.message),setTimeout(()=>{Z8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await pJ($.latestVersion);Q();break}};if(U)return X1(C$,{flexDirection:"column",marginY:1,children:X1(d1,{children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return X1(C$,{flexDirection:"column",marginY:1,children:X1(d1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X1(C$,{flexDirection:"column",marginY:1,children:[X1(d1,{color:"yellow",bold:!0,children:["Update available! ",X1(d1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X1(C$,{marginTop:1,children:X1(d1,{color:"gray",children:["Release notes:"," ",X1(d1,{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(C$,{flexDirection:"column",marginTop:1,children:I2.map((q,H)=>{let O=H===Y,F=O?"› ":" ",z=`${H+1}. `;return X1(C$,{children:X1(d1,{color:O?"cyan":void 0,children:[F,z,q.label,q.description&&X1(d1,{color:"gray",children:[" (",q.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},q.key,!1,void 0,this)})},void 0,!1,void 0,this),X1(C$,{marginTop:1,children:X1(d1,{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 T2,Text as o$,useInput as vX}from"ink";import{useState as lJ}from"react";import{jsxDEV as k1}from"react/jsx-dev-runtime";var dJ=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=d0.getTheme(),[Z,X]=lJ(!1),[U,G]=lJ(null);return vX((K,q)=>{if(Z)return;if(q.return||K.toLowerCase()==="t"){X(!0),G(null),Q().catch((H)=>{G(H instanceof Error?H.message:"Failed to trust workspace"),X(!1)});return}if(K.toLowerCase()==="s"||q.escape)X(!0),G(null),Y().catch((H)=>{G(H instanceof Error?H.message:"Failed to continue safely"),X(!1)})}),k1(T2,{flexDirection:"column",paddingX:1,children:[k1(o$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),k1(o$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),k1(T2,{marginTop:1,flexDirection:"column",children:[k1(o$,{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((K)=>k1(o$,{children:[" ",K.path," · ",K.effects.length," effect(s)"]},`${K.kind}:${K.path}`,!0,void 0,this))]},void 0,!0,void 0,this),U&&k1(T2,{marginTop:1,children:k1(o$,{color:J.colors.error,children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),k1(T2,{marginTop:1,children:k1(o$,{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 fX}from"ink";import{useEffect as kX}from"react";function rJ(){let{stdout:$}=fX();kX(()=>{if(!$.isTTY)return;return $.write($9),$.write(TQ),()=>{$.write(Q9),$.write(TQ)}},[$])}function aJ($){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 n$}from"react/jsx-dev-runtime";function DX($){if(Q1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");r0().setInitializationStatus("ready")}var aF=($)=>{rJ();let[Q,Y]=f2(!1),[J,Z]=f2(null),[X,U]=f2(!1),[G,K]=f2(null),q=v2((z,B)=>{let _=z instanceof Error?z.message:String(z);if(r0().setInitializationError(_),r0().setInitializationStatus("error"),Y(!0),B)console.error("[FAIL] 应用初始化失败:",_)}),H=v2(async()=>{try{let z=Q1().config.config??oJ,B=nJ(z,$);if(DX(B),B.resumeSessionId)tJ().restoreSession(B.resumeSessionId,[]);if(B.debug)console.error("[Debug] 运行时配置:",B);let _=B.theme;if(_&&d0.hasTheme(_)){if(d0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{q1.getInstance().loadConfig(B.hooks||{},u0());let M=await sJ(u0());if($.debug&&B.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${M.subagents.getAllNames().length} agents, ${M.skills.size} skills, ${M.commands.getCommandCount()+M.commands.getPluginCommandCount()} commands, ${M.plugins.getAll().length} plugins`);let k=Q1().session.sessionId;iJ(k)}catch(W){if($.debug)console.warn("Hooks 初始化失败:",aJ(W))}p8(async()=>{await $Y.getInstance().killAll(),await eJ.getInstance().disconnectAll(),q1.getInstance().cleanup()}),Y(!0)}catch(z){q(z,!!$.debug)}}),O=v2(async()=>{let z=await tQ.getInstance().getStatus(u0());if(z.state==="untrusted"||z.state==="error"){K(z);return}await H()}),F=v2(async()=>{if($.versionCheckPromise){let z=await $.versionCheckPromise;if(z){Z(z),U(!0);return}}await O()});if(SX(()=>{F()},[]),X&&J)return n$(W8,{children:n$(uJ,{versionInfo:J,onComplete:()=>{U(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(G)return n$(W8,{children:n$(dJ,{status:G,onTrust:async()=>{await tQ.getInstance().trust(u0()),await QY(),K(null),await H()},onContinueSafely:async()=>{K(null),await H()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return n$(W8,{children:n$(mJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{aF as AppWrapper};
|
|
160
|
+
`]},void 0,!0,void 0,this),l0(zX,{items:w,onSelect:P,isFocused:_&&!H,indicatorComponent:FX,itemComponent:HX},void 0,!1,void 0,this),H&&l0(w1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),l0(i$,{marginTop:1,flexDirection:"column",children:[l0(w1,{dimColor:!0,children:["第 ",q+1,"/",C," 页 · 共 ",M.length," 个会话 · 显示"," ",v.start,"-",v.end]},void 0,!0,void 0,this),C>1&&l0(i$,{marginTop:1,children:[l0(w1,{color:q>0?"cyan":"gray",children:q>0?"<< 上一页":" "},void 0,!1,void 0,this),l0(w1,{children:" "},void 0,!1,void 0,this),l0(w1,{color:q<C-1?"cyan":"gray",children:q<C-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 WX}from"ink";import{jsxDEV as e}from"react/jsx-dev-runtime";function vJ({onCancel:$}){let Q=C1(),J=TJ({cwd:Q}).getAll(),Z=J.filter((q)=>q.source==="builtin"),X=J.filter((q)=>q.source==="user"),G=J.filter((q)=>q.source==="project"),K=k0(!1,$);if(WX((q,U)=>{if(U.escape)$?.();else if(U.ctrl&&q==="c"||U.meta&&q==="c")K()}),J.length===0)return e(p0,{flexDirection:"column",paddingY:1,children:[e(p0,{marginBottom:1,children:e(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(p0,{paddingLeft:2,children:e(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(p0,{marginTop:1,paddingLeft:2,children:e(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(p0,{marginTop:1,children:e(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return e(p0,{flexDirection:"column",paddingY:1,children:[e(p0,{marginBottom:1,children:[e(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),e(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&e(p0,{flexDirection:"column",marginBottom:1,children:[e(p0,{paddingLeft:1,children:[e(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),e(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((q)=>{let H=q.description.length>80?`${q.description.substring(0,80)}...`:q.description;return e(p0,{flexDirection:"column",paddingLeft:2,children:[e(T0,{children:[e(T0,{bold:!0,color:"green",children:["• ",q.name]},void 0,!0,void 0,this),e(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.allowedTools&&q.allowedTools.length>0&&e(p0,{paddingLeft:2,children:e(T0,{color:"gray",children:["工具: ",q.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),e(p0,{paddingLeft:2,children:e(T0,{color:"gray",dimColor:!0,children:q.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},q.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&e(p0,{flexDirection:"column",marginBottom:1,children:[e(p0,{paddingLeft:1,children:[e(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),e(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((q)=>{let H=q.description.length>80?`${q.description.substring(0,80)}...`:q.description;return e(p0,{flexDirection:"column",paddingLeft:2,children:[e(T0,{children:[e(T0,{bold:!0,color:"green",children:["• ",q.name]},void 0,!0,void 0,this),e(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.allowedTools&&q.allowedTools.length>0&&e(p0,{paddingLeft:2,children:e(T0,{color:"gray",children:["工具: ",q.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),e(p0,{paddingLeft:2,children:e(T0,{color:"gray",dimColor:!0,children:q.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},q.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&e(p0,{flexDirection:"column",marginBottom:1,children:[e(p0,{paddingLeft:1,children:[e(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),e(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((q)=>{let H=q.description.length>80?`${q.description.substring(0,80)}...`:q.description;return e(p0,{flexDirection:"column",paddingLeft:2,children:[e(T0,{children:[e(T0,{bold:!0,color:"green",children:["• ",q.name]},void 0,!0,void 0,this),e(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.userInvocable&&e(p0,{paddingLeft:2,children:e(T0,{color:"blue",children:["命令: /",q.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},q.name,!0,void 0,this)})]},void 0,!0,void 0,this),e(p0,{marginTop:1,children:e(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 fJ,Text as u1}from"ink";import LX,{useEffect as BX,useMemo as wX,useState as kJ}from"react";import{jsxDEV as N1,Fragment as DJ}from"react/jsx-dev-runtime";var SJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function bX($){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 VJ=LX.memo(()=>{let $=Q0((U)=>U.app.subagentProgresses),Q=Q0((U)=>U.app.subagentProgress),Y=A0(),[J,Z]=kJ(0),[X,G]=kJ(()=>Date.now()),K=wX(()=>{let U=Object.values($);return U.length>0?U:Q?[Q]:[]},[Q,$]),q=K.some((U)=>U.status==="running");if(BX(()=>{if(!q){Z(0);return}let U=setInterval(()=>{Z((z)=>(z+1)%SJ.length)},80),H=setInterval(()=>{G(Date.now())},1000);return()=>{clearInterval(U),clearInterval(H)}},[q]),K.length===0)return null;return N1(fJ,{paddingX:2,paddingY:0,flexDirection:"column",children:K.map((U)=>{let H=U.status==="running"?SJ[J]:U.status==="completed"?"[OK]":"[X]",z=U.status==="running"?Y.colors.info:U.status==="completed"?Y.colors.success:Y.colors.error,F=Math.max(0,X-U.startTime);return N1(fJ,{flexDirection:"row",gap:1,children:[N1(u1,{color:z,bold:!0,children:H},void 0,!1,void 0,this),N1(u1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),N1(u1,{color:Y.colors.text.primary,bold:!0,children:U.type},void 0,!1,void 0,this),N1(u1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(u1,{color:Y.colors.text.secondary,children:U.description},void 0,!1,void 0,this),U.currentTool&&N1(DJ,{children:[N1(u1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(u1,{color:Y.colors.warning,children:U.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="running"&&F>0&&N1(DJ,{children:[N1(u1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(u1,{color:Y.colors.info,children:bX(F)},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 AX}from"ahooks";import{Box as f1,Text as d,useInput as PX}from"ink";import yX from"ink-select-input";import{useState as jJ}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var hJ=M$.map(($)=>({label:$.label,value:$.id})),RX=({theme:$})=>{let{colors:Q}=$;return c(f1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(d,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),c(d,{children:[c(d,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),c(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),c(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{color:Q.error,children:["- print(",c(d,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),c(d,{color:Q.success,children:["+ print(",c(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)},MX=({theme:$})=>{let{colors:Q}=$;return c(f1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(d,{children:" "},void 0,!1,void 0,this),c(d,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),c(d,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),c(d,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),c(d,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),c(d,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),c(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)},EJ=()=>{let $=a1(),Q=d0.getCurrentThemeName(),Y=M$.findIndex((B)=>B.label===Q),J=Y>=0?M$[Y].theme:M$[0].theme,[Z,X]=jJ(J),[G,K]=jJ(!1),q=AX(async(B)=>{if(G)return;K(!0);try{await m0().setTheme(B.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{K(!1)}}),U=(B)=>{let _=M$.find((W)=>W.id===B.value);if(_)X(_.theme)},z=$1()==="theme-selector",F=k0(!1);PX((B,_)=>{if(_.ctrl&&B==="c"||_.meta&&B==="c"){F();return}if(_.escape&&!G)$.closeModal()},{isActive:z});let O=(B)=>{let{isSelected:_,label:W}=B,N=W===Q?"[OK]":" ";return c(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[N," ",W]},void 0,!0,void 0,this)};return c(f1,{flexDirection:"column",height:"100%",children:[c(f1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:c(d,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(f1,{flexDirection:"row",flexGrow:1,children:[c(f1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:c(f1,{flexDirection:"column",children:[c(f1,{paddingTop:1,paddingBottom:1,children:c(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",hJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(yX,{items:hJ,initialIndex:Y>=0?Y:0,onSelect:q,onHighlight:U,itemComponent:O},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(f1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[c(RX,{theme:Z},void 0,!1,void 0,this),c(MX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(f1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:c(d,{color:Z.colors.text.muted,children:G?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as R0}from"react/jsx-dev-runtime";var q1=o1("UI"),pJ=({debug:$,continue:Q,...Y})=>{if($)q1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=I2(!1),Z=I2(!1),X=I2(!1),G=I2(null),K=Z4(),q=X4(),U=P8(),H=q4(),z=K4(),F=a1(),O=r1(),B=v$(),_=C1(),W=N4(),M=f$(),N=i1(),k=_4();q$(()=>{if(d0.getCurrentThemeName()!==k)try{d0.setTheme(k)}catch{}},[k]);let C=K==="ready",w=K==="needsSetup",v=K==="idle",P=CX(()=>Y.agents?mJ(Y.agents):void 0,[Y.agents]),{confirmationState:A,confirmationHandler:T,handleResponse:R,dismissAll:L}=a4(),{executeCommand:f,handleAbort:E,cleanupAgent:t}=u4(Y.systemPrompt,Y.appendSystemPrompt,T,Y.maxTurns,L,P),{getPreviousCommand:u,getNextCommand:a,addToHistory:I}=d4();U6();let y=o4("",0),D=t0(async()=>{let r=M,G0;if(r==="default")G0="autoEdit";else if(r==="autoEdit")G0="plan";else if(r==="plan")G0="default";else G0="default";try{await M0.setSessionPermissionMode(B,_,G0),await m0().setPermissionMode(G0)}catch(f0){q1.error("权限模式切换失败:",f0 instanceof Error?f0.message:f0)}}),b=t0(async(r)=>{try{let G0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await m0().addModelWithProvider(G0,r.modelProvider);else await m0().addModel(G0);F.setInitializationStatus("ready")}catch(G0){throw q1.error("初始化配置保存失败:",G0 instanceof Error?G0.message:G0),G0}}),h=t0(()=>{if(U==="shortcuts")F.closeModal();else F.setActiveModal("shortcuts")}),S=t0(async(r,G0,f0)=>{return g8({intent:G0,session:r,newSessionId:f0?.newSessionId,announceFork:f0?.announceFork,permissionModeOverride:Y.permissionMode},_,O,t)}),x=t0(async(r,G0)=>{let S1=(await E8(G0,_)).filter((g0)=>g0.sessionId===r);if(S1.length===0)throw Error(`Session not found: ${r}`);if(S1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return S1[0]}),{showSuggestions:V,suggestions:l,selectedSuggestionIndex:K0}=q6(y,f,u,a,I,E,N,D,h,U==="shortcuts");q$(()=>{if(y.value&&U==="shortcuts")F.closeModal()},[y.value,U,F]);let Z0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",G0=await E8(r,_);if(G0.length===0){if(Y.forkSession){q1.error("没有可供 fork 的历史会话"),I1(1);return}O.addAssistantMessage("没有找到历史会话,开始新对话。");return}let f0=G0[0];await S(f0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(q1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){I1(1);return}O.addAssistantMessage("继续会话失败,开始新对话。")}}),P0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let f0=Y.forkSession?"fork":"resume",w8=await x(Y.resume,f0);await S(w8,f0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",G0=await E8(r,_);if(G0.length===0)q1.error("没有找到历史会话"),I1(1);F.showSessionSelector(G0,r)}catch(r){q1.error("[BladeInterface] 加载会话失败:",r),I1(1)}});q$(()=>{if(J.current)return;if(Q){J.current=!0,Z0();return}if(Y.resume)J.current=!0,P0()},[Q,Y.resume,Z0,P0]);let B0=t0(async(r)=>{let G0=A.details?.type;if(G0==="enterPlanMode"&&r.approved)try{await M0.setSessionPermissionMode(B,_,"plan"),await m0().setPermissionMode("plan"),q1.debug("[BladeInterface] Entered Plan mode")}catch(f0){q1.error("[BladeInterface] Failed to enter Plan mode:",f0)}if(G0==="exitPlanMode"&&r.approved)q1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");R(r)}),s0=t0(()=>{O.addAssistantMessage("设置已取消"),O.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),O.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),I1(0)}),c0=t0(()=>{F.closeModal()}),F1=t0(async(r)=>{try{await S(r,H?.intent??"resume"),F.closeModal()}catch(G0){q1.error("[BladeInterface] Failed to restore session:",G0),O.addAssistantMessage(`会话操作失败: ${G0 instanceof Error?G0.message:"未知错误"}`),F.closeModal()}}),M1=t0(()=>{if(Y.resume)I1(0);else F.closeModal()}),I$=t0((r)=>{F.showModelEditWizard(r)}),e0=t0((r)=>{O.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),c0()}),S2=t0((r)=>{O.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),c0()});q$(()=>{if(w){W.setFocus("model-config-wizard");return}if(A.isVisible)W.setFocus("confirmation-prompt");else if(U==="sessionSelector")W.setFocus("session-selector");else if(U==="themeSelector")W.setFocus("theme-selector");else if(U==="modelSelector")W.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")W.setFocus("model-config-wizard");else if(U==="permissionsManager")W.setFocus("permissions-manager");else if(U==="agentsManager")W.setFocus("agents-manager");else if(U==="agentCreationWizard")W.setFocus("agent-creation-wizard");else if(U==="hooksManager")W.setFocus("hooks-manager");else if(U==="shortcuts")W.setFocus("main-input");else W.setFocus("main-input")},[w,A.isVisible,U,W.setFocus]),q$(()=>{if(!C||X.current)return;if(gJ().length>0){X.current=!0;return}X.current=!0,O.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[C]),q$(()=>{if(!q)return;if(G.current===q)return;if(G.current=q,K==="error")O.addAssistantMessage(`初始化失败: ${q}`);else O.addAssistantMessage(`${q}`),O.addAssistantMessage("请重新尝试设置,或检查文件权限")},[q,K,O.addAssistantMessage]);let z$=t0(async(r)=>{try{await f({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(G0){let f0=G0 instanceof Error?G0.message:"无法发送初始消息";O.addAssistantMessage(`初始消息发送失败:${f0}`)}});q$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!C||w)return;Z.current=!0,I(r),z$(r)},[Y.initialMessage,C,w,f,I]);let D2=t0(async(r)=>{try{await m0().setPermissionMode(r)}catch(G0){q1.error("权限模式初始化失败:",G0 instanceof Error?G0.message:G0)}});if(q$(()=>{let r=Y.permissionMode;if($)q1.debug("[Debug] permissionMode from CLI:",r),q1.debug("[Debug] current permissionMode:",M);if(!r||r===M)return;D2(r)},[Y.permissionMode,M]),v)return null;if(w)return R0(aQ,{mode:"setup",onComplete:b,onCancel:s0},void 0,!1,void 0,this);if($)q1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:A.isVisible,activeModal:U});let q0=U==="modelSelector",v0=z,$0=U==="modelAddWizard"?"add":U==="modelEditWizard"&&v0?"edit":null,_0=q0||Boolean($0),x0=U==="agentsManager",i0=U==="agentCreationWizard",h0=U==="skillsManager",V2=U==="pluginsManager",t$=v0?{displayName:v0.displayName,provider:v0.provider,model:v0.model,overrides:v0.overrides}:void 0,L8=A.isVisible&&A.details?A.details.type==="mcpElicitation"&&A.details.mcpElicitation?R0(T9,{details:A.details.mcpElicitation,onComplete:(r,G0)=>B0({approved:r.action==="accept",elicitation:r,...G0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):A.details.type==="askUserQuestion"&&A.details.questions?R0(bJ,{questions:A.details.questions,onComplete:(r)=>B0({approved:!0,answers:r}),onCancel:()=>B0({approved:!1})},void 0,!1,void 0,this):R0(n6,{details:A.details,onResponse:B0},void 0,!1,void 0,this):U==="themeSelector"?R0(EJ,{},void 0,!1,void 0,this):U==="permissionsManager"?R0(OJ,{onClose:c0},void 0,!1,void 0,this):U==="sessionSelector"?R0(IJ,{intent:H?.intent??"resume",sessions:H?.sessions,onSelect:F1,onCancel:M1},void 0,!1,void 0,this):U==="hooksManager"?R0(s6,{workspaceRoot:_,sessionId:B,onClose:c0},void 0,!1,void 0,this):null,B8=Boolean(L8);return R0(K$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[L8,R0(K$,{flexDirection:"column",display:B8?"none":"flex",children:[R0(l9,{},void 0,!1,void 0,this),R0(VJ,{},void 0,!1,void 0,this),R0(R9,{paused:B8},void 0,!1,void 0,this),R0(L9,{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&&R0(K$,{marginTop:1,paddingX:2,children:R0(d9,{onClose:c0,onEdit:I$},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0&&R0(K$,{marginTop:1,paddingX:2,children:R0(aQ,{mode:$0,modelId:v0?.id,initialConfig:$0==="edit"?t$:void 0,onComplete:$0==="edit"?S2:e0,onCancel:c0},void 0,!1,void 0,this)},void 0,!1,void 0,this),x0&&R0(K$,{marginTop:1,paddingX:2,children:R0(H6,{workspaceRoot:_,onComplete:c0,onCancel:c0},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0&&R0(K$,{marginTop:1,paddingX:2,children:R0(G8,{onComplete:c0,onCancel:c0},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0&&R0(K$,{marginTop:1,paddingX:2,children:R0(vJ,{onComplete:c0,onCancel:c0},void 0,!1,void 0,this)},void 0,!1,void 0,this),V2&&R0(K$,{marginTop:1,paddingX:2,children:R0(BJ,{workspaceRoot:_,onComplete:c0,onCancel:c0},void 0,!1,void 0,this)},void 0,!1,void 0,this),R0(A6,{suggestions:l,selectedIndex:K0,visible:V&&!_0},void 0,!1,void 0,this),R0(b6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as IX,Text as U$}from"ink";import TX from"react";import{jsxDEV as l1}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 l1(IX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[l1(U$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),l1(U$,{children:" "},void 0,!1,void 0,this),l1(U$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),l1(U$,{children:" "},void 0,!1,void 0,this),l1(U$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),l1(U$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),l1(U$,{children:" "},void 0,!1,void 0,this),l1(U$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as C$,Text as d1,useInput as vX}from"ink";import{useState as tQ}from"react";import{jsxDEV as X1}from"react/jsx-dev-runtime";var T2=[{key:"update",label:"Update now",description:`runs \`${xJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],lJ=({versionInfo:$,onComplete:Q})=>{let[Y,J]=tQ(0),[Z,X]=tQ(!1),[G,K]=tQ(null);vX((U,H)=>{if(H.ctrl&&U==="c"){Z8().shutdown("SIGINT",0);return}if(Z||G)return;if(H.upArrow||U==="k")J((z)=>z>0?z-1:T2.length-1);else if(H.downArrow||U==="j")J((z)=>z<T2.length-1?z+1:0);else if(H.return)q(T2[Y].key);else if(U==="1")q("update");else if(U==="2")q("skip");else if(U==="3")q("skip_until_next")});let q=async(U)=>{switch(U){case"update":{X(!0);let H=await uJ();K(H.message),setTimeout(()=>{Z8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await cJ($.latestVersion);Q();break}};if(G)return X1(C$,{flexDirection:"column",marginY:1,children:X1(d1,{children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return X1(C$,{flexDirection:"column",marginY:1,children:X1(d1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X1(C$,{flexDirection:"column",marginY:1,children:[X1(d1,{color:"yellow",bold:!0,children:["Update available! ",X1(d1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X1(C$,{marginTop:1,children:X1(d1,{color:"gray",children:["Release notes:"," ",X1(d1,{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(C$,{flexDirection:"column",marginTop:1,children:T2.map((U,H)=>{let z=H===Y,F=z?"› ":" ",O=`${H+1}. `;return X1(C$,{children:X1(d1,{color:z?"cyan":void 0,children:[F,O,U.label,U.description&&X1(d1,{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(C$,{marginTop:1,children:X1(d1,{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 v2,Text as o$,useInput as fX}from"ink";import{useState as dJ}from"react";import{jsxDEV as k1}from"react/jsx-dev-runtime";var rJ=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=d0.getTheme(),[Z,X]=dJ(!1),[G,K]=dJ(null);return fX((q,U)=>{if(Z)return;if(U.return||q.toLowerCase()==="t"){X(!0),K(null),Q().catch((H)=>{K(H instanceof Error?H.message:"Failed to trust workspace"),X(!1)});return}if(q.toLowerCase()==="s"||U.escape)X(!0),K(null),Y().catch((H)=>{K(H instanceof Error?H.message:"Failed to continue safely"),X(!1)})}),k1(v2,{flexDirection:"column",paddingX:1,children:[k1(o$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),k1(o$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),k1(v2,{marginTop:1,flexDirection:"column",children:[k1(o$,{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((q)=>k1(o$,{children:[" ",q.path," · ",q.effects.length," effect(s)"]},`${q.kind}:${q.path}`,!0,void 0,this))]},void 0,!0,void 0,this),G&&k1(v2,{marginTop:1,children:k1(o$,{color:J.colors.error,children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),k1(v2,{marginTop:1,children:k1(o$,{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 kX}from"ink";import{useEffect as SX}from"react";function aJ(){let{stdout:$}=kX();SX(()=>{if(!$.isTTY)return;return $.write(Q9),$.write(vQ),()=>{$.write(J9),$.write(vQ)}},[$])}function iJ($){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 n$}from"react/jsx-dev-runtime";function VX($){if(Q1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");r0().setInitializationStatus("ready")}var oF=($)=>{aJ();let[Q,Y]=k2(!1),[J,Z]=k2(null),[X,G]=k2(!1),[K,q]=k2(null),U=f2((O,B)=>{let _=O instanceof Error?O.message:String(O);if(r0().setInitializationError(_),r0().setInitializationStatus("error"),Y(!0),B)console.error("[FAIL] 应用初始化失败:",_)}),H=f2(async()=>{try{let O=Q1().config.config??nJ,B=tJ(O,$);if(VX(B),B.resumeSessionId)sJ().restoreSession(B.resumeSessionId,[]);if(B.debug)console.error("[Debug] 运行时配置:",B);let _=B.theme;if(_&&d0.hasTheme(_)){if(d0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{U1.getInstance().loadConfig(B.hooks||{},u0());let M=await eJ(u0());if($.debug&&B.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${M.subagents.getAllNames().length} agents, ${M.skills.size} skills, ${M.commands.getCommandCount()+M.commands.getPluginCommandCount()} commands, ${M.plugins.getAll().length} plugins`);let k=Q1().session.sessionId;oJ(k)}catch(W){if($.debug)console.warn("Hooks 初始化失败:",iJ(W))}c8(async()=>{await QY.getInstance().killAll(),await $Y.getInstance().disconnectAll(),U1.getInstance().cleanup()}),Y(!0)}catch(O){U(O,!!$.debug)}}),z=f2(async()=>{let O=await sQ.getInstance().getStatus(u0());if(O.state==="untrusted"||O.state==="error"){q(O);return}await H()}),F=f2(async()=>{if($.versionCheckPromise){let O=await $.versionCheckPromise;if(O){Z(O),G(!0);return}}await z()});if(DX(()=>{F()},[]),X&&J)return n$(W8,{children:n$(lJ,{versionInfo:J,onComplete:()=>{G(!1),z()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(K)return n$(W8,{children:n$(rJ,{status:K,onTrust:async()=>{await sQ.getInstance().trust(u0()),await JY(),q(null),await H()},onContinueSafely:async()=>{q(null),await H()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return n$(W8,{children:n$(pJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{oF as AppWrapper};
|