blade-code 0.10.26 → 0.10.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-s1khjfye.js → chunk-00ta2sme.js} +2 -2
  3. package/dist/{chunk-5mtryjjc.js → chunk-0vsaphkr.js} +1 -1
  4. package/dist/{chunk-zs9mwd17.js → chunk-14hspehn.js} +3 -3
  5. package/dist/{chunk-46yg6dfr.js → chunk-17k72zar.js} +2 -2
  6. package/dist/{chunk-1hzj6s0f.js → chunk-18ck4nnw.js} +2 -2
  7. package/dist/{chunk-jt55ct49.js → chunk-1c4j6q7j.js} +2 -2
  8. package/dist/{chunk-acf5v2fv.js → chunk-1pjvzcrj.js} +2 -2
  9. package/dist/{chunk-y2en7qvs.js → chunk-1thq2kns.js} +2 -2
  10. package/dist/{chunk-58yqrbey.js → chunk-1zsz19bn.js} +1 -1
  11. package/dist/chunk-2rdk9rzv.js +1 -0
  12. package/dist/{chunk-r46ws0q8.js → chunk-39yvdt2g.js} +2 -2
  13. package/dist/chunk-4qk4v6aw.js +1 -0
  14. package/dist/{chunk-a4cyec1y.js → chunk-5wemkcp3.js} +2 -2
  15. package/dist/{chunk-p6nhdbdw.js → chunk-600hfjag.js} +2 -2
  16. package/dist/{chunk-tnrrnzzv.js → chunk-76fnqb4r.js} +1 -1
  17. package/dist/{chunk-gn37wxwg.js → chunk-77y8cb2q.js} +1 -1
  18. package/dist/chunk-7kfnsts1.js +1 -0
  19. package/dist/{chunk-5yr2c8gz.js → chunk-7v0w3625.js} +4 -4
  20. package/dist/{chunk-6k74z0eb.js → chunk-99h83wjf.js} +2 -2
  21. package/dist/{chunk-px3t1rxa.js → chunk-9reqa9g1.js} +2 -2
  22. package/dist/chunk-a09g8k55.js +204 -0
  23. package/dist/chunk-awz9bn56.js +1 -0
  24. package/dist/{chunk-6axhk4r7.js → chunk-b9akah7k.js} +1 -1
  25. package/dist/{chunk-35d5gdgw.js → chunk-bmxzx4xg.js} +1 -1
  26. package/dist/chunk-cpk6vwyh.js +1 -0
  27. package/dist/{chunk-0q4jbbm5.js → chunk-cx5daedg.js} +1 -1
  28. package/dist/{chunk-6srz3q5d.js → chunk-czs2rxyr.js} +1 -1
  29. package/dist/{chunk-8htfb5zn.js → chunk-d893y03w.js} +2 -2
  30. package/dist/{chunk-4aem0m2n.js → chunk-dyf9jrds.js} +1 -1
  31. package/dist/{chunk-ebffhjma.js → chunk-e1r2zqv3.js} +2 -2
  32. package/dist/{chunk-nt6xmzk0.js → chunk-eeg6jn2c.js} +1 -1
  33. package/dist/{chunk-89gswfb2.js → chunk-emwawshv.js} +1 -1
  34. package/dist/{chunk-pja0tttq.js → chunk-erwmqhkw.js} +1 -1
  35. package/dist/{chunk-1g5h4zv6.js → chunk-ezarz0ye.js} +1 -1
  36. package/dist/chunk-fgczbyhy.js +1 -0
  37. package/dist/chunk-g11e47n1.js +1 -0
  38. package/dist/{chunk-tg1mf1tf.js → chunk-gwxwpwqk.js} +6 -6
  39. package/dist/{chunk-fnt1z0y8.js → chunk-h79p49hc.js} +1 -1
  40. package/dist/chunk-hszqdsn3.js +1 -0
  41. package/dist/{chunk-aa28p37g.js → chunk-hxb7wg07.js} +1 -1
  42. package/dist/{chunk-9ka0bdry.js → chunk-j4gvwm9w.js} +1 -1
  43. package/dist/{chunk-7jv8thn1.js → chunk-jvg2vnc3.js} +2 -2
  44. package/dist/{chunk-rth3jfdq.js → chunk-k6gsac91.js} +1 -1
  45. package/dist/{chunk-20kg90zt.js → chunk-kahzw9qn.js} +46 -46
  46. package/dist/chunk-kbpg9amg.js +100 -0
  47. package/dist/{chunk-xp44jtsd.js → chunk-kvgrg5p2.js} +1 -1
  48. package/dist/{chunk-b5fegjt7.js → chunk-m6crkryd.js} +4 -4
  49. package/dist/chunk-pvf84eht.js +1 -0
  50. package/dist/{chunk-kskg7crs.js → chunk-q24xmkqy.js} +2 -2
  51. package/dist/{chunk-vp50e95n.js → chunk-rtct70pm.js} +3 -3
  52. package/dist/chunk-rvz8yka7.js +1 -0
  53. package/dist/{chunk-kvd5nexw.js → chunk-sp1j3ng5.js} +1 -1
  54. package/dist/chunk-t3hahveb.js +1 -0
  55. package/dist/{chunk-edyxa2jw.js → chunk-v1kac601.js} +1 -1
  56. package/dist/{chunk-ct2x59pr.js → chunk-v874kevz.js} +2 -2
  57. package/dist/chunk-wa33kkb2.js +1 -0
  58. package/dist/chunk-wawmjv8r.js +10 -0
  59. package/dist/chunk-wzxkfpec.js +2 -0
  60. package/dist/chunk-xg9fzft1.js +1 -0
  61. package/dist/{chunk-eqa706gn.js → chunk-y0c3knp9.js} +2 -2
  62. package/dist/{chunk-m7x4ya6m.js → chunk-y2ra5akr.js} +1 -1
  63. package/dist/{chunk-rgafk34p.js → chunk-y4fj9way.js} +1 -1
  64. package/dist/chunk-yc8rrjsr.js +1 -0
  65. package/dist/{chunk-fbc5zfq7.js → chunk-yh81njxg.js} +1 -1
  66. package/dist/{chunk-k99rbzqw.js → chunk-ymgnh4an.js} +1 -1
  67. package/dist/{chunk-rtktz9v1.js → chunk-z2kfx8g0.js} +263 -263
  68. package/dist/{chunk-sprjrvn6.js → chunk-z3kc23wz.js} +1 -1
  69. package/dist/{chunk-58tpe6nx.js → chunk-z4d3t2bb.js} +2 -2
  70. package/dist/web/assets/{ChatView-Crna6-ID.js → ChatView-B4Le8nGL.js} +7 -7
  71. package/dist/web/assets/{CodeBlockHighlighter-coWjWCyT.js → CodeBlockHighlighter-B8-o1K2L.js} +1 -1
  72. package/dist/web/assets/{FilePreview-BKcCbpvz.js → FilePreview-BvUxzULZ.js} +1 -1
  73. package/dist/web/assets/{MarkdownRenderer-BqV1nvf1.js → MarkdownRenderer-C-X3g9Ky.js} +3 -3
  74. package/dist/web/assets/{SettingsModal-BOMswk9P.js → SettingsModal-Dhjw1__j.js} +1 -1
  75. package/dist/web/assets/{TaskSwitcher-BEW2DhW3.js → TaskSwitcher-BAHVGLmL.js} +1 -1
  76. package/dist/web/assets/{TerminalPanel-BXzypTz6.js → TerminalPanel-D3cC-lXf.js} +1 -1
  77. package/dist/web/assets/{index-DqXKkjcp.js → index-D88fYWls.js} +4 -4
  78. package/dist/web/assets/{session-events-K_9Lexp8.js → session-events-BoJrjSZ2.js} +2 -2
  79. package/dist/web/index.html +2 -2
  80. package/package.json +1 -1
  81. package/dist/chunk-01n8k1jj.js +0 -1
  82. package/dist/chunk-1mh2285d.js +0 -200
  83. package/dist/chunk-bbjtt28z.js +0 -1
  84. package/dist/chunk-d9jz1edf.js +0 -100
  85. package/dist/chunk-dxgzyy09.js +0 -1
  86. package/dist/chunk-f88wkyfm.js +0 -1
  87. package/dist/chunk-fkwqgqsw.js +0 -1
  88. package/dist/chunk-gahvpbbs.js +0 -1
  89. package/dist/chunk-h2npwqz9.js +0 -10
  90. package/dist/chunk-kwe0a3xw.js +0 -1
  91. package/dist/chunk-mqsxghqb.js +0 -1
  92. package/dist/chunk-nar8qz5t.js +0 -1
  93. package/dist/chunk-pyfag66h.js +0 -1
  94. package/dist/chunk-q1papzdc.js +0 -1
  95. package/dist/chunk-ss449b56.js +0 -1
  96. package/dist/chunk-vc2c8wkx.js +0 -2
  97. package/dist/chunk-wg8p9g0z.js +0 -1
  98. package/dist/chunk-xkb48pvz.js +0 -1
