blade-code 0.10.101 → 0.10.103

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 (113) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-03qymy9e.js +1 -0
  3. package/dist/{chunk-2191220r.js → chunk-07w0qapm.js} +1 -1
  4. package/dist/{chunk-qjv5kz7q.js → chunk-0aa40zbs.js} +15 -15
  5. package/dist/{chunk-9sx3vsyj.js → chunk-0hr050ck.js} +1 -1
  6. package/dist/chunk-0kdrgmyy.js +1 -0
  7. package/dist/{chunk-8z9d0zd0.js → chunk-14bs89sm.js} +2 -2
  8. package/dist/{chunk-b4d43ap3.js → chunk-181ef74x.js} +1 -1
  9. package/dist/{chunk-c6tq09mt.js → chunk-41cg66y0.js} +1 -1
  10. package/dist/{chunk-p0rvgzpx.js → chunk-41ympwz1.js} +1 -1
  11. package/dist/chunk-42bcht8b.js +169 -0
  12. package/dist/{chunk-39qzk9nm.js → chunk-47e6tdbb.js} +1 -1
  13. package/dist/{chunk-cjgpas7y.js → chunk-4qfke0gd.js} +5 -5
  14. package/dist/chunk-5sk7q6pw.js +1 -0
  15. package/dist/chunk-6v10cs0h.js +1 -0
  16. package/dist/{chunk-4fmtv329.js → chunk-6wsvgk20.js} +1 -1
  17. package/dist/chunk-7ab7jcvn.js +1 -0
  18. package/dist/{chunk-j00px1es.js → chunk-7fz3w4rk.js} +1 -1
  19. package/dist/chunk-8zjn51fr.js +1 -0
  20. package/dist/{chunk-ykkqywtq.js → chunk-946wkbmw.js} +1 -1
  21. package/dist/{chunk-k7vv9vne.js → chunk-9p20hhs0.js} +1 -1
  22. package/dist/{chunk-j22d84s7.js → chunk-a7ejfmtc.js} +1 -1
  23. package/dist/chunk-a8x3xygs.js +1 -0
  24. package/dist/{chunk-dcjh1cj6.js → chunk-aa5zmwd9.js} +3 -3
  25. package/dist/{chunk-0zhdjaen.js → chunk-abd57h72.js} +1 -1
  26. package/dist/{chunk-fqbc1ppx.js → chunk-afa35v3f.js} +1 -1
  27. package/dist/{chunk-2f5kkhan.js → chunk-b0j9v359.js} +407 -403
  28. package/dist/{chunk-qjeadpj2.js → chunk-bt18xsc6.js} +1 -1
  29. package/dist/chunk-bx82y5ce.js +1 -0
  30. package/dist/chunk-c475tfqf.js +2 -0
  31. package/dist/{chunk-9ajkzcqj.js → chunk-c479s9v2.js} +1 -1
  32. package/dist/{chunk-jvxskq6a.js → chunk-cpex23zk.js} +1 -1
  33. package/dist/{chunk-wbf4qcws.js → chunk-e1tt6b1w.js} +2 -2
  34. package/dist/{chunk-czcxx8tb.js → chunk-f3426b1c.js} +1 -1
  35. package/dist/{chunk-z5a8ay9s.js → chunk-f945dzj6.js} +2 -2
  36. package/dist/{chunk-w9xfks7f.js → chunk-fhfzdyba.js} +1 -1
  37. package/dist/{chunk-qcy79mva.js → chunk-fva7jnjy.js} +1 -1
  38. package/dist/chunk-fw2x9p4c.js +6 -0
  39. package/dist/{chunk-8yt4nmyb.js → chunk-gr80w0vh.js} +1 -1
  40. package/dist/{chunk-3c01jje5.js → chunk-gxgq70gm.js} +1 -1
  41. package/dist/{chunk-10taec1j.js → chunk-j2dyprdy.js} +1 -1
  42. package/dist/{chunk-f8z5v101.js → chunk-jaswqpe7.js} +1 -1
  43. package/dist/{chunk-kdatgrjy.js → chunk-k9fveqq6.js} +1 -1
  44. package/dist/chunk-kdjtxpxw.js +1 -0
  45. package/dist/chunk-kf7whgr7.js +2 -0
  46. package/dist/{chunk-tp5bep1y.js → chunk-khtxprbv.js} +1 -1
  47. package/dist/{chunk-ykf4cqpg.js → chunk-mgsvn9v4.js} +4 -4
  48. package/dist/{chunk-d8wzc602.js → chunk-n7mzxa8h.js} +2 -2
  49. package/dist/chunk-nz7kjzc0.js +1 -0
  50. package/dist/{chunk-70hwyc2w.js → chunk-q69fzq4y.js} +1 -1
  51. package/dist/{chunk-z0dmm227.js → chunk-q6eb20fz.js} +1 -1
  52. package/dist/{chunk-3an3vxzt.js → chunk-rahch228.js} +1 -1
  53. package/dist/{chunk-3awjdsef.js → chunk-rchz6j90.js} +1 -1
  54. package/dist/{chunk-2va6ex5v.js → chunk-rvk9r2cm.js} +1 -1
  55. package/dist/{chunk-425p4nwx.js → chunk-s10pmnrd.js} +2 -2
  56. package/dist/{chunk-twhf09qs.js → chunk-s66fwx1p.js} +1 -1
  57. package/dist/chunk-s6vzjear.js +10 -0
  58. package/dist/{chunk-f9asjkfz.js → chunk-sdbbyagy.js} +1 -1
  59. package/dist/{chunk-9hsbjy6a.js → chunk-szxajr6e.js} +1 -1
  60. package/dist/{chunk-q3vza5gt.js → chunk-tgdhsm5t.js} +2 -2
  61. package/dist/chunk-v4w5b2cq.js +1 -0
  62. package/dist/chunk-vk4xbek0.js +1 -0
  63. package/dist/{chunk-53xtssbf.js → chunk-w7hy5wh1.js} +1 -1
  64. package/dist/{chunk-cp7xsjj2.js → chunk-wyhyw9rq.js} +2 -2
  65. package/dist/{chunk-zydvg30x.js → chunk-wzmqkam9.js} +1 -1
  66. package/dist/{chunk-hpjnk87v.js → chunk-x3cxmwnz.js} +1 -1
  67. package/dist/chunk-xm8nyj5z.js +2 -0
  68. package/dist/{chunk-2cg8f38t.js → chunk-xtb84adp.js} +1 -1
  69. package/dist/chunk-yr56ttgw.js +1 -0
  70. package/dist/{chunk-nh4jy5cs.js → chunk-ywarj5j9.js} +1 -1
  71. package/dist/{chunk-rej5bbbs.js → chunk-z9gd9spf.js} +1 -1
  72. package/dist/web/assets/ChatView-_4ut_-Jh.js +58 -0
  73. package/dist/web/assets/{CodeBlockHighlighter-DZcVFtJE.js → CodeBlockHighlighter-DkDr6wE9.js} +1 -1
  74. package/dist/web/assets/{FilePreview-CzNS6kfM.js → FilePreview-DCI-oqhJ.js} +1 -1
  75. package/dist/web/assets/{KanbanBoard-cdh2g0r0.js → KanbanBoard-CB5C4tJC.js} +1 -1
  76. package/dist/web/assets/{MarkdownRenderer-BqBOUlXa.js → MarkdownRenderer-ychfmIQK.js} +3 -3
  77. package/dist/web/assets/{SettingsModal-meSWhCOP.js → SettingsModal-SSdk0Bjr.js} +1 -1
  78. package/dist/web/assets/{TaskSwitcher-CiQi64Yl.js → TaskSwitcher-EnaUhn3o.js} +1 -1
  79. package/dist/web/assets/{TerminalPanel-Bze9t5mz.js → TerminalPanel-BcWxLSV3.js} +1 -1
  80. package/dist/web/assets/{arrow-left-DpTnLOBT.js → arrow-left-Ob5r20g7.js} +1 -1
  81. package/dist/web/assets/{calendar-clock-DlAXXpl_.js → calendar-clock-eOALT8DB.js} +1 -1
  82. package/dist/web/assets/{chevrons-up-down-CmAktdaR.js → chevrons-up-down-BkZBwmbt.js} +1 -1
  83. package/dist/web/assets/{clock-3-_w8nIuEK.js → clock-3-DQp9SzYc.js} +1 -1
  84. package/dist/web/assets/{external-link-AlymrIfc.js → external-link-BuGUowPD.js} +1 -1
  85. package/dist/web/assets/{folder-CrxO-9Rc.js → folder-c92kw1oI.js} +1 -1
  86. package/dist/web/assets/index-CS8jtO_A.js +275 -0
  87. package/dist/web/assets/{pause-GQZaG_P3.js → pause-DP_CXoH7.js} +1 -1
  88. package/dist/web/assets/{play-BPhmPVpi.js → play-DcRwtohz.js} +1 -1
  89. package/dist/web/assets/{session-events-CO2pRY9U.js → session-events-CrAgnaj2.js} +19 -19
  90. package/dist/web/assets/{teamService-BqS4iOx0.js → teamService-JyVbGQhi.js} +1 -1
  91. package/dist/web/index.html +2 -2
  92. package/package.json +1 -1
  93. package/dist/chunk-2r0f3b4t.js +0 -1
  94. package/dist/chunk-as2ezx8p.js +0 -1
  95. package/dist/chunk-bswjne5v.js +0 -1
  96. package/dist/chunk-c663rajb.js +0 -1
  97. package/dist/chunk-fvfc95g3.js +0 -2
  98. package/dist/chunk-hz5rsfxv.js +0 -2
  99. package/dist/chunk-kfcs62nw.js +0 -1
  100. package/dist/chunk-kvdk0pfk.js +0 -1
  101. package/dist/chunk-maebpz1j.js +0 -2
  102. package/dist/chunk-mzab7qak.js +0 -1
  103. package/dist/chunk-n4cw6vt1.js +0 -1
  104. package/dist/chunk-n5jfmzp2.js +0 -1
  105. package/dist/chunk-p7t010gq.js +0 -1
  106. package/dist/chunk-qgjgjzbx.js +0 -10
  107. package/dist/chunk-sa7t9kht.js +0 -6
  108. package/dist/chunk-tazb5tze.js +0 -1
  109. package/dist/chunk-tc9rq0st.js +0 -160
  110. package/dist/chunk-vc7gh3wc.js +0 -1
  111. package/dist/chunk-zjpph3ys.js +0 -1
  112. package/dist/web/assets/ChatView-Cc4bXZ6x.js +0 -58
  113. package/dist/web/assets/index-JJH0FKfo.js +0 -275