@@ -1,6 +1,6 @@
1
- import{b as uJ,c as lJ,d as dJ}from"./chunk-aa28p37g.js";import{j as e9,k as $J}from"./chunk-gn37wxwg.js";import{r as p8}from"./chunk-1g5h4zv6.js";import{$ as g4,F as _$,H as C4,I as I4,L as J8,M as WJ,N as LJ,Q as BJ,R as wJ,W as w6,X as b6,Y as ZY,Z as E4,ba as U6,t as q6,w as s2,x as a2,y as e4,z as YY}from"./chunk-rtktz9v1.js";import{fa as I9,ga as T9,ha as f9,ka as JY}from"./chunk-tg1mf1tf.js";import"./chunk-89gswfb2.js";import{$a as l4,ib as u2}from"./chunk-1mh2285d.js";import{tb as X8}from"./chunk-4dnvydyv.js";import{Lb as m4,Vb as k4,Wb as x2,Xb as v4,Zb as D8,fc as Q8,ic as P0}from"./chunk-d9jz1edf.js";import"./chunk-p6nhdbdw.js";import{Gc as cJ}from"./chunk-6k74z0eb.js";import{Hc as G8,Ic as c8,Kc as T1}from"./chunk-px3t1rxa.js";import"./chunk-ebffhjma.js";import{$c as r0,Oc as C$,Pc as d0,Qc as s1,Rc as RQ,Sc as D$,Tc as V8,Uc as o6,Vc as uQ,Wc as d9,Xc as n6,Yc as k$,Zc as Q1,_c as $Y,ad as pJ,bd as b2,cd as Y8,fd as j4,md as g0}from"./chunk-5yr2c8gz.js";import"./chunk-v508x7cg.js";import"./chunk-k99rbzqw.js";import"./chunk-46yg6dfr.js";import{xd as lQ}from"./chunk-1hzj6s0f.js";import"./chunk-fnt1z0y8.js";import"./chunk-7jv8thn1.js";import{Id as W6,Ld as kJ,Rd as HJ,Xd as QY}from"./chunk-kskg7crs.js";import"./chunk-5mtryjjc.js";import"./chunk-nt6xmzk0.js";import"./chunk-35d5gdgw.js";import{je as IQ,le as U1}from"./chunk-zs9mwd17.js";import"./chunk-rth3jfdq.js";import{Te as sJ,cf as FJ,df as eJ}from"./chunk-58tpe6nx.js";import"./chunk-6axhk4r7.js";import"./chunk-9ka0bdry.js";import{lf as V$,mf as j8,nf as TQ}from"./chunk-vc2c8wkx.js";import{rf as x0}from"./chunk-kvd5nexw.js";import{sf as tJ,vf as n1}from"./chunk-8htfb5zn.js";import{Bf as V1,xf as n9,yf as t9}from"./chunk-jt55ct49.js";import"./chunk-0q4jbbm5.js";import{Nf as g9}from"./chunk-acf5v2fv.js";import{Of as sQ}from"./chunk-r46ws0q8.js";import"./chunk-tnrrnzzv.js";import"./chunk-s1khjfye.js";import{_f as CQ}from"./chunk-sprjrvn6.js";import{useMemoizedFn as k2}from"ahooks";import{useEffect as jX,useState as v2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as q$}from"ink";import{useEffect as U$,useMemo as TX,useRef as I2}from"react";import{useShallow as GY}from"zustand/react/shallow";import{useStore as XY}from"zustand";function s($){return XY(k$,$)}var KY=[],v$=()=>s(($)=>$.session.sessionId),I1=()=>s(($)=>$.session.workspaceRoot),eQ=()=>s(($)=>$.session.messages),$4=()=>s(($)=>$.session.clearCount),Q4=()=>s(($)=>$.session.isCompacting),J4=()=>s(($)=>$.session.tokenUsage.estimatedCostUsd),Y4=()=>s(($)=>$.session.providerRetry),Z4=()=>s(($)=>$.session.providerStall),a1=()=>s(($)=>$.session.actions),X4=()=>s(($)=>{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)}),G4=()=>s(($)=>$.app.initializationStatus),K4=()=>s(($)=>$.app.initializationError),P8=()=>s(($)=>$.app.activeModal),q4=()=>s(($)=>$.app.tasks),U4=()=>s(($)=>$.app.modelEditorTarget),z4=()=>s(($)=>$.app.sessionSelectorData),O4=()=>s(($)=>$.app.awaitingSecondCtrlC),i1=()=>s(($)=>$.app.actions),y8=()=>s(($)=>$.app.initializationStatus==="ready"),_4=()=>s(($)=>$.app.tasks.length>0),S$=()=>s(($)=>$.config.config?.permissionMode||"default"),N4=()=>s(($)=>$.config.config?.models??KY),R8=()=>s(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),M8=()=>s(($)=>$.config.config?.currentModelId),A0=()=>s(($)=>{return d0.getTheme()}),F4=()=>s(($)=>$.config.config?.codeTheme??"default"),$1=()=>s(($)=>$.focus.currentFocus),H4=()=>s(($)=>$.focus.actions),o1=()=>s(($)=>$.command.isProcessing),W4=()=>s(($)=>$.command.actions),C8=()=>s(($)=>$.command.pendingCommands),L4=()=>s(($)=>$.command.recoveredSteeringCount),I8=()=>s(($)=>$.app.thinkingModeEnabled),T8=()=>s(($)=>$.app.reasoningEffort),f8=()=>s(($)=>$.app.serviceTier),k8=()=>s(($)=>$.app.responseVerbosity),v8=()=>s(($)=>$.app.communicationStyle),B4=()=>s(($)=>$.session.currentThinkingContent),w4=()=>s(($)=>$.session.thinkingExpanded),b4=()=>s(($)=>$.session.currentStreamingMessageId),A4=()=>s(GY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),P4=()=>s(($)=>$.session.finalizingStreamingMessageId),y4=()=>s(($)=>$.session.historyExpanded),R4=()=>s(($)=>$.session.expandedMessageCount);import{useMemoizedFn as h$}from"ahooks";import{useEffect as p2,useRef as u4}from"react";function qY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let G=JSON.parse(J.responseBody)?.error?.message;if(G){let q=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${G}${q}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function UY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function zY($){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=UY($),Y=zY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=qY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as OY,mkdirSync as _Y,writeFileSync as NY}from"node:fs";import FY from"node:os";import j2 from"node:path";var M4=null;function HY(){let $=process.env.BLADE_STORAGE_ROOT||j2.join(FY.homedir(),".blade");return j2.join($,"logs","stream-debug.log")}function WY($){if(M4===$)return;let Q=j2.dirname($);_Y(Q,{recursive:!0,mode:493}),NY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
- `),M4=$}function h2($,Q,Y){try{let J=HY();WY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",G=`[${Z}] [${$}] ${Q}${X}
3
- `;OY(J,G)}catch{}}var $8=n1("UI");function T4($,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($.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$8.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)D$(G,Z);V8(G)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"provider_retry":{let{kind:Z,...X}=J;$.sessionActions.setProviderRetry(J.phase==="scheduled"||J.phase==="attempt"?X:null);break}case"provider_stall":{let{kind:Z,...X}=J;$.sessionActions.setProviderStall(J.phase==="detected"?X:null);break}case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===D8)break;if($8.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=C4(Z.function.name,X);$.sessionActions.addToolMessage(G,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:G,params:X})}catch(X){$8.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;$8.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=I4(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"){if($.sessionActions.resetContextUsage(),J.outcome!=="failed")Q.compactionCount=(Q.compactionCount??0)+1}break;case"turn_start":$8.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
1
+ import{b as lJ,c as dJ,d as rJ}from"./chunk-hxb7wg07.js";import{j as $J,k as QJ}from"./chunk-77y8cb2q.js";import{r as p8}from"./chunk-ezarz0ye.js";import{$ as m4,F as _$,H as I4,I as T4,L as J8,M as LJ,N as BJ,Q as wJ,R as bJ,W as b6,X as A6,Y as XY,Z as g4,ba as z6,t as U6,w as s2,x as a2,y as $6,z as ZY}from"./chunk-z2kfx8g0.js";import{fa as T9,ga as f9,ha as k9,ka as YY}from"./chunk-gwxwpwqk.js";import"./chunk-emwawshv.js";import{$a as d4,ib as u2}from"./chunk-a09g8k55.js";import{tb as X8}from"./chunk-4dnvydyv.js";import{Mb as p4,Wb as v4,Xb as x2,Yb as S4,_b as D8,gc as Q8,jc as P0}from"./chunk-kbpg9amg.js";import"./chunk-600hfjag.js";import{Hc as xJ}from"./chunk-99h83wjf.js";import{Ic as G8,Jc as c8,Lc as T1}from"./chunk-9reqa9g1.js";import"./chunk-e1r2zqv3.js";import{$c as QY,Pc as C$,Qc as d0,Rc as s1,Sc as yQ,Tc as D$,Uc as V8,Vc as n6,Wc as uQ,Xc as r9,Yc as t6,Zc as k$,_c as Q1,ad as r0,bd as cJ,cd as b2,dd as Y8,gd as h4,nd as g0}from"./chunk-7v0w3625.js";import"./chunk-v508x7cg.js";import"./chunk-ymgnh4an.js";import"./chunk-17k72zar.js";import{yd as lQ}from"./chunk-18ck4nnw.js";import"./chunk-h79p49hc.js";import"./chunk-jvg2vnc3.js";import{Jd as L6,Md as vJ,Sd as WJ,Yd as JY}from"./chunk-q24xmkqy.js";import"./chunk-0vsaphkr.js";import"./chunk-eeg6jn2c.js";import"./chunk-bmxzx4xg.js";import{ke as IQ,me as U1}from"./chunk-14hspehn.js";import"./chunk-k6gsac91.js";import{Ue as eJ,df as HJ,ef as $Y}from"./chunk-z4d3t2bb.js";import"./chunk-b9akah7k.js";import"./chunk-j4gvwm9w.js";import{mf as V$,nf as j8,of as TQ}from"./chunk-wzxkfpec.js";import{sf as x0}from"./chunk-sp1j3ng5.js";import{tf as sJ,wf as n1}from"./chunk-d893y03w.js";import{Cf as V1,yf as t9,zf as s9}from"./chunk-1c4j6q7j.js";import"./chunk-cx5daedg.js";import{Of as m9}from"./chunk-1pjvzcrj.js";import{Pf as sQ}from"./chunk-39yvdt2g.js";import"./chunk-76fnqb4r.js";import"./chunk-00ta2sme.js";import{$f as CQ}from"./chunk-z3kc23wz.js";import{useMemoizedFn as k2}from"ahooks";import{useEffect as hX,useState as v2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as q$}from"ink";import{useEffect as U$,useMemo as fX,useRef as I2}from"react";import{useShallow as KY}from"zustand/react/shallow";import{useStore as GY}from"zustand";function s($){return GY(k$,$)}var qY=[],v$=()=>s(($)=>$.session.sessionId),I1=()=>s(($)=>$.session.workspaceRoot),eQ=()=>s(($)=>$.session.messages),$4=()=>s(($)=>$.session.clearCount),Q4=()=>s(($)=>$.session.isCompacting),J4=()=>s(($)=>$.session.tokenUsage.estimatedCostUsd),Y4=()=>s(($)=>$.session.providerRetry),Z4=()=>s(($)=>$.session.providerStall),X4=()=>s(($)=>$.session.actionStationarity),a1=()=>s(($)=>$.session.actions),G4=()=>s(($)=>{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)}),K4=()=>s(($)=>$.app.initializationStatus),q4=()=>s(($)=>$.app.initializationError),P8=()=>s(($)=>$.app.activeModal),U4=()=>s(($)=>$.app.tasks),z4=()=>s(($)=>$.app.modelEditorTarget),O4=()=>s(($)=>$.app.sessionSelectorData),_4=()=>s(($)=>$.app.awaitingSecondCtrlC),i1=()=>s(($)=>$.app.actions),R8=()=>s(($)=>$.app.initializationStatus==="ready"),N4=()=>s(($)=>$.app.tasks.length>0),S$=()=>s(($)=>$.config.config?.permissionMode||"default"),F4=()=>s(($)=>$.config.config?.models??qY),y8=()=>s(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),M8=()=>s(($)=>$.config.config?.currentModelId),A0=()=>s(($)=>{return d0.getTheme()}),H4=()=>s(($)=>$.config.config?.codeTheme??"default"),$1=()=>s(($)=>$.focus.currentFocus),W4=()=>s(($)=>$.focus.actions),o1=()=>s(($)=>$.command.isProcessing),L4=()=>s(($)=>$.command.actions),C8=()=>s(($)=>$.command.pendingCommands),B4=()=>s(($)=>$.command.recoveredSteeringCount),I8=()=>s(($)=>$.app.thinkingModeEnabled),T8=()=>s(($)=>$.app.reasoningEffort),f8=()=>s(($)=>$.app.serviceTier),k8=()=>s(($)=>$.app.responseVerbosity),v8=()=>s(($)=>$.app.communicationStyle),w4=()=>s(($)=>$.session.currentThinkingContent),b4=()=>s(($)=>$.session.thinkingExpanded),A4=()=>s(($)=>$.session.currentStreamingMessageId),P4=()=>s(KY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),R4=()=>s(($)=>$.session.finalizingStreamingMessageId),y4=()=>s(($)=>$.session.historyExpanded),M4=()=>s(($)=>$.session.expandedMessageCount);import{useMemoizedFn as h$}from"ahooks";import{useEffect as p2,useRef as l4}from"react";function UY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let G=JSON.parse(J.responseBody)?.error?.message;if(G){let q=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${G}${q}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function zY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function OY($){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=zY($),Y=OY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=UY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as _Y,mkdirSync as NY,writeFileSync as FY}from"node:fs";import HY from"node:os";import j2 from"node:path";var C4=null;function WY(){let $=process.env.BLADE_STORAGE_ROOT||j2.join(HY.homedir(),".blade");return j2.join($,"logs","stream-debug.log")}function LY($){if(C4===$)return;let Q=j2.dirname($);NY(Q,{recursive:!0,mode:493}),FY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
+ `),C4=$}function h2($,Q,Y){try{let J=WY();LY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",G=`[${Z}] [${$}] ${Q}${X}
3
+ `;_Y(J,G)}catch{}}var $8=n1("UI");function f4($,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($.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$8.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)D$(G,Z);V8(G)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"provider_retry":{let{kind:Z,...X}=J;$.sessionActions.setProviderRetry(J.phase==="scheduled"||J.phase==="attempt"?X:null);break}case"provider_stall":{let{kind:Z,...X}=J;$.sessionActions.setProviderStall(J.phase==="detected"?X:null);break}case"action_stationarity":{let{kind:Z,...X}=J;$.sessionActions.setActionStationarity(J.phase==="recovered"?null:X);break}case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===D8)break;if($8.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=I4(Z.function.name,X);$.sessionActions.addToolMessage(G,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:G,params:X})}catch(X){$8.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;$8.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=T4(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"){if($.sessionActions.resetContextUsage(),J.outcome!=="failed")Q.compactionCount=(Q.compactionCount??0)+1}break;case"turn_start":$8.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
4
4
  `)});break}case"mcp_content_changed":{let Z=`MCP ${J.contentKind} r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Content",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
5
5
  `)});break}case"mcp_resource_updated":{let Z=`MCP resource updated: ${J.uri}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Resource",phase:"progress",summary:Z,detail:`${J.serverName} · revision ${J.revision}`});break}case"mcp_connection_changed":{let Z=J.phase==="reconnecting"?"recovering":J.phase==="recovered"?"recovered":"recovery failed",X=`MCP ${J.serverName} ${Z}`+(J.phase==="reconnecting"?` (${J.attempt}/${J.maxAttempts})`:"");$.sessionActions.addToolMessage(X,{toolName:"MCP Connection",phase:"complete",summary:X,detail:[`reason: ${J.reason}`,`revision: ${J.revision}`,J.error?`error: ${J.error}`:""].filter(Boolean).join(`
6
6
  `)});break}case"mcp_log":{let Z=J.logger?`${J.serverName} · ${J.logger}`:J.serverName,X=`MCP ${J.level} · ${Z}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Log",phase:"complete",summary:X,detail:[J.message,`revision: ${J.revision}`,`sha256: ${J.dataSha256}`,J.truncated?"truncated: true":"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
@@ -8,9 +8,9 @@ import{b as uJ,c as lJ,d as dJ}from"./chunk-aa28p37g.js";import{j as e9,k as $J}
8
8
  `)});break}case"mcp_task_changed":{let Z=`MCP task ${J.status}: ${J.taskId} (${J.serverName}/${J.toolName})`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Task",phase:"complete",summary:Z,detail:[J.statusMessage??"",`revision: ${J.revision}`,J.hasResult?"result available via TaskOutput":"",J.error?`error: ${J.error}`:""].filter(Boolean).join(`
9
9
  `)});break}case"project_rules_loaded":{let Z=`Project rules loaded: ${J.files.length}`+(J.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Z,{toolName:"Project Rules",phase:"complete",summary:Z,detail:J.files.map((X)=>`${X.relativePath} ${X.source} sha256=${X.contentSha256}`).join(`
10
10
  `)});break}case"steering_applied":for(let Z=0;Z<J.count;Z++)$.commandActions.dequeueCommand();if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"follow_up_started":for(let Z of J.messages){if(!Z.recovered||Z.persisted)continue;let X=typeof Z.content==="string"?Z.content:Z.content.map((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>V$)throw Error(`最多只能发送 ${V$} 张图片`);if(J.reduce((G,q)=>G+`data:${q.mimeType};base64,`.length+q.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 f4($){let Q=v4($.metadata);return{role:$.role,content:Q?k4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function h8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(f4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(f4);return[...$.restoredContextMessages,...Q]}import LY from"node:path";function S4($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function BY($){return LY.resolve($)}function D4($){if(!$||!j4($))return;Q1().config.actions.updateConfig({currentModelId:$})}function V4($){if(!$)return;Q1().config.actions.updateConfig({permissionMode:$})}async function E8($,Q){return P0.listSessions({includeSubagents:!1})}async function g8($,Q,Y,J){let{intent:Z,session:X,newSessionId:G,announceFork:q,permissionModeOverride:K}=$,U=BY(X.projectPath);if(Z==="fork"){let O=await P0.forkSession(X.sessionId,{...G?{newSessionId:G}:{},sourceProjectPath:U,targetProjectPath:U}),B=await P0.loadSessionModelContext(O.sessionId,O.metadata.projectPath),_=[...P0.toUISafeMessages(O.messages)];if(q!==!1){let F=Date.parse(O.metadata.lastMessageTime);_.push({id:"fork-announcement-"+O.sessionId,role:"assistant",content:"Forked "+S4(X.sessionId)+" → "+S4(O.sessionId),timestamp:Number.isNaN(F)?0:F})}return await J(),V4(K??O.metadata.permissionMode),D4(O.metadata.selectedModelId),Y.restoreSession(O.sessionId,_,B,O.metadata.projectPath),{sessionId:O.sessionId,messages:B}}await P0.assertSessionWritable(X.sessionId,X.projectPath);let[H,z]=await Promise.all([P0.loadSession(X.sessionId,X.projectPath),P0.loadSessionModelContext(X.sessionId,X.projectPath)]),W=P0.toUISafeMessages(H);return await J(),V4(K??X.permissionMode),D4(X.selectedModelId),Y.restoreSession(X.sessionId,W,z,X.projectPath),{sessionId:X.sessionId,messages:z}}function h4($){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 wY($){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 AY($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function PY($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function yY($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function RY($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function MY($){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)=>h4(Z))}if(Y==="activate_session")return h4($.session);return!1}function CY($,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} 已归档。`:"当前会话已归档。"),T1(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 T1(0),!0;default:return!1}}async function m2($,Q,Y,J,Z,X,G,q,K,U,H,z,W,O,B=x0(),_){let{text:F}=$;if(!E4(F))return{type:"not_slash"};let N=await g4(F,{cwd:B,surface:"tui",workspaceRoot:B,sessionId:X,messages:G,rewind:q,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),P0.archiveSession(X,B)}},subagents:K,mcp:U,reasoning:H,serviceTier:z,responseVerbosity:W,communicationStyle:O,codeReview:_,signal:J});if(N.success&&MY(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&&RY(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(CY(N.message,N.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(wY(N.data)){let{skillName:C,skillArgs:w}=N.data,f=w?`Please use the "${C}" skill to help me with: ${w}`:`Please use the "${C}" skill.`;return Y.addUserMessage(f),{type:"continue_as_agent",result:{userDisplayMessage:f,agentInput:{displayText:f,text:f,images:[],parts:[{type:"text",text:f}]},userMessageAlreadyAdded:!0}}}if(bY(N.data)){let{commandName:C,processedContent:w}=N.data;Y.addUserMessage(F);let f=`# Custom Command: /${C}
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>V$)throw Error(`最多只能发送 ${V$} 张图片`);if(J.reduce((G,q)=>G+`data:${q.mimeType};base64,`.length+q.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 k4($){let Q=S4($.metadata);return{role:$.role,content:Q?v4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function h8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(k4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(k4);return[...$.restoredContextMessages,...Q]}import BY from"node:path";function D4($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function wY($){return BY.resolve($)}function V4($){if(!$||!h4($))return;Q1().config.actions.updateConfig({currentModelId:$})}function j4($){if(!$)return;Q1().config.actions.updateConfig({permissionMode:$})}async function E8($,Q){return P0.listSessions({includeSubagents:!1})}async function g8($,Q,Y,J){let{intent:Z,session:X,newSessionId:G,announceFork:q,permissionModeOverride:K}=$,U=wY(X.projectPath);if(Z==="fork"){let O=await P0.forkSession(X.sessionId,{...G?{newSessionId:G}:{},sourceProjectPath:U,targetProjectPath:U}),B=await P0.loadSessionModelContext(O.sessionId,O.metadata.projectPath),_=[...P0.toUISafeMessages(O.messages)];if(q!==!1){let H=Date.parse(O.metadata.lastMessageTime);_.push({id:"fork-announcement-"+O.sessionId,role:"assistant",content:"Forked "+D4(X.sessionId)+" → "+D4(O.sessionId),timestamp:Number.isNaN(H)?0:H})}return await J(),j4(K??O.metadata.permissionMode),V4(O.metadata.selectedModelId),Y.restoreSession(O.sessionId,_,B,O.metadata.projectPath),{sessionId:O.sessionId,messages:B}}await P0.assertSessionWritable(X.sessionId,X.projectPath);let[F,z]=await Promise.all([P0.loadSession(X.sessionId,X.projectPath),P0.loadSessionModelContext(X.sessionId,X.projectPath)]),W=P0.toUISafeMessages(F);return await J(),j4(K??X.permissionMode),V4(X.selectedModelId),Y.restoreSession(X.sessionId,W,z,X.projectPath),{sessionId:X.sessionId,messages:z}}function E4($){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 bY($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function AY($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function PY($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function RY($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function yY($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function MY($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function CY($){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)=>E4(Z))}if(Y==="activate_session")return E4($.session);return!1}function IY($,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} 已归档。`:"当前会话已归档。"),T1(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 T1(0),!0;default:return!1}}async function m2($,Q,Y,J,Z,X,G,q,K,U,F,z,W,O,B=x0(),_){let{text:H}=$;if(!g4(H))return{type:"not_slash"};let N=await m4(H,{cwd:B,surface:"tui",workspaceRoot:B,sessionId:X,messages:G,rewind:q,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),P0.archiveSession(X,B)}},subagents:K,mcp:U,reasoning:F,serviceTier:z,responseVerbosity:W,communicationStyle:O,codeReview:_,signal:J});if(N.success&&CY(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&&MY(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(IY(N.message,N.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(bY(N.data)){let{skillName:M,skillArgs:w}=N.data,f=w?`Please use the "${M}" skill to help me with: ${w}`:`Please use the "${M}" skill.`;return Y.addUserMessage(f),{type:"continue_as_agent",result:{userDisplayMessage:f,agentInput:{displayText:f,text:f,images:[],parts:[{type:"text",text:f}]},userMessageAlreadyAdded:!0}}}if(AY(N.data)){let{commandName:M,processedContent:w}=N.data;Y.addUserMessage(H);let f=`# Custom Command: /${M}
12
12
 
13
- The user has invoked the custom command "/${C}". Follow the instructions below to complete the task.
13
+ The user has invoked the custom command "/${M}". Follow the instructions below to complete the task.
14
14
 
15
15
  ---
16
16
 
@@ -18,9 +18,9 @@ ${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:F,agentInput:{displayText:F,text:f,images:[],parts:[{type:"text",text:f}]},userMessageAlreadyAdded:!0}}}if(AY(N.data)){let{commandName:C,pluginName:w,processedContent:f}=N.data;Y.addUserMessage(F);let P=`# Plugin Command: /${C}
21
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:H,agentInput:{displayText:H,text:f,images:[],parts:[{type:"text",text:f}]},userMessageAlreadyAdded:!0}}}if(PY(N.data)){let{commandName:M,pluginName:w,processedContent:f}=N.data;Y.addUserMessage(H);let P=`# Plugin Command: /${M}
22
22
 
23
- The user has invoked the plugin command "/${C}" from plugin "${w}". Follow the instructions below to complete the task.
23
+ The user has invoked the plugin command "/${M}" from plugin "${w}". Follow the instructions below to complete the task.
24
24
 
25
25
  ---
26
26
 
@@ -28,16 +28,16 @@ ${f}
28
28
 
29
29
  ---
30
30
 
31
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(PY(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(yY(N.data)){let C=N.data.goal.objective;return Y.addUserMessage(F),{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,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 v=N.message;if(N.success&&typeof v==="string"&&v.trim()!=="")Y.addAssistantMessage(v);return{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}}}import{useMemoizedFn as R0}from"ahooks";import{useEffect as IY,useRef as m8}from"react";function p4($){let Q=m8(void 0),Y=m8(void 0),J=m8(void 0),Z=m8(void 0),X=R0(async()=>{if(Z.current)return Z.current;let I=Q.current,y=Y.current;if(!I&&!y)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let 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=R0(async(I)=>{let y=$.workspaceRoot??Y.current?.workspaceRoot??x0();if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==y))await X();if(!Y.current){let D=await P0.findSessionMetadata(I,y),b=D!==void 0&&(await P0.loadSession(I,y)).length>0;Y.current=await _$.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}),q=R0(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),y0=S.getCurrentModelId(),B0=S.getReasoningConfiguration(),s0=S.getServiceTierConfiguration(),p0=S.getResponseVerbosityConfiguration(),F1=S.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==y||J.current.permissionMode!==$.permissionMode)){let e0=await P0.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 C1=S.getCommunicationStyleConfiguration();if(C1.source!=="built-in"&&!C1.contentSha256)throw Error("Custom communication style has no provenance");let T$={...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!==C1.contentSha256)?{communicationStyle:Z0,communicationStyleDigest:C1.source==="built-in"?null:C1.contentSha256}:{}};if(Object.keys(T$).length>0)try{let e0=await P0.updateSessionMetadata(y,S.workspaceRoot,T$);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({...y0?{modelId:y0}:{},reasoningEffort:B0.selection,serviceTier:s0.selection,responseVerbosity:p0.selection,communicationStyle:F1.selection}).catch(()=>{return}),e0}b=await J8.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 J8.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=R0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await G($.sessionId)).listRewindCheckpoints()}),U=R0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let D=await(await G($.sessionId)).rewindSession(I);return await X(),D}),H=R0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await G($.sessionId)).listSubagents()}),z=R0(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)=>{k$.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)k$.getState().app.actions.updateSubagentTool(S,l.toolCall.function.name)},onCompleted:(l)=>{if(b)x(l);else h=l}});if(S=V.session.id,k$.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}),W=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await G($.sessionId)).getMcpContentCatalog()}),O=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await G($.sessionId)).refreshMcpContentCatalogs(I)}),B=R0(async(I,y,D)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await G($.sessionId)).getMcpPrompt(I,y,D)}),_=R0(async(I,y,D)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await G($.sessionId)).completeMcpArgument(I,y,D)}),F=R0(async(I,y={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await G($.sessionId)).getMcpLogs(I,y)}),M=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).listMcpTasks(I)}),N=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).getMcpTask(I)}),v=R0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).cancelMcpTask(I,y)}),C=R0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await G($.sessionId)).setMcpLoggingLevel(I,y)}),w=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await G($.sessionId)).getMcpInstructions()}),f=R0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await G($.sessionId)).getReasoningConfiguration()}),P=R0(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 P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{reasoningEffort:I})}catch(h){if(!(h instanceof Q8)&&h.code!=="ENOENT")throw h;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:I,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},r0().setReasoningEffort(I),y.getReasoningConfiguration()}catch(b){throw await y.refresh({reasoningEffort:D.selection}),b}}),A=R0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await G($.sessionId)).getServiceTierConfiguration()}),T=R0(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 P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{serviceTier:I})}catch(h){if(!(h instanceof Q8)&&h.code!=="ENOENT")throw h;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:I,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},r0().setServiceTier(I),y.getServiceTierConfiguration()}catch(b){throw await y.refresh({serviceTier:D.selection}),b}}),R=R0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await G($.sessionId)).getResponseVerbosityConfiguration()}),L=R0(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 P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{responseVerbosity:I})}catch(h){if(!(h instanceof Q8)&&h.code!=="ENOENT")throw h;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:I,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},r0().setResponseVerbosity(I),y.getResponseVerbosityConfiguration()}catch(b){throw await y.refresh({responseVerbosity:D.selection}),b}}),k=R0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await G($.sessionId)).getCommunicationStyleConfiguration()}),E=R0(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 P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{communicationStyle:I,communicationStyleDigest:b.source==="built-in"?null:b.contentSha256})}catch(S){if(!(S instanceof Q8)&&S.code!=="ENOENT")throw S;h=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:I,...b.source!=="built-in"&&b.contentSha256?{communicationStyleDigest:b.contentSha256}:{}})}return J.current={sessionId:$.sessionId,modelId: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=R0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),u=R0(async(I,y)=>{let D=$.sessionId;if(!D)throw Error("User shell command requires a Session");return(await G(D)).executeUserShellCommand(I,y)}),a=R0(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:m4(x.start,S)}});return IY(()=>{let I=c8(X);return()=>{I(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:q,cleanupAgent:X,steerActiveTurn:t,runCodeReview:a,executeUserShellCommand:u,listRewindCheckpoints:K,rewindSession:U,listSubagents:H,resumeSubagent:z,getMcpContentCatalog:W,refreshMcpContentCatalogs:O,getMcpPrompt:B,completeMcpArgument:_,listMcpTasks:M,getMcpTask:N,cancelMcpTask:v,getMcpLogs:F,setMcpLoggingLevel:C,getMcpInstructions:w,getReasoningConfiguration:f,setReasoningEffort:P,getServiceTierConfiguration:A,setServiceTier:T,getResponseVerbosityConfiguration:R,setResponseVerbosity:L,getCommunicationStyleConfiguration:k,setCommunicationStyle:E}}import{useMemoizedFn as j$}from"ahooks";import{useEffect as TY,useRef as x8}from"react";function c4($){let Q=0;for(let Y of $)if(Y===`
32
- `)Q++;return Q}function x4($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=x8(""),G=x8(null),q=x8(""),K=x8(null),U=j$(()=>{if(X.current){let _=X.current,F=$.appendAssistantContent(_);D$(F,_),X.current=""}if(G.current)clearTimeout(G.current),G.current=null}),H=j$(()=>{if(q.current)$.appendThinkingContent(q.current),q.current="";if(K.current)clearTimeout(K.current),K.current=null}),z=j$((_)=>{X.current+=_;let F=X.current;if(c4(F)>=J||F.length>=Z){U();return}if(!G.current)G.current=setTimeout(U,Y)}),W=j$((_)=>{q.current+=_;let F=q.current;if(c4(F)>=J||F.length>=Z){H();return}if(!K.current)K.current=setTimeout(H,Y)}),O=j$(()=>{if(X.current="",G.current)clearTimeout(G.current),G.current=null;if(q.current="",K.current)clearTimeout(K.current),K.current=null}),B=j$(()=>{if(G.current)clearTimeout(G.current),G.current=null;if(K.current)clearTimeout(K.current),K.current=null;let _=X.current,F=q.current;return X.current="",q.current="",{extraContent:_,extraThinking:F}});return TY(()=>{return()=>{O()}},[O]),{batchAppendContent:z,batchAppendThinking:W,flushContentBuffer:U,flushThinkingBuffer:H,resetStreamingBuffers:O,drainPendingBuffers:B}}var c2=n1("UI"),d4=($,Q,Y,J,Z,X)=>{let G=o1(),q=v$(),K=I1(),U=M8(),H=S$(),z=I8(),W=T8(),O=f8(),B=k8(),_=v8(),F=a1(),M=i1(),N=W4(),v=u4(!1),C=u4(!1),{createAgent:w,cleanupAgent:f,steerActiveTurn:P,listRewindCheckpoints:A,rewindSession:T,listSubagents:R,resumeSubagent:L,getMcpContentCatalog:k,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:y0,setCommunicationStyle:B0,runCodeReview:s0,executeUserShellCommand:p0}=p4({sessionId:q,workspaceRoot:K,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:U,permissionMode:H,reasoningEffort:W,serviceTier:O,responseVerbosity:B,communicationStyle:_,agents:X}),F1=x4(F),C1=h$(async(q0,f0)=>{if(q0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let Q0=q0.text.trimStart().slice(1).trim();if(!Q0)return{success:!1,error:"User shell command cannot be empty"};F.setCommand(`! ${Q0}`);try{let _0=await p0(Q0,{signal:f0});if(F.addMessage({id:`user-shell-${_0.executionId}`,role:"user",content:x2(_0.record),timestamp:Date.now(),metadata:{userShellCommand:_0.record}}),_0.delivery==="next_turn")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{F.setCommand(null)}});p2(()=>{return()=>{F1.resetStreamingBuffers()}},[F1.resetStreamingBuffers]),p2(()=>{if(!z)F.setCurrentThinkingContent(null)},[z,F]);let T$=h$(()=>{if(!G)return;Z?.();let{extraContent:q0,extraThinking:f0}=F1.drainPendingBuffers();N.abort("user-cancel"),M.setTasks([]);let Q0=Q1().session.currentStreamingMessageId;if(Q0){if(q0)D$(Q0,q0);V8(Q0)}if(F.finalizeStreamingMessage(q0,f0),!v.current)F.addAssistantMessage("任务已停止"),v.current=!0}),e0=h$(async(q0,f0)=>{let Q0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},_0=T4({sessionActions:F,appActions:M,commandActions:N,streamingBuffer:F1,thinkingModeEnabled:z,getStreamingMessageId:()=>Q1().session.currentStreamingMessageId,signal:f0.signal},Q0);return{loopResult:await l4(q0,_0),stats:Q0}}),S2=h$(async(q0)=>{let f0=!1,Q0,_0=!1,c0=q0;try{if(q0.text.trimStart().startsWith("!")){let E0=N.getAbortController()??N.createAbortController();return await C1(q0,E0.signal)}await Y8();let i0=N.getAbortController()??N.createAbortController(),l0=h8(Q1().session),b1=await m2(q0,M,F,i0.signal,f,q,h8(Q1().session),{listCheckpoints:A,execute:T},{list:R,resume:L},{getCatalog:k,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:y0,set:B0},K,{run:s0});if(b1.type==="handled")return b1.commandResult;if(b1.type==="continue_as_agent")f0=b1.result.userMessageAlreadyAdded,Q0=b1.result.onceModelId,_0=b1.result.goalContinuationOnly===!0,c0=b1.result.agentInput;let V2=U1.getInstance(),f$;if(!_0){let E0=await V2.executeUserPromptSubmitHooks(c0.text,{projectDir:K,sessionId:q,permissionMode:H,hasImages:c0.images.length>0,imageCount:c0.images.length});if(!E0.proceed){if(E0.warning)F.addAssistantMessage(`${E0.warning}`);return{success:!1,error:"blocked by hook"}}if(E0.updatedPrompt)c0={...c0,text:E0.updatedPrompt,displayText:E0.updatedPrompt,parts:[{type:"text",text:E0.updatedPrompt},...c0.parts.filter((b8)=>b8.type==="image")]};if(E0.contextInjection)f$=E0.contextInjection}if(!f0)F.addUserMessage(c0.displayText);let w8=g2(c0),r=await w(Q0?{modelId:Q0}:void 0);if(i0.signal.aborted)return c2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(f$)l0.push({role:"system",content:`<user-prompt-submit-hook>
31
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:H,agentInput:{displayText:H,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(RY(N.data)){let{modelId:M,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:M}}}if(yY(N.data)){let M=N.data.goal.objective;return Y.addUserMessage(H),{type:"continue_as_agent",result:{userDisplayMessage:H,agentInput:{displayText:H,text:M,images:[],parts:[{type:"text",text:M}]},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 v=N.message;if(N.success&&typeof v==="string"&&v.trim()!=="")Y.addAssistantMessage(v);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 TY,useRef as m8}from"react";function c4($){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,R=Y.current;if(!I&&!R)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let D=(async()=>{try{await I?.destroy()}finally{await R?.dispose()}})();Z.current=D;try{await D}finally{if(Z.current===D)Z.current=void 0}}),G=y0(async(I)=>{let R=$.workspaceRoot??Y.current?.workspaceRoot??x0();if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==R))await X();if(!Y.current){let D=await P0.findSessionMetadata(I,R),b=D!==void 0&&(await P0.loadSession(I,R)).length>0;Y.current=await _$.create({sessionId:I,workspaceRoot:R,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}),q=y0(async(I)=>{let R=I?.sessionId??$.sessionId,D=!!I?.modelId&&I.modelId!==$.modelId,b;if(!D&&R){let h=Y.current!==void 0,S=await G(R),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),R0=S.getCurrentModelId(),B0=S.getReasoningConfiguration(),s0=S.getServiceTierConfiguration(),p0=S.getResponseVerbosityConfiguration(),F1=S.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==R||J.current.permissionMode!==$.permissionMode)){let e0=await P0.setSessionPermissionMode(R,S.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:R,permissionMode:e0.permissionMode}}await S.refresh({modelId:x,...V?{reasoningEffort:V}:{},...l?{serviceTier:l}:{},...K0?{responseVerbosity:K0}:{},...Z0?{communicationStyle:Z0}:{}});let C1=S.getCommunicationStyleConfiguration();if(C1.source!=="built-in"&&!C1.contentSha256)throw Error("Custom communication style has no provenance");let T$={...x&&x!=="inherit"&&(J.current?.sessionId!==R||J.current.modelId!==x)?{selectedModelId:x}:{},...V&&(J.current?.sessionId!==R||J.current.reasoningEffort!==V)?{reasoningEffort:V}:{},...l&&(J.current?.sessionId!==R||J.current.serviceTier!==l)?{serviceTier:l}:{},...K0&&(J.current?.sessionId!==R||J.current.responseVerbosity!==K0)?{responseVerbosity:K0}:{},...Z0&&(J.current?.sessionId!==R||J.current.communicationStyle!==Z0||J.current.communicationStyleDigest!==C1.contentSha256)?{communicationStyle:Z0,communicationStyleDigest:C1.source==="built-in"?null:C1.contentSha256}:{}};if(Object.keys(T$).length>0)try{let e0=await P0.updateSessionMetadata(R,S.workspaceRoot,T$);J.current={sessionId:R,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({...R0?{modelId:R0}:{},reasoningEffort:B0.selection,serviceTier:s0.selection,responseVerbosity:p0.selection,communicationStyle:F1.selection}).catch(()=>{return}),e0}b=await J8.createWithRuntime(S,{sessionId:R,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 J8.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 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}),F=y0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await G($.sessionId)).listSubagents()}),z=y0(async(I,R)=>{if(!$.sessionId)throw Error("No active session for subagent control");let D=await G($.sessionId),b=!1,h,S=I,x=(l)=>{k$.getState().app.actions.completeSubagentProgress(S,l.status==="completed")},V=D.resumeSubagent({agentId:I,prompt:R,onEvent:(l)=>{if(l.kind==="tool_start"&&"function"in l.toolCall)k$.getState().app.actions.updateSubagentTool(S,l.toolCall.function.name)},onCompleted:(l)=>{if(b)x(l);else h=l}});if(S=V.session.id,k$.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}),W=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,R,D)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await G($.sessionId)).getMcpPrompt(I,R,D)}),_=y0(async(I,R,D)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await G($.sessionId)).completeMcpArgument(I,R,D)}),H=y0(async(I,R={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await G($.sessionId)).getMcpLogs(I,R)}),C=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)}),v=y0(async(I,R)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).cancelMcpTask(I,R)}),M=y0(async(I,R)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await G($.sessionId)).setMcpLoggingLevel(I,R)}),w=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await G($.sessionId)).getMcpInstructions()}),f=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 R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let D=R.getReasoningConfiguration();if(R.resolveReasoningConfiguration(I),D.selection===I)return D;await R.refresh({reasoningEffort:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{reasoningEffort:I})}catch(h){if(!(h instanceof Q8)&&h.code!=="ENOENT")throw h;b=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:I,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.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),R.getReasoningConfiguration()}catch(b){throw await R.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 R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let D=R.getServiceTierConfiguration();if(R.resolveServiceTierConfiguration(I),D.selection===I)return D;await R.refresh({serviceTier:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{serviceTier:I})}catch(h){if(!(h instanceof Q8)&&h.code!=="ENOENT")throw h;b=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:I,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.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),R.getServiceTierConfiguration()}catch(b){throw await R.refresh({serviceTier:D.selection}),b}}),y=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 R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let D=R.getResponseVerbosityConfiguration();if(R.resolveResponseVerbosityConfiguration(I),D.selection===I)return D;await R.refresh({responseVerbosity:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{responseVerbosity:I})}catch(h){if(!(h instanceof Q8)&&h.code!=="ENOENT")throw h;b=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:I,communicationStyle:R.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),R.getResponseVerbosityConfiguration()}catch(b){throw await R.refresh({responseVerbosity:D.selection}),b}}),k=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 R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let D=R.getCommunicationStyleConfiguration(),b=R.resolveCommunicationStyleConfiguration(I);if(b.source!=="built-in"&&!b.contentSha256)throw Error("Custom communication style has no provenance");if(D.selection===I)return D;await R.refresh({communicationStyle:I});try{let h;try{h=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{communicationStyle:I,communicationStyleDigest:b.source==="built-in"?null:b.contentSha256})}catch(S){if(!(S instanceof Q8)&&S.code!=="ENOENT")throw S;h=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.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),R.getCommunicationStyleConfiguration()}catch(h){throw await R.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,R)=>{let D=$.sessionId;if(!D)throw Error("User shell command requires a Session");return(await G(D)).executeUserShellCommand(I,R)}),a=y0(async(I,R)=>{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:R}),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:p4(x.start,S)}});return TY(()=>{let I=c8(X);return()=>{I(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:q,cleanupAgent:X,steerActiveTurn:t,runCodeReview:a,executeUserShellCommand:u,listRewindCheckpoints:K,rewindSession:U,listSubagents:F,resumeSubagent:z,getMcpContentCatalog:W,refreshMcpContentCatalogs:O,getMcpPrompt:B,completeMcpArgument:_,listMcpTasks:C,getMcpTask:N,cancelMcpTask:v,getMcpLogs:H,setMcpLoggingLevel:M,getMcpInstructions:w,getReasoningConfiguration:f,setReasoningEffort:P,getServiceTierConfiguration:A,setServiceTier:T,getResponseVerbosityConfiguration:y,setResponseVerbosity:L,getCommunicationStyleConfiguration:k,setCommunicationStyle:E}}import{useMemoizedFn as j$}from"ahooks";import{useEffect as fY,useRef as x8}from"react";function x4($){let Q=0;for(let Y of $)if(Y===`
32
+ `)Q++;return Q}function u4($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=x8(""),G=x8(null),q=x8(""),K=x8(null),U=j$(()=>{if(X.current){let _=X.current,H=$.appendAssistantContent(_);D$(H,_),X.current=""}if(G.current)clearTimeout(G.current),G.current=null}),F=j$(()=>{if(q.current)$.appendThinkingContent(q.current),q.current="";if(K.current)clearTimeout(K.current),K.current=null}),z=j$((_)=>{X.current+=_;let H=X.current;if(x4(H)>=J||H.length>=Z){U();return}if(!G.current)G.current=setTimeout(U,Y)}),W=j$((_)=>{q.current+=_;let H=q.current;if(x4(H)>=J||H.length>=Z){F();return}if(!K.current)K.current=setTimeout(F,Y)}),O=j$(()=>{if(X.current="",G.current)clearTimeout(G.current),G.current=null;if(q.current="",K.current)clearTimeout(K.current),K.current=null}),B=j$(()=>{if(G.current)clearTimeout(G.current),G.current=null;if(K.current)clearTimeout(K.current),K.current=null;let _=X.current,H=q.current;return X.current="",q.current="",{extraContent:_,extraThinking:H}});return fY(()=>{return()=>{O()}},[O]),{batchAppendContent:z,batchAppendThinking:W,flushContentBuffer:U,flushThinkingBuffer:F,resetStreamingBuffers:O,drainPendingBuffers:B}}var c2=n1("UI"),r4=($,Q,Y,J,Z,X)=>{let G=o1(),q=v$(),K=I1(),U=M8(),F=S$(),z=I8(),W=T8(),O=f8(),B=k8(),_=v8(),H=a1(),C=i1(),N=L4(),v=l4(!1),M=l4(!1),{createAgent:w,cleanupAgent:f,steerActiveTurn:P,listRewindCheckpoints:A,rewindSession:T,listSubagents:y,resumeSubagent:L,getMcpContentCatalog:k,refreshMcpContentCatalogs:E,getMcpPrompt:t,completeMcpArgument:u,listMcpTasks:a,getMcpTask:I,cancelMcpTask:R,getMcpLogs:D,setMcpLoggingLevel:b,getMcpInstructions:h,getReasoningConfiguration:S,setReasoningEffort:x,getServiceTierConfiguration:V,setServiceTier:l,getResponseVerbosityConfiguration:K0,setResponseVerbosity:Z0,getCommunicationStyleConfiguration:R0,setCommunicationStyle:B0,runCodeReview:s0,executeUserShellCommand:p0}=c4({sessionId:q,workspaceRoot:K,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:U,permissionMode:F,reasoningEffort:W,serviceTier:O,responseVerbosity:B,communicationStyle:_,agents:X}),F1=u4(H),C1=h$(async(q0,f0)=>{if(q0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let Q0=q0.text.trimStart().slice(1).trim();if(!Q0)return{success:!1,error:"User shell command cannot be empty"};H.setCommand(`! ${Q0}`);try{let _0=await p0(Q0,{signal:f0});if(H.addMessage({id:`user-shell-${_0.executionId}`,role:"user",content:x2(_0.record),timestamp:Date.now(),metadata:{userShellCommand:_0.record}}),_0.delivery==="next_turn")M.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{H.setCommand(null)}});p2(()=>{return()=>{F1.resetStreamingBuffers()}},[F1.resetStreamingBuffers]),p2(()=>{if(!z)H.setCurrentThinkingContent(null)},[z,H]);let T$=h$(()=>{if(!G)return;Z?.();let{extraContent:q0,extraThinking:f0}=F1.drainPendingBuffers();N.abort("user-cancel"),C.setTasks([]);let Q0=Q1().session.currentStreamingMessageId;if(Q0){if(q0)D$(Q0,q0);V8(Q0)}if(H.finalizeStreamingMessage(q0,f0),!v.current)H.addAssistantMessage("任务已停止"),v.current=!0}),e0=h$(async(q0,f0)=>{let Q0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},_0=f4({sessionActions:H,appActions:C,commandActions:N,streamingBuffer:F1,thinkingModeEnabled:z,getStreamingMessageId:()=>Q1().session.currentStreamingMessageId,signal:f0.signal},Q0);return{loopResult:await d4(q0,_0),stats:Q0}}),S2=h$(async(q0)=>{let f0=!1,Q0,_0=!1,c0=q0;try{if(q0.text.trimStart().startsWith("!")){let E0=N.getAbortController()??N.createAbortController();return await C1(q0,E0.signal)}await Y8();let i0=N.getAbortController()??N.createAbortController(),l0=h8(Q1().session),b1=await m2(q0,C,H,i0.signal,f,q,h8(Q1().session),{listCheckpoints:A,execute:T},{list:y,resume:L},{getCatalog:k,refresh:E,getPrompt:t,complete:u,listTasks:a,getTask:I,cancelTask:R,getLogs:D,setLoggingLevel:b,getInstructions:h},{get:S,set:x},{get:V,set:l},{get:K0,set:Z0},{get:R0,set:B0},K,{run:s0});if(b1.type==="handled")return b1.commandResult;if(b1.type==="continue_as_agent")f0=b1.result.userMessageAlreadyAdded,Q0=b1.result.onceModelId,_0=b1.result.goalContinuationOnly===!0,c0=b1.result.agentInput;let V2=U1.getInstance(),f$;if(!_0){let E0=await V2.executeUserPromptSubmitHooks(c0.text,{projectDir:K,sessionId:q,permissionMode:F,hasImages:c0.images.length>0,imageCount:c0.images.length});if(!E0.proceed){if(E0.warning)H.addAssistantMessage(`${E0.warning}`);return{success:!1,error:"blocked by hook"}}if(E0.updatedPrompt)c0={...c0,text:E0.updatedPrompt,displayText:E0.updatedPrompt,parts:[{type:"text",text:E0.updatedPrompt},...c0.parts.filter((b8)=>b8.type==="image")]};if(E0.contextInjection)f$=E0.contextInjection}if(!f0)H.addUserMessage(c0.displayText);let w8=g2(c0),r=await w(Q0?{modelId:Q0}:void 0);if(i0.signal.aborted)return c2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(f$)l0.push({role:"system",content:`<user-prompt-submit-hook>
33
33
  ${f$}
34
- </user-prompt-submit-hook>`});let X0={messages:l0,userId:"cli-user",sessionId:q,workspaceRoot:K,signal:i0.signal,confirmationHandler:Y,permissionMode:H,onPermissionModeChange:async(E0)=>{await g0().setPermissionMode(E0)}},{loopResult:k0,stats:e$}=await e0(r.chatStream(w8,X0,{stream:!0,goalContinuationOnly:_0,onTurnLimitReached:Y?async(E0)=>{let b8=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${E0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:b8.approved,reason:b8.reason}}:void 0}),i0);if(e$.compactionCount>0)F.setCompactedContext(X0.messages);if(k0.metadata?.outputTruncated)F.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let D1=k0.finalMessage||"";if(c2.debug("[handleCommandSubmit] final reply",{success:k0.success,outputLength:D1.length,turnsCount:k0.metadata?.turnsCount,toolCallsCount:k0.metadata?.toolCallsCount}),!k0.success&&k0.error?.type==="api_error"){let E0=k0.error.message||"请求失败,请检查网络连接和 API 配置";return F.addAssistantMessage(E0),{success:!1,error:E0}}if(!D1||D1.trim()===""){let E0=k0.metadata?.abortReason;if(!v.current&&e$.contentDeltaCount===0&&E0!=="interrupt")return F.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:D1??""}}return{success:!0,output:D1}}catch(i0){if(v.current)return{success:!1,error:"aborted"};let l0=S8(i0);return F.addAssistantMessage(`${l0.displayMessage}`),{success:!1,error:l0.displayMessage}}}),O$=h$(async()=>{if(Q1().command.isProcessing){C.current=!0;return}let q0=await _$.hasPendingInbox(K,q),f0=!q0&&await _$.hasActiveGoal(K,q);if(!q0&&!f0){C.current=!1;return}if(Q1().command.isProcessing){C.current=!0;return}C.current=!1,await Y8();let Q0=N.createAbortController();F1.resetStreamingBuffers(),F.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let _0=await w();if(Q0.signal.aborted)return;let c0={messages:h8(Q1().session),userId:"cli-user",sessionId:q,workspaceRoot:K,signal:Q0.signal,confirmationHandler:Y,permissionMode:H,onPermissionModeChange:async(b1)=>{await g0().setPermissionMode(b1)}},{loopResult:i0,stats:l0}=await e0(_0.chatStream("",c0,{stream:!0,pendingInputOnly:q0,goalContinuationOnly:f0}),Q0);if(l0.compactionCount>0)F.setCompactedContext(c0.messages);if(i0.metadata?.outputTruncated)F.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!i0.success&&i0.error?.type==="api_error")F.addAssistantMessage(i0.error.message||"恢复排队指令失败,请检查网络和 API 配置")}catch(_0){let c0=S8(_0);if(!c0.isAbort)F.setError(`恢复排队指令失败: ${c0.displayMessage}`)}finally{if(N.getAbortController()===Q0)N.setProcessing(!1),N.clearAbortController(Q0),F.setCurrentThinkingContent(null);if(C.current)queueMicrotask(()=>{O$()})}}),D2=h$(async(q0)=>{if(!q0.text.trim()&&q0.images.length===0)return;if(q0.text.trimStart().startsWith("!")&&G){let Q0=N.getAbortController();if(!Q0){F.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let _0=await C1(q0,Q0.signal);if(!_0.success&&_0.error&&_0.error!=="aborted")F.setError(_0.error);return}if(G){if(q0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(q0.text.trim())){await Y8();let l0=N.getAbortController()??N.createAbortController();await m2(q0,M,F,l0.signal,f,q,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,K);return}F.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await Y8();let Q0=await U1.getInstance().executeUserPromptSubmitHooks(q0.text,{projectDir:K,sessionId:q,permissionMode:H,hasImages:q0.images.length>0,imageCount:q0.images.length});if(!Q0.proceed){if(Q0.warning)F.addAssistantMessage(Q0.warning);return}let _0=q0;if(Q0.updatedPrompt)_0={...q0,text:Q0.updatedPrompt,parts:[{type:"text",text:Q0.updatedPrompt},...q0.parts.filter((l0)=>l0.type==="image")]};if(Q0.contextInjection){let l0=`<user-prompt-submit-hook>
34
+ </user-prompt-submit-hook>`});let X0={messages:l0,userId:"cli-user",sessionId:q,workspaceRoot:K,signal:i0.signal,confirmationHandler:Y,permissionMode:F,onPermissionModeChange:async(E0)=>{await g0().setPermissionMode(E0)}},{loopResult:k0,stats:e$}=await e0(r.chatStream(w8,X0,{stream:!0,goalContinuationOnly:_0,onTurnLimitReached:Y?async(E0)=>{let b8=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${E0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:b8.approved,reason:b8.reason}}:void 0}),i0);if(e$.compactionCount>0)H.setCompactedContext(X0.messages);if(k0.metadata?.outputTruncated)H.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let D1=k0.finalMessage||"";if(c2.debug("[handleCommandSubmit] final reply",{success:k0.success,outputLength:D1.length,turnsCount:k0.metadata?.turnsCount,toolCallsCount:k0.metadata?.toolCallsCount}),!k0.success&&k0.error?.type==="api_error"){let E0=k0.error.message||"请求失败,请检查网络连接和 API 配置";return H.addAssistantMessage(E0),{success:!1,error:E0}}if(!D1||D1.trim()===""){let E0=k0.metadata?.abortReason;if(!v.current&&e$.contentDeltaCount===0&&E0!=="interrupt")return H.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:D1??""}}return{success:!0,output:D1}}catch(i0){if(v.current)return{success:!1,error:"aborted"};let l0=S8(i0);return H.addAssistantMessage(`${l0.displayMessage}`),{success:!1,error:l0.displayMessage}}}),O$=h$(async()=>{if(Q1().command.isProcessing){M.current=!0;return}let q0=await _$.hasPendingInbox(K,q),f0=!q0&&await _$.hasActiveGoal(K,q);if(!q0&&!f0){M.current=!1;return}if(Q1().command.isProcessing){M.current=!0;return}M.current=!1,await Y8();let Q0=N.createAbortController();F1.resetStreamingBuffers(),H.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let _0=await w();if(Q0.signal.aborted)return;let c0={messages:h8(Q1().session),userId:"cli-user",sessionId:q,workspaceRoot:K,signal:Q0.signal,confirmationHandler:Y,permissionMode:F,onPermissionModeChange:async(b1)=>{await g0().setPermissionMode(b1)}},{loopResult:i0,stats:l0}=await e0(_0.chatStream("",c0,{stream:!0,pendingInputOnly:q0,goalContinuationOnly:f0}),Q0);if(l0.compactionCount>0)H.setCompactedContext(c0.messages);if(i0.metadata?.outputTruncated)H.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!i0.success&&i0.error?.type==="api_error")H.addAssistantMessage(i0.error.message||"恢复排队指令失败,请检查网络和 API 配置")}catch(_0){let c0=S8(_0);if(!c0.isAbort)H.setError(`恢复排队指令失败: ${c0.displayMessage}`)}finally{if(N.getAbortController()===Q0)N.setProcessing(!1),N.clearAbortController(Q0),H.setCurrentThinkingContent(null);if(M.current)queueMicrotask(()=>{O$()})}}),D2=h$(async(q0)=>{if(!q0.text.trim()&&q0.images.length===0)return;if(q0.text.trimStart().startsWith("!")&&G){let Q0=N.getAbortController();if(!Q0){H.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let _0=await C1(q0,Q0.signal);if(!_0.success&&_0.error&&_0.error!=="aborted")H.setError(_0.error);return}if(G){if(q0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(q0.text.trim())){await Y8();let l0=N.getAbortController()??N.createAbortController();await m2(q0,C,H,l0.signal,f,q,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,K);return}H.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await Y8();let Q0=await U1.getInstance().executeUserPromptSubmitHooks(q0.text,{projectDir:K,sessionId:q,permissionMode:F,hasImages:q0.images.length>0,imageCount:q0.images.length});if(!Q0.proceed){if(Q0.warning)H.addAssistantMessage(Q0.warning);return}let _0=q0;if(Q0.updatedPrompt)_0={...q0,text:Q0.updatedPrompt,parts:[{type:"text",text:Q0.updatedPrompt},...q0.parts.filter((l0)=>l0.type==="image")]};if(Q0.contextInjection){let l0=`<user-prompt-submit-hook>
35
35
  ${Q0.contextInjection}
36
36
  </user-prompt-submit-hook>`;_0={..._0,text:`${_0.text}
37
37
 
38
38
  ${l0}`,parts:[..._0.parts,{type:"text",text:`
39
39
 
40
- ${l0}`}]}}let c0=g2(_0),i0=await P(c0);if(!i0.accepted){let l0=i0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";F.addAssistantMessage(l0);return}if(N.enqueueCommand(q0),F.addUserMessage(q0.displayText),i0.delivery==="next_turn"){if(C.current=!0,!Q1().command.isProcessing)queueMicrotask(()=>{O$()})}return}M.setTasks([]),N.setRecoveredSteeringCount(0),v.current=!1;let f0=N.createAbortController();F1.resetStreamingBuffers(),F.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let Q0=await S2(q0);if(!Q0.success&&Q0.error&&Q0.error!=="aborted")F.setError(Q0.error)}catch(Q0){let _0=S8(Q0);if(_0.isAbort);else F.setError(`执行失败: ${_0.displayMessage}`)}finally{if(N.getAbortController()===f0){if(N.setProcessing(!1),N.clearAbortController(f0),F.setCurrentThinkingContent(null),C.current)queueMicrotask(()=>{O$()})}}});return p2(()=>{let q0=!1;return(async()=>{if(Y)await u2.resolvePendingWithHandler(K,q,Y);else await u2.cancelPendingNonInteractive(K,q);if(q0)return;let[f0,Q0]=await Promise.all([_$.hasPendingInbox(K,q),_$.hasActiveGoal(K,q)]);if(f0||Q0)await O$()})().catch((f0)=>{if(!q0)c2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",f0)}),()=>{q0=!0}},[Y,O$,q,K]),{executeCommand:D2,handleAbort:T$,isProcessing:G,cleanupAgent:f}};import{useMemoizedFn as u8}from"ahooks";import{useState as r4}from"react";var a4=()=>{let[$,Q]=r4([]),[Y,J]=r4(-1),Z=u8((K,U)=>{let H={display:K,pasteMappings:U?new Map(U):new Map};Q((z)=>[...z,H]),J(-1)}),X=u8(()=>{if($.length===0)return null;let K=Y===-1?$.length-1:Math.max(0,Y-1);return J(K),$[K]||null}),G=u8(()=>{if(Y===-1)return null;let K=Y+1;if(K>=$.length)return J(-1),null;else return J(K),$[K]||null}),q=u8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:G,resetHistoryIndex:q}};import{useMemoizedFn as Z8}from"ahooks";import{useMemo as fY,useRef as i4,useState as kY}from"react";var o4=()=>{let[$,Q]=kY({isVisible:!1,details:null,resolver:null}),Y=i4(null),J=i4([]),Z=Z8((H)=>{Y.current=H,Q({isVisible:Boolean(H),details:H?.details??null,resolver:H?.resolve??null})}),X=Z8((H,z)=>{if(H.settled)return;if(H.settled=!0,H.signal&&H.abortListener)H.signal.removeEventListener("abort",H.abortListener);H.resolve(z)}),G=Z8((H,z)=>{return new Promise((W)=>{let O={details:H,resolve:W,signal:z,settled:!1},B=()=>{if(Y.current===O){X(O,{approved:!1,reason:X8}),Z(J.current.shift()??null);return}let _=J.current.indexOf(O);if(_>=0)J.current.splice(_,1);X(O,{approved:!1,reason:X8})};if(O.abortListener=B,z?.aborted){B();return}if(z?.addEventListener("abort",B,{once:!0}),!Y.current){Z(O);return}J.current.push(O)})}),q=Z8((H)=>{let z=Y.current;if(z)X(z,H);let W=J.current.shift()??null;Z(W)}),K=Z8(()=>{if(Y.current)X(Y.current,{approved:!1,reason:X8});for(let H of J.current)X(H,{approved:!1,reason:X8});J.current=[],Z(null)}),U=fY(()=>({requestConfirmation:G}),[G]);return{confirmationState:$,confirmationHandler:U,handleResponse:q,dismissAll:K}};import{useMemoizedFn as N$}from"ahooks";import{useRef as n4,useState as vY}from"react";var l8="␞",d8="␟";function r8($){return`${l8}PASTE:${$}:`}function l2(){return d8}var qG=new RegExp(`${l8}PASTE:(\\d+):[\\s\\S]*?${d8}`,"g");function SY($){return $.includes(l8)&&$.includes(d8)}function t4($="",Q=0){let[Y,J]=vY({value:$,cursorPosition:Q}),Z=n4(0),X=n4(new Map),G=N$((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)}}),q=N$((O)=>{J((B)=>({...B,cursorPosition:Math.max(0,Math.min(O,B.value.length))}))}),K=N$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),U=N$((O)=>{Z.current+=1;let B=Z.current;return X.current.set(B,{type:"text",data:O}),B}),H=N$((O,B)=>{let _=[...X.current.values()].filter((v)=>v.type==="image");if(_.length>=V$)throw Error(`最多只能粘贴 ${V$} 张图片`);let F=_.reduce((v,C)=>v+`data:${C.mimeType};base64,`.length+C.data.length,0),M=`data:${B};base64,`.length+O.length;if(F+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=N$((O)=>{for(let[B,_]of O)if(X.current.set(B,_),B>=Z.current)Z.current=B}),W=N$((O)=>{let B=[],_=[];if(!SY(O)){let T=O.trim();if(T)_.push({type:"text",text:T});return{displayText:O,text:O,images:B,parts:_}}let F=new RegExp(`${l8}PASTE:(\\d+):[\\s\\S]*?${d8}`,"g"),M=Array.from(O.matchAll(F)),N=0,v="",C="";for(let T of M){let R=T.index,L=R+T[0].length,k=parseInt(T[1],10),E=X.current.get(k);if(R>N){let t=O.slice(N,R);_.push({type:"text",text:t}),v+=t,C+=t}if(!E)v+=T[0],C+=T[0],_.push({type:"text",text:T[0]});else if(E.type==="text")v+=E.data,C+=E.data,_.push({type:"text",text:E.data});else{let t={id:k,base64:E.data,mimeType:E.mimeType};B.push(t),_.push({type:"image",...t}),C+=`[Image #${k}]`}N=L}if(N<O.length){let T=O.slice(N);_.push({type:"text",text:T}),v+=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 f=0,P=w.length;while(f<w.length&&w[f].type==="text"&&w[f].text.trim()==="")f++;while(P>f&&w[P-1].type==="text"&&w[P-1].text.trim()==="")P--;let A=w.slice(f,P);return{displayText:C.trim(),text:v.trim(),images:B,parts:A}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:G,setCursorPosition:q,clear:K,pasteMap:X.current,addPasteMapping:U,addImagePasteMapping:H,restorePasteMappings:z,resolveInput:W}}import{useMemoizedFn as X6}from"ahooks";import{useInput as pY}from"ink";import{useEffect as G6,useRef as K6,useState as i2}from"react";function DY($){return{supportsThinking:V1().resolveConfig($).reasoning}}function a8($){return DY($).supportsThinking}import VY from"fast-glob";import jY from"fuse.js";import{useEffect as s4,useMemo as d2,useState as r2}from"react";var E$=null,hY=5000;function EY($,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 q=Z.slice(1),K=!1;if(q.startsWith('"')){if(K=!0,q=q.slice(1),q.endsWith('"'))q=q.slice(0,-1)}return{hasQuery:!0,query:q,startIndex:X,endIndex:G,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var gY=[...a2.map(($)=>`${$}/**`),...a2,...e4.map(($)=>`**/${$}`)];function $6($,Q,Y={}){let{cwd:J=x0(),maxSuggestions:Z=15,ignorePatterns:X=gY,debounceDelay:G=300,fuzzyMatch:q=!0}=Y,[K,U]=r2([]),[H,z]=r2(!1),[W,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 EY($,Q)},[$,Q]);s4(()=>{if(!$.includes("@")){U([]),z(!1);return}let M=Date.now();if(E$&&E$.cwd===J&&E$.ignoreKey===B&&M-E$.timestamp<hY){U(E$.files),z(!1);return}let N=!1,C=setTimeout(async()=>{z(!0);try{let f=(await VY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((P)=>P.replace(/\\/g,"/"));if(!N)U(f),E$={cwd:J,ignoreKey:B,files:f,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 F=d2(()=>{if(!_.hasQuery||K.length===0)return[];let M=_.query.toLowerCase();if(M==="")return K.slice(0,Z);if(q)return new jY(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,q]);return s4(()=>{O(0)},[F]),{..._,suggestions:F,selectedIndex:W,loading:H}}function mY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function Q6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=mY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),G=Z+J+" "+X,q=Q.startIndex+J.length+1;return{newInput:G,newCursorPos:q}}import{useMemoizedFn as J6}from"ahooks";import{useEffect as Y6,useRef as Z6}from"react";var v0=($,Q)=>{let Y=Z6(!1),J=Z6(null),Z=J6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{G8().shutdown("SIGINT",0)},G=J6(()=>{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 Y6(()=>{if($){if(r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),Y6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),G};var i8=n1("UI"),z6=($,Q,Y,J,Z,X,G,q,K,U)=>{let z=$1()==="main-input",W=$.value,O=$.setValue,B=$.cursorPosition,_=a1(),F=I1(),M=i1(),N=R8(),v=N?a8(N):!1,[C,w]=i2(!1),[f,P]=i2([]),[A,T]=i2(0),R=$6(W,B,{cwd:F,maxSuggestions:10}),L=v0(G||!1,X),k=K6(0),E=500,t=K6(!1);G6(()=>{if(G)t.current=!1},[G]),G6(()=>{if(R.hasQuery&&R.suggestions.length>0){let I=R.suggestions.map((y)=>({command:y,description:q6(y)?`Directory: ${y}`:`File: ${y}`,matchScore:1}));P(I),w(!0),T(0)}else if(W.startsWith("/"))if(W.includes(" "))w(!1),P([]);else{let y=U6(W,F);P(y),w(y.length>0),T(0)}else w(!1),P([])},[W,R.hasQuery,R.suggestions,F]);let u=X6(()=>{_.clearMessages(),_.setError(null)}),a=X6(()=>{i8.debug("[DIAG] handleSubmit called:",{input:W,showSuggestions:C});let I=W.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 pY((I,y)=>{if(I==="?"&&!W){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==="?"&&!W))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)K?.();else if(G&&X){if(t.current)return;t.current=!0,X()}else if(C)w(!1),P([]);else if(W){let b=Date.now();if(b-k.current<500)$.clear(),k.current=0;else k.current=b}return}if(y.tab&&y.shift){q?.();return}if(y.tab){if(C&&f.length>0){let b=f[A].command;if(R.hasQuery&&R.suggestions.includes(b)){let{newInput:h,newCursorPos:S}=Q6(W,R,b);O(h),$.setCursorPosition(S)}else{let h=b+" ";O(h),$.setCursorPosition(h.length)}w(!1),P([])}else if(v)M.toggleThinkingMode();return}if(y.return){a();return}if(y.upArrow){if(C&&f.length>0){let b=f.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&&f.length>0){let b=f.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:f,selectedSuggestionIndex:A}};import dY from"ansi-escapes";import{useStdout as rY}from"ink";import{useCallback as aY,useEffect as iY,useRef as oY}from"react";import{useStdout as cY}from"ink";import{debounce as xY}from"lodash-es";import{useEffect as uY,useState as lY}from"react";function g$($=200){let{stdout:Q}=cY(),[Y,J]=lY(Q.columns||80);return uY(()=>{let Z=xY(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function O6(){let{stdout:$}=rY(),Q=g$(),Y=oY(!0),J=s((X)=>X.session.actions.incrementClearCount),Z=aY(()=>{if($)$.write(dY.clearTerminal);J()},[$,J]);return iY(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import _6 from"node:fs";import nY from"node:os";import o2 from"node:path";import{MultiSelect as tY}from"@inkjs/ui";import{useMemoizedFn as o8}from"ahooks";import{Box as Y0,Text as n,useFocus as sY,useFocusManager as eY,useInput as F6}from"ink";import n8 from"ink-select-input";import $3 from"ink-spinner";import K8 from"ink-text-input";import{useEffect as N6,useState as m$}from"react";import{jsxDEV as j}from"react/jsx-dev-runtime";var Q3=[{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"}],J3=[{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 Y3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function q8({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=m$(Y?"name":"mode"),[X,G]=m$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[q,K]=m$(""),[U,H]=m$(!1),[z,W]=m$(""),[O,B]=m$(Y?"edit":"manual"),{focus:_}=eY(),M={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[O];N6(()=>{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])}),v=o8(()=>{if(z)W("");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),W("");try{let P=await J8.create(),A=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
40
+ ${l0}`}]}}let c0=g2(_0),i0=await P(c0);if(!i0.accepted){let l0=i0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";H.addAssistantMessage(l0);return}if(N.enqueueCommand(q0),H.addUserMessage(q0.displayText),i0.delivery==="next_turn"){if(M.current=!0,!Q1().command.isProcessing)queueMicrotask(()=>{O$()})}return}C.setTasks([]),N.setRecoveredSteeringCount(0),v.current=!1;let f0=N.createAbortController();F1.resetStreamingBuffers(),H.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let Q0=await S2(q0);if(!Q0.success&&Q0.error&&Q0.error!=="aborted")H.setError(Q0.error)}catch(Q0){let _0=S8(Q0);if(_0.isAbort);else H.setError(`执行失败: ${_0.displayMessage}`)}finally{if(N.getAbortController()===f0){if(N.setProcessing(!1),N.clearAbortController(f0),H.setCurrentThinkingContent(null),M.current)queueMicrotask(()=>{O$()})}}});return p2(()=>{let q0=!1;return(async()=>{if(Y)await u2.resolvePendingWithHandler(K,q,Y);else await u2.cancelPendingNonInteractive(K,q);if(q0)return;let[f0,Q0]=await Promise.all([_$.hasPendingInbox(K,q),_$.hasActiveGoal(K,q)]);if(f0||Q0)await O$()})().catch((f0)=>{if(!q0)c2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",f0)}),()=>{q0=!0}},[Y,O$,q,K]),{executeCommand:D2,handleAbort:T$,isProcessing:G,cleanupAgent:f}};import{useMemoizedFn as u8}from"ahooks";import{useState as a4}from"react";var i4=()=>{let[$,Q]=a4([]),[Y,J]=a4(-1),Z=u8((K,U)=>{let F={display:K,pasteMappings:U?new Map(U):new Map};Q((z)=>[...z,F]),J(-1)}),X=u8(()=>{if($.length===0)return null;let K=Y===-1?$.length-1:Math.max(0,Y-1);return J(K),$[K]||null}),G=u8(()=>{if(Y===-1)return null;let K=Y+1;if(K>=$.length)return J(-1),null;else return J(K),$[K]||null}),q=u8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:G,resetHistoryIndex:q}};import{useMemoizedFn as Z8}from"ahooks";import{useMemo as kY,useRef as o4,useState as vY}from"react";var n4=()=>{let[$,Q]=vY({isVisible:!1,details:null,resolver:null}),Y=o4(null),J=o4([]),Z=Z8((F)=>{Y.current=F,Q({isVisible:Boolean(F),details:F?.details??null,resolver:F?.resolve??null})}),X=Z8((F,z)=>{if(F.settled)return;if(F.settled=!0,F.signal&&F.abortListener)F.signal.removeEventListener("abort",F.abortListener);F.resolve(z)}),G=Z8((F,z)=>{return new Promise((W)=>{let O={details:F,resolve:W,signal:z,settled:!1},B=()=>{if(Y.current===O){X(O,{approved:!1,reason:X8}),Z(J.current.shift()??null);return}let _=J.current.indexOf(O);if(_>=0)J.current.splice(_,1);X(O,{approved:!1,reason:X8})};if(O.abortListener=B,z?.aborted){B();return}if(z?.addEventListener("abort",B,{once:!0}),!Y.current){Z(O);return}J.current.push(O)})}),q=Z8((F)=>{let z=Y.current;if(z)X(z,F);let W=J.current.shift()??null;Z(W)}),K=Z8(()=>{if(Y.current)X(Y.current,{approved:!1,reason:X8});for(let F of J.current)X(F,{approved:!1,reason:X8});J.current=[],Z(null)}),U=kY(()=>({requestConfirmation:G}),[G]);return{confirmationState:$,confirmationHandler:U,handleResponse:q,dismissAll:K}};import{useMemoizedFn as N$}from"ahooks";import{useRef as t4,useState as SY}from"react";var l8="␞",d8="␟";function r8($){return`${l8}PASTE:${$}:`}function l2(){return d8}var UG=new RegExp(`${l8}PASTE:(\\d+):[\\s\\S]*?${d8}`,"g");function DY($){return $.includes(l8)&&$.includes(d8)}function s4($="",Q=0){let[Y,J]=SY({value:$,cursorPosition:Q}),Z=t4(0),X=t4(new Map),G=N$((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)}}),q=N$((O)=>{J((B)=>({...B,cursorPosition:Math.max(0,Math.min(O,B.value.length))}))}),K=N$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),U=N$((O)=>{Z.current+=1;let B=Z.current;return X.current.set(B,{type:"text",data:O}),B}),F=N$((O,B)=>{let _=[...X.current.values()].filter((v)=>v.type==="image");if(_.length>=V$)throw Error(`最多只能粘贴 ${V$} 张图片`);let H=_.reduce((v,M)=>v+`data:${M.mimeType};base64,`.length+M.data.length,0),C=`data:${B};base64,`.length+O.length;if(H+C>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=N$((O)=>{for(let[B,_]of O)if(X.current.set(B,_),B>=Z.current)Z.current=B}),W=N$((O)=>{let B=[],_=[];if(!DY(O)){let T=O.trim();if(T)_.push({type:"text",text:T});return{displayText:O,text:O,images:B,parts:_}}let H=new RegExp(`${l8}PASTE:(\\d+):[\\s\\S]*?${d8}`,"g"),C=Array.from(O.matchAll(H)),N=0,v="",M="";for(let T of C){let y=T.index,L=y+T[0].length,k=parseInt(T[1],10),E=X.current.get(k);if(y>N){let t=O.slice(N,y);_.push({type:"text",text:t}),v+=t,M+=t}if(!E)v+=T[0],M+=T[0],_.push({type:"text",text:T[0]});else if(E.type==="text")v+=E.data,M+=E.data,_.push({type:"text",text:E.data});else{let t={id:k,base64:E.data,mimeType:E.mimeType};B.push(t),_.push({type:"image",...t}),M+=`[Image #${k}]`}N=L}if(N<O.length){let T=O.slice(N);_.push({type:"text",text:T}),v+=T,M+=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 f=0,P=w.length;while(f<w.length&&w[f].type==="text"&&w[f].text.trim()==="")f++;while(P>f&&w[P-1].type==="text"&&w[P-1].text.trim()==="")P--;let A=w.slice(f,P);return{displayText:M.trim(),text:v.trim(),images:B,parts:A}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:G,setCursorPosition:q,clear:K,pasteMap:X.current,addPasteMapping:U,addImagePasteMapping:F,restorePasteMappings:z,resolveInput:W}}import{useMemoizedFn as G6}from"ahooks";import{useInput as cY}from"ink";import{useEffect as K6,useRef as q6,useState as i2}from"react";function VY($){return{supportsThinking:V1().resolveConfig($).reasoning}}function a8($){return VY($).supportsThinking}import jY from"fast-glob";import hY from"fuse.js";import{useEffect as e4,useMemo as d2,useState as r2}from"react";var E$=null,EY=5000;function gY($,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 q=Z.slice(1),K=!1;if(q.startsWith('"')){if(K=!0,q=q.slice(1),q.endsWith('"'))q=q.slice(0,-1)}return{hasQuery:!0,query:q,startIndex:X,endIndex:G,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var mY=[...a2.map(($)=>`${$}/**`),...a2,...$6.map(($)=>`**/${$}`)];function Q6($,Q,Y={}){let{cwd:J=x0(),maxSuggestions:Z=15,ignorePatterns:X=mY,debounceDelay:G=300,fuzzyMatch:q=!0}=Y,[K,U]=r2([]),[F,z]=r2(!1),[W,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 gY($,Q)},[$,Q]);e4(()=>{if(!$.includes("@")){U([]),z(!1);return}let C=Date.now();if(E$&&E$.cwd===J&&E$.ignoreKey===B&&C-E$.timestamp<EY){U(E$.files),z(!1);return}let N=!1,M=setTimeout(async()=>{z(!0);try{let f=(await jY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((P)=>P.replace(/\\/g,"/"));if(!N)U(f),E$={cwd:J,ignoreKey:B,files:f,timestamp:C}}catch(w){if(console.error("Failed to load files for @ completion:",w),!N)U([])}finally{if(!N)z(!1)}},G);return()=>{N=!0,clearTimeout(M)}},[$,J,G,B]);let H=d2(()=>{if(!_.hasQuery||K.length===0)return[];let C=_.query.toLowerCase();if(C==="")return K.slice(0,Z);if(q)return new hY(K,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(C).slice(0,Z).map((M)=>M.item);return K.filter((N)=>N.toLowerCase().includes(C)).slice(0,Z)},[_,K,Z,q]);return e4(()=>{O(0)},[H]),{..._,suggestions:H,selectedIndex:W,loading:F}}function pY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function J6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=pY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),G=Z+J+" "+X,q=Q.startIndex+J.length+1;return{newInput:G,newCursorPos:q}}import{useMemoizedFn as Y6}from"ahooks";import{useEffect as Z6,useRef as X6}from"react";var v0=($,Q)=>{let Y=X6(!1),J=X6(null),Z=Y6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{G8().shutdown("SIGINT",0)},G=Y6(()=>{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 Z6(()=>{if($){if(r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),Z6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),G};var i8=n1("UI"),O6=($,Q,Y,J,Z,X,G,q,K,U)=>{let z=$1()==="main-input",W=$.value,O=$.setValue,B=$.cursorPosition,_=a1(),H=I1(),C=i1(),N=y8(),v=N?a8(N):!1,[M,w]=i2(!1),[f,P]=i2([]),[A,T]=i2(0),y=Q6(W,B,{cwd:H,maxSuggestions:10}),L=v0(G||!1,X),k=q6(0),E=500,t=q6(!1);K6(()=>{if(G)t.current=!1},[G]),K6(()=>{if(y.hasQuery&&y.suggestions.length>0){let I=y.suggestions.map((R)=>({command:R,description:U6(R)?`Directory: ${R}`:`File: ${R}`,matchScore:1}));P(I),w(!0),T(0)}else if(W.startsWith("/"))if(W.includes(" "))w(!1),P([]);else{let R=z6(W,H);P(R),w(R.length>0),T(0)}else w(!1),P([])},[W,y.hasQuery,y.suggestions,H]);let u=G6(()=>{_.clearMessages(),_.setError(null)}),a=G6(()=>{i8.debug("[DIAG] handleSubmit called:",{input:W,showSuggestions:M});let I=W.trim();if(I){let R=$.resolveInput(I);i8.debug("[DIAG] Submitting command:",{displayText:I,textLength:R.text.length,imageCount:R.images.length}),w(!1),P([]);let D=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(I,D),$.clear(),Q(R),i8.debug("[DIAG] Command submitted to onSubmit callback")}else i8.debug("[DIAG] Empty command, not submitting")});return cY((I,R)=>{if(I==="?"&&!W){K?.(),setTimeout(()=>$.clear(),0);return}if(R.backspace||R.delete||R.leftArrow||R.rightArrow||R.pageUp||R.pageDown||!R.ctrl&&!R.meta&&!R.escape&&!R.tab&&!R.upArrow&&!R.downArrow&&!R.return&&!(I==="?"&&!W))return;if(R.ctrl&&I==="c"||R.meta&&I==="c"||R.ctrl&&I==="d"||R.meta&&I==="d"){L();return}if(R.ctrl&&I==="l"||R.meta&&I==="l"){u();return}if(R.ctrl&&I==="t"||R.meta&&I==="t"){_.toggleThinkingExpanded();return}if(R.ctrl&&I==="o"||R.meta&&I==="o"){_.toggleHistoryExpanded();return}if(R.escape){if(U)K?.();else if(G&&X){if(t.current)return;t.current=!0,X()}else if(M)w(!1),P([]);else if(W){let b=Date.now();if(b-k.current<500)$.clear(),k.current=0;else k.current=b}return}if(R.tab&&R.shift){q?.();return}if(R.tab){if(M&&f.length>0){let b=f[A].command;if(y.hasQuery&&y.suggestions.includes(b)){let{newInput:h,newCursorPos:S}=J6(W,y,b);O(h),$.setCursorPosition(S)}else{let h=b+" ";O(h),$.setCursorPosition(h.length)}w(!1),P([])}else if(v)C.toggleThinkingMode();return}if(R.return){a();return}if(R.upArrow){if(M&&f.length>0){let b=f.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(R.downArrow){if(M&&f.length>0){let b=f.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:M,suggestions:f,selectedSuggestionIndex:A}};import rY from"ansi-escapes";import{useStdout as aY}from"ink";import{useCallback as iY,useEffect as oY,useRef as nY}from"react";import{useStdout as xY}from"ink";import{debounce as uY}from"lodash-es";import{useEffect as lY,useState as dY}from"react";function g$($=200){let{stdout:Q}=xY(),[Y,J]=dY(Q.columns||80);return lY(()=>{let Z=uY(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function _6(){let{stdout:$}=aY(),Q=g$(),Y=nY(!0),J=s((X)=>X.session.actions.incrementClearCount),Z=iY(()=>{if($)$.write(rY.clearTerminal);J()},[$,J]);return oY(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import N6 from"node:fs";import tY from"node:os";import o2 from"node:path";import{MultiSelect as sY}from"@inkjs/ui";import{useMemoizedFn as o8}from"ahooks";import{Box as Y0,Text as n,useFocus as eY,useFocusManager as $3,useInput as H6}from"ink";import n8 from"ink-select-input";import Q3 from"ink-spinner";import K8 from"ink-text-input";import{useEffect as F6,useState as m$}from"react";import{jsxDEV as j}from"react/jsx-dev-runtime";var J3=[{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"}],Y3=[{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 Z3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function q8({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=m$(Y?"name":"mode"),[X,G]=m$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[q,K]=m$(""),[U,F]=m$(!1),[z,W]=m$(""),[O,B]=m$(Y?"edit":"manual"),{focus:_}=$3(),C={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[O];F6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;_(`step-${J}`)},[J,_]);let N=o8(()=>{let P=C.indexOf(J);if(P<C.length-1)Z(C[P+1])}),v=o8(()=>{if(z)W("");if(J==="confirm"&&O==="ai"){Z("aiPrompt");return}let P=C.indexOf(J);if(P>0)Z(C[P-1]);else Q()}),M=o8(async()=>{F(!0),W("");try{let P=await J8.create(),A=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
41
41
 
42
42
  ## 可用工具列表
43
43
 
@@ -75,7 +75,7 @@ ${l0}`}]}}let c0=g2(_0),i0=await P(c0);if(!i0.accepted){let l0=i0.reason==="queu
75
75
  4. **color**: 选择一个合适的颜色用于 UI 区分
76
76
  5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
77
77
 
78
- **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,R=(await P.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
78
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,y=(await P.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
79
79
 
80
80
  ## 可用工具列表
81
81
 
@@ -113,48 +113,48 @@ ${l0}`}]}}let c0=g2(_0),i0=await P(c0);if(!i0.accepted){let l0=i0.reason==="queu
113
113
  4. **color**: 选择一个合适的颜色用于 UI 区分
114
114
  5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
115
115
 
116
- **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,q)).trim(),L=R.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(L)R=L[1];let k=JSON.parse(R);if(!k.name||!k.description||!k.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(k.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");G({name:k.name,description:k.description,tools:Array.isArray(k.tools)?k.tools:[],color:k.color||"blue",location:"project",systemPrompt:k.systemPrompt}),Z("confirm")}catch(P){W(P instanceof Error?P.message:String(P))}finally{H(!1)}});N6(()=>{if(J==="aiGenerating"&&!U&&!z)C()},[J,U,z,C]);let w=o8(async()=>{try{let P=X.location==="project"?o2.join(x0(),".blade","agents"):o2.join(nY.homedir(),".blade","agents");await _6.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(`
116
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,q)).trim(),L=y.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(L)y=L[1];let k=JSON.parse(y);if(!k.name||!k.description||!k.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(k.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");G({name:k.name,description:k.description,tools:Array.isArray(k.tools)?k.tools:[],color:k.color||"blue",location:"project",systemPrompt:k.systemPrompt}),Z("confirm")}catch(P){W(P instanceof Error?P.message:String(P))}finally{F(!1)}});F6(()=>{if(J==="aiGenerating"&&!U&&!z)M()},[J,U,z,M]);let w=o8(async()=>{try{let P=X.location==="project"?o2.join(x0(),".blade","agents"):o2.join(tY.homedir(),".blade","agents");await N6.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=o2.join(P,`${X.name}.md`);await _6.promises.writeFile(R,T,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),f=v0(!1,Q);if(F6((P,A)=>{if(A.escape)v();else if(A.ctrl&&P==="c"||A.meta&&P==="c")f()},{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(K8,{value:q,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(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($3,{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:['根据你的描述:"',q,'"']},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(K8,{value:X.name,onChange:(A)=>G({...X,name:A}),onSubmit:(A)=>{if(Y3(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(K8,{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(K8,{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(Z3,{config:X,setConfig:G,onNext:N,onPrev:v},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:J3,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(K8,{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")v();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function Z3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=sY({id:"step-tools"});F6((G,q)=>{if(q.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(tY,{options:Q3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import X3 from"node:fs";import{useMemoizedFn as F$}from"ahooks";import{Box as C0,Text as S0,useInput as G3}from"ink";import n2 from"ink-select-input";import{useEffect as K3,useMemo as H6,useState as t8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var t2=10;function L6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=W6($),[X,G]=t8(Q),[q,K]=t8(null),[U,H]=t8(0),[z,W]=t8(0),O=F$(()=>{Z.clear(),Z.loadFromStandardLocations(),H((R)=>R+1)}),B=H6(()=>{return Z.getAllSubagents()},[U]),_=Math.ceil(B.length/t2)||1,F=H6(()=>{let R=z*t2;return B.slice(R,R+t2)},[B,z]);K3(()=>{let R=Math.max(0,_-1);if(z>R)W(R)},[_,z]);let M=F$(()=>{if(z<_-1)W((R)=>R+1)}),N=F$(()=>{if(z>0)W((R)=>R-1)}),v=[{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=F$((R)=>{if(R.value==="cancel"){J?.();return}G(R.value)}),w=F$((R)=>{if(K(R.value),X==="edit")G("editWizard");else if(X==="delete")G("deleteConfirm")}),f=F$(async()=>{if(!q?.configPath)return;try{await X3.promises.unlink(q.configPath),O(),P()}catch(R){console.error("删除失败:",R)}}),P=F$(()=>{G("menu"),K(null)}),A=v0(!1,J);if(G3((R,L)=>{if(L.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")W(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:v,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),F.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((k)=>({key:k.name,label:`${k.name} - ${k.description}`,value:k}));return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(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(q8,{onComplete:()=>{O(),P()},onCancel:P},void 0,!1,void 0,this);if(X==="edit")return T("编辑 Agent");if(X==="editWizard"&&q){let R={name:q.name,description:q.description,tools:q.tools||[],color:q.color,location:q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:q.systemPrompt||""};return i(q8,{initialConfig:R,onComplete:()=>{O(),P()},onCancel:P},void 0,!1,void 0,this)}if(X==="delete")return T("删除 Agent");if(X==="deleteConfirm"&&q)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(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:q.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(S0,{dimColor:!0,children:["文件路径: ",q.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(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")f();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as p$,Text as O0}from"ink";import U3,{useEffect as z3,useState as O3}from"react";import{useEffect as q3,useState as B6}from"react";function A6($=x0(),Q=5000){let[Y,J]=B6(null),[Z,X]=B6(!0);return q3(()=>{let G=!0,q=async()=>{try{let U=await w6($);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)}};q();let K=null;if(Q>0)K=setInterval(q,Q);return()=>{if(G=!1,K)clearInterval(K)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as o,Fragment as A1}from"react/jsx-dev-runtime";var P6=U3.memo(()=>{let $=y8(),Q=S$(),J=P8()==="shortcuts",Z=O4(),X=I1(),{branch:G}=A6(X),q=R8(),K=X4(),U=Q4(),H=I8(),z=T8(),W=f8(),O=k8(),B=v8(),_=J4(),F=C8(),M=L4(),N=v$(),[v,C]=O3(null);z3(()=>{let R=!1;new s2(X,N).get().then((E)=>{if(!R)C(E)}).catch(()=>{if(!R)C(null)});let k=s2.subscribe((E)=>{if(!R&&E.sessionId===N&&E.workspaceRoot===X)C(E.goal)});return()=>{R=!0,k()}},[N,X]);let w=q?a8(q):!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(p$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?o(p$,{flexDirection:"column",gap:0,children:T.map((R,L)=>o(p$,{flexDirection:"row",children:[R.map((k,E)=>{let[t,u]=k.split(":");return o(p$,{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(p$,{flexDirection:"row",gap:1,children:[G&&o(A1,{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),v&&o(A1,{children:[o(O0,{color:v.status==="active"?"green":v.status==="verifying"?"cyan":v.status==="blocked"||v.status==="budget_limited"?"yellow":"gray",children:["goal:",v.status," ",v.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(p$,{flexDirection:"row",gap:1,children:!$?o(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):o(A1,{children:[w&&o(A1,{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),W!=="auto"&&o(A1,{children:[o(O0,{color:W==="fast"?"yellow":"gray",children:["Speed ",W]},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(A1,{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(A1,{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),q&&o(O0,{color:"gray",children:q.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:K<20?"red":K<50?"yellow":"gray",children:[K,"%"]},void 0,!0,void 0,this),_>0.001&&o(A1,{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),F.length>0&&o(A1,{children:[o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(O0,{color:"yellow",children:["已排队 ",F.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),M>0&&o(A1,{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(A1,{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 _3 from"react";import{jsxDEV as c$}from"react/jsx-dev-runtime";var y6=_3.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 q=$.slice(Z,X),K=$.length>J;return c$(e2,{flexDirection:"column",paddingX:2,paddingY:0,children:[q.map((U,H)=>{let W=Z+H===Q;return c$(e2,{flexDirection:"row",paddingX:1,gap:2,children:[c$($Q,{color:W?"cyan":"white",bold:W,children:U.command},void 0,!1,void 0,this),c$($Q,{color:W?"cyan":"gray",dimColor:!W,children:["- ",U.description]},void 0,!0,void 0,this)]},U.command,!0,void 0,this)}),K&&c$(e2,{paddingX:1,children:c$($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 f1,useInput as ZZ,useStdout as XZ}from"ink";import GZ from"ink-select-input";import MQ,{useMemo as t6}from"react";import{Box as z0,Text as b0}from"ink";import L$,{useEffect as yQ,useMemo as W$,useRef as i6}from"react";import{Box as _Q,Text as j6}from"ink";import C3 from"react";import{Text as P1}from"ink";import y3 from"react";import S6 from"string-width";import U8 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 N3=QQ();function JQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(N3,"")}var R6=($=0)=>(Q)=>`\x1B[${Q+$}m`,M6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,C6=($=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]}},hK=Object.keys(j0.modifier),F3=Object.keys(j0.color),H3=Object.keys(j0.bgColor),EK=[...F3,...H3];function W3(){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=R6(),j0.color.ansi256=M6(),j0.color.ansi16m=C6(),j0.bgColor.ansi=R6(10),j0.bgColor.ansi256=M6(10),j0.bgColor.ansi16m=C6(10),Object.defineProperties(j0,{rgbToAnsi256:{value(Q,Y,J){if(Q===Y&&Y===J){if(Q<8)return 16;if(Q>248)return 231;return Math.round((Q-8)/247*24)+232}return 16+36*Math.round(Q/255*5)+6*Math.round(Y/255*5)+Math.round(J/255*5)},enumerable:!1},hexToRgb:{value(Q){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(Q.toString(16));if(!Y)return[0,0,0];let[J]=Y;if(J.length===3)J=[...J].map((X)=>X+X).join("");let Z=Number.parseInt(J,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(Q)=>j0.rgbToAnsi256(...j0.hexToRgb(Q)),enumerable:!1},ansi256ToAnsi:{value(Q){if(Q<8)return 30+Q;if(Q<16)return 90+(Q-8);let Y,J,Z;if(Q>=232)Y=((Q-232)*10+8)/255,J=Y,Z=Y;else{Q-=16;let q=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(q/6)/5,Z=q%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let 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 L3=W3(),I6=L3;var e8=new Set(["\x1B","›"]),B3=39,ZQ="\x07",k6="[",w3="]",v6="m",s8=`${w3}8;;`,T6=($)=>`${e8.values().next().value}${k6}${$}${v6}`,f6=($)=>`${e8.values().next().value}${s8}${$}${ZQ}`,b3=($)=>$.split(" ").map((Q)=>U8(Q)),YQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,G=U8(JQ($.at(-1)));for(let[q,K]of J.entries()){let U=U8(K);if(G+U<=Y)$[$.length-1]+=K;else $.push(K),G=0;if(e8.has(K))Z=!0,X=J.slice(q+1,q+1+s8.length).join("")===s8;if(Z){if(X){if(K===ZQ)Z=!1,X=!1}else if(K===v6)Z=!1;continue}if(G+=U,G===Y&&q<J.length-1)$.push(""),G=0}if(!G&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},A3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(U8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},P3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,G=b3($),q=[""];for(let[z,W]of $.split(" ").entries()){if(Y.trim!==!1)q[q.length-1]=q.at(-1).trimStart();let O=U8(q.at(-1));if(z!==0){if(O>=Q&&(Y.wordWrap===!1||Y.trim===!1))q.push(""),O=0;if(O>0||Y.trim===!1)q[q.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)<_)q.push("");YQ(q,W,Q);continue}if(O+G[z]>Q&&O>0&&G[z]>0){if(Y.wordWrap===!1&&O<Q){YQ(q,W,Q);continue}q.push("")}if(O+G[z]>Q&&Y.wordWrap===!1){YQ(q,W,Q);continue}q[q.length-1]+=W}if(Y.trim!==!1)q=q.map((z)=>A3(z));let K=q.join(`
119
- `),U=[...K],H=0;for(let[z,W]of U.entries()){if(J+=W,e8.has(W)){let{groups:B}=new RegExp(`(?:\\${k6}(?<code>\\d+)m|\\${s8}(?<uri>.*)${ZQ})`).exec(K.slice(H))||{groups:{}};if(B.code!==void 0){let _=Number.parseFloat(B.code);Z=_===B3?void 0:_}else if(B.uri!==void 0)X=B.uri.length===0?void 0:B.uri}let O=I6.codes.get(Number(Z));if(U[z+1]===`
120
- `){if(X)J+=f6("");if(Z&&O)J+=T6(O)}else if(W===`
121
- `){if(Z&&O)J+=T6(Z);if(X)J+=f6(X)}H+=W.length}return J};function XQ($,Q,Y){return String($).normalize().replaceAll(`\r
118
+ `),y=o2.join(P,`${X.name}.md`);await N6.promises.writeFile(y,T,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),f=v0(!1,Q);if(H6((P,A)=>{if(A.escape)v();else if(A.ctrl&&P==="c"||A.meta&&P==="c")f()},{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(K8,{value:q,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(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(Q3,{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:['根据你的描述:"',q,'"']},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(K8,{value:X.name,onChange:(A)=>G({...X,name:A}),onSubmit:(A)=>{if(Z3(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(K8,{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(K8,{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(X3,{config:X,setConfig:G,onNext:N,onPrev:v},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:Y3,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(K8,{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")v();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function X3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=eY({id:"step-tools"});H6((G,q)=>{if(q.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(sY,{options:J3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import G3 from"node:fs";import{useMemoizedFn as F$}from"ahooks";import{Box as C0,Text as S0,useInput as K3}from"ink";import n2 from"ink-select-input";import{useEffect as q3,useMemo as W6,useState as t8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var t2=10;function B6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=L6($),[X,G]=t8(Q),[q,K]=t8(null),[U,F]=t8(0),[z,W]=t8(0),O=F$(()=>{Z.clear(),Z.loadFromStandardLocations(),F((y)=>y+1)}),B=W6(()=>{return Z.getAllSubagents()},[U]),_=Math.ceil(B.length/t2)||1,H=W6(()=>{let y=z*t2;return B.slice(y,y+t2)},[B,z]);q3(()=>{let y=Math.max(0,_-1);if(z>y)W(y)},[_,z]);let C=F$(()=>{if(z<_-1)W((y)=>y+1)}),N=F$(()=>{if(z>0)W((y)=>y-1)}),v=[{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"}],M=F$((y)=>{if(y.value==="cancel"){J?.();return}G(y.value)}),w=F$((y)=>{if(K(y.value),X==="edit")G("editWizard");else if(X==="delete")G("deleteConfirm")}),f=F$(async()=>{if(!q?.configPath)return;try{await G3.promises.unlink(q.configPath),O(),P()}catch(y){console.error("删除失败:",y)}}),P=F$(()=>{G("menu"),K(null)}),A=v0(!1,J);if(K3((y,L)=>{if(L.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")W(0),P();else if(X==="deleteConfirm")P()}else if(L.ctrl&&y==="c"||L.meta&&y==="c")A();else if(X==="list"){if(L.leftArrow||y==="h")N();else if(L.rightArrow||y==="l")C()}},{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:v,onSelect:M},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),H.map((y)=>i(C0,{flexDirection:"column",paddingLeft:2,children:[i(C0,{children:i(S0,{children:[i(S0,{bold:!0,color:y.color||"white",children:["• ",y.name]},void 0,!0,void 0,this),i(S0,{color:"gray",children:[" - ",y.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y.tools&&y.tools.length>0&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:["工具: ",y.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y.configPath&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",dimColor:!0,children:y.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},y.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=(y)=>{if(B.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:y},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((k)=>({key:k.name,label:`${k.name} - ${k.description}`,value:k}));return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:y},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(q8,{onComplete:()=>{O(),P()},onCancel:P},void 0,!1,void 0,this);if(X==="edit")return T("编辑 Agent");if(X==="editWizard"&&q){let y={name:q.name,description:q.description,tools:q.tools||[],color:q.color,location:q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:q.systemPrompt||""};return i(q8,{initialConfig:y,onComplete:()=>{O(),P()},onCancel:P},void 0,!1,void 0,this)}if(X==="delete")return T("删除 Agent");if(X==="deleteConfirm"&&q)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(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:q.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(S0,{dimColor:!0,children:["文件路径: ",q.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(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:(y)=>{if(y.value==="confirm")f();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as p$,Text as O0}from"ink";import z3,{useEffect as O3,useState as _3}from"react";import{useEffect as U3,useState as w6}from"react";function P6($=x0(),Q=5000){let[Y,J]=w6(null),[Z,X]=w6(!0);return U3(()=>{let G=!0,q=async()=>{try{let U=await b6($);if(!G)return;if(!U){J(null),X(!1);return}let F=await A6($);if(!G)return;J(F)}catch{if(G)J(null)}finally{if(G)X(!1)}};q();let K=null;if(Q>0)K=setInterval(q,Q);return()=>{if(G=!1,K)clearInterval(K)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as o,Fragment as A1}from"react/jsx-dev-runtime";var R6=z3.memo(()=>{let $=R8(),Q=S$(),J=P8()==="shortcuts",Z=_4(),X=I1(),{branch:G}=P6(X),q=y8(),K=G4(),U=Q4(),F=I8(),z=T8(),W=f8(),O=k8(),B=v8(),_=J4(),H=C8(),C=B4(),N=v$(),[v,M]=_3(null);O3(()=>{let y=!1;new s2(X,N).get().then((E)=>{if(!y)M(E)}).catch(()=>{if(!y)M(null)});let k=s2.subscribe((E)=>{if(!y&&E.sessionId===N&&E.workspaceRoot===X)M(E.goal)});return()=>{y=!0,k()}},[N,X]);let w=q?a8(q):!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(p$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?o(p$,{flexDirection:"column",gap:0,children:T.map((y,L)=>o(p$,{flexDirection:"row",children:[y.map((k,E)=>{let[t,u]=k.split(":");return o(p$,{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(p$,{flexDirection:"row",gap:1,children:[G&&o(A1,{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),v&&o(A1,{children:[o(O0,{color:v.status==="active"?"green":v.status==="verifying"?"cyan":v.status==="blocked"||v.status==="budget_limited"?"yellow":"gray",children:["goal:",v.status," ",v.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(p$,{flexDirection:"row",gap:1,children:!$?o(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):o(A1,{children:[w&&o(A1,{children:[F?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),W!=="auto"&&o(A1,{children:[o(O0,{color:W==="fast"?"yellow":"gray",children:["Speed ",W]},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(A1,{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(A1,{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),q&&o(O0,{color:"gray",children:q.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:K<20?"red":K<50?"yellow":"gray",children:[K,"%"]},void 0,!0,void 0,this),_>0.001&&o(A1,{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),H.length>0&&o(A1,{children:[o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(O0,{color:"yellow",children:["已排队 ",H.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C>0&&o(A1,{children:[o(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(O0,{color:"cyan",children:["已恢复 ",C," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&o(A1,{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 N3 from"react";import{jsxDEV as c$}from"react/jsx-dev-runtime";var y6=N3.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 q=$.slice(Z,X),K=$.length>J;return c$(e2,{flexDirection:"column",paddingX:2,paddingY:0,children:[q.map((U,F)=>{let W=Z+F===Q;return c$(e2,{flexDirection:"row",paddingX:1,gap:2,children:[c$($Q,{color:W?"cyan":"white",bold:W,children:U.command},void 0,!1,void 0,this),c$($Q,{color:W?"cyan":"gray",dimColor:!W,children:["- ",U.description]},void 0,!0,void 0,this)]},U.command,!0,void 0,this)}),K&&c$(e2,{paddingX:1,children:c$($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 f1,useInput as XZ,useStdout as GZ}from"ink";import KZ from"ink-select-input";import MQ,{useMemo as s6}from"react";import{Box as z0,Text as b0}from"ink";import L$,{useEffect as RQ,useMemo as W$,useRef as o6}from"react";import{Box as _Q,Text as h6}from"ink";import I3 from"react";import{Text as P1}from"ink";import y3 from"react";import D6 from"string-width";import U8 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 F3=QQ();function JQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(F3,"")}var M6=($=0)=>(Q)=>`\x1B[${Q+$}m`,C6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,I6=($=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]}},EK=Object.keys(j0.modifier),H3=Object.keys(j0.color),W3=Object.keys(j0.bgColor),gK=[...H3,...W3];function L3(){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=M6(),j0.color.ansi256=C6(),j0.color.ansi16m=I6(),j0.bgColor.ansi=M6(10),j0.bgColor.ansi256=C6(10),j0.bgColor.ansi16m=I6(10),Object.defineProperties(j0,{rgbToAnsi256:{value(Q,Y,J){if(Q===Y&&Y===J){if(Q<8)return 16;if(Q>248)return 231;return Math.round((Q-8)/247*24)+232}return 16+36*Math.round(Q/255*5)+6*Math.round(Y/255*5)+Math.round(J/255*5)},enumerable:!1},hexToRgb:{value(Q){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(Q.toString(16));if(!Y)return[0,0,0];let[J]=Y;if(J.length===3)J=[...J].map((X)=>X+X).join("");let Z=Number.parseInt(J,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(Q)=>j0.rgbToAnsi256(...j0.hexToRgb(Q)),enumerable:!1},ansi256ToAnsi:{value(Q){if(Q<8)return 30+Q;if(Q<16)return 90+(Q-8);let Y,J,Z;if(Q>=232)Y=((Q-232)*10+8)/255,J=Y,Z=Y;else{Q-=16;let q=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(q/6)/5,Z=q%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let 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 B3=L3(),T6=B3;var e8=new Set(["\x1B","›"]),w3=39,ZQ="\x07",v6="[",b3="]",S6="m",s8=`${b3}8;;`,f6=($)=>`${e8.values().next().value}${v6}${$}${S6}`,k6=($)=>`${e8.values().next().value}${s8}${$}${ZQ}`,A3=($)=>$.split(" ").map((Q)=>U8(Q)),YQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,G=U8(JQ($.at(-1)));for(let[q,K]of J.entries()){let U=U8(K);if(G+U<=Y)$[$.length-1]+=K;else $.push(K),G=0;if(e8.has(K))Z=!0,X=J.slice(q+1,q+1+s8.length).join("")===s8;if(Z){if(X){if(K===ZQ)Z=!1,X=!1}else if(K===S6)Z=!1;continue}if(G+=U,G===Y&&q<J.length-1)$.push(""),G=0}if(!G&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},P3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(U8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},R3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,G=A3($),q=[""];for(let[z,W]of $.split(" ").entries()){if(Y.trim!==!1)q[q.length-1]=q.at(-1).trimStart();let O=U8(q.at(-1));if(z!==0){if(O>=Q&&(Y.wordWrap===!1||Y.trim===!1))q.push(""),O=0;if(O>0||Y.trim===!1)q[q.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)<_)q.push("");YQ(q,W,Q);continue}if(O+G[z]>Q&&O>0&&G[z]>0){if(Y.wordWrap===!1&&O<Q){YQ(q,W,Q);continue}q.push("")}if(O+G[z]>Q&&Y.wordWrap===!1){YQ(q,W,Q);continue}q[q.length-1]+=W}if(Y.trim!==!1)q=q.map((z)=>P3(z));let K=q.join(`
119
+ `),U=[...K],F=0;for(let[z,W]of U.entries()){if(J+=W,e8.has(W)){let{groups:B}=new RegExp(`(?:\\${v6}(?<code>\\d+)m|\\${s8}(?<uri>.*)${ZQ})`).exec(K.slice(F))||{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=T6.codes.get(Number(Z));if(U[z+1]===`
120
+ `){if(X)J+=k6("");if(Z&&O)J+=f6(O)}else if(W===`
121
+ `){if(Z&&O)J+=f6(Z);if(X)J+=k6(X)}F+=W.length}return J};function XQ($,Q,Y){return String($).normalize().replaceAll(`\r
122
122
  `,`
123
123
  `).split(`
124
- `).map((J)=>P3(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 S6(Q)};var D6=($)=>{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)=>S6(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:[""]},V6=($,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 M3}from"react/jsx-dev-runtime";var qQ=2,UQ=1,zQ=2;function OQ($,Q){return`inline-${$}-${Q}`}var R3=({text:$})=>{let Q=A0();if(!D6($))return H1(P1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,G=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,q;while((q=G.exec($))!==null){if(q.index>J){let z=$.slice(J,q.index);Y.push(H1(P1,{children:z},OQ("text",Z++),!1,void 0,this))}let K=q[0],U=null,H=OQ("match",X++);try{if(K.startsWith("**")&&K.endsWith("**")&&K.length>qQ*2)U=H1(P1,{bold:!0,children:K.slice(qQ,-qQ)},H,!1,void 0,this);else if(K.length>UQ*2&&(K.startsWith("*")&&K.endsWith("*")||K.startsWith("_")&&K.endsWith("_"))){let z=$.substring(q.index-1,q.index),W=$.substring(G.lastIndex,G.lastIndex+1);if(!(/\w/.test(z)||/\w/.test(W)||/[./\\]/.test(z+W)))U=H1(P1,{italic:!0,children:K.slice(UQ,-UQ)},H,!1,void 0,this)}else if(K.startsWith("~~")&&K.endsWith("~~")&&K.length>zQ*2)U=H1(P1,{strikethrough:!0,children:K.slice(zQ,-zQ)},H,!1,void 0,this);else if(K.startsWith("`")&&K.endsWith("`")){let z=K.match(/^(`+)([^`]+)\1$/);if(z&&z[2])U=H1(P1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${z[2]} `},H,!1,void 0,this)}else if(K.startsWith("[")&&K.includes("](")&&K.endsWith(")")){let z=K.match(/\[(.*?)\]\((.*?)\)/);if(z){let W=z[1],O=z[2];U=H1(P1,{children:[W,H1(P1,{color:Q.colors.info,children:[" (",O,")"]},void 0,!0,void 0,this)]},H,!0,void 0,this)}}else if(K.match(/^https?:\/\//))U=H1(P1,{color:Q.colors.info,children:K},H,!1,void 0,this)}catch(z){console.error("InlineRenderer 解析错误:",K,z),U=null}Y.push(U??H1(P1,{children:K},H,!1,void 0,this)),J=G.lastIndex}if(J<$.length){let K=$.slice(J);Y.push(H1(P1,{children:K},OQ("text",Z++),!1,void 0,this))}return H1(M3,{children:Y.filter((K)=>K!==null)},void 0,!1,void 0,this)},y1=y3.memo(R3);import{jsxDEV as x$}from"react/jsx-dev-runtime";var I3="▎",h6=C3.memo(({lines:$,level:Q})=>{let Y=A0(),J=I3.repeat(Q);return x$(_Q,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return x$(_Q,{height:1},X,!1,void 0,this);return x$(_Q,{flexDirection:"row",children:[x$(j6,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),x$(j6,{italic:!0,wrap:"wrap",children:x$(y1,{text:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},X,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as J2,Text as E1}from"ink";import{isPlainObject as LQ}from"lodash-es";import{common as S3,createLowlight as D3}from"lowlight";import c6 from"react";import{Box as Q2,Text as z8}from"ink";import h1,{Fragment as m6}from"react";import T3 from"string-width";var E6=new Map,g6=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<=g6){let J=E6.get($);if(J)return J}let Y=Array.from($);if($.length<=g6)E6.set($,Y);return Y}var NQ=new Map;function j1($){if(/^[\x20-\x7E]*$/.test($))return $.length;if(NQ.has($))return NQ.get($);let Q=T3($);return NQ.set($,Q),Q}import{jsxDEV as u$}from"react/jsx-dev-runtime";var HQ=2,p6=h1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=A0(),G=[],q=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),HQ);function K(_){if(!h1.isValidElement(_))return;if(_.type===m6){h1.Children.forEach(_.props.children,K);return}if(_.type===Q2){k3(_,Q,G);return}}h1.Children.forEach($,K);let H=G.length>q||Z>0?q-1:q,z=H!==void 0?Math.max(0,G.length-H):0,W=z+Z,B=(z>0?J==="top"?G.slice(z):G.slice(0,H):G).map((_,F)=>u$(Q2,{children:_.length>0?_.map((M,N)=>u$(z8,{...M.props,children:M.text},N,!1,void 0,this)):u$(z8,{children:" "},void 0,!1,void 0,this)},F,!1,void 0,this));return u$(Q2,{flexDirection:"column",width:Q,flexShrink:0,children:[W>0&&J==="top"&&u$(z8,{color:X.colors.text.muted,dimColor:!0,children:["... ",W," line",W===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),B,W>0&&J==="bottom"&&u$(z8,{color:X.colors.text.muted,dimColor:!0,children:["... ",W," line",W===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function f3($){if(!h1.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(!h1.isValidElement(Z))return;if(Z.type===m6){h1.Children.forEach(Z.props.children,(U)=>J(U,X));return}if(Z.type!==z8)return;let{children:G,...q}=Z.props,K=X===void 0?q:{...X,...q};h1.Children.forEach(G,(U)=>J(U,K))}return h1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function k3($,Q,Y){let J=f3($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let z of J.noWrapSegments)Z+=j1(z.text);if(J.segments.length===0){let z=[],W=[];for(let O of J.noWrapSegments){let B=O.text.split(`
127
- `);for(let _=0;_<B.length;_++){if(_>0)z.push(W),W=[];if(B[_])W.push({text:B[_],props:O.props})}}if(W.length>0)z.push(W);for(let O of z)Y.push(O);return}let X=Q-Z;if(X<1){v3(J.noWrapSegments,Q,Y);return}let G=[],q=[],K=0;function U(){if(G.length===0)G.push([...J.noWrapSegments,...q]);else if(Z>0)G.push([{text:" ".repeat(Z),props:{}},...q]);else G.push(q);q=[],K=0}function H(z,W){if(q.length>0&&q[q.length-1].props===W)q[q.length-1].text+=z;else q.push({text:z,props:W})}for(let z of J.segments){let W=z.text.split(`
128
- `);for(let O=0;O<W.length;O++){if(O>0)U();let _=W[O].split(/(\s+)/);for(let F of _){if(!F)continue;let M=j1(F);if(K+M>X&&K>0){if(U(),/^\s+$/.test(F))continue}if(M>X){let v=FQ(F);while(v.length>0){let C=0,w=0;for(let f of v){let P=j1(f);if(K+w+P>X)break;w+=P,C++}if(C>0){let f=v.slice(0,C).join("");H(f,z.props),K+=j1(f),v=v.slice(C)}if(v.length>0)U()}}else H(F,z.props),K+=M}}if(z.text.endsWith(`
129
- `))U()}if(q.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 q=G.text.split(`
130
- `);for(let K=0;K<q.length;K++){if(K>0)J.push(Z),Z=[],X=0;let U=q[K];if(!U)continue;let H=j1(U),z=Math.max(0,Q-j1("…"));if(H<=z&&X===0)Z.push({text:U,props:G.props}),X+=H;else{let W=FQ(U),O=X,B=0;for(let F of W){let M=j1(F);if(O+M>z)break;O+=M,B++}let _=W.slice(0,B).join("");if(_)Z.push({text:_,props:G.props});Z.push({text:"…",props:{}}),X=O+j1("…")}}}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=D3(S3),V3=200,H$=new Map;function j3($,Q){let Y=`${Q??"__auto__"}:${$}`,J=H$.get(Y);if(J!==void 0)H$.delete(Y),H$.set(Y,J);return J}function h3($,Q,Y){let J=`${Q??"__auto__"}:${$}`;if(H$.size>=V3){let Z=H$.keys().next().value;if(Z!==void 0)H$.delete(Z)}H$.set(J,Y)}function E3($){return LQ($)&&$.type==="text"&&typeof $.value==="string"}function g3($){return LQ($)&&$.type==="element"}function m3($){return LQ($)&&$.type==="root"&&Array.isArray($.children)}function Y2($,Q,Y=0){if(E3($))return G1(E1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(g3($)){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,q)=>Y2(G,Q,q));return G1(E1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(m3($))return G1(c6.Fragment,{children:$.children.map((J,Z)=>Y2(J,Q,Z))},Y,!1,void 0,this);return G1(E1,{},Y,!1,void 0,this)}function p3($,Q,Y){let J=Y||d0.getTheme().colors.syntax;try{let Z=j3($,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(E1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return h3($,Q,X),Y2(X,J)}catch(Z){return G1(E1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var Z2=c6.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=A0(),G=$.split(`
131
- `),q=0;if(Z&&G.length>Z){let z=Math.max(Z,HQ);if(G.length>z)q=G.length-z,G=G.slice(q)}let K=G.length+q,U=String(K).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(E1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),q>0&&G1(J2,{marginBottom:0,children:G1(E1,{color:X.colors.text.muted,dimColor:!0,children:["... ",q," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G1(p6,{maxWidth:H,maxHeight:Z,children:G.map((z,W)=>{let O=W+q+1;return G1(J2,{flexDirection:"row",children:[Y&&G1(E1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(O).padStart(U-1," ")," "]},void 0,!0,void 0,this),z.trim()===""?G1(E1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):p3(z,Q,X.colors.syntax)]},W,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as x6,Text as z1,useInput as c3}from"ink";import x3,{useState as u3}from"react";import{jsxDEV as K1}from"react/jsx-dev-runtime";var u6=400;function l3($){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=x3.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let G=A0(),q=l3($),[K,U]=u3(!1);c3((N)=>{if(N.toLowerCase()==="e")U((v)=>!v)},{isActive:X&&q.length>Z});let z=Math.max(...q.map((N)=>N.lineNumber||0)).toString().length+1,W=q.filter((N)=>N.type==="add").length,O=q.filter((N)=>N.type==="remove").length,B=q.length,_=B>Z,F;if(!_)F=q;else if(K)F=q.slice(0,u6);else F=q.slice(0,Z);let M=B-F.length;return K1(x6,{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:[K?`已展开 ${F.length}/${B} 行`:`显示前 ${Z} 行,共 ${B} 行`," · ",K1(z1,{color:G.colors.success,children:["+",W]},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),F.map((N,v)=>{if(N.type==="header")return K1(z1,{color:G.colors.muted,dimColor:!0,children:N.content},v,!1,void 0,this);let C=N.lineNumber?N.lineNumber.toString().padStart(z," "):" ".repeat(z),w=" ",f,P;if(N.type==="add")w="+",P=G.colors.success,f=void 0;else if(N.type==="remove")w="-",P=G.colors.error,f=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:f,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)]},v,!0,void 0,this)}),_&&K1(x6,{marginTop:1,children:K?K1(z1,{color:G.colors.info,dimColor:!0,children:[M>0?`已达显示上限 ${u6} 行,仍有 ${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 l6}from"ink";import d3 from"react";import{jsxDEV as l$}from"react/jsx-dev-runtime";var r3=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,G=J.length;return l$(wQ,{paddingLeft:G+1,flexDirection:"row",children:[l$(wQ,{width:X,children:l$(l6,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),l$(wQ,{flexGrow:1,children:l$(l6,{wrap:"wrap",children:l$(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},bQ=d3.memo(r3);import{Text as AQ}from"ink";import a3,{useMemo as i3}from"react";import d6 from"string-width";import{jsxDEV as PQ}from"react/jsx-dev-runtime";var r6=4,d$=3,o3=4,a6=a3.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=A0(),Z=i3(()=>{if($.length===0||Q.length===0)return null;let z=$.length,W=$.map((P,A)=>{let T=Math.max(KQ(P),d$);for(let R of Q)T=Math.max(T,KQ(R[A]||""));return T}),O=$.map((P,A)=>{let T=Math.max(GQ(P),d$);for(let R of Q)T=Math.max(T,GQ(R[A]||""));return T}),B=1+z*3,_=Math.max(Y-B-r6,z*d$),F=W.reduce((P,A)=>P+A,0),M=O.reduce((P,A)=>P+A,0),N=!1,v;if(M<=_)v=O;else if(F<=_){let P=_-F,A=O.map((R,L)=>R-W[L]),T=A.reduce((R,L)=>R+L,0);v=W.map((R,L)=>{if(T===0)return R;let k=Math.floor(A[L]/T*P);return R+k})}else{N=!0;let P=_/F;v=W.map((A)=>Math.max(Math.floor(A*P),d$))}function C(){let P=1;for(let A=0;A<$.length;A++){let T=$2($[A],v[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]||"",v[T],N);P=Math.max(P,R.length)}return P}if(C()>o3)return{type:"vertical",columnWidths:v,needsHardWrap:N};return{type:"horizontal",columnWidths:v,needsHardWrap:N}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let z=Math.min(Y-1,40),W="─".repeat(z);return PQ(AQ,{children:Q.map((O,B)=>{let _=[];if(B>0)_.push(W);return O.forEach((F,M)=>{let N=$[M]||`Column ${M+1}`,v=(F||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${v}`)}),_.join(`
124
+ `).map((J)=>R3(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 D6(Q)};var V6=($)=>{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)=>D6(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:[""]},j6=($,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 C3}from"react/jsx-dev-runtime";var qQ=2,UQ=1,zQ=2;function OQ($,Q){return`inline-${$}-${Q}`}var M3=({text:$})=>{let Q=A0();if(!V6($))return H1(P1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,G=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,q;while((q=G.exec($))!==null){if(q.index>J){let z=$.slice(J,q.index);Y.push(H1(P1,{children:z},OQ("text",Z++),!1,void 0,this))}let K=q[0],U=null,F=OQ("match",X++);try{if(K.startsWith("**")&&K.endsWith("**")&&K.length>qQ*2)U=H1(P1,{bold:!0,children:K.slice(qQ,-qQ)},F,!1,void 0,this);else if(K.length>UQ*2&&(K.startsWith("*")&&K.endsWith("*")||K.startsWith("_")&&K.endsWith("_"))){let z=$.substring(q.index-1,q.index),W=$.substring(G.lastIndex,G.lastIndex+1);if(!(/\w/.test(z)||/\w/.test(W)||/[./\\]/.test(z+W)))U=H1(P1,{italic:!0,children:K.slice(UQ,-UQ)},F,!1,void 0,this)}else if(K.startsWith("~~")&&K.endsWith("~~")&&K.length>zQ*2)U=H1(P1,{strikethrough:!0,children:K.slice(zQ,-zQ)},F,!1,void 0,this);else if(K.startsWith("`")&&K.endsWith("`")){let z=K.match(/^(`+)([^`]+)\1$/);if(z&&z[2])U=H1(P1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${z[2]} `},F,!1,void 0,this)}else if(K.startsWith("[")&&K.includes("](")&&K.endsWith(")")){let z=K.match(/\[(.*?)\]\((.*?)\)/);if(z){let W=z[1],O=z[2];U=H1(P1,{children:[W,H1(P1,{color:Q.colors.info,children:[" (",O,")"]},void 0,!0,void 0,this)]},F,!0,void 0,this)}}else if(K.match(/^https?:\/\//))U=H1(P1,{color:Q.colors.info,children:K},F,!1,void 0,this)}catch(z){console.error("InlineRenderer 解析错误:",K,z),U=null}Y.push(U??H1(P1,{children:K},F,!1,void 0,this)),J=G.lastIndex}if(J<$.length){let K=$.slice(J);Y.push(H1(P1,{children:K},OQ("text",Z++),!1,void 0,this))}return H1(C3,{children:Y.filter((K)=>K!==null)},void 0,!1,void 0,this)},R1=y3.memo(M3);import{jsxDEV as x$}from"react/jsx-dev-runtime";var T3="▎",E6=I3.memo(({lines:$,level:Q})=>{let Y=A0(),J=T3.repeat(Q);return x$(_Q,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return x$(_Q,{height:1},X,!1,void 0,this);return x$(_Q,{flexDirection:"row",children:[x$(h6,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),x$(h6,{italic:!0,wrap:"wrap",children:x$(R1,{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 E1}from"ink";import{isPlainObject as LQ}from"lodash-es";import{common as D3,createLowlight as V3}from"lowlight";import x6 from"react";import{Box as Q2,Text as z8}from"ink";import h1,{Fragment as p6}from"react";import f3 from"string-width";var g6=new Map,m6=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<=m6){let J=g6.get($);if(J)return J}let Y=Array.from($);if($.length<=m6)g6.set($,Y);return Y}var NQ=new Map;function j1($){if(/^[\x20-\x7E]*$/.test($))return $.length;if(NQ.has($))return NQ.get($);let Q=f3($);return NQ.set($,Q),Q}import{jsxDEV as u$}from"react/jsx-dev-runtime";var HQ=2,c6=h1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=A0(),G=[],q=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),HQ);function K(_){if(!h1.isValidElement(_))return;if(_.type===p6){h1.Children.forEach(_.props.children,K);return}if(_.type===Q2){v3(_,Q,G);return}}h1.Children.forEach($,K);let F=G.length>q||Z>0?q-1:q,z=F!==void 0?Math.max(0,G.length-F):0,W=z+Z,B=(z>0?J==="top"?G.slice(z):G.slice(0,F):G).map((_,H)=>u$(Q2,{children:_.length>0?_.map((C,N)=>u$(z8,{...C.props,children:C.text},N,!1,void 0,this)):u$(z8,{children:" "},void 0,!1,void 0,this)},H,!1,void 0,this));return u$(Q2,{flexDirection:"column",width:Q,flexShrink:0,children:[W>0&&J==="top"&&u$(z8,{color:X.colors.text.muted,dimColor:!0,children:["... ",W," line",W===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),B,W>0&&J==="bottom"&&u$(z8,{color:X.colors.text.muted,dimColor:!0,children:["... ",W," line",W===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function k3($){if(!h1.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 F={text:U,props:X??{}};if(X===void 0||X.wrap==="wrap")Y=!0,Q.segments.push(F);else if(!Y)Q.noWrapSegments.push(F);else Q.segments.push(F);return}if(!h1.isValidElement(Z))return;if(Z.type===p6){h1.Children.forEach(Z.props.children,(U)=>J(U,X));return}if(Z.type!==z8)return;let{children:G,...q}=Z.props,K=X===void 0?q:{...X,...q};h1.Children.forEach(G,(U)=>J(U,K))}return h1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function v3($,Q,Y){let J=k3($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let z of J.noWrapSegments)Z+=j1(z.text);if(J.segments.length===0){let z=[],W=[];for(let O of J.noWrapSegments){let B=O.text.split(`
127
+ `);for(let _=0;_<B.length;_++){if(_>0)z.push(W),W=[];if(B[_])W.push({text:B[_],props:O.props})}}if(W.length>0)z.push(W);for(let O of z)Y.push(O);return}let X=Q-Z;if(X<1){S3(J.noWrapSegments,Q,Y);return}let G=[],q=[],K=0;function U(){if(G.length===0)G.push([...J.noWrapSegments,...q]);else if(Z>0)G.push([{text:" ".repeat(Z),props:{}},...q]);else G.push(q);q=[],K=0}function F(z,W){if(q.length>0&&q[q.length-1].props===W)q[q.length-1].text+=z;else q.push({text:z,props:W})}for(let z of J.segments){let W=z.text.split(`
128
+ `);for(let O=0;O<W.length;O++){if(O>0)U();let _=W[O].split(/(\s+)/);for(let H of _){if(!H)continue;let C=j1(H);if(K+C>X&&K>0){if(U(),/^\s+$/.test(H))continue}if(C>X){let v=FQ(H);while(v.length>0){let M=0,w=0;for(let f of v){let P=j1(f);if(K+w+P>X)break;w+=P,M++}if(M>0){let f=v.slice(0,M).join("");F(f,z.props),K+=j1(f),v=v.slice(M)}if(v.length>0)U()}}else F(H,z.props),K+=C}}if(z.text.endsWith(`
129
+ `))U()}if(q.length>0)U();for(let z of G)Y.push(z)}function S3($,Q,Y){let J=[],Z=[],X=0;for(let G of $){let q=G.text.split(`
130
+ `);for(let K=0;K<q.length;K++){if(K>0)J.push(Z),Z=[],X=0;let U=q[K];if(!U)continue;let F=j1(U),z=Math.max(0,Q-j1("…"));if(F<=z&&X===0)Z.push({text:U,props:G.props}),X+=F;else{let W=FQ(U),O=X,B=0;for(let H of W){let C=j1(H);if(O+C>z)break;O+=C,B++}let _=W.slice(0,B).join("");if(_)Z.push({text:_,props:G.props});Z.push({text:"…",props:{}}),X=O+j1("…")}}}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=V3(D3),j3=200,H$=new Map;function h3($,Q){let Y=`${Q??"__auto__"}:${$}`,J=H$.get(Y);if(J!==void 0)H$.delete(Y),H$.set(Y,J);return J}function E3($,Q,Y){let J=`${Q??"__auto__"}:${$}`;if(H$.size>=j3){let Z=H$.keys().next().value;if(Z!==void 0)H$.delete(Z)}H$.set(J,Y)}function g3($){return LQ($)&&$.type==="text"&&typeof $.value==="string"}function m3($){return LQ($)&&$.type==="element"}function p3($){return LQ($)&&$.type==="root"&&Array.isArray($.children)}function Y2($,Q,Y=0){if(g3($))return G1(E1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(m3($)){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,q)=>Y2(G,Q,q));return G1(E1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(p3($))return G1(x6.Fragment,{children:$.children.map((J,Z)=>Y2(J,Q,Z))},Y,!1,void 0,this);return G1(E1,{},Y,!1,void 0,this)}function c3($,Q,Y){let J=Y||d0.getTheme().colors.syntax;try{let Z=h3($,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(E1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return E3($,Q,X),Y2(X,J)}catch(Z){return G1(E1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var Z2=x6.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=A0(),G=$.split(`
131
+ `),q=0;if(Z&&G.length>Z){let z=Math.max(Z,HQ);if(G.length>z)q=G.length-z,G=G.slice(q)}let K=G.length+q,U=String(K).length+1,F=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(E1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),q>0&&G1(J2,{marginBottom:0,children:G1(E1,{color:X.colors.text.muted,dimColor:!0,children:["... ",q," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G1(c6,{maxWidth:F,maxHeight:Z,children:G.map((z,W)=>{let O=W+q+1;return G1(J2,{flexDirection:"row",children:[Y&&G1(E1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(O).padStart(U-1," ")," "]},void 0,!0,void 0,this),z.trim()===""?G1(E1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):c3(z,Q,X.colors.syntax)]},W,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as u6,Text as z1,useInput as x3}from"ink";import u3,{useState as l3}from"react";import{jsxDEV as K1}from"react/jsx-dev-runtime";var l6=400;function d3($){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=u3.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let G=A0(),q=d3($),[K,U]=l3(!1);x3((N)=>{if(N.toLowerCase()==="e")U((v)=>!v)},{isActive:X&&q.length>Z});let z=Math.max(...q.map((N)=>N.lineNumber||0)).toString().length+1,W=q.filter((N)=>N.type==="add").length,O=q.filter((N)=>N.type==="remove").length,B=q.length,_=B>Z,H;if(!_)H=q;else if(K)H=q.slice(0,l6);else H=q.slice(0,Z);let C=B-H.length;return K1(u6,{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:[K?`已展开 ${H.length}/${B} 行`:`显示前 ${Z} 行,共 ${B} 行`," · ",K1(z1,{color:G.colors.success,children:["+",W]},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),H.map((N,v)=>{if(N.type==="header")return K1(z1,{color:G.colors.muted,dimColor:!0,children:N.content},v,!1,void 0,this);let M=N.lineNumber?N.lineNumber.toString().padStart(z," "):" ".repeat(z),w=" ",f,P;if(N.type==="add")w="+",P=G.colors.success,f=void 0;else if(N.type==="remove")w="-",P=G.colors.error,f=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:f,children:[K1(z1,{dimColor:!0,children:M},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)]},v,!0,void 0,this)}),_&&K1(u6,{marginTop:1,children:K?K1(z1,{color:G.colors.info,dimColor:!0,children:[C>0?`已达显示上限 ${l6} 行,仍有 ${C} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):K1(z1,{color:G.colors.info,dimColor:!0,children:["已隐藏剩余 ",C," 行",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 d6}from"ink";import r3 from"react";import{jsxDEV as l$}from"react/jsx-dev-runtime";var a3=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,G=J.length;return l$(wQ,{paddingLeft:G+1,flexDirection:"row",children:[l$(wQ,{width:X,children:l$(d6,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),l$(wQ,{flexGrow:1,children:l$(d6,{wrap:"wrap",children:l$(R1,{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=r3.memo(a3);import{Text as AQ}from"ink";import i3,{useMemo as o3}from"react";import r6 from"string-width";import{jsxDEV as PQ}from"react/jsx-dev-runtime";var a6=4,d$=3,n3=4,i6=i3.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=A0(),Z=o3(()=>{if($.length===0||Q.length===0)return null;let z=$.length,W=$.map((P,A)=>{let T=Math.max(KQ(P),d$);for(let y of Q)T=Math.max(T,KQ(y[A]||""));return T}),O=$.map((P,A)=>{let T=Math.max(GQ(P),d$);for(let y of Q)T=Math.max(T,GQ(y[A]||""));return T}),B=1+z*3,_=Math.max(Y-B-a6,z*d$),H=W.reduce((P,A)=>P+A,0),C=O.reduce((P,A)=>P+A,0),N=!1,v;if(C<=_)v=O;else if(H<=_){let P=_-H,A=O.map((y,L)=>y-W[L]),T=A.reduce((y,L)=>y+L,0);v=W.map((y,L)=>{if(T===0)return y;let k=Math.floor(A[L]/T*P);return y+k})}else{N=!0;let P=_/H;v=W.map((A)=>Math.max(Math.floor(A*P),d$))}function M(){let P=1;for(let A=0;A<$.length;A++){let T=$2($[A],v[A],N);P=Math.max(P,T.length)}for(let A of Q)for(let T=0;T<A.length;T++){let y=$2(A[T]||"",v[T],N);P=Math.max(P,y.length)}return P}if(M()>n3)return{type:"vertical",columnWidths:v,needsHardWrap:N};return{type:"horizontal",columnWidths:v,needsHardWrap:N}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let z=Math.min(Y-1,40),W="─".repeat(z);return PQ(AQ,{children:Q.map((O,B)=>{let _=[];if(B>0)_.push(W);return O.forEach((H,C)=>{let N=$[C]||`Column ${C+1}`,v=(H||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${v}`)}),_.join(`
133
133
  `)}).join(`
134
- `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:G}=Z;function q(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((_,F)=>{B+=O.h.repeat(_+2),B+=F<X.length-1?O.mid:O.right}),B}function K(z,W){let O=z.map((M,N)=>{let v=X[N]||d$;return $2(M||"",v,G)}),B=Math.max(...O.map((M)=>M.length),1),_=O.map((M)=>Math.floor((B-M.length)/2)),F=[];for(let M=0;M<B;M++){let N="│";for(let v=0;v<z.length;v++){let C=O[v],w=_[v],f=M-w,P=f>=0&&f<C.length?C[f]:"",A=X[v]||d$,T=d6(P),R=V6(W?`\x1B[1m${P}\x1B[22m`:P,T,A,W?"center":"left");N+=` ${R} │`}F.push(N)}return F}let U=[];if(U.push(q("top")),U.push(...K($,!0)),U.push(q("middle")),Q.forEach((z,W)=>{if(U.push(...K(z,!1)),W<Q.length-1)U.push(q("middle"))}),U.push(q("bottom")),Math.max(...U.map((z)=>d6(z)))>Y-r6){let z=Math.min(Y-1,40),W="─".repeat(z);return PQ(AQ,{children:Q.map((O,B)=>{let _=[];if(B>0)_.push(W);return O.forEach((F,M)=>{let N=$[M]||`Column ${M+1}`,v=(F||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${v}`)}),_.join(`
134
+ `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:G}=Z;function q(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((_,H)=>{B+=O.h.repeat(_+2),B+=H<X.length-1?O.mid:O.right}),B}function K(z,W){let O=z.map((C,N)=>{let v=X[N]||d$;return $2(C||"",v,G)}),B=Math.max(...O.map((C)=>C.length),1),_=O.map((C)=>Math.floor((B-C.length)/2)),H=[];for(let C=0;C<B;C++){let N="│";for(let v=0;v<z.length;v++){let M=O[v],w=_[v],f=C-w,P=f>=0&&f<M.length?M[f]:"",A=X[v]||d$,T=r6(P),y=j6(W?`\x1B[1m${P}\x1B[22m`:P,T,A,W?"center":"left");N+=` ${y} │`}H.push(N)}return H}let U=[];if(U.push(q("top")),U.push(...K($,!0)),U.push(q("middle")),Q.forEach((z,W)=>{if(U.push(...K(z,!1)),W<Q.length-1)U.push(q("middle"))}),U.push(q("bottom")),Math.max(...U.map((z)=>r6(z)))>Y-a6){let z=Math.min(Y-1,40),W="─".repeat(z);return PQ(AQ,{children:Q.map((O,B)=>{let _=[];if(B>0)_.push(W);return O.forEach((H,C)=>{let N=$[C]||`Column ${C+1}`,v=(H||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${v}`)}),_.join(`
135
135
  `)}).join(`
136
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 n3=($,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:" "}}},t3=L$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=A0();if(J&&Z!==void 0){let G=$.split(`
137
+ `)},void 0,!1,void 0,this)});import{jsxDEV as g}from"react/jsx-dev-runtime";var t3=($,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:" "}}},s3=L$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=A0();if(J&&Z!==void 0){let G=$.split(`
138
138
  `),q=4,K=Math.max(1,Z-4);if(G.length>K){let U=G.slice(0,K).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)}),s3=L$.memo(({content:$,level:Q})=>{let Y=A0();switch(Q){case 1:return g(b0,{bold:!0,color:Y.colors.primary,children:g(y1,{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(y1,{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(y1,{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(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return g(b0,{children:g(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),e3=L$.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)}),$Z=L$.memo(({content:$})=>{return g(b0,{wrap:"wrap",children:g(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),QZ=L$.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)}),JZ=L$.memo(({detail:$,terminalWidth:Q})=>{let Y=A0(),J=50,Z=$.split(`
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)}),e3=L$.memo(({content:$,level:Q})=>{let Y=A0();switch(Q){case 1:return g(b0,{bold:!0,color:Y.colors.primary,children:g(R1,{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(R1,{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(R1,{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(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return g(b0,{children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),$Z=L$.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)}),QZ=L$.memo(({content:$})=>{return g(b0,{wrap:"wrap",children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),JZ=L$.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)}),YZ=L$.memo(({detail:$,terminalWidth:Q})=>{let Y=A0(),J=50,Z=$.split(`
140
140
  `);while(Z.length>0&&Z[0].trim()==="")Z.shift();while(Z.length>0&&Z[Z.length-1].trim()==="")Z.pop();let X=Z.length>50,G=X?Z.slice(0,50):Z,q=G.join(`
141
- `),K=q.includes("<<<DIFF>>>"),U=q.includes("```");if(K){let H=q.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=q.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(H){let z=H[1]||"text",W=H[2];return g(z0,{flexDirection:"column",children:[g(Z2,{content:W,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 YZ($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),G=Math.max(40,J*0.8),q=X*G;if($.length<=q)return{content:$,isTruncated:!1,hiddenLines:0};let K=Math.floor(q*0.9),U=$.length-K,H=U,z=$.indexOf(`
142
- `,U);if(z!==-1&&z-U<G)H=z+1;let W=$.slice(H),B=($.slice(0,H).match(/\n/g)||[]).length+1;return{content:W,isTruncated:!0,hiddenLines:B}}var e1=L$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:G=!1,noMargin:q=!1,renderPlainTextOnly:K=!1,streamingLines:U,streamingHiddenLines:H,messageId:z,blocksOverride:W,currentLineOverride:O,streamingMode:B="text",renderCodeBlocksAsPlainText:_=!1})=>{let F=A0(),M=W!==void 0,N=W$(()=>n3(Q,F.colors,J),[Q,F.colors,J]),{color:v,prefix:C}=N,w=C.length+1,f=W$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let b=J.subtaskRef;if(!b||typeof b!=="object")return null;return b},[J]),P=Q==="tool"&&J?.phase==="start",A=!q&&!P,T=W$(()=>{if(!K)return[];return $.split(/\r?\n/)},[$,K]);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:F.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(s1.codeBlock))S=!S;else if(l.match(s1.diffStart))x=!0;else if(l.match(s1.diffEnd))x=!1;else if(l.match(s1.table))V=!0;else if(V&&!l.match(s1.table))V=!1}let Z0=B==="text"&&!S&&!x&&!V,y0=Z0?l.match(s1.ulItem):null,B0=Z0?l.match(s1.olItem):null,s0=y0??B0;return g(z0,{flexDirection:"row",flexShrink:0,children:[K0===0&&!G?g(z0,{marginRight:1,flexShrink:0,children:g(b0,{color:v,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:y0?"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&&K)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:v,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=i6(null);yQ(()=>{R.current=null},[z]);let L=W$(()=>{if(M)return null;if(!z)return null;return o6(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;n6(z)},[L,z,M]);let k=W$(()=>M?{content:$,isTruncated:!1,hiddenLines:0}:YZ($,X,Z,Y),[$,X,Z,Y,M]),{content:E,isTruncated:t,hiddenLines:u}=k;if(!M&&Q==="tool"&&J&&"detail"in J){let b=J;if(b.detail)return g(z0,{flexDirection:"column",marginBottom:q?0:1,children:[g(z0,{flexDirection:"row",children:[g(z0,{marginRight:1,children:g(b0,{color:v,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{color:v,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(z0,{marginLeft:C.length+1,children:g(JZ,{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}=W$(()=>{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=i6({content:"",blocks:[]}),D=W$(()=>{if(M)return W??[];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,W]);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:F.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:v,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(t3,{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(a6,{headers:b.tableData.headers,rows:b.tableData.rows,terminalWidth:Y-w},void 0,!1,void 0,this):b.type==="heading"?g(s3,{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(e3,{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(QZ,{content:b.content},void 0,!1,void 0,this):b.type==="blockquote"&&b.blockquoteLines?g(h6,{lines:b.blockquoteLines,level:b.blockquoteLevel||1},void 0,!1,void 0,this):g($Z,{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:v,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),f&&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:F.colors.text.muted,children:["Subtask"," ",typeof f.agentType==="string"?`@${f.agentType}`:"",typeof f.status==="string"?` · ${f.status}`:""]},void 0,!0,void 0,this),typeof f.summary==="string"&&f.summary.trim()!==""&&g(b0,{wrap:"wrap",children:f.summary},void 0,!1,void 0,this),typeof f.childSessionId==="string"&&g(b0,{color:F.colors.text.muted,children:["Session ",f.childSessionId]},void 0,!0,void 0,this),typeof f.resumedFrom==="string"&&g(b0,{color:F.colors.text.muted,children:["Resumed from ",f.resumedFrom,typeof f.resumeDepth==="number"?` · depth ${f.resumeDepth}`:""]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},($,Q)=>{return $.content===Q.content&&$.role===Q.role&&$.terminalWidth===Q.terminalWidth&&$.isPending===Q.isPending&&$.availableTerminalHeight===Q.availableTerminalHeight&&$.hidePrefix===Q.hidePrefix&&$.noMargin===Q.noMargin&&$.renderPlainTextOnly===Q.renderPlainTextOnly&&$.streamingHiddenLines===Q.streamingHiddenLines&&$.streamingLines===Q.streamingLines&&$.messageId===Q.messageId&&$.metadata===Q.metadata&&$.blocksOverride===Q.blocksOverride&&$.currentLineOverride===Q.currentLineOverride&&$.streamingMode===Q.streamingMode&&$.renderCodeBlocksAsPlainText===Q.renderCodeBlocksAsPlainText});import{jsxDEV as I0,Fragment as zZ}from"react/jsx-dev-runtime";var KZ=MQ.memo(({label:$,isSelected:Q})=>I0(f1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),qZ=MQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(zZ,{children:[I0(W1,{marginBottom:1,children:I0(f1,{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(f1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(W1,{marginTop:1,children:I0(e1,{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(e1,{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(f1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,G)=>I0(W1,{marginLeft:2,children:I0(f1,{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(f1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,G)=>I0(W1,{marginLeft:2,children:I0(f1,{children:["• ",X]},void 0,!0,void 0,this)},G,!1,void 0,this)),$.affectedFiles.length>3&&I0(W1,{marginLeft:2,children:I0(f1,{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 s6=MQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=XZ(),J=Y.columns||80,X=$1()==="confirmation-prompt",G=v0(!1),q=$.type==="exitPlanMode",K=$.type==="enterPlanMode",U=$.type==="maxTurnsExceeded",H=$.type==="mcpSampling";ZZ((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(q){if(_==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(_==="s"){Q({approved:!0,targetMode:"default"});return}if(_==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(K){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(U){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(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=t6(()=>{if(q)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(K)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(U)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];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:"用户拒绝"}}]},[q,K,U,H]),W=t6(()=>{if(q)return{color:"cyan",title:"方案审核"};if(K)return{color:"magenta",title:"进入规划模式"};if(U)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[q,K,U,$.title]);return I0(W1,{flexDirection:"column",borderStyle:"round",borderColor:X?W.color:"gray",padding:1,children:[I0(W1,{marginBottom:1,children:I0(f1,{bold:!0,color:W.color,children:W.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(qZ,{details:$,headerColor:W.color,isPlanModeExit:q,isPlanModeEnter:K,terminalWidth:J},void 0,!1,void 0,this),I0(W1,{flexDirection:"column",children:[I0(f1,{color:"gray",children:UZ(q,K,U,H)},void 0,!1,void 0,this),I0(GZ,{items:z,isFocused:X,itemComponent:KZ,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 G0,useInput as OZ}from"ink";import e6 from"ink-text-input";import{useState as g1}from"react";import{jsxDEV as m}from"react/jsx-dev-runtime";var O8=[{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"}],_Z=[`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"],$9=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=d0.getTheme(),[X,G]=g1("action"),[q,K]=g1(0),[U,H]=g1(0),[z,W]=g1(0),[O,B]=g1(""),[_,F]=g1(""),[M,N]=g1(null),[v,C]=g1(!1),[w,f]=g1(null),P=O8[q],A=G2[U],T=X2[z],R=()=>{if(w){f(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}};OZ((D,b)=>{if(b.escape){R();return}if(X==="action"){if(b.upArrow)K((h)=>h>0?h-1:O8.length-1);else if(b.downArrow)K((h)=>h<O8.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)W((h)=>h>0?h-1:X2.length-1);else if(b.downArrow)W((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=O8[q].action;if(D==="add")G("event");else if(D==="status")k();else if(D==="list")u();else if(D==="enable")U1.getInstance().enableSession(Q,$),f("Hooks enabled for this session");else if(D==="disable")U1.getInstance().disableSession(Q,$),f("Hooks disabled for this session");else if(D==="trust")E();else if(D==="revoke")t()},k=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((y0,B0)=>y0+(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");f(V.join(`
141
+ `),K=q.includes("<<<DIFF>>>"),U=q.includes("```");if(K){let F=q.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(F)try{let z=JSON.parse(F[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 F=q.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(F){let z=F[1]||"text",W=F[2];return g(z0,{flexDirection:"column",children:[g(Z2,{content:W,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((F,z)=>g(b0,{color:Y.colors.text.primary,children:F},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 ZZ($,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),q=X*G;if($.length<=q)return{content:$,isTruncated:!1,hiddenLines:0};let K=Math.floor(q*0.9),U=$.length-K,F=U,z=$.indexOf(`
142
+ `,U);if(z!==-1&&z-U<G)F=z+1;let W=$.slice(F),B=($.slice(0,F).match(/\n/g)||[]).length+1;return{content:W,isTruncated:!0,hiddenLines:B}}var e1=L$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:G=!1,noMargin:q=!1,renderPlainTextOnly:K=!1,streamingLines:U,streamingHiddenLines:F,messageId:z,blocksOverride:W,currentLineOverride:O,streamingMode:B="text",renderCodeBlocksAsPlainText:_=!1})=>{let H=A0(),C=W!==void 0,N=W$(()=>t3(Q,H.colors,J),[Q,H.colors,J]),{color:v,prefix:M}=N,w=M.length+1,f=W$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let b=J.subtaskRef;if(!b||typeof b!=="object")return null;return b},[J]),P=Q==="tool"&&J?.phase==="start",A=!q&&!P,T=W$(()=>{if(!K)return[];return $.split(/\r?\n/)},[$,K]);if(!C&&Z){let b=U??$.split(/\r?\n/),h=F??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:H.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(s1.codeBlock))S=!S;else if(l.match(s1.diffStart))x=!0;else if(l.match(s1.diffEnd))x=!1;else if(l.match(s1.table))V=!0;else if(V&&!l.match(s1.table))V=!1}let Z0=B==="text"&&!S&&!x&&!V,R0=Z0?l.match(s1.ulItem):null,B0=Z0?l.match(s1.olItem):null,s0=R0??B0;return g(z0,{flexDirection:"row",flexShrink:0,children:[K0===0&&!G?g(z0,{marginRight:1,flexShrink:0,children:g(b0,{color:v,bold:!0,children:M},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:R0?"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(!C&&K)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:v,bold:!0,children:M},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 y=o6(null);RQ(()=>{y.current=null},[z]);let L=W$(()=>{if(C)return null;if(!z)return null;return n6(z)},[z,C]);RQ(()=>{if(C)return;if(!L||!z)return;y.current={messageId:z,blocks:L}},[L,z,C]),RQ(()=>{if(C)return;if(!L||!z)return;t6(z)},[L,z,C]);let k=W$(()=>C?{content:$,isTruncated:!1,hiddenLines:0}:ZZ($,X,Z,Y),[$,X,Z,Y,C]),{content:E,isTruncated:t,hiddenLines:u}=k;if(!C&&Q==="tool"&&J&&"detail"in J){let b=J;if(b.detail)return g(z0,{flexDirection:"column",marginBottom:q?0:1,children:[g(z0,{flexDirection:"row",children:[g(z0,{marginRight:1,children:g(b0,{color:v,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{color:v,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(z0,{marginLeft:M.length+1,children:g(YZ,{detail:b.detail,terminalWidth:Y-(M.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:a,currentLine:I}=W$(()=>{if(C)return{completedContent:"",currentLine: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,C,O]),R=o6({content:"",blocks:[]}),D=W$(()=>{if(C)return W??[];if(L)return L;if(y.current&&y.current.messageId===z)return y.current.blocks;let b=R.current;if(!Z||!a.startsWith(b.content)){let V=yQ(a);return R.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 R.current={content:a,blocks:x},x},[a,Z,C,W]);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:H.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:v,bold:!0,children:M},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(s3,{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(i6,{headers:b.tableData.headers,rows:b.tableData.rows,terminalWidth:Y-w},void 0,!1,void 0,this):b.type==="heading"?g(e3,{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($Z,{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(JZ,{content:b.content},void 0,!1,void 0,this):b.type==="blockquote"&&b.blockquoteLines?g(E6,{lines:b.blockquoteLines,level:b.blockquoteLevel||1},void 0,!1,void 0,this):g(QZ,{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:v,bold:!0,children:M},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),f&&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:H.colors.text.muted,children:["Subtask"," ",typeof f.agentType==="string"?`@${f.agentType}`:"",typeof f.status==="string"?` · ${f.status}`:""]},void 0,!0,void 0,this),typeof f.summary==="string"&&f.summary.trim()!==""&&g(b0,{wrap:"wrap",children:f.summary},void 0,!1,void 0,this),typeof f.childSessionId==="string"&&g(b0,{color:H.colors.text.muted,children:["Session ",f.childSessionId]},void 0,!0,void 0,this),typeof f.resumedFrom==="string"&&g(b0,{color:H.colors.text.muted,children:["Resumed from ",f.resumedFrom,typeof f.resumeDepth==="number"?` · depth ${f.resumeDepth}`:""]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},($,Q)=>{return $.content===Q.content&&$.role===Q.role&&$.terminalWidth===Q.terminalWidth&&$.isPending===Q.isPending&&$.availableTerminalHeight===Q.availableTerminalHeight&&$.hidePrefix===Q.hidePrefix&&$.noMargin===Q.noMargin&&$.renderPlainTextOnly===Q.renderPlainTextOnly&&$.streamingHiddenLines===Q.streamingHiddenLines&&$.streamingLines===Q.streamingLines&&$.messageId===Q.messageId&&$.metadata===Q.metadata&&$.blocksOverride===Q.blocksOverride&&$.currentLineOverride===Q.currentLineOverride&&$.streamingMode===Q.streamingMode&&$.renderCodeBlocksAsPlainText===Q.renderCodeBlocksAsPlainText});import{jsxDEV as I0,Fragment as OZ}from"react/jsx-dev-runtime";var qZ=MQ.memo(({label:$,isSelected:Q})=>I0(f1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),UZ=MQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(OZ,{children:[I0(W1,{marginBottom:1,children:I0(f1,{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(f1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(W1,{marginTop:1,children:I0(e1,{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(e1,{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(f1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,G)=>I0(W1,{marginLeft:2,children:I0(f1,{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(f1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,G)=>I0(W1,{marginLeft:2,children:I0(f1,{children:["• ",X]},void 0,!0,void 0,this)},G,!1,void 0,this)),$.affectedFiles.length>3&&I0(W1,{marginLeft:2,children:I0(f1,{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 zZ($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var e6=MQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=GZ(),J=Y.columns||80,X=$1()==="confirmation-prompt",G=v0(!1),q=$.type==="exitPlanMode",K=$.type==="enterPlanMode",U=$.type==="maxTurnsExceeded",F=$.type==="mcpSampling";XZ((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(q){if(_==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(_==="s"){Q({approved:!0,targetMode:"default"});return}if(_==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(K){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(U){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(F){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=s6(()=>{if(q)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(K)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(U)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(F)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(本次会话)",value:{approved:!0,scope:"session"}},{key:"approve-project",label:"[P] 允许并记住(本项目)",value:{approved:!0,scope:"project"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[q,K,U,F]),W=s6(()=>{if(q)return{color:"cyan",title:"方案审核"};if(K)return{color:"magenta",title:"进入规划模式"};if(U)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[q,K,U,$.title]);return I0(W1,{flexDirection:"column",borderStyle:"round",borderColor:X?W.color:"gray",padding:1,children:[I0(W1,{marginBottom:1,children:I0(f1,{bold:!0,color:W.color,children:W.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(UZ,{details:$,headerColor:W.color,isPlanModeExit:q,isPlanModeEnter:K,terminalWidth:J},void 0,!1,void 0,this),I0(W1,{flexDirection:"column",children:[I0(f1,{color:"gray",children:zZ(q,K,U,F)},void 0,!1,void 0,this),I0(KZ,{items:z,isFocused:X,itemComponent:qZ,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 G0,useInput as _Z}from"ink";import $9 from"ink-text-input";import{useState as g1}from"react";import{jsxDEV as m}from"react/jsx-dev-runtime";var O8=[{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"}],NZ=[`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"],Q9=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=d0.getTheme(),[X,G]=g1("action"),[q,K]=g1(0),[U,F]=g1(0),[z,W]=g1(0),[O,B]=g1(""),[_,H]=g1(""),[C,N]=g1(null),[v,M]=g1(!1),[w,f]=g1(null),P=O8[q],A=G2[U],T=X2[z],y=()=>{if(w){f(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}};_Z((D,b)=>{if(b.escape){y();return}if(X==="action"){if(b.upArrow)K((h)=>h>0?h-1:O8.length-1);else if(b.downArrow)K((h)=>h<O8.length-1?h+1:0);else if(b.return)L()}else if(X==="event"){if(b.upArrow)F((h)=>h>0?h-1:G2.length-1);else if(b.downArrow)F((h)=>h<G2.length-1?h+1:0);else if(b.return)G("matcher")}else if(X==="location"){if(b.upArrow)W((h)=>h>0?h-1:X2.length-1);else if(b.downArrow)W((h)=>h<X2.length-1?h+1:0);else if(b.return)G("confirm")}else if(X==="confirm"){if(b.return)R()}});let L=()=>{let D=O8[q].action;if(D==="add")G("event");else if(D==="status")k();else if(D==="list")u();else if(D==="enable")U1.getInstance().enableSession(Q,$),f("Hooks enabled for this session");else if(D==="disable")U1.getInstance().disableSession(Q,$),f("Hooks disabled for this session");else if(D==="trust")E();else if(D==="revoke")t()},k=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((R0,B0)=>R0+(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");f(V.join(`
144
144
  `))},E=async()=>{try{let D=await U1.getInstance().trustProject($);f(`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($);f(`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 y0 of l.hooks||[])if(y0.type==="command")h.push(` -> ${y0.command}`)}h.push("")}if(!S)h.push("No hooks configured"),h.push(""),h.push("Configure hooks in .blade/settings.local.json");f(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]||[],y0={...K0,enabled:!0,[A.event]:[...Z0,x]};if(l.hooks=y0,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(G0,{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(G0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),w&&m(L0,{flexDirection:"column",marginBottom:1,children:[m(G0,{children:w},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(G0,{color:Z.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="action"&&!w&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",marginTop:1,children:O8.map((D,b)=>m(L0,{children:[m(G0,{color:b===q?Z.colors.primary:void 0,bold:b===q,children:[b===q?"> ":" ",D.action]},void 0,!0,void 0,this),m(G0,{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(G0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="event"&&m(L0,{flexDirection:"column",children:[m(G0,{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(G0,{color:b===U?Z.colors.primary:void 0,bold:b===U,children:[b===U?"> ":" ",D.event]},void 0,!0,void 0,this),m(G0,{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(G0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X!=="event"&&m(L0,{marginBottom:1,children:m(G0,{children:["Event:"," ",m(G0,{bold:!0,color:Z.colors.primary,children:A.event},void 0,!1,void 0,this),m(G0,{color:Z.colors.muted,children:[" - ",A.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(X==="matcher"||X==="command"||X==="confirm")&&m(L0,{flexDirection:"column",marginBottom:1,children:[m(G0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),m(G0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),m(G0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),m(G0,{color:Z.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="matcher"&&m(L0,{flexDirection:"column",children:[m(L0,{children:[m(G0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),m(e6,{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(G0,{color:Z.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(G0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(X==="command"||X==="confirm")&&m(L0,{marginBottom:1,children:m(G0,{children:["Matcher: ",m(G0,{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(G0,{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(e6,{value:_,onChange:F,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(G0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),_Z.map((D,b)=>m(G0,{color:Z.colors.muted,children:["• ",D]},b,!0,void 0,this))]},void 0,!0,void 0,this),m(L0,{marginTop:1,children:m(G0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="location"&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[m(G0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),m(G0,{children:" "},void 0,!1,void 0,this),m(G0,{children:[" ","Event: ",A.event," - ",A.description]},void 0,!0,void 0,this),m(G0,{children:[" Matcher: ",O||"(all)"]},void 0,!0,void 0,this),m(G0,{children:[" Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),m(G0,{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(G0,{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(G0,{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(G0,{color:Z.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="confirm"&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[m(G0,{bold:!0,children:["Saving hook to ",T.description,"..."]},void 0,!0,void 0,this),m(G0,{children:" "},void 0,!1,void 0,this),m(G0,{children:["Event: ",A.event]},void 0,!0,void 0,this),m(G0,{children:["Matcher: ",O||"(all tools)"]},void 0,!0,void 0,this),m(G0,{children:["Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),m(L0,{marginTop:1,children:m(G0,{color:Z.colors.muted,children:v?"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(G0,{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 B9}from"ahooks";import{Box as fZ,Text as kZ}from"ink";import vZ from"react";import{useMemoizedFn as q2}from"ahooks";import w$ from"chalk";import{Text as RZ,useInput as MZ}from"ink";import{useEffect as H9,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 B$="\x1B",NZ=`${B$}[200~`,FZ=`${B$}[201~`,HZ="[200~",WZ="[201~",LZ=[`${B$}[I`,`${B$}[O`,"[I","[O"],Y9=`${B$}[?2004h`,Z9=`${B$}[?2004l`,fQ=`${B$}[?1004l`,BZ=[NZ,HZ],wZ=[FZ,WZ];function X9(){return{pasteBuffer:null,pasteOverflowed:!1}}function Q9($,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 J9($){return LZ.some((Q)=>$===Q)}function G9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,G=[];while(Y.length>0){if(J!==null){let U=Q9(Y,wZ);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 q=Q9(Y,BZ);if(!q){if(J9(Y))X=!0;else G.push({kind:"text",text:Y});Y="";break}let K=Y.slice(0,q.index);if(K&&!J9(K))G.push({kind:"text",text:K});J="",Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:G}}import{execSync as r$}from"node:child_process";import{existsSync as bZ,readFileSync as kQ}from"node:fs";import{basename as K9,isAbsolute as AZ}from"node:path";function q9($){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 PZ(){let{commands:$}=U9();try{return r$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function z9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function O9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function vQ($){let Q=z9($.trim()),Y=O9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function yZ($){let Q=z9($.trim()),Y=O9(Q);if(vQ(Y))return Y;return null}async function _9($){let Q=yZ($);if(!Q)return null;let Y;try{if(AZ(Q))Y=kQ(Q);else{let G=PZ();if(G&&Q===K9(G))Y=kQ(G);else return null}}catch(G){return console.error("Failed to read image file:",G),null}let J=Y.toString("base64"),Z=q9(J),X=K9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function N9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return r$(Y,{encoding:"utf-8"})||null}catch{return null}}async function F9(){let{commands:$,screenshotPath:Q}=U9();try{if(r$($.checkImage,{stdio:"ignore"}),r$($.saveImage(Q),{stdio:"ignore"}),!bZ(Q))return null;let J=kQ(Q).toString("base64"),Z=q9(J);return r$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{r$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as TZ}from"react/jsx-dev-runtime";var CZ=/\r\n/g,IZ=/\r/g;function SQ($){if(!$.includes("\r"))return $;return $.replace(CZ,`
147
- `).replace(IZ,`
148
- `)}function W9($,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 L9({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:G,onImagePaste:q,disabledKeys:K=[]}){let U=U2(X9()),H=U2($),z=U2(Z),W=U2(null);H9(()=>{H.current=$,z.current=Z},[$,Z]),H9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let O=q2((C,w)=>{let f=H.current,P=z.current;if(H.current=C,z.current=w,C!==f)J(C);if(w!==P)X(w)}),B=q2((C)=>{if(!C)return;let{newValue:w,newCursorPosition:f}=W9(SQ(C),H.current,z.current);O(w,f)}),_=q2(async(C)=>{let w=SQ(C);if(!w)return;if(q&&vQ(w))try{let P=await _9(w);if(P){let A=await q(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)}),F=q2((C)=>{let w=W.current;if(!w){try{let P=C();if(!P)return;let A=P.catch(()=>{return});W.current=A,A.finally(()=>{if(W.current===A)W.current=null})}catch{}return}let f=w.then(C).then(()=>{return}).catch(()=>{return});W.current=f,f.finally(()=>{if(W.current===f)W.current=null})});MZ((C,w)=>{F(()=>{let f=SQ(C),P=G9(U.current,f);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(K.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||f==="?"&&H.current==="")return;let T=H.current,R=z.current,L=R,k=T;if(w.leftArrow)L--;else if(w.rightArrow)L++;else if(w.backspace||w.delete){if(C===""){if(R>0)k=T.slice(0,R-1)+T.slice(R,T.length),L--}else if(R<T.length)k=T.slice(0,R)+T.slice(R+1,T.length)}else if(w.ctrl&&f==="a")L=0;else if(w.ctrl&&f==="e")L=T.length;else if(w.ctrl&&f==="k")k=T.slice(0,R);else if(w.ctrl&&f==="u")k=T.slice(R),L=0;else if(w.ctrl&&f==="w"){let t=T.slice(0,R).match(/\s*\S+\s*$/);if(t){let u=t[0].length;k=T.slice(0,R-u)+T.slice(R),L-=u}}else if(w.ctrl&&f==="v"){let E=process.platform==="darwin";return(async()=>{if(q){let u=await F9();if(u){let a=await q(u.base64,u.mediaType,"clipboard.png");if(a?.prompt)B(a.prompt);return}}if(E)return;let t=await N9();if(t)await _(t)})()}else if(w.pageUp)L=0;else if(w.pageDown)L=T.length;else if(f===`
150
- `&&(w.shift||w.meta)){let{newValue:E,newCursorPosition:t}=W9(f,T,R);O(E,t);return}else if(!w.ctrl&&!w.meta){if(G&&(f.length>K2.LARGE_INPUT_THRESHOLD||f.includes(`
151
- `)))return _(f);k=T.slice(0,R)+f+T.slice(R,T.length),L+=f.length}if(L<0)L=0;if(L>k.length)L=k.length;O(k,L)})},{isActive:Y});let M=Y,N=$,v=Q?w$.grey(Q):void 0;if(M)if(v=Q.length>0?w$.inverse(Q[0])+w$.grey(Q.slice(1)):w$.inverse(" "),$.length===0)N=w$.inverse(" ");else{N="";for(let C=0;C<$.length;C++)if(C===Z&&Z<$.length)N+=w$.inverse($[C]);else N+=$[C];if(Z>=$.length)N+=w$.inverse(" ")}return TZ(RZ,{children:Q?$.length>0?N:v:N},void 0,!1,void 0,this)}import{jsxDEV as DQ}from"react/jsx-dev-runtime";var w9=vZ.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let q=$1()==="main-input",K=$.trimStart().startsWith("!"),U=B9((z)=>{let W=z.split(`
152
- `).length,O=z.length,B=500,_=10;if(O>500||W>10){let F=Z(z),M=z.slice(0,30).replace(/\n/g," "),N=`${O} chars, ${W} lines: ${M}...`;return{prompt:`${r8(F)}${N}${l2()}`}}return{}}),H=B9(async(z,W,O)=>{try{let B=X(z,W);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(fZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[DQ(kZ,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),DQ(L9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:U,onImagePaste:H,placeholder:" 输入命令...",focus:q,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as z2,Text as R1}from"ink";import hZ,{useEffect as EZ,useState as gZ}from"react";import{useEffect as jZ,useState as y9}from"react";import{useEffect as SZ,useState as DZ}from"react";var VZ=15000,b9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],A9=["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 P9($,Q,Y=!1){let[J,Z]=DZ("");return SZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let U=Math.floor(Math.random()*A9.length);return A9[U]}let K=Math.floor(Math.random()*b9.length);return b9[K]};Z(X());let G=setInterval(()=>{Z(X())},VZ);return()=>{clearInterval(G)}},[$,Q,Y]),J}function R9($,Q=!1,Y=!1){let[J,Z]=y9(0),[X,G]=y9(null),q=P9($,Q,Y);return jZ(()=>{if(!$){Z(0),G(null);return}if(Y)return;if(X===null)G(Date.now());let K=setInterval(()=>{if(X!==null){let U=Math.floor((Date.now()-X)/1000);Z(U)}},1000);return()=>{clearInterval(K)}},[$,X,Y]),{currentPhrase:q,elapsedTime:J}}import{jsxDEV as J1,Fragment as pZ}from"react/jsx-dev-runtime";var VQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],mZ=80;function M9($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var C9=hZ.memo(({message:$,paused:Q=!1})=>{let Y=o1(),J=y8(),Z=Y4(),X=Z4(),G=Y||!J,[q,K]=gZ(0),U=A0(),z=g$()>=mZ,{currentPhrase:W,elapsedTime:O}=R9(G,!1,Q);if(EZ(()=>{if(!G||Q){K(0);return}let M=setInterval(()=>{K((N)=>(N+1)%VQ.length)},150);return()=>clearInterval(M)},[G,Q]),!G)return null;let B=Z?.phase==="scheduled"?`Provider 暂时不可用,${Z.attempt}/${Z.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((Z.delayMs??0)/1000))}s 后开始`:Z?.phase==="attempt"?`正在重试 Provider (${Z.attempt}/${Z.maxRetries})`:null,F=(X?X.outputStarted?`Provider 流已暂停 ${Math.ceil(X.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(X.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(X.durationMs/1000)}s(空闲超时上限 ${Math.ceil(X.timeoutMs/1000)}s)`:null)||B||$||W||"正在思考中...";if(z)return J1(z2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[J1(R1,{color:U.colors.warning,bold:!0,children:VQ[q]},void 0,!1,void 0,this),J1(R1,{color:U.colors.text.primary,children:F},void 0,!1,void 0,this),O>0&&J1(pZ,{children:[J1(R1,{color:U.colors.muted,children:"|"},void 0,!1,void 0,this),J1(R1,{color:U.colors.info,children:["已用时: ",M9(O)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J1(R1,{color:U.colors.muted,children:"|"},void 0,!1,void 0,this),J1(R1,{color:U.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(R1,{color:U.colors.warning,bold:!0,children:VQ[q]},void 0,!1,void 0,this),J1(R1,{color:U.colors.text.primary,children:F},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O>0&&J1(z2,{marginLeft:2,flexDirection:"row",gap:1,children:[J1(R1,{color:U.colors.info,children:["已用时: ",M9(O)]},void 0,!0,void 0,this),J1(R1,{color:U.colors.muted,children:"|"},void 0,!1,void 0,this),J1(R1,{color:U.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as N2,Text as D0,useInput as cZ,useStdout as xZ}from"ink";import uZ from"ink-text-input";import lZ,{useCallback as O2,useEffect as dZ,useMemo as rZ,useState as b$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var k9=lZ.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=xZ(),J=Y.columns||80,Z=$1()==="confirmation-prompt",X=v0(!1),G=$.fields??[],[q,K]=b$("field"),[U,H]=b$(0),[z,W]=b$(()=>I9($)),[O,B]=b$(""),[_,F]=b$(0),[M,N]=b$([]),[v,C]=b$(),w=G[U],f=rZ(()=>aZ(w),[w]);dZ(()=>{if(!w)return;let L=z[w.name];B(typeof L==="string"||typeof L==="number"?String(L):""),N(Array.isArray(L)?[...L]:[]);let k=f.findIndex((E)=>E.value===String(L));F(k>=0?k:0),C(void 0)},[z,w,f]);let P=O2((L)=>{if(W(L),U<G.length-1){H((k)=>k+1);return}K("review")},[U,G.length]),A=O2((L)=>{if(!w)return;let k={...z};if(L===void 0)delete k[w.name];else k[w.name]=L;P(k)},[z,w,P]),T=O2((L)=>{if(!w)return;try{A(T9(w,L))}catch(k){C(k instanceof Error?k.message:String(k))}},[w,A]),R=O2(()=>{try{let L=f9($,{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(cZ((L,k)=>{if(k.ctrl&&L==="c"||k.meta&&L==="c"){X();return}if(k.escape){Q({action:"cancel"});return}if($.mode==="url"){if(L.toLowerCase()==="y")Q({action:"accept"},!0);else if(L.toLowerCase()==="n")Q({action:"decline"});return}if(q==="review"){if(L.toLowerCase()==="y"||k.return)R();else if(L.toLowerCase()==="e")H(0),K("field");else if(L.toLowerCase()==="d")Q({action:"decline"});return}if(!w){if(k.return)R();return}if(jQ(w))return;if(L.toLowerCase()==="d"){Q({action:"decline"});return}if(k.upArrow){F((E)=>E>0?E-1:Math.max(f.length-1,0));return}if(k.downArrow||k.tab){F((E)=>E<f.length-1?E+1:0);return}if(L===" "&&w.type==="multi-select"){let E=f[_];if(E)N((t)=>t.includes(E.value)?t.filter((u)=>u!==E.value):[...t,E.value]);return}if(k.return)if(w.type==="multi-select")A(M);else{let E=f[_];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(q==="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,": ",oZ(z[L.name])]},L.name,!0,void 0,this)),v&&F0(D0,{color:"red",children:v},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:iZ(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(uZ,{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:f.map((L,k)=>{let E=w.type==="multi-select"&&M.includes(L.value);return F0(D0,{color:_===k?"yellow":void 0,children:[_===k?"> ":" ",w.type==="multi-select"?E?"(*) ":"( ) ":"",L.label]},L.value,!0,void 0,this)})},void 0,!1,void 0,this),v&&F0(D0,{color:"red",children:v},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 aZ($){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 iZ($){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 oZ($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import L2 from"ansi-escapes";import{Box as Q$,Static as u9,useStdout as z5}from"ink";import O5,{useEffect as c1,useMemo as l9,useRef as J$,useState as xQ}from"react";import{useStdout as nZ}from"ink";import{debounce as tZ}from"lodash-es";import{useEffect as sZ,useState as eZ}from"react";function v9($=200){let{stdout:Q}=nZ(),[Y,J]=eZ(Q.rows||24);return sZ(()=>{let Z=tZ(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import A$ from"chalk";import $5 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`:"",S9=`${H2}[?25l`,D9=`${H2}[?25h`;function V9($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function j9($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function h9($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),G=[],q=d0.getTheme(),K=" ".repeat(N0.prefixIndent),U=A$.dim.hex(q.colors.border.light);if(Q>0)G.push(`${K}${A$.dim.hex(q.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let H=Y==="code",z=Y==="diff",W="",O=$;if(H&&$.length>0)W=$[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 F=W?` ${A$.hex(q.colors.text.secondary)(W)}`:"";G.push(`${K}${U("╭─")}${F}`)}for(let F=0;F<B.length;F++){let M=B[F],N=K;if(F===0&&!J&&N0.isFirstRender&&!H&&!z)N=A$.bold.hex(q.colors.success)("• ")+" ",N0.isFirstRender=!1;let v=H?4:0,C=N0.terminalWidth-N0.prefixIndent-2-v,w=M;if($5(M)>C)w=M.slice(0,C);if(H)G.push(`${K}${U("│")} ${w}`);else if(z){let f=w;if(f.startsWith("+"))G.push(`${N}${A$.green(w)}`);else if(f.startsWith("-"))G.push(`${N}${A$.red(w)}`);else if(f.startsWith("@@"))G.push(`${N}${A$.dim(w)}`);else G.push(`${N}${w}`)}else G.push(`${N}${w}`);if(F===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let _=[];if(_.push(S9),N0.renderedLineCount>0)_.push(F2(N0.renderedLineCount)),_.push("\r");for(let F=0;F<G.length;F++){let M=G[F],N=N0.lastRenderedLines[F];if(M!==N)_.push(hQ),_.push(M);if(F<G.length-1)_.push(`
153
- `)}if(G.length<N0.renderedLineCount){for(let M=G.length;M<N0.renderedLineCount;M++)_.push(`
154
- `),_.push(hQ);let F=N0.renderedLineCount-G.length;_.push(F2(F))}_.push(D9),process.stdout.write(_.join("")),N0.renderedLineCount=G.length,N0.lastRenderedLines=G}function m1(){if(!N0.active)return;if(N0.renderedLineCount>0){let $=[];$.push(S9),$.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(D9),process.stdout.write($.join(""))}N0.active=!1,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.isFirstRender=!0}function k1(){return N0.active}import{Box as Q5,Text as E9}from"ink";import J5 from"react";import{jsxDEV as EQ}from"react/jsx-dev-runtime";var gQ=J5.memo(({collapsedCount:$})=>{let Q=A0();if($<=0)return null;let Y=Q.colors.text.muted;return EQ(Q5,{flexDirection:"row",marginBottom:1,children:[EQ(E9,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),EQ(E9,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});gQ.displayName="CollapsedHistorySummary";import{Box as _8,Text as N8}from"ink";import Y5 from"ink-big-text";import Z5 from"ink-gradient";import X5 from"react";import{jsxDEV as L1}from"react/jsx-dev-runtime";var m9=X5.memo(()=>{return L1(_8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[L1(_8,{flexDirection:"column",children:L1(Z5,{name:"pastel",children:L1(Y5,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(_8,{marginBottom:1,children:L1(N8,{color:"white",dimColor:!0,children:g9()},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(_8,{flexDirection:"column",marginBottom:1,children:[L1(_8,{marginBottom:1,children:L1(N8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(N8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),L1(N8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),L1(N8,{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 p9 from"react";import{jsxDEV as $$}from"react/jsx-dev-runtime";var c9=p9.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 $$(W2,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[$$(W2,{marginBottom:Y?0:1,children:[$$(mQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),$$(mQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$$(W2,{flexDirection:"column",children:$.map((X,G)=>$$(G5,{task:X,compact:Y},X.id||G,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),G5=p9.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 $$(W2,{paddingY:Q?0:0,children:$$(mQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as pQ,Text as a$}from"ink";import K5,{useMemo as x9}from"react";import{jsxDEV as p1}from"react/jsx-dev-runtime";function q5($,Q=60){if(!$)return"";let Y=$.split(`
156
- `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function U5($){if(!$)return 0;return $.split(`
157
- `).length}var cQ=K5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=x9(()=>U5($),[$]),X=x9(()=>q5($),[$]),G=J.colors.info,q=J.colors.muted;return p1(pQ,{flexDirection:"column",marginBottom:1,children:[p1(pQ,{flexDirection:"row",children:[p1(a$,{color:G,children:Y?"v":">"},void 0,!1,void 0,this),p1(a$,{children:" "},void 0,!1,void 0,this),p1(a$,{color:q,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&p1(a$,{color:q,children:[" - ",X]},void 0,!0,void 0,this),p1(a$,{color:q,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&p1(pQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:p1(a$,{color:q,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 r9=O5.memo(()=>{let $=eQ(),Q=b4(),Y=A4(),J=P4(),Z=o1(),X=q4(),G=_4(),q=C8(),K=B4(),U=w4(),H=$4(),z=R4(),W=y4(),O=g$(),B=v9(),{stdout:_}=z5(),F=a1(),[M,N]=xQ(null),[v,C]=xQ([]),[w,f]=xQ(new Set),P=J$(W),A=J$(null),T=J$(0),R=J$(0),L=J$(new Set),k=J$(new Set),E=J$([]),t=J$(null);c1(()=>{if(P.current!==W){if(k1())m1();if(_)_.write(L2.clearTerminal);F.incrementClearCount(),P.current=W}},[W,_,F]);let u=$,a=J;c1(()=>{if(!J||Z){t.current=null;return}if(t.current===J)return;if(t.current=J,k1())m1();if(_)_.write(L2.eraseScreen+L2.cursorTo(0,0));L.current=new Set,k.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([]),f(new Set),F.incrementClearCount(),F.clearFinalizingStreamingMessageId()},[J,Z,_,F,u]);let I=Q??J;c1(()=>{if(k1())m1();A.current=null,T.current=0,R.current=0,L.current=new Set,k.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),E.current=[],C([]),f(new Set)},[H]),c1(()=>{if(!I)return;if(A.current===I)return;A.current=I,T.current=0,R.current=0,k.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),E.current=[],C([])},[I,u]),c1(()=>{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 y0=Z0>0;if(k1())m1();f((B0)=>{if(!I||B0.has(I))return B0;let s0=new Set(B0);return s0.add(I),s0}),C((B0)=>[...B0,a0(Q$,{flexDirection:"column",children:a0(e1,{content:"",role:"assistant",terminalWidth:O,isPending:!1,hidePrefix:y0,noMargin:!0,blocksOverride:V,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${Z0}`,!1,void 0,this)])},[I,Y.version,O,H]),c1(()=>{if(!I)return;let S=k.current,x=u.filter((V)=>V.role==="tool"&&!S.has(V.id)&&!L.current.has(V.id));if(x.length===0)return;if(k1())m1();for(let V of x)L.current.add(V.id);C((V)=>[...V,...x.map((l)=>a0(Q$,{flexDirection:"column",children:a0(e1,{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]),c1(()=>{if(!I){if(k1())m1();return}if(!k1())V9(O,B);else j9(O,B);let S=d9(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;h9(K0,l,S.mode,Z0)},[I,Y.version,B,O]),c1(()=>{if(!I&&k1())m1()},[I]),c1(()=>{if(M===null&&u.length>z){if(N(u.length),k1())m1();if(_)_.write(L2.clearTerminal);F.incrementClearCount()}},[u.length,z,M,_,F]);let y=l9(()=>{return X.some((S)=>S.status==="pending"||S.status==="in_progress")},[X]),D=W?0:M??0,b=D,h=l9(()=>{let S=[];if(S.push(a0(m9,{},"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(Q$,{flexDirection:"column",children:a0(e1,{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(Q$,{flexDirection:"column",paddingX:2,children:a0(Q$,{flexDirection:"column",children:[a0(u9,{items:h,children:(S)=>S},H,!1,void 0,this),K&&a0(Q$,{marginBottom:1,children:a0(cQ,{content:K,isStreaming:Z,isExpanded:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),v.length>0&&a0(u9,{items:v,children:(S)=>S},`streaming-${H}`,!1,void 0,this),G&&y&&a0(Q$,{marginTop:1,children:a0(c9,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.map((S,x)=>a0(Q$,{flexDirection:"column",children:a0(e1,{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 _5}from"ahooks";import{Box as B1,Text as H0,useFocus as N5,useFocusManager as F5,useInput as H5}from"ink";import W5 from"ink-select-input";import{memo as L5,useMemo as B5,useState as w2}from"react";import{jsxDEV as e,Fragment as A5}from"react/jsx-dev-runtime";var w5=({isSelected:$})=>e(B1,{marginRight:1,children:e(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),b5=({isSelected:$,label:Q})=>e(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),a9=L5(({onClose:$,onEdit:Q})=>{let Y=N4(),J=M8()??"",{isFocused:Z}=N5({id:"model-selector"}),X=F5(),[G,q]=w2(""),[K,U]=w2(!1),[H,z]=w2(null),W=v0(!1),[O]=w2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});_5(()=>{if(X?.focus("model-selector"),Y.length>0)q(Y[0].id)}),H5((P,A)=>{if(K)return;if(A.ctrl&&P==="c"||A.meta&&P==="c"){W();return}if(A.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){_();return}if((P==="e"||P==="E")&&Q)F()},{isActive:!0});let B=B2(async(P)=>{if(K)return;let A=P.value;if(A===J){$();return}U(!0),z(null);try{await g0().setCurrentModel(A),$()}catch(T){z(T.message),U(!1)}}),_=B2(async()=>{if(K||G===J)return;U(!0),z(null);try{if(await g0().removeModel(G),Y.length<=1)$()}catch(P){z(P.message)}finally{U(!1)}}),F=B2(()=>{if(K||!Q)return;let P=Y.find((A)=>A.id===G);if(!P)return;Q(P)}),M=B2((P)=>{q(P.value)}),N=B5(()=>{return Y.find((P)=>P.id===G)},[Y,G]),v=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 e(B1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[e(B1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[e(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),e(H0,{dimColor:!0,children:[K?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(B1,{flexDirection:"row",children:[e(B1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),e(B1,{marginTop:1,children:e(W5,{items:C,onSelect:B,onHighlight:M,indicatorComponent:w5,itemComponent:b5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(B1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),e(B1,{marginY:1,children:e(H0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N?e(B1,{flexDirection:"column",children:[e(H0,{children:[e(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),e(H0,{bold:!0,color:"cyan",children:lQ(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:v?.name??N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v&&e(A5,{children:[e(H0,{children:[e(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),e(H0,{children:N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),e(H0,{children:v.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:v.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:N.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.overrides?.baseUrl&&e(H0,{children:[e(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:N.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),e(H0,{children:V1().resolveConfig(N).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):e(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H&&e(B1,{marginTop:1,children:e(H0,{color:"red",children:H},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(B1,{justifyContent:"center",marginTop:1,children:e(H0,{dimColor:!0,children:"─".repeat(O)},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(B1,{justifyContent:"center",children:e(H0,{dimColor:!0,children:"提示:D=删除 * E=编辑 * Up/Down=移动 * Enter/ESC=确认"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as dQ}from"ahooks";import{Box as x5,Text as rQ,useInput as u5}from"ink";import{useState as R$}from"react";import{Box as P$,Text as x1,useInput as P5}from"ink";import y5 from"ink-text-input";import{jsxDEV as o0}from"react/jsx-dev-runtime";var i9=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return P5((G,q)=>{if(q.escape)Z()}),o0(P$,{flexDirection:"column",children:[o0(P$,{marginBottom:1,children:o0(x1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(x1,{children:["Provider: ",o0(x1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(x1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{children:[o0(x1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),o0(y5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&o0(P$,{marginTop:1,children:o0(x1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginTop:1,children:o0(x1,{dimColor:!0,children:["输入完成后按 ",o0(x1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",o0(x1,{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 Y$,useInput as R5}from"ink";import M5 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 o9($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function C5($,Q,Y){switch($){case"id":return"team-gateway";case"name":return Y||"Team Gateway";case"baseUrl":return Q==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return Q==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function I5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=t9(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 s9=({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),[q,K]=P2(Q?.model??""),[U,H]=P2(Z),[z,W]=P2(),O=y2[X];R5((_,F)=>{if(!F.escape)return;if(W(void 0),X===0){J();return}let M=X-1,N=y2[M];G(M),K(U[N])});let B=(_)=>{let F=_.trim();if(O==="id"&&!n9.test(F)){W("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(O==="baseUrl")try{let N=new URL(F);if(!["http:","https:"].includes(N.protocol))throw Error()}catch{W("Base URL 必须是绝对 HTTP(S) URL");return}if(O==="model"&&!F){W("Model ID 不能为空");return}let M={...U,[O]:O==="name"&&!F?U.id:F};if(H(M),W(void 0),X===y2.length-1){try{Y(I5(M,$))}catch(N){W(N instanceof Error?N.message:"渠道配置无效")}return}G(X+1),K("")};return O1(A2,{flexDirection:"column",children:[O1(A2,{marginBottom:1,children:O1(Y$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O1(Y$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),y2.slice(0,X).map((_)=>O1(Y$,{children:[o9(_),": ",O1(Y$,{color:"cyan",children:U[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),O1(A2,{marginTop:1,children:[O1(Y$,{bold:!0,children:[o9(O),": "]},void 0,!0,void 0,this),O1(M5,{value:q,onChange:(_)=>{K(_),W(void 0)},onSubmit:B,placeholder:C5(O,$,U.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O==="name"&&O1(Y$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),z&&O1(Y$,{color:"red",children:z},void 0,!1,void 0,this),O1(A2,{marginTop:1,children:O1(Y$,{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 QJ,useState as i$}from"react";var JJ=()=>{let[$,Q]=i$([]),[Y,J]=i$(!0),[Z,X]=i$(null);return QJ(()=>{(async()=>{try{Q(await e9())}catch(q){X(q instanceof Error?q.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},YJ=($)=>{let[Q,Y]=i$([]),[J,Z]=i$(!1),[X,G]=i$(null);return QJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),G(null);try{Y(await $J($))}catch(K){G(K instanceof Error?K.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as u1,Text as M1,useInput as T5}from"ink";import f5 from"ink-select-input";import k5 from"ink-text-input";import{useMemo as ZJ,useState as v5}from"react";import{jsxDEV as h0,Fragment as j5}from"react/jsx-dev-runtime";var S5=({isSelected:$})=>h0(u1,{marginRight:1,children:h0(M1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),D5=($)=>{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(" ")},V5=({isSelected:$,label:Q})=>h0(M1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),XJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[G,q]=v5("");T5((H,z)=>{if(z.escape)if(G)q("");else X()});let K=ZJ(()=>{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=ZJ(()=>K.map((H)=>({key:H.id,label:D5(H),value:H})),[K]);if(Y)return h0(u1,{flexDirection:"column",children:h0(M1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return h0(u1,{flexDirection:"column",children:[h0(M1,{color:"red",children:J},void 0,!1,void 0,this),h0(M1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return h0(u1,{flexDirection:"column",children:[h0(u1,{marginBottom:1,children:h0(M1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(u1,{marginBottom:1,children:h0(M1,{children:["Provider: ",h0(M1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),h0(j5,{children:[h0(u1,{marginBottom:1,children:[h0(M1,{color:"cyan",children:"> "},void 0,!1,void 0,this),h0(k5,{value:G,onChange:q,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h0(u1,{marginBottom:1,children:h0(M1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(u1,{flexDirection:"column",height:12,children:h0(f5,{items:U,onSelect:(H)=>Z(H.value),indicatorComponent:S5,itemComponent:V5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&h0(M1,{color:"yellow",children:"内置 catalog 中没有匹配模型"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as y$,Text as Z$,useInput as h5}from"ink";import E5 from"ink-select-input";import g5 from"ink-text-input";import{useMemo as GJ,useState as m5}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var p5=({isSelected:$})=>n0(y$,{marginRight:1,children:n0(Z$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c5=({isSelected:$,label:Q})=>n0(Z$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),KJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,G]=m5("");h5((U,H)=>{if(H.escape)if(X)G("");else Z()});let q=GJ(()=>{if(!X)return $;let U=X.toLowerCase();return $.filter((H)=>H.name.toLowerCase().includes(U)||H.id.toLowerCase().includes(U))},[$,X]),K=GJ(()=>q.map((U)=>({key:U.id,label:`${U.name} - ${U.modelCount} models${U.configured?" [configured]":""}`,value:U})),[q]);if(Q)return n0(y$,{flexDirection:"column",children:n0(Z$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(y$,{flexDirection:"column",children:[n0(Z$,{color:"red",children:Y},void 0,!1,void 0,this),n0(Z$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(y$,{flexDirection:"column",children:[n0(y$,{marginBottom:1,children:n0(Z$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(y$,{marginBottom:1,children:[n0(Z$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(g5,{value:X,onChange:G,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(y$,{flexDirection:"column",height:12,children:n0(E5,{items:K,onSelect:(U)=>J(U.value),indicatorComponent:p5,itemComponent:c5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.length===0&&n0(Z$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function qJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as X$}from"react/jsx-dev-runtime";var aQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,G]=R$("provider"),[q,K]=R$(),[U,H]=R$(),[z,W]=R$(),[O,B]=R$(""),[_,F]=R$(),[M,N]=R$(!1),v=JJ(),C=YJ(q?.id),w=v0(!1);u5((T,R)=>{if(R.ctrl&&T==="c"||R.meta&&T==="c")$==="setup"?w():Z()});let f=dQ(async(T)=>{if(!q)return;let R=z??(U?{provider:q.id,model:U.id,displayName:Q?.displayName}:void 0);if(!R)return;N(!0),F(void 0);try{if(R.modelProvider)V1().registerModelProvider(R.provider,R.modelProvider,[R.model]);if(T?.trim())await V1().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 k=R.modelProvider?await g0().addModelWithProvider(L,R.modelProvider):await g0().addModel(L);await g0().setCurrentModel(k.id),await J(R)}else if(Y){if(R.modelProvider)await g0().updateModelWithProvider(Y,L,R.modelProvider);else await g0().updateModel(Y,L);await J(R)}}catch(L){if(R.modelProvider){await V1().credentials.delete(R.provider);let k=b2();V1().configureModelProviders(k?.modelProviders??{},k?.models??[])}F(L instanceof Error?L.message:"保存配置失败"),N(!1)}}),P=dQ((T)=>{if(H(T),q?.configured)f();else if(q?.supportsApiKey)G("credential");else F(`${q?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),A=dQ(()=>{if(F(void 0),X==="credential"&&z){G("custom");return}let T=qJ(X);if(T)G(T)});return X$(x5,{flexDirection:"column",padding:1,children:[X$(rQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&X$(KJ,{...v,onSelect:(T)=>{K(T),H(void 0),W(void 0),G(T.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&q?.factoryWireApi&&X$(s9,{wireApi:q.factoryWireApi,initialConfig:z,onSubmit:(T)=>{W(T),G("credential")},onCancel:A},void 0,!1,void 0,this),X==="model"&&q&&X$(XJ,{provider:q,...C,onSelect:P,onCancel:A},void 0,!1,void 0,this),X==="credential"&&q&&X$(i9,{provider:q,value:O,onChange:B,onSubmit:()=>void f(O),onCancel:A,error:_},void 0,!1,void 0,this),M&&X$(rQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&X$(rQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as F8}from"ahooks";import{promises as _J}from"fs";import{Box as _1,Text as V0,useInput as l5}from"ink";import UJ from"ink-select-input";import d5 from"ink-text-input";import r5 from"os";import R2 from"path";import{useEffect as a5,useMemo as M2,useRef as i5,useState as G$}from"react";import{jsxDEV as U0}from"react/jsx-dev-runtime";var H8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],o5={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},n5={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},zJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},t5=["project","global","local"],s5={allow:[],ask:[],deny:[]},e5={localExists:!1,projectExists:!1,globalExists:!1},OJ={allow:[],ask:[],deny:[]};function $X($){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 QX($){try{let Q=await _J.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:$X(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...OJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...OJ}}}}function JX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${zJ[Q]} <- 可删除`:zJ[Q];return`${Y} ${J}`}var NJ=({onClose:$})=>{let Y=$1()==="permissions-manager",J=v0(!1),[Z,X]=G$(0),G=H8[Z].key,[q,K]=G$(s5),[U,H]=G$(e5),[z,W]=G$(!0),[O,B]=G$("list"),[_,F]=G$(""),[M,N]=G$(null),[v,C]=G$(null),w=i5(!1),f=M2(()=>R2.join(x0(),".blade","settings.local.json"),[]),P=M2(()=>R2.join(x0(),".blade","settings.json"),[]),A=M2(()=>R2.join(r5.homedir(),".blade","settings.json"),[]),T=F8(async()=>{W(!0);let x=await Promise.all([{source:"local",path:f},{source:"project",path:P},{source:"global",path:A}].map(async({source:Z0,path:y0})=>{let B0=await QX(y0);return{source:Z0,path:y0,...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)=>{t5.forEach((y0)=>{(K0[y0]?.permissions[Z0]??[]).forEach((s0,p0)=>{let F1={key:`${y0}:${p0}:${s0}`,rule:s0,source:y0};l[Z0].push(F1)})})}),K(l),W(!1)});a5(()=>{T()},[T]);let R=F8(async(S,x)=>{try{let V=R2.join(x0(),".blade","settings.local.json"),l={allow:[],ask:[],deny:[]};try{let Z0=await _J.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 g0().updateConfig({permissions:K0},{scope:"local",immediate:!0}),await T()}catch(V){throw console.error("[PermissionsManager] 修改权限规则失败:",V),V}});l5((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"),F(""),N(null),C(null);return}if(O==="list"){if(x.tab&&x.shift)X((V)=>(V-1+H8.length)%H8.length);else if(x.tab)X((V)=>(V+1)%H8.length);else if(S?.toLowerCase()==="q")$()}},{isActive:Y});let L=F8((S)=>{let x=S.value;if(G==="info")return;if(x.type==="add"){B("add"),F(""),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)}),k=F8(async()=>{if(G==="info")return;let S=_.trim();if(!S){C({type:"error",text:"Permission rule 不能为空"});return}if(q[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"),F(""),C({type:"success",text:"已添加本地权限规则"})}catch(V){C({type:"error",text:`保存失败: ${V instanceof Error?V.message:"未知错误"}`})}}),E=F8(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:`› ${o5[S]}`,value:{type:"add"}},...q[S].map((V)=>({key:V.key,label:JX(V.rule,V.source),value:{type:"rule",entry:V}}))]},[G,q]),u=()=>U0(_1,{marginBottom:1,children:H8.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:n5[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(d5,{value:_,onChange:F,onSubmit:k},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y=(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(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)=>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(UJ,{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),v&&U0(_1,{marginTop:1,children:U0(V0,{color:v.type==="success"?"green":"red",children:v.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 YX}from"ink";import{useEffect as ZX,useState as M$}from"react";import{jsxDEV as p}from"react/jsx-dev-runtime";var iQ=["local","project","global"];function bJ({workspaceRoot:$,onCancel:Q}){let Y=HJ($),J=Y.getAll(),[Z,X]=M$(0),[G,q]=M$(!1),[K,U]=M$(""),[H,z]=M$(null),[W,O]=M$("local"),[B,_]=M$(null),[F,M]=M$(0),N=Y.getBySource(),v=Y.getStats(),C=Y.getSourcePolicy(),w=v0(!1,Q);ZX(()=>{let L=!0;return FJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((k)=>{if(L)_(k.settings)}).catch((k)=>{if(L)U(k instanceof Error?k.message:"无法读取插件作用域配置")}),()=>{L=!1}},[Y,F]);let f=()=>{O((L)=>{let k=iQ.indexOf(L);return iQ[(k+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}q(!0),U("");try{let k=await WJ(Y.getWorkspaceRoot(),L.manifest.name,L.status!=="active",W);U(k.effectiveEnabled?`已启用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`:`已禁用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`),M((E)=>E+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}},A=async()=>{if(G)return;q(!0),U("");try{await LJ(Y.getWorkspaceRoot()),X(0),U("插件列表已刷新"),M((L)=>L+1)}catch(L){U(L instanceof Error?L.message:String(L))}finally{q(!1)}},T=async()=>{let L=J[Z];if(!L||G)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}q(!0),z(null),U("");try{let{result:k}=await BJ(Y.getWorkspaceRoot(),L.manifest.name,{trusted:!0});if(!k.success)throw Error(k.error);U(k.changed?`已更新 ${L.manifest.name} 到 ${k.installation?.revision}`:`${L.manifest.name} 已是最新版本`),M((E)=>E+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!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}q(!0),U("");try{let{result:k}=await wJ(Y.getWorkspaceRoot(),L.manifest.name,!0);if(!k.success)throw Error(k.error);z(null),X(0),U(`已卸载 ${L.manifest.name}`),M((E)=>E+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}};if(YX((L,k)=>{if(k.escape)Q?.();else if(k.ctrl&&L==="c"||k.meta&&L==="c")w();else if((k.upArrow||L==="k")&&J.length>0)z(null),X((E)=>(E-1+J.length)%J.length);else if((k.downArrow||L==="j")&&J.length>0)z(null),X((E)=>(E+1)%J.length);else if(L===" "||k.return)P();else if(L==="r")A();else if(L==="s")f();else if(L==="u")T();else if(L==="x")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:[" (共 ",v.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:["启用: ",v.active," | 禁用: ",v.inactive," | 命令: ",v.commands," | 技能:"," ",v.skills," | 代理: ",v.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:W},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 k=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?"› ":" ",k," ",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 k=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?"› ":" ",k," ",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 k=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?"› ":" ",k," ",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),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 AJ,useStdout as XX}from"ink";import GX from"ink-text-input";import oQ,{useCallback as W8,useMemo as KX,useState as K$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var qX=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)),UX=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)),PJ=oQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=XX(),Z=J.columns||80,G=$1()==="confirmation-prompt",q=v0(!1),[K,U]=K$("answering"),[H,z]=K$(0),[W,O]=K$({}),[B,_]=K$(0),[F,M]=K$([]),[N,v]=K$(!1),[C,w]=K$(""),[f,P]=K$(0),A=$[H],T=KX(()=>{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=W8((u)=>{let a={...W,[A.header]:u};if(O(a),H<$.length-1)z(H+1),_(0),M([]),v(!1),w("");else U("submit"),P(0)},[W,A?.header,H,$.length]),L=W8((u)=>{let a=T[u];if(!a)return;if(a.value==="__other__"){v(!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]),k=W8((u)=>{if(u.trim())R(u.trim())},[R]),E=W8(()=>{U("answering"),z(0),_(0),M([]),v(!1)},[]),t=W8(()=>{Q(W)},[W,Q]);if(AJ((u,a)=>{if(a.ctrl&&u==="c"||a.meta&&u==="c"){q();return}if(N){if(a.escape)v(!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&&F.length>0)R(F);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&&K==="answering"&&!N}),AJ((u,a)=>{if(a.ctrl&&u==="c"||a.meta&&u==="c"){q();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){P((I)=>I===0?1:0);return}if(a.return){if(f===0)t();else E();return}if(u.toLowerCase()==="y"){t();return}if(u.toLowerCase()==="e"){E();return}},{isActive:G&&K==="submit"}),K==="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(UX,{questions:$,answers:W},void 0,!1,void 0,this),W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:f===0?"yellow":void 0,bold:f===0,children:[f===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Z1,{color:f===1?"yellow":void 0,bold:f===1,children:[f===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(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(GX,{value:C,onChange:w,onSubmit:k,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(qX,{option:u,index:a,isSelected:F.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&&F.length>0&&W0(Z1,{color:"green",children:["Selected: ",F.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 zX}from"node:path";import{Box as n$,Text as w1,useInput as OX}from"ink";import _X from"ink-select-input";import{useEffect as nQ,useMemo as o$,useRef as TJ,useState as C2}from"react";function yJ($){return`${$.projectPath}\x00${$.sessionId}`}function RJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function MJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function CJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function IJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as u0}from"react/jsx-dev-runtime";function NX($){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 FX($){return zX($)}function HX($){switch($){case"queued":return"QUEUED";case"running":return"RUNNING";case"failed":return"FAILED";case"cancelled":return"CANCELLED";case"interrupted":return"INTERRUPTED";case"completed":return"DONE"}}var WX=({isSelected:$})=>u0(n$,{marginRight:1,children:u0(w1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),LX=({isSelected:$,label:Q})=>u0(w1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),L8=20,fJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=C2([]),[G,q]=C2(!1),[K,U]=C2(0),[H,z]=C2(!1),W=TJ(!1),O=TJ(!0);nQ(()=>{return O.current=!0,()=>{O.current=!1}},[]);let _=$1()==="session-selector",F=v0(!1);OX((A,T)=>{if(T.ctrl&&A==="c"||T.meta&&A==="c"){F();return}if(W.current)return;if(T.escape&&J){J();return}if(T.leftArrow||A==="h"||A==="H"){if(K>0)U((R)=>R-1);return}if(T.rightArrow||A==="l"||A==="L"){if(K<C-1)U((R)=>R+1);return}},{isActive:_}),nQ(()=>{if(Q){X(Q);return}(async()=>{q(!0);try{let T=await P0.listSessions({includeSubagents:!1});X(T)}catch(T){console.error("[SessionSelector] Failed to load sessions:",T),X([])}finally{q(!1)}})()},[Q]);let M=o$(()=>CJ(Q||Z,$),[$,Q,Z]),N=o$(()=>IJ($),[$]),v=o$(()=>{return M.map((A)=>{let T=FX(A.taskSourceProjectPath??A.projectPath),R=NX(A.lastMessageTime),L=RJ(A),k=`[${HX(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=MJ(A);return{key:yJ(A),label:`${k} ${L} · ${R} | ${T}${E} | ${A.messageCount} 条消息${a}${y}${I}${D}${t}${u}`,value:A}})},[M]),C=o$(()=>Math.max(1,Math.ceil(v.length/L8)),[v.length]),w=o$(()=>{let A=K*L8;return v.slice(A,A+L8)},[v,K]),f=o$(()=>({start:K*L8+1,end:Math.min((K+1)*L8,v.length)}),[K,v.length]);nQ(()=>{U(0)},[M.length]);let P=(A)=>{if(W.current)return;W.current=!0,z(!0);let T=()=>{if(!O.current)return;W.current=!1,z(!1)};Promise.resolve().then(()=>Y(A.value)).then(T,T)};if(G)return u0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:u0(w1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(M.length===0)return u0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[u0(w1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),u0(w1,{dimColor:!0,children:[`
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($);f(`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 R0 of l.hooks||[])if(R0.type==="command")h.push(` -> ${R0.command}`)}h.push("")}if(!S)h.push("No hooks configured"),h.push(""),h.push("Configure hooks in .blade/settings.local.json");f(h.join(`
146
+ `))},a=()=>{G("command")},I=()=>{if(!_.trim()){N("Command cannot be empty");return}N(null),G("location")},R=async()=>{M(!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]||[],R0={...K0,enabled:!0,[A.event]:[...Z0,x]};if(l.hooks=R0,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"}`),M(!1)}};return m(L0,{flexDirection:"column",padding:1,children:[m(L0,{marginBottom:1,children:m(G0,{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(G0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),w&&m(L0,{flexDirection:"column",marginBottom:1,children:[m(G0,{children:w},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(G0,{color:Z.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="action"&&!w&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",marginTop:1,children:O8.map((D,b)=>m(L0,{children:[m(G0,{color:b===q?Z.colors.primary:void 0,bold:b===q,children:[b===q?"> ":" ",D.action]},void 0,!0,void 0,this),m(G0,{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(G0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="event"&&m(L0,{flexDirection:"column",children:[m(G0,{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(G0,{color:b===U?Z.colors.primary:void 0,bold:b===U,children:[b===U?"> ":" ",D.event]},void 0,!0,void 0,this),m(G0,{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(G0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X!=="event"&&m(L0,{marginBottom:1,children:m(G0,{children:["Event:"," ",m(G0,{bold:!0,color:Z.colors.primary,children:A.event},void 0,!1,void 0,this),m(G0,{color:Z.colors.muted,children:[" - ",A.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(X==="matcher"||X==="command"||X==="confirm")&&m(L0,{flexDirection:"column",marginBottom:1,children:[m(G0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),m(G0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),m(G0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),m(G0,{color:Z.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="matcher"&&m(L0,{flexDirection:"column",children:[m(L0,{children:[m(G0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),m($9,{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(G0,{color:Z.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(L0,{marginTop:1,children:m(G0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(X==="command"||X==="confirm")&&m(L0,{marginBottom:1,children:m(G0,{children:["Matcher: ",m(G0,{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(G0,{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($9,{value:_,onChange:H,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(G0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),NZ.map((D,b)=>m(G0,{color:Z.colors.muted,children:["• ",D]},b,!0,void 0,this))]},void 0,!0,void 0,this),m(L0,{marginTop:1,children:m(G0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="location"&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[m(G0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),m(G0,{children:" "},void 0,!1,void 0,this),m(G0,{children:[" ","Event: ",A.event," - ",A.description]},void 0,!0,void 0,this),m(G0,{children:[" Matcher: ",O||"(all)"]},void 0,!0,void 0,this),m(G0,{children:[" Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),m(G0,{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(G0,{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(G0,{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(G0,{color:Z.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="confirm"&&m(L0,{flexDirection:"column",children:[m(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[m(G0,{bold:!0,children:["Saving hook to ",T.description,"..."]},void 0,!0,void 0,this),m(G0,{children:" "},void 0,!1,void 0,this),m(G0,{children:["Event: ",A.event]},void 0,!0,void 0,this),m(G0,{children:["Matcher: ",O||"(all tools)"]},void 0,!0,void 0,this),m(G0,{children:["Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),m(L0,{marginTop:1,children:m(G0,{color:Z.colors.muted,children:v?"Saving...":"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C&&m(L0,{marginTop:1,children:m(G0,{color:Z.colors.error,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as w9}from"ahooks";import{Box as kZ,Text as vZ}from"ink";import SZ from"react";import{useMemoizedFn as q2}from"ahooks";import w$ from"chalk";import{Text as MZ,useInput as CZ}from"ink";import{useEffect as W9,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 B$="\x1B",FZ=`${B$}[200~`,HZ=`${B$}[201~`,WZ="[200~",LZ="[201~",BZ=[`${B$}[I`,`${B$}[O`,"[I","[O"],Z9=`${B$}[?2004h`,X9=`${B$}[?2004l`,fQ=`${B$}[?1004l`,wZ=[FZ,WZ],bZ=[HZ,LZ];function G9(){return{pasteBuffer:null,pasteOverflowed:!1}}function J9($,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 Y9($){return BZ.some((Q)=>$===Q)}function K9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,G=[];while(Y.length>0){if(J!==null){let U=J9(Y,bZ);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 q=J9(Y,wZ);if(!q){if(Y9(Y))X=!0;else G.push({kind:"text",text:Y});Y="";break}let K=Y.slice(0,q.index);if(K&&!Y9(K))G.push({kind:"text",text:K});J="",Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:G}}import{execSync as r$}from"node:child_process";import{existsSync as AZ,readFileSync as kQ}from"node:fs";import{basename as q9,isAbsolute as PZ}from"node:path";function U9($){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 z9(){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 RZ(){let{commands:$}=z9();try{return r$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function O9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function _9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function vQ($){let Q=O9($.trim()),Y=_9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function yZ($){let Q=O9($.trim()),Y=_9(Q);if(vQ(Y))return Y;return null}async function N9($){let Q=yZ($);if(!Q)return null;let Y;try{if(PZ(Q))Y=kQ(Q);else{let G=RZ();if(G&&Q===q9(G))Y=kQ(G);else return null}}catch(G){return console.error("Failed to read image file:",G),null}let J=Y.toString("base64"),Z=U9(J),X=q9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function F9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return r$(Y,{encoding:"utf-8"})||null}catch{return null}}async function H9(){let{commands:$,screenshotPath:Q}=z9();try{if(r$($.checkImage,{stdio:"ignore"}),r$($.saveImage(Q),{stdio:"ignore"}),!AZ(Q))return null;let J=kQ(Q).toString("base64"),Z=U9(J);return r$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{r$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as fZ}from"react/jsx-dev-runtime";var IZ=/\r\n/g,TZ=/\r/g;function SQ($){if(!$.includes("\r"))return $;return $.replace(IZ,`
147
+ `).replace(TZ,`
148
+ `)}function L9($,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 B9({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:G,onImagePaste:q,disabledKeys:K=[]}){let U=U2(G9()),F=U2($),z=U2(Z),W=U2(null);W9(()=>{F.current=$,z.current=Z},[$,Z]),W9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let O=q2((M,w)=>{let f=F.current,P=z.current;if(F.current=M,z.current=w,M!==f)J(M);if(w!==P)X(w)}),B=q2((M)=>{if(!M)return;let{newValue:w,newCursorPosition:f}=L9(SQ(M),F.current,z.current);O(w,f)}),_=q2(async(M)=>{let w=SQ(M);if(!w)return;if(q&&vQ(w))try{let P=await N9(w);if(P){let A=await q(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)}),H=q2((M)=>{let w=W.current;if(!w){try{let P=M();if(!P)return;let A=P.catch(()=>{return});W.current=A,A.finally(()=>{if(W.current===A)W.current=null})}catch{}return}let f=w.then(M).then(()=>{return}).catch(()=>{return});W.current=f,f.finally(()=>{if(W.current===f)W.current=null})});CZ((M,w)=>{H(()=>{let f=SQ(M),P=K9(U.current,f);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(K.some((E)=>w[E])||w.ctrl&&M==="c"||w.ctrl&&M==="l"||w.ctrl&&M==="t"||w.ctrl&&M==="o"||w.meta&&M==="l"||w.meta&&M==="t"||w.meta&&M==="o"||w.shift&&w.tab||f==="?"&&F.current==="")return;let T=F.current,y=z.current,L=y,k=T;if(w.leftArrow)L--;else if(w.rightArrow)L++;else if(w.backspace||w.delete){if(M===""){if(y>0)k=T.slice(0,y-1)+T.slice(y,T.length),L--}else if(y<T.length)k=T.slice(0,y)+T.slice(y+1,T.length)}else if(w.ctrl&&f==="a")L=0;else if(w.ctrl&&f==="e")L=T.length;else if(w.ctrl&&f==="k")k=T.slice(0,y);else if(w.ctrl&&f==="u")k=T.slice(y),L=0;else if(w.ctrl&&f==="w"){let t=T.slice(0,y).match(/\s*\S+\s*$/);if(t){let u=t[0].length;k=T.slice(0,y-u)+T.slice(y),L-=u}}else if(w.ctrl&&f==="v"){let E=process.platform==="darwin";return(async()=>{if(q){let u=await H9();if(u){let a=await q(u.base64,u.mediaType,"clipboard.png");if(a?.prompt)B(a.prompt);return}}if(E)return;let t=await F9();if(t)await _(t)})()}else if(w.pageUp)L=0;else if(w.pageDown)L=T.length;else if(f===`
150
+ `&&(w.shift||w.meta)){let{newValue:E,newCursorPosition:t}=L9(f,T,y);O(E,t);return}else if(!w.ctrl&&!w.meta){if(G&&(f.length>K2.LARGE_INPUT_THRESHOLD||f.includes(`
151
+ `)))return _(f);k=T.slice(0,y)+f+T.slice(y,T.length),L+=f.length}if(L<0)L=0;if(L>k.length)L=k.length;O(k,L)})},{isActive:Y});let C=Y,N=$,v=Q?w$.grey(Q):void 0;if(C)if(v=Q.length>0?w$.inverse(Q[0])+w$.grey(Q.slice(1)):w$.inverse(" "),$.length===0)N=w$.inverse(" ");else{N="";for(let M=0;M<$.length;M++)if(M===Z&&Z<$.length)N+=w$.inverse($[M]);else N+=$[M];if(Z>=$.length)N+=w$.inverse(" ")}return fZ(MZ,{children:Q?$.length>0?N:v:N},void 0,!1,void 0,this)}import{jsxDEV as DQ}from"react/jsx-dev-runtime";var b9=SZ.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let q=$1()==="main-input",K=$.trimStart().startsWith("!"),U=w9((z)=>{let W=z.split(`
152
+ `).length,O=z.length,B=500,_=10;if(O>500||W>10){let H=Z(z),C=z.slice(0,30).replace(/\n/g," "),N=`${O} chars, ${W} lines: ${C}...`;return{prompt:`${r8(H)}${N}${l2()}`}}return{}}),F=w9(async(z,W,O)=>{try{let B=X(z,W);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(kZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[DQ(vZ,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),DQ(B9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:U,onImagePaste:F,placeholder:" 输入命令...",focus:q,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 EZ,{useEffect as gZ,useState as mZ}from"react";import{useEffect as hZ,useState as y9}from"react";import{useEffect as DZ,useState as VZ}from"react";var jZ=15000,A9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],P9=["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 R9($,Q,Y=!1){let[J,Z]=VZ("");return DZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let U=Math.floor(Math.random()*P9.length);return P9[U]}let K=Math.floor(Math.random()*A9.length);return A9[K]};Z(X());let G=setInterval(()=>{Z(X())},jZ);return()=>{clearInterval(G)}},[$,Q,Y]),J}function M9($,Q=!1,Y=!1){let[J,Z]=y9(0),[X,G]=y9(null),q=R9($,Q,Y);return hZ(()=>{if(!$){Z(0),G(null);return}if(Y)return;if(X===null)G(Date.now());let K=setInterval(()=>{if(X!==null){let U=Math.floor((Date.now()-X)/1000);Z(U)}},1000);return()=>{clearInterval(K)}},[$,X,Y]),{currentPhrase:q,elapsedTime:J}}import{jsxDEV as J1,Fragment as cZ}from"react/jsx-dev-runtime";var VQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],pZ=80;function C9($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var I9=EZ.memo(({message:$,paused:Q=!1})=>{let Y=o1(),J=R8(),Z=Y4(),X=Z4(),G=X4(),q=Y||!J,[K,U]=mZ(0),F=A0(),W=g$()>=pZ,{currentPhrase:O,elapsedTime:B}=M9(q,!1,Q);if(gZ(()=>{if(!q||Q){U(0);return}let v=setInterval(()=>{U((M)=>(M+1)%VQ.length)},150);return()=>clearInterval(v)},[q,Q]),!q)return null;let _=Z?.phase==="scheduled"?`Provider 暂时不可用,${Z.attempt}/${Z.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((Z.delayMs??0)/1000))}s 后开始`:Z?.phase==="attempt"?`正在重试 Provider (${Z.attempt}/${Z.maxRetries})`:null,H=X?X.outputStarted?`Provider 流已暂停 ${Math.ceil(X.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(X.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(X.durationMs/1000)}s(空闲超时上限 ${Math.ceil(X.timeoutMs/1000)}s)`:null,N=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||H||_||$||O||"正在思考中...";if(W)return J1(z2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[J1(y1,{color:F.colors.warning,bold:!0,children:VQ[K]},void 0,!1,void 0,this),J1(y1,{color:F.colors.text.primary,children:N},void 0,!1,void 0,this),B>0&&J1(cZ,{children:[J1(y1,{color:F.colors.muted,children:"|"},void 0,!1,void 0,this),J1(y1,{color:F.colors.info,children:["已用时: ",C9(B)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J1(y1,{color:F.colors.muted,children:"|"},void 0,!1,void 0,this),J1(y1,{color:F.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:F.colors.warning,bold:!0,children:VQ[K]},void 0,!1,void 0,this),J1(y1,{color:F.colors.text.primary,children:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B>0&&J1(z2,{marginLeft:2,flexDirection:"row",gap:1,children:[J1(y1,{color:F.colors.info,children:["已用时: ",C9(B)]},void 0,!0,void 0,this),J1(y1,{color:F.colors.muted,children:"|"},void 0,!1,void 0,this),J1(y1,{color:F.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 xZ,useStdout as uZ}from"ink";import lZ from"ink-text-input";import dZ,{useCallback as O2,useEffect as rZ,useMemo as aZ,useState as b$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var v9=dZ.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=uZ(),J=Y.columns||80,Z=$1()==="confirmation-prompt",X=v0(!1),G=$.fields??[],[q,K]=b$("field"),[U,F]=b$(0),[z,W]=b$(()=>T9($)),[O,B]=b$(""),[_,H]=b$(0),[C,N]=b$([]),[v,M]=b$(),w=G[U],f=aZ(()=>iZ(w),[w]);rZ(()=>{if(!w)return;let L=z[w.name];B(typeof L==="string"||typeof L==="number"?String(L):""),N(Array.isArray(L)?[...L]:[]);let k=f.findIndex((E)=>E.value===String(L));H(k>=0?k:0),M(void 0)},[z,w,f]);let P=O2((L)=>{if(W(L),U<G.length-1){F((k)=>k+1);return}K("review")},[U,G.length]),A=O2((L)=>{if(!w)return;let k={...z};if(L===void 0)delete k[w.name];else k[w.name]=L;P(k)},[z,w,P]),T=O2((L)=>{if(!w)return;try{A(f9(w,L))}catch(k){M(k instanceof Error?k.message:String(k))}},[w,A]),y=O2(()=>{try{let L=k9($,{action:"accept",content:z});Q({action:L.action,...L.content?{content:L.content}:{}})}catch(L){M(L instanceof Error?L.message:String(L))}},[z,$,Q]);if(xZ((L,k)=>{if(k.ctrl&&L==="c"||k.meta&&L==="c"){X();return}if(k.escape){Q({action:"cancel"});return}if($.mode==="url"){if(L.toLowerCase()==="y")Q({action:"accept"},!0);else if(L.toLowerCase()==="n")Q({action:"decline"});return}if(q==="review"){if(L.toLowerCase()==="y"||k.return)y();else if(L.toLowerCase()==="e")F(0),K("field");else if(L.toLowerCase()==="d")Q({action:"decline"});return}if(!w){if(k.return)y();return}if(jQ(w))return;if(L.toLowerCase()==="d"){Q({action:"decline"});return}if(k.upArrow){H((E)=>E>0?E-1:Math.max(f.length-1,0));return}if(k.downArrow||k.tab){H((E)=>E<f.length-1?E+1:0);return}if(L===" "&&w.type==="multi-select"){let E=f[_];if(E)N((t)=>t.includes(E.value)?t.filter((u)=>u!==E.value):[...t,E.value]);return}if(k.return)if(w.type==="multi-select")A(C);else{let E=f[_];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(q==="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,": ",nZ(z[L.name])]},L.name,!0,void 0,this)),v&&F0(D0,{color:"red",children:v},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:oZ(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(lZ,{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:f.map((L,k)=>{let E=w.type==="multi-select"&&C.includes(L.value);return F0(D0,{color:_===k?"yellow":void 0,children:[_===k?"> ":" ",w.type==="multi-select"?E?"(*) ":"( ) ":"",L.label]},L.value,!0,void 0,this)})},void 0,!1,void 0,this),v&&F0(D0,{color:"red",children:v},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 iZ($){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 oZ($){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 nZ($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import L2 from"ansi-escapes";import{Box as Q$,Static as l9,useStdout as O5}from"ink";import _5,{useEffect as c1,useMemo as d9,useRef as J$,useState as xQ}from"react";import{useStdout as tZ}from"ink";import{debounce as sZ}from"lodash-es";import{useEffect as eZ,useState as $5}from"react";function S9($=200){let{stdout:Q}=tZ(),[Y,J]=$5(Q.rows||24);return eZ(()=>{let Z=sZ(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import A$ from"chalk";import Q5 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`:"",D9=`${H2}[?25l`,V9=`${H2}[?25h`;function j9($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function h9($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function E9($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),G=[],q=d0.getTheme(),K=" ".repeat(N0.prefixIndent),U=A$.dim.hex(q.colors.border.light);if(Q>0)G.push(`${K}${A$.dim.hex(q.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let F=Y==="code",z=Y==="diff",W="",O=$;if(F&&$.length>0)W=$[0].match(/^```(\w+)?/)?.[1]||"",O=$.slice(1);else if(z&&$.length>0&&$[0]==="<<<DIFF>>>")O=$.slice(1);let B=O.slice(-X);if(F&&Q===0){let H=W?` ${A$.hex(q.colors.text.secondary)(W)}`:"";G.push(`${K}${U("╭─")}${H}`)}for(let H=0;H<B.length;H++){let C=B[H],N=K;if(H===0&&!J&&N0.isFirstRender&&!F&&!z)N=A$.bold.hex(q.colors.success)("• ")+" ",N0.isFirstRender=!1;let v=F?4:0,M=N0.terminalWidth-N0.prefixIndent-2-v,w=C;if(Q5(C)>M)w=C.slice(0,M);if(F)G.push(`${K}${U("│")} ${w}`);else if(z){let f=w;if(f.startsWith("+"))G.push(`${N}${A$.green(w)}`);else if(f.startsWith("-"))G.push(`${N}${A$.red(w)}`);else if(f.startsWith("@@"))G.push(`${N}${A$.dim(w)}`);else G.push(`${N}${w}`)}else G.push(`${N}${w}`);if(H===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let _=[];if(_.push(D9),N0.renderedLineCount>0)_.push(F2(N0.renderedLineCount)),_.push("\r");for(let H=0;H<G.length;H++){let C=G[H],N=N0.lastRenderedLines[H];if(C!==N)_.push(hQ),_.push(C);if(H<G.length-1)_.push(`
153
+ `)}if(G.length<N0.renderedLineCount){for(let C=G.length;C<N0.renderedLineCount;C++)_.push(`
154
+ `),_.push(hQ);let H=N0.renderedLineCount-G.length;_.push(F2(H))}_.push(V9),process.stdout.write(_.join("")),N0.renderedLineCount=G.length,N0.lastRenderedLines=G}function m1(){if(!N0.active)return;if(N0.renderedLineCount>0){let $=[];$.push(D9),$.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(V9),process.stdout.write($.join(""))}N0.active=!1,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.isFirstRender=!0}function k1(){return N0.active}import{Box as J5,Text as g9}from"ink";import Y5 from"react";import{jsxDEV as EQ}from"react/jsx-dev-runtime";var gQ=Y5.memo(({collapsedCount:$})=>{let Q=A0();if($<=0)return null;let Y=Q.colors.text.muted;return EQ(J5,{flexDirection:"row",marginBottom:1,children:[EQ(g9,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),EQ(g9,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});gQ.displayName="CollapsedHistorySummary";import{Box as _8,Text as N8}from"ink";import Z5 from"ink-big-text";import X5 from"ink-gradient";import G5 from"react";import{jsxDEV as L1}from"react/jsx-dev-runtime";var p9=G5.memo(()=>{return L1(_8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[L1(_8,{flexDirection:"column",children:L1(X5,{name:"pastel",children:L1(Z5,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(_8,{marginBottom:1,children:L1(N8,{color:"white",dimColor:!0,children:m9()},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(_8,{flexDirection:"column",marginBottom:1,children:[L1(_8,{marginBottom:1,children:L1(N8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(N8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),L1(N8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),L1(N8,{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 c9 from"react";import{jsxDEV as $$}from"react/jsx-dev-runtime";var x9=c9.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 $$(W2,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[$$(W2,{marginBottom:Y?0:1,children:[$$(mQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),$$(mQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$$(W2,{flexDirection:"column",children:$.map((X,G)=>$$(K5,{task:X,compact:Y},X.id||G,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),K5=c9.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 $$(W2,{paddingY:Q?0:0,children:$$(mQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as pQ,Text as a$}from"ink";import q5,{useMemo as u9}from"react";import{jsxDEV as p1}from"react/jsx-dev-runtime";function U5($,Q=60){if(!$)return"";let Y=$.split(`
156
+ `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function z5($){if(!$)return 0;return $.split(`
157
+ `).length}var cQ=q5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=u9(()=>z5($),[$]),X=u9(()=>U5($),[$]),G=J.colors.info,q=J.colors.muted;return p1(pQ,{flexDirection:"column",marginBottom:1,children:[p1(pQ,{flexDirection:"row",children:[p1(a$,{color:G,children:Y?"v":">"},void 0,!1,void 0,this),p1(a$,{children:" "},void 0,!1,void 0,this),p1(a$,{color:q,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&p1(a$,{color:q,children:[" - ",X]},void 0,!0,void 0,this),p1(a$,{color:q,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&p1(pQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:p1(a$,{color:q,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 a9=_5.memo(()=>{let $=eQ(),Q=A4(),Y=P4(),J=R4(),Z=o1(),X=U4(),G=N4(),q=C8(),K=w4(),U=b4(),F=$4(),z=M4(),W=y4(),O=g$(),B=S9(),{stdout:_}=O5(),H=a1(),[C,N]=xQ(null),[v,M]=xQ([]),[w,f]=xQ(new Set),P=J$(W),A=J$(null),T=J$(0),y=J$(0),L=J$(new Set),k=J$(new Set),E=J$([]),t=J$(null);c1(()=>{if(P.current!==W){if(k1())m1();if(_)_.write(L2.clearTerminal);H.incrementClearCount(),P.current=W}},[W,_,H]);let u=$,a=J;c1(()=>{if(!J||Z){t.current=null;return}if(t.current===J)return;if(t.current=J,k1())m1();if(_)_.write(L2.eraseScreen+L2.cursorTo(0,0));L.current=new Set,k.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),A.current=null,T.current=0,y.current=0,E.current=[],M([]),f(new Set),H.incrementClearCount(),H.clearFinalizingStreamingMessageId()},[J,Z,_,H,u]);let I=Q??J;c1(()=>{if(k1())m1();A.current=null,T.current=0,y.current=0,L.current=new Set,k.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),E.current=[],M([]),f(new Set)},[F]),c1(()=>{if(!I)return;if(A.current===I)return;A.current=I,T.current=0,y.current=0,k.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),E.current=[],M([])},[I,u]),c1(()=>{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=y.current;y.current+=1;let R0=Z0>0;if(k1())m1();f((B0)=>{if(!I||B0.has(I))return B0;let s0=new Set(B0);return s0.add(I),s0}),M((B0)=>[...B0,a0(Q$,{flexDirection:"column",children:a0(e1,{content:"",role:"assistant",terminalWidth:O,isPending:!1,hidePrefix:R0,noMargin:!0,blocksOverride:V,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${Z0}`,!1,void 0,this)])},[I,Y.version,O,F]),c1(()=>{if(!I)return;let S=k.current,x=u.filter((V)=>V.role==="tool"&&!S.has(V.id)&&!L.current.has(V.id));if(x.length===0)return;if(k1())m1();for(let V of x)L.current.add(V.id);M((V)=>[...V,...x.map((l)=>a0(Q$,{flexDirection:"column",children:a0(e1,{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]),c1(()=>{if(!I){if(k1())m1();return}if(!k1())j9(O,B);else h9(O,B);let S=r9(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;E9(K0,l,S.mode,Z0)},[I,Y.version,B,O]),c1(()=>{if(!I&&k1())m1()},[I]),c1(()=>{if(C===null&&u.length>z){if(N(u.length),k1())m1();if(_)_.write(L2.clearTerminal);H.incrementClearCount()}},[u.length,z,C,_,H]);let R=d9(()=>{return X.some((S)=>S.status==="pending"||S.status==="in_progress")},[X]),D=W?0:C??0,b=D,h=d9(()=>{let S=[];if(S.push(a0(p9,{},"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(Q$,{flexDirection:"column",children:a0(e1,{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(Q$,{flexDirection:"column",paddingX:2,children:a0(Q$,{flexDirection:"column",children:[a0(l9,{items:h,children:(S)=>S},F,!1,void 0,this),K&&a0(Q$,{marginBottom:1,children:a0(cQ,{content:K,isStreaming:Z,isExpanded:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),v.length>0&&a0(l9,{items:v,children:(S)=>S},`streaming-${F}`,!1,void 0,this),G&&R&&a0(Q$,{marginTop:1,children:a0(x9,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.map((S,x)=>a0(Q$,{flexDirection:"column",children:a0(e1,{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 N5}from"ahooks";import{Box as B1,Text as H0,useFocus as F5,useFocusManager as H5,useInput as W5}from"ink";import L5 from"ink-select-input";import{memo as B5,useMemo as w5,useState as w2}from"react";import{jsxDEV as e,Fragment as P5}from"react/jsx-dev-runtime";var b5=({isSelected:$})=>e(B1,{marginRight:1,children:e(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),A5=({isSelected:$,label:Q})=>e(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),i9=B5(({onClose:$,onEdit:Q})=>{let Y=F4(),J=M8()??"",{isFocused:Z}=F5({id:"model-selector"}),X=H5(),[G,q]=w2(""),[K,U]=w2(!1),[F,z]=w2(null),W=v0(!1),[O]=w2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});N5(()=>{if(X?.focus("model-selector"),Y.length>0)q(Y[0].id)}),W5((P,A)=>{if(K)return;if(A.ctrl&&P==="c"||A.meta&&P==="c"){W();return}if(A.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){_();return}if((P==="e"||P==="E")&&Q)H()},{isActive:!0});let B=B2(async(P)=>{if(K)return;let A=P.value;if(A===J){$();return}U(!0),z(null);try{await g0().setCurrentModel(A),$()}catch(T){z(T.message),U(!1)}}),_=B2(async()=>{if(K||G===J)return;U(!0),z(null);try{if(await g0().removeModel(G),Y.length<=1)$()}catch(P){z(P.message)}finally{U(!1)}}),H=B2(()=>{if(K||!Q)return;let P=Y.find((A)=>A.id===G);if(!P)return;Q(P)}),C=B2((P)=>{q(P.value)}),N=w5(()=>{return Y.find((P)=>P.id===G)},[Y,G]),v=N?b2()?.modelProviders[N.provider]:void 0,M=Y.map((P)=>{let A=P.id===J?" (当前)":"";return{label:lQ(P)+A,value:P.id}}),w=G===J;return e(B1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[e(B1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[e(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),e(H0,{dimColor:!0,children:[K?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(B1,{flexDirection:"row",children:[e(B1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),e(B1,{marginTop:1,children:e(L5,{items:M,onSelect:B,onHighlight:C,indicatorComponent:b5,itemComponent:A5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(B1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),e(B1,{marginY:1,children:e(H0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N?e(B1,{flexDirection:"column",children:[e(H0,{children:[e(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),e(H0,{bold:!0,color:"cyan",children:lQ(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:v?.name??N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v&&e(P5,{children:[e(H0,{children:[e(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),e(H0,{children:N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),e(H0,{children:v.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:v.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:N.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.overrides?.baseUrl&&e(H0,{children:[e(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:N.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),e(H0,{children:V1().resolveConfig(N).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):e(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F&&e(B1,{marginTop:1,children:e(H0,{color:"red",children:F},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(B1,{justifyContent:"center",marginTop:1,children:e(H0,{dimColor:!0,children:"─".repeat(O)},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(B1,{justifyContent:"center",children:e(H0,{dimColor:!0,children:"提示:D=删除 * E=编辑 * Up/Down=移动 * Enter/ESC=确认"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as dQ}from"ahooks";import{Box as u5,Text as rQ,useInput as l5}from"ink";import{useState as y$}from"react";import{Box as P$,Text as x1,useInput as R5}from"ink";import y5 from"ink-text-input";import{jsxDEV as o0}from"react/jsx-dev-runtime";var o9=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return R5((G,q)=>{if(q.escape)Z()}),o0(P$,{flexDirection:"column",children:[o0(P$,{marginBottom:1,children:o0(x1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(x1,{children:["Provider: ",o0(x1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(x1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{children:[o0(x1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),o0(y5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&o0(P$,{marginTop:1,children:o0(x1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginTop:1,children:o0(x1,{dimColor:!0,children:["输入完成后按 ",o0(x1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",o0(x1,{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 Y$,useInput as M5}from"ink";import C5 from"ink-text-input";import{useState as P2}from"react";import{jsxDEV as O1}from"react/jsx-dev-runtime";var R2=["id","name","baseUrl","model"];function n9($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function I5($,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 T5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=s9(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 e9=({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),[q,K]=P2(Q?.model??""),[U,F]=P2(Z),[z,W]=P2(),O=R2[X];M5((_,H)=>{if(!H.escape)return;if(W(void 0),X===0){J();return}let C=X-1,N=R2[C];G(C),K(U[N])});let B=(_)=>{let H=_.trim();if(O==="id"&&!t9.test(H)){W("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(O==="baseUrl")try{let N=new URL(H);if(!["http:","https:"].includes(N.protocol))throw Error()}catch{W("Base URL 必须是绝对 HTTP(S) URL");return}if(O==="model"&&!H){W("Model ID 不能为空");return}let C={...U,[O]:O==="name"&&!H?U.id:H};if(F(C),W(void 0),X===R2.length-1){try{Y(T5(C,$))}catch(N){W(N instanceof Error?N.message:"渠道配置无效")}return}G(X+1),K("")};return O1(A2,{flexDirection:"column",children:[O1(A2,{marginBottom:1,children:O1(Y$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O1(Y$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),R2.slice(0,X).map((_)=>O1(Y$,{children:[n9(_),": ",O1(Y$,{color:"cyan",children:U[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),O1(A2,{marginTop:1,children:[O1(Y$,{bold:!0,children:[n9(O),": "]},void 0,!0,void 0,this),O1(C5,{value:q,onChange:(_)=>{K(_),W(void 0)},onSubmit:B,placeholder:I5(O,$,U.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O==="name"&&O1(Y$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),z&&O1(Y$,{color:"red",children:z},void 0,!1,void 0,this),O1(A2,{marginTop:1,children:O1(Y$,{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 JJ,useState as i$}from"react";var YJ=()=>{let[$,Q]=i$([]),[Y,J]=i$(!0),[Z,X]=i$(null);return JJ(()=>{(async()=>{try{Q(await $J())}catch(q){X(q instanceof Error?q.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},ZJ=($)=>{let[Q,Y]=i$([]),[J,Z]=i$(!1),[X,G]=i$(null);return JJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),G(null);try{Y(await QJ($))}catch(K){G(K instanceof Error?K.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as u1,Text as M1,useInput as f5}from"ink";import k5 from"ink-select-input";import v5 from"ink-text-input";import{useMemo as XJ,useState as S5}from"react";import{jsxDEV as h0,Fragment as h5}from"react/jsx-dev-runtime";var D5=({isSelected:$})=>h0(u1,{marginRight:1,children:h0(M1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),V5=($)=>{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(" ")},j5=({isSelected:$,label:Q})=>h0(M1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),GJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[G,q]=S5("");f5((F,z)=>{if(z.escape)if(G)q("");else X()});let K=XJ(()=>{if(!G)return Q;let F=G.toLowerCase();return Q.filter((z)=>z.name.toLowerCase().includes(F)||z.id.toLowerCase().includes(F))},[Q,G]),U=XJ(()=>K.map((F)=>({key:F.id,label:V5(F),value:F})),[K]);if(Y)return h0(u1,{flexDirection:"column",children:h0(M1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return h0(u1,{flexDirection:"column",children:[h0(M1,{color:"red",children:J},void 0,!1,void 0,this),h0(M1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return h0(u1,{flexDirection:"column",children:[h0(u1,{marginBottom:1,children:h0(M1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(u1,{marginBottom:1,children:h0(M1,{children:["Provider: ",h0(M1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),h0(h5,{children:[h0(u1,{marginBottom:1,children:[h0(M1,{color:"cyan",children:"> "},void 0,!1,void 0,this),h0(v5,{value:G,onChange:q,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h0(u1,{marginBottom:1,children:h0(M1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(u1,{flexDirection:"column",height:12,children:h0(k5,{items:U,onSelect:(F)=>Z(F.value),indicatorComponent:D5,itemComponent:j5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&h0(M1,{color:"yellow",children:"内置 catalog 中没有匹配模型"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as R$,Text as Z$,useInput as E5}from"ink";import g5 from"ink-select-input";import m5 from"ink-text-input";import{useMemo as KJ,useState as p5}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var c5=({isSelected:$})=>n0(R$,{marginRight:1,children:n0(Z$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),x5=({isSelected:$,label:Q})=>n0(Z$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),qJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,G]=p5("");E5((U,F)=>{if(F.escape)if(X)G("");else Z()});let q=KJ(()=>{if(!X)return $;let U=X.toLowerCase();return $.filter((F)=>F.name.toLowerCase().includes(U)||F.id.toLowerCase().includes(U))},[$,X]),K=KJ(()=>q.map((U)=>({key:U.id,label:`${U.name} - ${U.modelCount} models${U.configured?" [configured]":""}`,value:U})),[q]);if(Q)return n0(R$,{flexDirection:"column",children:n0(Z$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(R$,{flexDirection:"column",children:[n0(Z$,{color:"red",children:Y},void 0,!1,void 0,this),n0(Z$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(R$,{flexDirection:"column",children:[n0(R$,{marginBottom:1,children:n0(Z$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(R$,{marginBottom:1,children:[n0(Z$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(m5,{value:X,onChange:G,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(R$,{flexDirection:"column",height:12,children:n0(g5,{items:K,onSelect:(U)=>J(U.value),indicatorComponent:c5,itemComponent:x5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.length===0&&n0(Z$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function UJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as X$}from"react/jsx-dev-runtime";var aQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,G]=y$("provider"),[q,K]=y$(),[U,F]=y$(),[z,W]=y$(),[O,B]=y$(""),[_,H]=y$(),[C,N]=y$(!1),v=YJ(),M=ZJ(q?.id),w=v0(!1);l5((T,y)=>{if(y.ctrl&&T==="c"||y.meta&&T==="c")$==="setup"?w():Z()});let f=dQ(async(T)=>{if(!q)return;let y=z??(U?{provider:q.id,model:U.id,displayName:Q?.displayName}:void 0);if(!y)return;N(!0),H(void 0);try{if(y.modelProvider)V1().registerModelProvider(y.provider,y.modelProvider,[y.model]);if(T?.trim())await V1().setApiKey(y.provider,T.trim());let L={displayName:y.displayName,provider:y.provider,model:y.model,overrides:y.overrides};if($==="setup")await J(y);else if($==="add"){let k=y.modelProvider?await g0().addModelWithProvider(L,y.modelProvider):await g0().addModel(L);await g0().setCurrentModel(k.id),await J(y)}else if(Y){if(y.modelProvider)await g0().updateModelWithProvider(Y,L,y.modelProvider);else await g0().updateModel(Y,L);await J(y)}}catch(L){if(y.modelProvider){await V1().credentials.delete(y.provider);let k=b2();V1().configureModelProviders(k?.modelProviders??{},k?.models??[])}H(L instanceof Error?L.message:"保存配置失败"),N(!1)}}),P=dQ((T)=>{if(F(T),q?.configured)f();else if(q?.supportsApiKey)G("credential");else H(`${q?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),A=dQ(()=>{if(H(void 0),X==="credential"&&z){G("custom");return}let T=UJ(X);if(T)G(T)});return X$(u5,{flexDirection:"column",padding:1,children:[X$(rQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&X$(qJ,{...v,onSelect:(T)=>{K(T),F(void 0),W(void 0),G(T.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&q?.factoryWireApi&&X$(e9,{wireApi:q.factoryWireApi,initialConfig:z,onSubmit:(T)=>{W(T),G("credential")},onCancel:A},void 0,!1,void 0,this),X==="model"&&q&&X$(GJ,{provider:q,...M,onSelect:P,onCancel:A},void 0,!1,void 0,this),X==="credential"&&q&&X$(o9,{provider:q,value:O,onChange:B,onSubmit:()=>void f(O),onCancel:A,error:_},void 0,!1,void 0,this),C&&X$(rQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&X$(rQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as F8}from"ahooks";import{promises as NJ}from"fs";import{Box as _1,Text as V0,useInput as d5}from"ink";import zJ from"ink-select-input";import r5 from"ink-text-input";import a5 from"os";import y2 from"path";import{useEffect as i5,useMemo as M2,useRef as o5,useState as G$}from"react";import{jsxDEV as U0}from"react/jsx-dev-runtime";var H8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],n5={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},t5={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},OJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},s5=["project","global","local"],e5={allow:[],ask:[],deny:[]},$X={localExists:!1,projectExists:!1,globalExists:!1},_J={allow:[],ask:[],deny:[]};function QX($){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 JX($){try{let Q=await NJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:QX(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{..._J}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{..._J}}}}function YX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${OJ[Q]} <- 可删除`:OJ[Q];return`${Y} ${J}`}var FJ=({onClose:$})=>{let Y=$1()==="permissions-manager",J=v0(!1),[Z,X]=G$(0),G=H8[Z].key,[q,K]=G$(e5),[U,F]=G$($X),[z,W]=G$(!0),[O,B]=G$("list"),[_,H]=G$(""),[C,N]=G$(null),[v,M]=G$(null),w=o5(!1),f=M2(()=>y2.join(x0(),".blade","settings.local.json"),[]),P=M2(()=>y2.join(x0(),".blade","settings.json"),[]),A=M2(()=>y2.join(a5.homedir(),".blade","settings.json"),[]),T=F8(async()=>{W(!0);let x=await Promise.all([{source:"local",path:f},{source:"project",path:P},{source:"global",path:A}].map(async({source:Z0,path:R0})=>{let B0=await JX(R0);return{source:Z0,path:R0,...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};F(V);let l={allow:[],ask:[],deny:[]},K0=Object.fromEntries(x.map((Z0)=>[Z0.source,Z0]));["allow","ask","deny"].forEach((Z0)=>{s5.forEach((R0)=>{(K0[R0]?.permissions[Z0]??[]).forEach((s0,p0)=>{let F1={key:`${R0}:${p0}:${s0}`,rule:s0,source:R0};l[Z0].push(F1)})})}),K(l),W(!1)});i5(()=>{T()},[T]);let y=F8(async(S,x)=>{try{let V=y2.join(x0(),".blade","settings.local.json"),l={allow:[],ask:[],deny:[]};try{let Z0=await NJ.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 g0().updateConfig({permissions:K0},{scope:"local",immediate:!0}),await T()}catch(V){throw console.error("[PermissionsManager] 修改权限规则失败:",V),V}});d5((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),M(null);return}if(x.escape){if(O==="list"||G==="info")$();else B("list"),H(""),N(null),M(null);return}if(O==="list"){if(x.tab&&x.shift)X((V)=>(V-1+H8.length)%H8.length);else if(x.tab)X((V)=>(V+1)%H8.length);else if(S?.toLowerCase()==="q")$()}},{isActive:Y});let L=F8((S)=>{let x=S.value;if(G==="info")return;if(x.type==="add"){B("add"),H(""),M(null);return}if(x.entry.source!=="local"){B("locked"),w.current=!0,N({tab:G,entry:x.entry}),M({type:"error",text:x.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}B("confirm-delete"),N({tab:G,entry:x.entry}),M(null)}),k=F8(async()=>{if(G==="info")return;let S=_.trim();if(!S){M({type:"error",text:"Permission rule 不能为空"});return}if(q[G].map((V)=>V.rule).includes(S)){M({type:"error",text:"该规则已存在"});return}try{await y(G,(V)=>{let l={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return l[G]=[...new Set([...V[G],S])],l}),B("list"),H(""),M({type:"success",text:"已添加本地权限规则"})}catch(V){M({type:"error",text:`保存失败: ${V instanceof Error?V.message:"未知错误"}`})}}),E=F8(async()=>{if(!C)return;let{tab:S,entry:x}=C;try{await y(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),M({type:"success",text:"已删除本地权限规则"})}catch(V){M({type:"error",text:`删除失败: ${V instanceof Error?V.message:"未知错误"}`})}}),t=M2(()=>{if(G==="info")return[];let S=G;return[{key:"add-new-rule",label:`› ${n5[S]}`,value:{type:"add"}},...q[S].map((V)=>({key:V.key,label:YX(V.rule,V.source),value:{type:"rule",entry:V}}))]},[G,q]),u=()=>U0(_1,{marginBottom:1,children:H8.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:t5[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(r5,{value:_,onChange:H,onSubmit:k},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),R=(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(zJ,{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(zJ,{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"&&C)return R(C.tab,C.entry);if(O==="locked"&&C)return D(C.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),v&&U0(_1,{marginTop:1,children:U0(V0,{color:v.type==="success"?"green":"red",children:v.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 ZX}from"ink";import{useEffect as XX,useState as M$}from"react";import{jsxDEV as p}from"react/jsx-dev-runtime";var iQ=["local","project","global"];function AJ({workspaceRoot:$,onCancel:Q}){let Y=WJ($),J=Y.getAll(),[Z,X]=M$(0),[G,q]=M$(!1),[K,U]=M$(""),[F,z]=M$(null),[W,O]=M$("local"),[B,_]=M$(null),[H,C]=M$(0),N=Y.getBySource(),v=Y.getStats(),M=Y.getSourcePolicy(),w=v0(!1,Q);XX(()=>{let L=!0;return HJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((k)=>{if(L)_(k.settings)}).catch((k)=>{if(L)U(k instanceof Error?k.message:"无法读取插件作用域配置")}),()=>{L=!1}},[Y,H]);let f=()=>{O((L)=>{let k=iQ.indexOf(L);return iQ[(k+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}q(!0),U("");try{let k=await LJ(Y.getWorkspaceRoot(),L.manifest.name,L.status!=="active",W);U(k.effectiveEnabled?`已启用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`:`已禁用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`),C((E)=>E+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}},A=async()=>{if(G)return;q(!0),U("");try{await BJ(Y.getWorkspaceRoot()),X(0),U("插件列表已刷新"),C((L)=>L+1)}catch(L){U(L instanceof Error?L.message:String(L))}finally{q(!1)}},T=async()=>{let L=J[Z];if(!L||G)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}q(!0),z(null),U("");try{let{result:k}=await wJ(Y.getWorkspaceRoot(),L.manifest.name,{trusted:!0});if(!k.success)throw Error(k.error);U(k.changed?`已更新 ${L.manifest.name} 到 ${k.installation?.revision}`:`${L.manifest.name} 已是最新版本`),C((E)=>E+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}},y=async()=>{let L=J[Z];if(!L||G)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(F!==L.manifest.name){z(L.manifest.name),U(`再次按 x 确认卸载 ${L.manifest.name}`);return}q(!0),U("");try{let{result:k}=await bJ(Y.getWorkspaceRoot(),L.manifest.name,!0);if(!k.success)throw Error(k.error);z(null),X(0),U(`已卸载 ${L.manifest.name}`),C((E)=>E+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}};if(ZX((L,k)=>{if(k.escape)Q?.();else if(k.ctrl&&L==="c"||k.meta&&L==="c")w();else if((k.upArrow||L==="k")&&J.length>0)z(null),X((E)=>(E-1+J.length)%J.length);else if((k.downArrow||L==="j")&&J.length>0)z(null),X((E)=>(E+1)%J.length);else if(L===" "||k.return)P();else if(L==="r")A();else if(L==="s")f();else if(L==="u")T();else if(L==="x")y()}),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:[" (共 ",v.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:["启用: ",v.active," | 禁用: ",v.inactive," | 命令: ",v.commands," | 技能:"," ",v.skills," | 代理: ",v.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:["来源策略: ",M.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",M.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:W},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 k=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?"› ":" ",k," ",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 k=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?"› ":" ",k," ",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 k=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?"› ":" ",k," ",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),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 PJ,useStdout as GX}from"ink";import KX from"ink-text-input";import oQ,{useCallback as W8,useMemo as qX,useState as K$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var UX=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)),zX=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)),RJ=oQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=GX(),Z=J.columns||80,G=$1()==="confirmation-prompt",q=v0(!1),[K,U]=K$("answering"),[F,z]=K$(0),[W,O]=K$({}),[B,_]=K$(0),[H,C]=K$([]),[N,v]=K$(!1),[M,w]=K$(""),[f,P]=K$(0),A=$[F],T=qX(()=>{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]),y=W8((u)=>{let a={...W,[A.header]:u};if(O(a),F<$.length-1)z(F+1),_(0),C([]),v(!1),w("");else U("submit"),P(0)},[W,A?.header,F,$.length]),L=W8((u)=>{let a=T[u];if(!a)return;if(a.value==="__other__"){v(!0);return}if(A.multiSelect)C((I)=>I.includes(a.value)?I.filter((R)=>R!==a.value):[...I,a.value]);else y(a.value)},[T,A?.multiSelect,y]),k=W8((u)=>{if(u.trim())y(u.trim())},[y]),E=W8(()=>{U("answering"),z(0),_(0),C([]),v(!1)},[]),t=W8(()=>{Q(W)},[W,Q]);if(PJ((u,a)=>{if(a.ctrl&&u==="c"||a.meta&&u==="c"){q();return}if(N){if(a.escape)v(!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){_((R)=>R>0?R-1:T.length-1);return}if(a.downArrow||a.tab){_((R)=>R<T.length-1?R+1:0);return}if(a.return){if(A.multiSelect&&H.length>0)y(H);else L(B);return}if(u===" "&&A.multiSelect){let R=T[B];if(R&&R.value!=="__other__")C((D)=>D.includes(R.value)?D.filter((b)=>b!==R.value):[...D,R.value]);return}},{isActive:G&&K==="answering"&&!N}),PJ((u,a)=>{if(a.ctrl&&u==="c"||a.meta&&u==="c"){q();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){P((I)=>I===0?1:0);return}if(a.return){if(f===0)t();else E();return}if(u.toLowerCase()==="y"){t();return}if(u.toLowerCase()==="e"){E();return}},{isActive:G&&K==="submit"}),K==="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(zX,{questions:$,answers:W},void 0,!1,void 0,this),W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:f===0?"yellow":void 0,bold:f===0,children:[f===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Z1,{color:f===1?"yellow":void 0,bold:f===1,children:[f===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(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(KX,{value:M,onChange:w,onSubmit:k,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(UX,{option:u,index:a,isSelected:H.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&&H.length>0&&W0(Z1,{color:"green",children:["Selected: ",H.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 ",F+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as OX}from"node:path";import{Box as n$,Text as w1,useInput as _X}from"ink";import NX from"ink-select-input";import{useEffect as nQ,useMemo as o$,useRef as fJ,useState as C2}from"react";function yJ($){return`${$.projectPath}\x00${$.sessionId}`}function MJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function CJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function IJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function TJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as u0}from"react/jsx-dev-runtime";function FX($){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 HX($){return OX($)}function WX($){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 LX=({isSelected:$})=>u0(n$,{marginRight:1,children:u0(w1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),BX=({isSelected:$,label:Q})=>u0(w1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),L8=20,kJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=C2([]),[G,q]=C2(!1),[K,U]=C2(0),[F,z]=C2(!1),W=fJ(!1),O=fJ(!0);nQ(()=>{return O.current=!0,()=>{O.current=!1}},[]);let _=$1()==="session-selector",H=v0(!1);_X((A,T)=>{if(T.ctrl&&A==="c"||T.meta&&A==="c"){H();return}if(W.current)return;if(T.escape&&J){J();return}if(T.leftArrow||A==="h"||A==="H"){if(K>0)U((y)=>y-1);return}if(T.rightArrow||A==="l"||A==="L"){if(K<M-1)U((y)=>y+1);return}},{isActive:_}),nQ(()=>{if(Q){X(Q);return}(async()=>{q(!0);try{let T=await P0.listSessions({includeSubagents:!1});X(T)}catch(T){console.error("[SessionSelector] Failed to load sessions:",T),X([])}finally{q(!1)}})()},[Q]);let C=o$(()=>IJ(Q||Z,$),[$,Q,Z]),N=o$(()=>TJ($),[$]),v=o$(()=>{return C.map((A)=>{let T=HX(A.taskSourceProjectPath??A.projectPath),y=FX(A.lastMessageTime),L=MJ(A),k=`[${WX(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}`:"",R=A.taskStatus==="queued"&&A.taskQueuePosition?` | queue:${A.taskQueuePosition}/${A.taskQueueDepth??A.taskQueuePosition}`:"",D=CJ(A);return{key:yJ(A),label:`${k} ${L} · ${y} | ${T}${E} | ${A.messageCount} 条消息${a}${R}${I}${D}${t}${u}`,value:A}})},[C]),M=o$(()=>Math.max(1,Math.ceil(v.length/L8)),[v.length]),w=o$(()=>{let A=K*L8;return v.slice(A,A+L8)},[v,K]),f=o$(()=>({start:K*L8+1,end:Math.min((K+1)*L8,v.length)}),[K,v.length]);nQ(()=>{U(0)},[C.length]);let P=(A)=>{if(W.current)return;W.current=!0,z(!0);let T=()=>{if(!O.current)return;W.current=!1,z(!1)};Promise.resolve().then(()=>Y(A.value)).then(T,T)};if(G)return u0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:u0(w1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(C.length===0)return u0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[u0(w1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),u0(w1,{dimColor:!0,children:[`
158
158
  `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return u0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[u0(w1,{bold:!0,color:"cyan",children:N.title},void 0,!1,void 0,this),u0(w1,{dimColor:!0,children:[`
159
159
  `,N.instructions,`
160
- `]},void 0,!0,void 0,this),u0(_X,{items:w,onSelect:P,isFocused:_&&!H,indicatorComponent:WX,itemComponent:LX},void 0,!1,void 0,this),H&&u0(w1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),u0(n$,{marginTop:1,flexDirection:"column",children:[u0(w1,{dimColor:!0,children:["第 ",K+1,"/",C," 页 · 共 ",M.length," 个会话 · 显示"," ",f.start,"-",f.end]},void 0,!0,void 0,this),C>1&&u0(n$,{marginTop:1,children:[u0(w1,{color:K>0?"cyan":"gray",children:K>0?"<< 上一页":" "},void 0,!1,void 0,this),u0(w1,{children:" "},void 0,!1,void 0,this),u0(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 m0,Text as T0,useInput as BX}from"ink";import{jsxDEV as $0}from"react/jsx-dev-runtime";function vJ({onCancel:$}){let Q=I1(),J=kJ({cwd:Q}).getAll(),Z=J.filter((K)=>K.source==="builtin"),X=J.filter((K)=>K.source==="user"),G=J.filter((K)=>K.source==="project"),q=v0(!1,$);if(BX((K,U)=>{if(U.escape)$?.();else if(U.ctrl&&K==="c"||U.meta&&K==="c")q()}),J.length===0)return $0(m0,{flexDirection:"column",paddingY:1,children:[$0(m0,{marginBottom:1,children:$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{marginTop:1,paddingLeft:2,children:$0(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $0(m0,{flexDirection:"column",paddingY:1,children:[$0(m0,{marginBottom:1,children:[$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(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&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(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&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&$0(m0,{paddingLeft:2,children:$0(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),$0(m0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as SJ,Text as l1}from"ink";import wX,{useEffect as bX,useMemo as AX,useState as DJ}from"react";import{jsxDEV as N1,Fragment as jJ}from"react/jsx-dev-runtime";var VJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function PX($){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 hJ=wX.memo(()=>{let $=s((U)=>U.app.subagentProgresses),Q=s((U)=>U.app.subagentProgress),Y=A0(),[J,Z]=DJ(0),[X,G]=DJ(()=>Date.now()),q=AX(()=>{let U=Object.values($);return U.length>0?U:Q?[Q]:[]},[Q,$]),K=q.some((U)=>U.status==="running");if(bX(()=>{if(!K){Z(0);return}let U=setInterval(()=>{Z((z)=>(z+1)%VJ.length)},80),H=setInterval(()=>{G(Date.now())},1000);return()=>{clearInterval(U),clearInterval(H)}},[K]),q.length===0)return null;return N1(SJ,{paddingX:2,paddingY:0,flexDirection:"column",children:q.map((U)=>{let H=U.status==="running"?VJ[J]:U.status==="completed"?"[OK]":"[X]",z=U.status==="running"?Y.colors.info:U.status==="completed"?Y.colors.success:Y.colors.error,W=Math.max(0,X-U.startTime);return N1(SJ,{flexDirection:"row",gap:1,children:[N1(l1,{color:z,bold:!0,children:H},void 0,!1,void 0,this),N1(l1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.text.primary,bold:!0,children:U.type},void 0,!1,void 0,this),N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.text.secondary,children:U.description},void 0,!1,void 0,this),U.currentTool&&N1(jJ,{children:[N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.warning,children:U.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="running"&&W>0&&N1(jJ,{children:[N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.info,children:PX(W)},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 yX}from"ahooks";import{Box as v1,Text as d,useInput as RX}from"ink";import MX from"ink-select-input";import{useState as EJ}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var gJ=C$.map(($)=>({label:$.label,value:$.id})),CX=({theme:$})=>{let{colors:Q}=$;return c(v1,{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)},IX=({theme:$})=>{let{colors:Q}=$;return c(v1,{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)},mJ=()=>{let $=i1(),Q=d0.getCurrentThemeName(),Y=C$.findIndex((B)=>B.label===Q),J=Y>=0?C$[Y].theme:C$[0].theme,[Z,X]=EJ(J),[G,q]=EJ(!1),K=yX(async(B)=>{if(G)return;q(!0);try{await g0().setTheme(B.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{q(!1)}}),U=(B)=>{let _=C$.find((F)=>F.id===B.value);if(_)X(_.theme)},z=$1()==="theme-selector",W=v0(!1);RX((B,_)=>{if(_.ctrl&&B==="c"||_.meta&&B==="c"){W();return}if(_.escape&&!G)$.closeModal()},{isActive:z});let O=(B)=>{let{isSelected:_,label:F}=B,N=F===Q?"[OK]":" ";return c(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[N," ",F]},void 0,!0,void 0,this)};return c(v1,{flexDirection:"column",height:"100%",children:[c(v1,{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(v1,{flexDirection:"row",flexGrow:1,children:[c(v1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:c(v1,{flexDirection:"column",children:[c(v1,{paddingTop:1,paddingBottom:1,children:c(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",gJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(MX,{items:gJ,initialIndex:Y>=0?Y:0,onSelect:K,onHighlight:U,itemComponent:O},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(v1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[c(CX,{theme:Z},void 0,!1,void 0,this),c(IX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(v1,{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 M0}from"react/jsx-dev-runtime";var q1=n1("UI"),xJ=({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),q=G4(),K=K4(),U=P8(),H=z4(),z=U4(),W=i1(),O=a1(),B=v$(),_=I1(),F=H4(),M=S$(),N=o1(),v=F4();U$(()=>{if(d0.getCurrentThemeName()!==v)try{d0.setTheme(v)}catch{}},[v]);let C=q==="ready",w=q==="needsSetup",f=q==="idle",P=TX(()=>Y.agents?cJ(Y.agents):void 0,[Y.agents]),{confirmationState:A,confirmationHandler:T,handleResponse:R,dismissAll:L}=o4(),{executeCommand:k,handleAbort:E,cleanupAgent:t}=d4(Y.systemPrompt,Y.appendSystemPrompt,T,Y.maxTurns,L,P),{getPreviousCommand:u,getNextCommand:a,addToHistory:I}=a4();O6();let y=t4("",0),D=t0(async()=>{let r=M,X0;if(r==="default")X0="autoEdit";else if(r==="autoEdit")X0="plan";else if(r==="plan")X0="default";else X0="default";try{await P0.setSessionPermissionMode(B,_,X0),await g0().setPermissionMode(X0)}catch(k0){q1.error("权限模式切换失败:",k0 instanceof Error?k0.message:k0)}}),b=t0(async(r)=>{try{let X0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await g0().addModelWithProvider(X0,r.modelProvider);else await g0().addModel(X0);W.setInitializationStatus("ready")}catch(X0){throw q1.error("初始化配置保存失败:",X0 instanceof Error?X0.message:X0),X0}}),h=t0(()=>{if(U==="shortcuts")W.closeModal();else W.setActiveModal("shortcuts")}),S=t0(async(r,X0,k0)=>{return g8({intent:X0,session:r,newSessionId:k0?.newSessionId,announceFork:k0?.announceFork,permissionModeOverride:Y.permissionMode},_,O,t)}),x=t0(async(r,X0)=>{let D1=(await E8(X0,_)).filter((E0)=>E0.sessionId===r);if(D1.length===0)throw Error(`Session not found: ${r}`);if(D1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return D1[0]}),{showSuggestions:V,suggestions:l,selectedSuggestionIndex:K0}=z6(y,k,u,a,I,E,N,D,h,U==="shortcuts");U$(()=>{if(y.value&&U==="shortcuts")W.closeModal()},[y.value,U,W]);let Z0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",X0=await E8(r,_);if(X0.length===0){if(Y.forkSession){q1.error("没有可供 fork 的历史会话"),T1(1);return}O.addAssistantMessage("没有找到历史会话,开始新对话。");return}let k0=X0[0];await S(k0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(q1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){T1(1);return}O.addAssistantMessage("继续会话失败,开始新对话。")}}),y0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let k0=Y.forkSession?"fork":"resume",e$=await x(Y.resume,k0);await S(e$,k0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",X0=await E8(r,_);if(X0.length===0)q1.error("没有找到历史会话"),T1(1);W.showSessionSelector(X0,r)}catch(r){q1.error("[BladeInterface] 加载会话失败:",r),T1(1)}});U$(()=>{if(J.current)return;if(Q){J.current=!0,Z0();return}if(Y.resume)J.current=!0,y0()},[Q,Y.resume,Z0,y0]);let B0=t0(async(r)=>{let X0=A.details?.type;if(X0==="enterPlanMode"&&r.approved)try{await P0.setSessionPermissionMode(B,_,"plan"),await g0().setPermissionMode("plan"),q1.debug("[BladeInterface] Entered Plan mode")}catch(k0){q1.error("[BladeInterface] Failed to enter Plan mode:",k0)}if(X0==="exitPlanMode"&&r.approved)q1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");R(r)}),s0=t0(()=>{O.addAssistantMessage("设置已取消"),O.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),O.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),T1(0)}),p0=t0(()=>{W.closeModal()}),F1=t0(async(r)=>{try{await S(r,H?.intent??"resume"),W.closeModal()}catch(X0){q1.error("[BladeInterface] Failed to restore session:",X0),O.addAssistantMessage(`会话操作失败: ${X0 instanceof Error?X0.message:"未知错误"}`),W.closeModal()}}),C1=t0(()=>{if(Y.resume)T1(0);else W.closeModal()}),T$=t0((r)=>{W.showModelEditWizard(r)}),e0=t0((r)=>{O.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),p0()}),S2=t0((r)=>{O.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),p0()});U$(()=>{if(w){F.setFocus("model-config-wizard");return}if(A.isVisible)F.setFocus("confirmation-prompt");else if(U==="sessionSelector")F.setFocus("session-selector");else if(U==="themeSelector")F.setFocus("theme-selector");else if(U==="modelSelector")F.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")F.setFocus("model-config-wizard");else if(U==="permissionsManager")F.setFocus("permissions-manager");else if(U==="agentsManager")F.setFocus("agents-manager");else if(U==="agentCreationWizard")F.setFocus("agent-creation-wizard");else if(U==="hooksManager")F.setFocus("hooks-manager");else if(U==="shortcuts")F.setFocus("main-input");else F.setFocus("main-input")},[w,A.isVisible,U,F.setFocus]),U$(()=>{if(!C||X.current)return;if(pJ().length>0){X.current=!0;return}X.current=!0,O.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[C]),U$(()=>{if(!K)return;if(G.current===K)return;if(G.current=K,q==="error")O.addAssistantMessage(`初始化失败: ${K}`);else O.addAssistantMessage(`${K}`),O.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,q,O.addAssistantMessage]);let O$=t0(async(r)=>{try{await k({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(X0){let k0=X0 instanceof Error?X0.message:"无法发送初始消息";O.addAssistantMessage(`初始消息发送失败:${k0}`)}});U$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!C||w)return;Z.current=!0,I(r),O$(r)},[Y.initialMessage,C,w,k,I]);let D2=t0(async(r)=>{try{await g0().setPermissionMode(r)}catch(X0){q1.error("权限模式初始化失败:",X0 instanceof Error?X0.message:X0)}});if(U$(()=>{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]),f)return null;if(w)return M0(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",f0=z,Q0=U==="modelAddWizard"?"add":U==="modelEditWizard"&&f0?"edit":null,_0=q0||Boolean(Q0),c0=U==="agentsManager",i0=U==="agentCreationWizard",l0=U==="skillsManager",b1=U==="pluginsManager",V2=f0?{displayName:f0.displayName,provider:f0.provider,model:f0.model,overrides:f0.overrides}:void 0,f$=A.isVisible&&A.details?A.details.type==="mcpElicitation"&&A.details.mcpElicitation?M0(k9,{details:A.details.mcpElicitation,onComplete:(r,X0)=>B0({approved:r.action==="accept",elicitation:r,...X0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):A.details.type==="askUserQuestion"&&A.details.questions?M0(PJ,{questions:A.details.questions,onComplete:(r)=>B0({approved:!0,answers:r}),onCancel:()=>B0({approved:!1})},void 0,!1,void 0,this):M0(s6,{details:A.details,onResponse:B0},void 0,!1,void 0,this):U==="themeSelector"?M0(mJ,{},void 0,!1,void 0,this):U==="permissionsManager"?M0(NJ,{onClose:p0},void 0,!1,void 0,this):U==="sessionSelector"?M0(fJ,{intent:H?.intent??"resume",sessions:H?.sessions,onSelect:F1,onCancel:C1},void 0,!1,void 0,this):U==="hooksManager"?M0($9,{workspaceRoot:_,sessionId:B,onClose:p0},void 0,!1,void 0,this):null,w8=Boolean(f$);return M0(q$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[f$,M0(q$,{flexDirection:"column",display:w8?"none":"flex",children:[M0(r9,{},void 0,!1,void 0,this),M0(hJ,{},void 0,!1,void 0,this),M0(C9,{paused:w8},void 0,!1,void 0,this),M0(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),q0&&M0(q$,{marginTop:1,paddingX:2,children:M0(a9,{onClose:p0,onEdit:T$},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0&&M0(q$,{marginTop:1,paddingX:2,children:M0(aQ,{mode:Q0,modelId:f0?.id,initialConfig:Q0==="edit"?V2:void 0,onComplete:Q0==="edit"?S2:e0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),c0&&M0(q$,{marginTop:1,paddingX:2,children:M0(L6,{workspaceRoot:_,onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0&&M0(q$,{marginTop:1,paddingX:2,children:M0(q8,{onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),l0&&M0(q$,{marginTop:1,paddingX:2,children:M0(vJ,{onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),b1&&M0(q$,{marginTop:1,paddingX:2,children:M0(bJ,{workspaceRoot:_,onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(y6,{suggestions:l,selectedIndex:K0,visible:V&&!_0},void 0,!1,void 0,this),M0(P6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as fX,Text as z$}from"ink";import kX from"react";import{jsxDEV as d1}from"react/jsx-dev-runtime";class B8 extends kX.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 d1(fX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[d1(z$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),d1(z$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as I$,Text as r1,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 \`${lJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],rJ=({versionInfo:$,onComplete:Q})=>{let[Y,J]=tQ(0),[Z,X]=tQ(!1),[G,q]=tQ(null);vX((U,H)=>{if(H.ctrl&&U==="c"){G8().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)K(T2[Y].key);else if(U==="1")K("update");else if(U==="2")K("skip");else if(U==="3")K("skip_until_next")});let K=async(U)=>{switch(U){case"update":{X(!0);let H=await dJ();q(H.message),setTimeout(()=>{G8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await uJ($.latestVersion);Q();break}};if(G)return X1(I$,{flexDirection:"column",marginY:1,children:X1(r1,{children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return X1(I$,{flexDirection:"column",marginY:1,children:X1(r1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X1(I$,{flexDirection:"column",marginY:1,children:[X1(r1,{color:"yellow",bold:!0,children:["Update available! ",X1(r1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X1(I$,{marginTop:1,children:X1(r1,{color:"gray",children:["Release notes:"," ",X1(r1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(I$,{flexDirection:"column",marginTop:1,children:T2.map((U,H)=>{let z=H===Y,W=z?"› ":" ",O=`${H+1}. `;return X1(I$,{children:X1(r1,{color:z?"cyan":void 0,children:[W,O,U.label,U.description&&X1(r1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),X1(I$,{marginTop:1,children:X1(r1,{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 f2,Text as t$,useInput as SX}from"ink";import{useState as aJ}from"react";import{jsxDEV as S1}from"react/jsx-dev-runtime";var iJ=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=d0.getTheme(),[Z,X]=aJ(!1),[G,q]=aJ(null);return SX((K,U)=>{if(Z)return;if(U.return||K.toLowerCase()==="t"){X(!0),q(null),Q().catch((H)=>{q(H instanceof Error?H.message:"Failed to trust workspace"),X(!1)});return}if(K.toLowerCase()==="s"||U.escape)X(!0),q(null),Y().catch((H)=>{q(H instanceof Error?H.message:"Failed to continue safely"),X(!1)})}),S1(f2,{flexDirection:"column",paddingX:1,children:[S1(t$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),S1(t$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),S1(f2,{marginTop:1,flexDirection:"column",children:[S1(t$,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((K)=>S1(t$,{children:[" ",K.path," · ",K.effects.length," effect(s)"]},`${K.kind}:${K.path}`,!0,void 0,this))]},void 0,!0,void 0,this),G&&S1(f2,{marginTop:1,children:S1(t$,{color:J.colors.error,children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),S1(f2,{marginTop:1,children:S1(t$,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as DX}from"ink";import{useEffect as VX}from"react";function oJ(){let{stdout:$}=DX();VX(()=>{if(!$.isTTY)return;return $.write(Y9),$.write(fQ),()=>{$.write(Z9),$.write(fQ)}},[$])}function nJ($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}import{jsxDEV as s$}from"react/jsx-dev-runtime";function hX($){if(Q1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");r0().setInitializationStatus("ready")}var tF=($)=>{oJ();let[Q,Y]=v2(!1),[J,Z]=v2(null),[X,G]=v2(!1),[q,K]=v2(null),U=k2((O,B)=>{let _=O instanceof Error?O.message:String(O);if(r0().setInitializationError(_),r0().setInitializationStatus("error"),Y(!0),B)console.error("[FAIL] 应用初始化失败:",_)}),H=k2(async()=>{try{let O=Q1().config.config??sJ,B=eJ(O,$);if(hX(B),B.resumeSessionId)$Y().restoreSession(B.resumeSessionId,[]);if(B.debug)console.error("[Debug] 运行时配置:",B);let _=B.codeTheme;if(_&&d0.hasTheme(_)){if(d0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{U1.getInstance().loadConfig(B.hooks||{},x0());let M=await QY(x0());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 v=Q1().session.sessionId;tJ(v)}catch(F){if($.debug)console.warn("Hooks 初始化失败:",nJ(F))}c8(async()=>{await YY.getInstance().killAll(),await JY.getInstance().disconnectAll(),U1.getInstance().cleanup()}),Y(!0)}catch(O){U(O,!!$.debug)}}),z=k2(async()=>{let O=await sQ.getInstance().getStatus(x0());if(O.state==="untrusted"||O.state==="error"){K(O);return}await H()}),W=k2(async()=>{if($.versionCheckPromise){let O=await $.versionCheckPromise;if(O){Z(O),G(!0);return}}await z()});if(jX(()=>{W()},[]),X&&J)return s$(B8,{children:s$(rJ,{versionInfo:J,onComplete:()=>{G(!1),z()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(q)return s$(B8,{children:s$(iJ,{status:q,onTrust:async()=>{await sQ.getInstance().trust(x0()),await ZY(),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 s$(B8,{children:s$(xJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{tF as AppWrapper};
160
+ `]},void 0,!0,void 0,this),u0(NX,{items:w,onSelect:P,isFocused:_&&!F,indicatorComponent:LX,itemComponent:BX},void 0,!1,void 0,this),F&&u0(w1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),u0(n$,{marginTop:1,flexDirection:"column",children:[u0(w1,{dimColor:!0,children:["第 ",K+1,"/",M," 页 · 共 ",C.length," 个会话 · 显示"," ",f.start,"-",f.end]},void 0,!0,void 0,this),M>1&&u0(n$,{marginTop:1,children:[u0(w1,{color:K>0?"cyan":"gray",children:K>0?"<< 上一页":" "},void 0,!1,void 0,this),u0(w1,{children:" "},void 0,!1,void 0,this),u0(w1,{color:K<M-1?"cyan":"gray",children:K<M-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 m0,Text as T0,useInput as wX}from"ink";import{jsxDEV as $0}from"react/jsx-dev-runtime";function SJ({onCancel:$}){let Q=I1(),J=vJ({cwd:Q}).getAll(),Z=J.filter((K)=>K.source==="builtin"),X=J.filter((K)=>K.source==="user"),G=J.filter((K)=>K.source==="project"),q=v0(!1,$);if(wX((K,U)=>{if(U.escape)$?.();else if(U.ctrl&&K==="c"||U.meta&&K==="c")q()}),J.length===0)return $0(m0,{flexDirection:"column",paddingY:1,children:[$0(m0,{marginBottom:1,children:$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{marginTop:1,paddingLeft:2,children:$0(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $0(m0,{flexDirection:"column",paddingY:1,children:[$0(m0,{marginBottom:1,children:[$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((K)=>{let F=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(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&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((K)=>{let F=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(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&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((K)=>{let F=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&$0(m0,{paddingLeft:2,children:$0(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),$0(m0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as DJ,Text as l1}from"ink";import bX,{useEffect as AX,useMemo as PX,useState as VJ}from"react";import{jsxDEV as N1,Fragment as hJ}from"react/jsx-dev-runtime";var jJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function RX($){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 EJ=bX.memo(()=>{let $=s((U)=>U.app.subagentProgresses),Q=s((U)=>U.app.subagentProgress),Y=A0(),[J,Z]=VJ(0),[X,G]=VJ(()=>Date.now()),q=PX(()=>{let U=Object.values($);return U.length>0?U:Q?[Q]:[]},[Q,$]),K=q.some((U)=>U.status==="running");if(AX(()=>{if(!K){Z(0);return}let U=setInterval(()=>{Z((z)=>(z+1)%jJ.length)},80),F=setInterval(()=>{G(Date.now())},1000);return()=>{clearInterval(U),clearInterval(F)}},[K]),q.length===0)return null;return N1(DJ,{paddingX:2,paddingY:0,flexDirection:"column",children:q.map((U)=>{let F=U.status==="running"?jJ[J]:U.status==="completed"?"[OK]":"[X]",z=U.status==="running"?Y.colors.info:U.status==="completed"?Y.colors.success:Y.colors.error,W=Math.max(0,X-U.startTime);return N1(DJ,{flexDirection:"row",gap:1,children:[N1(l1,{color:z,bold:!0,children:F},void 0,!1,void 0,this),N1(l1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.text.primary,bold:!0,children:U.type},void 0,!1,void 0,this),N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.text.secondary,children:U.description},void 0,!1,void 0,this),U.currentTool&&N1(hJ,{children:[N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.warning,children:U.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="running"&&W>0&&N1(hJ,{children:[N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.info,children:RX(W)},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 yX}from"ahooks";import{Box as v1,Text as d,useInput as MX}from"ink";import CX from"ink-select-input";import{useState as gJ}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var mJ=C$.map(($)=>({label:$.label,value:$.id})),IX=({theme:$})=>{let{colors:Q}=$;return c(v1,{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)},TX=({theme:$})=>{let{colors:Q}=$;return c(v1,{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)},pJ=()=>{let $=i1(),Q=d0.getCurrentThemeName(),Y=C$.findIndex((B)=>B.label===Q),J=Y>=0?C$[Y].theme:C$[0].theme,[Z,X]=gJ(J),[G,q]=gJ(!1),K=yX(async(B)=>{if(G)return;q(!0);try{await g0().setTheme(B.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{q(!1)}}),U=(B)=>{let _=C$.find((H)=>H.id===B.value);if(_)X(_.theme)},z=$1()==="theme-selector",W=v0(!1);MX((B,_)=>{if(_.ctrl&&B==="c"||_.meta&&B==="c"){W();return}if(_.escape&&!G)$.closeModal()},{isActive:z});let O=(B)=>{let{isSelected:_,label:H}=B,N=H===Q?"[OK]":" ";return c(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[N," ",H]},void 0,!0,void 0,this)};return c(v1,{flexDirection:"column",height:"100%",children:[c(v1,{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(v1,{flexDirection:"row",flexGrow:1,children:[c(v1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:c(v1,{flexDirection:"column",children:[c(v1,{paddingTop:1,paddingBottom:1,children:c(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",mJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(CX,{items:mJ,initialIndex:Y>=0?Y:0,onSelect:K,onHighlight:U,itemComponent:O},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(v1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[c(IX,{theme:Z},void 0,!1,void 0,this),c(TX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(v1,{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 M0}from"react/jsx-dev-runtime";var q1=n1("UI"),uJ=({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),q=K4(),K=q4(),U=P8(),F=O4(),z=z4(),W=i1(),O=a1(),B=v$(),_=I1(),H=W4(),C=S$(),N=o1(),v=H4();U$(()=>{if(d0.getCurrentThemeName()!==v)try{d0.setTheme(v)}catch{}},[v]);let M=q==="ready",w=q==="needsSetup",f=q==="idle",P=fX(()=>Y.agents?xJ(Y.agents):void 0,[Y.agents]),{confirmationState:A,confirmationHandler:T,handleResponse:y,dismissAll:L}=n4(),{executeCommand:k,handleAbort:E,cleanupAgent:t}=r4(Y.systemPrompt,Y.appendSystemPrompt,T,Y.maxTurns,L,P),{getPreviousCommand:u,getNextCommand:a,addToHistory:I}=i4();_6();let R=s4("",0),D=t0(async()=>{let r=C,X0;if(r==="default")X0="autoEdit";else if(r==="autoEdit")X0="plan";else if(r==="plan")X0="default";else X0="default";try{await P0.setSessionPermissionMode(B,_,X0),await g0().setPermissionMode(X0)}catch(k0){q1.error("权限模式切换失败:",k0 instanceof Error?k0.message:k0)}}),b=t0(async(r)=>{try{let X0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await g0().addModelWithProvider(X0,r.modelProvider);else await g0().addModel(X0);W.setInitializationStatus("ready")}catch(X0){throw q1.error("初始化配置保存失败:",X0 instanceof Error?X0.message:X0),X0}}),h=t0(()=>{if(U==="shortcuts")W.closeModal();else W.setActiveModal("shortcuts")}),S=t0(async(r,X0,k0)=>{return g8({intent:X0,session:r,newSessionId:k0?.newSessionId,announceFork:k0?.announceFork,permissionModeOverride:Y.permissionMode},_,O,t)}),x=t0(async(r,X0)=>{let D1=(await E8(X0,_)).filter((E0)=>E0.sessionId===r);if(D1.length===0)throw Error(`Session not found: ${r}`);if(D1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return D1[0]}),{showSuggestions:V,suggestions:l,selectedSuggestionIndex:K0}=O6(R,k,u,a,I,E,N,D,h,U==="shortcuts");U$(()=>{if(R.value&&U==="shortcuts")W.closeModal()},[R.value,U,W]);let Z0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",X0=await E8(r,_);if(X0.length===0){if(Y.forkSession){q1.error("没有可供 fork 的历史会话"),T1(1);return}O.addAssistantMessage("没有找到历史会话,开始新对话。");return}let k0=X0[0];await S(k0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(q1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){T1(1);return}O.addAssistantMessage("继续会话失败,开始新对话。")}}),R0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let k0=Y.forkSession?"fork":"resume",e$=await x(Y.resume,k0);await S(e$,k0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",X0=await E8(r,_);if(X0.length===0)q1.error("没有找到历史会话"),T1(1);W.showSessionSelector(X0,r)}catch(r){q1.error("[BladeInterface] 加载会话失败:",r),T1(1)}});U$(()=>{if(J.current)return;if(Q){J.current=!0,Z0();return}if(Y.resume)J.current=!0,R0()},[Q,Y.resume,Z0,R0]);let B0=t0(async(r)=>{let X0=A.details?.type;if(X0==="enterPlanMode"&&r.approved)try{await P0.setSessionPermissionMode(B,_,"plan"),await g0().setPermissionMode("plan"),q1.debug("[BladeInterface] Entered Plan mode")}catch(k0){q1.error("[BladeInterface] Failed to enter Plan mode:",k0)}if(X0==="exitPlanMode"&&r.approved)q1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");y(r)}),s0=t0(()=>{O.addAssistantMessage("设置已取消"),O.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),O.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),T1(0)}),p0=t0(()=>{W.closeModal()}),F1=t0(async(r)=>{try{await S(r,F?.intent??"resume"),W.closeModal()}catch(X0){q1.error("[BladeInterface] Failed to restore session:",X0),O.addAssistantMessage(`会话操作失败: ${X0 instanceof Error?X0.message:"未知错误"}`),W.closeModal()}}),C1=t0(()=>{if(Y.resume)T1(0);else W.closeModal()}),T$=t0((r)=>{W.showModelEditWizard(r)}),e0=t0((r)=>{O.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),p0()}),S2=t0((r)=>{O.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),p0()});U$(()=>{if(w){H.setFocus("model-config-wizard");return}if(A.isVisible)H.setFocus("confirmation-prompt");else if(U==="sessionSelector")H.setFocus("session-selector");else if(U==="themeSelector")H.setFocus("theme-selector");else if(U==="modelSelector")H.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")H.setFocus("model-config-wizard");else if(U==="permissionsManager")H.setFocus("permissions-manager");else if(U==="agentsManager")H.setFocus("agents-manager");else if(U==="agentCreationWizard")H.setFocus("agent-creation-wizard");else if(U==="hooksManager")H.setFocus("hooks-manager");else if(U==="shortcuts")H.setFocus("main-input");else H.setFocus("main-input")},[w,A.isVisible,U,H.setFocus]),U$(()=>{if(!M||X.current)return;if(cJ().length>0){X.current=!0;return}X.current=!0,O.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[M]),U$(()=>{if(!K)return;if(G.current===K)return;if(G.current=K,q==="error")O.addAssistantMessage(`初始化失败: ${K}`);else O.addAssistantMessage(`${K}`),O.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,q,O.addAssistantMessage]);let O$=t0(async(r)=>{try{await k({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(X0){let k0=X0 instanceof Error?X0.message:"无法发送初始消息";O.addAssistantMessage(`初始消息发送失败:${k0}`)}});U$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!M||w)return;Z.current=!0,I(r),O$(r)},[Y.initialMessage,M,w,k,I]);let D2=t0(async(r)=>{try{await g0().setPermissionMode(r)}catch(X0){q1.error("权限模式初始化失败:",X0 instanceof Error?X0.message:X0)}});if(U$(()=>{let r=Y.permissionMode;if($)q1.debug("[Debug] permissionMode from CLI:",r),q1.debug("[Debug] current permissionMode:",C);if(!r||r===C)return;D2(r)},[Y.permissionMode,C]),f)return null;if(w)return M0(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",f0=z,Q0=U==="modelAddWizard"?"add":U==="modelEditWizard"&&f0?"edit":null,_0=q0||Boolean(Q0),c0=U==="agentsManager",i0=U==="agentCreationWizard",l0=U==="skillsManager",b1=U==="pluginsManager",V2=f0?{displayName:f0.displayName,provider:f0.provider,model:f0.model,overrides:f0.overrides}:void 0,f$=A.isVisible&&A.details?A.details.type==="mcpElicitation"&&A.details.mcpElicitation?M0(v9,{details:A.details.mcpElicitation,onComplete:(r,X0)=>B0({approved:r.action==="accept",elicitation:r,...X0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):A.details.type==="askUserQuestion"&&A.details.questions?M0(RJ,{questions:A.details.questions,onComplete:(r)=>B0({approved:!0,answers:r}),onCancel:()=>B0({approved:!1})},void 0,!1,void 0,this):M0(e6,{details:A.details,onResponse:B0},void 0,!1,void 0,this):U==="themeSelector"?M0(pJ,{},void 0,!1,void 0,this):U==="permissionsManager"?M0(FJ,{onClose:p0},void 0,!1,void 0,this):U==="sessionSelector"?M0(kJ,{intent:F?.intent??"resume",sessions:F?.sessions,onSelect:F1,onCancel:C1},void 0,!1,void 0,this):U==="hooksManager"?M0(Q9,{workspaceRoot:_,sessionId:B,onClose:p0},void 0,!1,void 0,this):null,w8=Boolean(f$);return M0(q$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[f$,M0(q$,{flexDirection:"column",display:w8?"none":"flex",children:[M0(a9,{},void 0,!1,void 0,this),M0(EJ,{},void 0,!1,void 0,this),M0(I9,{paused:w8},void 0,!1,void 0,this),M0(b9,{input:R.value,cursorPosition:R.cursorPosition,onChange:R.setValue,onChangeCursorPosition:R.setCursorPosition,onAddPasteMapping:R.addPasteMapping,onAddImagePasteMapping:R.addImagePasteMapping},void 0,!1,void 0,this),q0&&M0(q$,{marginTop:1,paddingX:2,children:M0(i9,{onClose:p0,onEdit:T$},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0&&M0(q$,{marginTop:1,paddingX:2,children:M0(aQ,{mode:Q0,modelId:f0?.id,initialConfig:Q0==="edit"?V2:void 0,onComplete:Q0==="edit"?S2:e0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),c0&&M0(q$,{marginTop:1,paddingX:2,children:M0(B6,{workspaceRoot:_,onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0&&M0(q$,{marginTop:1,paddingX:2,children:M0(q8,{onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),l0&&M0(q$,{marginTop:1,paddingX:2,children:M0(SJ,{onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),b1&&M0(q$,{marginTop:1,paddingX:2,children:M0(AJ,{workspaceRoot:_,onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(y6,{suggestions:l,selectedIndex:K0,visible:V&&!_0},void 0,!1,void 0,this),M0(R6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as kX,Text as z$}from"ink";import vX from"react";import{jsxDEV as d1}from"react/jsx-dev-runtime";class B8 extends vX.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 d1(kX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[d1(z$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),d1(z$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as I$,Text as r1,useInput as SX}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 \`${dJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],aJ=({versionInfo:$,onComplete:Q})=>{let[Y,J]=tQ(0),[Z,X]=tQ(!1),[G,q]=tQ(null);SX((U,F)=>{if(F.ctrl&&U==="c"){G8().shutdown("SIGINT",0);return}if(Z||G)return;if(F.upArrow||U==="k")J((z)=>z>0?z-1:T2.length-1);else if(F.downArrow||U==="j")J((z)=>z<T2.length-1?z+1:0);else if(F.return)K(T2[Y].key);else if(U==="1")K("update");else if(U==="2")K("skip");else if(U==="3")K("skip_until_next")});let K=async(U)=>{switch(U){case"update":{X(!0);let F=await rJ();q(F.message),setTimeout(()=>{G8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await lJ($.latestVersion);Q();break}};if(G)return X1(I$,{flexDirection:"column",marginY:1,children:X1(r1,{children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return X1(I$,{flexDirection:"column",marginY:1,children:X1(r1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X1(I$,{flexDirection:"column",marginY:1,children:[X1(r1,{color:"yellow",bold:!0,children:["Update available! ",X1(r1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X1(I$,{marginTop:1,children:X1(r1,{color:"gray",children:["Release notes:"," ",X1(r1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(I$,{flexDirection:"column",marginTop:1,children:T2.map((U,F)=>{let z=F===Y,W=z?"› ":" ",O=`${F+1}. `;return X1(I$,{children:X1(r1,{color:z?"cyan":void 0,children:[W,O,U.label,U.description&&X1(r1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),X1(I$,{marginTop:1,children:X1(r1,{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 f2,Text as t$,useInput as DX}from"ink";import{useState as iJ}from"react";import{jsxDEV as S1}from"react/jsx-dev-runtime";var oJ=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=d0.getTheme(),[Z,X]=iJ(!1),[G,q]=iJ(null);return DX((K,U)=>{if(Z)return;if(U.return||K.toLowerCase()==="t"){X(!0),q(null),Q().catch((F)=>{q(F instanceof Error?F.message:"Failed to trust workspace"),X(!1)});return}if(K.toLowerCase()==="s"||U.escape)X(!0),q(null),Y().catch((F)=>{q(F instanceof Error?F.message:"Failed to continue safely"),X(!1)})}),S1(f2,{flexDirection:"column",paddingX:1,children:[S1(t$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),S1(t$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),S1(f2,{marginTop:1,flexDirection:"column",children:[S1(t$,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((K)=>S1(t$,{children:[" ",K.path," · ",K.effects.length," effect(s)"]},`${K.kind}:${K.path}`,!0,void 0,this))]},void 0,!0,void 0,this),G&&S1(f2,{marginTop:1,children:S1(t$,{color:J.colors.error,children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),S1(f2,{marginTop:1,children:S1(t$,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as VX}from"ink";import{useEffect as jX}from"react";function nJ(){let{stdout:$}=VX();jX(()=>{if(!$.isTTY)return;return $.write(Z9),$.write(fQ),()=>{$.write(X9),$.write(fQ)}},[$])}function tJ($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}import{jsxDEV as s$}from"react/jsx-dev-runtime";function EX($){if(Q1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");r0().setInitializationStatus("ready")}var sF=($)=>{nJ();let[Q,Y]=v2(!1),[J,Z]=v2(null),[X,G]=v2(!1),[q,K]=v2(null),U=k2((O,B)=>{let _=O instanceof Error?O.message:String(O);if(r0().setInitializationError(_),r0().setInitializationStatus("error"),Y(!0),B)console.error("[FAIL] 应用初始化失败:",_)}),F=k2(async()=>{try{let O=Q1().config.config??eJ,B=$Y(O,$);if(EX(B),B.resumeSessionId)QY().restoreSession(B.resumeSessionId,[]);if(B.debug)console.error("[Debug] 运行时配置:",B);let _=B.codeTheme;if(_&&d0.hasTheme(_)){if(d0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{U1.getInstance().loadConfig(B.hooks||{},x0());let C=await JY(x0());if($.debug&&B.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${C.subagents.getAllNames().length} agents, ${C.skills.size} skills, ${C.commands.getCommandCount()+C.commands.getPluginCommandCount()} commands, ${C.plugins.getAll().length} plugins`);let v=Q1().session.sessionId;sJ(v)}catch(H){if($.debug)console.warn("Hooks 初始化失败:",tJ(H))}c8(async()=>{await ZY.getInstance().killAll(),await YY.getInstance().disconnectAll(),U1.getInstance().cleanup()}),Y(!0)}catch(O){U(O,!!$.debug)}}),z=k2(async()=>{let O=await sQ.getInstance().getStatus(x0());if(O.state==="untrusted"||O.state==="error"){K(O);return}await F()}),W=k2(async()=>{if($.versionCheckPromise){let O=await $.versionCheckPromise;if(O){Z(O),G(!0);return}}await z()});if(hX(()=>{W()},[]),X&&J)return s$(B8,{children:s$(aJ,{versionInfo:J,onComplete:()=>{G(!1),z()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(q)return s$(B8,{children:s$(oJ,{status:q,onTrust:async()=>{await sQ.getInstance().trust(x0()),await XY(),K(null),await F()},onContinueSafely:async()=>{K(null),await F()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return s$(B8,{children:s$(uJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{sF as AppWrapper};