@@ -1,160 +0,0 @@
1
- import{e as hJ,f as EJ}from"./chunk-j00px1es.js";import{i as CY,j as IY,k as fY}from"./chunk-f8z5v101.js";import{u as e2}from"./chunk-tp5bep1y.js";import{B as l6,F as cY,H as NQ,I as UQ,J as j6,P as R6,Q as M6,U as B1,W as J6,X as Y6,_ as T6,aa as _2,ba as eJ,ca as $Y,fa as QY,ga as JY,ka as b4,la as Y9,na as $9,oa as Q9,pa as xY,qa as N6,sa as F6,ua as d6}from"./chunk-2f5kkhan.js";import"./chunk-0zhdjaen.js";import{Ca as _J,Da as NJ,Ea as FJ,Ha as pY}from"./chunk-2cg8f38t.js";import{Ja as y6}from"./chunk-hz5rsfxv.js";import{Db as P6,Mb as ZQ,qb as b6,rb as A6}from"./chunk-qjv5kz7q.js";import{Xb as H2}from"./chunk-8hprmrd5.js";import{Bd as K6,Cd as YQ,Dd as G6,Fd as r2,Nd as z2,Qd as T0,ad as W6,pd as $6,ud as Q6}from"./chunk-zydvg30x.js";import"./chunk-s0tq8gyx.js";import"./chunk-hpjnk87v.js";import{te as MY}from"./chunk-10taec1j.js";import{ue as L2,ve as $8,xe as f1}from"./chunk-8yt4nmyb.js";import"./chunk-rej5bbbs.js";import{$e as m0,Be as k$,Ce as a0,De as J$,Ee as gQ,Fe as g$,Ge as a2,He as j9,Ie as Z4,Je as IJ,Ke as h9,Le as V$,Me as l0,Ne as gY,Oe as o0,Pe as RY,Qe as V8,Re as F2,Ue as z6}from"./chunk-z0dmm227.js";import"./chunk-v508x7cg.js";import"./chunk-dg0d3303.js";import"./chunk-3awjdsef.js";import{pf as X4}from"./chunk-53xtssbf.js";import"./chunk-2hb222re.js";import"./chunk-2191220r.js";import{Bf as J8,Ef as WY,Jf as sJ,Sf as mY}from"./chunk-nh4jy5cs.js";import"./chunk-fvfc95g3.js";import"./chunk-qcy79mva.js";import"./chunk-p0rvgzpx.js";import{mg as cQ,og as q1}from"./chunk-dcjh1cj6.js";import"./chunk-c6tq09mt.js";import{qh as hY,vh as tJ,wh as EY}from"./chunk-z5a8ay9s.js";import"./chunk-f9asjkfz.js";import"./chunk-czcxx8tb.js";import{Fh as m$,Gh as o2,Ih as xQ}from"./chunk-maebpz1j.js";import{Nh as d0}from"./chunk-9sx3vsyj.js";import"./chunk-70hwyc2w.js";import{ki as jY,ni as s1}from"./chunk-d8wzc602.js";import{pi as DJ,qi as VJ,ti as E1}from"./chunk-425p4nwx.js";import"./chunk-k7vv9vne.js";import{Fi as yJ}from"./chunk-8z9d0zd0.js";import{Ii as L4}from"./chunk-cp7xsjj2.js";import"./chunk-2va6ex5v.js";import{Ti as JQ}from"./chunk-q3vza5gt.js";import{Vi as pQ}from"./chunk-w9xfks7f.js";import{useMemoizedFn as l8}from"ahooks";import{useEffect as D7,useState as d8}from"react";import{useMemoizedFn as s0}from"ahooks";import{Box as _$}from"ink";import{useEffect as N$,useMemo as T7,useRef as c8}from"react";import{useShallow as dY}from"zustand/react/shallow";import{useStore as lY}from"zustand";function t($){return lY(V$,$)}var rY=[],j$=()=>t(($)=>$.session.sessionId),I1=()=>t(($)=>$.session.workspaceRoot),A4=()=>t(($)=>$.session.messages),P4=()=>t(($)=>$.session.clearCount),y4=()=>t(($)=>$.session.isCompacting),R4=()=>t(($)=>$.session.tokenUsage.estimatedCostUsd),M4=()=>t(($)=>{let{totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}=$.session.tokenUsage;return b4({totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}).hitRate}),T4=()=>t(($)=>$.session.providerCircuit),C4=()=>t(($)=>$.session.providerAdmission),I4=()=>t(($)=>$.session.providerRetry),f4=()=>t(($)=>$.session.providerStall),k4=()=>t(($)=>$.session.actionStationarity),n1=()=>t(($)=>$.session.actions),S4=()=>t(($)=>{let{totalTokens:Q,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Q/Y*100);return Math.round(J)}),v4=()=>t(($)=>$.app.initializationStatus),D4=()=>t(($)=>$.app.initializationError),V2=()=>t(($)=>$.app.activeModal),V4=()=>t(($)=>$.app.tasks),j4=()=>t(($)=>$.app.modelEditorTarget),h4=()=>t(($)=>$.app.sessionSelectorData),E4=()=>t(($)=>$.app.awaitingSecondCtrlC),t1=()=>t(($)=>$.app.actions),j2=()=>t(($)=>$.app.sideConversation),g4=()=>t(($)=>$.app.teams),h2=()=>t(($)=>$.app.initializationStatus==="ready"),m4=()=>t(($)=>$.app.tasks.length>0),h$=()=>t(($)=>$.config.config?.permissionMode||"default"),p4=()=>t(($)=>$.config.config?.models??rY),E2=()=>t(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),g2=()=>t(($)=>$.config.config?.currentModelId),c4=()=>t(($)=>$.config.config?.agentTeamsEnabled===!0),b0=()=>t(($)=>{return a0.getTheme()}),x4=()=>t(($)=>$.config.config?.codeTheme??"default"),e0=()=>t(($)=>$.focus.currentFocus),u4=()=>t(($)=>$.focus.actions),E$=()=>t(($)=>$.command.isProcessing),l4=()=>t(($)=>$.command.actions),m2=()=>t(($)=>$.command.pendingCommands),d4=()=>t(($)=>$.command.recoveredSteeringCount),p2=()=>t(($)=>$.app.reasoningEffort!=="off"),c2=()=>t(($)=>$.app.reasoningEffort),x2=()=>t(($)=>$.app.serviceTier),u2=()=>t(($)=>$.app.responseVerbosity),l2=()=>t(($)=>$.app.communicationStyle),r4=()=>t(($)=>$.session.currentThinkingContent),a4=()=>t(($)=>$.session.thinkingExpanded),o4=()=>t(($)=>$.session.currentStreamingMessageId),i4=()=>t(dY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),n4=()=>t(($)=>$.session.finalizingStreamingMessageId),t4=()=>t(($)=>$.session.historyExpanded),s4=()=>t(($)=>$.session.expandedMessageCount);import{useMemoizedFn as e1}from"ahooks";import{useEffect as c$,useRef as QQ}from"react";function aY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let K=JSON.parse(J.responseBody)?.error?.message;if(K){let U=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${K}${U}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function oY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function iY($){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 d2($){let Q=oY($),Y=iY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=aY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as nY,mkdirSync as tY,writeFileSync as sY}from"node:fs";import eY from"node:os";import i8 from"node:path";var e4=null;function $3(){let $=process.env.BLADE_STORAGE_ROOT||i8.join(eY.homedir(),".blade");return i8.join($,"logs","stream-debug.log")}function Q3($){if(e4===$)return;let Q=i8.dirname($);tY(Q,{recursive:!0,mode:493}),sY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
- `),e4=$}function n8($,Q,Y){try{let J=$3();Q3(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",K=`[${Z}] [${$}] ${Q}${X}
3
- `;nY(J,K)}catch{}}var O2=s1("UI");function s8($,Q){if(Q.state==="requires_attention"){let Y=Q.reason==="interrupted_tool_call";$.addToolMessage("Turn recovery requires attention",{toolName:"Runtime Recovery",phase:"complete",summary:Y?"An interrupted tool may have partially completed":"A completed tool may already have changed external state",detail:`${Q.turnId} · inspect workspace, processes, and external state before retrying`});return}$.addToolMessage(Q.state==="completed"?"Recovered completed turn":"Resuming interrupted turn",{toolName:"Runtime Recovery",phase:"complete",summary:Q.state==="completed"?"The durable final response was recovered":"No tool execution was recorded before interruption",detail:Q.turnId})}function Z6($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,n8("loopEventHandler","onContentDelta",{callCount:Q.contentDeltaCount,deltaLen:J.delta.length,totalLen:Q.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(J.delta);break;case"thinking_delta":if(Y||$.signal.aborted)break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(J.delta);break;case"stream_end":{if($.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),O2.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),n8("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),Y||$.signal.aborted){Y=!0;break}let{extraContent:Z,extraThinking:X}=$.streamingBuffer.drainPendingBuffers(),K=$.getStreamingMessageId();if(K){if(Z)g$(K,Z);a2(K)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"provider_admission":{let{kind:Z,...X}=J;$.sessionActions.setProviderAdmission(J.phase==="queued"?X:null);break}case"provider_circuit":{let{kind:Z,...X}=J;$.sessionActions.setProviderCircuit(J.phase==="closed"?null:X);break}case"provider_retry":{let{kind:Z,...X}=J;$.sessionActions.setProviderRetry(J.phase==="recovered"?null:X);break}case"provider_stall":{let{kind:Z,...X}=J;$.sessionActions.setProviderStall(J.phase==="detected"?X:null);break}case"action_stationarity":{let{kind:Z,...X}=J;$.sessionActions.setActionStationarity(J.phase==="recovered"?null:X);break}case"turn_recovery":{s8($.sessionActions,J.assessment);break}case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===r2)break;if(O2.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:J.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let X=JSON.parse(Z.function.arguments),K=J6(Z.function.name,X);$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:K,params:X})}catch(X){O2.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===r2)break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",K=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:K,...J.update.admission?{admission:J.update.admission}:{}});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===r2)break;O2.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=Q6(Y6(Z.function.name,J.result),$6);$.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":O2.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
4
- `)});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
- `)});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
- `)});break}case"mcp_log":{let Z=J.logger?`${J.serverName} · ${J.logger}`:J.serverName,X=`MCP ${J.level} · ${Z}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Log",phase:"complete",summary:X,detail:[J.message,`revision: ${J.revision}`,`sha256: ${J.dataSha256}`,J.truncated?"truncated: true":"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
7
- `)});break}case"mcp_instructions_changed":{let Z=`MCP instructions ${J.action}: ${J.serverName}`+(J.truncated?" (truncated)":"");$.sessionActions.addToolMessage(Z,{toolName:"MCP Instructions",phase:"complete",summary:Z,detail:[J.text??"",J.sha256?`sha256: ${J.sha256}`:"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
8
- `)});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
- `)});break}case"project_rules_loaded":{let Z=`Project rules loaded: ${J.files.length}`+(J.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Z,{toolName:"Project Rules",phase:"complete",summary:Z,detail:J.files.map((X)=>`${X.relativePath} ${X.source} sha256=${X.contentSha256}`).join(`
10
- `)});break}case"steering_applied":for(let Z=0;Z<J.count;Z++)$.commandActions.dequeueCommand();if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"follow_up_started":for(let Z of J.messages){if(!Z.recovered||Z.persisted)continue;let X=typeof Z.content==="string"?Z.content:Z.content.map((K)=>K.type==="text"?K.text:"[Image]").join(`
11
- `);$.sessionActions.addUserMessage(X)}if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=J}}}}function e8($){let{text:Q,parts:Y}=$,J=Y.filter((K)=>K.type==="image");if(J.length===0)return Q;if(J.length>m$)throw Error(`最多只能发送 ${m$} 张图片`);if(J.reduce((K,U)=>K+`data:${U.mimeType};base64,`.length+U.base64.length,0)>o2)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let K of Y)if(K.type==="text")X.push({type:"text",text:K.text});else X.push({type:"image_url",image_url:{url:`data:${K.mimeType};base64,${K.base64}`}});return X}function X6($){let Q=G6($.metadata);return{role:$.role,content:Q?K6(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function i2($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(X6);let Q=$.messages.slice($.restoredVisibleMessageCount).map(X6);return[...$.restoredContextMessages,...Q]}import J3 from"node:path";function U6($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function Y3($){return J3.resolve($)}function q6($){if(!$||!z6($))return;l0().config.actions.updateConfig({currentModelId:$})}function O6($){if(!$)return;l0().config.actions.updateConfig({permissionMode:$})}async function n2($,Q){return T0.listSessions({includeSubagents:!1})}async function t2($,Q,Y,J){let{intent:Z,session:X,newSessionId:K,announceFork:U,permissionModeOverride:G}=$,q=Y3(X.projectPath);if(Z==="fork"){let z=await T0.forkSession(X.sessionId,{...K?{newSessionId:K}:{},sourceProjectPath:q,targetProjectPath:q}),b=await T0.loadSessionModelContext(z.sessionId,z.metadata.projectPath),N=[...T0.toUISafeMessages(z.messages)];if(U!==!1){let A=Date.parse(z.metadata.lastMessageTime);N.push({id:"fork-announcement-"+z.sessionId,role:"assistant",content:"Forked "+U6(X.sessionId)+" → "+U6(z.sessionId),timestamp:Number.isNaN(A)?0:A})}return await J(),O6(G??z.metadata.permissionMode),q6(z.metadata.selectedModelId),Y.restoreSession(z.sessionId,N,b,z.metadata.projectPath),{sessionId:z.sessionId,messages:b}}await T0.assertSessionWritable(X.sessionId,X.projectPath);let[L,O]=await Promise.all([T0.loadSession(X.sessionId,X.projectPath),T0.loadSessionModelContext(X.sessionId,X.projectPath)]),W=T0.toUISafeMessages(L);return await J(),O6(G??X.permissionMode),q6(X.selectedModelId),Y.restoreSession(X.sessionId,W,O,X.projectPath),{sessionId:X.sessionId,messages:O}}function _6($){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 Z3($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function X3($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function K3($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function G3($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function U3($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function q3($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function O3($){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)=>_6(Z))}if(Y==="activate_session")return _6($.session);return!1}function z3($,Q,Y,J){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=Q?.sessions;return Y.showSessionSelector(Z??[],"resume"),!0}case"session_forked":{let Z=Q;if(Z?.action!=="restore_forked_session"||!Z.sessionId||!Array.isArray(Z.messages)||!Array.isArray(Z.visibleMessages))return!1;return J.restoreSession(Z.sessionId,Z.visibleMessages,Z.messages),!0}case"session_archived":{let Z=Q?.session;return J.addAssistantMessage(Z?`会话 ${Z.sessionId} 已归档。`:"当前会话已归档。"),f1(0),!0}case"clear_screen":return J.clearMessages(),J.setError(null),J.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let Z=Q,X=Z?.compactedMessages;if(X)J.setCompactedContext(X);if(Z?.usage)J.updateTokenUsage({inputTokens:Z.usage.promptTokens,outputTokens:Z.usage.completionTokens,totalTokens:Z.usage.totalTokens,maxContextTokens:Z.maxContextTokens,cacheReadTokens:Z.usage.cacheReadInputTokens??0,cacheWriteTokens:Z.usage.cacheCreationInputTokens??0,costUsd:Z.usage.costUsd});return J.resetContextUsage(),!0}case"exit_application":return f1(0),!0;default:return!1}}async function $Q($,Q,Y,J,Z,X,K,U,G,q,L,O,W,z,b=d0(),N){let{text:A}=$;if(!N6(A))return{type:"not_slash"};let _=await F6(A,{cwd:b,surface:"tui",workspaceRoot:b,sessionId:X,messages:K,rewind:U,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),T0.archiveSession(X,b)}},subagents:G,mcp:q,reasoning:L,serviceTier:O,responseVerbosity:W,communicationStyle:z,codeReview:N,signal:J});if(_.success&&O3(_.data)){if(_.data.action==="select_session")return Q.showSessionSelector(_.data.sessions,_.data.intent),{type:"handled",commandResult:{success:!0}};return await t2(_.data,b,Y,Z),{type:"handled",commandResult:{success:!0}}}if(_.success&&q3(_.data))return Y.restoreSession(_.data.sessionId,_.data.visibleMessages,_.data.messages),Q.setTasks([]),{type:"handled",commandResult:{success:!0}};if(_.message){if(z3(_.message,_.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(Z3(_.data)){let{skillName:P,skillArgs:w}=_.data,C=w?`Please use the "${P}" skill to help me with: ${w}`:`Please use the "${P}" skill.`;return Y.addUserMessage(C),{type:"continue_as_agent",result:{userDisplayMessage:C,agentInput:{displayText:C,text:C,images:[],parts:[{type:"text",text:C}]},userMessageAlreadyAdded:!0}}}if(X3(_.data)){let{commandName:P,processedContent:w}=_.data;Y.addUserMessage(A);let C=`# Custom Command: /${P}
12
-
13
- The user has invoked the custom command "/${P}". Follow the instructions below to complete the task.
14
-
15
- ---
16
-
17
- ${w}
18
-
19
- ---
20
-
21
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:C,images:[],parts:[{type:"text",text:C}]},userMessageAlreadyAdded:!0}}}if(K3(_.data)){let{commandName:P,pluginName:w,processedContent:C}=_.data;Y.addUserMessage(A);let B=`# Plugin Command: /${P}
22
-
23
- The user has invoked the plugin command "/${P}" from plugin "${w}". Follow the instructions below to complete the task.
24
-
25
- ---
26
-
27
- ${C}
28
-
29
- ---
30
-
31
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:B,images:[],parts:[{type:"text",text:B}]},userMessageAlreadyAdded:!0}}}if(G3(_.data)){let{modelId:P,prompt:w}=_.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:P}}}if(U3(_.data)){let P=_.data.goal.objective;return Y.addUserMessage(A),{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!_.success&&_.error)return Y.addAssistantMessage(`${_.error}`),{type:"handled",commandResult:{success:_.success,output:_.message,error:_.error,metadata:_.data}};let k=_.message;if(_.success&&typeof k==="string"&&k.trim()!=="")Y.addAssistantMessage(k);return{type:"handled",commandResult:{success:_.success,output:_.message,error:_.error,metadata:_.data}}}import{useMemoizedFn as y0}from"ahooks";import{useEffect as _3,useRef as s2}from"react";function H6($){let Q=s2(void 0),Y=s2(void 0),J=s2(void 0),Z=s2(void 0),X=y0(async()=>{if(Z.current)return Z.current;let F=Q.current,R=Y.current;if(!F&&!R)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let V=(async()=>{try{await F?.destroy()}finally{await R?.dispose()}})();Z.current=V;try{await V}finally{if(Z.current===V)Z.current=void 0}}),K=y0(async(F)=>{let R=$.workspaceRoot??Y.current?.workspaceRoot??d0();if(Y.current&&(Y.current.sessionId!==F||Y.current.workspaceRoot!==R))await X();if(!Y.current){let V=await T0.findSessionMetadata(F,R),I=V!==void 0&&(await T0.loadSession(F,R)).length>0;Y.current=await B1.create({sessionId:F,workspaceRoot:R,modelId:$.modelId,permissionMode:$.permissionMode??V?.permissionMode,reasoningEffort:V?.reasoningEffort??$.reasoningEffort,serviceTier:V?.serviceTier??$.serviceTier,responseVerbosity:V?.responseVerbosity??$.responseVerbosity,communicationStyle:V?.communicationStyle??$.communicationStyle,communicationStyleDigest:V?.communicationStyleDigest,agents:$.agents,...I?{sessionStart:{isResume:!0,resumeSessionId:F}}:{}});try{J.current={sessionId:F,modelId:V?.selectedModelId,permissionMode:V?.permissionMode,reasoningEffort:V?.reasoningEffort,serviceTier:V?.serviceTier,responseVerbosity:V?.responseVerbosity,communicationStyle:V?.communicationStyle,communicationStyleDigest:V?.communicationStyleDigest},o0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),o0().setServiceTier(Y.current.getServiceTierConfiguration().selection),o0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),o0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(v){let h=Y.current;throw Y.current=void 0,await h.dispose().catch(()=>{return}),v}}return Y.current}),U=y0(async(F)=>{let R=F?.sessionId??$.sessionId,V=!!F?.modelId&&F.modelId!==$.modelId,I;if(!V&&R){let v=Y.current!==void 0,h=await K(R),Q0=F?.modelId??$.modelId,e=F?.reasoningEffort??(v?$.reasoningEffort:h.getReasoningConfiguration().selection),X0=F?.serviceTier??(v?$.serviceTier:h.getServiceTierConfiguration().selection),A0=F?.responseVerbosity??(v?$.responseVerbosity:h.getResponseVerbosityConfiguration().selection),D0=F?.communicationStyle??(v?$.communicationStyle:h.getCommunicationStyleConfiguration().selection),j0=h.getCurrentModelId(),W$=h.getReasoningConfiguration(),X2=h.getServiceTierConfiguration(),K2=h.getResponseVerbosityConfiguration(),G2=h.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==R||J.current.permissionMode!==$.permissionMode)){let c0=await T0.setSessionPermissionMode(R,h.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:R,permissionMode:c0.permissionMode}}await h.refresh({modelId:Q0,...e?{reasoningEffort:e}:{},...X0?{serviceTier:X0}:{},...A0?{responseVerbosity:A0}:{},...D0?{communicationStyle:D0}:{}});let j1=h.getCommunicationStyleConfiguration();if(j1.source!=="built-in"&&!j1.contentSha256)throw Error("Custom communication style has no provenance");let v$={...Q0&&Q0!=="inherit"&&(J.current?.sessionId!==R||J.current.modelId!==Q0)?{selectedModelId:Q0}:{},...e&&(J.current?.sessionId!==R||J.current.reasoningEffort!==e)?{reasoningEffort:e}:{},...X0&&(J.current?.sessionId!==R||J.current.serviceTier!==X0)?{serviceTier:X0}:{},...A0&&(J.current?.sessionId!==R||J.current.responseVerbosity!==A0)?{responseVerbosity:A0}:{},...D0&&(J.current?.sessionId!==R||J.current.communicationStyle!==D0||J.current.communicationStyleDigest!==j1.contentSha256)?{communicationStyle:D0,communicationStyleDigest:j1.source==="built-in"?null:j1.contentSha256}:{}};if(Object.keys(v$).length>0)try{let c0=await T0.updateSessionMetadata(R,h.workspaceRoot,v$);J.current={sessionId:R,modelId:c0.selectedModelId,permissionMode:c0.permissionMode,reasoningEffort:c0.reasoningEffort,serviceTier:c0.serviceTier,responseVerbosity:c0.responseVerbosity,communicationStyle:c0.communicationStyle,communicationStyleDigest:c0.communicationStyleDigest}}catch(c0){throw await h.refresh({...j0?{modelId:j0}:{},reasoningEffort:W$.selection,serviceTier:X2.selection,responseVerbosity:K2.selection,communicationStyle:G2.selection}).catch(()=>{return}),c0}I=await _2.createWithRuntime(h,{sessionId:R,systemPrompt:F?.systemPrompt??$.systemPrompt,appendSystemPrompt:F?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:F?.maxTurns??$.maxTurns,modelId:F?.modelId??$.modelId,permissionMode:F?.permissionMode??$.permissionMode,agents:$.agents})}else I=await _2.create({systemPrompt:F?.systemPrompt??$.systemPrompt,appendSystemPrompt:F?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:F?.maxTurns??$.maxTurns,modelId:F?.modelId??$.modelId,permissionMode:F?.permissionMode??$.permissionMode,agents:$.agents});return Q.current=I,I}),G=y0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await K($.sessionId)).listRewindCheckpoints()}),q=y0(async(F)=>{if(!$.sessionId)throw Error("No active session to rewind");let V=await(await K($.sessionId)).rewindSession(F);return await X(),V}),L=y0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await K($.sessionId)).listSubagents()}),O=y0(async(F,R)=>{if(!$.sessionId)throw Error("No active session for subagent control");let V=await K($.sessionId),I=!1,v,h=F,Q0=(X0)=>{let A0=X0.status==="completed"?X0.result?.message:X0.result?.error||X0.result?.message;V$.getState().app.actions.completeSubagentProgress(h,X0.status==="completed",A0)},e=V.resumeSubagent({agentId:F,prompt:R,onEvent:(X0)=>{if(X0.kind==="tool_start"&&"function"in X0.toolCall)V$.getState().app.actions.updateSubagentTool(h,X0.toolCall.function.name)},onCompleted:(X0)=>{if(I)Q0(X0);else v=X0}});if(h=e.session.id,V$.getState().app.actions.startSubagentProgress(e.session.id,e.session.subagentType,`Resumed from ${e.source.id}: ${e.session.description}`),I=!0,v)Q0(v);return e}),W=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await K($.sessionId)).getMcpContentCatalog()}),z=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await K($.sessionId)).refreshMcpContentCatalogs(F)}),b=y0(async(F,R,V)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await K($.sessionId)).getMcpPrompt(F,R,V)}),N=y0(async(F,R,V)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await K($.sessionId)).completeMcpArgument(F,R,V)}),A=y0(async(F,R={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await K($.sessionId)).getMcpLogs(F,R)}),T=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).listMcpTasks(F)}),_=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).getMcpTask(F)}),k=y0(async(F,R)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).cancelMcpTask(F,R)}),P=y0(async(F,R)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await K($.sessionId)).setMcpLoggingLevel(F,R)}),w=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await K($.sessionId)).getMcpInstructions()}),C=y0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await K($.sessionId)).getReasoningConfiguration()}),B=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let V=R.getReasoningConfiguration();if(R.resolveReasoningConfiguration(F),V.selection===F)return V;await R.refresh({reasoningEffort:F});try{let I;try{I=await T0.updateSessionMetadata($.sessionId,R.workspaceRoot,{reasoningEffort:F})}catch(v){if(!(v instanceof z2)&&v.code!=="ENOENT")throw v;I=await T0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:F,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:I.selectedModelId,permissionMode:I.permissionMode,reasoningEffort:I.reasoningEffort,serviceTier:I.serviceTier,responseVerbosity:I.responseVerbosity,communicationStyle:I.communicationStyle,communicationStyleDigest:I.communicationStyleDigest},o0().setReasoningEffort(F),R.getReasoningConfiguration()}catch(I){throw await R.refresh({reasoningEffort:V.selection}),I}}),y=y0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await K($.sessionId)).getServiceTierConfiguration()}),f=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for service tier");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let V=R.getServiceTierConfiguration();if(R.resolveServiceTierConfiguration(F),V.selection===F)return V;await R.refresh({serviceTier:F});try{let I;try{I=await T0.updateSessionMetadata($.sessionId,R.workspaceRoot,{serviceTier:F})}catch(v){if(!(v instanceof z2)&&v.code!=="ENOENT")throw v;I=await T0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:F,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:I.selectedModelId,permissionMode:I.permissionMode,reasoningEffort:I.reasoningEffort,serviceTier:I.serviceTier,responseVerbosity:I.responseVerbosity,communicationStyle:I.communicationStyle,communicationStyleDigest:I.communicationStyleDigest},o0().setServiceTier(F),R.getServiceTierConfiguration()}catch(I){throw await R.refresh({serviceTier:V.selection}),I}}),M=y0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await K($.sessionId)).getResponseVerbosityConfiguration()}),H=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let V=R.getResponseVerbosityConfiguration();if(R.resolveResponseVerbosityConfiguration(F),V.selection===F)return V;await R.refresh({responseVerbosity:F});try{let I;try{I=await T0.updateSessionMetadata($.sessionId,R.workspaceRoot,{responseVerbosity:F})}catch(v){if(!(v instanceof z2)&&v.code!=="ENOENT")throw v;I=await T0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:F,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:I.selectedModelId,permissionMode:I.permissionMode,reasoningEffort:I.reasoningEffort,serviceTier:I.serviceTier,responseVerbosity:I.responseVerbosity,communicationStyle:I.communicationStyle,communicationStyleDigest:I.communicationStyleDigest},o0().setResponseVerbosity(F),R.getResponseVerbosityConfiguration()}catch(I){throw await R.refresh({responseVerbosity:V.selection}),I}}),S=y0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await K($.sessionId)).getCommunicationStyleConfiguration()}),E=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for communication style");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let V=R.getCommunicationStyleConfiguration(),I=R.resolveCommunicationStyleConfiguration(F);if(I.source!=="built-in"&&!I.contentSha256)throw Error("Custom communication style has no provenance");if(V.selection===F)return V;await R.refresh({communicationStyle:F});try{let v;try{v=await T0.updateSessionMetadata($.sessionId,R.workspaceRoot,{communicationStyle:F,communicationStyleDigest:I.source==="built-in"?null:I.contentSha256})}catch(h){if(!(h instanceof z2)&&h.code!=="ENOENT")throw h;v=await T0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:F,...I.source!=="built-in"&&I.contentSha256?{communicationStyleDigest:I.contentSha256}:{}})}return J.current={sessionId:$.sessionId,modelId:v.selectedModelId,permissionMode:v.permissionMode,reasoningEffort:v.reasoningEffort,serviceTier:v.serviceTier,responseVerbosity:v.responseVerbosity,communicationStyle:v.communicationStyle,communicationStyleDigest:v.communicationStyleDigest},o0().setCommunicationStyle(F),R.getCommunicationStyleConfiguration()}catch(v){throw await R.refresh({communicationStyle:V.selection}),v}}),n=y0(async(F)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(F,{allowBeforeTurn:!0})}),r=y0(async(F,R)=>{let V=$.sessionId;if(!V)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await K(V)).enqueueSteering(F,{allowBeforeTurn:!0,...R})}),o=y0(async(F,R)=>{let V=$.sessionId;if(!V)throw Error("Side conversation requires a Session");return(await K(V)).askSideQuestion(F,{signal:R,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),l=y0(async(F,R)=>{let V=$.sessionId;if(!V)throw Error("User shell command requires a Session");return(await K(V)).executeUserShellCommand(F,R)}),p=y0(()=>Y.current?.getTurnRecoveryAssessment()??{state:"none"}),d=y0(async(F,R)=>{let V=$.sessionId;if(!V)throw Error("Code review requires a Session");let I=await K(V);await e2.recoverInterrupted(I.workspaceRoot,V,I);let v=await e2.start({sessionId:V,projectPath:I.workspaceRoot,runtime:I,request:F,signal:R}),h=await v.completion,Q0=(await e2.list(I.workspaceRoot,V)).find((e)=>e.start.reviewId===v.reviewId);if(!Q0)throw Error(`Review not found after completion: ${v.reviewId}`);return{reviewId:v.reviewId,status:h.status,findings:h.findings.length,content:W6(Q0.start,h)}});return _3(()=>{let F=$8(X);return()=>{F(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:U,cleanupAgent:X,steerActiveTurn:n,enqueueSessionInput:r,askSideQuestion:o,runCodeReview:d,executeUserShellCommand:l,getTurnRecoveryAssessment:p,listRewindCheckpoints:G,rewindSession:q,listSubagents:L,resumeSubagent:O,getMcpContentCatalog:W,refreshMcpContentCatalogs:z,getMcpPrompt:b,completeMcpArgument:N,listMcpTasks:T,getMcpTask:_,cancelMcpTask:k,getMcpLogs:A,setMcpLoggingLevel:P,getMcpInstructions:w,getReasoningConfiguration:C,setReasoningEffort:B,getServiceTierConfiguration:y,setServiceTier:f,getResponseVerbosityConfiguration:M,setResponseVerbosity:H,getCommunicationStyleConfiguration:S,setCommunicationStyle:E}}import{useMemoizedFn as p$}from"ahooks";import{useEffect as N3,useRef as Q8}from"react";function L6($){let Q=0;for(let Y of $)if(Y===`
32
- `)Q++;return Q}function B6($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=Q8(""),K=Q8(null),U=Q8(""),G=Q8(null),q=p$(()=>{if(X.current){let N=X.current,A=$.appendAssistantContent(N);g$(A,N),X.current=""}if(K.current)clearTimeout(K.current),K.current=null}),L=p$(()=>{if(U.current)$.appendThinkingContent(U.current),U.current="";if(G.current)clearTimeout(G.current),G.current=null}),O=p$((N)=>{X.current+=N;let A=X.current;if(L6(A)>=J||A.length>=Z){q();return}if(!K.current)K.current=setTimeout(q,Y)}),W=p$((N)=>{U.current+=N;let A=U.current;if(L6(A)>=J||A.length>=Z){L();return}if(!G.current)G.current=setTimeout(L,Y)}),z=p$(()=>{if(X.current="",K.current)clearTimeout(K.current),K.current=null;if(U.current="",G.current)clearTimeout(G.current),G.current=null}),b=p$(()=>{if(K.current)clearTimeout(K.current),K.current=null;if(G.current)clearTimeout(G.current),G.current=null;let N=X.current,A=U.current;return X.current="",U.current="",{extraContent:N,extraThinking:A}});return N3(()=>{return()=>{z()}},[z]),{batchAppendContent:O,batchAppendThinking:W,flushContentBuffer:q,flushThinkingBuffer:L,resetStreamingBuffers:z,drainPendingBuffers:b}}var N2=s1("UI");function w6($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var C6=($,Q,Y,J,Z,X)=>{let K=E$(),U=j$(),G=I1(),q=g2(),L=h$(),O=p2(),W=c2(),z=x2(),b=u2(),N=l2(),A=j2(),T=c4(),_=n1(),k=t1(),P=l4(),w=QQ(!1),C=QQ(!1),B=QQ(null),{createAgent:y,cleanupAgent:f,steerActiveTurn:M,enqueueSessionInput:H,listRewindCheckpoints:S,rewindSession:E,listSubagents:n,resumeSubagent:r,getMcpContentCatalog:o,refreshMcpContentCatalogs:l,getMcpPrompt:p,completeMcpArgument:d,listMcpTasks:F,getMcpTask:R,cancelMcpTask:V,getMcpLogs:I,setMcpLoggingLevel:v,getMcpInstructions:h,getReasoningConfiguration:Q0,setReasoningEffort:e,getServiceTierConfiguration:X0,setServiceTier:A0,getResponseVerbosityConfiguration:D0,setResponseVerbosity:j0,getCommunicationStyleConfiguration:W$,setCommunicationStyle:X2,runCodeReview:K2,askSideQuestion:G2,executeUserShellCommand:j1,getTurnRecoveryAssessment:v$}=H6({sessionId:U,workspaceRoot:G,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:q,permissionMode:L,reasoningEffort:W,serviceTier:z,responseVerbosity:b,communicationStyle:N,agents:X}),c0=B6(_),H$=e1(async()=>{if(!T||!U){k.setTeams([]);return}try{let N0=await new T6({configDir:JQ(),subagentRegistry:J8(G)}).list({sessionId:U,projectPath:G});if(l0().session.sessionId===U&&l0().session.workspaceRoot===G)k.setTeams(N0)}catch(J0){N2.warn("[useCommandHandler] Failed to refresh Agent Teams",J0)}}),M1=e1(async(J0,N0)=>{if(J0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let F0=J0.text.trimStart().slice(1).trim();if(!F0)return{success:!1,error:"User shell command cannot be empty"};_.setCommand(`! ${F0}`);try{let D=await j1(F0,{signal:N0});if(_.addMessage({id:`user-shell-${D.executionId}`,role:"user",content:YQ(D.record),timestamp:Date.now(),metadata:{userShellCommand:D.record}}),D.delivery==="next_turn")C.current=!0;return{success:D.record.status!=="spawn_error",output:YQ(D.record),...D.record.status==="spawn_error"?{error:D.record.stderr||"User shell command failed"}:{}}}finally{_.setCommand(null)}});c$(()=>{return()=>{c0.resetStreamingBuffers()}},[c0.resetStreamingBuffers]),c$(()=>{return()=>{B.current?.abort("side-conversation-session-change"),B.current=null,k.dismissSideConversation()}},[k,U,G]),c$(()=>{k.setTeams([]),H$()},[T,k,H$,U,G]),c$(()=>{if(!O)_.setCurrentThinkingContent(null)},[O,_]);let L$=e1(()=>{if(B.current){B.current.abort("user-cancel"),B.current=null,k.dismissSideConversation();return}if(!K)return;Z?.();let{extraContent:J0,extraThinking:N0}=c0.drainPendingBuffers();P.abort("user-cancel"),k.setTasks([]);let F0=l0().session.currentStreamingMessageId;if(F0){if(J0)g$(F0,J0);a2(F0)}if(_.finalizeStreamingMessage(J0,N0),!w.current)_.addAssistantMessage("任务已停止"),w.current=!0}),r8=e1(async(J0,N0)=>{let F0=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(k.startSideConversation(F0,N0),J0.images.length>0){k.failSideConversation(F0,"Side conversations do not accept image attachments");return}if(!N0){k.failSideConversation(F0,"Usage: /btw <question>");return}B.current?.abort("side-conversation-replaced");let D=new AbortController;B.current=D;try{let m=await G2(N0,D.signal);if(D.signal.aborted||B.current!==D)return;if(k.completeSideConversation(F0,m),m.usage)_.updateTokenUsage({inputTokens:m.usage.promptTokens,outputTokens:m.usage.completionTokens,totalTokens:m.usage.totalTokens,cacheReadTokens:m.usage.cacheReadInputTokens??0,cacheWriteTokens:m.usage.cacheCreationInputTokens??0,costUsd:m.usage.costUsd})}catch(m){if(D.signal.aborted||B.current!==D)return;k.failSideConversation(F0,m instanceof Error?m.message:String(m))}finally{if(B.current===D)B.current=null}}),S2=e1(async(J0,N0)=>{let F0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},D=Z6({sessionActions:_,appActions:k,commandActions:P,streamingBuffer:c0,thinkingModeEnabled:O,getStreamingMessageId:()=>l0().session.currentStreamingMessageId,signal:N0.signal},F0);return{loopResult:await P6(J0,D),stats:F0}}),a8=e1(async(J0)=>{let N0=!1,F0,D=!1,m=J0;try{if(J0.text.trimStart().startsWith("!")){let u0=P.getAbortController()??P.createAbortController();return await M1(J0,u0.signal)}await F2();let W0=P.getAbortController()??P.createAbortController(),x0=i2(l0().session),E0=await $Q(J0,k,_,W0.signal,f,U,i2(l0().session),{listCheckpoints:S,execute:E},{list:n,resume:r},{getCatalog:o,refresh:l,getPrompt:p,complete:d,listTasks:F,getTask:R,cancelTask:V,getLogs:I,setLoggingLevel:v,getInstructions:h},{get:Q0,set:e},{get:X0,set:A0},{get:D0,set:j0},{get:W$,set:X2},G,{run:K2});if(E0.type==="handled")return E0.commandResult;if(E0.type==="continue_as_agent")N0=E0.result.userMessageAlreadyAdded,F0=E0.result.onceModelId,D=E0.result.goalContinuationOnly===!0,m=E0.result.agentInput;let h1=q1.getInstance(),U2;if(!D){let u0=await h1.executeUserPromptSubmitHooks(m.text,{projectDir:G,sessionId:U,permissionMode:L,hasImages:m.images.length>0,imageCount:m.images.length});if(!u0.proceed){if(u0.warning)_.addAssistantMessage(`${u0.warning}`);return{success:!1,error:"blocked by hook"}}if(u0.updatedPrompt)m={...m,text:u0.updatedPrompt,displayText:u0.updatedPrompt,parts:[{type:"text",text:u0.updatedPrompt},...m.parts.filter((v2)=>v2.type==="image")]};if(u0.contextInjection)U2=u0.contextInjection}if(!N0)_.addUserMessage(m.displayText);let D$=e8(m),uY=await y(F0?{modelId:F0}:void 0);if(W0.signal.aborted)return N2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(U2)x0.push({role:"system",content:`<user-prompt-submit-hook>
33
- ${U2}
34
- </user-prompt-submit-hook>`});let B4={messages:x0,userId:"cli-user",sessionId:U,workspaceRoot:G,signal:W0.signal,confirmationHandler:Y,permissionMode:L,onPermissionModeChange:async(u0)=>{await m0().setPermissionMode(u0)}},{loopResult:C1,stats:w4}=await S2(uY.chatStream(D$,B4,{stream:!0,goalContinuationOnly:D,onTurnLimitReached:Y?async(u0)=>{let v2=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${u0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:v2.approved,reason:v2.reason}}:void 0}),W0);if(w4.compactionCount>0)_.setCompactedContext(B4.messages);if(C1.success&&C1.metadata?.outputTruncated)_.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let q2=C1.finalMessage||"";if(N2.debug("[handleCommandSubmit] final reply",{success:C1.success,outputLength:q2.length,turnsCount:C1.metadata?.turnsCount,toolCallsCount:C1.metadata?.toolCallsCount}),!C1.success&&!w6(C1)){let u0=C1.error?.message||"任务执行失败";return _.addAssistantMessage(u0),{success:!1,error:u0}}if(!q2||q2.trim()===""){let u0=C1.metadata?.abortReason;if(!w.current&&w4.contentDeltaCount===0&&u0!=="interrupt")return _.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:q2??""}}return{success:!0,output:q2}}catch(W0){if(w.current)return{success:!1,error:"aborted"};let x0=d2(W0);return _.addAssistantMessage(`${x0.displayMessage}`),{success:!1,error:x0.displayMessage}}}),T1=e1(async()=>{if(l0().command.isProcessing){C.current=!0;return}let J0=await B1.hasPendingInbox(G,U),N0=!J0&&await B1.hasActiveGoal(G,U),F0=!J0&&!N0&&await B1.hasRecoverableTurn(G,U);if(!J0&&!N0&&!F0){C.current=!1;return}if(l0().command.isProcessing){C.current=!0;return}C.current=!1,await F2();let D=P.createAbortController();c0.resetStreamingBuffers(),_.clearFinalizingStreamingMessageId(),P.setProcessing(!0);try{let m=await y();if(D.signal.aborted)return;let W0=await B1.hasPendingInbox(G,U),x0=!W0&&await B1.hasActiveGoal(G,U);if(!W0&&!x0){let D$=v$();if(D$.state!=="none")s8(_,D$);return}let E0={messages:i2(l0().session),userId:"cli-user",sessionId:U,workspaceRoot:G,signal:D.signal,confirmationHandler:Y,permissionMode:L,onPermissionModeChange:async(D$)=>{await m0().setPermissionMode(D$)}},{loopResult:h1,stats:U2}=await S2(m.chatStream("",E0,{stream:!0,pendingInputOnly:W0,goalContinuationOnly:x0}),D);if(U2.compactionCount>0)_.setCompactedContext(E0.messages);if(h1.success&&h1.metadata?.outputTruncated)_.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!h1.success&&!w6(h1))_.addAssistantMessage(h1.error?.message||"恢复排队指令失败")}catch(m){let W0=d2(m);if(!W0.isAbort)_.setError(`恢复排队指令失败: ${W0.displayMessage}`)}finally{if(P.getAbortController()===D)P.setProcessing(!1),P.clearAbortController(D),_.setCurrentThinkingContent(null);if(C.current)queueMicrotask(()=>{T1()})}}),o8=e1(async(J0)=>{if(!J0.text.trim()&&J0.images.length===0)return;let N0=y6(J0.text);if(N0){await r8(J0,N0.question);return}if(B.current?.abort("main-conversation-submitted"),B.current=null,k.dismissSideConversation(),J0.text.trimStart().startsWith("!")&&K){let D=P.getAbortController();if(!D){_.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let m=await M1(J0,D.signal);if(!m.success&&m.error&&m.error!=="aborted")_.setError(m.error);return}if(K){if(J0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(J0.text.trim())){await F2();let E0=P.getAbortController()??P.createAbortController();await $Q(J0,k,_,E0.signal,f,U,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,G);return}_.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await F2();let D=await q1.getInstance().executeUserPromptSubmitHooks(J0.text,{projectDir:G,sessionId:U,permissionMode:L,hasImages:J0.images.length>0,imageCount:J0.images.length});if(!D.proceed){if(D.warning)_.addAssistantMessage(D.warning);return}let m=J0;if(D.updatedPrompt)m={...J0,text:D.updatedPrompt,parts:[{type:"text",text:D.updatedPrompt},...J0.parts.filter((E0)=>E0.type==="image")]};if(D.contextInjection){let E0=`<user-prompt-submit-hook>
35
- ${D.contextInjection}
36
- </user-prompt-submit-hook>`;m={...m,text:`${m.text}
37
-
38
- ${E0}`,parts:[...m.parts,{type:"text",text:`
39
-
40
- ${E0}`}]}}let W0=e8(m),x0=await M(W0);if(!x0.accepted){let E0=x0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";_.addAssistantMessage(E0);return}if(P.enqueueCommand(J0),_.addUserMessage(J0.displayText),x0.delivery==="next_turn"){if(C.current=!0,!l0().command.isProcessing)queueMicrotask(()=>{T1()})}return}k.setTasks([]),P.setRecoveredSteeringCount(0),w.current=!1;let F0=P.createAbortController();c0.resetStreamingBuffers(),_.clearFinalizingStreamingMessageId(),P.setProcessing(!0);try{let D=await a8(J0);if(!D.success&&D.error&&D.error!=="aborted")_.setError(D.error)}catch(D){let m=d2(D);if(m.isAbort);else _.setError(`执行失败: ${m.displayMessage}`)}finally{if(P.getAbortController()===F0){if(P.setProcessing(!1),P.clearAbortController(F0),_.setCurrentThinkingContent(null),C.current)queueMicrotask(()=>{T1()})}}});return c$(()=>{let J0=A6.subscribe((N0)=>{if(!b6(N0,{sessionId:U,projectPath:G}))return;if(N0.type.startsWith("team.")){let{teamName:F0,messageId:D,content:m}=N0.properties,W0=N0.properties.metadata;if(N0.type==="team.message.received"&&typeof F0==="string"&&typeof D==="string"&&typeof m==="string"&&M6(W0,{messageId:D,teamName:F0}))(async()=>{let x0=await H(m,{messageId:D,origin:"team_message",metadata:W0});if(!x0.accepted)return;if(await new R6(F0,JQ()).markDelivered([D]),x0.delivery==="next_turn"){if(C.current=!0,!l0().command.isProcessing)await T1()}})().catch((x0)=>{N2.warn("[useCommandHandler] Failed to deliver teammate message",x0)});queueMicrotask(()=>{H$()});return}if(N0.type!=="subagent.completion.queued")return;C.current=!0,queueMicrotask(()=>{T1()})});return()=>{J0()}},[H,H$,T1,U,G]),c$(()=>{let J0=!1;return(async()=>{if(Y)await ZQ.resolvePendingWithHandler(G,U,Y);else await ZQ.cancelPendingNonInteractive(G,U);if(J0)return;let[N0,F0]=await Promise.all([B1.hasPendingInbox(G,U),B1.hasActiveGoal(G,U)]),D=!N0&&!F0&&await B1.hasRecoverableTurn(G,U);if(N0||F0||D)await T1()})().catch((N0)=>{if(!J0)N2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",N0)}),()=>{J0=!0}},[Y,T1,U,G]),{executeCommand:o8,handleAbort:L$,isProcessing:K||A?.status==="loading",cleanupAgent:f}};import{useMemoizedFn as Y8}from"ahooks";import{useState as I6}from"react";var f6=()=>{let[$,Q]=I6([]),[Y,J]=I6(-1),Z=Y8((G,q)=>{let L={display:G,pasteMappings:q?new Map(q):new Map};Q((O)=>[...O,L]),J(-1)}),X=Y8(()=>{if($.length===0)return null;let G=Y===-1?$.length-1:Math.max(0,Y-1);return J(G),$[G]||null}),K=Y8(()=>{if(Y===-1)return null;let G=Y+1;if(G>=$.length)return J(-1),null;else return J(G),$[G]||null}),U=Y8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:K,resetHistoryIndex:U}};import{useMemoizedFn as W2}from"ahooks";import{useMemo as F3,useRef as k6,useState as W3}from"react";var S6=()=>{let[$,Q]=W3({isVisible:!1,details:null,resolver:null}),Y=k6(null),J=k6([]),Z=W2((L)=>{Y.current=L,Q({isVisible:Boolean(L),details:L?.details??null,resolver:L?.resolve??null})}),X=W2((L,O)=>{if(L.settled)return;if(L.settled=!0,L.signal&&L.abortListener)L.signal.removeEventListener("abort",L.abortListener);L.resolve(O)}),K=W2((L,O)=>{return new Promise((W)=>{let z={details:L,resolve:W,signal:O,settled:!1},b=()=>{if(Y.current===z){X(z,{approved:!1,reason:H2}),Z(J.current.shift()??null);return}let N=J.current.indexOf(z);if(N>=0)J.current.splice(N,1);X(z,{approved:!1,reason:H2})};if(z.abortListener=b,O?.aborted){b();return}if(O?.addEventListener("abort",b,{once:!0}),!Y.current){Z(z);return}J.current.push(z)})}),U=W2((L)=>{let O=Y.current;if(O)X(O,L);let W=J.current.shift()??null;Z(W)}),G=W2(()=>{if(Y.current)X(Y.current,{approved:!1,reason:H2});for(let L of J.current)X(L,{approved:!1,reason:H2});J.current=[],Z(null)}),q=F3(()=>({requestConfirmation:K}),[K]);return{confirmationState:$,confirmationHandler:q,handleResponse:U,dismissAll:G}};import{useMemoizedFn as B$}from"ahooks";import{useRef as v6,useState as H3}from"react";var Z8="␞",X8="␟";function K8($){return`${Z8}PASTE:${$}:`}function XQ(){return X8}var WG=new RegExp(`${Z8}PASTE:(\\d+):[\\s\\S]*?${X8}`,"g");function L3($){return $.includes(Z8)&&$.includes(X8)}function D6($="",Q=0){let[Y,J]=H3({value:$,cursorPosition:Q}),Z=v6(0),X=v6(new Map),K=B$((z)=>{J((b)=>({value:z,cursorPosition:b.cursorPosition}));for(let b of X.current.keys()){let N=K8(b);if(!z.includes(N))X.current.delete(b)}}),U=B$((z)=>{J((b)=>({...b,cursorPosition:Math.max(0,Math.min(z,b.value.length))}))}),G=B$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),q=B$((z)=>{Z.current+=1;let b=Z.current;return X.current.set(b,{type:"text",data:z}),b}),L=B$((z,b)=>{let N=[...X.current.values()].filter((k)=>k.type==="image");if(N.length>=m$)throw Error(`最多只能粘贴 ${m$} 张图片`);let A=N.reduce((k,P)=>k+`data:${P.mimeType};base64,`.length+P.data.length,0),T=`data:${b};base64,`.length+z.length;if(A+T>o2)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let _=Z.current;return X.current.set(_,{type:"image",data:z,mimeType:b}),_}),O=B$((z)=>{for(let[b,N]of z)if(X.current.set(b,N),b>=Z.current)Z.current=b}),W=B$((z)=>{let b=[],N=[];if(!L3(z)){let f=z.trim();if(f)N.push({type:"text",text:f});return{displayText:z,text:z,images:b,parts:N}}let A=new RegExp(`${Z8}PASTE:(\\d+):[\\s\\S]*?${X8}`,"g"),T=Array.from(z.matchAll(A)),_=0,k="",P="";for(let f of T){let M=f.index,H=M+f[0].length,S=parseInt(f[1],10),E=X.current.get(S);if(M>_){let n=z.slice(_,M);N.push({type:"text",text:n}),k+=n,P+=n}if(!E)k+=f[0],P+=f[0],N.push({type:"text",text:f[0]});else if(E.type==="text")k+=E.data,P+=E.data,N.push({type:"text",text:E.data});else{let n={id:S,base64:E.data,mimeType:E.mimeType};b.push(n),N.push({type:"image",...n}),P+=`[Image #${S}]`}_=H}if(_<z.length){let f=z.slice(_);N.push({type:"text",text:f}),k+=f,P+=f}let w=[];for(let f of N)if(f.type==="text"&&w.length>0&&w[w.length-1].type==="text")w[w.length-1].text+=f.text;else w.push(f);let C=0,B=w.length;while(C<w.length&&w[C].type==="text"&&w[C].text.trim()==="")C++;while(B>C&&w[B-1].type==="text"&&w[B-1].text.trim()==="")B--;let y=w.slice(C,B);return{displayText:P.trim(),text:k.trim(),images:b,parts:y}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:K,setCursorPosition:U,clear:G,pasteMap:X.current,addPasteMapping:q,addImagePasteMapping:L,restorePasteMappings:O,resolveInput:W}}import{useMemoizedFn as c6}from"ahooks";import{useInput as M3}from"ink";import{useEffect as x6,useRef as u6,useState as qQ}from"react";function B3($){return{supportsThinking:E1().resolveConfig($).reasoning}}function G8($){return B3($).supportsThinking}import w3 from"fast-glob";import b3 from"fuse.js";import{useEffect as V6,useMemo as KQ,useState as GQ}from"react";var x$=null,A3=5000;function P3($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),K=X+Z.length;if(Q>=X&&Q<=K){let U=Z.slice(1),G=!1;if(U.startsWith('"')){if(G=!0,U=U.slice(1),U.endsWith('"'))U=U.slice(0,-1)}return{hasQuery:!0,query:U,startIndex:X,endIndex:K,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var y3=[...UQ.map(($)=>`${$}/**`),...UQ,...j6.map(($)=>`**/${$}`)];function h6($,Q,Y={}){let{cwd:J=d0(),maxSuggestions:Z=15,ignorePatterns:X=y3,debounceDelay:K=300,fuzzyMatch:U=!0}=Y,[G,q]=GQ([]),[L,O]=GQ(!1),[W,z]=GQ(0),b=KQ(()=>JSON.stringify(X),[X]),N=KQ(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return P3($,Q)},[$,Q]);V6(()=>{if(!$.includes("@")){q([]),O(!1);return}let T=Date.now();if(x$&&x$.cwd===J&&x$.ignoreKey===b&&T-x$.timestamp<A3){q(x$.files),O(!1);return}let _=!1,P=setTimeout(async()=>{O(!0);try{let C=(await w3("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((B)=>B.replace(/\\/g,"/"));if(!_)q(C),x$={cwd:J,ignoreKey:b,files:C,timestamp:T}}catch(w){if(console.error("Failed to load files for @ completion:",w),!_)q([])}finally{if(!_)O(!1)}},K);return()=>{_=!0,clearTimeout(P)}},[$,J,K,b]);let A=KQ(()=>{if(!N.hasQuery||G.length===0)return[];let T=N.query.toLowerCase();if(T==="")return G.slice(0,Z);if(U)return new b3(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(T).slice(0,Z).map((P)=>P.item);return G.filter((_)=>_.toLowerCase().includes(T)).slice(0,Z)},[N,G,Z,U]);return V6(()=>{z(0)},[A]),{...N,suggestions:A,selectedIndex:W,loading:L}}function R3($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function E6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=R3(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),K=Z+J+" "+X,U=Q.startIndex+J.length+1;return{newInput:K,newCursorPos:U}}import{useMemoizedFn as g6}from"ahooks";import{useEffect as m6,useRef as p6}from"react";var k0=($,Q)=>{let Y=p6(!1),J=p6(null),Z=g6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{o0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{L2().shutdown("SIGINT",0)},K=g6(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();o0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;o0().setAwaitingSecondCtrlC(!1),X()}});return m6(()=>{if($){if(o0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),m6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),K};var U8=s1("UI"),r6=($,Q,Y,J,Z,X,K,U,G,q)=>{let O=e0()==="main-input",W=$.value,z=$.setValue,b=$.cursorPosition,N=n1(),A=I1(),T=t1(),_=E2(),k=_?G8(_):!1,[P,w]=qQ(!1),[C,B]=qQ([]),[y,f]=qQ(0),M=h6(W,b,{cwd:A,maxSuggestions:10}),H=k0(K||!1,X),S=u6(0),E=500,n=u6(!1);x6(()=>{if(K)n.current=!1},[K]),x6(()=>{if(M.hasQuery&&M.suggestions.length>0){let l=M.suggestions.map((p)=>({command:p,description:l6(p)?`Directory: ${p}`:`File: ${p}`,matchScore:1}));B(l),w(!0),f(0)}else if(W.startsWith("/"))if(W.includes(" "))w(!1),B([]);else{let p=d6(W,A);B(p),w(p.length>0),f(0)}else w(!1),B([])},[W,M.hasQuery,M.suggestions,A]);let r=c6(()=>{N.clearMessages(),N.setError(null)}),o=c6(()=>{U8.debug("[DIAG] handleSubmit called:",{input:W,showSuggestions:P});let l=W.trim();if(l){let p=$.resolveInput(l);U8.debug("[DIAG] Submitting command:",{displayText:l,textLength:p.text.length,imageCount:p.images.length}),w(!1),B([]);let d=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(l,d),$.clear(),Q(p),U8.debug("[DIAG] Command submitted to onSubmit callback")}else U8.debug("[DIAG] Empty command, not submitting")});return M3((l,p)=>{if(l==="?"&&!W){G?.(),setTimeout(()=>$.clear(),0);return}if(p.backspace||p.delete||p.leftArrow||p.rightArrow||p.pageUp||p.pageDown||!p.ctrl&&!p.meta&&!p.escape&&!p.tab&&!p.upArrow&&!p.downArrow&&!p.return&&!(l==="?"&&!W))return;if(p.ctrl&&l==="c"||p.meta&&l==="c"||p.ctrl&&l==="d"||p.meta&&l==="d"){H();return}if(p.ctrl&&l==="l"||p.meta&&l==="l"){r();return}if(p.ctrl&&l==="t"||p.meta&&l==="t"){N.toggleThinkingExpanded();return}if(p.ctrl&&l==="o"||p.meta&&l==="o"){N.toggleHistoryExpanded();return}if(p.escape){if(q)G?.();else if(K&&X){if(n.current)return;n.current=!0,X()}else if(P)w(!1),B([]);else if(W){let F=Date.now();if(F-S.current<500)$.clear(),S.current=0;else S.current=F}return}if(p.tab&&p.shift){U?.();return}if(p.tab){if(P&&C.length>0){let F=C[y].command;if(M.hasQuery&&M.suggestions.includes(F)){let{newInput:R,newCursorPos:V}=E6(W,M,F);z(R),$.setCursorPosition(V)}else{let R=F+" ";z(R),$.setCursorPosition(R.length)}w(!1),B([])}else if(k)T.toggleThinkingMode();return}if(p.return){o();return}if(p.upArrow){if(P&&C.length>0){let F=C.length-1;f((R)=>R>0?R-1:F)}else{let F=Y();if(F){if(F.pasteMappings.size>0)$.restorePasteMappings(F.pasteMappings);z(F.display),$.setCursorPosition(F.display.length)}}return}if(p.downArrow){if(P&&C.length>0){let F=C.length-1;f((R)=>R<F?R+1:0)}else{let F=J();if(F){if(F.pasteMappings.size>0)$.restorePasteMappings(F.pasteMappings);z(F.display),$.setCursorPosition(F.display.length)}}return}},{isActive:O}),{handleSubmit:o,showSuggestions:P,suggestions:C,selectedSuggestionIndex:y}};import k3 from"ansi-escapes";import{useStdout as S3}from"ink";import{useCallback as v3,useEffect as D3,useRef as V3}from"react";import{useStdout as T3}from"ink";import{debounce as C3}from"lodash-es";import{useEffect as I3,useState as f3}from"react";function Q$($=200){let{stdout:Q}=T3(),[Y,J]=f3(Q.columns||80);return I3(()=>{let Z=C3(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function a6(){let{stdout:$}=S3(),Q=Q$(),Y=V3(!0),J=t((X)=>X.session.actions.incrementClearCount),Z=v3(()=>{if($)$.write(k3.clearTerminal);J()},[$,J]);return D3(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import o6 from"node:fs";import j3 from"node:os";import OQ from"node:path";import{MultiSelect as h3}from"@inkjs/ui";import{useMemoizedFn as q8}from"ahooks";import{Box as G0,Text as $0,useFocus as E3,useFocusManager as g3,useInput as n6}from"ink";import O8 from"ink-select-input";import m3 from"ink-spinner";import B2 from"ink-text-input";import{useEffect as i6,useState as u$}from"react";import{jsxDEV as j}from"react/jsx-dev-runtime";var p3=[{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"}],c3=[{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 x3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function w2({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=u$(Y?"name":"mode"),[X,K]=u$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[U,G]=u$(""),[q,L]=u$(!1),[O,W]=u$(""),[z,b]=u$(Y?"edit":"manual"),{focus:N}=g3(),T={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];i6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;N(`step-${J}`)},[J,N]);let _=q8(()=>{let B=T.indexOf(J);if(B<T.length-1)Z(T[B+1])}),k=q8(()=>{if(O)W("");if(J==="confirm"&&z==="ai"){Z("aiPrompt");return}let B=T.indexOf(J);if(B>0)Z(T[B-1]);else Q()}),P=q8(async()=>{L(!0),W("");try{let B=await _2.create(),y=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
41
-
42
- ## 可用工具列表
43
-
44
- - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
45
- - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
46
- - **Read**: 读取文件内容
47
- - **Write**: 写入/创建文件
48
- - **Edit**: 编辑文件(字符串替换)
49
- - **ApplyPatch**: 原子应用多文件文本补丁
50
- - **Bash**: 执行命令行命令
51
-
52
- ## 可用颜色
53
-
54
- - red, blue, green, yellow, purple, orange, pink, cyan
55
-
56
- ## 输出格式
57
-
58
- 你必须以 JSON 格式返回配置,格式如下:
59
-
60
- \`\`\`json
61
- {
62
- "name": "agent-name",
63
- "description": "简洁的一句话描述(英文)",
64
- "tools": ["Glob", "Grep", "Read"],
65
- "color": "blue",
66
- "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
67
- }
68
- \`\`\`
69
-
70
- ## 注意事项
71
-
72
- 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
73
- 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
74
- 3. **tools**: 根据任务选择必要的工具,不要选择太多
75
- 4. **color**: 选择一个合适的颜色用于 UI 区分
76
- 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
77
-
78
- **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,M=(await B.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
79
-
80
- ## 可用工具列表
81
-
82
- - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
83
- - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
84
- - **Read**: 读取文件内容
85
- - **Write**: 写入/创建文件
86
- - **Edit**: 编辑文件(字符串替换)
87
- - **ApplyPatch**: 原子应用多文件文本补丁
88
- - **Bash**: 执行命令行命令
89
-
90
- ## 可用颜色
91
-
92
- - red, blue, green, yellow, purple, orange, pink, cyan
93
-
94
- ## 输出格式
95
-
96
- 你必须以 JSON 格式返回配置,格式如下:
97
-
98
- \`\`\`json
99
- {
100
- "name": "agent-name",
101
- "description": "简洁的一句话描述(英文)",
102
- "tools": ["Glob", "Grep", "Read"],
103
- "color": "blue",
104
- "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
105
- }
106
- \`\`\`
107
-
108
- ## 注意事项
109
-
110
- 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
111
- 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
112
- 3. **tools**: 根据任务选择必要的工具,不要选择太多
113
- 4. **color**: 选择一个合适的颜色用于 UI 区分
114
- 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
115
-
116
- **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,U)).trim(),H=M.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(H)M=H[1];let S=JSON.parse(M);if(!S.name||!S.description||!S.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(S.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");K({name:S.name,description:S.description,tools:Array.isArray(S.tools)?S.tools:[],color:S.color||"blue",location:"project",systemPrompt:S.systemPrompt}),Z("confirm")}catch(B){W(B instanceof Error?B.message:String(B))}finally{L(!1)}});i6(()=>{if(J==="aiGenerating"&&!q&&!O)P()},[J,q,O,P]);let w=q8(async()=>{try{let B=X.location==="project"?OQ.join(d0(),".blade","agents"):OQ.join(j3.homedir(),".blade","agents");await o6.promises.mkdir(B,{recursive:!0});let y=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){y.push("tools:");for(let H of X.tools)y.push(` - ${H}`)}if(X.color)y.push(`color: ${X.color}`);y.push("---");let f=[y.join(`
117
- `),"",`# ${X.name} Subagent`,"",X.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
118
- `),M=OQ.join(B,`${X.name}.md`);await o6.promises.writeFile(M,f,"utf-8"),$()}catch(B){console.error("保存配置失败:",B)}}),C=k0(!1,Q);if(n6((B,y)=>{if(y.escape)k();else if(y.ctrl&&B==="c"||y.meta&&B==="c")C()},{isActive:J!=="tools"}),J==="mode")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(O8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(B)=>{if(B.value==="ai")b("ai"),Z("aiPrompt");else b("manual"),Z("name")}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j($0,{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(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j($0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(B2,{value:U,onChange:G,onSubmit:(B)=>{if(!B.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j($0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(O)return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"yellow",children:[j(m3,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:['根据你的描述:"',U,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{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 B=z==="edit";return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:["Step 1/7: ",B?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:B?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j($0,{color:"green",children:"名称: "},void 0,!1,void 0,this),B?j($0,{children:X.name},void 0,!1,void 0,this):j(B2,{value:X.name,onChange:(y)=>K({...X,name:y}),onSubmit:(y)=>{if(x3(y))return;_()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j($0,{dimColor:!0,children:B?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B&&j(B2,{value:"",onChange:()=>{},onSubmit:_,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j($0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(B2,{value:X.description,onChange:(B)=>K({...X,description:B}),onSubmit:(B)=>{if(!B.trim())return;_()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j($0,{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(u3,{config:X,setConfig:K,onNext:_,onPrev:k},void 0,!1,void 0,this);if(J==="color")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(O8,{items:c3,onSelect:(B)=>{let y=B.value==="none"?void 0:B.value;K({...X,color:y}),_()}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j($0,{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(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(O8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(B)=>{K({...X,location:B.value}),_()}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j($0,{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(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j($0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),j(B2,{value:X.systemPrompt,onChange:(B)=>K({...X,systemPrompt:B}),onSubmit:()=>_()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j($0,{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(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[j($0,{children:[j($0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),j($0,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j($0,{children:[j($0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),j($0,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j($0,{children:[j($0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),j($0,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j($0,{children:[j($0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),j($0,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j($0,{children:[j($0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),j($0,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j($0,{children:[j($0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),j($0,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(O8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(B)=>{if(B.value==="save")w();else if(B.value==="back")k();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function u3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=E3({id:"step-tools"});n6((K,U)=>{if(U.escape)J()},{isActive:Z});let X=(K)=>{if(K.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:K});Y()};return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(h3,{options:p3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import l3 from"node:fs";import{useMemoizedFn as w$}from"ahooks";import{Box as C0,Text as S0,useInput as d3}from"ink";import zQ from"ink-select-input";import{useEffect as r3,useMemo as t6,useState as z8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var _Q=10;function s6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=J8($),[X,K]=z8(Q),[U,G]=z8(null),[q,L]=z8(0),[O,W]=z8(0),z=w$(()=>{Z.clear(),Z.loadFromStandardLocations(),L((M)=>M+1)}),b=t6(()=>{return Z.getAllSubagents()},[q]),N=Math.ceil(b.length/_Q)||1,A=t6(()=>{let M=O*_Q;return b.slice(M,M+_Q)},[b,O]);r3(()=>{let M=Math.max(0,N-1);if(O>M)W(M)},[N,O]);let T=w$(()=>{if(O<N-1)W((M)=>M+1)}),_=w$(()=>{if(O>0)W((M)=>M-1)}),k=[{key:"list",label:"查看所有 Agents",value:"list"},{key:"create",label:"创建新 Agent",value:"create"},{key:"edit",label:"编辑 Agent",value:"edit"},{key:"delete",label:"删除 Agent",value:"delete"},{key:"cancel",label:"取消",value:"cancel"}],P=w$((M)=>{if(M.value==="cancel"){J?.();return}K(M.value)}),w=w$((M)=>{if(G(M.value),X==="edit")K("editWizard");else if(X==="delete")K("deleteConfirm")}),C=w$(async()=>{if(!U?.configPath)return;try{await l3.promises.unlink(U.configPath),z(),B()}catch(M){console.error("删除失败:",M)}}),B=w$(()=>{K("menu"),G(null)}),y=k0(!1,J);if(d3((M,H)=>{if(H.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")W(0),B();else if(X==="deleteConfirm")B()}else if(H.ctrl&&M==="c"||H.meta&&M==="c")y();else if(X==="list"){if(H.leftArrow||M==="h")_();else if(H.rightArrow||M==="l")T()}},{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(zQ,{items:k,onSelect:P},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),N>1&&i(S0,{color:"yellow",children:[" ","第 ",O+1,"/",N," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A.map((M)=>i(C0,{flexDirection:"column",paddingLeft:2,children:[i(C0,{children:i(S0,{children:[i(S0,{bold:!0,color:M.color||"white",children:["• ",M.name]},void 0,!0,void 0,this),i(S0,{color:"gray",children:[" - ",M.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.tools&&M.tools.length>0&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:["工具: ",M.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.configPath&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",dimColor:!0,children:M.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},M.name,!0,void 0,this)),i(C0,{marginTop:1,paddingLeft:2,children:N>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 f=(M)=>{if(b.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:M},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 H=b.map((S)=>({key:S.name,label:`${S.name} - ${S.description}`,value:S}));return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(zQ,{items:H,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(w2,{onComplete:()=>{z(),B()},onCancel:B},void 0,!1,void 0,this);if(X==="edit")return f("编辑 Agent");if(X==="editWizard"&&U){let M={name:U.name,description:U.description,tools:U.tools||[],color:U.color,location:U.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:U.systemPrompt||""};return i(w2,{initialConfig:M,onComplete:()=>{z(),B()},onCancel:B},void 0,!1,void 0,this)}if(X==="delete")return f("删除 Agent");if(X==="deleteConfirm"&&U)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:U.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:["文件路径: ",U.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(zQ,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(M)=>{if(M.value==="confirm")C();else B()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as l$,Text as O0}from"ink";import o3,{useEffect as i3,useState as n3}from"react";import{useEffect as a3,useState as e6}from"react";function J9($=d0(),Q=5000){let[Y,J]=e6(null),[Z,X]=e6(!0);return a3(()=>{let K=!0,U=async()=>{try{let q=await $9($);if(!K)return;if(!q){J(null),X(!1);return}let L=await Q9($);if(!K)return;J(L)}catch{if(K)J(null)}finally{if(K)X(!1)}};U();let G=null;if(Q>0)G=setInterval(U,Q);return()=>{if(K=!1,G)clearInterval(G)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as s,Fragment as w1}from"react/jsx-dev-runtime";var Z9=o3.memo(()=>{let $=h2(),Q=h$(),J=V2()==="shortcuts",Z=E4(),X=I1(),{branch:K}=J9(X),U=E2(),G=S4(),q=y4(),L=p2(),O=c2(),W=x2(),z=u2(),b=l2(),N=R4(),A=M4(),T=m2(),_=d4(),k=j$(),[P,w]=n3(null);i3(()=>{let H=!1;new NQ(X,k).get().then((n)=>{if(!H)w(n)}).catch(()=>{if(!H)w(null)});let E=NQ.subscribe((n)=>{if(!H&&n.sessionId===k&&n.workspaceRoot===X)w(n.goal)});return()=>{H=!0,E()}},[k,X]);let C=U?G8(U):!1,y=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return s(O0,{color:"magenta",children:[">> ","auto edit on ",s(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return s(O0,{color:"cyan",children:["‖ plan mode on ",s(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return s(O0,{color:"red",children:["yolo mode on ",s(O0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),f=y!==null,M=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return s(l$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?s(l$,{flexDirection:"column",gap:0,children:M.map((H,S)=>s(l$,{flexDirection:"row",children:[H.map((E,n)=>{let[r,o]=E.split(":");return s(l$,{flexDirection:"row",width:20,children:[s(O0,{color:"yellow",children:r},void 0,!1,void 0,this),s(O0,{color:"gray",children:":"},void 0,!1,void 0,this),s(O0,{color:"white",children:o},void 0,!1,void 0,this)]},n,!0,void 0,this)}),S===M.length-1&&s(O0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},S,!0,void 0,this))},void 0,!1,void 0,this):s(l$,{flexDirection:"row",gap:1,children:[K&&s(w1,{children:[s(O0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y,f&&s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),P&&s(w1,{children:[s(O0,{color:P.status==="active"?"green":P.status==="verifying"?"cyan":P.status==="blocked"||P.status==="budget_limited"?"yellow":"gray",children:["goal:",P.status," ",P.objective.slice(0,32),P.prematureStop?` recovery:${P.prematureStop.consecutiveCount}`:"",P.verificationStall?` verify-gap:${P.verificationStall.consecutiveCount}`:""]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(l$,{flexDirection:"row",gap:1,children:!$?s(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):s(w1,{children:[C&&s(w1,{children:[L?s(O0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):s(O0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&s(w1,{children:[s(O0,{color:W==="fast"?"yellow":"gray",children:["Speed ",W]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&s(w1,{children:[s(O0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b!=="auto"&&s(w1,{children:[s(O0,{color:"gray",children:["Style ",b]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&s(O0,{color:"gray",children:U.model},void 0,!1,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?s(O0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):s(O0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:A===void 0?"gray":"cyan",children:["Cache ",Y9(A)]},void 0,!0,void 0,this),N>0.001&&s(w1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"green",children:["$",N<0.01?N.toFixed(4):N.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T.length>0&&s(w1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"yellow",children:["已排队 ",T.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_>0&&s(w1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"cyan",children:["已恢复 ",_," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&s(w1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(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 FQ,Text as WQ}from"ink";import t3 from"react";import{jsxDEV as d$}from"react/jsx-dev-runtime";var X9=t3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),K=Q>=$.length;if(Q>=J&&!K)Z=Q-J+1,X=Q+1;let U=$.slice(Z,X),G=$.length>J;return d$(FQ,{flexDirection:"column",paddingX:2,paddingY:0,children:[U.map((q,L)=>{let W=Z+L===Q;return d$(FQ,{flexDirection:"row",paddingX:1,gap:2,children:[d$(WQ,{color:W?"cyan":"white",bold:W,children:q.command},void 0,!1,void 0,this),d$(WQ,{color:W?"cyan":"gray",dimColor:!W,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),G&&d$(FQ,{paddingX:1,children:d$(WQ,{color:K?"cyan":"gray",bold:K,dimColor:!K,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as F1,Text as S1,useInput as tZ,useStdout as sZ}from"ink";import eZ from"ink-select-input";import mQ,{useMemo as E9}from"react";import{Box as z0,Text as R0}from"ink";import A$,{useEffect as EQ,useMemo as b$,useRef as V9}from"react";import{Box as CQ,Text as L9}from"ink";import zZ from"react";import{Text as b1}from"ink";import UZ from"react";import F9 from"string-width";import b2 from"string-width";function HQ({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 s3=HQ();function LQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(s3,"")}var K9=($=0)=>(Q)=>`\x1B[${Q+$}m`,G9=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,U9=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,h0={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]}},lU=Object.keys(h0.modifier),e3=Object.keys(h0.color),$Z=Object.keys(h0.bgColor),dU=[...e3,...$Z];function QZ(){let $=new Map;for(let[Q,Y]of Object.entries(h0)){for(let[J,Z]of Object.entries(Y))h0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=h0[J],$.set(Z[0],Z[1]);Object.defineProperty(h0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(h0,"codes",{value:$,enumerable:!1}),h0.color.close="\x1B[39m",h0.bgColor.close="\x1B[49m",h0.color.ansi=K9(),h0.color.ansi256=G9(),h0.color.ansi16m=U9(),h0.bgColor.ansi=K9(10),h0.bgColor.ansi256=G9(10),h0.bgColor.ansi16m=U9(10),Object.defineProperties(h0,{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)=>h0.rgbToAnsi256(...h0.hexToRgb(Q)),enumerable:!1},ansi256ToAnsi:{value(Q){if(Q<8)return 30+Q;if(Q<16)return 90+(Q-8);let Y,J,Z;if(Q>=232)Y=((Q-232)*10+8)/255,J=Y,Z=Y;else{Q-=16;let U=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(U/6)/5,Z=U%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let K=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)K+=60;return K},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>h0.ansi256ToAnsi(h0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>h0.ansi256ToAnsi(h0.hexToAnsi256(Q)),enumerable:!1}}),h0}var JZ=QZ(),q9=JZ;var N8=new Set(["\x1B","›"]),YZ=39,wQ="\x07",_9="[",ZZ="]",N9="m",_8=`${ZZ}8;;`,O9=($)=>`${N8.values().next().value}${_9}${$}${N9}`,z9=($)=>`${N8.values().next().value}${_8}${$}${wQ}`,XZ=($)=>$.split(" ").map((Q)=>b2(Q)),BQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,K=b2(LQ($.at(-1)));for(let[U,G]of J.entries()){let q=b2(G);if(K+q<=Y)$[$.length-1]+=G;else $.push(G),K=0;if(N8.has(G))Z=!0,X=J.slice(U+1,U+1+_8.length).join("")===_8;if(Z){if(X){if(G===wQ)Z=!1,X=!1}else if(G===N9)Z=!1;continue}if(K+=q,K===Y&&U<J.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},KZ=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(b2(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},GZ=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,K=XZ($),U=[""];for(let[O,W]of $.split(" ").entries()){if(Y.trim!==!1)U[U.length-1]=U.at(-1).trimStart();let z=b2(U.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))U.push(""),z=0;if(z>0||Y.trim===!1)U[U.length-1]+=" ",z++}if(Y.hard&&K[O]>Q){let b=Q-z,N=1+Math.floor((K[O]-b-1)/Q);if(Math.floor((K[O]-1)/Q)<N)U.push("");BQ(U,W,Q);continue}if(z+K[O]>Q&&z>0&&K[O]>0){if(Y.wordWrap===!1&&z<Q){BQ(U,W,Q);continue}U.push("")}if(z+K[O]>Q&&Y.wordWrap===!1){BQ(U,W,Q);continue}U[U.length-1]+=W}if(Y.trim!==!1)U=U.map((O)=>KZ(O));let G=U.join(`
119
- `),q=[...G],L=0;for(let[O,W]of q.entries()){if(J+=W,N8.has(W)){let{groups:b}=new RegExp(`(?:\\${_9}(?<code>\\d+)m|\\${_8}(?<uri>.*)${wQ})`).exec(G.slice(L))||{groups:{}};if(b.code!==void 0){let N=Number.parseFloat(b.code);Z=N===YZ?void 0:N}else if(b.uri!==void 0)X=b.uri.length===0?void 0:b.uri}let z=q9.codes.get(Number(Z));if(q[O+1]===`
120
- `){if(X)J+=z9("");if(Z&&z)J+=O9(z)}else if(W===`
121
- `){if(Z&&z)J+=O9(Z);if(X)J+=z9(X)}L+=W.length}return J};function bQ($,Q,Y){return String($).normalize().replaceAll(`\r
122
- `,`
123
- `).split(`
124
- `).map((J)=>GZ(J,Q,Y)).join(`
125
- `)}var AQ=($)=>{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 F9(Q)};var W9=($)=>{return/[*_~`<[\]https?:]/.test($)},PQ=($)=>{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)=>F9(J)))},F8=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=bQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
126
- `).filter((K)=>K.length>0);return X.length>0?X:[""]},H9=($,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 N1,Fragment as OZ}from"react/jsx-dev-runtime";var yQ=2,RQ=1,MQ=2;function TQ($,Q){return`inline-${$}-${Q}`}var qZ=({text:$})=>{let Q=b0();if(!W9($))return N1(b1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,K=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,U;while((U=K.exec($))!==null){if(U.index>J){let O=$.slice(J,U.index);Y.push(N1(b1,{children:O},TQ("text",Z++),!1,void 0,this))}let G=U[0],q=null,L=TQ("match",X++);try{if(G.startsWith("**")&&G.endsWith("**")&&G.length>yQ*2)q=N1(b1,{bold:!0,children:G.slice(yQ,-yQ)},L,!1,void 0,this);else if(G.length>RQ*2&&(G.startsWith("*")&&G.endsWith("*")||G.startsWith("_")&&G.endsWith("_"))){let O=$.substring(U.index-1,U.index),W=$.substring(K.lastIndex,K.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(W)||/[./\\]/.test(O+W)))q=N1(b1,{italic:!0,children:G.slice(RQ,-RQ)},L,!1,void 0,this)}else if(G.startsWith("~~")&&G.endsWith("~~")&&G.length>MQ*2)q=N1(b1,{strikethrough:!0,children:G.slice(MQ,-MQ)},L,!1,void 0,this);else if(G.startsWith("`")&&G.endsWith("`")){let O=G.match(/^(`+)([^`]+)\1$/);if(O&&O[2])q=N1(b1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},L,!1,void 0,this)}else if(G.startsWith("[")&&G.includes("](")&&G.endsWith(")")){let O=G.match(/\[(.*?)\]\((.*?)\)/);if(O){let W=O[1],z=O[2];q=N1(b1,{children:[W,N1(b1,{color:Q.colors.info,children:[" (",z,")"]},void 0,!0,void 0,this)]},L,!0,void 0,this)}}else if(G.match(/^https?:\/\//))q=N1(b1,{color:Q.colors.info,children:G},L,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",G,O),q=null}Y.push(q??N1(b1,{children:G},L,!1,void 0,this)),J=K.lastIndex}if(J<$.length){let G=$.slice(J);Y.push(N1(b1,{children:G},TQ("text",Z++),!1,void 0,this))}return N1(OZ,{children:Y.filter((G)=>G!==null)},void 0,!1,void 0,this)},A1=UZ.memo(qZ);import{jsxDEV as r$}from"react/jsx-dev-runtime";var _Z="▎",B9=zZ.memo(({lines:$,level:Q})=>{let Y=b0(),J=_Z.repeat(Q);return r$(CQ,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return r$(CQ,{height:1},X,!1,void 0,this);return r$(CQ,{flexDirection:"row",children:[r$(L9,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),r$(L9,{italic:!0,wrap:"wrap",children:r$(A1,{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 H8,Text as p1}from"ink";import{isPlainObject as SQ}from"lodash-es";import{common as PZ,createLowlight as yZ}from"lowlight";import{LRUCache as RZ}from"lru-cache";import M9 from"react";import{Box as W8,Text as A2}from"ink";import m1,{Fragment as y9}from"react";import{LRUCache as P9}from"lru-cache";import NZ from"string-width";var FZ=1024,WZ=1048576,w9=1000,b9=new P9({max:FZ,maxSize:WZ,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+$.length*8)});function IQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=w9){let J=b9.get($);if(J)return J}let Y=Array.from($);if($.length<=w9)b9.set($,Y);return Y}var HZ=2048,LZ=524288,BZ=4096,A9=new P9({max:HZ,maxSize:LZ,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+8)});function g1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let Q=A9.get($);if(Q!==void 0)return Q;let Y=NZ($);if($.length<=BZ)A9.set($,Y);return Y}import{jsxDEV as a$}from"react/jsx-dev-runtime";var fQ=2,R9=m1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=b0(),K=[],U=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),fQ);function G(N){if(!m1.isValidElement(N))return;if(N.type===y9){m1.Children.forEach(N.props.children,G);return}if(N.type===W8){bZ(N,Q,K);return}}m1.Children.forEach($,G);let L=K.length>U||Z>0?U-1:U,O=L!==void 0?Math.max(0,K.length-L):0,W=O+Z,b=(O>0?J==="top"?K.slice(O):K.slice(0,L):K).map((N,A)=>a$(W8,{children:N.length>0?N.map((T,_)=>a$(A2,{...T.props,children:T.text},_,!1,void 0,this)):a$(A2,{children:" "},void 0,!1,void 0,this)},A,!1,void 0,this));return a$(W8,{flexDirection:"column",width:Q,flexShrink:0,children:[W>0&&J==="top"&&a$(A2,{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"&&a$(A2,{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 wZ($){if(!m1.isValidElement($)||$.type!==W8)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 q=String(Z);if(!q)return;let L={text:q,props:X??{}};if(X===void 0||X.wrap==="wrap")Y=!0,Q.segments.push(L);else if(!Y)Q.noWrapSegments.push(L);else Q.segments.push(L);return}if(!m1.isValidElement(Z))return;if(Z.type===y9){m1.Children.forEach(Z.props.children,(q)=>J(q,X));return}if(Z.type!==A2)return;let{children:K,...U}=Z.props,G=X===void 0?U:{...X,...U};m1.Children.forEach(K,(q)=>J(q,G))}return m1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function bZ($,Q,Y){let J=wZ($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=g1(O.text);if(J.segments.length===0){let O=[],W=[];for(let z of J.noWrapSegments){let b=z.text.split(`
127
- `);for(let N=0;N<b.length;N++){if(N>0)O.push(W),W=[];if(b[N])W.push({text:b[N],props:z.props})}}if(W.length>0)O.push(W);for(let z of O)Y.push(z);return}let X=Q-Z;if(X<1){AZ(J.noWrapSegments,Q,Y);return}let K=[],U=[],G=0;function q(){if(K.length===0)K.push([...J.noWrapSegments,...U]);else if(Z>0)K.push([{text:" ".repeat(Z),props:{}},...U]);else K.push(U);U=[],G=0}function L(O,W){if(U.length>0&&U[U.length-1].props===W)U[U.length-1].text+=O;else U.push({text:O,props:W})}for(let O of J.segments){let W=O.text.split(`
128
- `);for(let z=0;z<W.length;z++){if(z>0)q();let N=W[z].split(/(\s+)/);for(let A of N){if(!A)continue;let T=g1(A);if(G+T>X&&G>0){if(q(),/^\s+$/.test(A))continue}if(T>X){let k=IQ(A);while(k.length>0){let P=0,w=0;for(let C of k){let B=g1(C);if(G+w+B>X)break;w+=B,P++}if(P>0){let C=k.slice(0,P).join("");L(C,O.props),G+=g1(C),k=k.slice(P)}if(k.length>0)q()}}else L(A,O.props),G+=T}}if(O.text.endsWith(`
129
- `))q()}if(U.length>0)q();for(let O of K)Y.push(O)}function AZ($,Q,Y){let J=[],Z=[],X=0;for(let K of $){let U=K.text.split(`
130
- `);for(let G=0;G<U.length;G++){if(G>0)J.push(Z),Z=[],X=0;let q=U[G];if(!q)continue;let L=g1(q),O=Math.max(0,Q-g1("…"));if(L<=O&&X===0)Z.push({text:q,props:K.props}),X+=L;else{let W=IQ(q),z=X,b=0;for(let A of W){let T=g1(A);if(z+T>O)break;z+=T,b++}let N=W.slice(0,b).join("");if(N)Z.push({text:N,props:K.props});Z.push({text:"…",props:{}}),X=z+g1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let K of J)Y.push(K)}import{jsxDEV as X1}from"react/jsx-dev-runtime";var kQ=yZ(PZ),MZ=200,TZ=524288,CZ=4096,T9=new RZ({max:MZ,maxSize:TZ,sizeCalculation:($)=>$.retainedChars});function C9($,Q){return`${Q??"__auto__"}\x00${$}`}function IZ($,Q){return T9.get(C9($,Q))?.root}function fZ($,Q,Y){if($.length>CZ)return;let J=Q?.length??0;T9.set(C9($,Q),{root:Y,retainedChars:Math.max(1,$.length*2+J)})}function kZ($){return SQ($)&&$.type==="text"&&typeof $.value==="string"}function SZ($){return SQ($)&&$.type==="element"}function vZ($){return SQ($)&&$.type==="root"&&Array.isArray($.children)}function L8($,Q,Y=0){if(kZ($))return X1(p1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(SZ($)){let J=$.properties?.className?.[0]||"",Z=Q.default;if(J.includes("comment"))Z=Q.comment;else if(J.includes("string"))Z=Q.string;else if(J.includes("number"))Z=Q.number;else if(J.includes("keyword"))Z=Q.keyword;else if(J.includes("function"))Z=Q.function;else if(J.includes("variable"))Z=Q.variable;else if(J.includes("operator"))Z=Q.operator;else if(J.includes("type"))Z=Q.type;else if(J.includes("tag"))Z=Q.tag;else if(J.includes("attr"))Z=Q.attr;let X=$.children?.map((K,U)=>L8(K,Q,U));return X1(p1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(vZ($))return X1(M9.Fragment,{children:$.children.map((J,Z)=>L8(J,Q,Z))},Y,!1,void 0,this);return X1(p1,{},Y,!1,void 0,this)}function DZ($,Q,Y){let J=Y||a0.getTheme().colors.syntax;try{let Z=IZ($,Q);if(Z)return L8(Z,J);let X;if(!Q||!kQ.registered(Q))X=kQ.highlightAuto($);else X=kQ.highlight(Q,$);let K=X;if(!K.children||K.children.length===0)return X1(p1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return fZ($,Q,X),L8(X,J)}catch(Z){return X1(p1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var B8=M9.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=b0(),K=$.split(`
131
- `),U=0;if(Z&&K.length>Z){let O=Math.max(Z,fQ);if(K.length>O)U=K.length-O,K=K.slice(U)}let G=K.length+U,q=String(G).length+1,L=Math.max(20,J-4);return X1(H8,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&X1(H8,{marginBottom:0,children:X1(p1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),U>0&&X1(H8,{marginBottom:0,children:X1(p1,{color:X.colors.text.muted,dimColor:!0,children:["... ",U," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(R9,{maxWidth:L,maxHeight:Z,children:K.map((O,W)=>{let z=W+U+1;return X1(H8,{flexDirection:"row",children:[Y&&X1(p1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(z).padStart(q-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?X1(p1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):DZ(O,Q,X.colors.syntax)]},W,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as I9,Text as O1,useInput as VZ}from"ink";import jZ,{useState as hZ}from"react";import{jsxDEV as K1}from"react/jsx-dev-runtime";var f9=400;function EZ($){let Q=$.split(`
132
- `),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let K=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(K)J=parseInt(K[1],10),Z=parseInt(K[3],10);Y.push({type:"header",content:X});continue}if(X.startsWith("-")){Y.push({type:"remove",content:X.substring(1),lineNumber:J}),J++;continue}if(X.startsWith("+")){Y.push({type:"add",content:X.substring(1),lineNumber:Z}),Z++;continue}if(X.startsWith(" ")||X===""){Y.push({type:"context",content:X.substring(1),lineNumber:Z}),J++,Z++;continue}}return Y}var vQ=jZ.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let K=b0(),U=EZ($),[G,q]=hZ(!1);VZ((_)=>{if(_.toLowerCase()==="e")q((k)=>!k)},{isActive:X&&U.length>Z});let O=Math.max(...U.map((_)=>_.lineNumber||0)).toString().length+1,W=U.filter((_)=>_.type==="add").length,z=U.filter((_)=>_.type==="remove").length,b=U.length,N=b>Z,A;if(!N)A=U;else if(G)A=U.slice(0,f9);else A=U.slice(0,Z);let T=b-A.length;return K1(I9,{flexDirection:"column",marginTop:1,marginBottom:1,children:[K1(O1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),N&&K1(O1,{color:K.colors.info,children:[G?`已展开 ${A.length}/${b} 行`:`显示前 ${Z} 行,共 ${b} 行`," · ",K1(O1,{color:K.colors.success,children:["+",W]},void 0,!0,void 0,this)," ",K1(O1,{color:K.colors.error,children:["-",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N&&K1(O1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),A.map((_,k)=>{if(_.type==="header")return K1(O1,{color:K.colors.muted,dimColor:!0,children:_.content},k,!1,void 0,this);let P=_.lineNumber?_.lineNumber.toString().padStart(O," "):" ".repeat(O),w=" ",C,B;if(_.type==="add")w="+",B=K.colors.success,C=void 0;else if(_.type==="remove")w="-",B=K.colors.error,C=void 0;else B=K.colors.text.primary;let y=Math.max(0,J-O-2),f=_.content;if(f.length>y)f=f.substring(0,y-3)+"...";return K1(O1,{color:B,backgroundColor:C,children:[K1(O1,{dimColor:!0,children:P},void 0,!1,void 0,this),K1(O1,{children:w},void 0,!1,void 0,this),K1(O1,{children:[" ",f]},void 0,!0,void 0,this)]},k,!0,void 0,this)}),N&&K1(I9,{marginTop:1,children:G?K1(O1,{color:K.colors.info,dimColor:!0,children:[T>0?`已达显示上限 ${f9} 行,仍有 ${T} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):K1(O1,{color:K.colors.info,dimColor:!0,children:["已隐藏剩余 ",T," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),K1(O1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as DQ,Text as k9}from"ink";import gZ from"react";import{jsxDEV as o$}from"react/jsx-dev-runtime";var mZ=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,K=J.length;return o$(DQ,{paddingLeft:K+1,flexDirection:"row",children:[o$(DQ,{width:X,children:o$(k9,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),o$(DQ,{flexGrow:1,children:o$(k9,{wrap:"wrap",children:o$(A1,{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)},VQ=gZ.memo(mZ);import{Text as jQ}from"ink";import pZ,{useMemo as cZ}from"react";import S9 from"string-width";import{jsxDEV as hQ}from"react/jsx-dev-runtime";var v9=4,i$=3,xZ=4,D9=pZ.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=b0(),Z=cZ(()=>{if($.length===0||Q.length===0)return null;let O=$.length,W=$.map((B,y)=>{let f=Math.max(PQ(B),i$);for(let M of Q)f=Math.max(f,PQ(M[y]||""));return f}),z=$.map((B,y)=>{let f=Math.max(AQ(B),i$);for(let M of Q)f=Math.max(f,AQ(M[y]||""));return f}),b=1+O*3,N=Math.max(Y-b-v9,O*i$),A=W.reduce((B,y)=>B+y,0),T=z.reduce((B,y)=>B+y,0),_=!1,k;if(T<=N)k=z;else if(A<=N){let B=N-A,y=z.map((M,H)=>M-W[H]),f=y.reduce((M,H)=>M+H,0);k=W.map((M,H)=>{if(f===0)return M;let S=Math.floor(y[H]/f*B);return M+S})}else{_=!0;let B=N/A;k=W.map((y)=>Math.max(Math.floor(y*B),i$))}function P(){let B=1;for(let y=0;y<$.length;y++){let f=F8($[y],k[y],_);B=Math.max(B,f.length)}for(let y of Q)for(let f=0;f<y.length;f++){let M=F8(y[f]||"",k[f],_);B=Math.max(B,M.length)}return B}if(P()>xZ)return{type:"vertical",columnWidths:k,needsHardWrap:_};return{type:"horizontal",columnWidths:k,needsHardWrap:_}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),W="─".repeat(O);return hQ(jQ,{children:Q.map((z,b)=>{let N=[];if(b>0)N.push(W);return z.forEach((A,T)=>{let _=$[T]||`Column ${T+1}`,k=(A||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${_}:\x1B[22m ${k}`)}),N.join(`
133
- `)}).join(`
134
- `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:K}=Z;function U(O){let z={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],b=z.left;return X.forEach((N,A)=>{b+=z.h.repeat(N+2),b+=A<X.length-1?z.mid:z.right}),b}function G(O,W){let z=O.map((T,_)=>{let k=X[_]||i$;return F8(T||"",k,K)}),b=Math.max(...z.map((T)=>T.length),1),N=z.map((T)=>Math.floor((b-T.length)/2)),A=[];for(let T=0;T<b;T++){let _="│";for(let k=0;k<O.length;k++){let P=z[k],w=N[k],C=T-w,B=C>=0&&C<P.length?P[C]:"",y=X[k]||i$,f=S9(B),M=H9(W?`\x1B[1m${B}\x1B[22m`:B,f,y,W?"center":"left");_+=` ${M} │`}A.push(_)}return A}let q=[];if(q.push(U("top")),q.push(...G($,!0)),q.push(U("middle")),Q.forEach((O,W)=>{if(q.push(...G(O,!1)),W<Q.length-1)q.push(U("middle"))}),q.push(U("bottom")),Math.max(...q.map((O)=>S9(O)))>Y-v9){let O=Math.min(Y-1,40),W="─".repeat(O);return hQ(jQ,{children:Q.map((z,b)=>{let N=[];if(b>0)N.push(W);return z.forEach((A,T)=>{let _=$[T]||`Column ${T+1}`,k=(A||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${_}:\x1B[22m ${k}`)}),N.join(`
135
- `)}).join(`
136
- `)},void 0,!1,void 0,this)}return hQ(jQ,{color:J.colors.text.primary,children:q.join(`
137
- `)},void 0,!1,void 0,this)});import{jsxDEV as g}from"react/jsx-dev-runtime";var uZ=($,Q,Y)=>{switch($){case"user":return{color:Q.info,prefix:"> "};case"assistant":return{color:Q.success,prefix:"• "};case"system":return{color:Q.warning,prefix:" "};case"tool":{let J=Y&&"phase"in Y?Y.phase:void 0;return{color:Q.text.secondary,prefix:J==="start"?"• ":J==="complete"?" └ ":" "}}default:return{color:Q.text.primary,prefix:" "}}},lZ=A$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=b0();if(J&&Z!==void 0){let K=$.split(`
138
- `),U=4,G=Math.max(1,Z-4);if(K.length>G){let q=K.slice(0,G).join(`
139
- `);return g(z0,{flexDirection:"column",flexShrink:0,children:[g(B8,{content:q,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),g(R0,{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(B8,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),dZ=A$.memo(({content:$,level:Q})=>{let Y=b0();switch(Q){case 1:return g(R0,{bold:!0,color:Y.colors.primary,children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return g(R0,{bold:!0,color:Y.colors.primary,children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return g(R0,{bold:!0,color:Y.colors.text.primary,children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return g(R0,{italic:!0,color:Y.colors.text.muted,children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return g(R0,{children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),rZ=A$.memo(({terminalWidth:$})=>{let Q=b0(),Y=Math.max(0,Math.min($-4,80));return g(R0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),aZ=A$.memo(({content:$})=>{return g(R0,{wrap:"wrap",children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),oZ=A$.memo(({content:$})=>{let Q=b0();return g(z0,{flexDirection:"row",gap:1,children:[g(R0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),g(R0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),iZ=A$.memo(({detail:$,terminalWidth:Q})=>{let Y=b0(),J=50,Z=$.split(`
140
- `);while(Z.length>0&&Z[0].trim()==="")Z.shift();while(Z.length>0&&Z[Z.length-1].trim()==="")Z.pop();let X=Z.length>50,K=X?Z.slice(0,50):Z,U=K.join(`
141
- `),G=U.includes("<<<DIFF>>>"),q=U.includes("```");if(G){let L=U.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(L)try{let O=JSON.parse(L[1]);return g(z0,{flexDirection:"column",children:[g(vQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&g(z0,{marginTop:1,children:g(R0,{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(q){let L=U.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(L){let O=L[1]||"text",W=L[2];return g(z0,{flexDirection:"column",children:[g(B8,{content:W,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&g(z0,{marginTop:1,children:g(R0,{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:[K.map((L,O)=>g(R0,{color:Y.colors.text.primary,children:L},O,!1,void 0,this)),X&&g(z0,{marginTop:1,children:g(R0,{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 nZ($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),K=Math.max(40,J*0.8),U=X*K;if($.length<=U)return{content:$,isTruncated:!1,hiddenLines:0};let G=Math.floor(U*0.9),q=$.length-G,L=q,O=$.indexOf(`
142
- `,q);if(O!==-1&&O-q<K)L=O+1;let W=$.slice(L),b=($.slice(0,L).match(/\n/g)||[]).length+1;return{content:W,isTruncated:!0,hiddenLines:b}}var k1=A$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:K=!1,noMargin:U=!1,renderPlainTextOnly:G=!1,streamingLines:q,streamingHiddenLines:L,messageId:O,blocksOverride:W,currentLineOverride:z,streamingMode:b="text",renderCodeBlocksAsPlainText:N=!1})=>{let A=b0(),T=W!==void 0,_=b$(()=>uZ(Q,A.colors,J),[Q,A.colors,J]),{color:k,prefix:P}=_,w=P.length+1,C=b$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let F=J.subtaskRef;if(!F||typeof F!=="object")return null;return F},[J]),B=Q==="tool"&&J?.phase==="start",y=!U&&!B,f=b$(()=>{if(!G)return[];return $.split(/\r?\n/)},[$,G]);if(!T&&Z){let F=q??$.split(/\r?\n/),R=L??0,V=!1,I=!1,v=!1;if(b!=="text")V=b==="code",I=b==="diff",v=b==="table";return g(z0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[R>0&&g(z0,{flexDirection:"row",flexShrink:0,children:[g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(R0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",R," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.map((h,Q0)=>{if(b==="text"){if(h.match(J$.codeBlock))V=!V;else if(h.match(J$.diffStart))I=!0;else if(h.match(J$.diffEnd))I=!1;else if(h.match(J$.table))v=!0;else if(v&&!h.match(J$.table))v=!1}let e=b==="text"&&!V&&!I&&!v,X0=e?h.match(J$.ulItem):null,A0=e?h.match(J$.olItem):null,D0=X0??A0;return g(z0,{flexDirection:"row",flexShrink:0,children:[Q0===0&&!K?g(z0,{marginRight:1,flexShrink:0,children:g(R0,{color:k,bold:!0,children:P},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:D0?g(VQ,{type:X0?"ul":"ol",marker:D0[2],itemText:D0[3],leadingWhitespace:D0[1]},void 0,!1,void 0,this):g(R0,{wrap:"wrap",children:h===""?" ":h},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},Q0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!T&&G)return g(z0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:f.map((F,R)=>g(z0,{flexDirection:"row",flexShrink:0,children:[R===0&&!K?g(z0,{marginRight:1,flexShrink:0,children:g(R0,{color:k,bold:!0,children:P},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(R0,{wrap:"wrap",children:F===""?" ":F},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R,!0,void 0,this))},void 0,!1,void 0,this);let M=V9(null);EQ(()=>{M.current=null},[O]);let H=b$(()=>{if(T)return null;if(!O)return null;return j9(O)},[O,T]);EQ(()=>{if(T)return;if(!H||!O)return;M.current={messageId:O,blocks:H}},[H,O,T]),EQ(()=>{if(T)return;if(!H||!O)return;h9(O)},[H,O,T]);let S=b$(()=>T?{content:$,isTruncated:!1,hiddenLines:0}:nZ($,X,Z,Y),[$,X,Z,Y,T]),{content:E,isTruncated:n,hiddenLines:r}=S;if(!T&&Q==="tool"&&J&&"detail"in J){let F=J;if(F.detail)return g(z0,{flexDirection:"column",marginBottom:U?0:1,children:[g(z0,{flexDirection:"row",children:[g(z0,{marginRight:1,children:g(R0,{color:k,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(R0,{color:k,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(z0,{marginLeft:P.length+1,children:g(iZ,{detail:F.detail,terminalWidth:Y-(P.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:o,currentLine:l}=b$(()=>{if(T)return{completedContent:"",currentLine:z??""};if(!Z)return{completedContent:E,currentLine:""};let F=E.lastIndexOf(`
143
- `);if(F===-1)return{completedContent:"",currentLine:E};return{completedContent:E.slice(0,F+1),currentLine:E.slice(F+1)}},[E,Z,T,z]),p=V9({content:"",blocks:[]}),d=b$(()=>{if(T)return W??[];if(H)return H;if(M.current&&M.current.messageId===O)return M.current.blocks;let F=p.current;if(!Z||!o.startsWith(F.content)){let v=gQ(o);return p.current={content:o,blocks:v},v}if(o===F.content)return F.blocks;let R=o.slice(F.content.length),V=gQ(R),I=[...F.blocks,...V];return p.current={content:o,blocks:I},I},[o,Z,T,W]);return g(z0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[n&&g(z0,{flexDirection:"row",flexShrink:0,children:[g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(R0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",r," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),d.map((F,R)=>{if(F.type==="empty")return g(z0,{height:1,flexShrink:0},R,!1,void 0,this);return g(z0,{flexDirection:"row",flexShrink:0,children:[R===0&&!K&&g(z0,{marginRight:1,flexShrink:0,children:g(R0,{color:k,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),(R>0||K)&&g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:F.type==="code"?N?g(R0,{wrap:"wrap",children:F.content},void 0,!1,void 0,this):g(lZ,{content:F.content,language:F.language,terminalWidth:Y-w,isPending:Z,availableHeight:X},void 0,!1,void 0,this):F.type==="table"&&F.tableData?g(D9,{headers:F.tableData.headers,rows:F.tableData.rows,terminalWidth:Y-w},void 0,!1,void 0,this):F.type==="heading"?g(dZ,{content:F.content,level:F.level||1},void 0,!1,void 0,this):F.type==="list"?g(VQ,{type:F.listType||"ul",marker:F.marker||"-",itemText:F.content,leadingWhitespace:" ".repeat(F.indentation||0)},void 0,!1,void 0,this):F.type==="hr"?g(rZ,{terminalWidth:Y-w},void 0,!1,void 0,this):F.type==="diff"&&F.diffData?g(vQ,{patch:F.diffData.patch,startLine:F.diffData.startLine,matchLine:F.diffData.matchLine,terminalWidth:Y-w},void 0,!1,void 0,this):F.type==="command-message"?g(oZ,{content:F.content},void 0,!1,void 0,this):F.type==="blockquote"&&F.blockquoteLines?g(B9,{lines:F.blockquoteLines,level:F.blockquoteLevel||1},void 0,!1,void 0,this):g(aZ,{content:F.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R,!0,void 0,this)}),l&&g(z0,{flexDirection:"row",flexShrink:0,children:[d.length===0&&!K?g(z0,{marginRight:1,flexShrink:0,children:g(R0,{color:k,bold:!0,children:P},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(R0,{wrap:"wrap",children:l},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C&&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(R0,{color:A.colors.text.muted,children:["Subtask"," ",typeof C.agentType==="string"?`@${C.agentType}`:"",typeof C.status==="string"?` · ${C.status}`:""]},void 0,!0,void 0,this),typeof C.summary==="string"&&C.summary.trim()!==""&&g(R0,{wrap:"wrap",children:C.summary},void 0,!1,void 0,this),typeof C.childSessionId==="string"&&g(R0,{color:A.colors.text.muted,children:["Session ",C.childSessionId]},void 0,!0,void 0,this),typeof C.resumedFrom==="string"&&g(R0,{color:A.colors.text.muted,children:["Resumed from ",C.resumedFrom,typeof C.resumeDepth==="number"?` · depth ${C.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 Y5}from"react/jsx-dev-runtime";var $5=mQ.memo(({label:$,isSelected:Q})=>I0(S1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),Q5=mQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(Y5,{children:[I0(F1,{marginBottom:1,children:I0(S1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&I0(F1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[I0(S1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(F1,{marginTop:1,children:I0(k1,{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(F1,{flexDirection:"column",marginBottom:1,children:I0(k1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&I0(F1,{flexDirection:"column",marginBottom:1,children:[I0(S1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,K)=>I0(F1,{marginLeft:2,children:I0(S1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&I0(F1,{flexDirection:"column",marginBottom:1,children:[I0(S1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,K)=>I0(F1,{marginLeft:2,children:I0(S1,{children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this)),$.affectedFiles.length>3&&I0(F1,{marginLeft:2,children:I0(S1,{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 J5($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var g9=mQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=sZ(),J=Y.columns||80,X=e0()==="confirmation-prompt",K=k0(!1),U=$.type==="exitPlanMode",G=$.type==="enterPlanMode",q=$.type==="maxTurnsExceeded",L=$.type==="mcpSampling";tZ((z,b)=>{if(b.ctrl&&z==="c"||b.meta&&z==="c"){K();return}if(b.escape){Q({approved:!1,reason:"用户取消"});return}let N=z.toLowerCase();if(U){if(N==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(N==="s"){Q({approved:!0,targetMode:"default"});return}if(N==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(G){if(N==="y"){Q({approved:!0});return}if(N==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(q){if(N==="y"){Q({approved:!0});return}if(N==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(L){if(N==="y"){Q({approved:!0,scope:"once"});return}if(N==="n"){Q({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(N==="y"){Q({approved:!0,scope:"once"});return}if(N==="s"){Q({approved:!0,scope:"session"});return}if(N==="p"){Q({approved:!0,scope:"project"});return}if(N==="n"){Q({approved:!1,reason:"用户拒绝"});return}}},{isActive:X});let O=E9(()=>{if(U)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(G)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(q)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(L)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:"用户拒绝"}}]},[U,G,q,L]),W=E9(()=>{if(U)return{color:"cyan",title:"方案审核"};if(G)return{color:"magenta",title:"进入规划模式"};if(q)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[U,G,q,$.title]);return I0(F1,{flexDirection:"column",borderStyle:"round",borderColor:X?W.color:"gray",padding:1,children:[I0(F1,{marginBottom:1,children:I0(S1,{bold:!0,color:W.color,children:W.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(Q5,{details:$,headerColor:W.color,isPlanModeExit:U,isPlanModeEnter:G,terminalWidth:J},void 0,!1,void 0,this),I0(F1,{flexDirection:"column",children:[I0(S1,{color:"gray",children:J5(U,G,q,L)},void 0,!1,void 0,this),I0(eZ,{items:O,isFocused:X,itemComponent:$5,onSelect:(z)=>{Q(z.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as w0,Text as U0,useInput as Z5}from"ink";import m9 from"ink-text-input";import{useState as c1}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var P2=[{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"}],w8=[{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"}],b8=[{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"}],X5=[`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"],p9=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=a0.getTheme(),[X,K]=c1("action"),[U,G]=c1(0),[q,L]=c1(0),[O,W]=c1(0),[z,b]=c1(""),[N,A]=c1(""),[T,_]=c1(null),[k,P]=c1(!1),[w,C]=c1(null),B=P2[U],y=b8[q],f=w8[O],M=()=>{if(w){C(null);return}switch(X){case"action":Y();break;case"event":K("action");break;case"matcher":K("event");break;case"command":K("matcher");break;case"location":K("command");break;case"confirm":K("location");break}};Z5((d,F)=>{if(F.escape){M();return}if(X==="action"){if(F.upArrow)G((R)=>R>0?R-1:P2.length-1);else if(F.downArrow)G((R)=>R<P2.length-1?R+1:0);else if(F.return)H()}else if(X==="event"){if(F.upArrow)L((R)=>R>0?R-1:b8.length-1);else if(F.downArrow)L((R)=>R<b8.length-1?R+1:0);else if(F.return)K("matcher")}else if(X==="location"){if(F.upArrow)W((R)=>R>0?R-1:w8.length-1);else if(F.downArrow)W((R)=>R<w8.length-1?R+1:0);else if(F.return)K("confirm")}else if(X==="confirm"){if(F.return)p()}});let H=()=>{let d=P2[U].action;if(d==="add")K("event");else if(d==="status")S();else if(d==="list")r();else if(d==="enable")q1.getInstance().enableSession(Q,$),C("Hooks enabled for this session");else if(d==="disable")q1.getInstance().disableSession(Q,$),C("Hooks disabled for this session");else if(d==="trust")E();else if(d==="revoke")n()},S=async()=>{let d=q1.getInstance(),F=d.isEnabled($,Q),R=d.getConfig($),V=await d.getTrustStatus($),I={};for(let h of Object.values(cQ)){let Q0=R[h];if(Q0&&Array.isArray(Q0)){let e=Q0.reduce((X0,A0)=>X0+(A0.hooks?.length||0),0);if(e>0)I[h]=e}}let v=[`Status: ${F?"Enabled":"Disabled"}`,`Trust: ${V.state}`,`Digest: ${V.currentDigest??"none"}`,""];if(Object.keys(I).length>0){v.push("Configured hooks:");for(let[h,Q0]of Object.entries(I))v.push(` ${h}: ${Q0} hook(s)`)}else v.push("No hooks configured");C(v.join(`
144
- `))},E=async()=>{try{let d=await q1.getInstance().trustProject($);C(`Trust: ${d.state}
145
- Digest: ${d.currentDigest??"none"}`)}catch(d){_(d instanceof Error?d.message:"Failed to trust hooks")}},n=async()=>{try{let d=await q1.getInstance().revokeProjectTrust($);C(`Trust: ${d.state}`)}catch(d){_(d instanceof Error?d.message:"Failed to revoke hook trust")}},r=()=>{let F=q1.getInstance().getConfig($),R=[],V=!1;for(let I of Object.values(cQ)){let v=F[I];if(!v||!Array.isArray(v)||v.length===0)continue;V=!0,R.push(`${I}:`);for(let h of v){let Q0=h.matcher,e="all";if(Q0?.tools)e=`tools: ${Array.isArray(Q0.tools)?Q0.tools.join(", "):Q0.tools}`;R.push(` [${e}]`);for(let X0 of h.hooks||[])if(X0.type==="command")R.push(` -> ${X0.command}`)}R.push("")}if(!V)R.push("No hooks configured"),R.push(""),R.push("Configure hooks in .blade/settings.local.json");C(R.join(`
146
- `))},o=()=>{K("command")},l=()=>{if(!N.trim()){_("Command cannot be empty");return}_(null),K("location")},p=async()=>{P(!0),_(null);try{let d=q1.getInstance(),F=await import("node:fs/promises"),R=await import("node:path"),V=await import("node:os"),I={matcher:z.trim()?{tools:z.trim()}:{},hooks:[{type:"command",command:N.trim()}]},v;switch(f.location){case"local":v=R.join($,".blade","settings.local.json");break;case"project":v=R.join($,".blade","settings.json");break;case"user":v=R.join(V.homedir(),".blade","settings.json");break}await F.mkdir(R.dirname(v),{recursive:!0});let h={};try{let A0=await F.readFile(v,"utf-8");h=JSON.parse(A0)}catch{}let Q0=h.hooks||{},e=Q0[y.event]||[],X0={...Q0,enabled:!0,[y.event]:[...e,I]};if(h.hooks=X0,await F.writeFile(v,JSON.stringify(h,null,2),"utf-8"),await d.reloadConfig($),J)J({event:y.event,matcher:z.trim(),command:N.trim()});Y()}catch(d){_(`Failed to save hook: ${d instanceof Error?d.message:"Unknown error"}`),P(!1)}};return c(w0,{flexDirection:"column",padding:1,children:[c(w0,{marginBottom:1,children:c(U0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginBottom:1,children:c(U0,{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&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(U0,{children:w},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(U0,{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&&c(w0,{flexDirection:"column",children:[c(w0,{flexDirection:"column",marginTop:1,children:P2.map((d,F)=>c(w0,{children:[c(U0,{color:F===U?Z.colors.primary:void 0,bold:F===U,children:[F===U?"> ":" ",d.action]},void 0,!0,void 0,this),c(U0,{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),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="event"&&c(w0,{flexDirection:"column",children:[c(U0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),c(w0,{flexDirection:"column",marginTop:1,children:b8.map((d,F)=>c(w0,{children:[c(U0,{color:F===q?Z.colors.primary:void 0,bold:F===q,children:[F===q?"> ":" ",d.event]},void 0,!0,void 0,this),c(U0,{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),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X!=="event"&&c(w0,{marginBottom:1,children:c(U0,{children:["Event:"," ",c(U0,{bold:!0,color:Z.colors.primary,children:y.event},void 0,!1,void 0,this),c(U0,{color:Z.colors.muted,children:[" - ",y.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(X==="matcher"||X==="command"||X==="confirm")&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(U0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),c(U0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),c(U0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),c(U0,{color:Z.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="matcher"&&c(w0,{flexDirection:"column",children:[c(w0,{children:[c(U0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),c(m9,{value:z,onChange:b,onSubmit:o,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(X==="command"||X==="confirm")&&c(w0,{marginBottom:1,children:c(U0,{children:["Matcher: ",c(U0,{bold:!0,children:z||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X==="command"&&c(w0,{flexDirection:"column",children:[c(w0,{children:c(U0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:c(m9,{value:N,onChange:A,onSubmit:l,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{flexDirection:"column",marginTop:1,children:[c(U0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),X5.map((d,F)=>c(U0,{color:Z.colors.muted,children:["• ",d]},F,!0,void 0,this))]},void 0,!0,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="location"&&c(w0,{flexDirection:"column",children:[c(w0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[c(U0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),c(U0,{children:" "},void 0,!1,void 0,this),c(U0,{children:[" ","Event: ",y.event," - ",y.description]},void 0,!0,void 0,this),c(U0,{children:[" Matcher: ",z||"(all)"]},void 0,!0,void 0,this),c(U0,{children:[" Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(U0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),c(w0,{flexDirection:"column",marginTop:1,children:w8.map((d,F)=>c(w0,{children:[c(U0,{color:F===O?Z.colors.primary:void 0,bold:F===O,children:[F===O?"> ":" ",F+1,". ",d.name]},void 0,!0,void 0,this),c(U0,{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),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="confirm"&&c(w0,{flexDirection:"column",children:[c(w0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[c(U0,{bold:!0,children:["Saving hook to ",f.description,"..."]},void 0,!0,void 0,this),c(U0,{children:" "},void 0,!1,void 0,this),c(U0,{children:["Event: ",y.event]},void 0,!0,void 0,this),c(U0,{children:["Matcher: ",z||"(all tools)"]},void 0,!0,void 0,this),c(U0,{children:["Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:k?"Saving...":"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),T&&c(w0,{marginTop:1,children:c(U0,{color:Z.colors.error,children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as ZJ}from"ahooks";import{Box as P5,Text as y5}from"ink";import R5 from"react";import{useMemoizedFn as P8}from"ahooks";import y$ from"chalk";import{Text as L5,useInput as B5}from"ink";import{useEffect as QJ,useRef as y8}from"react";var A8={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var P$="\x1B",K5=`${P$}[200~`,G5=`${P$}[201~`,U5="[200~",q5="[201~",O5=[`${P$}[I`,`${P$}[O`,"[I","[O"],u9=`${P$}[?2004h`,l9=`${P$}[?2004l`,uQ=`${P$}[?1004l`,z5=[K5,U5],_5=[G5,q5];function d9(){return{pasteBuffer:null,pasteOverflowed:!1}}function c9($,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 x9($){return O5.some((Q)=>$===Q)}function r9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,K=[];while(Y.length>0){if(J!==null){let q=c9(Y,_5);if(!q){if(J.length+Y.length>xQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+q.index>xQ)Z=!0;else if(!Z)J+=Y.slice(0,q.index),K.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length);continue}let U=c9(Y,z5);if(!U){if(x9(Y))X=!0;else K.push({kind:"text",text:Y});Y="";break}let G=Y.slice(0,U.index);if(G&&!x9(G))K.push({kind:"text",text:G});J="",Z=!1,X=!0,Y=Y.slice(U.index+U.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:K}}import{execSync as n$}from"node:child_process";import{existsSync as N5,readFileSync as lQ}from"node:fs";import{basename as a9,isAbsolute as F5}from"node:path";function o9($){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 i9(){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 W5(){let{commands:$}=i9();try{return n$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function n9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function t9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function dQ($){let Q=n9($.trim()),Y=t9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function H5($){let Q=n9($.trim()),Y=t9(Q);if(dQ(Y))return Y;return null}async function s9($){let Q=H5($);if(!Q)return null;let Y;try{if(F5(Q))Y=lQ(Q);else{let K=W5();if(K&&Q===a9(K))Y=lQ(K);else return null}}catch(K){return console.error("Failed to read image file:",K),null}let J=Y.toString("base64"),Z=o9(J),X=a9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function e9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return n$(Y,{encoding:"utf-8"})||null}catch{return null}}async function $J(){let{commands:$,screenshotPath:Q}=i9();try{if(n$($.checkImage,{stdio:"ignore"}),n$($.saveImage(Q),{stdio:"ignore"}),!N5(Q))return null;let J=lQ(Q).toString("base64"),Z=o9(J);return n$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{n$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as A5}from"react/jsx-dev-runtime";var w5=/\r\n/g,b5=/\r/g;function rQ($){if(!$.includes("\r"))return $;return $.replace(w5,`
147
- `).replace(b5,`
148
- `)}function JJ($,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 YJ({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:K,onImagePaste:U,disabledKeys:G=[]}){let q=y8(d9()),L=y8($),O=y8(Z),W=y8(null);QJ(()=>{L.current=$,O.current=Z},[$,Z]),QJ(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let z=P8((P,w)=>{let C=L.current,B=O.current;if(L.current=P,O.current=w,P!==C)J(P);if(w!==B)X(w)}),b=P8((P)=>{if(!P)return;let{newValue:w,newCursorPosition:C}=JJ(rQ(P),L.current,O.current);z(w,C)}),N=P8(async(P)=>{let w=rQ(P);if(!w)return;if(U&&dQ(w))try{let B=await s9(w);if(B){let y=await U(B.base64,B.mediaType,B.filename);if(y?.prompt)b(y.prompt);return}}catch(B){console.error("Failed to process image path:",B)}if((w.length>A8.LARGE_INPUT_THRESHOLD||w.includes(`
149
- `))&&K){let B=await K(w);if(B?.prompt){b(B.prompt);return}}b(w)}),A=P8((P)=>{let w=W.current;if(!w){try{let B=P();if(!B)return;let y=B.catch(()=>{return});W.current=y,y.finally(()=>{if(W.current===y)W.current=null})}catch{}return}let C=w.then(P).then(()=>{return}).catch(()=>{return});W.current=C,C.finally(()=>{if(W.current===C)W.current=null})});B5((P,w)=>{A(()=>{let C=rQ(P),B=r9(q.current,C);if(q.current=B.state,B.handled)return(async()=>{for(let E of B.segments)if(E.kind==="paste")await N(E.text);else b(E.text)})();if(G.some((E)=>w[E])||w.ctrl&&P==="c"||w.ctrl&&P==="l"||w.ctrl&&P==="t"||w.ctrl&&P==="o"||w.meta&&P==="l"||w.meta&&P==="t"||w.meta&&P==="o"||w.shift&&w.tab||C==="?"&&L.current==="")return;let f=L.current,M=O.current,H=M,S=f;if(w.leftArrow)H--;else if(w.rightArrow)H++;else if(w.backspace||w.delete){if(P===""){if(M>0)S=f.slice(0,M-1)+f.slice(M,f.length),H--}else if(M<f.length)S=f.slice(0,M)+f.slice(M+1,f.length)}else if(w.ctrl&&C==="a")H=0;else if(w.ctrl&&C==="e")H=f.length;else if(w.ctrl&&C==="k")S=f.slice(0,M);else if(w.ctrl&&C==="u")S=f.slice(M),H=0;else if(w.ctrl&&C==="w"){let n=f.slice(0,M).match(/\s*\S+\s*$/);if(n){let r=n[0].length;S=f.slice(0,M-r)+f.slice(M),H-=r}}else if(w.ctrl&&C==="v"){let E=process.platform==="darwin";return(async()=>{if(U){let r=await $J();if(r){let o=await U(r.base64,r.mediaType,"clipboard.png");if(o?.prompt)b(o.prompt);return}}if(E)return;let n=await e9();if(n)await N(n)})()}else if(w.pageUp)H=0;else if(w.pageDown)H=f.length;else if(C===`
150
- `&&(w.shift||w.meta)){let{newValue:E,newCursorPosition:n}=JJ(C,f,M);z(E,n);return}else if(!w.ctrl&&!w.meta){if(K&&(C.length>A8.LARGE_INPUT_THRESHOLD||C.includes(`
151
- `)))return N(C);S=f.slice(0,M)+C+f.slice(M,f.length),H+=C.length}if(H<0)H=0;if(H>S.length)H=S.length;z(S,H)})},{isActive:Y});let T=Y,_=$,k=Q?y$.grey(Q):void 0;if(T)if(k=Q.length>0?y$.inverse(Q[0])+y$.grey(Q.slice(1)):y$.inverse(" "),$.length===0)_=y$.inverse(" ");else{_="";for(let P=0;P<$.length;P++)if(P===Z&&Z<$.length)_+=y$.inverse($[P]);else _+=$[P];if(Z>=$.length)_+=y$.inverse(" ")}return A5(L5,{children:Q?$.length>0?_:k:_},void 0,!1,void 0,this)}import{jsxDEV as aQ}from"react/jsx-dev-runtime";var XJ=R5.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let U=e0()==="main-input",G=$.trimStart().startsWith("!"),q=ZJ((O)=>{let W=O.split(`
152
- `).length,z=O.length,b=500,N=10;if(z>500||W>10){let A=Z(O),T=O.slice(0,30).replace(/\n/g," "),_=`${z} chars, ${W} lines: ${T}...`;return{prompt:`${K8(A)}${_}${XQ()}`}}return{}}),L=ZJ(async(O,W,z)=>{try{let b=X(O,W);return{prompt:`${K8(b)}[Image #${b}]${XQ()}`}}catch(b){return console.error("[Image Paste] Failed to process image:",b),{prompt:`[Image paste failed: ${b instanceof Error?b.message:"Unknown error"}] `}}});return aQ(P5,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[aQ(y5,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),aQ(YJ,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:q,onImagePaste:L,placeholder:" 输入命令...",focus:U,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as R8,Text as P1}from"ink";import f5,{useEffect as k5,useState as S5}from"react";import{useEffect as I5,useState as qJ}from"react";import{useEffect as M5,useState as T5}from"react";var C5=15000,KJ=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],GJ=["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 UJ($,Q,Y=!1){let[J,Z]=T5("");return M5(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let q=Math.floor(Math.random()*GJ.length);return GJ[q]}let G=Math.floor(Math.random()*KJ.length);return KJ[G]};Z(X());let K=setInterval(()=>{Z(X())},C5);return()=>{clearInterval(K)}},[$,Q,Y]),J}function OJ($,Q=!1,Y=!1){let[J,Z]=qJ(0),[X,K]=qJ(null),U=UJ($,Q,Y);return I5(()=>{if(!$){Z(0),K(null);return}if(Y)return;if(X===null)K(Date.now());let G=setInterval(()=>{if(X!==null){let q=Math.floor((Date.now()-X)/1000);Z(q)}},1000);return()=>{clearInterval(G)}},[$,X,Y]),{currentPhrase:U,elapsedTime:J}}import{jsxDEV as $1,Fragment as D5}from"react/jsx-dev-runtime";var oQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],v5=80;function t$($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var zJ=f5.memo(({message:$,paused:Q=!1})=>{let Y=E$(),J=h2(),Z=C4(),X=T4(),K=I4(),U=f4(),G=k4(),q=Y||!J,[L,O]=S5(0),W=b0(),b=Q$()>=v5,{currentPhrase:N,elapsedTime:A}=OJ(q,!1,Q);if(k5(()=>{if(!q||Q){O(0);return}let B=setInterval(()=>{O((y)=>(y+1)%oQ.length)},150);return()=>clearInterval(B)},[q,Q]),!q)return null;let T=K?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${K.attempt}/${K.maxRetries}),剩余约 ${t$(Math.max(0,Math.ceil((K.recoveryRemainingMs??0)/1000)))}`:K?.phase==="scheduled"?`Provider 暂时不可用,${K.attempt}/${K.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((K.delayMs??0)/1000))}s 后开始`:K?.phase==="attempt"?`正在重试 Provider (${K.attempt}/${K.maxRetries})`:null,_=X?X.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${X.retryAfterMs!==void 0?` (${t$(Math.max(0,Math.ceil(X.retryAfterMs/1000)))})`:""}${X.recoveryRemainingMs!==void 0?`,剩余预算 ${t$(Math.max(0,Math.ceil(X.recoveryRemainingMs/1000)))}`:""}`:null,k=Z?`等待 Provider 容量(${Z.scope},队列 ${Z.queuePosition}/${Math.max(Z.queueDepth,Z.queuePosition)},已等待 ${t$(Math.max(0,Math.ceil(Z.waitMs/1000)))})`:null,P=U?U.outputStarted?`Provider 流已暂停 ${Math.ceil(U.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(U.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(U.durationMs/1000)}s(空闲超时上限 ${Math.ceil(U.timeoutMs/1000)}s)`:null,C=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||_||k||T||P||$||N||"正在思考中...";if(b)return $1(R8,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[$1(P1,{color:W.colors.warning,bold:!0,children:oQ[L]},void 0,!1,void 0,this),$1(P1,{color:W.colors.text.primary,children:C},void 0,!1,void 0,this),A>0&&$1(D5,{children:[$1(P1,{color:W.colors.muted,children:"|"},void 0,!1,void 0,this),$1(P1,{color:W.colors.info,children:["已用时: ",t$(A)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$1(P1,{color:W.colors.muted,children:"|"},void 0,!1,void 0,this),$1(P1,{color:W.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $1(R8,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[$1(R8,{flexDirection:"row",gap:1,children:[$1(P1,{color:W.colors.warning,bold:!0,children:oQ[L]},void 0,!1,void 0,this),$1(P1,{color:W.colors.text.primary,children:C},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A>0&&$1(R8,{marginLeft:2,flexDirection:"row",gap:1,children:[$1(P1,{color:W.colors.info,children:["已用时: ",t$(A)]},void 0,!0,void 0,this),$1(P1,{color:W.colors.muted,children:"|"},void 0,!1,void 0,this),$1(P1,{color:W.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 C8,Text as v0,useInput as V5,useStdout as j5}from"ink";import h5 from"ink-text-input";import E5,{useCallback as M8,useEffect as g5,useMemo as m5,useState as R$}from"react";import{jsxDEV as H0}from"react/jsx-dev-runtime";var WJ=E5.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=j5(),J=Y.columns||80,Z=e0()==="confirmation-prompt",X=k0(!1),K=$.fields??[],[U,G]=R$("field"),[q,L]=R$(0),[O,W]=R$(()=>_J($)),[z,b]=R$(""),[N,A]=R$(0),[T,_]=R$([]),[k,P]=R$(),w=K[q],C=m5(()=>p5(w),[w]);g5(()=>{if(!w)return;let H=O[w.name];b(typeof H==="string"||typeof H==="number"?String(H):""),_(Array.isArray(H)?[...H]:[]);let S=C.findIndex((E)=>E.value===String(H));A(S>=0?S:0),P(void 0)},[O,w,C]);let B=M8((H)=>{if(W(H),q<K.length-1){L((S)=>S+1);return}G("review")},[q,K.length]),y=M8((H)=>{if(!w)return;let S={...O};if(H===void 0)delete S[w.name];else S[w.name]=H;B(S)},[O,w,B]),f=M8((H)=>{if(!w)return;try{y(NJ(w,H))}catch(S){P(S instanceof Error?S.message:String(S))}},[w,y]),M=M8(()=>{try{let H=FJ($,{action:"accept",content:O});Q({action:H.action,...H.content?{content:H.content}:{}})}catch(H){P(H instanceof Error?H.message:String(H))}},[O,$,Q]);if(V5((H,S)=>{if(S.ctrl&&H==="c"||S.meta&&H==="c"){X();return}if(S.escape){Q({action:"cancel"});return}if($.mode==="url"){if(H.toLowerCase()==="y")Q({action:"accept"},!0);else if(H.toLowerCase()==="n")Q({action:"decline"});return}if(U==="review"){if(H.toLowerCase()==="y"||S.return)M();else if(H.toLowerCase()==="e")L(0),G("field");else if(H.toLowerCase()==="d")Q({action:"decline"});return}if(!w){if(S.return)M();return}if(iQ(w))return;if(H.toLowerCase()==="d"){Q({action:"decline"});return}if(S.upArrow){A((E)=>E>0?E-1:Math.max(C.length-1,0));return}if(S.downArrow||S.tab){A((E)=>E<C.length-1?E+1:0);return}if(H===" "&&w.type==="multi-select"){let E=C[N];if(E)_((n)=>n.includes(E.value)?n.filter((r)=>r!==E.value):[...n,E.value]);return}if(S.return)if(w.type==="multi-select")y(T);else{let E=C[N];if(E)y(E.typedValue)}},{isActive:Z}),$.mode==="url")return H0(T8,{width:J,color:"yellow",children:[H0(v0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),H0(v0,{children:$.message},void 0,!1,void 0,this),H0(v0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),H0(v0,{children:["Domain: ",H0(v0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H0(v0,{wrap:"wrap",children:["URL: ",H0(v0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H0(v0,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(U==="review")return H0(T8,{width:J,color:"green",children:[H0(v0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),H0(v0,{children:$.message},void 0,!1,void 0,this),K.map((H)=>H0(v0,{children:[H.title,": ",x5(O[H.name])]},H.name,!0,void 0,this)),k&&H0(v0,{color:"red",children:k},void 0,!1,void 0,this),H0(v0,{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 H0(T8,{width:J,color:"cyan",children:[H0(v0,{children:$.message},void 0,!1,void 0,this),H0(v0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),H0(v0,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return H0(T8,{width:J,color:"cyan",children:[H0(v0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),H0(v0,{children:$.message},void 0,!1,void 0,this),H0(C8,{flexDirection:"column",marginTop:1,children:[H0(v0,{bold:!0,children:[w.title,w.required?" *":""]},void 0,!0,void 0,this),w.description&&H0(v0,{color:"gray",children:w.description},void 0,!1,void 0,this),H0(v0,{color:"gray",children:c5(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),iQ(w)?H0(C8,{children:[H0(v0,{color:"cyan",children:"> "},void 0,!1,void 0,this),H0(h5,{value:z,onChange:b,onSubmit:f,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):H0(C8,{flexDirection:"column",children:C.map((H,S)=>{let E=w.type==="multi-select"&&T.includes(H.value);return H0(v0,{color:N===S?"yellow":void 0,children:[N===S?"> ":" ",w.type==="multi-select"?E?"(*) ":"( ) ":"",H.label]},H.value,!0,void 0,this)})},void 0,!1,void 0,this),k&&H0(v0,{color:"red",children:k},void 0,!1,void 0,this),H0(v0,{color:"gray",children:[iQ(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),H0(v0,{color:"gray",children:["Field ",q+1," of ",K.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function T8({children:$,width:Q,color:Y}){return H0(C8,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function iQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function p5($){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 c5($){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 x5($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import S8 from"ansi-escapes";import{Box as Z$,Static as YX,useStdout as ZX}from"ink";import XX,{useEffect as l1,useMemo as J4,useRef as X$,useState as Y4}from"react";import{useStdout as u5}from"ink";import{debounce as l5}from"lodash-es";import{useEffect as d5,useState as r5}from"react";function HJ($=200){let{stdout:Q}=u5(),[Y,J]=r5(Q.rows||24);return d5(()=>{let Z=l5(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import M$ from"chalk";import a5 from"string-width";var _0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},f8="\x1B",nQ=`${f8}[2K`,I8=($)=>$>0?`${f8}[${$}A`:"",LJ=`${f8}[?25l`,BJ=`${f8}[?25h`;function wJ($,Q){_0.active=!0,_0.renderedLineCount=0,_0.lastRenderedLines=[],_0.terminalWidth=$,_0.terminalHeight=Q,_0.isFirstRender=!0}function bJ($,Q){_0.terminalWidth=$,_0.terminalHeight=Q}function AJ($,Q,Y,J){if(!_0.active)return;let Z=8,X=Math.max(1,_0.terminalHeight-Z),K=[],U=a0.getTheme(),G=" ".repeat(_0.prefixIndent),q=M$.dim.hex(U.colors.border.light);if(Q>0)K.push(`${G}${M$.dim.hex(U.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let L=Y==="code",O=Y==="diff",W="",z=$;if(L&&$.length>0)W=$[0].match(/^```(\w+)?/)?.[1]||"",z=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")z=$.slice(1);let b=z.slice(-X);if(L&&Q===0){let A=W?` ${M$.hex(U.colors.text.secondary)(W)}`:"";K.push(`${G}${q("╭─")}${A}`)}for(let A=0;A<b.length;A++){let T=b[A],_=G;if(A===0&&!J&&_0.isFirstRender&&!L&&!O)_=M$.bold.hex(U.colors.success)("• ")+" ",_0.isFirstRender=!1;let k=L?4:0,P=_0.terminalWidth-_0.prefixIndent-2-k,w=T;if(a5(T)>P)w=T.slice(0,P);if(L)K.push(`${G}${q("│")} ${w}`);else if(O){let C=w;if(C.startsWith("+"))K.push(`${_}${M$.green(w)}`);else if(C.startsWith("-"))K.push(`${_}${M$.red(w)}`);else if(C.startsWith("@@"))K.push(`${_}${M$.dim(w)}`);else K.push(`${_}${w}`)}else K.push(`${_}${w}`);if(A===0&&!J&&_0.isFirstRender)_0.isFirstRender=!1}let N=[];if(N.push(LJ),_0.renderedLineCount>0)N.push(I8(_0.renderedLineCount)),N.push("\r");for(let A=0;A<K.length;A++){let T=K[A],_=_0.lastRenderedLines[A];if(T!==_)N.push(nQ),N.push(T);if(A<K.length-1)N.push(`
153
- `)}if(K.length<_0.renderedLineCount){for(let T=K.length;T<_0.renderedLineCount;T++)N.push(`
154
- `),N.push(nQ);let A=_0.renderedLineCount-K.length;N.push(I8(A))}N.push(BJ),process.stdout.write(N.join("")),_0.renderedLineCount=K.length,_0.lastRenderedLines=K}function x1(){if(!_0.active)return;if(_0.renderedLineCount>0){let $=[];$.push(LJ),$.push(I8(_0.renderedLineCount)),$.push("\r");for(let Q=0;Q<_0.renderedLineCount;Q++)if($.push(nQ),Q<_0.renderedLineCount-1)$.push(`
155
- `);if(_0.renderedLineCount>1)$.push(I8(_0.renderedLineCount-1)),$.push("\r");$.push(BJ),process.stdout.write($.join(""))}_0.active=!1,_0.renderedLineCount=0,_0.lastRenderedLines=[],_0.isFirstRender=!0}function v1(){return _0.active}import{Box as o5,Text as PJ}from"ink";import i5 from"react";import{jsxDEV as tQ}from"react/jsx-dev-runtime";var sQ=i5.memo(({collapsedCount:$})=>{let Q=b0();if($<=0)return null;let Y=Q.colors.text.muted;return tQ(o5,{flexDirection:"row",marginBottom:1,children:[tQ(PJ,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),tQ(PJ,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});sQ.displayName="CollapsedHistorySummary";import{Box as y2,Text as R2}from"ink";import n5 from"ink-big-text";import t5 from"ink-gradient";import s5 from"react";import{jsxDEV as W1}from"react/jsx-dev-runtime";var RJ=s5.memo(()=>{return W1(y2,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[W1(y2,{flexDirection:"column",children:W1(t5,{name:"pastel",children:W1(n5,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),W1(y2,{marginBottom:1,children:W1(R2,{color:"white",dimColor:!0,children:yJ()},void 0,!1,void 0,this)},void 0,!1,void 0,this),W1(y2,{flexDirection:"column",marginBottom:1,children:[W1(y2,{marginBottom:1,children:W1(R2,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W1(R2,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),W1(R2,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),W1(R2,{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 k8,Text as eQ}from"ink";import MJ from"react";import{jsxDEV as Y$}from"react/jsx-dev-runtime";var TJ=MJ.memo(({tasks:$,visible:Q=!0,compact:Y=!1})=>{let{colors:J}=b0();if(!Q||$.length===0)return null;let Z={total:$.length,completed:$.filter((X)=>X.status==="completed").length,inProgress:$.filter((X)=>X.status==="in_progress").length};return Y$(k8,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[Y$(k8,{marginBottom:Y?0:1,children:[Y$(eQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),Y$(eQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y$(k8,{flexDirection:"column",children:$.map((X,K)=>Y$(e5,{task:X,compact:Y},X.id||K,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),e5=MJ.memo(({task:$,compact:Q})=>{let Y,J=!1,Z;switch($.status){case"completed":Y="[OK]",J=!0,Z=$.subject;break;case"in_progress":Y=">",J=!1,Z=$.activeForm||$.subject;break;case"pending":default:Y="-",J=!0,Z=$.subject;break}return Y$(k8,{paddingY:Q?0:0,children:Y$(eQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as $4,Text as s$}from"ink";import $X,{useMemo as CJ}from"react";import{jsxDEV as u1}from"react/jsx-dev-runtime";function QX($,Q=60){if(!$)return"";let Y=$.split(`
156
- `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function JX($){if(!$)return 0;return $.split(`
157
- `).length}var Q4=$X.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=b0(),Z=CJ(()=>JX($),[$]),X=CJ(()=>QX($),[$]),K=J.colors.info,U=J.colors.muted;return u1($4,{flexDirection:"column",marginBottom:1,children:[u1($4,{flexDirection:"row",children:[u1(s$,{color:K,children:Y?"v":">"},void 0,!1,void 0,this),u1(s$,{children:" "},void 0,!1,void 0,this),u1(s$,{color:U,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&u1(s$,{color:U,children:[" - ",X]},void 0,!0,void 0,this),u1(s$,{color:U,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&u1($4,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:u1(s$,{color:U,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});Q4.displayName="ThinkingBlock";import{jsxDEV as i0}from"react/jsx-dev-runtime";var fJ=XX.memo(()=>{let $=A4(),Q=o4(),Y=i4(),J=n4(),Z=E$(),X=V4(),K=m4(),U=m2(),G=r4(),q=a4(),L=P4(),O=s4(),W=t4(),z=Q$(),b=HJ(),{stdout:N}=ZX(),A=n1(),[T,_]=Y4(null),[k,P]=Y4([]),[w,C]=Y4(new Set),B=X$(W),y=X$(null),f=X$(0),M=X$(0),H=X$(new Set),S=X$(new Set),E=X$([]),n=X$(null);l1(()=>{if(B.current!==W){if(v1())x1();if(N)N.write(S8.clearTerminal);A.incrementClearCount(),B.current=W}},[W,N,A]);let r=$,o=J;l1(()=>{if(!J||Z){n.current=null;return}if(n.current===J)return;if(n.current=J,v1())x1();if(N)N.write(S8.eraseScreen+S8.cursorTo(0,0));H.current=new Set,S.current=new Set(r.filter((I)=>I.role==="tool").map((I)=>I.id)),y.current=null,f.current=0,M.current=0,E.current=[],P([]),C(new Set),A.incrementClearCount(),A.clearFinalizingStreamingMessageId()},[J,Z,N,A,r]);let l=Q??J;l1(()=>{if(v1())x1();y.current=null,f.current=0,M.current=0,H.current=new Set,S.current=new Set(r.filter((I)=>I.role==="tool").map((I)=>I.id)),E.current=[],P([]),C(new Set)},[L]),l1(()=>{if(!l)return;if(y.current===l)return;y.current=l,f.current=0,M.current=0,S.current=new Set(r.filter((I)=>I.role==="tool").map((I)=>I.id)),E.current=[],P([])},[l,r]),l1(()=>{if(!l)return;let I=Z4(l);if(!I||I.length<=f.current)return;let v=I.slice(f.current);f.current=I.length;let h=v,Q0=E.current;if(Q0.length>0)if(h.some((D0)=>D0.type!=="empty"))h=[...Q0,...h],E.current=[];else{E.current=[...Q0,...h];return}let e=h.length;while(e>0&&h[e-1].type==="empty")e-=1;if(e!==h.length)E.current=h.slice(e),h=h.slice(0,e);if(h.length===0)return;let X0=M.current;M.current+=1;let A0=X0>0;if(v1())x1();C((D0)=>{if(!l||D0.has(l))return D0;let j0=new Set(D0);return j0.add(l),j0}),P((D0)=>[...D0,i0(Z$,{flexDirection:"column",children:i0(k1,{content:"",role:"assistant",terminalWidth:z,isPending:!1,hidePrefix:A0,noMargin:!0,blocksOverride:h,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${l}-${X0}`,!1,void 0,this)])},[l,Y.version,z,L]),l1(()=>{if(!l)return;let I=S.current,v=r.filter((h)=>h.role==="tool"&&!I.has(h.id)&&!H.current.has(h.id));if(v.length===0)return;if(v1())x1();for(let h of v)H.current.add(h.id);P((h)=>[...h,...v.map((Q0)=>i0(Z$,{flexDirection:"column",children:i0(k1,{content:Q0.content,role:Q0.role,terminalWidth:z,metadata:Q0.metadata,isPending:!1,messageId:Q0.id},void 0,!1,void 0,this)},`streaming-tool-${Q0.id}`,!1,void 0,this))])},[l,r,z]),l1(()=>{if(!l){if(v1())x1();return}if(!v1())wJ(z,b);else bJ(z,b);let I=IJ(l);if(!I||I.lines.length===0)return;let h=Math.max(1,b-8),Q0=Math.max(0,I.lines.length-h),e=I.lines.slice(-h),X0=(Z4(l)?.length??0)>0;AJ(e,Q0,I.mode,X0)},[l,Y.version,b,z]),l1(()=>{if(!l&&v1())x1()},[l]),l1(()=>{if(T===null&&r.length>O){if(_(r.length),v1())x1();if(N)N.write(S8.clearTerminal);A.incrementClearCount()}},[r.length,O,T,N,A]);let p=J4(()=>{return X.some((I)=>I.status==="pending"||I.status==="in_progress")},[X]),d=W?0:T??0,F=d,R=J4(()=>{let I=[];if(I.push(i0(RJ,{},"header",!1,void 0,this)),F>0)I.push(i0(sQ,{collapsedCount:F},"collapsed-summary",!1,void 0,this));for(let v=d;v<r.length;v++){let h=r[v];if(o&&h.id===o)continue;if(h.role==="tool"&&H.current.has(h.id))continue;if(h.role==="assistant"&&w.has(h.id))continue;I.push(i0(Z$,{flexDirection:"column",children:i0(k1,{content:h.content,role:h.role,terminalWidth:z,metadata:h.metadata,isPending:!1,messageId:h.id},void 0,!1,void 0,this)},h.id,!1,void 0,this))}return I},[r,d,F,z,o,w]),V=J4(()=>k.length>0?[...R,...k]:R,[R,k]);return i0(Z$,{flexDirection:"column",paddingX:2,children:i0(Z$,{flexDirection:"column",children:[i0(YX,{items:V,children:(I)=>I},L,!1,void 0,this),G&&i0(Z$,{marginBottom:1,children:i0(Q4,{content:G,isStreaming:Z,isExpanded:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&p&&i0(Z$,{marginTop:1,children:i0(TJ,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.map((I,v)=>i0(Z$,{flexDirection:"column",children:i0(k1,{content:I.displayText,role:"user",terminalWidth:z},void 0,!1,void 0,this)},`pending-${v}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as v8,useMount as KX}from"ahooks";import{Box as H1,Text as L0,useFocus as GX,useFocusManager as UX,useInput as qX}from"ink";import OX from"ink-select-input";import{memo as zX,useMemo as _X,useState as D8}from"react";import{jsxDEV as Y0,Fragment as WX}from"react/jsx-dev-runtime";var NX=({isSelected:$})=>Y0(H1,{marginRight:1,children:Y0(L0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),FX=({isSelected:$,label:Q})=>Y0(L0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),kJ=zX(({onClose:$,onEdit:Q})=>{let Y=p4(),J=g2()??"",{isFocused:Z}=GX({id:"model-selector"}),X=UX(),[K,U]=D8(""),[G,q]=D8(!1),[L,O]=D8(null),W=k0(!1),[z]=D8(()=>{let B=process.stdout?.columns||80;return Math.max(20,B-8)});KX(()=>{if(X?.focus("model-selector"),Y.length>0)U(Y[0].id)}),qX((B,y)=>{if(G)return;if(y.ctrl&&B==="c"||y.meta&&B==="c"){W();return}if(y.escape){$();return}if(!Z)return;if(B==="d"||B==="D"){N();return}if((B==="e"||B==="E")&&Q)A()},{isActive:!0});let b=v8(async(B)=>{if(G)return;let y=B.value;if(y===J){$();return}q(!0),O(null);try{await m0().setCurrentModel(y),$()}catch(f){O(f.message),q(!1)}}),N=v8(async()=>{if(G||K===J)return;q(!0),O(null);try{if(await m0().removeModel(K),Y.length<=1)$()}catch(B){O(B.message)}finally{q(!1)}}),A=v8(()=>{if(G||!Q)return;let B=Y.find((y)=>y.id===K);if(!B)return;Q(B)}),T=v8((B)=>{U(B.value)}),_=_X(()=>{return Y.find((B)=>B.id===K)},[Y,K]),k=_?V8()?.modelProviders[_.provider]:void 0,P=Y.map((B)=>{let y=B.id===J?" (当前)":"";return{label:X4(B)+y,value:B.id}}),w=K===J;return Y0(H1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[Y0(H1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[Y0(L0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),Y0(L0,{dimColor:!0,children:[G?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y0(H1,{flexDirection:"row",children:[Y0(H1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[Y0(L0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),Y0(H1,{marginTop:1,children:Y0(OX,{items:P,onSelect:b,onHighlight:T,indicatorComponent:NX,itemComponent:FX},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(H1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[Y0(L0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),Y0(H1,{marginY:1,children:Y0(L0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_?Y0(H1,{flexDirection:"column",children:[Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),Y0(L0,{bold:!0,color:"cyan",children:X4(_)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),Y0(L0,{bold:!0,children:k?.name??_.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k&&Y0(WX,{children:[Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),Y0(L0,{children:_.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),Y0(L0,{children:k.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),Y0(L0,{color:"blueBright",children:k.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),Y0(L0,{bold:!0,children:_.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.overrides?.baseUrl&&Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),Y0(L0,{color:"blueBright",children:_.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),Y0(L0,{children:E1().resolveConfig(_).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):Y0(L0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L&&Y0(H1,{marginTop:1,children:Y0(L0,{color:"red",children:L},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(H1,{justifyContent:"center",marginTop:1,children:Y0(L0,{dimColor:!0,children:"─".repeat(z)},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(H1,{justifyContent:"center",children:Y0(L0,{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 K4}from"ahooks";import{Box as hX,Text as G4,useInput as EX}from"ink";import{useState as I$}from"react";import{Box as T$,Text as d1,useInput as HX}from"ink";import LX from"ink-text-input";import{jsxDEV as n0}from"react/jsx-dev-runtime";var SJ=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return HX((K,U)=>{if(U.escape)Z()}),n0(T$,{flexDirection:"column",children:[n0(T$,{marginBottom:1,children:n0(d1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(T$,{marginBottom:1,children:n0(d1,{children:["Provider: ",n0(d1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),n0(T$,{marginBottom:1,children:n0(d1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(T$,{children:[n0(d1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),n0(LX,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&n0(T$,{marginTop:1,children:n0(d1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(T$,{marginTop:1,children:n0(d1,{dimColor:!0,children:["输入完成后按 ",n0(d1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",n0(d1,{bold:!0,children:"Esc"},void 0,!1,void 0,this)," 返回"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as j8,Text as K$,useInput as BX}from"ink";import wX from"ink-text-input";import{useState as h8}from"react";import{jsxDEV as z1}from"react/jsx-dev-runtime";var E8=["id","name","baseUrl","model"];function vJ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function bX($,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 AX($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=VJ(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 jJ=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,K]=h8(Q?3:0),[U,G]=h8(Q?.model??""),[q,L]=h8(Z),[O,W]=h8(),z=E8[X];BX((N,A)=>{if(!A.escape)return;if(W(void 0),X===0){J();return}let T=X-1,_=E8[T];K(T),G(q[_])});let b=(N)=>{let A=N.trim();if(z==="id"&&!DJ.test(A)){W("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(z==="baseUrl")try{let _=new URL(A);if(!["http:","https:"].includes(_.protocol))throw Error()}catch{W("Base URL 必须是绝对 HTTP(S) URL");return}if(z==="model"&&!A){W("Model ID 不能为空");return}let T={...q,[z]:z==="name"&&!A?q.id:A};if(L(T),W(void 0),X===E8.length-1){try{Y(AX(T,$))}catch(_){W(_ instanceof Error?_.message:"渠道配置无效")}return}K(X+1),G("")};return z1(j8,{flexDirection:"column",children:[z1(j8,{marginBottom:1,children:z1(K$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z1(K$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),E8.slice(0,X).map((N)=>z1(K$,{children:[vJ(N),": ",z1(K$,{color:"cyan",children:q[N]},void 0,!1,void 0,this)]},N,!0,void 0,this)),z1(j8,{marginTop:1,children:[z1(K$,{bold:!0,children:[vJ(z),": "]},void 0,!0,void 0,this),z1(wX,{value:U,onChange:(N)=>{G(N),W(void 0)},onSubmit:b,placeholder:bX(z,$,q.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z==="name"&&z1(K$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&z1(K$,{color:"red",children:O},void 0,!1,void 0,this),z1(j8,{marginTop:1,children:z1(K$,{dimColor:!0,children:"Enter 继续 · Esc 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useEffect as gJ,useState as e$}from"react";var mJ=()=>{let[$,Q]=e$([]),[Y,J]=e$(!0),[Z,X]=e$(null);return gJ(()=>{(async()=>{try{Q(await hJ())}catch(U){X(U instanceof Error?U.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},pJ=($)=>{let[Q,Y]=e$([]),[J,Z]=e$(!1),[X,K]=e$(null);return gJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),K(null);try{Y(await EJ($))}catch(G){K(G instanceof Error?G.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as r1,Text as y1,useInput as PX}from"ink";import yX from"ink-select-input";import RX from"ink-text-input";import{useMemo as cJ,useState as MX}from"react";import{jsxDEV as g0,Fragment as fX}from"react/jsx-dev-runtime";var TX=({isSelected:$})=>g0(r1,{marginRight:1,children:g0(y1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),CX=($)=>{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(" ")},IX=({isSelected:$,label:Q})=>g0(y1,{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[K,U]=MX("");PX((L,O)=>{if(O.escape)if(K)U("");else X()});let G=cJ(()=>{if(!K)return Q;let L=K.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(L)||O.id.toLowerCase().includes(L))},[Q,K]),q=cJ(()=>G.map((L)=>({key:L.id,label:CX(L),value:L})),[G]);if(Y)return g0(r1,{flexDirection:"column",children:g0(y1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return g0(r1,{flexDirection:"column",children:[g0(y1,{color:"red",children:J},void 0,!1,void 0,this),g0(y1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return g0(r1,{flexDirection:"column",children:[g0(r1,{marginBottom:1,children:g0(y1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g0(r1,{marginBottom:1,children:g0(y1,{children:["Provider: ",g0(y1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),g0(fX,{children:[g0(r1,{marginBottom:1,children:[g0(y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),g0(RX,{value:K,onChange:U,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g0(r1,{marginBottom:1,children:g0(y1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g0(r1,{flexDirection:"column",height:12,children:g0(yX,{items:q,onSelect:(L)=>Z(L.value),indicatorComponent:TX,itemComponent:IX,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&g0(y1,{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 C$,Text as G$,useInput as kX}from"ink";import SX from"ink-select-input";import vX from"ink-text-input";import{useMemo as uJ,useState as DX}from"react";import{jsxDEV as t0}from"react/jsx-dev-runtime";var VX=({isSelected:$})=>t0(C$,{marginRight:1,children:t0(G$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),jX=({isSelected:$,label:Q})=>t0(G$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),lJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,K]=DX("");kX((q,L)=>{if(L.escape)if(X)K("");else Z()});let U=uJ(()=>{if(!X)return $;let q=X.toLowerCase();return $.filter((L)=>L.name.toLowerCase().includes(q)||L.id.toLowerCase().includes(q))},[$,X]),G=uJ(()=>U.map((q)=>({key:q.id,label:`${q.name} - ${q.modelCount} models${q.configured?" [configured]":""}`,value:q})),[U]);if(Q)return t0(C$,{flexDirection:"column",children:t0(G$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return t0(C$,{flexDirection:"column",children:[t0(G$,{color:"red",children:Y},void 0,!1,void 0,this),t0(G$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return t0(C$,{flexDirection:"column",children:[t0(C$,{marginBottom:1,children:t0(G$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t0(C$,{marginBottom:1,children:[t0(G$,{color:"cyan",children:"> "},void 0,!1,void 0,this),t0(vX,{value:X,onChange:K,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t0(C$,{flexDirection:"column",height:12,children:t0(SX,{items:G,onSelect:(q)=>J(q.value),indicatorComponent:VX,itemComponent:jX,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.length===0&&t0(G$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function dJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as U$}from"react/jsx-dev-runtime";var U4=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,K]=I$("provider"),[U,G]=I$(),[q,L]=I$(),[O,W]=I$(),[z,b]=I$(""),[N,A]=I$(),[T,_]=I$(!1),k=mJ(),P=pJ(U?.id),w=k0(!1);EX((f,M)=>{if(M.ctrl&&f==="c"||M.meta&&f==="c")$==="setup"?w():Z()});let C=K4(async(f)=>{if(!U)return;let M=O??(q?{provider:U.id,model:q.id,displayName:Q?.displayName}:void 0);if(!M)return;_(!0),A(void 0);try{if(M.modelProvider)E1().registerModelProvider(M.provider,M.modelProvider,[M.model]);if(f?.trim())await E1().setApiKey(M.provider,f.trim());let H={displayName:M.displayName,provider:M.provider,model:M.model,overrides:M.overrides};if($==="setup")await J(M);else if($==="add"){let S=M.modelProvider?await m0().addModelWithProvider(H,M.modelProvider):await m0().addModel(H);await m0().setCurrentModel(S.id),await J(M)}else if(Y){if(M.modelProvider)await m0().updateModelWithProvider(Y,H,M.modelProvider);else await m0().updateModel(Y,H);await J(M)}}catch(H){if(M.modelProvider){await E1().credentials.delete(M.provider);let S=V8();E1().configureModelProviders(S?.modelProviders??{},S?.models??[])}A(H instanceof Error?H.message:"保存配置失败"),_(!1)}}),B=K4((f)=>{if(L(f),U?.configured)C();else if(U?.supportsApiKey)K("credential");else A(`${U?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),y=K4(()=>{if(A(void 0),X==="credential"&&O){K("custom");return}let f=dJ(X);if(f)K(f)});return U$(hX,{flexDirection:"column",padding:1,children:[U$(G4,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&U$(lJ,{...k,onSelect:(f)=>{G(f),L(void 0),W(void 0),K(f.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&U?.factoryWireApi&&U$(jJ,{wireApi:U.factoryWireApi,initialConfig:O,onSubmit:(f)=>{W(f),K("credential")},onCancel:y},void 0,!1,void 0,this),X==="model"&&U&&U$(xJ,{provider:U,...P,onSelect:B,onCancel:y},void 0,!1,void 0,this),X==="credential"&&U&&U$(SJ,{provider:U,value:z,onChange:b,onSubmit:()=>void C(z),onCancel:y,error:N},void 0,!1,void 0,this),T&&U$(G4,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),N&&X!=="credential"&&U$(G4,{color:"red",children:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as M2}from"ahooks";import{promises as iJ}from"fs";import{Box as _1,Text as V0,useInput as gX}from"ink";import rJ from"ink-select-input";import mX from"ink-text-input";import pX from"os";import g8 from"path";import{useEffect as cX,useMemo as m8,useRef as xX,useState as q$}from"react";import{jsxDEV as q0}from"react/jsx-dev-runtime";var T2=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],uX={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},lX={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},aJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},dX=["project","global","local"],rX={allow:[],ask:[],deny:[]},aX={localExists:!1,projectExists:!1,globalExists:!1},oJ={allow:[],ask:[],deny:[]};function oX($){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 iX($){try{let Q=await iJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:oX(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 nX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${aJ[Q]} <- 可删除`:aJ[Q];return`${Y} ${J}`}var nJ=({onClose:$})=>{let Y=e0()==="permissions-manager",J=k0(!1),[Z,X]=q$(0),K=T2[Z].key,[U,G]=q$(rX),[q,L]=q$(aX),[O,W]=q$(!0),[z,b]=q$("list"),[N,A]=q$(""),[T,_]=q$(null),[k,P]=q$(null),w=xX(!1),C=m8(()=>g8.join(d0(),".blade","settings.local.json"),[]),B=m8(()=>g8.join(d0(),".blade","settings.json"),[]),y=m8(()=>g8.join(pX.homedir(),".blade","settings.json"),[]),f=M2(async()=>{W(!0);let I=await Promise.all([{source:"local",path:C},{source:"project",path:B},{source:"global",path:y}].map(async({source:e,path:X0})=>{let A0=await iX(X0);return{source:e,path:X0,...A0}})),v={localExists:I.find((e)=>e.source==="local")?.exists??!1,projectExists:I.find((e)=>e.source==="project")?.exists??!1,globalExists:I.find((e)=>e.source==="global")?.exists??!1};L(v);let h={allow:[],ask:[],deny:[]},Q0=Object.fromEntries(I.map((e)=>[e.source,e]));["allow","ask","deny"].forEach((e)=>{dX.forEach((X0)=>{(Q0[X0]?.permissions[e]??[]).forEach((D0,j0)=>{let W$={key:`${X0}:${j0}:${D0}`,rule:D0,source:X0};h[e].push(W$)})})}),G(h),W(!1)});cX(()=>{f()},[f]);let M=M2(async(V,I)=>{try{let v=g8.join(d0(),".blade","settings.local.json"),h={allow:[],ask:[],deny:[]};try{let e=await iJ.readFile(v,"utf-8"),A0=JSON.parse(e).permissions||{};h={allow:Array.isArray(A0.allow)?A0.allow:[],ask:Array.isArray(A0.ask)?A0.ask:[],deny:Array.isArray(A0.deny)?A0.deny:[]}}catch(e){}let Q0=I(h);await m0().updateConfig({permissions:Q0},{scope:"local",immediate:!0}),await f()}catch(v){throw console.error("[PermissionsManager] 修改权限规则失败:",v),v}});gX((V,I)=>{if(I.ctrl&&V==="c"||I.meta&&V==="c"){J();return}if(z==="locked"){if(w.current){w.current=!1;return}b("list"),_(null),P(null);return}if(I.escape){if(z==="list"||K==="info")$();else b("list"),A(""),_(null),P(null);return}if(z==="list"){if(I.tab&&I.shift)X((v)=>(v-1+T2.length)%T2.length);else if(I.tab)X((v)=>(v+1)%T2.length);else if(V?.toLowerCase()==="q")$()}},{isActive:Y});let H=M2((V)=>{let I=V.value;if(K==="info")return;if(I.type==="add"){b("add"),A(""),P(null);return}if(I.entry.source!=="local"){b("locked"),w.current=!0,_({tab:K,entry:I.entry}),P({type:"error",text:I.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}b("confirm-delete"),_({tab:K,entry:I.entry}),P(null)}),S=M2(async()=>{if(K==="info")return;let V=N.trim();if(!V){P({type:"error",text:"Permission rule 不能为空"});return}if(U[K].map((v)=>v.rule).includes(V)){P({type:"error",text:"该规则已存在"});return}try{await M(K,(v)=>{let h={allow:[...v.allow],ask:[...v.ask],deny:[...v.deny]};return h[K]=[...new Set([...v[K],V])],h}),b("list"),A(""),P({type:"success",text:"已添加本地权限规则"})}catch(v){P({type:"error",text:`保存失败: ${v instanceof Error?v.message:"未知错误"}`})}}),E=M2(async()=>{if(!T)return;let{tab:V,entry:I}=T;try{await M(V,(v)=>{let h={allow:[...v.allow],ask:[...v.ask],deny:[...v.deny]};return h[V]=v[V].filter((Q0)=>Q0!==I.rule),h}),b("list"),_(null),P({type:"success",text:"已删除本地权限规则"})}catch(v){P({type:"error",text:`删除失败: ${v instanceof Error?v.message:"未知错误"}`})}}),n=m8(()=>{if(K==="info")return[];let V=K;return[{key:"add-new-rule",label:`› ${uX[V]}`,value:{type:"add"}},...U[V].map((v)=>({key:v.key,label:nX(v.rule,v.source),value:{type:"rule",entry:v}}))]},[K,U]),r=()=>q0(_1,{marginBottom:1,children:T2.map((V,I)=>q0(_1,{marginRight:2,children:q0(V0,{color:I===Z?"yellow":"gray",children:["[",V.label,"]"]},void 0,!0,void 0,this)},V.key,!1,void 0,this))},void 0,!1,void 0,this),o=()=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),q0(_1,{flexDirection:"column",marginLeft:2,children:[q0(V0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",q.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),q0(V0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",q.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),q0(V0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",q.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q0(V0,{children:"说明:"},void 0,!1,void 0,this),q0(_1,{flexDirection:"column",marginLeft:2,children:[q0(V0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),q0(V0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),q0(V0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l=(V)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{bold:!0,children:lX[V]},void 0,!1,void 0,this),q0(V0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),q0(V0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),q0(_1,{marginTop:1,children:q0(mX,{value:N,onChange:A,onSubmit:S},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p=(V,I)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{bold:!0,children:["Delete ",V," permission rule?"]},void 0,!0,void 0,this),q0(V0,{children:I.rule},void 0,!1,void 0,this),q0(V0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),q0(V0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),q0(rJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(v)=>{if(v.value==="yes")E();else b("list"),_(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),d=(V)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),q0(V0,{children:V.rule},void 0,!1,void 0,this),q0(V0,{color:"gray",children:V.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),q0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F=(V)=>q0(rJ,{items:n,isFocused:z==="list",onSelect:H},void 0,!1,void 0,this),R=()=>{if(O)return q0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(K==="info")return o();if(z==="add")return l(K);if(z==="confirm-delete"&&T)return p(T.tab,T.entry);if(z==="locked"&&T)return d(T.entry);return F(K)};return q0(_1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[q0(V0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),r(),q0(_1,{flexDirection:"column",gap:1,children:R()},void 0,!1,void 0,this),k&&q0(_1,{marginTop:1,children:q0(V0,{color:k.type==="success"?"green":"red",children:k.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(_1,{marginTop:1,children:q0(V0,{color:"gray",children:"Tab 切换视图 · Esc 关闭 · Q 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as P0,Text as K0,useInput as tX}from"ink";import{useEffect as sX,useState as f$}from"react";import{jsxDEV as x}from"react/jsx-dev-runtime";var q4=["local","project","global"];function YY({workspaceRoot:$,onCancel:Q}){let Y=sJ($),J=Y.getAll(),[Z,X]=f$(0),[K,U]=f$(!1),[G,q]=f$(""),[L,O]=f$(null),[W,z]=f$("local"),[b,N]=f$(null),[A,T]=f$(0),_=Y.getBySource(),k=Y.getStats(),P=Y.getSourcePolicy(),w=k0(!1,Q);sX(()=>{let H=!0;return tJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((S)=>{if(H)N(S.settings)}).catch((S)=>{if(H)q(S instanceof Error?S.message:"无法读取插件作用域配置")}),()=>{H=!1}},[Y,A]);let C=()=>{z((H)=>{let S=q4.indexOf(H);return q4[(S+1)%q4.length]}),O(null)},B=async()=>{let H=J[Z];if(!H||K)return;if(H.source==="cli"){q(`${H.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(H.status==="error"){q(H.error??`${H.manifest.name} 当前不可用`);return}U(!0),q("");try{let S=await eJ(Y.getWorkspaceRoot(),H.manifest.name,H.status!=="active",W);q(S.effectiveEnabled?`已启用 ${H.manifest.name} · 生效层级 ${S.effectiveScope}`:`已禁用 ${H.manifest.name} · 生效层级 ${S.effectiveScope}`),T((E)=>E+1)}catch(S){q(S instanceof Error?S.message:String(S))}finally{U(!1)}},y=async()=>{if(K)return;U(!0),q("");try{await $Y(Y.getWorkspaceRoot()),X(0),q("插件列表已刷新"),T((H)=>H+1)}catch(H){q(H instanceof Error?H.message:String(H))}finally{U(!1)}},f=async()=>{let H=J[Z];if(!H||K)return;if(!H.installation){q(`${H.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}U(!0),O(null),q("");try{let{result:S}=await QY(Y.getWorkspaceRoot(),H.manifest.name,{trusted:!0});if(!S.success)throw Error(S.error);q(S.changed?`已更新 ${H.manifest.name} 到 ${S.installation?.revision}`:`${H.manifest.name} 已是最新版本`),T((E)=>E+1)}catch(S){q(S instanceof Error?S.message:String(S))}finally{U(!1)}},M=async()=>{let H=J[Z];if(!H||K)return;if(!H.installation){q(`${H.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(L!==H.manifest.name){O(H.manifest.name),q(`再次按 x 确认卸载 ${H.manifest.name}`);return}U(!0),q("");try{let{result:S}=await JY(Y.getWorkspaceRoot(),H.manifest.name,!0);if(!S.success)throw Error(S.error);O(null),X(0),q(`已卸载 ${H.manifest.name}`),T((E)=>E+1)}catch(S){q(S instanceof Error?S.message:String(S))}finally{U(!1)}};if(tX((H,S)=>{if(S.escape)Q?.();else if(S.ctrl&&H==="c"||S.meta&&H==="c")w();else if((S.upArrow||H==="k")&&J.length>0)O(null),X((E)=>(E-1+J.length)%J.length);else if((S.downArrow||H==="j")&&J.length>0)O(null),X((E)=>(E+1)%J.length);else if(H===" "||S.return)B();else if(H==="r")y();else if(H==="s")C();else if(H==="u")f();else if(H==="x")M()}),J.length===0)return x(P0,{flexDirection:"column",paddingY:1,children:[x(P0,{marginBottom:1,children:x(K0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(K0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{marginTop:1,paddingLeft:2,children:x(K0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{marginTop:1,children:x(K0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return x(P0,{flexDirection:"column",paddingY:1,children:[x(P0,{marginBottom:1,children:[x(K0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),x(K0,{color:"gray",children:[" (共 ",k.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,marginBottom:1,children:x(K0,{color:"gray",children:["启用: ",k.active," | 禁用: ",k.inactive," | 命令: ",k.commands," | 技能:"," ",k.skills," | 代理: ",k.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,marginBottom:1,children:x(K0,{color:"gray",children:["来源策略: ",P.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",P.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,marginBottom:1,children:x(K0,{color:"gray",children:["写入层级: ",x(K0,{color:"cyan",children:W},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_.cli.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(K0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),x(K0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.cli.map((H)=>{let S=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(K0,{children:[x(K0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",S," ",H.manifest.name]},void 0,!0,void 0,this),x(K0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&x(P0,{paddingLeft:2,children:x(K0,{color:"blue",children:["命令:"," ",H.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),_.project.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(K0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),x(K0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.project.map((H)=>{let S=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(K0,{children:[x(K0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",S," ",H.manifest.name]},void 0,!0,void 0,this),x(K0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",dimColor:!0,children:["生效层级:"," ",b?.[H.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&x(P0,{paddingLeft:2,children:x(K0,{color:"blue",children:["命令:"," ",H.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),_.user.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(K0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),x(K0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.user.map((H)=>{let S=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(K0,{children:[x(K0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",S," ",H.manifest.name]},void 0,!0,void 0,this),x(K0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",dimColor:!0,children:["生效层级:"," ",b?.[H.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&x(P0,{paddingLeft:2,children:x(K0,{color:"blue",children:["命令:"," ",H.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),x(P0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(K0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{marginTop:1,children:x(K0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&x(P0,{marginTop:1,children:x(K0,{color:G.includes("失败")?"red":"cyan",children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&x(K0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as Q1,Text as J1,useInput as ZY,useStdout as eX}from"ink";import $7 from"ink-text-input";import O4,{useCallback as C2,useMemo as Q7,useState as O$}from"react";import{jsxDEV as B0}from"react/jsx-dev-runtime";var J7=O4.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>B0(Q1,{flexDirection:"column",marginBottom:1,children:[B0(J1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),B0(Q1,{marginLeft:4,children:B0(J1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),Y7=O4.memo(({questions:$,answers:Q})=>B0(Q1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return B0(Q1,{marginBottom:1,children:[B0(J1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),B0(J1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),XY=O4.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=eX(),Z=J.columns||80,K=e0()==="confirmation-prompt",U=k0(!1),[G,q]=O$("answering"),[L,O]=O$(0),[W,z]=O$({}),[b,N]=O$(0),[A,T]=O$([]),[_,k]=O$(!1),[P,w]=O$(""),[C,B]=O$(0),y=$[L],f=Q7(()=>{if(!y)return[];return[...y.options.map((r)=>({label:r.label,value:r.label,description:r.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[y]),M=C2((r)=>{let o={...W,[y.header]:r};if(z(o),L<$.length-1)O(L+1),N(0),T([]),k(!1),w("");else q("submit"),B(0)},[W,y?.header,L,$.length]),H=C2((r)=>{let o=f[r];if(!o)return;if(o.value==="__other__"){k(!0);return}if(y.multiSelect)T((l)=>l.includes(o.value)?l.filter((p)=>p!==o.value):[...l,o.value]);else M(o.value)},[f,y?.multiSelect,M]),S=C2((r)=>{if(r.trim())M(r.trim())},[M]),E=C2(()=>{q("answering"),O(0),N(0),T([]),k(!1)},[]),n=C2(()=>{Q(W)},[W,Q]);if(ZY((r,o)=>{if(o.ctrl&&r==="c"||o.meta&&r==="c"){U();return}if(_){if(o.escape)k(!1),w("");return}if(o.escape){Y();return}let l=parseInt(r);if(l>=1&&l<=f.length){H(l-1);return}if(o.upArrow){N((p)=>p>0?p-1:f.length-1);return}if(o.downArrow||o.tab){N((p)=>p<f.length-1?p+1:0);return}if(o.return){if(y.multiSelect&&A.length>0)M(A);else H(b);return}if(r===" "&&y.multiSelect){let p=f[b];if(p&&p.value!=="__other__")T((d)=>d.includes(p.value)?d.filter((F)=>F!==p.value):[...d,p.value]);return}},{isActive:K&&G==="answering"&&!_}),ZY((r,o)=>{if(o.ctrl&&r==="c"||o.meta&&r==="c"){U();return}if(o.escape){Y();return}if(o.upArrow||o.downArrow||o.tab){B((l)=>l===0?1:0);return}if(o.return){if(C===0)n();else E();return}if(r.toLowerCase()==="y"){n();return}if(r.toLowerCase()==="e"){E();return}},{isActive:K&&G==="submit"}),G==="submit")return B0(Q1,{flexDirection:"column",borderStyle:"round",borderColor:K?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[B0(Q1,{marginBottom:1,children:B0(J1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(Y7,{questions:$,answers:W},void 0,!1,void 0,this),B0(Q1,{flexDirection:"column",marginTop:1,children:[B0(J1,{color:C===0?"yellow":void 0,bold:C===0,children:[C===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),B0(J1,{color:C===1?"yellow":void 0,bold:C===1,children:[C===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B0(Q1,{marginTop:1,children:B0(J1,{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(!y)return null;return B0(Q1,{flexDirection:"column",borderStyle:"round",borderColor:K?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[B0(Q1,{marginBottom:1,children:[B0(J1,{backgroundColor:"blue",color:"white",children:[" ",y.header," "]},void 0,!0,void 0,this),B0(J1,{children:[" ",y.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_?B0(Q1,{flexDirection:"column",marginTop:1,children:[B0(J1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),B0(Q1,{marginTop:1,children:[B0(J1,{color:"cyan",children:"> "},void 0,!1,void 0,this),B0($7,{value:P,onChange:w,onSubmit:S,focus:K},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(Q1,{marginTop:1,children:B0(J1,{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):B0(Q1,{flexDirection:"column",children:f.map((r,o)=>B0(J7,{option:r,index:o,isSelected:A.includes(r.value),isMultiSelect:y.multiSelect,isHighlighted:b===o},r.value,!1,void 0,this))},void 0,!1,void 0,this),!_&&B0(Q1,{marginTop:1,flexDirection:"column",children:[B0(J1,{color:"gray",children:y.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),y.multiSelect&&A.length>0&&B0(J1,{color:"green",children:["Selected: ",A.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&B0(Q1,{marginTop:1,children:B0(J1,{color:"gray",children:["Question ",L+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as Z7}from"node:path";import{Box as Q2,Text as L1,useInput as X7}from"ink";import K7 from"ink-select-input";import{useEffect as z4,useMemo as $2,useRef as zY,useState as p8}from"react";function KY($){return`${$.projectPath}\x00${$.sessionId}`}function GY($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function UY($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function qY($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function OY($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as r0}from"react/jsx-dev-runtime";function G7($){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 U7($){return Z7($)}function q7($){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 O7=({isSelected:$})=>r0(Q2,{marginRight:1,children:r0(L1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),z7=({isSelected:$,label:Q})=>r0(L1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),I2=20,_Y=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=p8([]),[K,U]=p8(!1),[G,q]=p8(0),[L,O]=p8(!1),W=zY(!1),z=zY(!0);z4(()=>{return z.current=!0,()=>{z.current=!1}},[]);let N=e0()==="session-selector",A=k0(!1);X7((y,f)=>{if(f.ctrl&&y==="c"||f.meta&&y==="c"){A();return}if(W.current)return;if(f.escape&&J){J();return}if(f.leftArrow||y==="h"||y==="H"){if(G>0)q((M)=>M-1);return}if(f.rightArrow||y==="l"||y==="L"){if(G<P-1)q((M)=>M+1);return}},{isActive:N}),z4(()=>{if(Q){X(Q);return}(async()=>{U(!0);try{let f=await T0.listSessions({includeSubagents:!1});X(f)}catch(f){console.error("[SessionSelector] Failed to load sessions:",f),X([])}finally{U(!1)}})()},[Q]);let T=$2(()=>qY(Q||Z,$),[$,Q,Z]),_=$2(()=>OY($),[$]),k=$2(()=>{return T.map((y)=>{let f=U7(y.taskSourceProjectPath??y.projectPath),M=G7(y.lastMessageTime),H=GY(y),S=`[${q7(y.taskStatus)}]`,E=y.gitBranch?` (${y.gitBranch})`:"",n=y.hasErrors?" [!]":"",r=y.taskRetriedFrom?` ↻ retry:${y.taskRetriedFrom.sessionId.slice(0,6)}`:y.relationType==="subagent"?" ↳ subagent":y.relationType==="fork"?" ↳ fork":"",o=y.taskIsolation==="worktree"?` | wt:${y.taskWorktreeBranch??"managed"}`:y.taskIsolation==="local"?" | local":"",l=y.taskDiffStat?` | ${y.taskDiffStat.changedFiles} files +${y.taskDiffStat.additions} -${y.taskDiffStat.deletions}`:"",p=y.taskStatus==="queued"&&y.taskQueuePosition?` | queue:${y.taskQueuePosition}/${y.taskQueueDepth??y.taskQueuePosition}`:"",d=UY(y);return{key:KY(y),label:`${S} ${H} · ${M} | ${f}${E} | ${y.messageCount} 条消息${o}${p}${l}${d}${n}${r}`,value:y}})},[T]),P=$2(()=>Math.max(1,Math.ceil(k.length/I2)),[k.length]),w=$2(()=>{let y=G*I2;return k.slice(y,y+I2)},[k,G]),C=$2(()=>({start:G*I2+1,end:Math.min((G+1)*I2,k.length)}),[G,k.length]);z4(()=>{q(0)},[T.length]);let B=(y)=>{if(W.current)return;W.current=!0,O(!0);let f=()=>{if(!z.current)return;W.current=!1,O(!1)};Promise.resolve().then(()=>Y(y.value)).then(f,f)};if(K)return r0(Q2,{flexDirection:"column",paddingX:2,paddingY:1,children:r0(L1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(T.length===0)return r0(Q2,{flexDirection:"column",paddingX:2,paddingY:1,children:[r0(L1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),r0(L1,{dimColor:!0,children:[`
158
- `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return r0(Q2,{flexDirection:"column",paddingX:2,paddingY:1,children:[r0(L1,{bold:!0,color:"cyan",children:_.title},void 0,!1,void 0,this),r0(L1,{dimColor:!0,children:[`
159
- `,_.instructions,`
160
- `]},void 0,!0,void 0,this),r0(K7,{items:w,onSelect:B,isFocused:N&&!L,indicatorComponent:O7,itemComponent:z7},void 0,!1,void 0,this),L&&r0(L1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),r0(Q2,{marginTop:1,flexDirection:"column",children:[r0(L1,{dimColor:!0,children:["第 ",G+1,"/",P," 页 · 共 ",T.length," 个会话 · 显示"," ",C.start,"-",C.end]},void 0,!0,void 0,this),P>1&&r0(Q2,{marginTop:1,children:[r0(L1,{color:G>0?"cyan":"gray",children:G>0?"<< 上一页":" "},void 0,!1,void 0,this),r0(L1,{children:" "},void 0,!1,void 0,this),r0(L1,{color:G<P-1?"cyan":"gray",children:G<P-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 NY,Text as f2}from"ink";import _7,{useEffect as N7,useState as F7}from"react";import{jsxDEV as z$}from"react/jsx-dev-runtime";var FY=["|","/","-","\\"],_4=_7.memo(()=>{let $=j2(),Q=b0(),Y=Q$(),[J,Z]=F7(0);if(N7(()=>{if($?.status!=="loading"){Z(0);return}let X=setInterval(()=>{Z((K)=>(K+1)%FY.length)},100);return()=>clearInterval(X)},[$?.status]),!$)return null;return z$(NY,{flexDirection:"column",borderStyle:"single",borderColor:Q.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[z$(NY,{children:[z$(f2,{bold:!0,color:Q.colors.info,children:"BTW"},void 0,!1,void 0,this),z$(f2,{color:Q.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&z$(f2,{color:Q.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&z$(f2,{color:Q.colors.text.secondary,children:[FY[J]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&z$(f2,{color:Q.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this),$.status==="completed"&&$.response&&z$(k1,{content:$.response,role:"assistant",terminalWidth:Math.max(20,Y-8),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});_4.displayName="SideConversationPanel";import{Box as p0,Text as f0,useInput as W7}from"ink";import{jsxDEV as Z0}from"react/jsx-dev-runtime";function HY({onCancel:$}){let Q=I1(),J=WY({cwd:Q}).getAll(),Z=J.filter((G)=>G.source==="builtin"),X=J.filter((G)=>G.source==="user"),K=J.filter((G)=>G.source==="project"),U=k0(!1,$);if(W7((G,q)=>{if(q.escape)$?.();else if(q.ctrl&&G==="c"||q.meta&&G==="c")U()}),J.length===0)return Z0(p0,{flexDirection:"column",paddingY:1,children:[Z0(p0,{marginBottom:1,children:Z0(f0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z0(p0,{marginTop:1,paddingLeft:2,children:Z0(f0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z0(p0,{marginTop:1,children:Z0(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Z0(p0,{flexDirection:"column",paddingY:1,children:[Z0(p0,{marginBottom:1,children:[Z0(f0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),Z0(f0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.length>0&&Z0(p0,{flexDirection:"column",marginBottom:1,children:[Z0(p0,{paddingLeft:1,children:[Z0(f0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),Z0(f0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.map((G)=>{let L=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Z0(p0,{flexDirection:"column",paddingLeft:2,children:[Z0(f0,{children:[Z0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Z0(f0,{color:"gray",children:[" - ",L]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&Z0(p0,{flexDirection:"column",marginBottom:1,children:[Z0(p0,{paddingLeft:1,children:[Z0(f0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),Z0(f0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((G)=>{let L=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Z0(p0,{flexDirection:"column",paddingLeft:2,children:[Z0(f0,{children:[Z0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Z0(f0,{color:"gray",children:[" - ",L]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&Z0(p0,{flexDirection:"column",marginBottom:1,children:[Z0(p0,{paddingLeft:1,children:[Z0(f0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),Z0(f0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((G)=>{let L=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Z0(p0,{flexDirection:"column",paddingLeft:2,children:[Z0(f0,{children:[Z0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Z0(f0,{color:"gray",children:[" - ",L]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.userInvocable&&Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"blue",children:["命令: /",G.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z0(p0,{marginTop:1,children:Z0(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as LY,Text as R1}from"ink";import H7,{useEffect as L7,useMemo as B7,useState as BY}from"react";import{jsxDEV as Y1,Fragment as N4}from"react/jsx-dev-runtime";var wY=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function w7($){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 bY=H7.memo(()=>{let $=t((q)=>q.app.subagentProgresses),Q=t((q)=>q.app.subagentProgress),Y=b0(),[J,Z]=BY(0),[X,K]=BY(()=>Date.now()),U=B7(()=>{let q=Object.values($);return q.length>0?q:Q?[Q]:[]},[Q,$]),G=U.some((q)=>q.status==="running");if(L7(()=>{if(!G){Z(0);return}let q=setInterval(()=>{Z((O)=>(O+1)%wY.length)},80),L=setInterval(()=>{K(Date.now())},1000);return()=>{clearInterval(q),clearInterval(L)}},[G]),U.length===0)return null;return Y1(LY,{paddingX:2,paddingY:0,flexDirection:"column",children:U.map((q)=>{let L=q.status==="running"?wY[J]:q.status==="completed"?"[OK]":"[X]",O=q.status==="running"?Y.colors.info:q.status==="completed"?Y.colors.success:Y.colors.error,W=Math.max(0,X-q.startTime);return Y1(LY,{flexDirection:"row",gap:1,children:[Y1(R1,{color:O,bold:!0,children:L},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.text.primary,bold:!0,children:q.type},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.text.secondary,children:q.description},void 0,!1,void 0,this),q.currentTool&&Y1(N4,{children:[Y1(R1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.warning,children:q.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="running"&&W>0&&Y1(N4,{children:[Y1(R1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.info,children:w7(W)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="failed"&&q.terminalSummary&&Y1(N4,{children:[Y1(R1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.error,children:q.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},q.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as J2,Text as a1}from"ink";import b7 from"react";import{jsxDEV as G1}from"react/jsx-dev-runtime";var F4={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},W4=b7.memo(()=>{let $=g4().filter((Y)=>Y.status!=="deleted"),Q=b0();if($.length===0)return null;return G1(J2,{flexDirection:"column",paddingX:2,children:$.map((Y)=>{let J=Y.tasks.filter((Z)=>Z.status==="completed").length;return G1(J2,{flexDirection:"column",marginBottom:1,children:[G1(J2,{gap:1,children:[G1(a1,{bold:!0,color:Y.status==="failed"?Q.colors.error:Y.status==="completed"?Q.colors.success:Q.colors.info,children:[F4[Y.status]," Team"]},void 0,!0,void 0,this),G1(a1,{bold:!0,color:Q.colors.text.primary,children:Y.name},void 0,!1,void 0,this),G1(a1,{color:Q.colors.muted,children:["| ",Y.members.length-1," members | ",J,"/",Y.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G1(J2,{flexDirection:"column",paddingLeft:2,children:[Y.members.filter((Z)=>Z.status!=="leader").map((Z)=>G1(J2,{gap:1,children:[G1(a1,{color:Q.colors.muted,children:F4[Z.status]},void 0,!1,void 0,this),G1(a1,{color:Q.colors.text.secondary,children:Z.name},void 0,!1,void 0,this),G1(a1,{color:Q.colors.muted,children:["(",Z.subagentType,", ",Z.status,Z.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this)),Y.tasks.map((Z)=>G1(J2,{gap:1,children:[G1(a1,{color:Q.colors.muted,children:F4[Z.status]},void 0,!1,void 0,this),G1(a1,{color:Q.colors.text.secondary,children:["#",Z.id," ",Z.subject]},void 0,!0,void 0,this),G1(a1,{color:Q.colors.muted,children:["(",Z.status,Z.owner?`, ${Z.owner}`:"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this))]},void 0,!0,void 0,this)]},Y.name,!0,void 0,this)})},void 0,!1,void 0,this)});W4.displayName="TeamProgress";import{useMemoizedFn as A7}from"ahooks";import{Box as D1,Text as a,useInput as P7}from"ink";import y7 from"ink-select-input";import{useState as AY}from"react";import{jsxDEV as u}from"react/jsx-dev-runtime";var PY=k$.map(($)=>({label:$.label,value:$.id})),R7=({theme:$})=>{let{colors:Q}=$;return u(D1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(a,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),u(a,{children:" "},void 0,!1,void 0,this),u(a,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),u(a,{children:[u(a,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),u(a,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(a,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(a,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[" ",u(a,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(a,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),u(a,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[" ",u(a,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),u(a,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(a,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(a,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[" ",u(a,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(a,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),u(a,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[" ",u(a,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:" "},void 0,!1,void 0,this),u(a,{color:Q.error,children:["- print(",u(a,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),u(a,{color:Q.success,children:["+ print(",u(a,{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)},M7=({theme:$})=>{let{colors:Q}=$;return u(D1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(a,{children:" "},void 0,!1,void 0,this),u(a,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),u(a,{children:" "},void 0,!1,void 0,this),u(a,{children:[u(a,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),u(a,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[u(a,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),u(a,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[u(a,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),u(a,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[u(a,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),u(a,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[u(a,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),u(a,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},yY=()=>{let $=t1(),Q=a0.getCurrentThemeName(),Y=k$.findIndex((b)=>b.label===Q),J=Y>=0?k$[Y].theme:k$[0].theme,[Z,X]=AY(J),[K,U]=AY(!1),G=A7(async(b)=>{if(K)return;U(!0);try{await m0().setTheme(b.value),$.closeModal()}catch(N){console.error("主题切换失败:",N instanceof Error?N.message:N)}finally{U(!1)}}),q=(b)=>{let N=k$.find((A)=>A.id===b.value);if(N)X(N.theme)},O=e0()==="theme-selector",W=k0(!1);P7((b,N)=>{if(N.ctrl&&b==="c"||N.meta&&b==="c"){W();return}if(N.escape&&!K)$.closeModal()},{isActive:O});let z=(b)=>{let{isSelected:N,label:A}=b,_=A===Q?"[OK]":" ";return u(a,{color:N?Z.colors.primary:Z.colors.text.primary,children:[_," ",A]},void 0,!0,void 0,this)};return u(D1,{flexDirection:"column",height:"100%",children:[u(D1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(a,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(D1,{flexDirection:"row",flexGrow:1,children:[u(D1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:u(D1,{flexDirection:"column",children:[u(D1,{paddingTop:1,paddingBottom:1,children:u(a,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",PY.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(y7,{items:PY,initialIndex:Y>=0?Y:0,onSelect:G,onHighlight:q,itemComponent:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(D1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[u(R7,{theme:Z},void 0,!1,void 0,this),u(M7,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u(D1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(a,{color:Z.colors.text.muted,children:K?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as M0}from"react/jsx-dev-runtime";var U1=s1("UI"),TY=({debug:$,continue:Q,...Y})=>{if($)U1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=c8(!1),Z=c8(!1),X=c8(!1),K=c8(null),U=v4(),G=D4(),q=V2(),L=h4(),O=j4(),W=t1(),z=n1(),b=j$(),N=I1(),A=u4(),T=h$(),_=x4();N$(()=>{if(a0.getCurrentThemeName()!==_)try{a0.setTheme(_)}catch{}},[_]);let k=U==="ready",P=U==="needsSetup",w=U==="idle",C=T7(()=>Y.agents?MY(Y.agents):void 0,[Y.agents]),{confirmationState:B,confirmationHandler:y,handleResponse:f,dismissAll:M}=S6(),{executeCommand:H,handleAbort:S,isProcessing:E,cleanupAgent:n}=C6(Y.systemPrompt,Y.appendSystemPrompt,y,Y.maxTurns,M,C),{getPreviousCommand:r,getNextCommand:o,addToHistory:l}=f6();a6();let p=D6("",0),d=s0(async()=>{let D=T,m;if(D==="default")m="autoEdit";else if(D==="autoEdit")m="plan";else if(D==="plan")m="default";else m="default";try{await T0.setSessionPermissionMode(b,N,m),await m0().setPermissionMode(m)}catch(W0){U1.error("权限模式切换失败:",W0 instanceof Error?W0.message:W0)}}),F=s0(async(D)=>{try{let m={displayName:D.displayName,provider:D.provider,model:D.model,overrides:D.overrides};if(D.modelProvider)await m0().addModelWithProvider(m,D.modelProvider);else await m0().addModel(m);W.setInitializationStatus("ready")}catch(m){throw U1.error("初始化配置保存失败:",m instanceof Error?m.message:m),m}}),R=s0(()=>{if(q==="shortcuts")W.closeModal();else W.setActiveModal("shortcuts")}),V=s0(async(D,m,W0)=>{return t2({intent:m,session:D,newSessionId:W0?.newSessionId,announceFork:W0?.announceFork,permissionModeOverride:Y.permissionMode},N,z,n)}),I=s0(async(D,m)=>{let E0=(await n2(m,N)).filter((h1)=>h1.sessionId===D);if(E0.length===0)throw Error(`Session not found: ${D}`);if(E0.length>1)throw Error(`Multiple workspaces contain session ${D}; use the session selector`);return E0[0]}),{showSuggestions:v,suggestions:h,selectedSuggestionIndex:Q0}=r6(p,H,r,o,l,S,E,d,R,q==="shortcuts");N$(()=>{if(p.value&&q==="shortcuts")W.closeModal()},[p.value,q,W]);let e=s0(async()=>{X.current=!0;try{let D=Y.forkSession?"fork":"resume",m=await n2(D,N);if(m.length===0){if(Y.forkSession){U1.error("没有可供 fork 的历史会话"),f1(1);return}z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let W0=m[0];await V(W0,D,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(D){if(U1.error("[BladeInterface] 继续会话失败:",D),Y.forkSession){f1(1);return}z.addAssistantMessage("继续会话失败,开始新对话。")}}),X0=s0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let W0=Y.forkSession?"fork":"resume",x0=await I(Y.resume,W0);await V(x0,W0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let D=Y.forkSession?"fork":"resume",m=await n2(D,N);if(m.length===0)U1.error("没有找到历史会话"),f1(1);W.showSessionSelector(m,D)}catch(D){U1.error("[BladeInterface] 加载会话失败:",D),f1(1)}});N$(()=>{if(J.current)return;if(Q){J.current=!0,e();return}if(Y.resume)J.current=!0,X0()},[Q,Y.resume,e,X0]);let A0=s0(async(D)=>{let m=B.details?.type;if(m==="enterPlanMode"&&D.approved)try{await T0.setSessionPermissionMode(b,N,"plan"),await m0().setPermissionMode("plan"),U1.debug("[BladeInterface] Entered Plan mode")}catch(W0){U1.error("[BladeInterface] Failed to enter Plan mode:",W0)}if(m==="exitPlanMode"&&D.approved)U1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");f(D)}),D0=s0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),f1(0)}),j0=s0(()=>{W.closeModal()}),W$=s0(async(D)=>{try{await V(D,L?.intent??"resume"),W.closeModal()}catch(m){U1.error("[BladeInterface] Failed to restore session:",m),z.addAssistantMessage(`会话操作失败: ${m instanceof Error?m.message:"未知错误"}`),W.closeModal()}}),X2=s0(()=>{if(Y.resume)f1(0);else W.closeModal()}),K2=s0((D)=>{W.showModelEditWizard(D)}),G2=s0((D)=>{z.addAssistantMessage(`已添加模型配置: ${D.displayName??D.model},并已切换到该模型`),j0()}),j1=s0((D)=>{z.addAssistantMessage(`已更新模型配置: ${D.displayName??D.model}`),j0()});N$(()=>{if(P){A.setFocus("model-config-wizard");return}if(B.isVisible)A.setFocus("confirmation-prompt");else if(q==="sessionSelector")A.setFocus("session-selector");else if(q==="themeSelector")A.setFocus("theme-selector");else if(q==="modelSelector")A.setFocus("model-selector");else if(q==="modelAddWizard"||q==="modelEditWizard")A.setFocus("model-config-wizard");else if(q==="permissionsManager")A.setFocus("permissions-manager");else if(q==="agentsManager")A.setFocus("agents-manager");else if(q==="agentCreationWizard")A.setFocus("agent-creation-wizard");else if(q==="hooksManager")A.setFocus("hooks-manager");else if(q==="shortcuts")A.setFocus("main-input");else A.setFocus("main-input")},[P,B.isVisible,q,A.setFocus]),N$(()=>{if(!k||X.current)return;if(RY().length>0){X.current=!0;return}X.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[k]),N$(()=>{if(!G)return;if(K.current===G)return;if(K.current=G,U==="error")z.addAssistantMessage(`初始化失败: ${G}`);else z.addAssistantMessage(`${G}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[G,U,z.addAssistantMessage]);let v$=s0(async(D)=>{try{await H({displayText:D,text:D,images:[],parts:[{type:"text",text:D}]})}catch(m){let W0=m instanceof Error?m.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${W0}`)}});N$(()=>{let D=Y.initialMessage?.trim();if(!D||Z.current||!k||P)return;Z.current=!0,l(D),v$(D)},[Y.initialMessage,k,P,H,l]);let c0=s0(async(D)=>{try{await m0().setPermissionMode(D)}catch(m){U1.error("权限模式初始化失败:",m instanceof Error?m.message:m)}});if(N$(()=>{let D=Y.permissionMode;if($)U1.debug("[Debug] permissionMode from CLI:",D),U1.debug("[Debug] current permissionMode:",T);if(!D||D===T)return;c0(D)},[Y.permissionMode,T]),w)return null;if(P)return M0(U4,{mode:"setup",onComplete:F,onCancel:D0},void 0,!1,void 0,this);if($)U1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:B.isVisible,activeModal:q});let H$=q==="modelSelector",M1=O,L$=q==="modelAddWizard"?"add":q==="modelEditWizard"&&M1?"edit":null,r8=H$||Boolean(L$),S2=q==="agentsManager",a8=q==="agentCreationWizard",T1=q==="skillsManager",o8=q==="pluginsManager",J0=M1?{displayName:M1.displayName,provider:M1.provider,model:M1.model,overrides:M1.overrides}:void 0,N0=B.isVisible&&B.details?B.details.type==="mcpElicitation"&&B.details.mcpElicitation?M0(WJ,{details:B.details.mcpElicitation,onComplete:(D,m)=>A0({approved:D.action==="accept",elicitation:D,...m?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):B.details.type==="askUserQuestion"&&B.details.questions?M0(XY,{questions:B.details.questions,onComplete:(D)=>A0({approved:!0,answers:D}),onCancel:()=>A0({approved:!1})},void 0,!1,void 0,this):M0(g9,{details:B.details,onResponse:A0},void 0,!1,void 0,this):q==="themeSelector"?M0(yY,{},void 0,!1,void 0,this):q==="permissionsManager"?M0(nJ,{onClose:j0},void 0,!1,void 0,this):q==="sessionSelector"?M0(_Y,{intent:L?.intent??"resume",sessions:L?.sessions,onSelect:W$,onCancel:X2},void 0,!1,void 0,this):q==="hooksManager"?M0(p9,{workspaceRoot:N,sessionId:b,onClose:j0},void 0,!1,void 0,this):null,F0=Boolean(N0);return M0(_$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[N0,M0(_$,{flexDirection:"column",display:F0?"none":"flex",children:[M0(fJ,{},void 0,!1,void 0,this),M0(bY,{},void 0,!1,void 0,this),M0(W4,{},void 0,!1,void 0,this),M0(_4,{},void 0,!1,void 0,this),M0(zJ,{paused:F0},void 0,!1,void 0,this),M0(XJ,{input:p.value,cursorPosition:p.cursorPosition,onChange:p.setValue,onChangeCursorPosition:p.setCursorPosition,onAddPasteMapping:p.addPasteMapping,onAddImagePasteMapping:p.addImagePasteMapping},void 0,!1,void 0,this),H$&&M0(_$,{marginTop:1,paddingX:2,children:M0(kJ,{onClose:j0,onEdit:K2},void 0,!1,void 0,this)},void 0,!1,void 0,this),L$&&M0(_$,{marginTop:1,paddingX:2,children:M0(U4,{mode:L$,modelId:M1?.id,initialConfig:L$==="edit"?J0:void 0,onComplete:L$==="edit"?j1:G2,onCancel:j0},void 0,!1,void 0,this)},void 0,!1,void 0,this),S2&&M0(_$,{marginTop:1,paddingX:2,children:M0(s6,{workspaceRoot:N,onComplete:j0,onCancel:j0},void 0,!1,void 0,this)},void 0,!1,void 0,this),a8&&M0(_$,{marginTop:1,paddingX:2,children:M0(w2,{onComplete:j0,onCancel:j0},void 0,!1,void 0,this)},void 0,!1,void 0,this),T1&&M0(_$,{marginTop:1,paddingX:2,children:M0(HY,{onComplete:j0,onCancel:j0},void 0,!1,void 0,this)},void 0,!1,void 0,this),o8&&M0(_$,{marginTop:1,paddingX:2,children:M0(YY,{workspaceRoot:N,onComplete:j0,onCancel:j0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(X9,{suggestions:h,selectedIndex:Q0,visible:v&&!r8},void 0,!1,void 0,this),M0(Z9,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as C7,Text as F$}from"ink";import I7 from"react";import{jsxDEV as o1}from"react/jsx-dev-runtime";class k2 extends I7.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 o1(C7,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[o1(F$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),o1(F$,{children:" "},void 0,!1,void 0,this),o1(F$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),o1(F$,{children:" "},void 0,!1,void 0,this),o1(F$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),o1(F$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),o1(F$,{children:" "},void 0,!1,void 0,this),o1(F$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as S$,Text as i1,useInput as f7}from"ink";import{useState as H4}from"react";import{jsxDEV as Z1}from"react/jsx-dev-runtime";var x8=[{key:"update",label:"Update now",description:`runs \`${IY()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],kY=({versionInfo:$,onComplete:Q})=>{let[Y,J]=H4(0),[Z,X]=H4(!1),[K,U]=H4(null);f7((q,L)=>{if(L.ctrl&&q==="c"){L2().shutdown("SIGINT",0);return}if(Z||K)return;if(L.upArrow||q==="k")J((O)=>O>0?O-1:x8.length-1);else if(L.downArrow||q==="j")J((O)=>O<x8.length-1?O+1:0);else if(L.return)G(x8[Y].key);else if(q==="1")G("update");else if(q==="2")G("skip");else if(q==="3")G("skip_until_next")});let G=async(q)=>{switch(q){case"update":{X(!0);let L=await fY();U(L.message),setTimeout(()=>{L2().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await CY($.latestVersion);Q();break}};if(K)return Z1(S$,{flexDirection:"column",marginY:1,children:Z1(i1,{children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return Z1(S$,{flexDirection:"column",marginY:1,children:Z1(i1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return Z1(S$,{flexDirection:"column",marginY:1,children:[Z1(i1,{color:"yellow",bold:!0,children:["Update available! ",Z1(i1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z1(S$,{marginTop:1,children:Z1(i1,{color:"gray",children:["Release notes:"," ",Z1(i1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Z1(S$,{flexDirection:"column",marginTop:1,children:x8.map((q,L)=>{let O=L===Y,W=O?"› ":" ",z=`${L+1}. `;return Z1(S$,{children:Z1(i1,{color:O?"cyan":void 0,children:[W,z,q.label,q.description&&Z1(i1,{color:"gray",children:[" (",q.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},q.key,!1,void 0,this)})},void 0,!1,void 0,this),Z1(S$,{marginTop:1,children:Z1(i1,{color:"gray",children:"Press enter to continue"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as u8,Text as Y2,useInput as k7}from"ink";import{useState as SY}from"react";import{jsxDEV as V1}from"react/jsx-dev-runtime";var vY=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=a0.getTheme(),[Z,X]=SY(!1),[K,U]=SY(null);return k7((G,q)=>{if(Z)return;if(q.return||G.toLowerCase()==="t"){X(!0),U(null),Q().catch((L)=>{U(L instanceof Error?L.message:"Failed to trust workspace"),X(!1)});return}if(G.toLowerCase()==="s"||q.escape)X(!0),U(null),Y().catch((L)=>{U(L instanceof Error?L.message:"Failed to continue safely"),X(!1)})}),V1(u8,{flexDirection:"column",paddingX:1,children:[V1(Y2,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),V1(Y2,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),V1(u8,{marginTop:1,flexDirection:"column",children:[V1(Y2,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((G)=>V1(Y2,{children:[" ",G.path," · ",G.effects.length," effect(s)"]},`${G.kind}:${G.path}`,!0,void 0,this))]},void 0,!0,void 0,this),K&&V1(u8,{marginTop:1,children:V1(Y2,{color:J.colors.error,children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),V1(u8,{marginTop:1,children:V1(Y2,{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 S7}from"ink";import{useEffect as v7}from"react";function DY(){let{stdout:$}=S7();v7(()=>{if(!$.isTTY)return;return $.write(u9),$.write(uQ),()=>{$.write(l9),$.write(uQ)}},[$])}function VY($){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 Z2}from"react/jsx-dev-runtime";function V7($){if(l0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");o0().setInitializationStatus("ready")}var AH=($)=>{DY();let[Q,Y]=d8(!1),[J,Z]=d8(null),[X,K]=d8(!1),[U,G]=d8(null),q=l8((z,b)=>{let N=z instanceof Error?z.message:String(z);if(o0().setInitializationError(N),o0().setInitializationStatus("error"),Y(!0),b)console.error("[FAIL] 应用初始化失败:",N)}),L=l8(async()=>{try{let z=l0().config.config??hY,b=EY(z,$);if(V7(b),b.resumeSessionId)gY().restoreSession(b.resumeSessionId,[]);if(b.debug)console.error("[Debug] 运行时配置:",b);let N=b.codeTheme;if(N&&a0.hasTheme(N)){if(a0.setTheme(N),$.debug)console.log(`[OK] 已加载主题: ${N}`)}try{q1.getInstance().loadConfig(b.hooks||{},d0());let T=await mY(d0());if($.debug&&b.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${T.subagents.getAllNames().length} agents, ${T.skills.size} skills, ${T.commands.getCommandCount()+T.commands.getPluginCommandCount()} commands, ${T.plugins.getAll().length} plugins`);let k=l0().session.sessionId;jY(k)}catch(A){if($.debug)console.warn("Hooks 初始化失败:",VY(A))}$8(async()=>{await cY.getInstance().killAll(),await pY.getInstance().disconnectAll(),q1.getInstance().cleanup()}),Y(!0)}catch(z){q(z,!!$.debug)}}),O=l8(async()=>{let z=await L4.getInstance().getStatus(d0());if(z.state==="untrusted"||z.state==="error"){G(z);return}await L()}),W=l8(async()=>{if($.versionCheckPromise){let z=await $.versionCheckPromise;if(z){Z(z),K(!0);return}}await O()});if(D7(()=>{W()},[]),X&&J)return Z2(k2,{children:Z2(kY,{versionInfo:J,onComplete:()=>{K(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(U)return Z2(k2,{children:Z2(vY,{status:U,onTrust:async()=>{await L4.getInstance().trust(d0()),await xY(),G(null),await L()},onContinueSafely:async()=>{G(null),await L()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return Z2(k2,{children:Z2(TY,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{AH as AppWrapper};