blade-code 0.10.128 → 0.10.130

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 (144) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-0z9nqbd0.js +2 -0
  3. package/dist/chunk-1bb4h5gf.js +1 -0
  4. package/dist/chunk-2bnpn8be.js +1 -0
  5. package/dist/{chunk-xzfc1s6k.js → chunk-2y1qngw7.js} +1 -1
  6. package/dist/{chunk-jy0vfp8a.js → chunk-42h7kj6p.js} +1 -1
  7. package/dist/{chunk-ted1hyvb.js → chunk-44jtpg8y.js} +1 -1
  8. package/dist/chunk-4sxxvtn4.js +1 -0
  9. package/dist/chunk-51qc7n8t.js +1 -0
  10. package/dist/{chunk-z3hpstky.js → chunk-53h87fmt.js} +1 -1
  11. package/dist/{chunk-y93nqyqd.js → chunk-55hq1ps4.js} +2 -2
  12. package/dist/{chunk-9n90djh7.js → chunk-5a17mdjd.js} +2 -2
  13. package/dist/{chunk-pq6g92cz.js → chunk-6p6ts4kv.js} +2 -2
  14. package/dist/{chunk-sca5q3tt.js → chunk-77efqpdc.js} +1 -1
  15. package/dist/chunk-7jj607dg.js +94 -0
  16. package/dist/{chunk-yqqeh12b.js → chunk-8a6nrqdc.js} +2 -2
  17. package/dist/{chunk-10w2pj3r.js → chunk-93x9xbew.js} +1 -1
  18. package/dist/{chunk-1aw643j2.js → chunk-9et78e3v.js} +2 -2
  19. package/dist/chunk-9gs4eqt8.js +1 -0
  20. package/dist/chunk-9s8saznq.js +1 -0
  21. package/dist/{chunk-fa0pyv9k.js → chunk-9yqadjea.js} +2 -2
  22. package/dist/{chunk-a7gghhvn.js → chunk-a4jetpj8.js} +18 -18
  23. package/dist/{chunk-yqpej45c.js → chunk-a60cmnmz.js} +2 -2
  24. package/dist/{chunk-8hd4vd20.js → chunk-aaxc81jc.js} +1 -1
  25. package/dist/{chunk-xejvs1fk.js → chunk-agda17kj.js} +1 -1
  26. package/dist/{chunk-c47db31j.js → chunk-ajsw4te2.js} +2 -2
  27. package/dist/{chunk-r04vwtej.js → chunk-ar5np5h5.js} +2 -2
  28. package/dist/chunk-b8m7zc7t.js +170 -0
  29. package/dist/chunk-bcre3557.js +1 -0
  30. package/dist/{chunk-atema2rc.js → chunk-dfjmvj3d.js} +2 -2
  31. package/dist/chunk-dkgaxmsp.js +10 -0
  32. package/dist/{chunk-mkvvyq49.js → chunk-e1d0e6t6.js} +2 -2
  33. package/dist/{chunk-s7axaw78.js → chunk-edtxcqxa.js} +1 -1
  34. package/dist/chunk-f8gb685p.js +2 -0
  35. package/dist/chunk-fjv2vede.js +1 -0
  36. package/dist/{chunk-zfyg3888.js → chunk-g4xny949.js} +1 -1
  37. package/dist/chunk-gfbkrk60.js +338 -0
  38. package/dist/{chunk-12hdakw4.js → chunk-gmqpfm52.js} +2 -2
  39. package/dist/{chunk-skv2gb99.js → chunk-grhsv55v.js} +2 -2
  40. package/dist/chunk-gzz0gnmv.js +1 -0
  41. package/dist/chunk-h1wphqkc.js +1 -0
  42. package/dist/{chunk-6v2hhgka.js → chunk-hhg1zcbq.js} +2 -2
  43. package/dist/{chunk-9hnfz9bx.js → chunk-hw1gbr11.js} +1 -1
  44. package/dist/{chunk-nx8xb7dm.js → chunk-jkfkyedn.js} +1 -1
  45. package/dist/chunk-kd3k1q9z.js +1 -0
  46. package/dist/{chunk-n8w1jxsh.js → chunk-kfkvdj49.js} +1 -1
  47. package/dist/chunk-m9mw8ppy.js +1 -0
  48. package/dist/{chunk-xshrj2nd.js → chunk-mdew58v9.js} +1 -1
  49. package/dist/{chunk-n4q6fvqe.js → chunk-mvm1rzc4.js} +2 -2
  50. package/dist/{chunk-qm632an7.js → chunk-p00f53yq.js} +1 -1
  51. package/dist/{chunk-p7349xay.js → chunk-p2sp2e0a.js} +2 -2
  52. package/dist/chunk-pj69j4zp.js +2 -0
  53. package/dist/{chunk-41byj2h8.js → chunk-pk11fexz.js} +2 -2
  54. package/dist/chunk-qahz5x5c.js +14 -0
  55. package/dist/{chunk-6m4sqwj0.js → chunk-qcvxff27.js} +2 -2
  56. package/dist/{chunk-p2rxrxct.js → chunk-r9tawy93.js} +3 -3
  57. package/dist/{chunk-rz2wc93t.js → chunk-s2atpv23.js} +4 -4
  58. package/dist/chunk-saedy6bj.js +1 -0
  59. package/dist/{chunk-fgbqm2jh.js → chunk-sfe4810k.js} +1 -1
  60. package/dist/{chunk-96w8ay2h.js → chunk-sj1dzeta.js} +1 -1
  61. package/dist/chunk-sn71fsm5.js +1 -0
  62. package/dist/{chunk-yysqw1cq.js → chunk-ss4sncn3.js} +2 -2
  63. package/dist/chunk-ss86eq2h.js +23 -0
  64. package/dist/{chunk-ektgnqmh.js → chunk-sx77dpxw.js} +1 -1
  65. package/dist/chunk-t4apxzp1.js +2 -0
  66. package/dist/chunk-te6203yf.js +1 -0
  67. package/dist/{chunk-gxwkwkhp.js → chunk-tkydv9k8.js} +1 -1
  68. package/dist/{chunk-60he05xs.js → chunk-tw5fr07c.js} +2 -2
  69. package/dist/{chunk-q3y3s16v.js → chunk-v52wc8yg.js} +2 -2
  70. package/dist/{chunk-b408cqg1.js → chunk-v5hzk7j2.js} +2 -2
  71. package/dist/{chunk-v4nqv1pr.js → chunk-v94ztjtp.js} +385 -385
  72. package/dist/{chunk-85jv1sr7.js → chunk-xa9k5pjt.js} +2 -2
  73. package/dist/{chunk-mvgmsjwq.js → chunk-z03dtyh6.js} +1 -1
  74. package/dist/{chunk-jxc67ydz.js → chunk-zc91c7b5.js} +2 -2
  75. package/dist/{chunk-mm05y2c5.js → chunk-zkzhm39s.js} +1 -1
  76. package/dist/{chunk-1xg7qx35.js → chunk-zwjrensv.js} +1 -1
  77. package/dist/web/assets/ChatView-Bg36FUaj.js +53 -0
  78. package/dist/web/assets/{CodeBlockHighlighter-0VOa5Mes.js → CodeBlockHighlighter-D5rB73Eo.js} +2 -2
  79. package/dist/web/assets/FilePreview-BxaBSmap.js +65 -0
  80. package/dist/web/assets/KanbanBoard-B4gx3JMo.js +16 -0
  81. package/dist/web/assets/{MarkdownRenderer-3g4TPTeI.js → MarkdownRenderer-BRH7LHhN.js} +3 -3
  82. package/dist/web/assets/ScrollArea-DikU3QeQ.js +1 -0
  83. package/dist/web/assets/SessionHistorySurface-DG80d6-F.js +6 -0
  84. package/dist/web/assets/{SettingsModal-3GMy6V-E.js → SettingsModal-Bxqkok81.js} +3 -3
  85. package/dist/web/assets/Sidebar-DGaHGcHx.js +31 -0
  86. package/dist/web/assets/TaskSwitcher-DOnLPurk.js +26 -0
  87. package/dist/web/assets/TerminalPanel-BzhCF9vw.js +6 -0
  88. package/dist/web/assets/archive-BiDGrqry.js +6 -0
  89. package/dist/web/assets/{arrow-left-03GxbYI7.js → arrow-left-BY-esOAP.js} +1 -1
  90. package/dist/web/assets/{calendar-clock-8W4ostX1.js → calendar-clock-BCyxvfVt.js} +1 -1
  91. package/dist/web/assets/chevron-right-Bg-10yuN.js +6 -0
  92. package/dist/web/assets/{chevrons-up-down-BboZzEAk.js → chevrons-up-down-M5SAJq7T.js} +1 -1
  93. package/dist/web/assets/{clock-3-aXgeptZP.js → clock-3-v-nHTA0A.js} +1 -1
  94. package/dist/web/assets/copy-p1zc_rjZ.js +6 -0
  95. package/dist/web/assets/download-D_-kbJXR.js +6 -0
  96. package/dist/web/assets/{external-link-UkIIC2ds.js → external-link-wSGTIqe3.js} +1 -1
  97. package/dist/web/assets/{folder-BOCc5dv2.js → folder-Ltm9jCS5.js} +1 -1
  98. package/dist/web/assets/index-B4186fIT.css +1 -0
  99. package/dist/web/assets/index-_xnlrekR.js +210 -0
  100. package/dist/web/assets/{pause-DVIT6IIr.js → pause-_LvCZkxM.js} +1 -1
  101. package/dist/web/assets/pencil-DB6ICr_h.js +6 -0
  102. package/dist/web/assets/{play-DsdF5dji.js → play-BRXP1rHJ.js} +1 -1
  103. package/dist/web/assets/plus-BqvjEpLw.js +6 -0
  104. package/dist/web/assets/session-events-AGMXvPey.js +22 -0
  105. package/dist/web/assets/settings-LfQbDvBA.js +6 -0
  106. package/dist/web/assets/teamService-B5FnUcet.js +1 -0
  107. package/dist/web/assets/terminal-By4sO9Gw.js +6 -0
  108. package/dist/web/assets/vendor-radix-D6QrtXqd.js +45 -0
  109. package/dist/web/index.html +3 -3
  110. package/package.json +1 -1
  111. package/dist/chunk-0ktte40x.js +0 -185
  112. package/dist/chunk-1acb8fwq.js +0 -120
  113. package/dist/chunk-3pwqqk7w.js +0 -1
  114. package/dist/chunk-3q7g9206.js +0 -1
  115. package/dist/chunk-562w5zc6.js +0 -2
  116. package/dist/chunk-5x56nka1.js +0 -1
  117. package/dist/chunk-7hajkvde.js +0 -1
  118. package/dist/chunk-9wptwfmg.js +0 -1
  119. package/dist/chunk-ap01rwg0.js +0 -169
  120. package/dist/chunk-cm8fy1jn.js +0 -1
  121. package/dist/chunk-dp4r5bay.js +0 -1
  122. package/dist/chunk-dtxza4zh.js +0 -1
  123. package/dist/chunk-hd7bxzvy.js +0 -1
  124. package/dist/chunk-hks48s9k.js +0 -1
  125. package/dist/chunk-hmncnf7p.js +0 -1
  126. package/dist/chunk-j6fj679p.js +0 -10
  127. package/dist/chunk-m8czdpyg.js +0 -1
  128. package/dist/chunk-p5awnndq.js +0 -8
  129. package/dist/chunk-s7peh6kf.js +0 -2
  130. package/dist/chunk-ws6gtw33.js +0 -1
  131. package/dist/chunk-wtmhqy5s.js +0 -1
  132. package/dist/chunk-xnstybjm.js +0 -2
  133. package/dist/chunk-xpdtg9h9.js +0 -23
  134. package/dist/chunk-z2jwm4s8.js +0 -1
  135. package/dist/web/assets/ChatView-DCHnicTP.js +0 -58
  136. package/dist/web/assets/FilePreview-C_3KHzzj.js +0 -65
  137. package/dist/web/assets/KanbanBoard-D_NTkUnD.js +0 -16
  138. package/dist/web/assets/TaskSwitcher-eCdxu5Eo.js +0 -26
  139. package/dist/web/assets/TerminalPanel-9q9Trmv9.js +0 -6
  140. package/dist/web/assets/index-DGf6Z2kM.css +0 -1
  141. package/dist/web/assets/index-DaiT-mmo.js +0 -275
  142. package/dist/web/assets/session-events-CWzF04l4.js +0 -22
  143. package/dist/web/assets/teamService-BliaDj1Z.js +0 -1
  144. package/dist/web/assets/vendor-radix-Bc1_Q9tz.js +0 -45
@@ -0,0 +1,170 @@
1
+ import{e as o3,f as n3,h as S$,i as X6}from"./chunk-t4apxzp1.js";import{l as oZ,m as nZ,n as tZ}from"./chunk-p2sp2e0a.js";import{A as h8,y as p9,z as x9}from"./chunk-5a17mdjd.js";import{Ba as oY,I as iY,M as zX,O as JJ,P as r4,Q as mY,W as CY,X as RY,aa as x$,ca as r9,da as a9,fa as IY,ha as c2,ia as OZ,ja as NZ,ma as FZ,na as WZ,ra as q9,sa as B6,ua as H6,va as L6,wa as _X,xa as zY,za as _Y}from"./chunk-v94ztjtp.js";import"./chunk-6p6ts4kv.js";import{Ja as D3,Ka as f3,La as V3,Oa as qX}from"./chunk-tw5fr07c.js";import{Qa as TY}from"./chunk-v52wc8yg.js";import{Kb as yY,Tb as x4,xb as bY,yb as MY}from"./chunk-s2atpv23.js";import{cc as a2}from"./chunk-77efqpdc.js";import{Bd as d9,Gd as l9,Id as k8,Qd as u2,Td as i0,md as HY,wd as m9,xd as L2}from"./chunk-7jj607dg.js";import"./chunk-53h87fmt.js";import{ve as n9,we as p4,xe as t9}from"./chunk-gfbkrk60.js";import{Ue as V8}from"./chunk-0z9nqbd0.js";import{ff as aZ}from"./chunk-gmqpfm52.js";import{gf as i2,hf as g8,jf as n$}from"./chunk-9et78e3v.js";import"./chunk-a60cmnmz.js";import{Af as H$,Bf as rZ,Cf as L4,Df as l2,Gf as UY,Nf as q$,nf as K2,of as W$,pf as v1,qf as CJ,rf as R8,sf as u9,tf as t6,uf as lJ,vf as x3,wf as s6,xf as O2,yf as U$,zf as GX}from"./chunk-zc91c7b5.js";import"./chunk-v508x7cg.js";import"./chunk-mdew58v9.js";import"./chunk-ajsw4te2.js";import{bg as rJ}from"./chunk-mvm1rzc4.js";import"./chunk-edtxcqxa.js";import"./chunk-8a6nrqdc.js";import{Fg as KX,og as x8,rg as VZ,wg as _Z}from"./chunk-a4jetpj8.js";import"./chunk-sx77dpxw.js";import"./chunk-aaxc81jc.js";import"./chunk-93x9xbew.js";import{ch as kJ,eh as j$}from"./chunk-r9tawy93.js";import"./chunk-g4xny949.js";import{ri as QX,wi as zZ,xi as UX}from"./chunk-hhg1zcbq.js";import"./chunk-jkfkyedn.js";import{Ai as w2,Bi as S8,Di as SJ}from"./chunk-f8gb685p.js";import{Ii as K$}from"./chunk-44jtpg8y.js";import"./chunk-sj1dzeta.js";import"./chunk-2y1qngw7.js";import{lj as XX,oj as V1}from"./chunk-ar5np5h5.js";import{qj as r3,rj as a3,uj as W1}from"./chunk-dfjmvj3d.js";import"./chunk-tkydv9k8.js";import{Gj as E3}from"./chunk-v5hzk7j2.js";import{Jj as K9}from"./chunk-qcvxff27.js";import"./chunk-zwjrensv.js";import{Mj as m4,ek as QY}from"./chunk-pj69j4zp.js";import{rk as IJ}from"./chunk-zkzhm39s.js";import{useMemoizedFn as k4}from"ahooks";import{useEffect as yG,useState as S4}from"react";import{useMemoizedFn as _$}from"ahooks";import dZ from"ansi-escapes";import{Box as R1,useStdout as LG}from"ink";import{useEffect as o$,useMemo as wG,useRef as g2,useState as lZ}from"react";import{useShallow as FX}from"zustand/react/shallow";import{useStore as NX}from"zustand";function z0($){return NX(O2,$)}var WX=[],N2=()=>z0(($)=>$.session.sessionId),U1=()=>z0(($)=>$.session.workspaceRoot),N8=()=>z0(($)=>$.session.messages),z9=()=>z0(($)=>$.session.clearCount),_9=()=>z0(($)=>$.session.isCompacting),O9=()=>z0(($)=>$.session.tokenUsage.estimatedCostUsd),N9=()=>z0(($)=>{let{totalInputTokens:J,cacheReadTokens:Z,cacheWriteTokens:Y}=$.session.tokenUsage;return q9({totalInputTokens:J,cacheReadTokens:Z,cacheWriteTokens:Y}).hitRate}),F9=()=>z0(($)=>$.session.providerCircuit),W9=()=>z0(($)=>$.session.providerAdmission),H9=()=>z0(($)=>$.session.providerRetry),L9=()=>z0(($)=>$.session.providerStall),w9=()=>z0(($)=>$.session.actionStationarity),D1=()=>z0(($)=>$.session.actions),B9=()=>z0(($)=>{let{totalTokens:J,maxContextTokens:Z}=$.session.tokenUsage;if(Z<=0)return 100;let Y=Math.max(0,100-J/Z*100);return Math.round(Y)}),A9=()=>z0(($)=>$.app.initializationStatus),P9=()=>z0(($)=>$.app.initializationError),F8=()=>z0(($)=>$.app.activeModal),b9=()=>z0(($)=>$.app.tasks),M9=()=>z0(($)=>$.app.modelEditorTarget),y9=()=>z0(($)=>$.app.sessionSelectorData),T9=()=>z0(($)=>$.app.sessionHistoryViewerData),C9=()=>z0(($)=>$.app.awaitingSecondCtrlC),f1=()=>z0(($)=>$.app.actions),W8=()=>z0(($)=>$.app.sideConversation),R9=()=>z0(($)=>$.app.teams),H8=()=>z0(($)=>$.app.initializationStatus==="ready"),I9=()=>z0(($)=>$.app.tasks.length>0),F2=()=>z0(($)=>$.config.config?.permissionMode||"default"),k9=()=>z0(($)=>$.config.config?.models??WX),L8=()=>z0(($)=>{let J=$.config.config;if(!J)return;let Z=J.currentModelId;return J.models.find((X)=>X.id===Z)??J.models[0]}),w8=()=>z0(($)=>$.config.config?.currentModelId),S9=()=>z0(($)=>$.config.config?.agentTeamsEnabled===!0),V0=()=>z0(($)=>{return W$.getTheme()}),D9=()=>z0(($)=>$.config.config?.codeTheme??"default"),X$=()=>z0(($)=>$.focus.currentFocus),f9=()=>z0(($)=>$.focus.actions),W2=()=>z0(($)=>$.command.isProcessing),V9=()=>z0(($)=>$.command.actions),H2=()=>z0(($)=>$.command.pendingCommands),v9=()=>z0(($)=>$.command.recoveredSteeringCount),B8=()=>z0(($)=>$.app.reasoningEffort!=="off"),A8=()=>z0(($)=>$.app.reasoningEffort),P8=()=>z0(($)=>$.app.serviceTier),b8=()=>z0(($)=>$.app.responseVerbosity),M8=()=>z0(($)=>$.app.communicationStyle),y8=()=>z0(($)=>$.session.currentThinkingContent),j9=()=>z0(($)=>$.session.thinkingExpanded),T8=()=>z0(($)=>$.session.currentStreamingMessageId),C8=()=>z0(FX(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),E9=()=>z0(($)=>$.session.finalizingStreamingMessageId),h9=()=>z0(($)=>$.session.historyExpanded),g9=()=>z0(($)=>$.session.expandedMessageCount);import{useMemoizedFn as F1}from"ahooks";import{useEffect as a1,useMemo as uX,useRef as p8}from"react";function HX($,J){try{return $.code===J.code&&$.message===J.message&&$.retryable===J.retryable&&$.resource===J.resource}catch{return!1}}class D4{options;requested=!1;waitingForIdle=!1;disposed=!1;generation=0;wakeEpoch=0;idleEpoch=0;attempt=0;recoveryStartedAt=null;scheduledToken=null;activeAttemptToken=null;activeRunController=null;retryTimer=null;deadlineTimer=null;now;scheduleCallback;setTimerCallback;clearTimerCallback;constructor($){this.options=$;this.now=$.now??Date.now,this.scheduleCallback=$.scheduleMicrotask??queueMicrotask,this.setTimerCallback=$.setTimer??setTimeout,this.clearTimerCallback=$.clearTimer??clearTimeout}request(){if(this.disposed)return;if(this.wakeEpoch++,this.requested=!0,this.waitingForIdle||this.retryTimer)return;this.scheduleIfRunnable()}notifyIdle(){if(this.disposed)return;if(this.idleEpoch++,this.retryTimer)return;this.waitingForIdle=!1,this.scheduleIfRunnable()}dispose(){if(this.disposed)return;this.disposed=!0,this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.activeAttemptToken=null;let $=this.activeRunController;this.activeRunController=null,$?.abort("pending-resume-coordinator-disposed"),this.resetEpisodeBudget()}scheduleIfRunnable(){if(this.disposed||!this.requested||this.scheduledToken||this.activeAttemptToken||this.retryTimer||this.waitingForIdle)return;if(!this.options.canRun()){this.waitingForIdle=!0;return}let $=this.generation,J={};this.scheduledToken=J;try{this.scheduleCallback(()=>{if(this.disposed||$!==this.generation||this.scheduledToken!==J)return;this.scheduledToken=null,this.flush($).catch((Z)=>{this.handleUnexpectedFailure(Z,$)})})}catch(Z){this.handleUnexpectedFailure(Z,$)}}async flush($){if(this.disposed||$!==this.generation||this.activeAttemptToken||!this.requested||this.retryTimer||this.waitingForIdle)return;if(!this.options.canRun()){this.waitingForIdle=!0;return}let J={},Z=new AbortController,Y=this.wakeEpoch,X=this.idleEpoch;if(this.attempt++,this.recoveryStartedAt===null)this.recoveryStartedAt=this.now(),this.installDeadlineTimer($);this.activeAttemptToken=J,this.activeRunController=Z;let Q=await this.options.run(Z.signal);if(this.disposed||$!==this.generation||this.activeAttemptToken!==J)return;if(this.activeAttemptToken=null,this.activeRunController=null,Q.status==="completed"){let U=this.wakeEpoch!==Y;if(this.clearEpisode(),U)this.requested=!0,this.scheduleIfRunnable();return}if(Q.status==="deferred"){if(this.attempt--,this.attempt===0)this.clearOwnedTimer("deadline"),this.resetEpisodeBudget();if(this.requested=!0,this.idleEpoch!==X)this.waitingForIdle=!1,this.scheduleIfRunnable();else this.waitingForIdle=!0;return}this.handleFailure(Q,$)}handleFailure($,J){let Z=L2($.taskFailure),Y=this.options.sessionIdentity;if($.workKind!=="pending_input"||!$.evidence||!Y||!HX($.taskFailure,$.evidence.taskFailure)){this.terminate("failed",this.attempt,Z);return}let X=x9({sessionIdentity:Y,failedAttempt:this.attempt,recoveryStartedAt:this.recoveryStartedAt??this.now(),now:this.now(),workStillPending:$.workStillPending,evidence:$.evidence});if(X.phase!=="retry_scheduled"){this.terminate(X.phase,this.attempt,Z);return}this.requested=!0,this.waitingForIdle=!1;let Q={},U=this.setTimerCallback(()=>{if(this.disposed||J!==this.generation||this.retryTimer?.token!==Q)return;this.retryTimer=null,this.scheduleIfRunnable()},X.delayMs);this.retryTimer={handle:U,token:Q},U.unref?.()}handleUnexpectedFailure($,J){if(this.disposed||J!==this.generation)return;this.terminate("failed",Math.max(1,this.attempt),L2($),"pending-resume-coordinator-failed")}installDeadlineTimer($){let J={},Z=this.setTimerCallback(()=>{if(this.disposed||$!==this.generation||this.deadlineTimer?.token!==J)return;this.deadlineTimer=null,this.terminate("exhausted",Math.max(1,this.attempt),m9("timeout"),"pending-resume-recovery-deadline-exceeded")},p9);this.deadlineTimer={handle:Z,token:J},Z.unref?.()}terminate($,J,Z,Y){let X=this.activeRunController;if(this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.activeAttemptToken=null,this.activeRunController=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget(),Y)X?.abort(Y);try{this.options.onTerminalFailure?.({phase:$,attempt:J,taskFailure:Z})}catch{}}clearEpisode(){this.requested=!1,this.waitingForIdle=!1,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget()}resetEpisodeBudget(){this.attempt=0,this.recoveryStartedAt=null}clearOwnedTimer($){let J=$==="retry"?this.retryTimer:this.deadlineTimer;if(!J)return;if($==="retry")this.retryTimer=null;else this.deadlineTimer=null;this.clearTimerCallback(J.handle)}}class p2{options;finalized=!1;constructor($){this.options=$}get isFinalized(){return this.finalized}acceptsDeltas(){return!this.finalized&&!this.options.signal.aborted}startTurn(){this.finalized=!1}finalize(){if(!this.acceptsDeltas())return!1;return this.finalized=!0,this.commit(this.options.streamingBuffer.drainPendingBuffers()),!0}abortAndFinalize($){if(this.finalized)return $(),!1;this.finalized=!0;let J=this.options.streamingBuffer.drainPendingBuffers();return $(),this.commit(J),!0}discard(){this.finalized=!0,this.options.streamingBuffer.resetStreamingBuffers(),this.options.discardStreamingMessage(),this.options.clearThinking()}commit($){let J=this.options.getStreamingMessageId();if(J){if($.extraContent)R8(J,$.extraContent);u9(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function LX($){if(!($ instanceof Error))return"未知错误";let Y=$.lastError??$;if(Y.responseBody)try{let U=JSON.parse(Y.responseBody)?.error?.message;if(U){let q=Y.statusCode?` (HTTP ${Y.statusCode})`:"";return`${U}${q}`}}catch{}let X=$.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return $.message}function wX($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function BX($){if(!($ instanceof Error))return!1;let J=$.message;return J.includes("can only concatenate str")||J.includes("image_url")||J.includes("multimodal")||J.includes("vision")||J.includes("does not support images")}function I8($){let J=wX($),Z=BX($),Y;if(Z)Y="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Y=LX($);return{displayMessage:Y,isAbort:J,isVisionNotSupported:Z}}import{appendFileSync as AX,mkdirSync as PX,writeFileSync as bX}from"node:fs";import MX from"node:os";import f4 from"node:path";var c9=null;function yX(){let $=process.env.BLADE_STORAGE_ROOT||f4.join(MX.homedir(),".blade");return f4.join($,"logs","stream-debug.log")}function TX($){if(c9===$)return;let J=f4.dirname($);PX(J,{recursive:!0,mode:493}),bX($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
+ `),c9=$}function V4($,J,Z){try{let Y=yX();TX(Y);let X=new Date().toISOString(),Q=Z?` | ${JSON.stringify(Z)}`:"",U=`[${X}] [${$}] ${J}${Q}
3
+ `;AX(Y,U)}catch{}}var x2=V1("UI");function j4($,J){if(J.state==="requires_attention"){let Z=J.reason==="interrupted_tool_call";$.addToolMessage("Turn recovery requires attention",{toolName:"Runtime Recovery",phase:"complete",summary:Z?"An interrupted tool may have partially completed":"A completed tool may already have changed external state",detail:`${J.turnId} · inspect workspace, processes, and external state before retrying`});return}$.addToolMessage(J.state==="completed"?"Recovered completed turn":"Resuming interrupted turn",{toolName:"Runtime Recovery",phase:"complete",summary:J.state==="completed"?"The durable final response was recovered":"No tool execution was recorded before interruption",detail:J.turnId})}function i9($,J){let Z=$.streamSession??new p2({signal:$.signal,streamingBuffer:$.streamingBuffer,getStreamingMessageId:$.getStreamingMessageId,finalizeStreamingMessage:$.sessionActions.finalizeStreamingMessage,discardStreamingMessage:$.sessionActions.discardStreamingMessage,clearThinking:()=>$.sessionActions.setCurrentThinkingContent(null)});return(Y)=>{switch(Y.kind){case"content_delta":if(Y.delta.length>0)J.outputStarted=!0;if(!Z.acceptsDeltas())break;J.contentDeltaCount++,J.contentDeltaTotalLen+=Y.delta.length,V4("loopEventHandler","onContentDelta",{callCount:J.contentDeltaCount,deltaLen:Y.delta.length,totalLen:J.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(Y.delta);break;case"thinking_delta":if(Y.delta.length>0)J.outputStarted=!0;if(!Z.acceptsDeltas())break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(Y.delta);break;case"stream_end":{$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),x2.debug("[loopEventHandler] stream_end",{contentDeltaCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Z.isFinalized,signalAborted:$.signal.aborted}),V4("loopEventHandler","onStreamEnd",{contentDeltaCallCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Z.isFinalized,signalAborted:$.signal.aborted}),Z.finalize();break}case"model_fallback":$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Z.discard();break;case"provider_admission":{let{kind:X,...Q}=Y;$.sessionActions.setProviderAdmission(Y.phase==="queued"?Q:null);break}case"provider_circuit":{let{kind:X,...Q}=Y;$.sessionActions.setProviderCircuit(Y.phase==="closed"?null:Q);break}case"provider_retry":{let{kind:X,...Q}=Y;$.sessionActions.setProviderRetry(Y.phase==="recovered"?null:Q);break}case"provider_stall":{let{kind:X,...Q}=Y;$.sessionActions.setProviderStall(Y.phase==="detected"?Q:null);break}case"action_stationarity":{let{kind:X,...Q}=Y;$.sessionActions.setActionStationarity(Y.phase==="recovered"?null:Q);break}case"turn_recovery":{j4($.sessionActions,Y.assessment);break}case"tool_start":{J.toolExecutionStarted=!0;let X=Y.toolCall;if(!("function"in X))break;if(X.function.name===k8)break;if(x2.debug("[loopEventHandler] tool_start",{toolName:X.function.name,toolKind:Y.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(X.function.name))break;try{let Q=JSON.parse(X.function.arguments),U=r9(X.function.name,Q);$.sessionActions.addToolMessage(U,{toolCallId:X.id,toolName:X.function.name,phase:"start",summary:U,params:Q})}catch(Q){x2.error("[loopEventHandler] onToolStart error:",Q)}break}case"tool_progress":{J.toolExecutionStarted=!0;let X=Y.toolCall;if(!("function"in X))break;if(X.function.name===k8)break;let Q=Y.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((Y.update.progress??0)/Y.update.total*100)))}%`:"",U=`${X.function.name}${Q}: ${Y.update.message}`;$.sessionActions.addToolMessage(U,{toolCallId:X.id,toolName:X.function.name,phase:"progress",summary:U,...Y.update.admission?{admission:Y.update.admission}:{}});break}case"tool_result":{J.toolExecutionStarted=!0;let X=Y.toolCall;if(!("function"in X))break;if(X.function.name===k8)break;x2.debug("[loopEventHandler] tool_result",{toolName:X.function.name,success:Y.result.success});let Q=l9(a9(X.function.name,Y.result),d9);$.sessionActions.addToolMessage(Q.summary,{toolCallId:X.id,toolName:X.function.name,phase:"complete",summary:Q.summary,detail:Q.detail});break}case"structured_output":J.outputStarted=!0,$.sessionActions.replaceLastAssistantMessage(JSON.stringify(Y.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(Y.usage);break;case"compaction":if($.sessionActions.setCompacting(Y.phase==="start"),Y.phase==="end"){if($.sessionActions.resetContextUsage(),Y.outcome!=="failed")J.compactionCount=(J.compactionCount??0)+1}break;case"turn_start":x2.debug("[loopEventHandler] turn_start",{turn:Y.turn,maxTurns:Y.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:Y.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Z.startTurn();break;case"task_update":$.appActions.setTasks(Y.tasks);break;case"goal_frontier_updated":$.appActions.setTasks(Y.tasks);break;case"mcp_catalog_changed":{let X=`MCP catalog r${Y.revision}: +${Y.added.length} -${Y.removed.length} ~${Y.updated.length}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Catalog",phase:"complete",summary:X,detail:[Y.added.length>0?`Added: ${Y.added.join(", ")}`:"",Y.removed.length>0?`Removed: ${Y.removed.join(", ")}`:"",Y.updated.length>0?`Updated: ${Y.updated.join(", ")}`:""].filter(Boolean).join(`
4
+ `)});break}case"mcp_content_changed":{let X=`MCP ${Y.contentKind} r${Y.revision}: +${Y.added.length} -${Y.removed.length} ~${Y.updated.length}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Content",phase:"complete",summary:X,detail:[Y.added.length>0?`Added: ${Y.added.join(", ")}`:"",Y.removed.length>0?`Removed: ${Y.removed.join(", ")}`:"",Y.updated.length>0?`Updated: ${Y.updated.join(", ")}`:""].filter(Boolean).join(`
5
+ `)});break}case"mcp_resource_updated":{let X=`MCP resource updated: ${Y.uri}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Resource",phase:"progress",summary:X,detail:`${Y.serverName} · revision ${Y.revision}`});break}case"mcp_connection_changed":{let X=Y.phase==="reconnecting"?"recovering":Y.phase==="recovered"?"recovered":"recovery failed",Q=`MCP ${Y.serverName} ${X}`+(Y.phase==="reconnecting"?` (${Y.attempt}/${Y.maxAttempts})`:"");$.sessionActions.addToolMessage(Q,{toolName:"MCP Connection",phase:"complete",summary:Q,detail:[`reason: ${Y.reason}`,`revision: ${Y.revision}`,Y.error?`error: ${Y.error}`:""].filter(Boolean).join(`
6
+ `)});break}case"mcp_log":{let X=Y.logger?`${Y.serverName} · ${Y.logger}`:Y.serverName,Q=`MCP ${Y.level} · ${X}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Log",phase:"complete",summary:Q,detail:[Y.message,`revision: ${Y.revision}`,`sha256: ${Y.dataSha256}`,Y.truncated?"truncated: true":"",Y.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
7
+ `)});break}case"mcp_instructions_changed":{let X=`MCP instructions ${Y.action}: ${Y.serverName}`+(Y.truncated?" (truncated)":"");$.sessionActions.addToolMessage(X,{toolName:"MCP Instructions",phase:"complete",summary:X,detail:[Y.text??"",Y.sha256?`sha256: ${Y.sha256}`:"",Y.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
8
+ `)});break}case"mcp_task_changed":{let X=`MCP task ${Y.status}: ${Y.taskId} (${Y.serverName}/${Y.toolName})`;$.sessionActions.addToolMessage(X,{toolName:"MCP Task",phase:"complete",summary:X,detail:[Y.statusMessage??"",`revision: ${Y.revision}`,Y.hasResult?"result available via TaskOutput":"",Y.error?`error: ${Y.error}`:""].filter(Boolean).join(`
9
+ `)});break}case"project_rules_loaded":{let X=`Project rules loaded: ${Y.files.length}`+(Y.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(X,{toolName:"Project Rules",phase:"complete",summary:X,detail:Y.files.map((Q)=>`${Q.relativePath} ${Q.source} sha256=${Q.contentSha256}`).join(`
10
+ `)});break}case"steering_applied":for(let X=0;X<Y.count;X++)$.commandActions.dequeueCommand();if(Y.recovered>0)$.commandActions.setRecoveredSteeringCount(Y.recovered);break;case"follow_up_started":for(let X of Y.messages){if(!X.recovered||X.persisted)continue;let Q=typeof X.content==="string"?X.content:X.content.map((U)=>U.type==="text"?U.text:"[Image]").join(`
11
+ `);$.sessionActions.addUserMessage(Q)}if(Y.recovered>0)$.commandActions.setRecoveredSteeringCount(Y.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let X=Y}}}}function E4($){let{text:J,parts:Z}=$,Y=Z.filter((U)=>U.type==="image");if(Y.length===0)return J;if(Y.length>w2)throw Error(`最多只能发送 ${w2} 张图片`);if(Y.reduce((U,q)=>U+`data:${q.mimeType};base64,`.length+q.base64.length,0)>S8)throw Error("图片编码后总大小不能超过 5 MiB");let Q=[];for(let U of Z)if(U.type==="text")Q.push({type:"text",text:U.text});else Q.push({type:"image_url",image_url:{url:`data:${U.mimeType};base64,${U.base64}`}});return Q}function o9($){let J=t9($.metadata);return{role:$.role,content:J?n9(J):$.content,...$.metadata?{metadata:$.metadata}:{}}}function D8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(o9);let J=$.messages.slice($.restoredVisibleMessageCount).map(o9);return[...$.restoredContextMessages,...J]}import kX from"node:path";import{basename as CX}from"node:path";function s9($){let{locator:J}=$;if(J.workspace.kind==="acp-remote")return[J.version,J.workspace.kind,J.workspace.workspaceRef,J.sessionId].join("\x00");return[J.version,J.workspace.kind,J.workspace.projectPath,J.sessionId].join("\x00")}function RX($){return $.title?.trim()||`Session ${$.locator.sessionId.slice(0,8)}`}function f8($,J){let Z=$.filter((Y)=>Y.relationType!=="subagent");if(J!=="fork")return Z;return Z.filter((Y)=>Y.archivedAt===void 0&&Y.capabilities.history.fork)}function e9($){return $.find((J)=>J.relationType!=="subagent"&&J.locator.workspace.kind==="local")}function $Y($,J){let Z=RX($);if($.locator.workspace.kind==="acp-remote"){let Q=$.archivedAt?" · archived":"";return`[remote · ${$.capabilities.connection} · history${Q}] ${Z}
12
+ ${$.displayCwd} · ${$.messageCount} messages · ${J}${$.hasErrors?" [!]":""}`}let Y=IX($.taskStatus),X=$.relationType==="subagent"?" ↳ subagent":$.relationType==="fork"?" ↳ fork":"";return`[${Y}] ${Z} · ${J} | ${CX($.displayCwd)} | ${$.messageCount} 条消息${$.hasErrors?" [!]":""}${X}`}function JY($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}function IX($){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"}}async function GY($,J,Z,Y={}){if($.locator.workspace.kind==="acp-remote"){if(J==="fork"&&Y.newSessionId)throw Error("Custom Session IDs are unavailable for remote history forks");return await Z.openHistory($,J),"history-only"}let X=await h4($);return await Z.activateLocal(X,J),"interactive"}function v8($){if($.remoteWorkspace)throw Error("Remote history cannot enter the local compatibility path");let J=$.archivedAt!==void 0;return V8.parse({locator:{version:2,sessionId:$.sessionId,workspace:{kind:"local",projectPath:$.projectPath}},displayCwd:$.projectPath,title:$.title,rootId:$.rootId,parentId:$.parentId,relationType:$.relationType,taskStatus:$.taskStatus,messageCount:$.messageCount,firstMessageTime:$.firstMessageTime,lastMessageTime:$.lastMessageTime,hasErrors:$.hasErrors,archivedAt:$.archivedAt,selectedModelId:$.selectedModelId,capabilities:{connection:"local",history:{read:!0,fork:!J},turn:J?{start:!1,reason:"archived"}:{start:!0},files:J?{readText:!1,writeText:!1,browse:"none",reason:"archived"}:{readText:!0,writeText:!0,browse:"tree"},terminal:J?{mode:"none",owner:"none",reason:"archived"}:{mode:"interactive",owner:"local"}}})}async function h4($){if($.locator.workspace.kind!=="local")throw Error("Remote history cannot enter the local activation path");let J=QY($.locator.workspace.projectPath),Z=await i0.findSessionMetadata($.locator.sessionId,J);if(!Z)throw Error("Session history is no longer available");if(Z.remoteWorkspace)throw Error("Remote history cannot enter the local activation path");return Z}function YY($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function SX($){return kX.resolve($)}function ZY($){if(!$||!UY($))return;U$().config.actions.updateConfig({currentModelId:$})}function XY($){if(!$)return;U$().config.actions.updateConfig({permissionMode:$})}async function j8($,J,Z){let Y=Z?await Z.listAll():(await i0.listSessions({includeSubagents:!1})).map(v8);return f8(Y,$)}async function E8($,J,Z,Y){let{intent:X,session:Q,newSessionId:U,announceFork:q,permissionModeOverride:K}=$,G=SX(Q.projectPath);if(X==="fork"){let W=await i0.forkSession(Q.sessionId,{...U?{newSessionId:U}:{},sourceProjectPath:G,targetProjectPath:G}),H=await i0.loadSessionModelContext(W.sessionId,W.metadata.projectPath),N=[...i0.toUISafeMessages(W.messages)];if(q!==!1){let w=Date.parse(W.metadata.lastMessageTime);N.push({id:"fork-announcement-"+W.sessionId,role:"assistant",content:"Forked "+YY(Q.sessionId)+" → "+YY(W.sessionId),timestamp:Number.isNaN(w)?0:w})}return await Y(),XY(K??W.metadata.permissionMode),ZY(W.metadata.selectedModelId),Z.restoreSession(W.sessionId,N,H,W.metadata.projectPath),{sessionId:W.sessionId,messages:H}}await i0.assertSessionWritable(Q.sessionId,Q.projectPath);let[O,z]=await Promise.all([i0.loadSession(Q.sessionId,Q.projectPath),i0.loadSessionModelContext(Q.sessionId,Q.projectPath)]),_=i0.toUISafeMessages(O);return await Y(),XY(K??Q.permissionMode),ZY(Q.selectedModelId),Z.restoreSession(Q.sessionId,_,z,Q.projectPath),{sessionId:Q.sessionId,messages:z}}function OY($){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 NY($){return V8.safeParse($).success}function KY($){if(typeof $!=="object"||$===null)return!1;return Object.hasOwn($,"locator")?NY($):OY($)}function qY($){return NY($)?$:v8($)}function DX($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function fX($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function VX($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function vX($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function jX($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function EX($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function hX($){if(typeof $!=="object"||$===null)return!1;let J=$.intent;if(J!=="resume"&&J!=="fork")return!1;let Z=$.action;if(Z==="select_session"){let Y=$.sessions;return Array.isArray(Y)&&Y.every(KY)}if(Z==="activate_session"){let Y=$.session;return KY(Y)}return!1}function gX($,J,Z,Y){switch($){case"show_theme_selector":return Z.setActiveModal("themeSelector"),!0;case"show_model_selector":return Z.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Z.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Z.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Z.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Z.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Z.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Z.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Z.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let X=J?.sessions;return Z.showSessionSelector((X??[]).map(v8),"resume"),!0}case"session_forked":{let X=J;if(X?.action!=="restore_forked_session"||!X.sessionId||!Array.isArray(X.messages)||!Array.isArray(X.visibleMessages))return!1;return Y.restoreSession(X.sessionId,X.visibleMessages,X.messages),!0}case"session_archived":{let X=J?.session;return Y.addAssistantMessage(X?`会话 ${X.sessionId} 已归档。`:"当前会话已归档。"),n$(0),!0}case"clear_screen":return Y.clearMessages(),Y.setError(null),Y.resetTokenUsage(),Z.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let X=J,Q=X?.compactedMessages;if(Q)Y.setCompactedContext(Q);if(X?.usage)Y.updateTokenUsage({inputTokens:X.usage.promptTokens,outputTokens:X.usage.completionTokens,totalTokens:X.usage.totalTokens,maxContextTokens:X.maxContextTokens,cacheReadTokens:X.usage.cacheReadInputTokens??0,cacheWriteTokens:X.usage.cacheCreationInputTokens??0,costUsd:X.usage.costUsd});return Y.resetContextUsage(),!0}case"exit_application":return n$(0),!0;default:return!1}}async function g4($,J,Z,Y,X,Q,U,q,K,G,O,z,_,W,H=K$(),N,w){let{text:y}=$;if(!zY(y))return{type:"not_slash"};let B=await _Y(y,{cwd:H,surface:"tui",workspaceRoot:H,sessionId:Q,messages:U,rewind:q,lifecycle:Q===void 0?void 0:{archiveCurrent:async()=>{return await X(),i0.archiveSession(Q,H)}},subagents:K,mcp:G,reasoning:O,serviceTier:z,responseVerbosity:_,communicationStyle:W,codeReview:N,sessionSurfaces:w,signal:Y});if(B.success&&hX(B.data)){if(B.data.action==="select_session")return J.showSessionSelector(B.data.sessions.map(qY),B.data.intent),{type:"handled",commandResult:{success:!0}};let F=qY(B.data.session);if(F.locator.workspace.kind==="acp-remote")return J.showSessionHistoryViewer(F,B.data.intent),{type:"handled",commandResult:{success:!0}};let L=OY(B.data.session)?B.data.session:await h4(F);return await E8({...B.data,session:L},H,Z,X),{type:"handled",commandResult:{success:!0}}}if(B.success&&EX(B.data))return Z.restoreSession(B.data.sessionId,B.data.visibleMessages,B.data.messages),J.setTasks([]),{type:"handled",commandResult:{success:!0}};if(B.message){if(gX(B.message,B.data,J,Z))return{type:"handled",commandResult:{success:!0}}}if(DX(B.data)){let{skillName:F,skillArgs:L}=B.data,A=L?`Please use the "${F}" skill to help me with: ${L}`:`Please use the "${F}" skill.`;return Z.addUserMessage(A),{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:A,images:[],parts:[{type:"text",text:A}]},userMessageAlreadyAdded:!0}}}if(fX(B.data)){let{commandName:F,processedContent:L}=B.data;Z.addUserMessage(y);let A=`# Custom Command: /${F}
13
+
14
+ The user has invoked the custom command "/${F}". Follow the instructions below to complete the task.
15
+
16
+ ---
17
+
18
+ ${L}
19
+
20
+ ---
21
+
22
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:y,agentInput:{displayText:y,text:A,images:[],parts:[{type:"text",text:A}]},userMessageAlreadyAdded:!0}}}if(VX(B.data)){let{commandName:F,pluginName:L,processedContent:A}=B.data;Z.addUserMessage(y);let R=`# Plugin Command: /${F}
23
+
24
+ The user has invoked the plugin command "/${F}" from plugin "${L}". Follow the instructions below to complete the task.
25
+
26
+ ---
27
+
28
+ ${A}
29
+
30
+ ---
31
+
32
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:y,agentInput:{displayText:y,text:R,images:[],parts:[{type:"text",text:R}]},userMessageAlreadyAdded:!0}}}if(vX(B.data)){let{modelId:F,prompt:L}=B.data;return Z.addUserMessage(L),{type:"continue_as_agent",result:{userDisplayMessage:L,agentInput:{displayText:L,text:L,images:[],parts:[{type:"text",text:L}]},userMessageAlreadyAdded:!0,onceModelId:F}}}if(jX(B.data)){let F=B.data.goal.objective;return Z.addUserMessage(y),{type:"continue_as_agent",result:{userDisplayMessage:y,agentInput:{displayText:y,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!B.success&&B.error)return Z.addAssistantMessage(`${B.error}`),{type:"handled",commandResult:{success:B.success,output:B.message,error:B.error,metadata:B.data}};let C=B.message;if(B.success&&typeof C==="string"&&C.trim()!=="")Z.addAssistantMessage(C);return{type:"handled",commandResult:{success:B.success,output:B.message,error:B.error,metadata:B.data}}}import{useMemoizedFn as x0}from"ahooks";import{useEffect as mX,useRef as N1}from"react";function pX($,J){return $.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot}function FY($,J){return $.factory===J.factory&&$.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot&&$.runtime===J.runtime&&$.systemPrompt===J.systemPrompt&&$.appendSystemPrompt===J.appendSystemPrompt&&$.maxTurns===J.maxTurns&&$.modelId===J.modelId&&$.permissionMode===J.permissionMode&&$.reasoningEffort===J.reasoningEffort&&$.serviceTier===J.serviceTier&&$.responseVerbosity===J.responseVerbosity&&$.communicationStyle===J.communicationStyle&&$.agents===J.agents}var LY=new WeakSet;function v$(){let $=new DOMException("TUI Agent lifecycle was invalidated","AbortError");return LY.add($),$}function WY($){return typeof $==="object"&&$!==null&&LY.has($)}function wY($){let J=N1(void 0),Z=N1(void 0),Y=N1(void 0),X=N1(void 0),Q=N1(0),U=N1(!1),q=N1(void 0),K=N1(void 0),G=N1(void 0),O=(b)=>{let I=G.current;if(I?.agent===b)return I.promise;let j={agent:b,promise:Promise.resolve()};return j.promise=Promise.resolve().then(()=>b.destroy()).finally(()=>{if(G.current===j)G.current=void 0}),G.current=j,j.promise},z=x0(()=>{Q.current++;let b=q.current;if(b)b.invalidated=!0;let I=K.current;if(I)I.invalidated=!0;if(X.current)return X.current.promise;let j=J.current,p=Z.current;J.current=void 0,Z.current=void 0,Y.current=void 0;let t=K.current,l=q.current,O0=G.current?.promise,F0,J0=(async()=>{let G0,l0=async(Y$)=>{if(!Y$)return;try{await Y$}catch(m0){if(!WY(m0))G0??=m0}};if(await l0(t?.promise),t?.cleanupError!==void 0)G0??=t.cleanupError;if(await l0(O0),j)await l0(O(j));if(await l0(l?.promise),l?.cleanupError!==void 0)G0??=l.cleanupError;if(p)await l0(p.dispose());if(G0!==void 0)throw G0})();F0={promise:J0},X.current=F0;let L0=()=>{if(X.current===F0)X.current=void 0};return J0.then(L0,L0),J0}),_=x0(async(b)=>{let I=X.current;if(I){if(await I.promise,!U.current)throw v$();return _(b)}let j=$.workspaceRoot??Z.current?.workspaceRoot??K$(),p={sessionId:b,workspaceRoot:j};if(!U.current)throw v$();let t=q.current;if(t&&!t.invalidated&&t.generation===Q.current&&pX(t.target,p))return t.promise;if(t){let J0=z(),L0=Q.current;if(await J0,!U.current||Q.current!==L0)throw v$();return _(b)}if(Z.current&&(Z.current.sessionId!==b||Z.current.workspaceRoot!==j)){let J0=z(),L0=Q.current;if(await J0,!U.current||Q.current!==L0)throw v$();return _(b)}if(!U.current)throw v$();if(Z.current)return Z.current;let l=Q.current,O0,F0=Promise.resolve().then(async()=>{let J0,L0=()=>{if(!U.current||O0.invalidated||Q.current!==l||q.current!==O0)throw v$()};try{L0();let G0=await i0.findSessionMetadata(b,j);L0();let l0=G0!==void 0&&(await i0.loadSession(b,j)).length>0;L0(),J0=await x$.create({sessionId:b,workspaceRoot:j,modelId:$.modelId,permissionMode:$.permissionMode??G0?.permissionMode,reasoningEffort:G0?.reasoningEffort??$.reasoningEffort,serviceTier:G0?.serviceTier??$.serviceTier,responseVerbosity:G0?.responseVerbosity??$.responseVerbosity,communicationStyle:G0?.communicationStyle??$.communicationStyle,communicationStyleDigest:G0?.communicationStyleDigest,agents:$.agents,...l0?{sessionStart:{isResume:!0,resumeSessionId:b}}:{}}),L0();let Y$={sessionId:b,modelId:G0?.selectedModelId,permissionMode:G0?.permissionMode,reasoningEffort:G0?.reasoningEffort,serviceTier:G0?.serviceTier,responseVerbosity:G0?.responseVerbosity,communicationStyle:G0?.communicationStyle,communicationStyleDigest:G0?.communicationStyleDigest},m0=J0.getReasoningConfiguration().selection,r0=J0.getServiceTierConfiguration().selection,N$=J0.getResponseVerbosityConfiguration().selection,u0=J0.getCommunicationStyleConfiguration().selection;return L0(),H$().setReasoningEffort(m0),H$().setServiceTier(r0),H$().setResponseVerbosity(N$),H$().setCommunicationStyle(u0),L0(),Z.current=J0,Y.current=Y$,J0}catch(G0){if(J0&&Z.current!==J0)await J0.dispose().catch((l0)=>{O0.cleanupError??=l0});if(O0.invalidated||Q.current!==l||!U.current)throw v$();throw G0}finally{if(q.current===O0)q.current=void 0}});return O0={generation:l,target:p,invalidated:!1,promise:F0},q.current=O0,F0}),W=async(b,I,j,p,t)=>{let l;if(j&&I){let O0=b?.modelId??$.modelId,F0=b?.reasoningEffort??(p?$.reasoningEffort:j.getReasoningConfiguration().selection),J0=b?.serviceTier??(p?$.serviceTier:j.getServiceTierConfiguration().selection),L0=b?.responseVerbosity??(p?$.responseVerbosity:j.getResponseVerbosityConfiguration().selection),G0=b?.communicationStyle??(p?$.communicationStyle:j.getCommunicationStyleConfiguration().selection),l0=j.getCurrentModelId(),Y$=j.getReasoningConfiguration(),m0=j.getServiceTierConfiguration(),r0=j.getResponseVerbosityConfiguration(),N$=j.getCommunicationStyleConfiguration();if($.permissionMode&&(Y.current?.sessionId!==I||Y.current.permissionMode!==$.permissionMode)){let D0=await i0.setSessionPermissionMode(I,j.workspaceRoot,$.permissionMode);t(),Y.current={...Y.current,sessionId:I,permissionMode:D0.permissionMode}}await j.refresh({modelId:O0,...F0?{reasoningEffort:F0}:{},...J0?{serviceTier:J0}:{},...L0?{responseVerbosity:L0}:{},...G0?{communicationStyle:G0}:{}}),t();let u0=j.getCommunicationStyleConfiguration();if(u0.source!=="built-in"&&!u0.contentSha256)throw Error("Custom communication style has no provenance");let F$={...O0&&O0!=="inherit"&&(Y.current?.sessionId!==I||Y.current.modelId!==O0)?{selectedModelId:O0}:{},...F0&&(Y.current?.sessionId!==I||Y.current.reasoningEffort!==F0)?{reasoningEffort:F0}:{},...J0&&(Y.current?.sessionId!==I||Y.current.serviceTier!==J0)?{serviceTier:J0}:{},...L0&&(Y.current?.sessionId!==I||Y.current.responseVerbosity!==L0)?{responseVerbosity:L0}:{},...G0&&(Y.current?.sessionId!==I||Y.current.communicationStyle!==G0||Y.current.communicationStyleDigest!==u0.contentSha256)?{communicationStyle:G0,communicationStyleDigest:u0.source==="built-in"?null:u0.contentSha256}:{}};if(Object.keys(F$).length>0)try{let D0=await i0.updateSessionMetadata(I,j.workspaceRoot,F$);t(),Y.current={sessionId:I,modelId:D0.selectedModelId,permissionMode:D0.permissionMode,reasoningEffort:D0.reasoningEffort,serviceTier:D0.serviceTier,responseVerbosity:D0.responseVerbosity,communicationStyle:D0.communicationStyle,communicationStyleDigest:D0.communicationStyleDigest}}catch(D0){if(WY(D0))throw D0;throw await j.refresh({...l0?{modelId:l0}:{},reasoningEffort:Y$.selection,serviceTier:m0.selection,responseVerbosity:r0.selection,communicationStyle:N$.selection}).catch(()=>{return}),D0}l=await c2.createWithRuntime(j,{sessionId:I,systemPrompt:b?.systemPrompt??$.systemPrompt,appendSystemPrompt:b?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:b?.maxTurns??$.maxTurns,modelId:b?.modelId??$.modelId,permissionMode:b?.permissionMode??$.permissionMode,agents:$.agents})}else l=await c2.create({systemPrompt:b?.systemPrompt??$.systemPrompt,appendSystemPrompt:b?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:b?.maxTurns??$.maxTurns,modelId:b?.modelId??$.modelId,permissionMode:b?.permissionMode??$.permissionMode,agents:$.agents});return l},H=x0(async(b)=>{let I=X.current;if(I){if(await I.promise,!U.current)throw v$();return H(b)}if(!U.current)throw v$();let j=b?.sessionId??$.sessionId,p=!!b?.modelId&&b.modelId!==$.modelId,t=Z.current,l={factory:!p&&j?"session":"standalone",sessionId:j,workspaceRoot:!p&&j?$.workspaceRoot??t?.workspaceRoot??K$():$.workspaceRoot??K$(),runtime:!p&&j&&t&&t.sessionId===j&&t.workspaceRoot===($.workspaceRoot??t.workspaceRoot)?t:void 0,systemPrompt:b?.systemPrompt??$.systemPrompt,appendSystemPrompt:b?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:b?.maxTurns??$.maxTurns,modelId:b?.modelId??$.modelId,permissionMode:b?.permissionMode??$.permissionMode,reasoningEffort:b?.reasoningEffort??$.reasoningEffort,serviceTier:b?.serviceTier??$.serviceTier,responseVerbosity:b?.responseVerbosity??$.responseVerbosity,communicationStyle:b?.communicationStyle??$.communicationStyle,agents:$.agents},O0=K.current;if(O0){if(!O0.invalidated&&O0.generation===Q.current&&FY(O0.target,l))return O0.promise;O0.invalidated=!0,Q.current++;let F$=Q.current;if(await O0.promise.catch(()=>{return}),O0.cleanupError!==void 0)throw O0.cleanupError;if(!U.current||Q.current!==F$)throw v$();return H(b)}let F0=Z.current!==void 0,J0=!p&&j?await _(j):void 0;if(!U.current||J0!==void 0&&Z.current!==J0)throw v$();let L0={factory:J0?"session":"standalone",sessionId:j,workspaceRoot:J0?.workspaceRoot??$.workspaceRoot??K$(),runtime:J0,systemPrompt:b?.systemPrompt??$.systemPrompt,appendSystemPrompt:b?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:b?.maxTurns??$.maxTurns,modelId:b?.modelId??$.modelId,permissionMode:b?.permissionMode??$.permissionMode,reasoningEffort:b?.reasoningEffort??$.reasoningEffort,serviceTier:b?.serviceTier??$.serviceTier,responseVerbosity:b?.responseVerbosity??$.responseVerbosity,communicationStyle:b?.communicationStyle??$.communicationStyle,agents:$.agents},G0=K.current;if(G0&&!G0.invalidated&&G0.generation===Q.current&&FY(G0.target,L0))return G0.promise;if(G0){G0.invalidated=!0,Q.current++;let u0=Q.current;if(await G0.promise.catch(()=>{return}),G0.cleanupError!==void 0)throw G0.cleanupError;if(!U.current||Q.current!==u0)throw v$();return H(b)}let l0=Q.current,Y$=J.current,m0;if(Y$)J.current=void 0,m0=O(Y$);let r0,N$=Promise.resolve().then(async()=>{let u0,F$=()=>{if(!U.current||r0.invalidated||Q.current!==l0||K.current!==r0||J0!==void 0&&Z.current!==J0)throw v$()};try{if(F$(),m0){try{await m0}catch(D0){throw r0.cleanupError??=D0,F$(),D0}F$()}return u0=await W(b,j,J0,F0,F$),F$(),J.current=u0,u0}catch(D0){if(u0&&J.current!==u0)await O(u0).catch((S1)=>{r0.cleanupError??=S1});if(r0.invalidated||Q.current!==l0||!U.current)throw v$();throw D0}finally{if(K.current===r0)K.current=void 0}});return r0={generation:l0,target:L0,invalidated:!1,promise:N$},K.current=r0,N$}),N=x0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await _($.sessionId)).listRewindCheckpoints()}),w=x0(async(b)=>{if(!$.sessionId)throw Error("No active session to rewind");let j=await(await _($.sessionId)).rewindSession(b);return await z(),j}),y=x0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await _($.sessionId)).listSubagents()}),T=x0(async(b,I)=>{if(!$.sessionId)throw Error("No active session for subagent control");let j=await _($.sessionId),p=!1,t,l=b,O0=(J0)=>{let L0=J0.status==="completed"?J0.result?.message:J0.result?.error||J0.result?.message;O2.getState().app.actions.completeSubagentProgress(l,J0.status==="completed",L0)},F0=j.resumeSubagent({agentId:b,prompt:I,onEvent:(J0)=>{if(J0.kind==="tool_start"&&"function"in J0.toolCall)O2.getState().app.actions.updateSubagentTool(l,J0.toolCall.function.name)},onCompleted:(J0)=>{if(p)O0(J0);else t=J0}});if(l=F0.session.id,O2.getState().app.actions.startSubagentProgress(F0.session.id,F0.session.subagentType,`Resumed from ${F0.source.id}: ${F0.session.description}`),p=!0,t)O0(t);return F0}),B=x0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await _($.sessionId)).getMcpContentCatalog()}),C=x0(async(b)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await _($.sessionId)).refreshMcpContentCatalogs(b)}),F=x0(async(b,I,j)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await _($.sessionId)).getMcpPrompt(b,I,j)}),L=x0(async(b,I,j)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await _($.sessionId)).completeMcpArgument(b,I,j)}),A=x0(async(b,I={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await _($.sessionId)).getMcpLogs(b,I)}),R=x0(async(b)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await _($.sessionId)).listMcpTasks(b)}),S=x0(async(b)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await _($.sessionId)).getMcpTask(b)}),M=x0(async(b,I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await _($.sessionId)).cancelMcpTask(b,I)}),k=x0(async(b,I)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await _($.sessionId)).setMcpLoggingLevel(b,I)}),P=x0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await _($.sessionId)).getMcpInstructions()}),D=x0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await _($.sessionId)).getReasoningConfiguration()}),e=x0(async(b)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let I=await _($.sessionId);if(I.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let j=I.getReasoningConfiguration();if(I.resolveReasoningConfiguration(b),j.selection===b)return j;await I.refresh({reasoningEffort:b});try{let p;try{p=await i0.updateSessionMetadata($.sessionId,I.workspaceRoot,{reasoningEffort:b})}catch(t){if(!(t instanceof u2)&&t.code!=="ENOENT")throw t;p=await i0.createSessionMetadata($.sessionId,I.workspaceRoot,{taskStatus:"completed",selectedModelId:I.getCurrentModelId(),reasoningEffort:b,serviceTier:I.getServiceTierConfiguration().selection,responseVerbosity:I.getResponseVerbosityConfiguration().selection,communicationStyle:I.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:p.selectedModelId,permissionMode:p.permissionMode,reasoningEffort:p.reasoningEffort,serviceTier:p.serviceTier,responseVerbosity:p.responseVerbosity,communicationStyle:p.communicationStyle,communicationStyleDigest:p.communicationStyleDigest},H$().setReasoningEffort(b),I.getReasoningConfiguration()}catch(p){throw await I.refresh({reasoningEffort:j.selection}),p}}),$0=x0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await _($.sessionId)).getServiceTierConfiguration()}),m=x0(async(b)=>{if(!$.sessionId)throw Error("No active session for service tier");let I=await _($.sessionId);if(I.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let j=I.getServiceTierConfiguration();if(I.resolveServiceTierConfiguration(b),j.selection===b)return j;await I.refresh({serviceTier:b});try{let p;try{p=await i0.updateSessionMetadata($.sessionId,I.workspaceRoot,{serviceTier:b})}catch(t){if(!(t instanceof u2)&&t.code!=="ENOENT")throw t;p=await i0.createSessionMetadata($.sessionId,I.workspaceRoot,{taskStatus:"completed",selectedModelId:I.getCurrentModelId(),reasoningEffort:I.getReasoningConfiguration().selection,serviceTier:b,responseVerbosity:I.getResponseVerbosityConfiguration().selection,communicationStyle:I.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:p.selectedModelId,permissionMode:p.permissionMode,reasoningEffort:p.reasoningEffort,serviceTier:p.serviceTier,responseVerbosity:p.responseVerbosity,communicationStyle:p.communicationStyle,communicationStyleDigest:p.communicationStyleDigest},H$().setServiceTier(b),I.getServiceTierConfiguration()}catch(p){throw await I.refresh({serviceTier:j.selection}),p}}),S0=x0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await _($.sessionId)).getResponseVerbosityConfiguration()}),o=x0(async(b)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let I=await _($.sessionId);if(I.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let j=I.getResponseVerbosityConfiguration();if(I.resolveResponseVerbosityConfiguration(b),j.selection===b)return j;await I.refresh({responseVerbosity:b});try{let p;try{p=await i0.updateSessionMetadata($.sessionId,I.workspaceRoot,{responseVerbosity:b})}catch(t){if(!(t instanceof u2)&&t.code!=="ENOENT")throw t;p=await i0.createSessionMetadata($.sessionId,I.workspaceRoot,{taskStatus:"completed",selectedModelId:I.getCurrentModelId(),reasoningEffort:I.getReasoningConfiguration().selection,serviceTier:I.getServiceTierConfiguration().selection,responseVerbosity:b,communicationStyle:I.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:p.selectedModelId,permissionMode:p.permissionMode,reasoningEffort:p.reasoningEffort,serviceTier:p.serviceTier,responseVerbosity:p.responseVerbosity,communicationStyle:p.communicationStyle,communicationStyleDigest:p.communicationStyleDigest},H$().setResponseVerbosity(b),I.getResponseVerbosityConfiguration()}catch(p){throw await I.refresh({responseVerbosity:j.selection}),p}}),f=x0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await _($.sessionId)).getCommunicationStyleConfiguration()}),v=x0(async(b)=>{if(!$.sessionId)throw Error("No active session for communication style");let I=await _($.sessionId);if(I.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let j=I.getCommunicationStyleConfiguration(),p=I.resolveCommunicationStyleConfiguration(b);if(p.source!=="built-in"&&!p.contentSha256)throw Error("Custom communication style has no provenance");if(j.selection===b)return j;await I.refresh({communicationStyle:b});try{let t;try{t=await i0.updateSessionMetadata($.sessionId,I.workspaceRoot,{communicationStyle:b,communicationStyleDigest:p.source==="built-in"?null:p.contentSha256})}catch(l){if(!(l instanceof u2)&&l.code!=="ENOENT")throw l;t=await i0.createSessionMetadata($.sessionId,I.workspaceRoot,{taskStatus:"completed",selectedModelId:I.getCurrentModelId(),reasoningEffort:I.getReasoningConfiguration().selection,serviceTier:I.getServiceTierConfiguration().selection,responseVerbosity:I.getResponseVerbosityConfiguration().selection,communicationStyle:b,...p.source!=="built-in"&&p.contentSha256?{communicationStyleDigest:p.contentSha256}:{}})}return Y.current={sessionId:$.sessionId,modelId:t.selectedModelId,permissionMode:t.permissionMode,reasoningEffort:t.reasoningEffort,serviceTier:t.serviceTier,responseVerbosity:t.responseVerbosity,communicationStyle:t.communicationStyle,communicationStyleDigest:t.communicationStyleDigest},H$().setCommunicationStyle(b),I.getCommunicationStyleConfiguration()}catch(t){throw await I.refresh({communicationStyle:j.selection}),t}}),g=x0(async(b)=>{if(!Z.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Z.current.enqueueSteering(b,{allowBeforeTurn:!0})}),s=x0(async(b,I)=>{let j=$.sessionId;if(!j)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await _(j)).enqueueSteering(b,{allowBeforeTurn:!0,...I})}),U0=x0(async(b,I)=>{let j=$.sessionId;if(!j)throw Error("Side conversation requires a Session");return(await _(j)).askSideQuestion(b,{signal:I,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),V=x0(async(b,I)=>{let j=$.sessionId;if(!j)throw Error("User shell command requires a Session");return(await _(j)).executeUserShellCommand(b,I)}),Z0=x0(()=>Z.current?.getTurnRecoveryAssessment()??{state:"none"}),n=x0(async(b,I)=>{let j=$.sessionId;if(!j)throw Error("Code review requires a Session");let p=await _(j);await h8.recoverInterrupted(p.workspaceRoot,j,p);let t=await h8.start({sessionId:j,projectPath:p.workspaceRoot,runtime:p,request:b,signal:I}),l=await t.completion,O0=(await h8.list(p.workspaceRoot,j)).find((F0)=>F0.start.reviewId===t.reviewId);if(!O0)throw Error(`Review not found after completion: ${t.reviewId}`);return{reviewId:t.reviewId,status:l.status,findings:l.findings.length,content:HY(O0.start,l)}});return mX(()=>{U.current=!0;let I=g8(async()=>{U.current=!1,await z()});return()=>{I(),U.current=!1,z().catch(()=>{return})}},[z]),{agentRef:J,createAgent:H,cleanupAgent:z,steerActiveTurn:g,enqueueSessionInput:s,askSideQuestion:U0,runCodeReview:n,executeUserShellCommand:V,getTurnRecoveryAssessment:Z0,listRewindCheckpoints:N,rewindSession:w,listSubagents:y,resumeSubagent:T,getMcpContentCatalog:B,refreshMcpContentCatalogs:C,getMcpPrompt:F,completeMcpArgument:L,listMcpTasks:R,getMcpTask:S,cancelMcpTask:M,getMcpLogs:A,setMcpLoggingLevel:k,getMcpInstructions:P,getReasoningConfiguration:D,setReasoningEffort:e,getServiceTierConfiguration:$0,setServiceTier:m,getResponseVerbosityConfiguration:S0,setResponseVerbosity:o,getCommunicationStyleConfiguration:f,setCommunicationStyle:v}}import{useMemoizedFn as B2}from"ahooks";import{useEffect as xX,useRef as m8}from"react";function BY($){let J=0;for(let Z of $)if(Z===`
33
+ `)J++;return J}function AY($,J){let Z=J?.flushTimeout??300,Y=J?.minLinesToFlush??5,X=J?.minCharsToFlush??400,Q=m8(""),U=m8(null),q=m8(""),K=m8(null),G=B2(()=>{if(Q.current){let N=Q.current,w=$.appendAssistantContent(N);R8(w,N),Q.current=""}if(U.current)clearTimeout(U.current),U.current=null}),O=B2(()=>{if(q.current)$.appendThinkingContent(q.current),q.current="";if(K.current)clearTimeout(K.current),K.current=null}),z=B2((N)=>{Q.current+=N;let w=Q.current;if(BY(w)>=Y||w.length>=X){G();return}if(!U.current)U.current=setTimeout(G,Z)}),_=B2((N)=>{q.current+=N;let w=q.current;if(BY(w)>=Y||w.length>=X){O();return}if(!K.current)K.current=setTimeout(O,Z)}),W=B2(()=>{if(Q.current="",U.current)clearTimeout(U.current),U.current=null;if(q.current="",K.current)clearTimeout(K.current),K.current=null}),H=B2(()=>{if(U.current)clearTimeout(U.current),U.current=null;if(K.current)clearTimeout(K.current),K.current=null;let N=Q.current,w=q.current;return Q.current="",q.current="",{extraContent:N,extraThinking:w}});return xX(()=>{return()=>{W()}},[W]),{batchAppendContent:z,batchAppendThinking:_,flushContentBuffer:G,flushThinkingBuffer:O,resetStreamingBuffers:W,drainPendingBuffers:H}}var d2=V1("UI");function PY($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var kY=($,J,Z,Y,X,Q,U)=>{let q=W2(),K=N2(),G=U1(),O=w8(),z=F2(),_=B8(),W=A8(),H=P8(),N=b8(),w=M8(),y=W8(),T=S9(),B=D1(),C=f1(),F=V9(),L=p8(!1),A=p8(null),R=p8(null),S=p8(null),{createAgent:M,cleanupAgent:k,steerActiveTurn:P,enqueueSessionInput:D,listRewindCheckpoints:e,rewindSession:$0,listSubagents:m,resumeSubagent:S0,getMcpContentCatalog:o,refreshMcpContentCatalogs:f,getMcpPrompt:v,completeMcpArgument:g,listMcpTasks:s,getMcpTask:U0,cancelMcpTask:V,getMcpLogs:Z0,setMcpLoggingLevel:n,getMcpInstructions:b,getReasoningConfiguration:I,setReasoningEffort:j,getServiceTierConfiguration:p,setServiceTier:t,getResponseVerbosityConfiguration:l,setResponseVerbosity:O0,getCommunicationStyleConfiguration:F0,setCommunicationStyle:J0,runCodeReview:L0,askSideQuestion:G0,executeUserShellCommand:l0,getTurnRecoveryAssessment:Y$}=wY({sessionId:K,workspaceRoot:G,systemPrompt:$,appendSystemPrompt:J,maxTurns:Y,modelId:O,permissionMode:z,reasoningEffort:W,serviceTier:H,responseVerbosity:N,communicationStyle:w,agents:Q}),m0=AY(B),r0=F1((K0)=>new p2({signal:K0,streamingBuffer:m0,getStreamingMessageId:()=>U$().session.currentStreamingMessageId,finalizeStreamingMessage:B.finalizeStreamingMessage,discardStreamingMessage:B.discardStreamingMessage,clearThinking:()=>B.setCurrentThinkingContent(null)})),N$=F1(async()=>{if(!T||!K){C.setTeams([]);return}try{let M0=await new IY({configDir:m4(),subagentRegistry:x8(G)}).list({sessionId:K,projectPath:G});if(U$().session.sessionId===K&&U$().session.workspaceRoot===G)C.setTeams(M0)}catch(K0){d2.warn("[useCommandHandler] Failed to refresh Agent Teams",K0)}}),u0=F1(async(K0,M0)=>{if(K0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let I0=K0.text.trimStart().slice(1).trim();if(!I0)return{success:!1,error:"User shell command cannot be empty"};B.setCommand(`! ${I0}`);try{let Q0=await l0(I0,{signal:M0});if(B.addMessage({id:`user-shell-${Q0.executionId}`,role:"user",content:p4(Q0.record),timestamp:Date.now(),metadata:{userShellCommand:Q0.record}}),Q0.delivery==="next_turn"){let Y0=U$().session;if(Y0.sessionId===K&&Y0.workspaceRoot===G)R.current?.request()}return{success:Q0.record.status!=="spawn_error",output:p4(Q0.record),...Q0.record.status==="spawn_error"?{error:Q0.record.stderr||"User shell command failed"}:{}}}finally{B.setCommand(null)}});a1(()=>{return()=>{A.current=null,m0.resetStreamingBuffers()}},[m0.resetStreamingBuffers]),a1(()=>{return()=>{S.current?.abort("side-conversation-session-change"),S.current=null,C.dismissSideConversation()}},[C,K,G]),a1(()=>{C.setTeams([]),N$()},[T,C,N$,K,G]),a1(()=>{if(!_)B.setCurrentThinkingContent(null)},[_,B]);let F$=F1(()=>{if(S.current){S.current.abort("user-cancel"),S.current=null,C.dismissSideConversation();return}if(!q)return;X?.();let K0=F.getAbortController()?.signal??new AbortController().signal;if((A.current??r0(K0)).abortAndFinalize(()=>{F.abort("user-cancel"),C.setTasks([])}),!L.current)B.addAssistantMessage("任务已停止"),L.current=!0}),D0=F1(async(K0,M0)=>{let I0=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(C.startSideConversation(I0,M0),K0.images.length>0){C.failSideConversation(I0,"Side conversations do not accept image attachments");return}if(!M0){C.failSideConversation(I0,"Usage: /btw <question>");return}S.current?.abort("side-conversation-replaced");let Q0=new AbortController;S.current=Q0;try{let Y0=await G0(M0,Q0.signal);if(Q0.signal.aborted||S.current!==Q0)return;if(C.completeSideConversation(I0,Y0),Y0.usage)B.updateTokenUsage({inputTokens:Y0.usage.promptTokens,outputTokens:Y0.usage.completionTokens,totalTokens:Y0.usage.totalTokens,cacheReadTokens:Y0.usage.cacheReadInputTokens??0,cacheWriteTokens:Y0.usage.cacheCreationInputTokens??0,costUsd:Y0.usage.costUsd})}catch(Y0){if(Q0.signal.aborted||S.current!==Q0)return;C.failSideConversation(I0,Y0 instanceof Error?Y0.message:String(Y0))}finally{if(S.current===Q0)S.current=null}}),S1=F1(async(K0,M0)=>{let I0={contentDeltaCount:0,contentDeltaTotalLen:0,outputStarted:!1,toolExecutionStarted:!1,compactionCount:0},Q0=r0(M0.signal);A.current=Q0;let Y0=i9({sessionActions:B,appActions:C,commandActions:F,streamingBuffer:m0,thinkingModeEnabled:_,getStreamingMessageId:()=>U$().session.currentStreamingMessageId,signal:M0.signal,streamSession:Q0},I0);try{return{loopResult:await yY(K0,Y0),stats:I0}}finally{if(A.current===Q0)A.current=null}}),Q1=F1(async(K0)=>{let M0=!1,I0,Q0=!1,Y0=K0;try{if(K0.text.trimStart().startsWith("!")){let d0=F.getAbortController()??F.createAbortController();return await u0(K0,d0.signal)}await l2();let h=F.getAbortController()??F.createAbortController(),c=D8(U$().session),x=await g4(K0,C,B,h.signal,k,K,D8(U$().session),{listCheckpoints:e,execute:$0},{list:m,resume:S0},{getCatalog:o,refresh:f,getPrompt:v,complete:g,listTasks:s,getTask:U0,cancelTask:V,getLogs:Z0,setLoggingLevel:n,getInstructions:b},{get:I,set:j},{get:p,set:t},{get:l,set:O0},{get:F0,set:J0},G,{run:L0},U);if(x.type==="handled")return x.commandResult;if(x.type==="continue_as_agent")M0=x.result.userMessageAlreadyAdded,I0=x.result.onceModelId,Q0=x.result.goalContinuationOnly===!0,Y0=x.result.agentInput;let W0=j$.getInstance(),y0;if(!Q0){let d0=await W0.executeUserPromptSubmitHooks(Y0.text,{projectDir:G,sessionId:K,permissionMode:z,hasImages:Y0.images.length>0,imageCount:Y0.images.length});if(!d0.proceed){if(d0.warning)B.addAssistantMessage(`${d0.warning}`);return{success:!1,error:"blocked by hook"}}if(d0.updatedPrompt)Y0={...Y0,text:d0.updatedPrompt,displayText:d0.updatedPrompt,parts:[{type:"text",text:d0.updatedPrompt},...Y0.parts.filter((p$)=>p$.type==="image")]};if(d0.contextInjection)y0=d0.contextInjection}if(!M0)B.addUserMessage(Y0.displayText);let O$=E4(Y0),Z$=await M(I0?{modelId:I0}:void 0);if(h.signal.aborted)return d2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(y0)c.push({role:"system",content:`<user-prompt-submit-hook>
34
+ ${y0}
35
+ </user-prompt-submit-hook>`});let k$={messages:c,userId:"cli-user",sessionId:K,workspaceRoot:G,signal:h.signal,confirmationHandler:Z,permissionMode:z,onPermissionModeChange:async(d0)=>{await q$().setPermissionMode(d0)}},{loopResult:u,stats:q0}=await S1(Z$.chatStream(O$,k$,{stream:!0,goalContinuationOnly:Q0,onTurnLimitReached:Z?async(d0)=>{let p$=await Z.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${d0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:p$.approved,reason:p$.reason}}:void 0}),h);if(q0.compactionCount>0)B.setCompactedContext(k$.messages);if(u.success&&u.metadata?.outputTruncated)B.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let a0=u.finalMessage||"";if(d2.debug("[handleCommandSubmit] final reply",{success:u.success,outputLength:a0.length,turnsCount:u.metadata?.turnsCount,toolCallsCount:u.metadata?.toolCallsCount}),!u.success&&!PY(u)){let d0=u.error?.message||"任务执行失败";return B.addAssistantMessage(d0),{success:!1,error:d0}}if(!a0||a0.trim()===""){let d0=u.metadata?.abortReason;if(!L.current&&q0.contentDeltaCount===0&&d0!=="interrupt")return B.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:a0??""}}return{success:!0,output:a0}}catch(h){if(L.current)return{success:!1,error:"aborted"};let c=I8(h),x=typeof h==="object"&&h!==null&&"name"in h&&h.name==="AbortError";if(c.isAbort||x)return{success:!1,error:"aborted"};return B.addAssistantMessage(`${c.displayMessage}`),{success:!1,error:c.displayMessage}}}),_2=F1(async(K0)=>{if(K0.aborted)return{status:"completed"};if(U$().command.isProcessing)return{status:"deferred"};let M0=await x$.hasPendingInbox(G,K),I0=!M0&&await x$.hasActiveGoal(G,K),Q0=!M0&&!I0&&await x$.hasRecoverableTurn(G,K);if(K0.aborted)return{status:"completed"};if(!M0&&!I0&&!Q0)return{status:"completed"};if(U$().command.isProcessing)return{status:"deferred"};if(await l2(),K0.aborted)return{status:"completed"};if(U$().command.isProcessing)return{status:"deferred"};let Y0=F.createAbortController(),h="preflight",c=()=>{if(!Y0.signal.aborted)Y0.abort("pending-resume-coordinator-disposed")};if(K0.addEventListener("abort",c,{once:!0}),K0.aborted)c();m0.resetStreamingBuffers(),B.clearFinalizingStreamingMessageId(),F.setProcessing(!0);try{let x=await M();if(Y0.signal.aborted)return Y0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};let W0=await x$.hasPendingInbox(G,K),y0=!W0&&await x$.hasActiveGoal(G,K);if(Y0.signal.aborted)return Y0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(!W0&&!y0){let u=Y$();if(u.state!=="none")j4(B,u);return{status:"completed"}}h=W0?"pending_input":"goal";let O$={messages:D8(U$().session),userId:"cli-user",sessionId:K,workspaceRoot:G,signal:Y0.signal,confirmationHandler:Z,permissionMode:z,onPermissionModeChange:async(u)=>{await q$().setPermissionMode(u)}},{loopResult:Z$,stats:k$}=await S1(x.chatStream("",O$,{stream:!0,pendingInputOnly:W0,goalContinuationOnly:y0}),Y0);if(k$.compactionCount>0)B.setCompactedContext(O$.messages);if(Y0.signal.aborted)return Y0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(Z$.success&&Z$.metadata?.outputTruncated)B.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!Z$.success&&!PY(Z$)){let u=L2(Z$.error?.details??Z$.error?.message??"恢复排队指令失败");if(h==="pending_input"){let q0=Z$.metadata?.toolCallsCount,a0=typeof q0==="number"&&Number.isInteger(q0)&&q0>=0?q0:-1,d0=await x$.hasPendingInbox(G,K);if(Y0.signal.aborted)return Y0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};return{status:"failed",workKind:h,workStillPending:d0,taskFailure:u,evidence:{taskFailure:u,outputStarted:k$.outputStarted,toolExecutionStarted:k$.toolExecutionStarted,toolCallsCount:a0}}}return{status:"failed",workKind:h,workStillPending:!1,taskFailure:u}}return{status:"completed"}}catch(x){let W0=I8(x);if(Y0.signal.reason==="interrupted-by-new-command")return{status:"deferred"};if(W0.isAbort||K0.aborted)return{status:"completed"};return{status:"failed",workKind:h,workStillPending:!1,taskFailure:L2(x)}}finally{if(K0.removeEventListener("abort",c),F.getAbortController()===Y0)F.setProcessing(!1),F.clearAbortController(Y0),B.setCurrentThinkingContent(null)}}),I$=uX(()=>{let K0="preflight";return new D4({canRun:()=>!U$().command.isProcessing,run:async(M0)=>{K0="preflight";let I0=await _2(M0);if(I0.status==="failed")K0=I0.workKind;return I0},sessionIdentity:JSON.stringify([G,K]),onTerminalFailure:({taskFailure:M0})=>{if(K0==="preflight")B.setError(`恢复排队指令失败: ${M0.message}`);else B.addAssistantMessage(M0.message)}})},[_2,B,K,G]);a1(()=>{return R.current=I$,()=>{if(I$.dispose(),R.current===I$)R.current=null}},[I$]);let r1=F1(async(K0)=>{if(U$().app.activeModal==="sessionHistoryViewer")return;if(!K0.text.trim()&&K0.images.length===0)return;let M0=TY(K0.text);if(M0){await D0(K0,M0.question);return}if(S.current?.abort("main-conversation-submitted"),S.current=null,C.dismissSideConversation(),K0.text.trimStart().startsWith("!")&&q){let Q0=F.getAbortController();if(!Q0){B.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let Y0=await u0(K0,Q0.signal);if(!Y0.success&&Y0.error&&Y0.error!=="aborted")B.setError(Y0.error);return}if(q){if(K0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(K0.text.trim())){await l2();let x=F.getAbortController()??F.createAbortController();await g4(K0,C,B,x.signal,k,K,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,G);return}B.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await l2();let Q0=await j$.getInstance().executeUserPromptSubmitHooks(K0.text,{projectDir:G,sessionId:K,permissionMode:z,hasImages:K0.images.length>0,imageCount:K0.images.length});if(!Q0.proceed){if(Q0.warning)B.addAssistantMessage(Q0.warning);return}let Y0=K0;if(Q0.updatedPrompt)Y0={...K0,text:Q0.updatedPrompt,parts:[{type:"text",text:Q0.updatedPrompt},...K0.parts.filter((x)=>x.type==="image")]};if(Q0.contextInjection){let x=`<user-prompt-submit-hook>
36
+ ${Q0.contextInjection}
37
+ </user-prompt-submit-hook>`;Y0={...Y0,text:`${Y0.text}
38
+
39
+ ${x}`,parts:[...Y0.parts,{type:"text",text:`
40
+
41
+ ${x}`}]}}let h=E4(Y0),c=await P(h);if(!c.accepted){let x=c.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";B.addAssistantMessage(x);return}if(F.enqueueCommand(K0),B.addUserMessage(K0.displayText),c.delivery==="next_turn")I$.request();return}C.setTasks([]),F.setRecoveredSteeringCount(0),L.current=!1;let I0=F.createAbortController();m0.resetStreamingBuffers(),B.clearFinalizingStreamingMessageId(),F.setProcessing(!0);try{let Q0=await Q1(K0);if(!Q0.success&&Q0.error&&Q0.error!=="aborted")B.setError(Q0.error)}catch(Q0){let Y0=I8(Q0);if(Y0.isAbort);else B.setError(`执行失败: ${Y0.displayMessage}`)}finally{if(F.getAbortController()===I0)F.setProcessing(!1),F.clearAbortController(I0),B.setCurrentThinkingContent(null),R.current?.notifyIdle()}});return a1(()=>{let K0=MY.subscribe((M0)=>{if(!bY(M0,{sessionId:K,projectPath:G}))return;if(M0.type.startsWith("team.")){let{teamName:I0,messageId:Q0,content:Y0}=M0.properties,h=M0.properties.metadata;if(M0.type==="team.message.received"&&typeof I0==="string"&&typeof Q0==="string"&&typeof Y0==="string"&&RY(h,{messageId:Q0,teamName:I0}))(async()=>{let c=await D(Y0,{messageId:Q0,origin:"team_message",metadata:h});if(!c.accepted)return;if(await new CY(I0,m4()).markDelivered([Q0]),c.delivery==="next_turn")I$.request()})().catch((c)=>{d2.warn("[useCommandHandler] Failed to deliver teammate message",c)});queueMicrotask(()=>{N$()});return}if(M0.type!=="subagent.completion.queued")return;I$.request()});return()=>{K0()}},[D,I$,N$,K,G]),a1(()=>{let K0=!1;return(async()=>{if(Z)await x4.resolvePendingWithHandler(G,K,Z);else await x4.cancelPendingNonInteractive(G,K);if(K0)return;let[M0,I0]=await Promise.all([x$.hasPendingInbox(G,K),x$.hasActiveGoal(G,K)]),Q0=!M0&&!I0&&await x$.hasRecoverableTurn(G,K);if(M0||I0||Q0)I$.request()})().catch((M0)=>{if(!K0)d2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",M0)}),()=>{K0=!0}},[Z,I$,K,G]),{executeCommand:r1,handleAbort:F$,isProcessing:q||y?.status==="loading",cleanupAgent:k}};import{useMemoizedFn as u8}from"ahooks";import{useRef as cX,useState as dX}from"react";var SY=()=>{let[$,J]=dX([]),Z=cX(-1),Y=u8((q,K)=>{let G={display:q,pasteMappings:K?new Map(K):new Map};J((O)=>[...O,G]),Z.current=-1}),X=u8(()=>{if($.length===0)return null;let q=Z.current===-1?$.length-1:Math.max(0,Z.current-1);return Z.current=q,$[q]||null}),Q=u8(()=>{if(Z.current===-1)return null;let q=Z.current+1;if(q>=$.length)return Z.current=-1,null;else return Z.current=q,$[q]||null}),U=u8(()=>{Z.current=-1});return{commandHistory:$,historyIndex:Z.current,addToHistory:Y,getPreviousCommand:X,getNextCommand:Q,resetHistoryIndex:U}};import{useMemoizedFn as r2}from"ahooks";import{useMemo as lX,useRef as DY,useState as rX}from"react";var fY=()=>{let[$,J]=rX({isVisible:!1,details:null,resolver:null}),Z=DY(null),Y=DY([]),X=r2((O)=>{Z.current=O,J({isVisible:Boolean(O),details:O?.details??null,resolver:O?.resolve??null})}),Q=r2((O,z)=>{if(O.settled)return;if(O.settled=!0,O.signal&&O.abortListener)O.signal.removeEventListener("abort",O.abortListener);O.resolve(z)}),U=r2((O,z)=>{return new Promise((_)=>{let W={details:O,resolve:_,signal:z,settled:!1},H=()=>{if(Z.current===W){Q(W,{approved:!1,reason:a2}),X(Y.current.shift()??null);return}let N=Y.current.indexOf(W);if(N>=0)Y.current.splice(N,1);Q(W,{approved:!1,reason:a2})};if(W.abortListener=H,z?.aborted){H();return}if(z?.addEventListener("abort",H,{once:!0}),!Z.current){X(W);return}Y.current.push(W)})}),q=r2((O)=>{let z=Z.current;if(z)Q(z,O);let _=Y.current.shift()??null;X(_)}),K=r2(()=>{if(Z.current)Q(Z.current,{approved:!1,reason:a2});for(let O of Y.current)Q(O,{approved:!1,reason:a2});Y.current=[],X(null)}),G=lX(()=>({requestConfirmation:U}),[U]);return{confirmationState:$,confirmationHandler:G,handleResponse:q,dismissAll:K}};import{useMemoizedFn as i1}from"ahooks";import{useRef as VY,useState as aX}from"react";var u4="␞",c4="␟";function c8($){return`${u4}PASTE:${$}:`}function d4(){return c4}var iX=`${u4}PASTE:(\\d+):[\\s\\S]*?${c4}`;function oX($){return $.includes(u4)&&$.includes(c4)}function nX($,J,Z){let Y=[...$.values()].filter((U)=>U.type==="image");if(Y.length>=w2)throw Error(`最多只能粘贴 ${w2} 张图片`);let X=Y.reduce((U,q)=>U+`data:${q.mimeType};base64,`.length+q.data.length,0),Q=`data:${Z};base64,`.length+J.length;if(X+Q>S8)throw Error("图片编码后总大小不能超过 5 MiB")}function tX($,J){let Z=[],Y=[];if(!oX($)){let z=$.trim();if(z)Y.push({type:"text",text:z});return{displayText:$,text:$,images:Z,parts:Y}}let X=Array.from($.matchAll(new RegExp(iX,"g"))),Q=0,U="",q="";for(let z of X){let _=z.index,W=_+z[0].length,H=parseInt(z[1],10),N=J.get(H);if(_>Q){let w=$.slice(Q,_);Y.push({type:"text",text:w}),U+=w,q+=w}if(!N)U+=z[0],q+=z[0],Y.push({type:"text",text:z[0]});else if(N.type==="text")U+=N.data,q+=N.data,Y.push({type:"text",text:N.data});else{let w={id:H,base64:N.data,mimeType:N.mimeType};Z.push(w),Y.push({type:"image",...w}),q+=`[Image #${H}]`}Q=W}if(Q<$.length){let z=$.slice(Q);Y.push({type:"text",text:z}),U+=z,q+=z}let K=[];for(let z of Y){let _=K[K.length-1];if(z.type==="text"&&_?.type==="text")_.text+=z.text;else K.push(z)}let G=0,O=K.length;while(G<K.length){let z=K[G];if(z.type!=="text"||z.text.trim()!=="")break;G++}while(O>G){let z=K[O-1];if(z.type!=="text"||z.text.trim()!=="")break;O--}return{displayText:q.trim(),text:U.trim(),images:Z,parts:K.slice(G,O)}}function vY($="",J=0){let[Z,Y]=aX({value:$,cursorPosition:J}),X=VY(0),Q=VY(new Map),U=i1((W)=>{Y((H)=>({value:W,cursorPosition:H.cursorPosition}));for(let H of Q.current.keys()){let N=c8(H);if(!W.includes(N))Q.current.delete(H)}}),q=i1((W)=>{Y((H)=>({...H,cursorPosition:Math.max(0,Math.min(W,H.value.length))}))}),K=i1(()=>{Y({value:"",cursorPosition:0}),Q.current.clear()}),G=i1((W)=>{X.current+=1;let H=X.current;return Q.current.set(H,{type:"text",data:W}),H}),O=i1((W,H)=>{nX(Q.current,W,H),X.current+=1;let N=X.current;return Q.current.set(N,{type:"image",data:W,mimeType:H}),N}),z=i1((W)=>{for(let[H,N]of W)if(Q.current.set(H,N),H>=X.current)X.current=H}),_=i1((W)=>tX(W,Q.current));return{value:Z.value,cursorPosition:Z.cursorPosition,setValue:U,setCursorPosition:q,clear:K,pasteMap:Q.current,addPasteMapping:G,addImagePasteMapping:O,restorePasteMappings:z,resolveInput:_}}import{useMemoizedFn as lY}from"ahooks";import{useEffect as rY,useRef as aY,useState as a4}from"react";function sX($){return{supportsThinking:W1().resolveConfig($).reasoning}}function d8($){return sX($).supportsThinking}import{useInput as jY}from"ink";import{createContext as eX,useCallback as $5,useContext as J5,useEffect as Y5,useMemo as Z5,useRef as l8}from"react";import{jsxDEV as X5}from"react/jsx-dev-runtime";var EY=eX(null);function hY({children:$}){let J=l8(new Map),Z=l8(0),Y=$5((Q,U,q)=>{let K=Z.current++;return J.current.set(K,{id:K,priority:U,handler:Q}),q?.(),()=>{J.current.delete(K)}},[]),X=Z5(()=>({register:Y}),[Y]);return jY((Q,U)=>{let q=[...J.current.values()].sort((K,G)=>G.priority-K.priority||K.id-G.id);for(let K of q)if(K.handler(Q,U)===!0)break}),X5(EY.Provider,{value:X,children:$},void 0,!1,void 0,this)}function w0($,J={}){let Z=J5(EY),Y=l8($);Y.current=$;let X=J.isActive??!0,Q=J.priority??0,U=l8(J.onRegistered);U.current=J.onRegistered,jY((q,K)=>{if(!Z&&X)Y.current(q,K)},{isActive:!Z&&X}),Y5(()=>{if(!Z||!X)return;return Z.register((q,K)=>Y.current(q,K),Q,()=>U.current?.())},[X,Q,Z])}import Q5 from"fast-glob";import U5 from"fuse.js";import{useEffect as gY,useMemo as r8,useRef as G5,useState as l4}from"react";var A2=null,K5=5000;function q5($,J){let Z=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let Y of Z){let X=Y[1],Q=Y.index+(Y[0].length-X.length),U=Q+X.length;if(J>=Q&&J<=U){let q=X.slice(1),K=!1;if(q.startsWith('"')){if(K=!0,q=q.slice(1),q.endsWith('"'))q=q.slice(0,-1)}return{hasQuery:!0,query:q,startIndex:Q,endIndex:U,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var z5=[...r4.map(($)=>`${$}/**`),...r4,...mY.map(($)=>`**/${$}`)];function pY($,J,Z={}){let{cwd:Y=K$(),maxSuggestions:X=15,ignorePatterns:Q=z5,debounceDelay:U=300,fuzzyMatch:q=!0,disabled:K=!1,canRequest:G}=Z,O=G5(G);O.current=G;let[z,_]=l4([]),[W,H]=l4(!1),[N,w]=l4(0),y=r8(()=>JSON.stringify(Q),[Q]),T=!K&&$.includes("@"),B=r8(()=>{if(J===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return q5($,J)},[$,J]);gY(()=>{if(!T){_([]),H(!1);return}let L=Date.now();if(A2&&A2.cwd===Y&&A2.ignoreKey===y&&L-A2.timestamp<K5){_(A2.files),H(!1);return}let A=!1,S=setTimeout(async()=>{if(K||O.current?.()===!1){_([]),H(!1);return}H(!0);try{let k=(await Q5("**/*",{cwd:Y,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Q})).map((P)=>P.replace(/\\/g,"/"));if(!A)_(k),A2={cwd:Y,ignoreKey:y,files:k,timestamp:L}}catch(M){if(console.error("Failed to load files for @ completion:",M),!A)_([])}finally{if(!A)H(!1)}},U);return()=>{A=!0,clearTimeout(S)}},[T,Y,U,y,K]);let C=r8(()=>q&&z.length>0?new U5(z,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}):null,[z,q]),F=r8(()=>{if(!B.hasQuery||z.length===0)return[];let L=B.query.toLowerCase();if(L==="")return z.slice(0,X);if(C)return C.search(L).slice(0,X).map((R)=>R.item);return z.filter((A)=>A.toLowerCase().includes(L)).slice(0,X)},[B,z,C,X]);return gY(()=>{w(0)},[F]),{...B,suggestions:F,selectedIndex:N,loading:W}}function _5($,J=!1){if($.includes(" ")||J)return`@"${$}"`;return`@${$}`}function xY($,J,Z){if(!J.hasQuery)return{newInput:$,newCursorPos:$.length};let Y=_5(Z,J.quoted),X=$.slice(0,J.startIndex),Q=$.slice(J.endIndex),U=X+Y+" "+Q,q=J.startIndex+Y.length+1;return{newInput:U,newCursorPos:q}}import{useMemoizedFn as uY}from"ahooks";import{useEffect as cY,useRef as dY}from"react";var s0=($,J)=>{let Z=dY(!1),Y=dY(null),X=uY(()=>{if(Y.current)clearTimeout(Y.current);Y.current=setTimeout(()=>{H$().setAwaitingSecondCtrlC(!1),Z.current=!1,Y.current=null},3000)}),Q=()=>{i2().shutdown("SIGINT",0)},U=uY(()=>{if(!Z.current){if(Z.current=!0,$&&J)J();H$().setAwaitingSecondCtrlC(!0),X()}else{if(Y.current)clearTimeout(Y.current),Y.current=null;H$().setAwaitingSecondCtrlC(!1),Q()}});return cY(()=>{if($){if(H$().setAwaitingSecondCtrlC(!1),Z.current=!1,Y.current)clearTimeout(Y.current),Y.current=null}},[$]),cY(()=>{return()=>{if(Y.current)clearTimeout(Y.current)}},[]),U};var a8=V1("UI"),nY=($,J,Z,Y,X,Q,U,q,K,G,O=!1)=>{let _=X$()==="main-input",W=$.value,H=$.setValue,N=$.cursorPosition,w=D1(),y=U1(),T=f1(),B=L8(),C=B?d8(B):!1,[F,L]=a4(!1),[A,R]=a4([]),[S,M]=a4(0),k=pY(W,N,{cwd:y,maxSuggestions:10,disabled:O,canRequest:()=>U$().app.activeModal!=="sessionHistoryViewer"}),P=s0(U||!1,Q),D=aY(0),e=500,$0=aY(!1);rY(()=>{if(U)$0.current=!1},[U]),rY(()=>{if(O){L(!1),R([]);return}if(k.hasQuery&&k.suggestions.length>0){let o=k.suggestions.map((f)=>({command:f,description:iY(f)?`Directory: ${f}`:`File: ${f}`,matchScore:1}));R(o),L(!0),M(0)}else if(W.startsWith("/"))if(W.includes(" "))L(!1),R([]);else{let f=oY(W,y);R(f),L(f.length>0),M(0)}else L(!1),R([])},[W,k.hasQuery,k.suggestions,y,O]);let m=lY(()=>{w.clearMessages(),w.setError(null)}),S0=lY(()=>{if(O)return;a8.debug("[DIAG] handleSubmit called:",{input:W,showSuggestions:F});let o=W.trim();if(o){let f=$.resolveInput(o);a8.debug("[DIAG] Submitting command:",{displayText:o,textLength:f.text.length,imageCount:f.images.length}),L(!1),R([]);let v=$.pasteMap.size>0?new Map($.pasteMap):new Map;X(o,v),$.clear(),J(f),a8.debug("[DIAG] Command submitted to onSubmit callback")}else a8.debug("[DIAG] Empty command, not submitting")});return w0((o,f)=>{if(o==="?"&&!W)return K?.(),setTimeout(()=>$.clear(),0),!0;if(f.backspace||f.delete||f.leftArrow||f.rightArrow||f.pageUp||f.pageDown||!f.ctrl&&!f.meta&&!f.escape&&!f.tab&&!f.upArrow&&!f.downArrow&&!f.return&&!(o==="?"&&!W))return!1;if(f.ctrl&&o==="c"||f.meta&&o==="c"||f.ctrl&&o==="d"||f.meta&&o==="d")return P(),!0;if(f.ctrl&&o==="l"||f.meta&&o==="l")return m(),!0;if(f.ctrl&&o==="t"||f.meta&&o==="t")return w.toggleThinkingExpanded(),!0;if(f.escape){if(G)K?.();else if(U&&Q){if($0.current)return!0;$0.current=!0,Q()}else if(F)L(!1),R([]);else if(W){let g=Date.now();if(g-D.current<500)$.clear(),D.current=0;else D.current=g}return!0}if(f.tab&&f.shift)return q?.(),!0;if(f.tab){if(F&&A.length>0){let g=A[S].command;if(k.hasQuery&&k.suggestions.includes(g)){let{newInput:s,newCursorPos:U0}=xY(W,k,g);H(s),$.setCursorPosition(U0)}else{let s=g+" ";H(s),$.setCursorPosition(s.length)}L(!1),R([])}else if(C)T.toggleThinkingMode();return!0}if(f.return)return S0(),!0;if(f.upArrow){if(F&&A.length>0){let g=A.length-1;M((s)=>s>0?s-1:g)}else{let g=Z();if(g){if(g.pasteMappings.size>0)$.restorePasteMappings(g.pasteMappings);H(g.display),$.setCursorPosition(g.display.length)}}return!0}if(f.downArrow){if(F&&A.length>0){let g=A.length-1;M((s)=>s<g?s+1:0)}else{let g=Y();if(g){if(g.pasteMappings.size>0)$.restorePasteMappings(g.pasteMappings);H(g.display),$.setCursorPosition(g.display.length)}}return!0}return!1},{isActive:_&&!O,priority:20}),{handleSubmit:S0,showSuggestions:F,suggestions:A,selectedSuggestionIndex:S}};import A5 from"ansi-escapes";import{useStdout as P5}from"ink";import{useCallback as b5,useEffect as M5,useRef as y5}from"react";import{useStdout as O5}from"ink";import{debounce as N5}from"lodash-es";import{useEffect as F5,useState as W5}from"react";var tY={columns:80,rows:24};function H5($){return{width:$.columns||80,height:$.rows||24}}function L5($,J){return $.width===J.width&&$.height===J.height}function sY($,J,Z){let{stdout:Y}=O5(),[X,Q]=W5(()=>$(Y));return F5(()=>{let U=()=>{let K=$(Y);Q((G)=>J(G,K)?G:K)},q=N5(U,Z);return U(),Y.on("resize",q),()=>{Y.off("resize",q),q.cancel()}},[Y,Z,J,$]),X}function w5($){return $.columns||tY.columns}function B5($){return $.rows||tY.rows}function eY($,J=200){return sY($==="columns"?w5:B5,Object.is,J)}function P2($=200){return sY(H5,L5,$)}function b2($=200){return eY("columns",$)}function $6(){let{stdout:$}=P5(),J=b2(),Z=y5(!0),Y=z0((Q)=>Q.session.actions.incrementClearCount),X=b5(()=>{if($)$.write(A5.clearTerminal);Y()},[$,Y]);return M5(()=>{if(Z.current){Z.current=!1;return}X()},[J,X]),{refreshStatic:X}}var T5=50,Q6=500,C5=new Set(["session_surface_cursor_invalid","session_surface_snapshot_changed"]);function J6($=0){return{viewGeneration:$,status:"idle",messages:[],truncated:!1}}function i4($,J){if($.version!==J.version||$.sessionId!==J.sessionId)return!1;if($.workspace.kind!==J.workspace.kind)return!1;if($.workspace.kind==="local"&&J.workspace.kind==="local")return $.workspace.projectPath===J.workspace.projectPath;return $.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}function Y6($,J){if($.workspace.kind!==J.workspace.kind)return!1;if($.workspace.kind==="local"&&J.workspace.kind==="local")return $.workspace.projectPath===J.workspace.projectPath;return $.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}function o4($){switch($){case"session_surface_not_found":return"Session history is no longer available.";case"session_surface_cursor_invalid":case"session_surface_snapshot_changed":return"Session history changed. Reopen it to continue.";case"session_surface_capability_unavailable":case"session_surface_read_only":return"This action is unavailable in history-only mode.";case"session_surface_capacity":return"Session history is busy. Try again.";default:return"Session history is unavailable."}}function o2($){let J=$ instanceof S$?$.code:null;return{code:J,message:o4(J)}}function R5($){return $.slice(-Q6).map((Z)=>({...Z}))}function I5($,J){let Z=new Set(J.map((Y)=>Y.id));return[...$.filter((Y)=>!Z.has(Y.id)),...J].slice(0,Q6).map((Y)=>({...Y}))}class n4{serviceFactory;pageLimit;listeners=new Set;service=null;pendingServiceClose=null;ownerClosePromise=null;activeController=null;generation=0;pageRequest=null;activeActivation=null;disposed=!1;state=J6();constructor($={}){this.serviceFactory=$.serviceFactory??(()=>new X6),this.pageLimit=$.pageLimit??T5}getState(){return this.state}subscribe($){return this.listeners.add($),()=>this.listeners.delete($)}async listPage($={}){let J=this.generation;if(await this.waitForPendingServiceClose(),this.assertOpen(),!this.isCurrent(J))throw new S$("session_surface_unavailable");let Z=this.service??this.createService(),Y=await Z.listPage($);if(!this.isCurrent(J,Z))throw new S$("session_surface_unavailable");return Y}async listAll(){let $=this.generation,J=[],Z=new Set,Y;do{if(!this.isCurrent($))throw new S$("session_surface_unavailable");let X=await this.listPage({cursor:Y,limit:this.pageLimit});if(!this.isCurrent($))throw new S$("session_surface_unavailable");for(let Q of X.sessions){let U=Z6(Q.locator);if(Z.has(U))continue;Z.add(U),J.push(Q)}Y=X.nextCursor}while(Y);return J}async open($){if(this.assertOpen(),$.locator.workspace.kind!=="acp-remote")throw new S$("invalid_session_locator");let J=++this.generation;this.abortActiveRequest("history-view-replaced");let Z=this.service;if(this.service=null,!$.capabilities.history.read){this.setState({status:"error",session:$,messages:[],truncated:!1,error:{code:"session_surface_capability_unavailable",message:o4("session_surface_capability_unavailable")}}),await this.closeService(Z,"history-view-replaced");return}if(this.setState({status:"loading",session:$,messages:[],truncated:!1}),await this.closeService(Z,"history-view-replaced"),!this.isCurrent(J))return;let Y=this.createService(),X=this.beginRequest();try{let Q=await Y.open($.locator,{limit:this.pageLimit});if(!this.isCurrent(J,Y,X))return;if(!i4($.locator,Q.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(Q,"ready")}catch(Q){if(!this.isCurrent(J,Y,X))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:o2(Q)})}finally{if(this.activeController===X)this.activeController=null}}activate($,J){let Z=`${J}\x00${Z6($.locator)}`;if(this.activeActivation?.key===Z)return this.activeActivation.promise;let Y=this.activateUnshared($,J).finally(()=>{if(this.activeActivation?.promise===Y)this.activeActivation=null});return this.activeActivation={key:Z,promise:Y},Y}async activateUnshared($,J){if(J==="resume")return this.open($);if(this.assertOpen(),$.locator.workspace.kind!=="acp-remote"||!$.capabilities.history.fork)throw new S$("session_surface_capability_unavailable");let Z=++this.generation;this.abortActiveRequest("history-view-replaced"),this.setState({status:"forking",session:$,messages:[],truncated:!1});let Y=this.service;if(this.service=null,await this.closeService(Y,"history-view-replaced"),!this.isCurrent(Z))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork($.locator);if(!this.isCurrent(Z,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!Y6($.locator,U.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(U,"ready")}catch(U){if(!this.isCurrent(Z,X,Q))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:o2(U)})}finally{if(this.activeController===Q)this.activeController=null}}loadOlder($){if(this.pageRequest)return this.pageRequest;if(this.state.status!=="ready"&&this.state.status!=="error")return Promise.resolve();let{session:J,olderCursor:Z,snapshot:Y}=this.state,X=this.service;if(!X||!J||!Z||!Y||!J.capabilities.history.read||!this.matchesActionTarget($)||$.olderCursor!==Z)return Promise.resolve();let Q=this.generation,U=this.beginRequest();this.setState({...this.state,status:"loading-older",error:void 0});let q=X.historyPage(J.locator,{cursor:Z,expectedSnapshot:Y,limit:this.pageLimit}).then((K)=>{if(!this.isCurrent(Q,X,U))return;if(K.snapshot!==Y)throw new S$("session_surface_snapshot_changed");this.setState({...this.state,status:"ready",messages:I5(K.messages,this.state.messages),olderCursor:K.olderCursor,snapshot:K.snapshot,truncated:this.state.truncated||K.truncated,error:void 0})}).catch(async(K)=>{if(!this.isCurrent(Q,X,U))return;if(K instanceof S$&&C5.has(K.code)){this.setState({status:"loading",session:J,messages:[],truncated:!1});try{let G=await X.open(J.locator,{limit:this.pageLimit});if(!this.isCurrent(Q,X,U))return;if(!i4(J.locator,G.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(G,"ready")}catch(G){if(!this.isCurrent(Q,X,U))return;this.setState({status:"error",session:J,messages:[],truncated:!1,error:o2(G)})}return}this.setState({...this.state,status:"error",error:o2(K)})}).finally(()=>{if(this.activeController===U)this.activeController=null;if(this.pageRequest===q)this.pageRequest=null});return this.pageRequest=q,q}async fork($){if(this.state.status!=="ready")return;let J=this.state.session,Z=this.service;if(!J||!Z||!this.matchesActionTarget($))return;if(!J.capabilities.history.fork){this.setState({...this.state,status:"error",error:{code:"session_surface_capability_unavailable",message:o4("session_surface_capability_unavailable")}});return}let Y=++this.generation;if(this.abortActiveRequest("history-fork"),this.setState({...this.state,status:"forking",error:void 0}),this.service=null,await this.closeService(Z,"history-fork"),!this.isCurrent(Y))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork(J.locator);if(!this.isCurrent(Y,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!Y6(J.locator,U.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(U,"ready")}catch(U){if(!this.isCurrent(Y,X,Q))return;this.setState({...this.state,status:"error",error:o2(U)})}finally{if(this.activeController===Q)this.activeController=null}}async closeView(){this.generation+=1,this.activeActivation=null,this.abortActiveRequest("history-view-closed"),this.pageRequest=null;let $=this.service;this.service=null,this.setState(J6(this.generation)),await this.closeService($,"history-view-closed")}close(){if(this.ownerClosePromise)return this.ownerClosePromise;return this.disposed=!0,this.listeners.clear(),this.ownerClosePromise=this.closeView(),this.ownerClosePromise}createService(){let $=this.serviceFactory();return this.service=$,$}closeService($,J){if(!$)return this.waitForPendingServiceClose();let Z=this.pendingServiceClose,Y=(async()=>{if(Z)await Z;await $.close(J)})();this.pendingServiceClose=Y;let X=()=>{if(this.pendingServiceClose===Y)this.pendingServiceClose=null};return Y.then(X,X),Y}waitForPendingServiceClose(){return this.pendingServiceClose??Promise.resolve()}matchesActionTarget($){let J=this.state.session;return J!==void 0&&$.viewGeneration===this.state.viewGeneration&&i4($.locator,J.locator)&&$.snapshot===this.state.snapshot}beginRequest(){this.abortActiveRequest("history-request-replaced");let $=new AbortController;return this.activeController=$,$}abortActiveRequest($){this.activeController?.abort($),this.activeController=null}isCurrent($,J,Z){return!this.disposed&&$===this.generation&&(J===void 0||J===this.service)&&(Z===void 0||!Z.signal.aborted)}commitResult($,J){this.setState({status:J,session:$.session,messages:R5($.history.messages),olderCursor:$.history.olderCursor,snapshot:$.history.snapshot,truncated:$.history.truncated})}setState($){this.state={...$,viewGeneration:$.viewGeneration??this.generation};for(let J of this.listeners)J(this.state)}assertOpen(){if(this.disposed)throw new S$("session_surface_unavailable")}}function Z6($){return $.workspace.kind==="local"?`${$.version}\x00local\x00${$.workspace.projectPath}\x00${$.sessionId}`:`${$.version}\x00acp-remote\x00${$.workspace.workspaceRef}\x00${$.sessionId}`}import o1 from"chalk";import k5 from"string-width";var f0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},o8="\x1B",t4=`${o8}[2K`,i8=($)=>$>0?`${o8}[${$}A`:"",U6=`${o8}[?25l`,G6=`${o8}[?25h`;function K6($,J){f0.active=!0,f0.renderedLineCount=0,f0.lastRenderedLines=[],f0.terminalWidth=$,f0.terminalHeight=J,f0.isFirstRender=!0}function q6($,J){f0.terminalWidth=$,f0.terminalHeight=J}function z6($,J,Z,Y){if(!f0.active)return;let X=8,Q=Math.max(1,f0.terminalHeight-X),U=[],q=W$.getTheme(),K=" ".repeat(f0.prefixIndent),G=o1.dim.hex(q.colors.border.light);if(J>0)U.push(`${K}${o1.dim.hex(q.colors.text.muted)(`^ ${J} lines above (streaming...)`)}`);let O=Z==="code",z=Z==="diff",_="",W=$;if(O&&$.length>0)_=$[0].match(/^```(\w+)?/)?.[1]||"",W=$.slice(1);else if(z&&$.length>0&&$[0]==="<<<DIFF>>>")W=$.slice(1);let H=W.slice(-Q);if(O&&J===0){let w=_?` ${o1.hex(q.colors.text.secondary)(_)}`:"";U.push(`${K}${G("╭─")}${w}`)}for(let w=0;w<H.length;w++){let y=H[w],T=K;if(w===0&&!Y&&f0.isFirstRender&&!O&&!z)T=o1.bold.hex(q.colors.success)("• ")+" ",f0.isFirstRender=!1;let B=O?4:0,C=f0.terminalWidth-f0.prefixIndent-2-B,F=y;if(k5(y)>C)F=y.slice(0,C);if(O)U.push(`${K}${G("│")} ${F}`);else if(z){let L=F;if(L.startsWith("+"))U.push(`${T}${o1.green(F)}`);else if(L.startsWith("-"))U.push(`${T}${o1.red(F)}`);else if(L.startsWith("@@"))U.push(`${T}${o1.dim(F)}`);else U.push(`${T}${F}`)}else U.push(`${T}${F}`);if(w===0&&!Y&&f0.isFirstRender)f0.isFirstRender=!1}let N=[];if(N.push(U6),f0.renderedLineCount>0)N.push(i8(f0.renderedLineCount)),N.push("\r");for(let w=0;w<U.length;w++){let y=U[w],T=f0.lastRenderedLines[w];if(y!==T)N.push(t4),N.push(y);if(w<U.length-1)N.push(`
42
+ `)}if(U.length<f0.renderedLineCount){for(let y=U.length;y<f0.renderedLineCount;y++)N.push(`
43
+ `),N.push(t4);let w=f0.renderedLineCount-U.length;N.push(i8(w))}N.push(G6),process.stdout.write(N.join("")),f0.renderedLineCount=U.length,f0.lastRenderedLines=U}function c$(){if(!f0.active)return;if(f0.renderedLineCount>0){let $=[];$.push(U6),$.push(i8(f0.renderedLineCount)),$.push("\r");for(let J=0;J<f0.renderedLineCount;J++)if($.push(t4),J<f0.renderedLineCount-1)$.push(`
44
+ `);if(f0.renderedLineCount>1)$.push(i8(f0.renderedLineCount-1)),$.push("\r");$.push(G6),process.stdout.write($.join(""))}f0.active=!1,f0.renderedLineCount=0,f0.lastRenderedLines=[],f0.isFirstRender=!0}function t$(){return f0.active}import _6 from"node:fs";import S5 from"node:os";import s4 from"node:path";import{MultiSelect as D5}from"@inkjs/ui";import{useMemoizedFn as n8}from"ahooks";import{Box as b0,Text as H0,useFocus as f5,useFocusManager as V5}from"ink";import t8 from"ink-select-input";import v5 from"ink-spinner";import n2 from"ink-text-input";import{useEffect as O6,useState as M2}from"react";import{jsxDEV as E}from"react/jsx-dev-runtime";var j5=[{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"}],E5=[{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 h5($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function t2({onComplete:$,onCancel:J,initialConfig:Z}){let[Y,X]=M2(Z?"name":"mode"),[Q,U]=M2({name:Z?.name||"",description:Z?.description||"",tools:Z?.tools||[],color:Z?.color,location:Z?.location||"project",systemPrompt:Z?.systemPrompt||""}),[q,K]=M2(""),[G,O]=M2(!1),[z,_]=M2(""),[W,H]=M2(Z?"edit":"manual"),{focus:N}=V5(),y={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[W];O6(()=>{if(Y==="name"||Y==="description"||Y==="systemPrompt"||Y==="aiPrompt")return;N(`step-${Y}`)},[Y,N]);let T=n8(()=>{let A=y.indexOf(Y);if(A<y.length-1)X(y[A+1])}),B=n8(()=>{if(z)_("");if(Y==="confirm"&&W==="ai"){X("aiPrompt");return}let A=y.indexOf(Y);if(A>0)X(y[A-1]);else J()}),C=n8(async()=>{O(!0),_("");try{let A=await c2.create(),R=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
45
+
46
+ ## 可用工具列表
47
+
48
+ - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
49
+ - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
50
+ - **Read**: 读取文件内容
51
+ - **Write**: 写入/创建文件
52
+ - **Edit**: 编辑文件(字符串替换)
53
+ - **ApplyPatch**: 原子应用多文件文本补丁
54
+ - **Bash**: 执行命令行命令
55
+
56
+ ## 可用颜色
57
+
58
+ - red, blue, green, yellow, purple, orange, pink, cyan
59
+
60
+ ## 输出格式
61
+
62
+ 你必须以 JSON 格式返回配置,格式如下:
63
+
64
+ \`\`\`json
65
+ {
66
+ "name": "agent-name",
67
+ "description": "简洁的一句话描述(英文)",
68
+ "tools": ["Glob", "Grep", "Read"],
69
+ "color": "blue",
70
+ "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
71
+ }
72
+ \`\`\`
73
+
74
+ ## 注意事项
75
+
76
+ 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
77
+ 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
78
+ 3. **tools**: 根据任务选择必要的工具,不要选择太多
79
+ 4. **color**: 选择一个合适的颜色用于 UI 区分
80
+ 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
81
+
82
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,M=(await A.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
83
+
84
+ ## 可用工具列表
85
+
86
+ - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
87
+ - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
88
+ - **Read**: 读取文件内容
89
+ - **Write**: 写入/创建文件
90
+ - **Edit**: 编辑文件(字符串替换)
91
+ - **ApplyPatch**: 原子应用多文件文本补丁
92
+ - **Bash**: 执行命令行命令
93
+
94
+ ## 可用颜色
95
+
96
+ - red, blue, green, yellow, purple, orange, pink, cyan
97
+
98
+ ## 输出格式
99
+
100
+ 你必须以 JSON 格式返回配置,格式如下:
101
+
102
+ \`\`\`json
103
+ {
104
+ "name": "agent-name",
105
+ "description": "简洁的一句话描述(英文)",
106
+ "tools": ["Glob", "Grep", "Read"],
107
+ "color": "blue",
108
+ "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
109
+ }
110
+ \`\`\`
111
+
112
+ ## 注意事项
113
+
114
+ 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
115
+ 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
116
+ 3. **tools**: 根据任务选择必要的工具,不要选择太多
117
+ 4. **color**: 选择一个合适的颜色用于 UI 区分
118
+ 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
119
+
120
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,q)).trim(),k=M.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(k)M=k[1];let P=JSON.parse(M);if(!P.name||!P.description||!P.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(P.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");U({name:P.name,description:P.description,tools:Array.isArray(P.tools)?P.tools:[],color:P.color||"blue",location:"project",systemPrompt:P.systemPrompt}),X("confirm")}catch(A){_(A instanceof Error?A.message:String(A))}finally{O(!1)}});O6(()=>{if(Y==="aiGenerating"&&!G&&!z)C()},[Y,G,z,C]);let F=n8(async()=>{try{let A=Q.location==="project"?s4.join(K$(),".blade","agents"):s4.join(S5.homedir(),".blade","agents");await _6.promises.mkdir(A,{recursive:!0});let R=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){R.push("tools:");for(let k of Q.tools)R.push(` - ${k}`)}if(Q.color)R.push(`color: ${Q.color}`);R.push("---");let S=[R.join(`
121
+ `),"",`# ${Q.name} Subagent`,"",Q.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
122
+ `),M=s4.join(A,`${Q.name}.md`);await _6.promises.writeFile(M,S,"utf-8"),$()}catch(A){console.error("保存配置失败:",A)}}),L=s0(!1,J);if(w0((A,R)=>{if(R.escape)B();else if(R.ctrl&&A==="c"||R.meta&&A==="c")L()},{isActive:Y!=="tools"}),Y==="mode")return E(b0,{flexDirection:"column",paddingY:1,children:[E(b0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(t8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(A)=>{if(A.value==="ai")H("ai"),X("aiPrompt");else H("manual"),X("name")}},void 0,!1,void 0,this),E(b0,{marginTop:1,children:E(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="aiPrompt")return E(b0,{flexDirection:"column",paddingY:1,children:[E(b0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:[E(H0,{color:"green",children:"描述: "},void 0,!1,void 0,this),E(n2,{value:q,onChange:K,onSubmit:(A)=>{if(!A.trim())return;X("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(b0,{children:E(H0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="aiGenerating"){if(z)return E(b0,{flexDirection:"column",paddingY:1,children:[E(b0,{marginBottom:1,children:E(H0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{color:"red",children:z},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E(b0,{flexDirection:"column",paddingY:1,children:[E(b0,{marginBottom:1,children:E(H0,{bold:!0,color:"yellow",children:[E(v5,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{dimColor:!0,children:['根据你的描述:"',q,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(Y==="name"){let A=W==="edit";return E(b0,{flexDirection:"column",paddingY:1,children:[E(b0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:["Step 1/7: ",A?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{dimColor:!0,children:A?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:[E(H0,{color:"green",children:"名称: "},void 0,!1,void 0,this),A?E(H0,{children:Q.name},void 0,!1,void 0,this):E(n2,{value:Q.name,onChange:(R)=>U({...Q,name:R}),onSubmit:(R)=>{if(h5(R))return;T()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(b0,{children:E(H0,{dimColor:!0,children:A?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A&&E(n2,{value:"",onChange:()=>{},onSubmit:T,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(Y==="description")return E(b0,{flexDirection:"column",paddingY:1,children:[E(b0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:[E(H0,{color:"green",children:"描述: "},void 0,!1,void 0,this),E(n2,{value:Q.description,onChange:(A)=>U({...Q,description:A}),onSubmit:(A)=>{if(!A.trim())return;T()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(b0,{children:E(H0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="tools")return E(g5,{config:Q,setConfig:U,onNext:T,onPrev:B},void 0,!1,void 0,this);if(Y==="color")return E(b0,{flexDirection:"column",paddingY:1,children:[E(b0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(t8,{items:E5,onSelect:(A)=>{let R=A.value==="none"?void 0:A.value;U({...Q,color:R}),T()}},void 0,!1,void 0,this),E(b0,{marginTop:1,children:E(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="location")return E(b0,{flexDirection:"column",paddingY:1,children:[E(b0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(t8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(A)=>{U({...Q,location:A.value}),T()}},void 0,!1,void 0,this),E(b0,{marginTop:1,children:E(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="systemPrompt")return E(b0,{flexDirection:"column",paddingY:1,children:[E(b0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:[E(H0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),E(n2,{value:Q.systemPrompt,onChange:(A)=>U({...Q,systemPrompt:A}),onSubmit:()=>T()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(b0,{children:E(H0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="confirm")return E(b0,{flexDirection:"column",paddingY:1,children:[E(b0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[E(H0,{children:[E(H0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(H0,{children:[E(H0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(H0,{children:[E(H0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(H0,{children:[E(H0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(H0,{children:[E(H0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(H0,{children:[E(H0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),E(t8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(A)=>{if(A.value==="save")F();else if(A.value==="back")B();else J()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function g5({config:$,setConfig:J,onNext:Z,onPrev:Y}){let{isFocused:X}=f5({id:"step-tools"});w0((U,q)=>{if(q.escape)Y()},{isActive:X});let Q=(U)=>{if(U.includes("all"))J({...$,tools:["all"]});else J({...$,tools:U});Z()};return E(b0,{flexDirection:"column",paddingY:1,children:[E(b0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(b0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(D5,{options:j5,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import m5 from"node:fs";import{useMemoizedFn as n1}from"ahooks";import{Box as o0,Text as e0}from"ink";import e4 from"ink-select-input";import{useEffect as p5,useMemo as N6,useState as s8}from"react";import{jsxDEV as _0}from"react/jsx-dev-runtime";var $J=10;function F6({workspaceRoot:$,initialMode:J="menu",onComplete:Z,onCancel:Y}){let X=x8($),[Q,U]=s8(J),[q,K]=s8(null),[G,O]=s8(0),[z,_]=s8(0),W=n1(()=>{X.clear(),X.loadFromStandardLocations(),O((M)=>M+1)}),H=N6(()=>{return X.getAllSubagents()},[G]),N=Math.ceil(H.length/$J)||1,w=N6(()=>{let M=z*$J;return H.slice(M,M+$J)},[H,z]);p5(()=>{let M=Math.max(0,N-1);if(z>M)_(M)},[N,z]);let y=n1(()=>{if(z<N-1)_((M)=>M+1)}),T=n1(()=>{if(z>0)_((M)=>M-1)}),B=[{key:"list",label:"查看所有 Agents",value:"list"},{key:"create",label:"创建新 Agent",value:"create"},{key:"edit",label:"编辑 Agent",value:"edit"},{key:"delete",label:"删除 Agent",value:"delete"},{key:"cancel",label:"取消",value:"cancel"}],C=n1((M)=>{if(M.value==="cancel"){Y?.();return}U(M.value)}),F=n1((M)=>{if(K(M.value),Q==="edit")U("editWizard");else if(Q==="delete")U("deleteConfirm")}),L=n1(async()=>{if(!q?.configPath)return;try{await m5.promises.unlink(q.configPath),W(),A()}catch(M){console.error("删除失败:",M)}}),A=n1(()=>{U("menu"),K(null)}),R=s0(!1,Y);if(w0((M,k)=>{if(k.escape){if(Q==="menu")Y?.();else if(Q==="list"||Q==="edit"||Q==="delete")_(0),A();else if(Q==="deleteConfirm")A()}else if(k.ctrl&&M==="c"||k.meta&&M==="c")R();else if(Q==="list"){if(k.leftArrow||M==="h")T();else if(k.rightArrow||M==="l")y()}},{isActive:Q!=="create"&&Q!=="editWizard"}),Q==="menu")return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(e4,{items:B,onSelect:C},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0(e0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="list"){if(H.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0(e0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:[_0(e0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),_0(e0,{color:"gray",children:[" (共 ",H.length," 个)"]},void 0,!0,void 0,this),N>1&&_0(e0,{color:"yellow",children:[" ","第 ",z+1,"/",N," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w.map((M)=>_0(o0,{flexDirection:"column",paddingLeft:2,children:[_0(o0,{children:_0(e0,{children:[_0(e0,{bold:!0,color:M.color||"white",children:["• ",M.name]},void 0,!0,void 0,this),_0(e0,{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&&_0(o0,{paddingLeft:2,children:_0(e0,{color:"gray",children:["工具: ",M.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.configPath&&_0(o0,{paddingLeft:2,children:_0(e0,{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)),_0(o0,{marginTop:1,paddingLeft:2,children:N>1?_0(e0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let S=(M)=>{if(H.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0(e0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let k=H.map((P)=>({key:P.name,label:`${P.name} - ${P.description}`,value:P}));return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(e4,{items:k,onSelect:F},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0(e0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(Q==="create")return _0(t2,{onComplete:()=>{W(),A()},onCancel:A},void 0,!1,void 0,this);if(Q==="edit")return S("编辑 Agent");if(Q==="editWizard"&&q){let M={name:q.name,description:q.description,tools:q.tools||[],color:q.color,location:q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:q.systemPrompt||""};return _0(t2,{initialConfig:M,onComplete:()=>{W(),A()},onCancel:A},void 0,!1,void 0,this)}if(Q==="delete")return S("删除 Agent");if(Q==="deleteConfirm"&&q)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{children:["你确定要删除 Agent"," ",_0(e0,{bold:!0,color:"yellow",children:q.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:["文件路径: ",q.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(e4,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(M)=>{if(M.value==="confirm")L();else A()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as y2,Text as R0}from"ink";import u5,{useEffect as c5,useState as d5}from"react";import{useEffect as x5,useState as W6}from"react";function w6($=K$(),J=5000){let[Z,Y]=W6(null),[X,Q]=W6(!0);return x5(()=>{let U=!0,q=async()=>{try{let G=await H6($);if(!U)return;if(!G){Y(null),Q(!1);return}let O=await L6($);if(!U)return;Y(O)}catch{if(U)Y(null)}finally{if(U)Q(!1)}};q();let K=null;if(J>0)K=setInterval(q,J);return()=>{if(U=!1,K)clearInterval(K)}},[$,J]),{branch:Z,loading:X}}import{jsxDEV as N0,Fragment as s$}from"react/jsx-dev-runtime";var A6=u5.memo(()=>{let $=H8(),J=F2(),Y=F8()==="shortcuts",X=C9(),Q=U1(),{branch:U}=w6(Q),q=L8(),K=B9(),G=_9(),O=B8(),z=A8(),_=P8(),W=b8(),H=M8(),N=O9(),w=N9(),y=H2(),T=v9(),B=N2(),[C,F]=d5(null);c5(()=>{let k=!1;new JJ(Q,B).get().then((e)=>{if(!k)F(e)}).catch(()=>{if(!k)F(null)});let D=JJ.subscribe((e)=>{if(!k&&e.sessionId===B&&e.workspaceRoot===Q)F(e.goal)});return()=>{k=!0,D()}},[B,Q]);let L=q?d8(q):!1,R=(()=>{if(J==="default")return null;if(J==="autoEdit")return N0(R0,{color:"magenta",children:[">> ","auto edit on ",N0(R0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return N0(R0,{color:"cyan",children:["‖ plan mode on ",N0(R0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return N0(R0,{color:"red",children:["yolo mode on ",N0(R0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),S=R!==null,M=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"],["Ctrl+O:浏览记录","PgUp/PgDn:翻页","g/G:首尾"]];return N0(y2,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[Y?N0(y2,{flexDirection:"column",gap:0,children:M.map((k,P)=>N0(y2,{flexDirection:"row",children:[k.map((D,e)=>{let[$0,m]=D.split(":");return N0(y2,{flexDirection:"row",width:20,children:[N0(R0,{color:"yellow",children:$0},void 0,!1,void 0,this),N0(R0,{color:"gray",children:":"},void 0,!1,void 0,this),N0(R0,{color:"white",children:m},void 0,!1,void 0,this)]},e,!0,void 0,this)}),P===M.length-1&&N0(R0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},P,!0,void 0,this))},void 0,!1,void 0,this):N0(y2,{flexDirection:"row",gap:1,children:[U&&N0(s$,{children:[N0(R0,{color:"gray",children:[" ",U]},void 0,!0,void 0,this),N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),R,S&&N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this),C&&N0(s$,{children:[N0(R0,{color:C.status==="active"?"green":C.status==="verifying"?"cyan":C.status==="blocked"||C.status==="budget_limited"?"yellow":"gray",children:["goal:",C.status," ",C.objective.slice(0,32),C.prematureStop?` recovery:${C.prematureStop.consecutiveCount}`:"",C.verificationStall?` verify-gap:${C.verificationStall.consecutiveCount}`:"",C.frontierStall?` frontier:${C.frontierStall.category}:${C.frontierStall.consecutiveCount}`:""]},void 0,!0,void 0,this),N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N0(R0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N0(y2,{flexDirection:"row",gap:1,children:!$?N0(R0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):N0(s$,{children:[L&&N0(s$,{children:[O?N0(R0,{color:"cyan",children:["Effort ",z]},void 0,!0,void 0,this):N0(R0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&N0(s$,{children:[N0(R0,{color:_==="fast"?"yellow":"gray",children:["Speed ",_]},void 0,!0,void 0,this),N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&N0(s$,{children:[N0(R0,{color:"gray",children:["Output ",W]},void 0,!0,void 0,this),N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H!=="auto"&&N0(s$,{children:[N0(R0,{color:"gray",children:["Style ",H]},void 0,!0,void 0,this),N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q&&N0(R0,{color:"gray",children:q.model},void 0,!1,void 0,this),N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this),G?N0(R0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):N0(R0,{color:K<20?"red":K<50?"yellow":"gray",children:[K,"%"]},void 0,!0,void 0,this),N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this),N0(R0,{color:w===void 0?"gray":"cyan",children:["Cache ",B6(w)]},void 0,!0,void 0,this),N>0.001&&N0(s$,{children:[N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this),N0(R0,{color:"green",children:["$",N<0.01?N.toFixed(4):N.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y.length>0&&N0(s$,{children:[N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this),N0(R0,{color:"yellow",children:["已排队 ",y.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T>0&&N0(s$,{children:[N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this),N0(R0,{color:"cyan",children:["已恢复 ",T," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X&&N0(s$,{children:[N0(R0,{color:"gray",children:"·"},void 0,!1,void 0,this),N0(R0,{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 YJ,Text as ZJ}from"ink";import l5 from"react";import{jsxDEV as T2}from"react/jsx-dev-runtime";var P6=l5.memo(({suggestions:$,selectedIndex:J,visible:Z,maxDisplay:Y=8})=>{if(!Z||$.length===0)return null;let X=0,Q=Math.min(Y,$.length),U=J>=$.length;if(J>=Y&&!U)X=J-Y+1,Q=J+1;let q=$.slice(X,Q),K=$.length>Y;return T2(YJ,{flexDirection:"column",paddingX:2,paddingY:0,children:[q.map((G,O)=>{let _=X+O===J;return T2(YJ,{flexDirection:"row",paddingX:1,gap:2,children:[T2(ZJ,{color:_?"cyan":"white",bold:_,children:G.command},void 0,!1,void 0,this),T2(ZJ,{color:_?"cyan":"gray",dimColor:!_,children:["- ",G.description]},void 0,!0,void 0,this)]},G.command,!0,void 0,this)}),K&&T2(YJ,{paddingX:1,children:T2(ZJ,{color:U?"cyan":"gray",bold:U,dimColor:!U,children:["... and ",$.length-Y," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as l$,Text as K1,useStdout as d7}from"ink";import l7 from"ink-select-input";import RJ,{useMemo as e6}from"react";import{Box as k0,Text as c0}from"ink";import s1,{useEffect as TJ,useMemo as t1,useRef as n6}from"react";import{Box as WJ,Text as V6}from"ink";import Q7 from"react";import{Text as e$}from"ink";import Y7 from"react";import S6 from"string-width";import s2 from"string-width";function XJ({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 r5=XJ();function QJ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(r5,"")}var b6=($=0)=>(J)=>`\x1B[${J+$}m`,M6=($=0)=>(J)=>`\x1B[${38+$};5;${J}m`,y6=($=0)=>(J,Z,Y)=>`\x1B[${38+$};2;${J};${Z};${Y}m`,Q$={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]}},z_=Object.keys(Q$.modifier),a5=Object.keys(Q$.color),i5=Object.keys(Q$.bgColor),__=[...a5,...i5];function o5(){let $=new Map;for(let[J,Z]of Object.entries(Q$)){for(let[Y,X]of Object.entries(Z))Q$[Y]={open:`\x1B[${X[0]}m`,close:`\x1B[${X[1]}m`},Z[Y]=Q$[Y],$.set(X[0],X[1]);Object.defineProperty(Q$,J,{value:Z,enumerable:!1})}return Object.defineProperty(Q$,"codes",{value:$,enumerable:!1}),Q$.color.close="\x1B[39m",Q$.bgColor.close="\x1B[49m",Q$.color.ansi=b6(),Q$.color.ansi256=M6(),Q$.color.ansi16m=y6(),Q$.bgColor.ansi=b6(10),Q$.bgColor.ansi256=M6(10),Q$.bgColor.ansi16m=y6(10),Object.defineProperties(Q$,{rgbToAnsi256:{value(J,Z,Y){if(J===Z&&Z===Y){if(J<8)return 16;if(J>248)return 231;return Math.round((J-8)/247*24)+232}return 16+36*Math.round(J/255*5)+6*Math.round(Z/255*5)+Math.round(Y/255*5)},enumerable:!1},hexToRgb:{value(J){let Z=/[a-f\d]{6}|[a-f\d]{3}/i.exec(J.toString(16));if(!Z)return[0,0,0];let[Y]=Z;if(Y.length===3)Y=[...Y].map((Q)=>Q+Q).join("");let X=Number.parseInt(Y,16);return[X>>16&255,X>>8&255,X&255]},enumerable:!1},hexToAnsi256:{value:(J)=>Q$.rgbToAnsi256(...Q$.hexToRgb(J)),enumerable:!1},ansi256ToAnsi:{value(J){if(J<8)return 30+J;if(J<16)return 90+(J-8);let Z,Y,X;if(J>=232)Z=((J-232)*10+8)/255,Y=Z,X=Z;else{J-=16;let q=J%36;Z=Math.floor(J/36)/5,Y=Math.floor(q/6)/5,X=q%6/5}let Q=Math.max(Z,Y,X)*2;if(Q===0)return 30;let U=30+(Math.round(X)<<2|Math.round(Y)<<1|Math.round(Z));if(Q===2)U+=60;return U},enumerable:!1},rgbToAnsi:{value:(J,Z,Y)=>Q$.ansi256ToAnsi(Q$.rgbToAnsi256(J,Z,Y)),enumerable:!1},hexToAnsi:{value:(J)=>Q$.ansi256ToAnsi(Q$.hexToAnsi256(J)),enumerable:!1}}),Q$}var n5=o5(),T6=n5;var $4=new Set(["\x1B","›"]),t5=39,GJ="\x07",I6="[",s5="]",k6="m",e8=`${s5}8;;`,C6=($)=>`${$4.values().next().value}${I6}${$}${k6}`,R6=($)=>`${$4.values().next().value}${e8}${$}${GJ}`,e5=($)=>$.split(" ").map((J)=>s2(J)),UJ=($,J,Z)=>{let Y=[...J],X=!1,Q=!1,U=s2(QJ($.at(-1)));for(let[q,K]of Y.entries()){let G=s2(K);if(U+G<=Z)$[$.length-1]+=K;else $.push(K),U=0;if($4.has(K))X=!0,Q=Y.slice(q+1,q+1+e8.length).join("")===e8;if(X){if(Q){if(K===GJ)X=!1,Q=!1}else if(K===k6)X=!1;continue}if(U+=G,U===Z&&q<Y.length-1)$.push(""),U=0}if(!U&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},$7=($)=>{let J=$.split(" "),Z=J.length;while(Z>0){if(s2(J[Z-1])>0)break;Z--}if(Z===J.length)return $;return J.slice(0,Z).join(" ")+J.slice(Z).join("")},J7=($,J,Z={})=>{if(Z.trim!==!1&&$.trim()==="")return"";let Y="",X,Q,U=e5($),q=[""];for(let[z,_]of $.split(" ").entries()){if(Z.trim!==!1)q[q.length-1]=q.at(-1).trimStart();let W=s2(q.at(-1));if(z!==0){if(W>=J&&(Z.wordWrap===!1||Z.trim===!1))q.push(""),W=0;if(W>0||Z.trim===!1)q[q.length-1]+=" ",W++}if(Z.hard&&U[z]>J){let H=J-W,N=1+Math.floor((U[z]-H-1)/J);if(Math.floor((U[z]-1)/J)<N)q.push("");UJ(q,_,J);continue}if(W+U[z]>J&&W>0&&U[z]>0){if(Z.wordWrap===!1&&W<J){UJ(q,_,J);continue}q.push("")}if(W+U[z]>J&&Z.wordWrap===!1){UJ(q,_,J);continue}q[q.length-1]+=_}if(Z.trim!==!1)q=q.map((z)=>$7(z));let K=q.join(`
123
+ `),G=[...K],O=0;for(let[z,_]of G.entries()){if(Y+=_,$4.has(_)){let{groups:H}=new RegExp(`(?:\\${I6}(?<code>\\d+)m|\\${e8}(?<uri>.*)${GJ})`).exec(K.slice(O))||{groups:{}};if(H.code!==void 0){let N=Number.parseFloat(H.code);X=N===t5?void 0:N}else if(H.uri!==void 0)Q=H.uri.length===0?void 0:H.uri}let W=T6.codes.get(Number(X));if(G[z+1]===`
124
+ `){if(Q)Y+=R6("");if(X&&W)Y+=C6(W)}else if(_===`
125
+ `){if(X&&W)Y+=C6(X);if(Q)Y+=R6(Q)}O+=_.length}return Y};function KJ($,J,Z){return String($).normalize().replaceAll(`\r
126
+ `,`
127
+ `).split(`
128
+ `).map((Y)=>J7(Y,J,Z)).join(`
129
+ `)}var qJ=($)=>{let J=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1");return S6(J)};var D6=($)=>{return/[*_~`<[\]https?:]/.test($)},zJ=($)=>{let Z=$.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((Y)=>Y.length>0);if(Z.length===0)return 0;return Math.max(...Z.map((Y)=>S6(Y)))},C2=($,J,Z=!1)=>{if(J<=0)return[$];let Y=$.trimEnd(),Q=KJ(Y,J,{hard:Z,trim:!1,wordWrap:!0}).split(`
130
+ `).filter((U)=>U.length>0);return Q.length>0?Q:[""]},f6=($,J,Z,Y)=>{let X=Math.max(0,Z-J);if(Y==="center"){let Q=Math.floor(X/2);return" ".repeat(Q)+$+" ".repeat(X-Q)}if(Y==="right")return" ".repeat(X)+$;return $+" ".repeat(X)};import{jsxDEV as d$,Fragment as X7}from"react/jsx-dev-runtime";var _J=2,OJ=1,NJ=2;function FJ($,J){return`inline-${$}-${J}`}var Z7=({text:$})=>{let J=V0();if(!D6($))return d$(e$,{children:$},void 0,!1,void 0,this);let Z=[],Y=0,X=0,Q=0,U=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,q;while((q=U.exec($))!==null){if(q.index>Y){let z=$.slice(Y,q.index);Z.push(d$(e$,{children:z},FJ("text",X++),!1,void 0,this))}let K=q[0],G=null,O=FJ("match",Q++);try{if(K.startsWith("**")&&K.endsWith("**")&&K.length>_J*2)G=d$(e$,{bold:!0,children:K.slice(_J,-_J)},O,!1,void 0,this);else if(K.length>OJ*2&&(K.startsWith("*")&&K.endsWith("*")||K.startsWith("_")&&K.endsWith("_"))){let z=$.substring(q.index-1,q.index),_=$.substring(U.lastIndex,U.lastIndex+1);if(!(/\w/.test(z)||/\w/.test(_)||/[./\\]/.test(z+_)))G=d$(e$,{italic:!0,children:K.slice(OJ,-OJ)},O,!1,void 0,this)}else if(K.startsWith("~~")&&K.endsWith("~~")&&K.length>NJ*2)G=d$(e$,{strikethrough:!0,children:K.slice(NJ,-NJ)},O,!1,void 0,this);else if(K.startsWith("`")&&K.endsWith("`")){let z=K.match(/^(`+)([^`]+)\1$/);if(z&&z[2])G=d$(e$,{color:J.colors.syntax.keyword,backgroundColor:J.colors.background.secondary,bold:!0,children:` ${z[2]} `},O,!1,void 0,this)}else if(K.startsWith("[")&&K.includes("](")&&K.endsWith(")")){let z=K.match(/\[(.*?)\]\((.*?)\)/);if(z){let _=z[1],W=z[2];G=d$(e$,{children:[_,d$(e$,{color:J.colors.info,children:[" (",W,")"]},void 0,!0,void 0,this)]},O,!0,void 0,this)}}else if(K.match(/^https?:\/\//))G=d$(e$,{color:J.colors.info,children:K},O,!1,void 0,this)}catch(z){console.error("InlineRenderer 解析错误:",K,z),G=null}Z.push(G??d$(e$,{children:K},O,!1,void 0,this)),Y=U.lastIndex}if(Y<$.length){let K=$.slice(Y);Z.push(d$(e$,{children:K},FJ("text",X++),!1,void 0,this))}return d$(X7,{children:Z.filter((K)=>K!==null)},void 0,!1,void 0,this)},$1=Y7.memo(Z7);import{jsxDEV as R2}from"react/jsx-dev-runtime";var U7="▎",v6=Q7.memo(({lines:$,level:J})=>{let Z=V0(),Y=U7.repeat(J);return R2(WJ,{flexDirection:"column",children:$.map((X,Q)=>{if(X.trim()==="")return R2(WJ,{height:1},Q,!1,void 0,this);return R2(WJ,{flexDirection:"row",children:[R2(V6,{dimColor:!0,color:Z.colors.text.muted,children:[Y," "]},void 0,!0,void 0,this),R2(V6,{italic:!0,wrap:"wrap",children:R2($1,{text:X},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},Q,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as Y4,Text as w1}from"ink";import{isPlainObject as BJ}from"lodash-es";import{common as H7,createLowlight as L7}from"lowlight";import{LRUCache as w7}from"lru-cache";import x6 from"react";import{Box as J4,Text as e2}from"ink";import L1,{Fragment as m6}from"react";import{LRUCache as g6}from"lru-cache";import G7 from"string-width";var K7=1024,q7=1048576,j6=1000,E6=new g6({max:K7,maxSize:q7,sizeCalculation:($,J)=>Math.max(1,J.length*2+$.length*8)});function HJ($){let J=!0;for(let Y=0;Y<$.length;Y++)if($.charCodeAt(Y)>127){J=!1;break}if(J)return $.split("");if($.length<=j6){let Y=E6.get($);if(Y)return Y}let Z=Array.from($);if($.length<=j6)E6.set($,Z);return Z}var z7=2048,_7=524288,O7=4096,h6=new g6({max:z7,maxSize:_7,sizeCalculation:($,J)=>Math.max(1,J.length*2+8)});function H1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let J=h6.get($);if(J!==void 0)return J;let Z=G7($);if($.length<=O7)h6.set($,Z);return Z}import{jsxDEV as I2}from"react/jsx-dev-runtime";var LJ=2,p6=L1.memo(({children:$,maxWidth:J,maxHeight:Z,overflowDirection:Y="top",additionalHiddenLinesCount:X=0})=>{let Q=V0(),U=[],q=Math.max(Math.round(Z??Number.MAX_SAFE_INTEGER),LJ);function K(N){if(!L1.isValidElement(N))return;if(N.type===m6){L1.Children.forEach(N.props.children,K);return}if(N.type===J4){F7(N,J,U);return}}L1.Children.forEach($,K);let O=U.length>q||X>0?q-1:q,z=O!==void 0?Math.max(0,U.length-O):0,_=z+X,H=(z>0?Y==="top"?U.slice(z):U.slice(0,O):U).map((N,w)=>I2(J4,{children:N.length>0?N.map((y,T)=>I2(e2,{...y.props,children:y.text},T,!1,void 0,this)):I2(e2,{children:" "},void 0,!1,void 0,this)},w,!1,void 0,this));return I2(J4,{flexDirection:"column",width:J,flexShrink:0,children:[_>0&&Y==="top"&&I2(e2,{color:Q.colors.text.muted,dimColor:!0,children:["... ",_," line",_===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),H,_>0&&Y==="bottom"&&I2(e2,{color:Q.colors.text.muted,dimColor:!0,children:["... ",_," line",_===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function N7($){if(!L1.isValidElement($)||$.type!==J4)return{noWrapSegments:[],segments:[]};let J={noWrapSegments:[],segments:[]},Z=!1;function Y(X,Q){if(X===null||X===void 0)return;if(typeof X==="string"||typeof X==="number"){let G=String(X);if(!G)return;let O={text:G,props:Q??{}};if(Q===void 0||Q.wrap==="wrap")Z=!0,J.segments.push(O);else if(!Z)J.noWrapSegments.push(O);else J.segments.push(O);return}if(!L1.isValidElement(X))return;if(X.type===m6){L1.Children.forEach(X.props.children,(G)=>Y(G,Q));return}if(X.type!==e2)return;let{children:U,...q}=X.props,K=Q===void 0?q:{...Q,...q};L1.Children.forEach(U,(G)=>Y(G,K))}return L1.Children.forEach($.props.children,(X)=>Y(X,void 0)),J}function F7($,J,Z){let Y=N7($);if(Y.segments.length===0&&Y.noWrapSegments.length===0){Z.push([]);return}let X=0;for(let z of Y.noWrapSegments)X+=H1(z.text);if(Y.segments.length===0){let z=[],_=[];for(let W of Y.noWrapSegments){let H=W.text.split(`
131
+ `);for(let N=0;N<H.length;N++){if(N>0)z.push(_),_=[];if(H[N])_.push({text:H[N],props:W.props})}}if(_.length>0)z.push(_);for(let W of z)Z.push(W);return}let Q=J-X;if(Q<1){W7(Y.noWrapSegments,J,Z);return}let U=[],q=[],K=0;function G(){if(U.length===0)U.push([...Y.noWrapSegments,...q]);else if(X>0)U.push([{text:" ".repeat(X),props:{}},...q]);else U.push(q);q=[],K=0}function O(z,_){if(q.length>0&&q[q.length-1].props===_)q[q.length-1].text+=z;else q.push({text:z,props:_})}for(let z of Y.segments){let _=z.text.split(`
132
+ `);for(let W=0;W<_.length;W++){if(W>0)G();let N=_[W].split(/(\s+)/);for(let w of N){if(!w)continue;let y=H1(w);if(K+y>Q&&K>0){if(G(),/^\s+$/.test(w))continue}if(y>Q){let B=HJ(w);while(B.length>0){let C=0,F=0;for(let L of B){let A=H1(L);if(K+F+A>Q)break;F+=A,C++}if(C>0){let L=B.slice(0,C).join("");O(L,z.props),K+=H1(L),B=B.slice(C)}if(B.length>0)G()}}else O(w,z.props),K+=y}}if(z.text.endsWith(`
133
+ `))G()}if(q.length>0)G();for(let z of U)Z.push(z)}function W7($,J,Z){let Y=[],X=[],Q=0;for(let U of $){let q=U.text.split(`
134
+ `);for(let K=0;K<q.length;K++){if(K>0)Y.push(X),X=[],Q=0;let G=q[K];if(!G)continue;let O=H1(G),z=Math.max(0,J-H1("…"));if(O<=z&&Q===0)X.push({text:G,props:U.props}),Q+=O;else{let _=HJ(G),W=Q,H=0;for(let w of _){let y=H1(w);if(W+y>z)break;W+=y,H++}let N=_.slice(0,H).join("");if(N)X.push({text:N,props:U.props});X.push({text:"…",props:{}}),Q=W+H1("…")}}}if(X.length>0)Y.push(X);if(Y.length===0)Y.push([{text:"…",props:{}}]);for(let U of Y)Z.push(U)}import{jsxDEV as D$}from"react/jsx-dev-runtime";var wJ=L7(H7),B7=200,A7=524288,P7=4096,u6=new w7({max:B7,maxSize:A7,sizeCalculation:($)=>$.retainedChars});function c6($,J){return`${J??"__auto__"}\x00${$}`}function b7($,J){return u6.get(c6($,J))?.root}function M7($,J,Z){if($.length>P7)return;let Y=J?.length??0;u6.set(c6($,J),{root:Z,retainedChars:Math.max(1,$.length*2+Y)})}function y7($){return BJ($)&&$.type==="text"&&typeof $.value==="string"}function T7($){return BJ($)&&$.type==="element"}function C7($){return BJ($)&&$.type==="root"&&Array.isArray($.children)}function Z4($,J,Z=0){if(y7($))return D$(w1,{wrap:"wrap",children:$.value},Z,!1,void 0,this);if(T7($)){let Y=$.properties?.className?.[0]||"",X=J.default;if(Y.includes("comment"))X=J.comment;else if(Y.includes("string"))X=J.string;else if(Y.includes("number"))X=J.number;else if(Y.includes("keyword"))X=J.keyword;else if(Y.includes("function"))X=J.function;else if(Y.includes("variable"))X=J.variable;else if(Y.includes("operator"))X=J.operator;else if(Y.includes("type"))X=J.type;else if(Y.includes("tag"))X=J.tag;else if(Y.includes("attr"))X=J.attr;let Q=$.children?.map((U,q)=>Z4(U,J,q));return D$(w1,{color:X,wrap:"wrap",children:Q},Z,!1,void 0,this)}if(C7($))return D$(x6.Fragment,{children:$.children.map((Y,X)=>Z4(Y,J,X))},Z,!1,void 0,this);return D$(w1,{},Z,!1,void 0,this)}function R7($,J,Z){let Y=Z||W$.getTheme().colors.syntax;try{let X=b7($,J);if(X)return Z4(X,Y);let Q;if(!J||!wJ.registered(J))Q=wJ.highlightAuto($);else Q=wJ.highlight(J,$);let U=Q;if(!U.children||U.children.length===0)return D$(w1,{color:Y.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return M7($,J,Q),Z4(Q,Y)}catch(X){return D$(w1,{color:Y.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var X4=x6.memo(({content:$,language:J,showLineNumbers:Z=!0,terminalWidth:Y,availableHeight:X})=>{let Q=V0(),U=$.split(`
135
+ `),q=0;if(X&&U.length>X){let z=Math.max(X,LJ);if(U.length>z)q=U.length-z,U=U.slice(q)}let K=U.length+q,G=String(K).length+1,O=Math.max(20,Y-4);return D$(Y4,{borderStyle:"round",borderColor:Q.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[J&&D$(Y4,{marginBottom:0,children:D$(w1,{color:Q.colors.text.secondary,children:J},void 0,!1,void 0,this)},void 0,!1,void 0,this),q>0&&D$(Y4,{marginBottom:0,children:D$(w1,{color:Q.colors.text.muted,dimColor:!0,children:["... ",q," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D$(p6,{maxWidth:O,maxHeight:X,children:U.map((z,_)=>{let W=_+q+1;return D$(Y4,{flexDirection:"row",children:[Z&&D$(w1,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(W).padStart(G-1," ")," "]},void 0,!0,void 0,this),z.trim()===""?D$(w1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):R7(z,J,Q.colors.syntax)]},_,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as d6,Text as h$}from"ink";import I7,{useState as k7}from"react";import{jsxDEV as f$}from"react/jsx-dev-runtime";var l6=400;function S7($){let J=$.split(`
136
+ `),Z=[],Y=0,X=0;for(let Q of J){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let U=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(U)Y=parseInt(U[1],10),X=parseInt(U[3],10);Z.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Z.push({type:"remove",content:Q.substring(1),lineNumber:Y}),Y++;continue}if(Q.startsWith("+")){Z.push({type:"add",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith(" ")||Q===""){Z.push({type:"context",content:Q.substring(1),lineNumber:X}),Y++,X++;continue}}return Z}var AJ=I7.memo(({patch:$,startLine:J,matchLine:Z,terminalWidth:Y,maxLines:X=20,isFocused:Q=!1})=>{let U=V0(),q=S7($),[K,G]=k7(!1);w0((T)=>{if(T.toLowerCase()==="e")G((B)=>!B)},{isActive:Q&&q.length>X});let z=Math.max(...q.map((T)=>T.lineNumber||0)).toString().length+1,_=q.filter((T)=>T.type==="add").length,W=q.filter((T)=>T.type==="remove").length,H=q.length,N=H>X,w;if(!N)w=q;else if(K)w=q.slice(0,l6);else w=q.slice(0,X);let y=H-w.length;return f$(d6,{flexDirection:"column",marginTop:1,marginBottom:1,children:[f$(h$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this),N&&f$(h$,{color:U.colors.info,children:[K?`已展开 ${w.length}/${H} 行`:`显示前 ${X} 行,共 ${H} 行`," · ",f$(h$,{color:U.colors.success,children:["+",_]},void 0,!0,void 0,this)," ",f$(h$,{color:U.colors.error,children:["-",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N&&f$(h$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this),w.map((T,B)=>{if(T.type==="header")return f$(h$,{color:U.colors.muted,dimColor:!0,children:T.content},B,!1,void 0,this);let C=T.lineNumber?T.lineNumber.toString().padStart(z," "):" ".repeat(z),F=" ",L,A;if(T.type==="add")F="+",A=U.colors.success,L=void 0;else if(T.type==="remove")F="-",A=U.colors.error,L=void 0;else A=U.colors.text.primary;let R=Math.max(0,Y-z-2),S=T.content;if(S.length>R)S=S.substring(0,R-3)+"...";return f$(h$,{color:A,backgroundColor:L,children:[f$(h$,{dimColor:!0,children:C},void 0,!1,void 0,this),f$(h$,{children:F},void 0,!1,void 0,this),f$(h$,{children:[" ",S]},void 0,!0,void 0,this)]},B,!0,void 0,this)}),N&&f$(d6,{marginTop:1,children:K?f$(h$,{color:U.colors.info,dimColor:!0,children:[y>0?`已达显示上限 ${l6} 行,仍有 ${y} 行未显示`:"已显示全部内容",Q?" · 按 E 折叠":""]},void 0,!0,void 0,this):f$(h$,{color:U.colors.info,dimColor:!0,children:["已隐藏剩余 ",y," 行",Q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),f$(h$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as PJ,Text as r6}from"ink";import D7 from"react";import{jsxDEV as k2}from"react/jsx-dev-runtime";var f7=({itemText:$,type:J,marker:Z,leadingWhitespace:Y=""})=>{let X=J==="ol"?`${Z}. `:`${Z} `,Q=X.length,U=Y.length;return k2(PJ,{paddingLeft:U+1,flexDirection:"row",children:[k2(PJ,{width:Q,children:k2(r6,{children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),k2(PJ,{flexGrow:1,children:k2(r6,{wrap:"wrap",children:k2($1,{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)},bJ=D7.memo(f7);import{Text as MJ}from"ink";import V7,{useMemo as v7}from"react";import a6 from"string-width";import{jsxDEV as yJ}from"react/jsx-dev-runtime";var i6=4,S2=3,j7=4,o6=V7.memo(({headers:$,rows:J,terminalWidth:Z})=>{let Y=V0(),X=v7(()=>{if($.length===0||J.length===0)return null;let z=$.length,_=$.map((A,R)=>{let S=Math.max(zJ(A),S2);for(let M of J)S=Math.max(S,zJ(M[R]||""));return S}),W=$.map((A,R)=>{let S=Math.max(qJ(A),S2);for(let M of J)S=Math.max(S,qJ(M[R]||""));return S}),H=1+z*3,N=Math.max(Z-H-i6,z*S2),w=_.reduce((A,R)=>A+R,0),y=W.reduce((A,R)=>A+R,0),T=!1,B;if(y<=N)B=W;else if(w<=N){let A=N-w,R=W.map((M,k)=>M-_[k]),S=R.reduce((M,k)=>M+k,0);B=_.map((M,k)=>{if(S===0)return M;let P=Math.floor(R[k]/S*A);return M+P})}else{T=!0;let A=N/w;B=_.map((R)=>Math.max(Math.floor(R*A),S2))}function C(){let A=1;for(let R=0;R<$.length;R++){let S=C2($[R],B[R],T);A=Math.max(A,S.length)}for(let R of J)for(let S=0;S<R.length;S++){let M=C2(R[S]||"",B[S],T);A=Math.max(A,M.length)}return A}if(C()>j7)return{type:"vertical",columnWidths:B,needsHardWrap:T};return{type:"horizontal",columnWidths:B,needsHardWrap:T}},[$,J,Z]);if(!X)return null;if(X.type==="vertical"){let z=Math.min(Z-1,40),_="─".repeat(z);return yJ(MJ,{children:J.map((W,H)=>{let N=[];if(H>0)N.push(_);return W.forEach((w,y)=>{let T=$[y]||`Column ${y+1}`,B=(w||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${T}:\x1B[22m ${B}`)}),N.join(`
137
+ `)}).join(`
138
+ `)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:U}=X;function q(z){let W={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[z],H=W.left;return Q.forEach((N,w)=>{H+=W.h.repeat(N+2),H+=w<Q.length-1?W.mid:W.right}),H}function K(z,_){let W=z.map((y,T)=>{let B=Q[T]||S2;return C2(y||"",B,U)}),H=Math.max(...W.map((y)=>y.length),1),N=W.map((y)=>Math.floor((H-y.length)/2)),w=[];for(let y=0;y<H;y++){let T="│";for(let B=0;B<z.length;B++){let C=W[B],F=N[B],L=y-F,A=L>=0&&L<C.length?C[L]:"",R=Q[B]||S2,S=a6(A),M=f6(_?`\x1B[1m${A}\x1B[22m`:A,S,R,_?"center":"left");T+=` ${M} │`}w.push(T)}return w}let G=[];if(G.push(q("top")),G.push(...K($,!0)),G.push(q("middle")),J.forEach((z,_)=>{if(G.push(...K(z,!1)),_<J.length-1)G.push(q("middle"))}),G.push(q("bottom")),Math.max(...G.map((z)=>a6(z)))>Z-i6){let z=Math.min(Z-1,40),_="─".repeat(z);return yJ(MJ,{children:J.map((W,H)=>{let N=[];if(H>0)N.push(_);return W.forEach((w,y)=>{let T=$[y]||`Column ${y+1}`,B=(w||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${T}:\x1B[22m ${B}`)}),N.join(`
139
+ `)}).join(`
140
+ `)},void 0,!1,void 0,this)}return yJ(MJ,{color:Y.colors.text.primary,children:G.join(`
141
+ `)},void 0,!1,void 0,this)});import{jsxDEV as d}from"react/jsx-dev-runtime";var E7=($,J,Z)=>{switch($){case"user":return{color:J.info,prefix:"> "};case"assistant":return{color:J.success,prefix:"• "};case"system":return{color:J.warning,prefix:" "};case"tool":{let Y=Z&&"phase"in Z?Z.phase:void 0;return{color:J.text.secondary,prefix:Y==="start"?"• ":Y==="complete"?" └ ":" "}}default:return{color:J.text.primary,prefix:" "}}},h7=s1.memo(({content:$,language:J,terminalWidth:Z,isPending:Y=!1,availableHeight:X})=>{let Q=V0();if(Y&&X!==void 0){let U=$.split(`
142
+ `),q=4,K=Math.max(1,X-4);if(U.length>K){let G=U.slice(0,K).join(`
143
+ `);return d(k0,{flexDirection:"column",flexShrink:0,children:[d(X4,{content:G,language:J,showLineNumbers:!0,terminalWidth:Z},void 0,!1,void 0,this),d(c0,{color:Q.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return d(X4,{content:$,language:J,showLineNumbers:!0,terminalWidth:Z},void 0,!1,void 0,this)}),g7=s1.memo(({content:$,level:J})=>{let Z=V0();switch(J){case 1:return d(c0,{bold:!0,color:Z.colors.primary,children:d($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return d(c0,{bold:!0,color:Z.colors.primary,children:d($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return d(c0,{bold:!0,color:Z.colors.text.primary,children:d($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return d(c0,{italic:!0,color:Z.colors.text.muted,children:d($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return d(c0,{children:d($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),m7=s1.memo(({terminalWidth:$})=>{let J=V0(),Z=Math.max(0,Math.min($-4,80));return d(c0,{dimColor:!0,color:J.colors.text.muted,children:"─".repeat(Z)},void 0,!1,void 0,this)}),p7=s1.memo(({content:$})=>{return d(c0,{wrap:"wrap",children:d($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),x7=s1.memo(({content:$})=>{let J=V0();return d(k0,{flexDirection:"row",gap:1,children:[d(c0,{color:J.colors.info,children:" "},void 0,!1,void 0,this),d(c0,{color:J.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),u7=s1.memo(({detail:$,terminalWidth:J})=>{let Z=V0(),Y=50,X=$.split(`
144
+ `);while(X.length>0&&X[0].trim()==="")X.shift();while(X.length>0&&X[X.length-1].trim()==="")X.pop();let Q=X.length>50,U=Q?X.slice(0,50):X,q=U.join(`
145
+ `),K=q.includes("<<<DIFF>>>"),G=q.includes("```");if(K){let O=q.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(O)try{let z=JSON.parse(O[1]);return d(k0,{flexDirection:"column",children:[d(AJ,{patch:z.patch,startLine:z.startLine,matchLine:z.matchLine,terminalWidth:J},void 0,!1,void 0,this),Q&&d(k0,{marginTop:1,children:d(c0,{dimColor:!0,color:Z.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(G){let O=q.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(O){let z=O[1]||"text",_=O[2];return d(k0,{flexDirection:"column",children:[d(X4,{content:_,language:z,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&d(k0,{marginTop:1,children:d(c0,{dimColor:!0,color:Z.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return d(k0,{flexDirection:"column",children:[U.map((O,z)=>d(c0,{color:Z.colors.text.primary,children:O},z,!1,void 0,this)),Q&&d(k0,{marginTop:1,children:d(c0,{dimColor:!0,color:Z.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function c7($,J,Z,Y=80){if(!Z||J===void 0||J<=0)return{content:$,isTruncated:!1,hiddenLines:0};let Q=Math.max(1,J-8),U=Math.max(40,Y*0.8),q=Q*U;if($.length<=q)return{content:$,isTruncated:!1,hiddenLines:0};let K=Math.floor(q*0.9),G=$.length-K,O=G,z=$.indexOf(`
146
+ `,G);if(z!==-1&&z-G<U)O=z+1;let _=$.slice(O),H=($.slice(0,O).match(/\n/g)||[]).length+1;return{content:_,isTruncated:!0,hiddenLines:H}}var G1=s1.memo(({content:$,role:J,terminalWidth:Z,metadata:Y,isPending:X=!1,availableTerminalHeight:Q,hidePrefix:U=!1,noMargin:q=!1,renderPlainTextOnly:K=!1,streamingLines:G,streamingHiddenLines:O,messageId:z,blocksOverride:_,currentLineOverride:W,streamingMode:H="text",renderCodeBlocksAsPlainText:N=!1})=>{let w=V0(),y=_!==void 0,T=t1(()=>E7(J,w.colors,Y),[J,w.colors,Y]),{color:B,prefix:C}=T,F=C.length+1,L=t1(()=>{if(!Y||typeof Y!=="object")return null;if(!("subtaskRef"in Y))return null;let v=Y.subtaskRef;if(!v||typeof v!=="object")return null;return v},[Y]),A=J==="tool"&&Y?.phase==="start",R=!q&&!A,S=t1(()=>{if(!K)return[];return $.split(/\r?\n/)},[$,K]);if(!y&&X){let v=G??$.split(/\r?\n/),g=O??0,s=!1,U0=!1,V=!1;if(H!=="text")s=H==="code",U0=H==="diff",V=H==="table";return d(k0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:[g>0&&d(k0,{flexDirection:"row",flexShrink:0,children:[d(k0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(c0,{color:w.colors.text.muted,dimColor:!0,children:["^ ",g," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),v.map((Z0,n)=>{if(H==="text"){if(Z0.match(v1.codeBlock))s=!s;else if(Z0.match(v1.diffStart))U0=!0;else if(Z0.match(v1.diffEnd))U0=!1;else if(Z0.match(v1.table))V=!0;else if(V&&!Z0.match(v1.table))V=!1}let b=H==="text"&&!s&&!U0&&!V,I=b?Z0.match(v1.ulItem):null,j=b?Z0.match(v1.olItem):null,p=I??j;return d(k0,{flexDirection:"row",flexShrink:0,children:[n===0&&!U?d(k0,{marginRight:1,flexShrink:0,children:d(c0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):d(k0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(k0,{flexGrow:1,flexShrink:0,children:p?d(bJ,{type:I?"ul":"ol",marker:p[2],itemText:p[3],leadingWhitespace:p[1]},void 0,!1,void 0,this):d(c0,{wrap:"wrap",children:Z0===""?" ":Z0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},n,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!y&&K)return d(k0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:S.map((v,g)=>d(k0,{flexDirection:"row",flexShrink:0,children:[g===0&&!U?d(k0,{marginRight:1,flexShrink:0,children:d(c0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):d(k0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(k0,{flexGrow:1,flexShrink:0,children:d(c0,{wrap:"wrap",children:v===""?" ":v},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},g,!0,void 0,this))},void 0,!1,void 0,this);let M=n6(null);TJ(()=>{M.current=null},[z]);let k=t1(()=>{if(y)return null;if(!z)return null;return t6(z)},[z,y]);TJ(()=>{if(y)return;if(!k||!z)return;M.current={messageId:z,blocks:k}},[k,z,y]),TJ(()=>{if(y)return;if(!k||!z)return;s6(z)},[k,z,y]);let P=t1(()=>y?{content:$,isTruncated:!1,hiddenLines:0}:c7($,Q,X,Z),[$,Q,X,Z,y]),{content:D,isTruncated:e,hiddenLines:$0}=P;if(!y&&J==="tool"&&Y&&"detail"in Y){let v=Y;if(v.detail)return d(k0,{flexDirection:"column",marginBottom:q?0:1,children:[d(k0,{flexDirection:"row",children:[d(k0,{marginRight:1,children:d(c0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(c0,{color:B,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),d(k0,{marginLeft:C.length+1,children:d(u7,{detail:v.detail,terminalWidth:Z-(C.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:m,currentLine:S0}=t1(()=>{if(y)return{completedContent:"",currentLine:W??""};if(!X)return{completedContent:D,currentLine:""};let v=D.lastIndexOf(`
147
+ `);if(v===-1)return{completedContent:"",currentLine:D};return{completedContent:D.slice(0,v+1),currentLine:D.slice(v+1)}},[D,X,y,W]),o=n6({content:"",blocks:[]}),f=t1(()=>{if(y)return _??[];if(k)return k;if(M.current&&M.current.messageId===z)return M.current.blocks;let v=o.current;if(!X||!m.startsWith(v.content)){let V=CJ(m);return o.current={content:m,blocks:V},V}if(m===v.content)return v.blocks;let g=m.slice(v.content.length),s=CJ(g),U0=[...v.blocks,...s];return o.current={content:m,blocks:U0},U0},[m,X,y,_]);return d(k0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:[e&&d(k0,{flexDirection:"row",flexShrink:0,children:[d(k0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(c0,{color:w.colors.text.muted,dimColor:!0,children:["^ ",$0," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),f.map((v,g)=>{if(v.type==="empty")return d(k0,{height:1,flexShrink:0},g,!1,void 0,this);return d(k0,{flexDirection:"row",flexShrink:0,children:[g===0&&!U&&d(k0,{marginRight:1,flexShrink:0,children:d(c0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),(g>0||U)&&d(k0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(k0,{flexGrow:1,flexShrink:0,children:v.type==="code"?N?d(c0,{wrap:"wrap",children:v.content},void 0,!1,void 0,this):d(h7,{content:v.content,language:v.language,terminalWidth:Z-F,isPending:X,availableHeight:Q},void 0,!1,void 0,this):v.type==="table"&&v.tableData?d(o6,{headers:v.tableData.headers,rows:v.tableData.rows,terminalWidth:Z-F},void 0,!1,void 0,this):v.type==="heading"?d(g7,{content:v.content,level:v.level||1},void 0,!1,void 0,this):v.type==="list"?d(bJ,{type:v.listType||"ul",marker:v.marker||"-",itemText:v.content,leadingWhitespace:" ".repeat(v.indentation||0)},void 0,!1,void 0,this):v.type==="hr"?d(m7,{terminalWidth:Z-F},void 0,!1,void 0,this):v.type==="diff"&&v.diffData?d(AJ,{patch:v.diffData.patch,startLine:v.diffData.startLine,matchLine:v.diffData.matchLine,terminalWidth:Z-F},void 0,!1,void 0,this):v.type==="command-message"?d(x7,{content:v.content},void 0,!1,void 0,this):v.type==="blockquote"&&v.blockquoteLines?d(v6,{lines:v.blockquoteLines,level:v.blockquoteLevel||1},void 0,!1,void 0,this):d(p7,{content:v.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},g,!0,void 0,this)}),S0&&d(k0,{flexDirection:"row",flexShrink:0,children:[f.length===0&&!U?d(k0,{marginRight:1,flexShrink:0,children:d(c0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):d(k0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(k0,{flexGrow:1,flexShrink:0,children:d(c0,{wrap:"wrap",children:S0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L&&d(k0,{flexDirection:"row",flexShrink:0,children:[d(k0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(k0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[d(c0,{color:w.colors.text.muted,children:["Subtask"," ",typeof L.agentType==="string"?`@${L.agentType}`:"",typeof L.status==="string"?` · ${L.status}`:""]},void 0,!0,void 0,this),typeof L.summary==="string"&&L.summary.trim()!==""&&d(c0,{wrap:"wrap",children:L.summary},void 0,!1,void 0,this),typeof L.childSessionId==="string"&&d(c0,{color:w.colors.text.muted,children:["Session ",L.childSessionId]},void 0,!0,void 0,this),typeof L.resumedFrom==="string"&&d(c0,{color:w.colors.text.muted,children:["Resumed from ",L.resumedFrom,typeof L.resumeDepth==="number"?` · depth ${L.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)},($,J)=>{return $.content===J.content&&$.role===J.role&&$.terminalWidth===J.terminalWidth&&$.isPending===J.isPending&&$.availableTerminalHeight===J.availableTerminalHeight&&$.hidePrefix===J.hidePrefix&&$.noMargin===J.noMargin&&$.renderPlainTextOnly===J.renderPlainTextOnly&&$.streamingHiddenLines===J.streamingHiddenLines&&$.streamingLines===J.streamingLines&&$.messageId===J.messageId&&$.metadata===J.metadata&&$.blocksOverride===J.blocksOverride&&$.currentLineOverride===J.currentLineOverride&&$.streamingMode===J.streamingMode&&$.renderCodeBlocksAsPlainText===J.renderCodeBlocksAsPlainText});import{jsxDEV as n0,Fragment as o7}from"react/jsx-dev-runtime";var r7=RJ.memo(({label:$,isSelected:J})=>n0(K1,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),a7=RJ.memo(({details:$,headerColor:J,isPlanModeExit:Z,isPlanModeEnter:Y,terminalWidth:X})=>n0(o7,{children:[n0(l$,{marginBottom:1,children:n0(K1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&n0(l$,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:J,padding:1,children:[n0(K1,{bold:!0,color:J,children:"实施方案"},void 0,!1,void 0,this),n0(l$,{marginTop:1,children:n0(G1,{content:$.planContent,role:"assistant",terminalWidth:X-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&n0(l$,{flexDirection:"column",marginBottom:1,children:n0(G1,{content:$.details,role:"assistant",terminalWidth:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&n0(l$,{flexDirection:"column",marginBottom:1,children:[n0(K1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,U)=>n0(l$,{marginLeft:2,children:n0(K1,{color:"red",children:["• ",Q]},void 0,!0,void 0,this)},U,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&n0(l$,{flexDirection:"column",marginBottom:1,children:[n0(K1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,U)=>n0(l$,{marginLeft:2,children:n0(K1,{children:["• ",Q]},void 0,!0,void 0,this)},U,!1,void 0,this)),$.affectedFiles.length>3&&n0(l$,{marginLeft:2,children:n0(K1,{color:"gray",children:["...还有 ",$.affectedFiles.length-3," 个文件"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this));function i7($,J,Z,Y){return`使用 ↑↓ 选择,回车确认 · ${J||Z||Y?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var $3=RJ.memo(({details:$,onResponse:J})=>{let{stdout:Z}=d7(),Y=Z.columns||80,Q=X$()==="confirmation-prompt",U=s0(!1),q=$.type==="exitPlanMode",K=$.type==="enterPlanMode",G=$.type==="maxTurnsExceeded",O=$.type==="mcpSampling";w0((W,H)=>{if(H.ctrl&&W==="c"||H.meta&&W==="c"){U();return}if(H.escape){J({approved:!1,reason:"用户取消"});return}let N=W.toLowerCase();if(q){if(N==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(N==="s"){J({approved:!0,targetMode:"default"});return}if(N==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(K){if(N==="y"){J({approved:!0});return}if(N==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(G){if(N==="y"){J({approved:!0});return}if(N==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(O){if(N==="y"){J({approved:!0,scope:"once"});return}if(N==="n"){J({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(N==="y"){J({approved:!0,scope:"once"});return}if(N==="s"){J({approved:!0,scope:"session"});return}if(N==="p"){J({approved:!0,scope:"project"});return}if(N==="n"){J({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let z=e6(()=>{if(q)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(K)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(G)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(O)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(本次会话)",value:{approved:!0,scope:"session"}},{key:"approve-project",label:"[P] 允许并记住(本项目)",value:{approved:!0,scope:"project"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[q,K,G,O]),_=e6(()=>{if(q)return{color:"cyan",title:"方案审核"};if(K)return{color:"magenta",title:"进入规划模式"};if(G)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[q,K,G,$.title]);return n0(l$,{flexDirection:"column",borderStyle:"round",borderColor:Q?_.color:"gray",padding:1,children:[n0(l$,{marginBottom:1,children:n0(K1,{bold:!0,color:_.color,children:_.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(a7,{details:$,headerColor:_.color,isPlanModeExit:q,isPlanModeEnter:K,terminalWidth:Y},void 0,!1,void 0,this),n0(l$,{flexDirection:"column",children:[n0(K1,{color:"gray",children:i7(q,K,G,O)},void 0,!1,void 0,this),n0(l7,{items:z,isFocused:Q,itemComponent:r7,onSelect:(W)=>{J(W.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as h0,Text as T0}from"ink";import J3 from"ink-text-input";import{useState as B1}from"react";import{jsxDEV as r}from"react/jsx-dev-runtime";var $8=[{action:"add",description:"Add a new hook"},{action:"status",description:"Show hooks status"},{action:"list",description:"List all configured hooks"},{action:"enable",description:"Enable hooks for this session"},{action:"disable",description:"Disable hooks for this session"},{action:"trust",description:"Trust the current project hook digest"},{action:"revoke",description:"Revoke project hook trust"}],Q4=[{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"}],U4=[{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"}],n7=[`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"],Y3=({workspaceRoot:$,sessionId:J,onClose:Z,onSave:Y})=>{let X=W$.getTheme(),[Q,U]=B1("action"),[q,K]=B1(0),[G,O]=B1(0),[z,_]=B1(0),[W,H]=B1(""),[N,w]=B1(""),[y,T]=B1(null),[B,C]=B1(!1),[F,L]=B1(null),A=$8[q],R=U4[G],S=Q4[z],M=()=>{if(F){L(null);return}switch(Q){case"action":Z();break;case"event":U("action");break;case"matcher":U("event");break;case"command":U("matcher");break;case"location":U("command");break;case"confirm":U("location");break}};w0((f,v)=>{if(v.escape){M();return}if(Q==="action"){if(v.upArrow)K((g)=>g>0?g-1:$8.length-1);else if(v.downArrow)K((g)=>g<$8.length-1?g+1:0);else if(v.return)k()}else if(Q==="event"){if(v.upArrow)O((g)=>g>0?g-1:U4.length-1);else if(v.downArrow)O((g)=>g<U4.length-1?g+1:0);else if(v.return)U("matcher")}else if(Q==="location"){if(v.upArrow)_((g)=>g>0?g-1:Q4.length-1);else if(v.downArrow)_((g)=>g<Q4.length-1?g+1:0);else if(v.return)U("confirm")}else if(Q==="confirm"){if(v.return)o()}});let k=()=>{let f=$8[q].action;if(f==="add")U("event");else if(f==="status")P();else if(f==="list")$0();else if(f==="enable")j$.getInstance().enableSession(J,$),L("Hooks enabled for this session");else if(f==="disable")j$.getInstance().disableSession(J,$),L("Hooks disabled for this session");else if(f==="trust")D();else if(f==="revoke")e()},P=async()=>{let f=j$.getInstance(),v=f.isEnabled($,J),g=f.getConfig($),s=await f.getTrustStatus($),U0={};for(let Z0 of Object.values(kJ)){let n=g[Z0];if(n&&Array.isArray(n)){let b=n.reduce((I,j)=>I+(j.hooks?.length||0),0);if(b>0)U0[Z0]=b}}let V=[`Status: ${v?"Enabled":"Disabled"}`,`Trust: ${s.state}`,`Digest: ${s.currentDigest??"none"}`,""];if(Object.keys(U0).length>0){V.push("Configured hooks:");for(let[Z0,n]of Object.entries(U0))V.push(` ${Z0}: ${n} hook(s)`)}else V.push("No hooks configured");L(V.join(`
148
+ `))},D=async()=>{try{let f=await j$.getInstance().trustProject($);L(`Trust: ${f.state}
149
+ Digest: ${f.currentDigest??"none"}`)}catch(f){T(f instanceof Error?f.message:"Failed to trust hooks")}},e=async()=>{try{let f=await j$.getInstance().revokeProjectTrust($);L(`Trust: ${f.state}`)}catch(f){T(f instanceof Error?f.message:"Failed to revoke hook trust")}},$0=()=>{let v=j$.getInstance().getConfig($),g=[],s=!1;for(let U0 of Object.values(kJ)){let V=v[U0];if(!V||!Array.isArray(V)||V.length===0)continue;s=!0,g.push(`${U0}:`);for(let Z0 of V){let n=Z0.matcher,b="all";if(n?.tools)b=`tools: ${Array.isArray(n.tools)?n.tools.join(", "):n.tools}`;g.push(` [${b}]`);for(let I of Z0.hooks||[])if(I.type==="command")g.push(` -> ${I.command}`)}g.push("")}if(!s)g.push("No hooks configured"),g.push(""),g.push("Configure hooks in .blade/settings.local.json");L(g.join(`
150
+ `))},m=()=>{U("command")},S0=()=>{if(!N.trim()){T("Command cannot be empty");return}T(null),U("location")},o=async()=>{C(!0),T(null);try{let f=j$.getInstance(),v=await import("node:fs/promises"),g=await import("node:path"),s=await import("node:os"),U0={matcher:W.trim()?{tools:W.trim()}:{},hooks:[{type:"command",command:N.trim()}]},V;switch(S.location){case"local":V=g.join($,".blade","settings.local.json");break;case"project":V=g.join($,".blade","settings.json");break;case"user":V=g.join(s.homedir(),".blade","settings.json");break}await v.mkdir(g.dirname(V),{recursive:!0});let Z0={};try{let j=await v.readFile(V,"utf-8");Z0=JSON.parse(j)}catch{}let n=Z0.hooks||{},b=n[R.event]||[],I={...n,enabled:!0,[R.event]:[...b,U0]};if(Z0.hooks=I,await v.writeFile(V,JSON.stringify(Z0,null,2),"utf-8"),await f.reloadConfig($),Y)Y({event:R.event,matcher:W.trim(),command:N.trim()});Z()}catch(f){T(`Failed to save hook: ${f instanceof Error?f.message:"Unknown error"}`),C(!1)}};return r(h0,{flexDirection:"column",padding:1,children:[r(h0,{marginBottom:1,children:r(T0,{bold:!0,color:X.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),r(h0,{marginBottom:1,children:r(T0,{color:X.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),F&&r(h0,{flexDirection:"column",marginBottom:1,children:[r(T0,{children:F},void 0,!1,void 0,this),r(h0,{marginTop:1,children:r(T0,{color:X.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),Q==="action"&&!F&&r(h0,{flexDirection:"column",children:[r(h0,{flexDirection:"column",marginTop:1,children:$8.map((f,v)=>r(h0,{children:[r(T0,{color:v===q?X.colors.primary:void 0,bold:v===q,children:[v===q?"> ":" ",f.action]},void 0,!0,void 0,this),r(T0,{color:X.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.action,!0,void 0,this))},void 0,!1,void 0,this),r(h0,{marginTop:1,children:r(T0,{color:X.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),Q==="event"&&r(h0,{flexDirection:"column",children:[r(T0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),r(h0,{flexDirection:"column",marginTop:1,children:U4.map((f,v)=>r(h0,{children:[r(T0,{color:v===G?X.colors.primary:void 0,bold:v===G,children:[v===G?"> ":" ",f.event]},void 0,!0,void 0,this),r(T0,{color:X.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.event,!0,void 0,this))},void 0,!1,void 0,this),r(h0,{marginTop:1,children:r(T0,{color:X.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),Q!=="event"&&r(h0,{marginBottom:1,children:r(T0,{children:["Event:"," ",r(T0,{bold:!0,color:X.colors.primary,children:R.event},void 0,!1,void 0,this),r(T0,{color:X.colors.muted,children:[" - ",R.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(Q==="matcher"||Q==="command"||Q==="confirm")&&r(h0,{flexDirection:"column",marginBottom:1,children:[r(T0,{color:X.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),r(T0,{color:X.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),r(T0,{color:X.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),r(T0,{color:X.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),Q==="matcher"&&r(h0,{flexDirection:"column",children:[r(h0,{children:[r(T0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),r(J3,{value:W,onChange:H,onSubmit:m,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(h0,{marginTop:1,children:r(T0,{color:X.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),r(h0,{marginTop:1,children:r(T0,{color:X.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),(Q==="command"||Q==="confirm")&&r(h0,{marginBottom:1,children:r(T0,{children:["Matcher: ",r(T0,{bold:!0,children:W||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q==="command"&&r(h0,{flexDirection:"column",children:[r(h0,{children:r(T0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),r(h0,{borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,marginTop:1,children:r(J3,{value:N,onChange:w,onSubmit:S0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),r(h0,{flexDirection:"column",marginTop:1,children:[r(T0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),n7.map((f,v)=>r(T0,{color:X.colors.muted,children:["• ",f]},v,!0,void 0,this))]},void 0,!0,void 0,this),r(h0,{marginTop:1,children:r(T0,{color:X.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),Q==="location"&&r(h0,{flexDirection:"column",children:[r(h0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[r(T0,{bold:!0,color:X.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),r(T0,{children:" "},void 0,!1,void 0,this),r(T0,{children:[" ","Event: ",R.event," - ",R.description]},void 0,!0,void 0,this),r(T0,{children:[" Matcher: ",W||"(all)"]},void 0,!0,void 0,this),r(T0,{children:[" Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r(T0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),r(h0,{flexDirection:"column",marginTop:1,children:Q4.map((f,v)=>r(h0,{children:[r(T0,{color:v===z?X.colors.primary:void 0,bold:v===z,children:[v===z?"> ":" ",v+1,". ",f.name]},void 0,!0,void 0,this),r(T0,{color:X.colors.muted,children:[" ",f.description]},void 0,!0,void 0,this)]},f.location,!0,void 0,this))},void 0,!1,void 0,this),r(h0,{marginTop:1,children:r(T0,{color:X.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),Q==="confirm"&&r(h0,{flexDirection:"column",children:[r(h0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.success,paddingX:2,paddingY:1,children:[r(T0,{bold:!0,children:["Saving hook to ",S.description,"..."]},void 0,!0,void 0,this),r(T0,{children:" "},void 0,!1,void 0,this),r(T0,{children:["Event: ",R.event]},void 0,!0,void 0,this),r(T0,{children:["Matcher: ",W||"(all tools)"]},void 0,!0,void 0,this),r(T0,{children:["Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r(h0,{marginTop:1,children:r(T0,{color:X.colors.muted,children:B?"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),y&&r(h0,{marginTop:1,children:r(T0,{color:X.colors.error,children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as b3}from"ahooks";import{Box as FQ,Text as WQ}from"ink";import HQ from"react";import{useMemoizedFn as K4}from"ahooks";import $2 from"chalk";import{Text as zQ}from"ink";import{useEffect as B3,useRef as J8}from"react";var G4={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};function Z3($){return typeof $==="string"&&/^[0-9a-f]{32}$/.test($)}function t7($){if(!Z3($))throw Error("TUI composer ready nonce must be 32 lowercase hexadecimal chars");return`\x1B]99;blade-composer-ready=${$}\x07`}function s7($=process.env){let J=$.BLADE_TUI_COMPOSER_READY_NONCE;if(!Z3(J))return;return t7(J)}function X3($=process.env,J=(Z)=>process.stdout.write(Z)){let Z=s7($);if(!Z)return!1;return J(Z),!0}var e1="\x1B",e7=`${e1}[200~`,$Q=`${e1}[201~`,JQ="[200~",YQ="[201~",ZQ=[`${e1}[I`,`${e1}[O`,"[I","[O"],G3=`${e1}[?2004h`,K3=`${e1}[?2004l`,DJ=`${e1}[?1004l`,XQ=[e7,JQ],QQ=[$Q,YQ];function q3(){return{pasteBuffer:null,pasteOverflowed:!1}}function Q3($,J){let Z;for(let Y of J){let X=$.indexOf(Y);if(X===-1)continue;if(!Z||X<Z.index||X===Z.index&&Y.length>Z.marker.length)Z={index:X,marker:Y}}return Z}function U3($){return ZQ.some((J)=>$===J)}function z3($,J){let Z=J,Y=$.pasteBuffer,X=$.pasteOverflowed,Q=Y!==null,U=[];while(Z.length>0){if(Y!==null){let G=Q3(Z,QQ);if(!G){if(Y.length+Z.length>SJ)Y="",X=!0;else if(!X)Y+=Z;Z="";break}if(Y.length+G.index>SJ)X=!0;else if(!X)Y+=Z.slice(0,G.index),U.push({kind:"paste",text:Y});Y=null,X=!1,Q=!0,Z=Z.slice(G.index+G.marker.length);continue}let q=Q3(Z,XQ);if(!q){if(U3(Z))Q=!0;else U.push({kind:"text",text:Z});Z="";break}let K=Z.slice(0,q.index);if(K&&!U3(K))U.push({kind:"text",text:K});Y="",X=!1,Q=!0,Z=Z.slice(q.index+q.marker.length)}if(J.length===0&&Y!==null)Q=!0;return{handled:Q,state:{pasteBuffer:Y,pasteOverflowed:X},segments:U}}import{execSync as D2}from"node:child_process";import{existsSync as UQ,readFileSync as fJ}from"node:fs";import{basename as _3,isAbsolute as GQ}from"node:path";function O3($){try{let J=Buffer.from($,"base64");if(J.length<4)return"image/png";if(J[0]===137&&J[1]===80&&J[2]===78&&J[3]===71)return"image/png";if(J[0]===255&&J[1]===216&&J[2]===255)return"image/jpeg";if(J[0]===71&&J[1]===73&&J[2]===70)return"image/gif";if(J[0]===82&&J[1]===73&&J[2]===70&&J[3]===70){if(J.length>=12&&J[8]===87&&J[9]===69&&J[10]===66&&J[11]===80)return"image/webp"}return"image/png"}catch{return"image/png"}}function N3(){let $=process.platform,J={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"},Z={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(Y)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${Y}" 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:(Y)=>`rm -f "${Y}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(Y)=>`xclip -selection clipboard -t image/png -o > "${Y}" || wl-paste --type image/png > "${Y}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(Y)=>`rm -f "${Y}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(Y)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${Y.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(Y)=>`del /f "${Y}"`}};return{commands:Z[$]||Z.linux,screenshotPath:J[$]||J.linux}}function KQ(){let{commands:$}=N3();try{return D2($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function F3($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function W3($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function VJ($){let J=F3($.trim()),Z=W3(J);return/\.(png|jpe?g|gif|webp)$/i.test(Z)}function qQ($){let J=F3($.trim()),Z=W3(J);if(VJ(Z))return Z;return null}async function H3($){let J=qQ($);if(!J)return null;let Z;try{if(GQ(J))Z=fJ(J);else{let U=KQ();if(U&&J===_3(U))Z=fJ(U);else return null}}catch(U){return console.error("Failed to read image file:",U),null}let Y=Z.toString("base64"),X=O3(Y),Q=_3(J);return{path:J,base64:Y,mediaType:X,filename:Q}}async function L3(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Z=J[$]||J.linux;try{return D2(Z,{encoding:"utf-8"})||null}catch{return null}}async function w3(){let{commands:$,screenshotPath:J}=N3();try{if(D2($.checkImage,{stdio:"ignore"}),D2($.saveImage(J),{stdio:"ignore"}),!UQ(J))return null;let Y=fJ(J).toString("base64"),X=O3(Y);return D2($.deleteFile(J),{stdio:"ignore"}),{base64:Y,mediaType:X}}catch(Z){try{D2($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as NQ}from"react/jsx-dev-runtime";var _Q=/\r\n/g,OQ=/\r/g;function vJ($){if(!$.includes("\r"))return $;return $.replace(_Q,`
151
+ `).replace(OQ,`
152
+ `)}function A3($,J,Z){let Y=Math.max(0,Math.min(Z,J.length)),X=J.slice(0,Y),Q=J.slice(Y);return{newValue:X+$+Q,newCursorPosition:Y+$.length}}function P3({value:$,placeholder:J="",focus:Z=!0,onChange:Y,cursorPosition:X,onChangeCursorPosition:Q,onPaste:U,onImagePaste:q,disabledKeys:K=[]}){let G=J8(q3()),O=J8($),z=J8(X),_=J8(null),W=J8(!1);B3(()=>{O.current=$,z.current=X},[$,X]),B3(()=>{if(X>$.length)Q($.length)},[$,X,Q]);let H=K4((F,L)=>{let A=O.current,R=z.current;if(O.current=F,z.current=L,F!==A)Y(F);if(L!==R)Q(L)}),N=K4((F)=>{if(!F)return;let{newValue:L,newCursorPosition:A}=A3(vJ(F),O.current,z.current);H(L,A)}),w=K4(async(F)=>{let L=vJ(F);if(!L)return;if(q&&VJ(L))try{let R=await H3(L);if(R){let S=await q(R.base64,R.mediaType,R.filename);if(S?.prompt)N(S.prompt);return}}catch(R){console.error("Failed to process image path:",R)}if((L.length>G4.LARGE_INPUT_THRESHOLD||L.includes(`
153
+ `))&&U){let R=await U(L);if(R?.prompt){N(R.prompt);return}}N(L)}),y=K4((F)=>{let L=_.current;if(!L){try{let R=F();if(!R)return;let S=R.catch(()=>{return});_.current=S,S.finally(()=>{if(_.current===S)_.current=null})}catch{}return}let A=L.then(F).then(()=>{return}).catch(()=>{return});_.current=A,A.finally(()=>{if(_.current===A)_.current=null})});w0((F,L)=>{return y(()=>{let A=vJ(F),R=z3(G.current,A);if(G.current=R.state,R.handled)return(async()=>{for(let e of R.segments)if(e.kind==="paste")await w(e.text);else N(e.text)})();if(K.some((e)=>L[e])||L.ctrl&&F==="c"||L.ctrl&&F==="l"||L.ctrl&&F==="t"||L.ctrl&&F==="o"||L.meta&&F==="l"||L.meta&&F==="t"||L.meta&&F==="o"||L.shift&&L.tab||A==="?"&&O.current==="")return;let M=O.current,k=z.current,P=k,D=M;if(L.leftArrow)P--;else if(L.rightArrow)P++;else if(L.backspace||L.delete){if(F===""){if(k>0)D=M.slice(0,k-1)+M.slice(k,M.length),P--}else if(k<M.length)D=M.slice(0,k)+M.slice(k+1,M.length)}else if(L.ctrl&&A==="a")P=0;else if(L.ctrl&&A==="e")P=M.length;else if(L.ctrl&&A==="k")D=M.slice(0,k);else if(L.ctrl&&A==="u")D=M.slice(k),P=0;else if(L.ctrl&&A==="w"){let $0=M.slice(0,k).match(/\s*\S+\s*$/);if($0){let m=$0[0].length;D=M.slice(0,k-m)+M.slice(k),P-=m}}else if(L.ctrl&&A==="v"){let e=process.platform==="darwin";return(async()=>{if(q){let m=await w3();if(m){let S0=await q(m.base64,m.mediaType,"clipboard.png");if(S0?.prompt)N(S0.prompt);return}}if(e)return;let $0=await L3();if($0)await w($0)})()}else if(L.pageUp)P=0;else if(L.pageDown)P=M.length;else if(A===`
154
+ `&&(L.shift||L.meta)){let{newValue:e,newCursorPosition:$0}=A3(A,M,k);H(e,$0);return}else if(!L.ctrl&&!L.meta){if(U&&(A.length>G4.LARGE_INPUT_THRESHOLD||A.includes(`
155
+ `)))return w(A);D=M.slice(0,k)+A+M.slice(k,M.length),P+=A.length}if(P<0)P=0;if(P>D.length)P=D.length;H(D,P)}),!0},{isActive:Z,priority:0,onRegistered:()=>{if(W.current)return;W.current=X3()}});let T=Z,B=$,C=J?$2.grey(J):void 0;if(T)if(C=J.length>0?$2.inverse(J[0])+$2.grey(J.slice(1)):$2.inverse(" "),$.length===0)B=$2.inverse(" ");else{B="";for(let F=0;F<$.length;F++)if(F===X&&X<$.length)B+=$2.inverse($[F]);else B+=$[F];if(X>=$.length)B+=$2.inverse(" ")}return NQ(zQ,{children:J?$.length>0?B:C:B},void 0,!1,void 0,this)}import{jsxDEV as jJ}from"react/jsx-dev-runtime";var M3=HQ.memo(({input:$,cursorPosition:J,onChange:Z,onChangeCursorPosition:Y,onAddPasteMapping:X,onAddImagePasteMapping:Q,disabled:U=!1})=>{let K=X$()==="main-input"&&!U,G=$.trimStart().startsWith("!"),O=b3((_)=>{let W=_.split(`
156
+ `).length,H=_.length,N=500,w=10;if(H>500||W>10){let y=X(_),T=_.slice(0,30).replace(/\n/g," "),B=`${H} chars, ${W} lines: ${T}...`;return{prompt:`${c8(y)}${B}${d4()}`}}return{}}),z=b3(async(_,W,H)=>{try{let N=Q(_,W);return{prompt:`${c8(N)}[Image #${N}]${d4()}`}}catch(N){return console.error("[Image Paste] Failed to process image:",N),{prompt:`[Image paste failed: ${N instanceof Error?N.message:"Unknown error"}] `}}});return jJ(FQ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[jJ(WQ,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),jJ(P3,{value:$,cursorPosition:J,onChange:Z,onChangeCursorPosition:Y,onPaste:O,onImagePaste:z,placeholder:" 输入命令...",focus:K,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as q4,Text as J1}from"ink";import yQ,{useEffect as TQ,useState as CQ}from"react";import{useEffect as PQ,useRef as bQ,useState as MQ}from"react";import{useEffect as LQ,useRef as wQ,useState as BQ}from"react";var AQ=15000,y3="等待用户确认...",T3=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],C3=["Esc - 中止任务 / 隐藏建议 / 双击清空输入","Shift+Tab - 切换模式 (DEFAULT → AUTO_EDIT → PLAN)","Tab - 选中建议 / 切换 thinking 模式","Up/Down - 浏览建议或输入历史","? - 显示快捷键帮助(输入框为空时)","Ctrl+C - 停止任务(双击退出)","Ctrl+L - 清屏","Ctrl+T - 展开/折叠 thinking 内容","Ctrl+O - 打开只读 transcript","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 R3(){if(Math.random()<0.25){let Z=Math.floor(Math.random()*C3.length);return C3[Z]}let J=Math.floor(Math.random()*T3.length);return T3[J]}function I3($,J,Z=!1){let[Y,X]=BQ(""),Q=wQ(Z);return Q.current=Z,LQ(()=>{if(J){X(y3);return}if(!$){X("");return}X((q)=>q===""||q===y3?R3():q);let U=setInterval(()=>{if(!Q.current)X(R3())},AQ);return()=>{clearInterval(U)}},[$,J]),Y}function k3($,J=!1,Z=!1){let[Y,X]=MQ(0),Q=bQ(null),U=I3($,J,Z);return PQ(()=>{if(!$){X(0),Q.current=null;return}if(Z)return;if(Q.current===null)Q.current=Date.now();let q=setInterval(()=>{if(Q.current!==null){let K=Math.floor((Date.now()-Q.current)/1000);X(K)}},1000);return()=>{clearInterval(q)}},[$,Z]),{currentPhrase:U,elapsedTime:Y}}import{jsxDEV as P$,Fragment as IQ}from"react/jsx-dev-runtime";var EJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],RQ=80;function f2($){if($<60)return`${$}s`;let J=Math.floor($/60),Z=$%60;return`${J}m ${Z}s`}var S3=yQ.memo(({message:$,paused:J=!1})=>{let Z=W2(),Y=H8(),X=W9(),Q=F9(),U=H9(),q=L9(),K=w9(),G=Z||!Y,[O,z]=CQ(0),_=V0(),H=b2()>=RQ,{currentPhrase:N,elapsedTime:w}=k3(G,!1,J);if(TQ(()=>{if(!G||J){z(0);return}let A=setInterval(()=>{z((R)=>(R+1)%EJ.length)},150);return()=>clearInterval(A)},[G,J]),!G)return null;let y=U?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${U.attempt}/${U.maxRetries}),剩余约 ${f2(Math.max(0,Math.ceil((U.recoveryRemainingMs??0)/1000)))}`:U?.phase==="scheduled"?`Provider 暂时不可用,${U.attempt}/${U.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((U.delayMs??0)/1000))}s 后开始`:U?.phase==="attempt"?`正在重试 Provider (${U.attempt}/${U.maxRetries})`:null,T=Q?Q.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${Q.retryAfterMs!==void 0?` (${f2(Math.max(0,Math.ceil(Q.retryAfterMs/1000)))})`:""}${Q.recoveryRemainingMs!==void 0?`,剩余预算 ${f2(Math.max(0,Math.ceil(Q.recoveryRemainingMs/1000)))}`:""}`:null,B=X?`等待 Provider 容量(${X.scope},队列 ${X.queuePosition}/${Math.max(X.queueDepth,X.queuePosition)},已等待 ${f2(Math.max(0,Math.ceil(X.waitMs/1000)))})`:null,C=q?q.outputStarted?`Provider 流已暂停 ${Math.ceil(q.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(q.durationMs/1000)}s(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:null,L=(K?.phase==="detected"?`检测到 ${K.toolName} 连续 ${K.runLength} 次无进展,正在要求 Agent 切换策略`:K?.phase==="halted"?`已停止 ${K.toolName} 空转循环`:null)||T||B||y||C||$||N||"正在思考中...";if(H)return P$(q4,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[P$(J1,{color:_.colors.warning,bold:!0,children:EJ[O]},void 0,!1,void 0,this),P$(J1,{color:_.colors.text.primary,children:L},void 0,!1,void 0,this),w>0&&P$(IQ,{children:[P$(J1,{color:_.colors.muted,children:"|"},void 0,!1,void 0,this),P$(J1,{color:_.colors.info,children:["已用时: ",f2(w)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),P$(J1,{color:_.colors.muted,children:"|"},void 0,!1,void 0,this),P$(J1,{color:_.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return P$(q4,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[P$(q4,{flexDirection:"row",gap:1,children:[P$(J1,{color:_.colors.warning,bold:!0,children:EJ[O]},void 0,!1,void 0,this),P$(J1,{color:_.colors.text.primary,children:L},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w>0&&P$(q4,{marginLeft:2,flexDirection:"row",gap:1,children:[P$(J1,{color:_.colors.info,children:["已用时: ",f2(w)]},void 0,!0,void 0,this),P$(J1,{color:_.colors.muted,children:"|"},void 0,!1,void 0,this),P$(J1,{color:_.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 O4,Text as $$,useStdout as kQ}from"ink";import SQ from"ink-text-input";import DQ,{useCallback as z4,useEffect as fQ,useMemo as VQ,useState as J2}from"react";import{jsxDEV as v0}from"react/jsx-dev-runtime";var v3=DQ.memo(({details:$,onComplete:J})=>{let{stdout:Z}=kQ(),Y=Z.columns||80,X=X$()==="confirmation-prompt",Q=s0(!1),U=$.fields??[],[q,K]=J2("field"),[G,O]=J2(0),[z,_]=J2(()=>D3($)),[W,H]=J2(""),[N,w]=J2(0),[y,T]=J2([]),[B,C]=J2(),F=U[G],L=VQ(()=>vQ(F),[F]);fQ(()=>{if(!F)return;let k=z[F.name];H(typeof k==="string"||typeof k==="number"?String(k):""),T(Array.isArray(k)?[...k]:[]);let P=L.findIndex((D)=>D.value===String(k));w(P>=0?P:0),C(void 0)},[z,F,L]);let A=z4((k)=>{if(_(k),G<U.length-1){O((P)=>P+1);return}K("review")},[G,U.length]),R=z4((k)=>{if(!F)return;let P={...z};if(k===void 0)delete P[F.name];else P[F.name]=k;A(P)},[z,F,A]),S=z4((k)=>{if(!F)return;try{R(f3(F,k))}catch(P){C(P instanceof Error?P.message:String(P))}},[F,R]),M=z4(()=>{try{let k=V3($,{action:"accept",content:z});J({action:k.action,...k.content?{content:k.content}:{}})}catch(k){C(k instanceof Error?k.message:String(k))}},[z,$,J]);if(w0((k,P)=>{if(P.ctrl&&k==="c"||P.meta&&k==="c"){Q();return}if(P.escape){J({action:"cancel"});return}if($.mode==="url"){if(k.toLowerCase()==="y")J({action:"accept"},!0);else if(k.toLowerCase()==="n")J({action:"decline"});return}if(q==="review"){if(k.toLowerCase()==="y"||P.return)M();else if(k.toLowerCase()==="e")O(0),K("field");else if(k.toLowerCase()==="d")J({action:"decline"});return}if(!F){if(P.return)M();return}if(hJ(F))return;if(k.toLowerCase()==="d"){J({action:"decline"});return}if(P.upArrow){w((D)=>D>0?D-1:Math.max(L.length-1,0));return}if(P.downArrow||P.tab){w((D)=>D<L.length-1?D+1:0);return}if(k===" "&&F.type==="multi-select"){let D=L[N];if(D)T((e)=>e.includes(D.value)?e.filter(($0)=>$0!==D.value):[...e,D.value]);return}if(P.return)if(F.type==="multi-select")R(y);else{let D=L[N];if(D)R(D.typedValue)}},{isActive:X}),$.mode==="url")return v0(_4,{width:Y,color:"yellow",children:[v0($$,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),v0($$,{children:$.message},void 0,!1,void 0,this),v0($$,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),v0($$,{children:["Domain: ",v0($$,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v0($$,{wrap:"wrap",children:["URL: ",v0($$,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v0($$,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(q==="review")return v0(_4,{width:Y,color:"green",children:[v0($$,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),v0($$,{children:$.message},void 0,!1,void 0,this),U.map((k)=>v0($$,{children:[k.title,": ",EQ(z[k.name])]},k.name,!0,void 0,this)),B&&v0($$,{color:"red",children:B},void 0,!1,void 0,this),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(!F)return v0(_4,{width:Y,color:"cyan",children:[v0($$,{children:$.message},void 0,!1,void 0,this),v0($$,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),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 v0(_4,{width:Y,color:"cyan",children:[v0($$,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),v0($$,{children:$.message},void 0,!1,void 0,this),v0(O4,{flexDirection:"column",marginTop:1,children:[v0($$,{bold:!0,children:[F.title,F.required?" *":""]},void 0,!0,void 0,this),F.description&&v0($$,{color:"gray",children:F.description},void 0,!1,void 0,this),v0($$,{color:"gray",children:jQ(F)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),hJ(F)?v0(O4,{children:[v0($$,{color:"cyan",children:"> "},void 0,!1,void 0,this),v0(SQ,{value:W,onChange:H,onSubmit:S,focus:X,placeholder:F.defaultValue===void 0?F.required?"Required":"Optional":String(F.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):v0(O4,{flexDirection:"column",children:L.map((k,P)=>{let D=F.type==="multi-select"&&y.includes(k.value);return v0($$,{color:N===P?"yellow":void 0,children:[N===P?"> ":" ",F.type==="multi-select"?D?"(*) ":"( ) ":"",k.label]},k.value,!0,void 0,this)})},void 0,!1,void 0,this),B&&v0($$,{color:"red",children:B},void 0,!1,void 0,this),v0($$,{color:"gray",children:[hJ(F)?"Enter to continue":F.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),v0($$,{color:"gray",children:["Field ",G+1," of ",U.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function _4({children:$,width:J,color:Z}){return v0(O4,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Z,padding:1,width:Math.min(J-4,88),children:$},void 0,!1,void 0,this)}function hJ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function vQ($){if(!$)return[];if($.type==="boolean")return[{value:"true",label:"Yes",typedValue:!0},{value:"false",label:"No",typedValue:!1}];return($.options??[]).map((J)=>({...J,typedValue:J.value}))}function jQ($){let J=[];if($.format)J.push(`format: ${$.format}`);if($.minimum!==void 0)J.push(`min: ${$.minimum}`);if($.maximum!==void 0)J.push(`max: ${$.maximum}`);if($.minLength!==void 0)J.push(`min length: ${$.minLength}`);if($.maxLength!==void 0)J.push(`max length: ${$.maxLength}`);if($.minItems!==void 0)J.push(`min selections: ${$.minItems}`);if($.maxItems!==void 0)J.push(`max selections: ${$.maxItems}`);return J.join(" · ")}function EQ($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import F4 from"ansi-escapes";import{Box as E1,Static as rQ,useStdout as aQ}from"ink";import iQ,{useEffect as P1,useMemo as cJ,useRef as h1,useState as dJ}from"react";import{Box as hQ,Text as j3}from"ink";import gQ from"react";import{jsxDEV as gJ}from"react/jsx-dev-runtime";var mJ=gQ.memo(({collapsedCount:$})=>{let J=V0();if($<=0)return null;let Z=J.colors.text.muted;return gJ(hQ,{flexDirection:"row",marginBottom:1,children:[gJ(j3,{color:Z,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),gJ(j3,{color:Z,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});mJ.displayName="CollapsedHistorySummary";import{Box as Y8,Text as Z8}from"ink";import mQ from"ink-big-text";import pQ from"ink-gradient";import xQ from"react";import{jsxDEV as r$}from"react/jsx-dev-runtime";var h3=xQ.memo(()=>{return r$(Y8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[r$(Y8,{flexDirection:"column",children:r$(pQ,{name:"pastel",children:r$(mQ,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),r$(Y8,{marginBottom:1,children:r$(Z8,{color:"white",dimColor:!0,children:E3()},void 0,!1,void 0,this)},void 0,!1,void 0,this),r$(Y8,{flexDirection:"column",marginBottom:1,children:[r$(Y8,{marginBottom:1,children:r$(Z8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),r$(Z8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),r$(Z8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),r$(Z8,{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 N4,Text as pJ}from"ink";import g3 from"react";import{jsxDEV as j1}from"react/jsx-dev-runtime";var m3=g3.memo(({tasks:$,visible:J=!0,compact:Z=!1})=>{let{colors:Y}=V0();if(!J||$.length===0)return null;let X={total:$.length,completed:$.filter((Q)=>Q.status==="completed").length,inProgress:$.filter((Q)=>Q.status==="in_progress").length};return j1(N4,{flexDirection:"column",borderStyle:"single",borderColor:Y.border.light,paddingX:1,paddingY:Z?0:1,marginBottom:1,children:[j1(N4,{marginBottom:Z?0:1,children:[j1(pJ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),j1(pJ,{color:Y.text.muted,children:[X.completed,"/",X.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j1(N4,{flexDirection:"column",children:$.map((Q,U)=>j1(uQ,{task:Q,compact:Z},Q.id||U,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),uQ=g3.memo(({task:$,compact:J})=>{let Z,Y=!1,X;switch($.status){case"completed":Z="[OK]",Y=!0,X=$.subject;break;case"in_progress":Z=">",Y=!1,X=$.activeForm||$.subject;break;case"pending":default:Z="-",Y=!0,X=$.subject;break}return j1(N4,{paddingY:J?0:0,children:j1(pJ,{dimColor:Y,children:[Z," ",X]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as xJ,Text as V2}from"ink";import cQ,{useMemo as p3}from"react";import{jsxDEV as A1}from"react/jsx-dev-runtime";function dQ($,J=60){if(!$)return"";let Z=$.split(`
157
+ `)[0]||"";if(Z.length<=J)return Z;return`${Z.slice(0,J)}...`}function lQ($){if(!$)return 0;return $.split(`
158
+ `).length}var uJ=cQ.memo(({content:$,isStreaming:J=!1,isExpanded:Z})=>{let Y=V0(),X=p3(()=>lQ($),[$]),Q=p3(()=>dQ($),[$]),U=Y.colors.info,q=Y.colors.muted;return A1(xJ,{flexDirection:"column",marginBottom:1,children:[A1(xJ,{flexDirection:"row",children:[A1(V2,{color:U,children:Z?"v":">"},void 0,!1,void 0,this),A1(V2,{children:" "},void 0,!1,void 0,this),A1(V2,{color:q,children:["Thinking",J?"...":` (${X} lines)`]},void 0,!0,void 0,this),!Z&&!J&&Q&&A1(V2,{color:q,children:[" - ",Q]},void 0,!0,void 0,this),A1(V2,{color:q,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&$&&A1(xJ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:A1(V2,{color:q,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});uJ.displayName="ThinkingBlock";import{jsxDEV as L$}from"react/jsx-dev-runtime";var oQ=({active:$=!0})=>{let J=N8(),Z=T8(),Y=C8(),X=E9(),Q=W2(),U=b9(),q=I9(),K=H2(),G=y8(),O=j9(),z=z9(),_=g9(),W=h9(),{width:H,height:N}=P2(),{stdout:w}=aQ(),y=D1(),[T,B]=dJ(null),[C,F]=dJ([]),[L,A]=dJ(new Set),R=h1(W),S=h1(null),M=h1(0),k=h1(0),P=h1(new Set),D=h1(new Set),e=h1([]),$0=h1(null);P1(()=>{if(R.current!==W){if(R.current=W,!$)return;if(t$())c$();if(w)w.write(F4.clearTerminal);y.incrementClearCount()}},[$,W,w,y]);let m=J,S0=X;P1(()=>{if(!X||Q){$0.current=null;return}if($0.current===X)return;if($0.current=X,t$())c$();if($&&w)w.write(F4.eraseScreen+F4.cursorTo(0,0));P.current=new Set,D.current=new Set(m.filter((V)=>V.role==="tool").map((V)=>V.id)),S.current=null,M.current=0,k.current=0,e.current=[],F([]),A(new Set),y.incrementClearCount(),y.clearFinalizingStreamingMessageId()},[X,Q,w,y,m,$]);let o=Z??X;P1(()=>{if($&&t$())c$();S.current=null,M.current=0,k.current=0,P.current=new Set,D.current=new Set(m.filter((V)=>V.role==="tool").map((V)=>V.id)),e.current=[],F([]),A(new Set)},[z]),P1(()=>{if(!o)return;if(S.current===o)return;S.current=o,M.current=0,k.current=0,D.current=new Set(m.filter((V)=>V.role==="tool").map((V)=>V.id)),e.current=[],F([])},[o,m]),P1(()=>{if(!o)return;let V=lJ(o);if(!V||V.length<=M.current)return;let Z0=V.slice(M.current);M.current=V.length;let n=Z0,b=e.current;if(b.length>0)if(n.some((t)=>t.type!=="empty"))n=[...b,...n],e.current=[];else{e.current=[...b,...n];return}let I=n.length;while(I>0&&n[I-1].type==="empty")I-=1;if(I!==n.length)e.current=n.slice(I),n=n.slice(0,I);if(n.length===0)return;let j=k.current;k.current+=1;let p=j>0;if(t$())c$();A((t)=>{if(!o||t.has(o))return t;let l=new Set(t);return l.add(o),l}),F((t)=>[...t,L$(E1,{flexDirection:"column",children:L$(G1,{content:"",role:"assistant",terminalWidth:H,isPending:!1,hidePrefix:p,noMargin:!0,blocksOverride:n,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${o}-${j}`,!1,void 0,this)])},[o,Y.version,H,z,$]),P1(()=>{if(!o)return;let V=D.current,Z0=m.filter((n)=>n.role==="tool"&&!V.has(n.id)&&!P.current.has(n.id));if(Z0.length===0)return;if($&&t$())c$();for(let n of Z0)P.current.add(n.id);F((n)=>[...n,...Z0.map((b)=>L$(E1,{flexDirection:"column",children:L$(G1,{content:b.content,role:b.role,terminalWidth:H,metadata:b.metadata,isPending:!1,messageId:b.id},void 0,!1,void 0,this)},`streaming-tool-${b.id}`,!1,void 0,this))])},[$,o,m,H]),P1(()=>{if(!$){if(t$())c$();return}if(!o){if(t$())c$();return}if(!t$())K6(H,N);else q6(H,N);let V=x3(o);if(!V||V.lines.length===0)return;let n=Math.max(1,N-8),b=Math.max(0,V.lines.length-n),I=V.lines.slice(-n),j=(lJ(o)?.length??0)>0;z6(I,b,V.mode,j)},[o,Y.version,N,H,$]),P1(()=>{if(!o&&t$())c$()},[o]),P1(()=>{if(T===null&&m.length>_){if(B(m.length),$&&t$())c$();if($&&w)w.write(F4.clearTerminal);y.incrementClearCount()}},[m.length,_,T,w,y,$]);let f=cJ(()=>{return U.some((V)=>V.status==="pending"||V.status==="in_progress")},[U]),v=W?0:T??0,g=v,s=cJ(()=>{let V=[];if(V.push(L$(h3,{},"header",!1,void 0,this)),g>0)V.push(L$(mJ,{collapsedCount:g},"collapsed-summary",!1,void 0,this));for(let Z0=v;Z0<m.length;Z0++){let n=m[Z0];if(S0&&n.id===S0)continue;if(n.role==="tool"&&P.current.has(n.id))continue;if(n.role==="assistant"&&L.has(n.id))continue;V.push(L$(E1,{flexDirection:"column",children:L$(G1,{content:n.content,role:n.role,terminalWidth:H,metadata:n.metadata,isPending:!1,messageId:n.id},void 0,!1,void 0,this)},n.id,!1,void 0,this))}return V},[m,v,g,H,S0,L]),U0=cJ(()=>C.length>0?[...s,...C]:s,[s,C]);return L$(E1,{flexDirection:"column",paddingX:2,children:L$(E1,{flexDirection:"column",children:[L$(rQ,{items:U0,children:(V)=>V},z,!1,void 0,this),G&&L$(E1,{marginBottom:1,children:L$(uJ,{content:G,isStreaming:Q,isExpanded:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),q&&f&&L$(E1,{marginTop:1,children:L$(m3,{tasks:U,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.map((V,Z0)=>L$(E1,{flexDirection:"column",children:L$(G1,{content:V.displayText,role:"user",terminalWidth:H},void 0,!1,void 0,this)},`pending-${Z0}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},u3=iQ.memo(oQ);import{useMemoizedFn as W4,useMount as nQ}from"ahooks";import{Box as a$,Text as j0,useFocus as tQ,useFocusManager as sQ}from"ink";import eQ from"ink-select-input";import{memo as $U,useMemo as JU,useState as H4}from"react";import{jsxDEV as B0,Fragment as XU}from"react/jsx-dev-runtime";var YU=({isSelected:$})=>B0(a$,{marginRight:1,children:B0(j0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),ZU=({isSelected:$,label:J})=>B0(j0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),c3=$U(({onClose:$,onEdit:J})=>{let Z=k9(),Y=w8()??"",{isFocused:X}=tQ({id:"model-selector"}),Q=sQ(),[U,q]=H4(""),[K,G]=H4(!1),[O,z]=H4(null),_=s0(!1),[W]=H4(()=>{let A=process.stdout?.columns||80;return Math.max(20,A-8)});nQ(()=>{if(Q?.focus("model-selector"),Z.length>0)q(Z[0].id)}),w0((A,R)=>{if(K)return;if(R.ctrl&&A==="c"||R.meta&&A==="c"){_();return}if(R.escape){$();return}if(!X)return;if(A==="d"||A==="D"){N();return}if((A==="e"||A==="E")&&J)w()},{isActive:!0});let H=W4(async(A)=>{if(K)return;let R=A.value;if(R===Y){$();return}G(!0),z(null);try{await q$().setCurrentModel(R),$()}catch(S){z(S.message),G(!1)}}),N=W4(async()=>{if(K||U===Y)return;G(!0),z(null);try{if(await q$().removeModel(U),Z.length<=1)$()}catch(A){z(A.message)}finally{G(!1)}}),w=W4(()=>{if(K||!J)return;let A=Z.find((R)=>R.id===U);if(!A)return;J(A)}),y=W4((A)=>{q(A.value)}),T=JU(()=>{return Z.find((A)=>A.id===U)},[Z,U]),B=T?L4()?.modelProviders[T.provider]:void 0,C=Z.map((A)=>{let R=A.id===Y?" (当前)":"";return{label:rJ(A)+R,value:A.id}}),F=U===Y;return B0(a$,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[B0(a$,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[B0(j0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),B0(j0,{dimColor:!0,children:[K?"处理中...":F?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B0(a$,{flexDirection:"row",children:[B0(a$,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[B0(j0,{dimColor:!0,children:["已配置模型 (",Z.length,")"]},void 0,!0,void 0,this),B0(a$,{marginTop:1,children:B0(eQ,{items:C,onSelect:H,onHighlight:y,indicatorComponent:YU,itemComponent:ZU},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(a$,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[B0(j0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),B0(a$,{marginY:1,children:B0(j0,{color:F?"green":"yellow",children:F?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),T?B0(a$,{flexDirection:"column",children:[B0(j0,{children:[B0(j0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),B0(j0,{bold:!0,color:"cyan",children:rJ(T)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(j0,{children:[B0(j0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),B0(j0,{bold:!0,children:B?.name??T.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B&&B0(XU,{children:[B0(j0,{children:[B0(j0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),B0(j0,{children:T.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(j0,{children:[B0(j0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),B0(j0,{children:B.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(j0,{children:[B0(j0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),B0(j0,{color:"blueBright",children:B.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B0(j0,{children:[B0(j0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),B0(j0,{bold:!0,children:T.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),T.overrides?.baseUrl&&B0(j0,{children:[B0(j0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),B0(j0,{color:"blueBright",children:T.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(j0,{children:[B0(j0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),B0(j0,{children:W1().resolveConfig(T).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):B0(j0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),O&&B0(a$,{marginTop:1,children:B0(j0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(a$,{justifyContent:"center",marginTop:1,children:B0(j0,{dimColor:!0,children:"─".repeat(W)},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(a$,{justifyContent:"center",children:B0(j0,{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 aJ}from"ahooks";import{Box as PU,Text as iJ}from"ink";import{useState as X2}from"react";import{Box as Y2,Text as b1}from"ink";import QU from"ink-text-input";import{jsxDEV as w$}from"react/jsx-dev-runtime";var d3=({provider:$,value:J,onChange:Z,onSubmit:Y,onCancel:X,error:Q})=>{return w0((U,q)=>{if(q.escape)X()}),w$(Y2,{flexDirection:"column",children:[w$(Y2,{marginBottom:1,children:w$(b1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(Y2,{marginBottom:1,children:w$(b1,{children:["Provider: ",w$(b1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),w$(Y2,{marginBottom:1,children:w$(b1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(Y2,{children:[w$(b1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),w$(QU,{value:J,onChange:Z,onSubmit:Y,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&w$(Y2,{marginTop:1,children:w$(b1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(Y2,{marginTop:1,children:w$(b1,{dimColor:!0,children:["输入完成后按 ",w$(b1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",w$(b1,{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 w4,Text as g1}from"ink";import UU from"ink-text-input";import{useState as B4}from"react";import{jsxDEV as g$}from"react/jsx-dev-runtime";var A4=["id","name","baseUrl","model"];function l3($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function GU($,J,Z){switch($){case"id":return"team-gateway";case"name":return Z||"Team Gateway";case"baseUrl":return J==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return J==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function KU($,J){let Z=$.id.trim(),Y={name:$.name.trim()||Z,baseUrl:$.baseUrl.trim(),wireApi:J},X=a3(Z,Y);if(!$.model.trim())X.push("Model ID must not be empty");if(X.length>0)throw Error(X[0]);return{provider:Z,model:$.model.trim(),displayName:$.model.trim(),modelProvider:Y}}var i3=({wireApi:$,initialConfig:J,onSubmit:Z,onCancel:Y})=>{let X={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,U]=B4(J?3:0),[q,K]=B4(J?.model??""),[G,O]=B4(X),[z,_]=B4(),W=A4[Q];w0((N,w)=>{if(!w.escape)return;if(_(void 0),Q===0){Y();return}let y=Q-1,T=A4[y];U(y),K(G[T])});let H=(N)=>{let w=N.trim();if(W==="id"&&!r3.test(w)){_("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(W==="baseUrl")try{let T=new URL(w);if(!["http:","https:"].includes(T.protocol))throw Error()}catch{_("Base URL 必须是绝对 HTTP(S) URL");return}if(W==="model"&&!w){_("Model ID 不能为空");return}let y={...G,[W]:W==="name"&&!w?G.id:w};if(O(y),_(void 0),Q===A4.length-1){try{Z(KU(y,$))}catch(T){_(T instanceof Error?T.message:"渠道配置无效")}return}U(Q+1),K("")};return g$(w4,{flexDirection:"column",children:[g$(w4,{marginBottom:1,children:g$(g1,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g$(g1,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),A4.slice(0,Q).map((N)=>g$(g1,{children:[l3(N),": ",g$(g1,{color:"cyan",children:G[N]},void 0,!1,void 0,this)]},N,!0,void 0,this)),g$(w4,{marginTop:1,children:[g$(g1,{bold:!0,children:[l3(W),": "]},void 0,!0,void 0,this),g$(UU,{value:q,onChange:(N)=>{K(N),_(void 0)},onSubmit:H,placeholder:GU(W,$,G.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W==="name"&&g$(g1,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),z&&g$(g1,{color:"red",children:z},void 0,!1,void 0,this),g$(w4,{marginTop:1,children:g$(g1,{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 t3,useState as v2}from"react";var s3=()=>{let[$,J]=v2([]),[Z,Y]=v2(!0),[X,Q]=v2(null);return t3(()=>{let U=!1;return(async()=>{try{let K=await o3();if(!U)J(K)}catch(K){if(!U)Q(K instanceof Error?K.message:"加载 Provider 列表失败")}finally{if(!U)Y(!1)}})(),()=>{U=!0}},[]),{providers:$,isLoading:Z,error:X}},e3=($)=>{let[J,Z]=v2([]),[Y,X]=v2(!1),[Q,U]=v2(null);return t3(()=>{if(!$){Z([]),X(!1),U(null);return}let q=!1;return Z([]),X(!0),U(null),(async()=>{try{let G=await n3($);if(!q)Z(G)}catch(G){if(!q)U(G instanceof Error?G.message:"加载模型列表失败")}finally{if(!q)X(!1)}})(),()=>{q=!0}},[$]),{models:J,isLoading:Y,error:Q}};import{Box as M1,Text as Y1}from"ink";import qU from"ink-select-input";import zU from"ink-text-input";import{useMemo as $Z,useState as _U}from"react";import{jsxDEV as G$,Fragment as WU}from"react/jsx-dev-runtime";var OU=({isSelected:$})=>G$(M1,{marginRight:1,children:G$(Y1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),NU=($)=>{let J=[$.name];if($.contextWindow){let Z=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;J.push(`[${Z} ctx]`)}if($.reasoning)J.push("[reasoning]");if($.input.includes("image"))J.push("[vision]");if($.cost.input||$.cost.output)J.push(`[$${$.cost.input}/$${$.cost.output}]`);return J.join(" ")},FU=({isSelected:$,label:J})=>G$(Y1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),JZ=({provider:$,models:J,isLoading:Z,error:Y,onSelect:X,onCancel:Q})=>{let[U,q]=_U("");w0((O,z)=>{if(z.escape)if(U)q("");else Q()});let K=$Z(()=>{if(!U)return J;let O=U.toLowerCase();return J.filter((z)=>z.name.toLowerCase().includes(O)||z.id.toLowerCase().includes(O))},[J,U]),G=$Z(()=>K.map((O)=>({key:O.id,label:NU(O),value:O})),[K]);if(Z)return G$(M1,{flexDirection:"column",children:G$(Y1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(Y)return G$(M1,{flexDirection:"column",children:[G$(Y1,{color:"red",children:Y},void 0,!1,void 0,this),G$(Y1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return G$(M1,{flexDirection:"column",children:[G$(M1,{marginBottom:1,children:G$(Y1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G$(M1,{marginBottom:1,children:G$(Y1,{children:["Provider: ",G$(Y1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G$(WU,{children:[G$(M1,{marginBottom:1,children:[G$(Y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),G$(zU,{value:U,onChange:q,placeholder:`搜索 ${J.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G$(M1,{marginBottom:1,children:G$(Y1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G$(M1,{flexDirection:"column",height:12,children:G$(qU,{items:G,onSelect:(O)=>X(O.value),indicatorComponent:OU,itemComponent:FU,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&G$(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 Z2,Text as m1}from"ink";import HU from"ink-select-input";import LU from"ink-text-input";import{useMemo as YZ,useState as wU}from"react";import{jsxDEV as B$}from"react/jsx-dev-runtime";var BU=({isSelected:$})=>B$(Z2,{marginRight:1,children:B$(m1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),AU=({isSelected:$,label:J})=>B$(m1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),ZZ=({providers:$,isLoading:J,error:Z,onSelect:Y,onCancel:X})=>{let[Q,U]=wU("");w0((G,O)=>{if(O.escape)if(Q)U("");else X()});let q=YZ(()=>{if(!Q)return $;let G=Q.toLowerCase();return $.filter((O)=>O.name.toLowerCase().includes(G)||O.id.toLowerCase().includes(G))},[$,Q]),K=YZ(()=>q.map((G)=>({key:G.id,label:`${G.name} - ${G.modelCount} models${G.configured?" [configured]":""}`,value:G})),[q]);if(J)return B$(Z2,{flexDirection:"column",children:B$(m1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return B$(Z2,{flexDirection:"column",children:[B$(m1,{color:"red",children:Z},void 0,!1,void 0,this),B$(m1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return B$(Z2,{flexDirection:"column",children:[B$(Z2,{marginBottom:1,children:B$(m1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B$(Z2,{marginBottom:1,children:[B$(m1,{color:"cyan",children:"> "},void 0,!1,void 0,this),B$(LU,{value:Q,onChange:U,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B$(Z2,{flexDirection:"column",height:12,children:B$(HU,{items:K,onSelect:(G)=>Y(G.value),indicatorComponent:BU,itemComponent:AU,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.length===0&&B$(m1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function XZ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as p1}from"react/jsx-dev-runtime";var oJ=({mode:$,initialConfig:J,modelId:Z,onComplete:Y,onCancel:X})=>{let[Q,U]=X2("provider"),[q,K]=X2(),[G,O]=X2(),[z,_]=X2(),[W,H]=X2(""),[N,w]=X2(),[y,T]=X2(!1),B=s3(),C=e3(q?.id),F=s0(!1);w0((S,M)=>{if(M.ctrl&&S==="c"||M.meta&&S==="c")$==="setup"?F():X()});let L=aJ(async(S)=>{if(!q)return;let M=z??(G?{provider:q.id,model:G.id,displayName:J?.displayName}:void 0);if(!M)return;T(!0),w(void 0);try{if(M.modelProvider)W1().registerModelProvider(M.provider,M.modelProvider,[M.model]);if(S?.trim())await W1().setApiKey(M.provider,S.trim());let k={displayName:M.displayName,provider:M.provider,model:M.model,overrides:M.overrides};if($==="setup")await Y(M);else if($==="add"){let P=M.modelProvider?await q$().addModelWithProvider(k,M.modelProvider):await q$().addModel(k);await q$().setCurrentModel(P.id),await Y(M)}else if(Z){if(M.modelProvider)await q$().updateModelWithProvider(Z,k,M.modelProvider);else await q$().updateModel(Z,k);await Y(M)}}catch(k){if(M.modelProvider){await W1().credentials.delete(M.provider);let P=L4();W1().configureModelProviders(P?.modelProviders??{},P?.models??[])}w(k instanceof Error?k.message:"保存配置失败"),T(!1)}}),A=aJ((S)=>{if(O(S),q?.configured)L();else if(q?.supportsApiKey)U("credential");else w(`${q?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),R=aJ(()=>{if(w(void 0),Q==="credential"&&z){U("custom");return}let S=XZ(Q);if(S)U(S)});return p1(PU,{flexDirection:"column",padding:1,children:[p1(iJ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&p1(ZZ,{...B,onSelect:(S)=>{K(S),O(void 0),_(void 0),U(S.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:X},void 0,!1,void 0,this),Q==="custom"&&q?.factoryWireApi&&p1(i3,{wireApi:q.factoryWireApi,initialConfig:z,onSubmit:(S)=>{_(S),U("credential")},onCancel:R},void 0,!1,void 0,this),Q==="model"&&q&&p1(JZ,{provider:q,...C,onSelect:A,onCancel:R},void 0,!1,void 0,this),Q==="credential"&&q&&p1(d3,{provider:q,value:W,onChange:H,onSubmit:()=>void L(W),onCancel:R,error:N},void 0,!1,void 0,this),y&&p1(iJ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),N&&Q!=="credential"&&p1(iJ,{color:"red",children:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as X8}from"ahooks";import{promises as KZ}from"fs";import{Box as m$,Text as J$}from"ink";import QZ from"ink-select-input";import bU from"ink-text-input";import MU from"os";import P4 from"path";import{useEffect as yU,useMemo as b4,useRef as TU,useState as x1}from"react";import{jsxDEV as C0}from"react/jsx-dev-runtime";var Q8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],CU={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},RU={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},UZ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},IU=["project","global","local"],kU={allow:[],ask:[],deny:[]},SU={localExists:!1,projectExists:!1,globalExists:!1},GZ={allow:[],ask:[],deny:[]};function DU($){let J=(Y)=>Array.isArray(Y)?Y.filter((X)=>typeof X==="string"):[],Z=$?.permissions??{};return{allow:J(Z?.allow),ask:J(Z?.ask),deny:J(Z?.deny)}}async function fU($){try{let J=await KZ.readFile($,"utf-8"),Z=JSON.parse(J);return{exists:!0,raw:Z,permissions:DU(Z)}}catch(J){if(J.code==="ENOENT")return{exists:!1,raw:{},permissions:{...GZ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,J),{exists:!0,raw:{},permissions:{...GZ}}}}function VU($,J){let Z=$.padEnd(32," "),Y=J==="local"?`${UZ[J]} <- 可删除`:UZ[J];return`${Z} ${Y}`}var qZ=({onClose:$})=>{let Z=X$()==="permissions-manager",Y=s0(!1),[X,Q]=x1(0),U=Q8[X].key,[q,K]=x1(kU),[G,O]=x1(SU),[z,_]=x1(!0),[W,H]=x1("list"),[N,w]=x1(""),[y,T]=x1(null),[B,C]=x1(null),F=TU(!1),L=b4(()=>P4.join(K$(),".blade","settings.local.json"),[]),A=b4(()=>P4.join(K$(),".blade","settings.json"),[]),R=b4(()=>P4.join(MU.homedir(),".blade","settings.json"),[]),S=X8(async()=>{_(!0);let U0=await Promise.all([{source:"local",path:L},{source:"project",path:A},{source:"global",path:R}].map(async({source:b,path:I})=>{let j=await fU(I);return{source:b,path:I,...j}})),V={localExists:U0.find((b)=>b.source==="local")?.exists??!1,projectExists:U0.find((b)=>b.source==="project")?.exists??!1,globalExists:U0.find((b)=>b.source==="global")?.exists??!1};O(V);let Z0={allow:[],ask:[],deny:[]},n=Object.fromEntries(U0.map((b)=>[b.source,b]));["allow","ask","deny"].forEach((b)=>{IU.forEach((I)=>{(n[I]?.permissions[b]??[]).forEach((p,t)=>{let l={key:`${I}:${t}:${p}`,rule:p,source:I};Z0[b].push(l)})})}),K(Z0),_(!1)});yU(()=>{S()},[S]);let M=X8(async(s,U0)=>{try{let V=P4.join(K$(),".blade","settings.local.json"),Z0={allow:[],ask:[],deny:[]};try{let b=await KZ.readFile(V,"utf-8"),j=JSON.parse(b).permissions||{};Z0={allow:Array.isArray(j.allow)?j.allow:[],ask:Array.isArray(j.ask)?j.ask:[],deny:Array.isArray(j.deny)?j.deny:[]}}catch(b){}let n=U0(Z0);await q$().updateConfig({permissions:n},{scope:"local",immediate:!0}),await S()}catch(V){throw console.error("[PermissionsManager] 修改权限规则失败:",V),V}});w0((s,U0)=>{if(U0.ctrl&&s==="c"||U0.meta&&s==="c"){Y();return}if(W==="locked"){if(F.current){F.current=!1;return}H("list"),T(null),C(null);return}if(U0.escape){if(W==="list"||U==="info")$();else H("list"),w(""),T(null),C(null);return}if(W==="list"){if(U0.tab&&U0.shift)Q((V)=>(V-1+Q8.length)%Q8.length);else if(U0.tab)Q((V)=>(V+1)%Q8.length);else if(s?.toLowerCase()==="q")$()}},{isActive:Z});let k=X8((s)=>{let U0=s.value;if(U==="info")return;if(U0.type==="add"){H("add"),w(""),C(null);return}if(U0.entry.source!=="local"){H("locked"),F.current=!0,T({tab:U,entry:U0.entry}),C({type:"error",text:U0.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}H("confirm-delete"),T({tab:U,entry:U0.entry}),C(null)}),P=X8(async()=>{if(U==="info")return;let s=N.trim();if(!s){C({type:"error",text:"Permission rule 不能为空"});return}if(q[U].map((V)=>V.rule).includes(s)){C({type:"error",text:"该规则已存在"});return}try{await M(U,(V)=>{let Z0={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return Z0[U]=[...new Set([...V[U],s])],Z0}),H("list"),w(""),C({type:"success",text:"已添加本地权限规则"})}catch(V){C({type:"error",text:`保存失败: ${V instanceof Error?V.message:"未知错误"}`})}}),D=X8(async()=>{if(!y)return;let{tab:s,entry:U0}=y;try{await M(s,(V)=>{let Z0={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return Z0[s]=V[s].filter((n)=>n!==U0.rule),Z0}),H("list"),T(null),C({type:"success",text:"已删除本地权限规则"})}catch(V){C({type:"error",text:`删除失败: ${V instanceof Error?V.message:"未知错误"}`})}}),e=b4(()=>{if(U==="info")return[];let s=U;return[{key:"add-new-rule",label:`› ${CU[s]}`,value:{type:"add"}},...q[s].map((V)=>({key:V.key,label:VU(V.rule,V.source),value:{type:"rule",entry:V}}))]},[U,q]),$0=()=>C0(m$,{marginBottom:1,children:Q8.map((s,U0)=>C0(m$,{marginRight:2,children:C0(J$,{color:U0===X?"yellow":"gray",children:["[",s.label,"]"]},void 0,!0,void 0,this)},s.key,!1,void 0,this))},void 0,!1,void 0,this),m=()=>C0(m$,{flexDirection:"column",gap:1,children:[C0(J$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),C0(m$,{flexDirection:"column",marginLeft:2,children:[C0(J$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",G.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),C0(J$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",G.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),C0(J$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",G.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C0(J$,{children:"说明:"},void 0,!1,void 0,this),C0(m$,{flexDirection:"column",marginLeft:2,children:[C0(J$,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),C0(J$,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),C0(J$,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),S0=(s)=>C0(m$,{flexDirection:"column",gap:1,children:[C0(J$,{bold:!0,children:RU[s]},void 0,!1,void 0,this),C0(J$,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),C0(J$,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),C0(m$,{marginTop:1,children:C0(bU,{value:N,onChange:w,onSubmit:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),C0(J$,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o=(s,U0)=>C0(m$,{flexDirection:"column",gap:1,children:[C0(J$,{bold:!0,children:["Delete ",s," permission rule?"]},void 0,!0,void 0,this),C0(J$,{children:U0.rule},void 0,!1,void 0,this),C0(J$,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),C0(J$,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),C0(QZ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(V)=>{if(V.value==="yes")D();else H("list"),T(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f=(s)=>C0(m$,{flexDirection:"column",gap:1,children:[C0(J$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),C0(J$,{children:s.rule},void 0,!1,void 0,this),C0(J$,{color:"gray",children:s.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),C0(J$,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v=(s)=>C0(QZ,{items:e,isFocused:W==="list",onSelect:k},void 0,!1,void 0,this),g=()=>{if(z)return C0(J$,{children:"加载中..."},void 0,!1,void 0,this);if(U==="info")return m();if(W==="add")return S0(U);if(W==="confirm-delete"&&y)return o(y.tab,y.entry);if(W==="locked"&&y)return f(y.entry);return v(U)};return C0(m$,{flexDirection:"column",borderStyle:"round",borderColor:Z?"cyan":"gray",padding:1,width:80,children:[C0(J$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),$0(),C0(m$,{flexDirection:"column",gap:1,children:g()},void 0,!1,void 0,this),B&&C0(m$,{marginTop:1,children:C0(J$,{color:B.type==="success"?"green":"red",children:B.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),C0(m$,{marginTop:1,children:C0(J$,{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 P0}from"ink";import{useEffect as vU,useState as Q2}from"react";import{jsxDEV as a}from"react/jsx-dev-runtime";var nJ=["local","project","global"];function HZ({workspaceRoot:$,onCancel:J}){let Z=X$()==="plugins-manager",Y=_Z($),X=Y.getAll(),[Q,U]=Q2(0),[q,K]=Q2(!1),[G,O]=Q2(""),[z,_]=Q2(null),[W,H]=Q2("local"),[N,w]=Q2(null),[y,T]=Q2(0),B=Y.getBySource(),C=Y.getStats(),F=Y.getSourcePolicy(),L=s0(!1,J);vU(()=>{let P=!0;return zZ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((D)=>{if(P)w(D.settings)}).catch((D)=>{if(P)O(D instanceof Error?D.message:"无法读取插件作用域配置")}),()=>{P=!1}},[Y,y]);let A=()=>{H((P)=>{let D=nJ.indexOf(P);return nJ[(D+1)%nJ.length]}),_(null)},R=async()=>{let P=X[Q];if(!P||q)return;if(P.source==="cli"){O(`${P.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(P.status==="error"){O(P.error??`${P.manifest.name} 当前不可用`);return}K(!0),O("");try{let D=await OZ(Y.getWorkspaceRoot(),P.manifest.name,P.status!=="active",W);O(D.effectiveEnabled?`已启用 ${P.manifest.name} · 生效层级 ${D.effectiveScope}`:`已禁用 ${P.manifest.name} · 生效层级 ${D.effectiveScope}`),T((e)=>e+1)}catch(D){O(D instanceof Error?D.message:String(D))}finally{K(!1)}},S=async()=>{if(q)return;K(!0),O("");try{await NZ(Y.getWorkspaceRoot()),U(0),O("插件列表已刷新"),T((P)=>P+1)}catch(P){O(P instanceof Error?P.message:String(P))}finally{K(!1)}},M=async()=>{let P=X[Q];if(!P||q)return;if(!P.installation){O(`${P.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}K(!0),_(null),O("");try{let{result:D}=await FZ(Y.getWorkspaceRoot(),P.manifest.name,{trusted:!0});if(!D.success)throw Error(D.error);O(D.changed?`已更新 ${P.manifest.name} 到 ${D.installation?.revision}`:`${P.manifest.name} 已是最新版本`),T((e)=>e+1)}catch(D){O(D instanceof Error?D.message:String(D))}finally{K(!1)}},k=async()=>{let P=X[Q];if(!P||q)return;if(!P.installation){O(`${P.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(z!==P.manifest.name){_(P.manifest.name),O(`再次按 x 确认卸载 ${P.manifest.name}`);return}K(!0),O("");try{let{result:D}=await WZ(Y.getWorkspaceRoot(),P.manifest.name,!0);if(!D.success)throw Error(D.error);_(null),U(0),O(`已卸载 ${P.manifest.name}`),T((e)=>e+1)}catch(D){O(D instanceof Error?D.message:String(D))}finally{K(!1)}};if(w0((P,D)=>{if(D.escape)J?.();else if(D.ctrl&&P==="c"||D.meta&&P==="c")L();else if((D.upArrow||P==="k")&&X.length>0)_(null),U((e)=>(e-1+X.length)%X.length);else if((D.downArrow||P==="j")&&X.length>0)_(null),U((e)=>(e+1)%X.length);else if(P===" "||D.return)R();else if(P==="r")S();else if(P==="s")A();else if(P==="u")M();else if(P==="x")k()},{isActive:Z}),X.length===0)return a(p0,{flexDirection:"column",paddingY:1,children:[a(p0,{marginBottom:1,children:a(P0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(p0,{paddingLeft:2,children:a(P0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(p0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[a(P0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),a(P0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),a(P0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),a(P0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(p0,{marginTop:1,paddingLeft:2,children:a(P0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(p0,{marginTop:1,children:a(P0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return a(p0,{flexDirection:"column",paddingY:1,children:[a(p0,{marginBottom:1,children:[a(P0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),a(P0,{color:"gray",children:[" (共 ",C.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(p0,{paddingLeft:2,marginBottom:1,children:a(P0,{color:"gray",children:["启用: ",C.active," | 禁用: ",C.inactive," | 命令: ",C.commands," | 技能:"," ",C.skills," | 代理: ",C.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),a(p0,{paddingLeft:2,marginBottom:1,children:a(P0,{color:"gray",children:["来源策略: ",F.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",F.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),a(p0,{paddingLeft:2,marginBottom:1,children:a(P0,{color:"gray",children:["写入层级: ",a(P0,{color:"cyan",children:W},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B.cli.length>0&&a(p0,{flexDirection:"column",marginBottom:1,children:[a(p0,{paddingLeft:1,children:[a(P0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),a(P0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.cli.map((P)=>{let D=P.status==="active"?"[on]":"[off]",e=X.indexOf(P)===Q;return a(p0,{flexDirection:"column",paddingLeft:2,children:[a(P0,{children:[a(P0,{bold:!0,color:e?"cyan":"green",children:[e?"› ":" ",D," ",P.manifest.name]},void 0,!0,void 0,this),a(P0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(p0,{paddingLeft:2,children:a(P0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(p0,{paddingLeft:2,children:a(P0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&a(p0,{paddingLeft:2,children:a(P0,{color:"blue",children:["命令:"," ",P.commands.map(($0)=>`/${$0.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},P.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),B.project.length>0&&a(p0,{flexDirection:"column",marginBottom:1,children:[a(p0,{paddingLeft:1,children:[a(P0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),a(P0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.project.map((P)=>{let D=P.status==="active"?"[on]":"[off]",e=X.indexOf(P)===Q;return a(p0,{flexDirection:"column",paddingLeft:2,children:[a(P0,{children:[a(P0,{bold:!0,color:e?"cyan":"green",children:[e?"› ":" ",D," ",P.manifest.name]},void 0,!0,void 0,this),a(P0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(p0,{paddingLeft:2,children:a(P0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(p0,{paddingLeft:2,children:a(P0,{color:"gray",dimColor:!0,children:["生效层级:"," ",N?.[P.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&a(p0,{paddingLeft:2,children:a(P0,{color:"blue",children:["命令:"," ",P.commands.map(($0)=>`/${$0.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},P.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),B.user.length>0&&a(p0,{flexDirection:"column",marginBottom:1,children:[a(p0,{paddingLeft:1,children:[a(P0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),a(P0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.user.map((P)=>{let D=P.status==="active"?"[on]":"[off]",e=X.indexOf(P)===Q;return a(p0,{flexDirection:"column",paddingLeft:2,children:[a(P0,{children:[a(P0,{bold:!0,color:e?"cyan":"green",children:[e?"› ":" ",D," ",P.manifest.name]},void 0,!0,void 0,this),a(P0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(p0,{paddingLeft:2,children:a(P0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(p0,{paddingLeft:2,children:a(P0,{color:"gray",dimColor:!0,children:["生效层级:"," ",N?.[P.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&a(p0,{paddingLeft:2,children:a(P0,{color:"blue",children:["命令:"," ",P.commands.map(($0)=>`/${$0.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},P.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),a(p0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[a(P0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),a(P0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),a(P0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),a(P0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),a(P0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),a(P0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(p0,{marginTop:1,children:a(P0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&a(p0,{marginTop:1,children:a(P0,{color:G.includes("失败")?"red":"cyan",children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),q&&a(P0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as b$,Text as M$,useStdout as jU}from"ink";import EU from"ink-text-input";import tJ,{useCallback as U8,useMemo as hU,useState as u1}from"react";import{jsxDEV as E0}from"react/jsx-dev-runtime";var gU=tJ.memo(({option:$,index:J,isSelected:Z,isMultiSelect:Y,isHighlighted:X})=>E0(b$,{flexDirection:"column",marginBottom:1,children:[E0(M$,{color:X?"yellow":Z?"green":void 0,bold:X,children:[Y?Z?"(*) ":"( ) ":X?"> ":" ",J+1,". ",$.label]},void 0,!0,void 0,this),E0(b$,{marginLeft:4,children:E0(M$,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),mU=tJ.memo(({questions:$,answers:J})=>E0(b$,{flexDirection:"column",marginBottom:1,children:$.map((Z)=>{let Y=J[Z.header],X=Array.isArray(Y)?Y.join(", "):Y||"(no answer)";return E0(b$,{marginBottom:1,children:[E0(M$,{backgroundColor:"blue",color:"white",children:[" ",Z.header," "]},void 0,!0,void 0,this),E0(M$,{color:"green",children:[" ",X]},void 0,!0,void 0,this)]},Z.header,!0,void 0,this)})},void 0,!1,void 0,this)),LZ=tJ.memo(({questions:$,onComplete:J,onCancel:Z})=>{let{stdout:Y}=jU(),X=Y.columns||80,U=X$()==="confirmation-prompt",q=s0(!1),[K,G]=u1("answering"),[O,z]=u1(0),[_,W]=u1({}),[H,N]=u1(0),[w,y]=u1([]),[T,B]=u1(!1),[C,F]=u1(""),[L,A]=u1(0),R=$[O],S=hU(()=>{if(!R)return[];return[...R.options.map(($0)=>({label:$0.label,value:$0.label,description:$0.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[R]),M=U8(($0)=>{let m={..._,[R.header]:$0};if(W(m),O<$.length-1)z(O+1),N(0),y([]),B(!1),F("");else G("submit"),A(0)},[_,R?.header,O,$.length]),k=U8(($0)=>{let m=S[$0];if(!m)return;if(m.value==="__other__"){B(!0);return}if(R.multiSelect)y((S0)=>S0.includes(m.value)?S0.filter((o)=>o!==m.value):[...S0,m.value]);else M(m.value)},[S,R?.multiSelect,M]),P=U8(($0)=>{if($0.trim())M($0.trim())},[M]),D=U8(()=>{G("answering"),z(0),N(0),y([]),B(!1)},[]),e=U8(()=>{J(_)},[_,J]);if(w0(($0,m)=>{if(m.ctrl&&$0==="c"||m.meta&&$0==="c"){q();return}if(T){if(m.escape)B(!1),F("");return}if(m.escape){Z();return}let S0=parseInt($0);if(S0>=1&&S0<=S.length){k(S0-1);return}if(m.upArrow){N((o)=>o>0?o-1:S.length-1);return}if(m.downArrow||m.tab){N((o)=>o<S.length-1?o+1:0);return}if(m.return){if(R.multiSelect&&w.length>0)M(w);else k(H);return}if($0===" "&&R.multiSelect){let o=S[H];if(o&&o.value!=="__other__")y((f)=>f.includes(o.value)?f.filter((v)=>v!==o.value):[...f,o.value]);return}},{isActive:U&&K==="answering"&&!T}),w0(($0,m)=>{if(m.ctrl&&$0==="c"||m.meta&&$0==="c"){q();return}if(m.escape){Z();return}if(m.upArrow||m.downArrow||m.tab){A((S0)=>S0===0?1:0);return}if(m.return){if(L===0)e();else D();return}if($0.toLowerCase()==="y"){e();return}if($0.toLowerCase()==="e"){D();return}},{isActive:U&&K==="submit"}),K==="submit")return E0(b$,{flexDirection:"column",borderStyle:"round",borderColor:U?"green":"gray",padding:1,width:Math.min(X-4,80),children:[E0(b$,{marginBottom:1,children:E0(M$,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(mU,{questions:$,answers:_},void 0,!1,void 0,this),E0(b$,{flexDirection:"column",marginTop:1,children:[E0(M$,{color:L===0?"yellow":void 0,bold:L===0,children:[L===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),E0(M$,{color:L===1?"yellow":void 0,bold:L===1,children:[L===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),E0(b$,{marginTop:1,children:E0(M$,{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(!R)return null;return E0(b$,{flexDirection:"column",borderStyle:"round",borderColor:U?"cyan":"gray",padding:1,width:Math.min(X-4,80),children:[E0(b$,{marginBottom:1,children:[E0(M$,{backgroundColor:"blue",color:"white",children:[" ",R.header," "]},void 0,!0,void 0,this),E0(M$,{children:[" ",R.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T?E0(b$,{flexDirection:"column",marginTop:1,children:[E0(M$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),E0(b$,{marginTop:1,children:[E0(M$,{color:"cyan",children:"> "},void 0,!1,void 0,this),E0(EU,{value:C,onChange:F,onSubmit:P,focus:U},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(b$,{marginTop:1,children:E0(M$,{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):E0(b$,{flexDirection:"column",children:S.map(($0,m)=>E0(gU,{option:$0,index:m,isSelected:w.includes($0.value),isMultiSelect:R.multiSelect,isHighlighted:H===m},$0.value,!1,void 0,this))},void 0,!1,void 0,this),!T&&E0(b$,{marginTop:1,flexDirection:"column",children:[E0(M$,{color:"gray",children:R.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),R.multiSelect&&w.length>0&&E0(M$,{color:"green",children:["Selected: ",w.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&E0(b$,{marginTop:1,children:E0(M$,{color:"gray",children:["Question ",O+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as $9,Text as y1,useStdout as aU}from"ink";import{useEffect as J9,useMemo as T4,useRef as U2,useState as G2}from"react";function pU($,J){return[...$,J].join(`
159
+ `).replace(/\n+$/,"")}function j2($){let J=2166136261;for(let Z=0;Z<$.length;Z++)J^=$.charCodeAt(Z),J=Math.imul(J,16777619);return`${$.length}:${(J>>>0).toString(16)}`}function AZ({messages:$,currentStreamingMessageId:J,streamingLines:Z,streamingTail:Y,currentThinkingContent:X,pendingCommands:Q}){let U=pU(Z,Y),q=[];for(let K of $){let G=K.id===J?U:K.content,O=K.metadata&&"phase"in K.metadata?String(K.metadata.phase):"",z=K.id===J?X??K.thinkingContent:K.thinkingContent;if(K.role==="assistant"&&z)q.push({id:`${K.id}:thinking`,messageId:K.id,role:"assistant",kind:"thinking",content:z,revision:`${K.timestamp}:thinking:${j2(z)}`,collapsible:!0});let _=K.role==="tool"&&K.metadata&&"detail"in K.metadata&&typeof K.metadata.detail==="string"&&K.metadata.detail.length>0?K.metadata.detail:void 0;q.push({id:K.id,messageId:K.id,role:K.role,kind:K.role==="tool"?"tool":"message",content:G,detail:_,revision:`${K.timestamp}:${j2(G)}:${j2(_??"")}:${O}`,collapsible:_!==void 0})}if(J&&!q.some((K)=>K.id===J)){if(X)q.push({id:`${J}:thinking`,messageId:J,role:"assistant",kind:"thinking",content:X,revision:`stream:thinking:${j2(X)}`,collapsible:!0});q.push({id:J,messageId:J,role:"assistant",kind:"message",content:U,revision:`stream:${j2(U)}`,collapsible:!1})}for(let[K,G]of Q.entries())q.push({id:`pending:${K}:${G.displayText}`,messageId:`pending:${K}`,role:"user",kind:"message",content:G.displayText,revision:`pending:${j2(G.displayText)}`,pending:!0,collapsible:!1});return q}var wZ={user:"> ",assistant:"• ",system:" ",tool:"└ "};function M4($,J,Z){let Y=J.text.length>0?J.text.split(`
160
+ `):[""],X=[];for(let[Q,U]of Y.entries()){let q=X.length===0?J.firstPrefix:J.nextPrefix,K=Math.max(1,Z-q.length),G=C2(U,K,!0),O=0;for(let z of G){let _=z.length>0?U.indexOf(z,O):O,W=_>=0?_:O,H=W+z.length,N=X.length===0?J.firstPrefix:J.nextPrefix;X.push({key:`${$.id}:${J.key}:${Q}:${X.length}`,blockId:$.id,role:$.role,kind:$.kind,text:`${N}${z}`,copyText:z,pending:$.pending===!0,header:J.header&&X.length===0,sourceLine:J.sourceLineOffset+Q,sourceStart:W,sourceEnd:H,sourceTextOffset:N.length}),O=H}}return X}function BZ($){return $.length===0?0:$.split(`
161
+ `).length}function xU($){let J=$.split(`
162
+ `)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function sJ($,J,Z=!1){if($.kind==="thinking"){let Y=Z?"[-]":"[+]",X=xU($.content),Q=`${Y} Thinking (${BZ($.content)} lines)${!Z&&X?` - ${X}`:""}`,U={key:`${$.id}:header`,blockId:$.id,role:$.role,kind:$.kind,text:`? ${Q}`,copyText:Q,pending:$.pending===!0,header:!0,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:2};if(!Z)return[U];return[U,...M4($,{text:$.content,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:0,key:"thinking",header:!1},J)]}if($.kind==="tool"&&$.detail){let Y=Z?"[-]":"[+]",X=M4($,{text:$.content,firstPrefix:`${wZ.tool}${Y} `,nextPrefix:" ",sourceLineOffset:0,key:"summary",header:!0},J);if(!Z)return X;return[...X,...M4($,{text:$.detail,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:BZ($.content),key:"detail",header:!1},J)]}return M4($,{text:$.content.length>0?$.content:"…",firstPrefix:wZ[$.role],nextPrefix:" ",sourceLineOffset:0,key:"content",header:!0},J)}function PZ($,J,Z=new Set){return $.flatMap((Y,X)=>{let Q=sJ(Y,J,Z.has(Y.id));if(X===$.length-1)return Q;return[...Q,{key:`${Y.id}:separator`,blockId:Y.id,role:Y.role,kind:Y.kind,text:"",copyText:"",pending:Y.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})}function uU($){if($.kind==="tool"&&$.detail)return[...$.content.split(`
163
+ `),...$.detail.split(`
164
+ `)];return $.content.split(`
165
+ `)}function cU($,J){let Z=[];for(let[Y,X]of uU($).entries())for(let Q of X.matchAll(J)){let U=Q.index,q=Q[0];if(q.length===0)continue;Z.push({blockId:$.id,sourceLine:Y,start:U,end:U+q.length})}return Z}class G8{cache=new Map;search($,J){if(J.length===0)return[];let Z=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Y=new RegExp(Z,"giu"),X=new Set($.map((Q)=>Q.id));for(let Q of this.cache.keys())if(!X.has(Q))this.cache.delete(Q);return $.flatMap((Q)=>{let U=this.cache.get(Q.id);if(U?.revision===Q.revision&&U.query===J)return U.matches;let q=cU(Q,Y);return this.cache.set(Q.id,{revision:Q.revision,query:J,matches:q}),q})}}function eJ($,J){let Z=$.findIndex((Y)=>Y.blockId===J.blockId&&Y.sourceLine===J.sourceLine&&J.start>=Y.sourceStart&&J.start<Math.max(Y.sourceEnd,Y.sourceStart+1));if(Z>=0)return Z;return $.findIndex((Y)=>Y.blockId===J.blockId)}function bZ($,J){if($.sourceLine===null||$.sourceEnd<=$.sourceStart)return[];let Z=[];for(let[Y,X]of J.entries()){if(X.blockId!==$.blockId||X.sourceLine!==$.sourceLine||X.end<=$.sourceStart||X.start>=$.sourceEnd)continue;Z.push({start:$.sourceTextOffset+Math.max($.sourceStart,X.start)-$.sourceStart,end:$.sourceTextOffset+Math.min($.sourceEnd,X.end)-$.sourceStart,matchIndex:Y})}return Z}function MZ($,J,Z){let Y=Math.max(0,Math.min(J,Z)),X=Math.min($.length-1,Math.max(J,Z));if(X<Y)return"";let Q=$.slice(Y,X+1),U="";for(let[q,K]of Q.entries()){if(q===0){U=K.copyText;continue}let G=Q[q-1],O=K.sourceLine!==null&&K.blockId===G.blockId&&K.sourceLine===G.sourceLine;U+=`${O?"":`
166
+ `}${K.copyText}`}return U}function yZ($,J){let Z=new Map($.map((Y)=>[Y.id,Y.revision]));return J.filter((Y)=>Z.get(Y.id)!==Y.revision).map((Y)=>Y.id)}import{spawn as dU}from"node:child_process";function lU($){if($==="darwin")return[{command:"pbcopy",args:[]}];if($==="win32")return[{command:"clip",args:[]}];if($==="linux")return[{command:"wl-copy",args:[]},{command:"xclip",args:["-selection","clipboard"]},{command:"xsel",args:["--clipboard","--input"]}];return[]}function rU($,J,Z){return new Promise((Y)=>{let X=!1,Q=dU($,[...J],{stdio:["pipe","ignore","ignore"]}),U=setTimeout(()=>{if(X)return;X=!0,Q.kill("SIGKILL"),Y(!1)},2000),q=(K)=>{if(X)return;X=!0,clearTimeout(U),Y(K)};Q.once("error",()=>q(!1)),Q.once("close",(K)=>q(K===0)),Q.stdin.once("error",()=>q(!1)),Q.stdin.end(Z)})}function TZ($,J=!1){let Z=`\x1B]52;c;${Buffer.from($,"utf8").toString("base64")}\x07`;if(!J)return Z;return`\x1BPtmux;${Z.replaceAll("\x1B","\x1B\x1B")}\x1B\\`}async function y4($,J={}){if($.length===0)return{success:!1};let Z=J.platform??process.platform,Y=J.env??process.env,X=J.runCommand??rU,Q=J.writeTerminal??((K)=>process.stdout.write(K)),U=Boolean(Y.SSH_CONNECTION),q=async(K)=>{try{return await X(K.command,K.args,$)}catch{return!1}};if(!U){for(let K of lU(Z))if(await q(K))return{success:!0,method:"native"}}if(Y.TMUX){if(await q({command:"tmux",args:["load-buffer","-w","-"]})){try{Q(TZ($,!0))}catch{}return{success:!0,method:"tmux"}}}try{return Q(TZ($)),{success:!0,method:"osc52"}}catch{return{success:!1}}}import{jsxDEV as i$}from"react/jsx-dev-runtime";function iU($){return $.map((J)=>({id:J.id,messageId:J.id,role:J.role,kind:"message",content:J.content,revision:`${J.timestamp}:${J.content.length}:${J.truncated===!0}`,collapsible:!1}))}function oU($,J,Z){let Y=Array.from($.value);if(Z.backspace||Z.delete){if($.cursor===0)return $;return Y.splice($.cursor-1,1),{value:Y.join(""),cursor:$.cursor-1}}if(Z.leftArrow)return{...$,cursor:Math.max(0,$.cursor-1)};if(Z.rightArrow)return{...$,cursor:Math.min(Y.length,$.cursor+1)};if(!J||Z.ctrl||Z.meta)return $;return Y.splice($.cursor,0,...Array.from(J)),{value:Y.join(""),cursor:$.cursor+Array.from(J).length}}var CZ=({state:$,onLoadOlder:J,onFork:Z,onClose:Y})=>{let X=X$(),{width:Q,height:U}=P2(),{stdout:q}=aU(),K=Math.max(20,Q-4),G=Math.max(1,U-8),O=T4(()=>iU($.messages),[$.messages]),z=T4(()=>PZ(O,K),[O,K]),_=Math.max(0,z.length-G),[W,H]=G2(0),N=U2(0),[w,y]=G2(()=>Math.max(0,z.length-1)),T=U2(w),B=U2(z.at(-1)?.key??null),[C,F]=G2(!1),L=U2(!1),[A,R]=G2({value:"",cursor:0}),S=U2(A),[M,k]=G2(""),[P,D]=G2(0),e=U2(new G8),$0=U2(null),[m,S0]=G2(null),o=T4(()=>$.session?{viewGeneration:$.viewGeneration,locator:$.session.locator,snapshot:$.snapshot,olderCursor:$.olderCursor}:void 0,[$.olderCursor,$.session,$.snapshot,$.viewGeneration]);N.current=W,T.current=w,L.current=C,S.current=A;let f=T4(()=>e.current.search(O,M),[O,M]);J9(()=>{$0.current=null},[$.olderCursor]),J9(()=>{if($.status==="error")$0.current=null},[$.status]),J9(()=>{let l=B.current?z.findIndex((J0)=>J0.key===B.current):-1,O0=z.length===0?0:l>=0?l:z.length-1;T.current=O0,B.current=z[O0]?.key??null,y(O0);let F0=Math.max(0,Math.min(N.current,_));N.current=F0,H(F0)},[z,_]);let v=()=>{let l=$.olderCursor;if(!l||!o||!$.session?.capabilities.history.read||$.status!=="ready"&&$.status!=="error")return;if($0.current===l)return;$0.current=l,J(o)},g=(l,O0=!0)=>{let F0=Math.max(0,Math.min(_,l));N.current=F0,H(F0);let J0=Math.max(1,z.length-F0),L0=Math.max(0,J0-G),G0=Math.max(L0,Math.min(J0-1,T.current));if(T.current=G0,B.current=z[G0]?.key??null,y(G0),O0&&F0===_)v()},s=(l)=>{if(f.length===0)return;let O0=(l%f.length+f.length)%f.length,F0=f[O0],J0=z.findIndex((G0)=>G0.blockId===F0.blockId);if(D(O0),J0<0)return;T.current=J0,B.current=z[J0]?.key??null,y(J0);let L0=Math.max(0,z.length-Math.min(z.length,J0+1));g(L0,!1)},U0=()=>{let l=z[T.current];if(!l)return;y4(l.copyText,{writeTerminal:(O0)=>q.write(O0)}).then((O0)=>{S0(O0.success?"Copied":"Copy failed")})};w0((l,O0)=>{let F0=O0;if(L.current){if(F0.escape)return L.current=!1,F(!1),!0;if(F0.return){let L0=S.current.value;k(L0),L.current=!1,F(!1);let G0=e.current.search(O,L0);if(G0.length>0){let l0=G0[0],Y$=z.findIndex((m0)=>m0.blockId===l0.blockId);if(D(0),Y$>=0)T.current=Y$,B.current=z[Y$]?.key??null,y(Y$),g(Math.max(0,z.length-Math.min(z.length,Y$+1)),!1)}return!0}let J0=oU(S.current,l,F0);return S.current=J0,R(J0),!0}if(F0.escape||l==="q")return Y(),!0;if(l==="/"){let J0={value:M,cursor:Array.from(M).length};return S.current=J0,R(J0),L.current=!0,F(!0),!0}if(l==="n"&&f.length>0)return s(P+1),!0;if(l==="N"&&f.length>0)return s(P-1),!0;if(l==="y")return U0(),!0;if(l==="f"){if(o&&$.session?.capabilities.history.fork&&$.status==="ready")Z(o);return!0}if(F0.home||l==="g")return T.current=0,B.current=z[0]?.key??null,y(0),g(_),!0;if(F0.end||l==="G")return T.current=Math.max(0,z.length-1),B.current=z[T.current]?.key??null,y(T.current),g(0),!0;if(F0.pageUp)return g(N.current+Math.max(1,G-1)),!0;if(F0.pageDown)return g(N.current-Math.max(1,G-1)),!0;if(F0.upArrow||l==="k")return T.current=Math.max(0,T.current-1),B.current=z[T.current]?.key??null,y(T.current),g(N.current+1),!0;if(F0.downArrow||l==="j")return T.current=Math.min(z.length-1,T.current+1),B.current=z[T.current]?.key??null,y(T.current),g(N.current-1),!0;return!0},{isActive:X==="session-history-viewer",priority:200});let V=Math.max(0,z.length-W),Z0=Math.max(0,V-G),n=z.slice(Z0,V),b=M?`/${M} ${f.length>0?`${P+1}/${f.length}`:"0/0"} · loaded pages only`:null,I=$.session,j=[I&&!I.capabilities.history.read?"Older history unavailable":null,I&&!I.capabilities.history.fork?"Fork unavailable":null].filter((l)=>l!==null).join(" · "),p=$.status==="loading"?"Loading Session history…":$.status==="forking"?"Forking Session history…":$.status==="loading-older"?"Loading older history…":null,t=$.error?.message??p??m??b??(j||`${$.status==="loading-older"?"Loading older history… · ":""}/ search · y copy · f fork · Esc close`);return i$($9,{flexDirection:"column",width:"100%",height:U,paddingX:2,children:[i$($9,{justifyContent:"space-between",children:[i$(y1,{bold:!0,color:"cyan",children:I?.title?.trim()||"Session history"},void 0,!1,void 0,this),i$(y1,{color:"yellow",children:["Remote · ",I?.capabilities.connection??"offline"," · History only"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),i$(y1,{dimColor:!0,children:I?.displayCwd??""},void 0,!1,void 0,this),$.truncated?i$(y1,{color:"yellow",children:"History content was truncated."},void 0,!1,void 0,this):null,i$($9,{flexDirection:"column",height:G,children:n.map((l,O0)=>i$(y1,{color:Z0+O0===w?"cyan":void 0,children:l.text},l.key,!1,void 0,this))},void 0,!1,void 0,this),C?i$(y1,{children:["/",A.value]},void 0,!0,void 0,this):null,i$(y1,{color:$.error?"red":"gray",children:t},void 0,!1,void 0,this),i$(y1,{dimColor:!0,children:"Open this Session from its ACP owner to continue."},void 0,!1,void 0,this),i$(y1,{dimColor:!0,children:"Files and terminal are unavailable in history-only mode."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as q8,Text as Z1}from"ink";import nU from"ink-select-input";import{useEffect as RZ,useMemo as E2,useRef as IZ,useState as kZ}from"react";import{jsxDEV as A$}from"react/jsx-dev-runtime";function tU($){let J=new Date($),Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/86400000);if(X===0)return`今天 ${J.getHours().toString().padStart(2,"0")}:${J.getMinutes().toString().padStart(2,"0")}`;if(X===1)return"昨天";if(X<7)return`${X}天前`;return`${J.getMonth()+1}/${J.getDate()}`}var sU=({isSelected:$})=>A$(q8,{marginRight:1,children:A$(Z1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),eU=({isSelected:$,label:J})=>A$(Z1,{color:$?"cyan":"white",bold:$,children:J},void 0,!1,void 0,this),K8=20,SZ=({intent:$,sessions:J,onSelect:Z,onCancel:Y})=>{let[X,Q]=kZ(0),[U,q]=kZ(!1),K=IZ(!1),G=IZ(!0);RZ(()=>{return G.current=!0,()=>{G.current=!1}},[]);let z=X$()==="session-selector",_=s0(!1);w0((C,F)=>{if(F.ctrl&&C==="c"||F.meta&&C==="c"){_();return}if(K.current)return;if(F.escape&&Y){Y();return}if(F.leftArrow||C==="h"||C==="H"){if(X>0)Q((L)=>L-1);return}if(F.rightArrow||C==="l"||C==="L"){if(X<w-1)Q((L)=>L+1);return}},{isActive:z});let W=E2(()=>f8(J,$),[$,J]),H=E2(()=>JY($),[$]),N=E2(()=>{return W.map((C)=>{let F=tU(C.lastMessageTime);return{key:s9(C),label:$Y(C,F),value:C}})},[W]),w=E2(()=>Math.max(1,Math.ceil(N.length/K8)),[N.length]),y=E2(()=>{let C=X*K8;return N.slice(C,C+K8)},[N,X]),T=E2(()=>({start:X*K8+1,end:Math.min((X+1)*K8,N.length)}),[X,N.length]);RZ(()=>{Q(0)},[W.length]);let B=(C)=>{if(K.current)return;K.current=!0,q(!0);let F=()=>{if(!G.current)return;K.current=!1,q(!1)};Promise.resolve().then(()=>Z(C.value)).then(F,F)};if(W.length===0)return A$(q8,{flexDirection:"column",paddingX:2,paddingY:1,children:[A$(Z1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),A$(Z1,{dimColor:!0,children:[`
167
+ `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return A$(q8,{flexDirection:"column",paddingX:2,paddingY:1,children:[A$(Z1,{bold:!0,color:"cyan",children:H.title},void 0,!1,void 0,this),A$(Z1,{dimColor:!0,children:[`
168
+ `,H.instructions,`
169
+ `]},void 0,!0,void 0,this),A$(nU,{items:y,onSelect:B,isFocused:z&&!U,indicatorComponent:sU,itemComponent:eU},void 0,!1,void 0,this),U&&A$(Z1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),A$(q8,{marginTop:1,flexDirection:"column",children:[A$(Z1,{dimColor:!0,children:["第 ",X+1,"/",w," 页 · 共 ",W.length," 个会话 · 显示"," ",T.start,"-",T.end]},void 0,!0,void 0,this),w>1&&A$(q8,{marginTop:1,children:[A$(Z1,{color:X>0?"cyan":"gray",children:X>0?"<< 上一页":" "},void 0,!1,void 0,this),A$(Z1,{children:" "},void 0,!1,void 0,this),A$(Z1,{color:X<w-1?"cyan":"gray",children:X<w-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 DZ,Text as z8}from"ink";import $G,{useEffect as JG,useState as YG}from"react";import{jsxDEV as c1}from"react/jsx-dev-runtime";var fZ=["|","/","-","\\"],Y9=$G.memo(()=>{let $=W8(),J=V0(),Z=b2(),[Y,X]=YG(0);if(JG(()=>{if($?.status!=="loading"){X(0);return}let Q=setInterval(()=>{X((U)=>(U+1)%fZ.length)},100);return()=>clearInterval(Q)},[$?.status]),!$)return null;return c1(DZ,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[c1(DZ,{children:[c1(z8,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),c1(z8,{color:J.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&c1(z8,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&c1(z8,{color:J.colors.text.secondary,children:[fZ[Y]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&c1(z8,{color:J.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this),$.status==="completed"&&$.response&&c1(G1,{content:$.response,role:"assistant",terminalWidth:Math.max(20,Z-8),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});Y9.displayName="SideConversationPanel";import{Box as z$,Text as t0}from"ink";import{jsxDEV as A0}from"react/jsx-dev-runtime";function vZ({onCancel:$}){let J=U1(),Z=X$()==="skills-manager",X=VZ({cwd:J}).getAll(),Q=X.filter((G)=>G.source==="builtin"),U=X.filter((G)=>G.source==="user"),q=X.filter((G)=>G.source==="project"),K=s0(!1,$);if(w0((G,O)=>{if(O.escape)$?.();else if(O.ctrl&&G==="c"||O.meta&&G==="c")K()},{isActive:Z}),X.length===0)return A0(z$,{flexDirection:"column",paddingY:1,children:[A0(z$,{marginBottom:1,children:A0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A0(z$,{paddingLeft:2,children:A0(t0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A0(z$,{marginTop:1,paddingLeft:2,children:A0(t0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A0(z$,{marginTop:1,children:A0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return A0(z$,{flexDirection:"column",paddingY:1,children:[A0(z$,{marginBottom:1,children:[A0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),A0(t0,{color:"gray",children:[" (找到 ",X.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.length>0&&A0(z$,{flexDirection:"column",marginBottom:1,children:[A0(z$,{paddingLeft:1,children:[A0(t0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),A0(t0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.map((G)=>{let z=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return A0(z$,{flexDirection:"column",paddingLeft:2,children:[A0(t0,{children:[A0(t0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),A0(t0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&A0(z$,{paddingLeft:2,children:A0(t0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),A0(z$,{paddingLeft:2,children:A0(t0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),U.length>0&&A0(z$,{flexDirection:"column",marginBottom:1,children:[A0(z$,{paddingLeft:1,children:[A0(t0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),A0(t0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((G)=>{let z=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return A0(z$,{flexDirection:"column",paddingLeft:2,children:[A0(t0,{children:[A0(t0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),A0(t0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&A0(z$,{paddingLeft:2,children:A0(t0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),A0(z$,{paddingLeft:2,children:A0(t0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q.length>0&&A0(z$,{flexDirection:"column",marginBottom:1,children:[A0(z$,{paddingLeft:1,children:[A0(t0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),A0(t0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q.map((G)=>{let z=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return A0(z$,{flexDirection:"column",paddingLeft:2,children:[A0(t0,{children:[A0(t0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),A0(t0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.userInvocable&&A0(z$,{paddingLeft:2,children:A0(t0,{color:"blue",children:["命令: /",G.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),A0(z$,{marginTop:1,children:A0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as jZ,Text as X1}from"ink";import ZG,{useEffect as XG,useMemo as QG,useState as EZ}from"react";import{jsxDEV as y$,Fragment as Z9}from"react/jsx-dev-runtime";var hZ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function UG($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let Z=Math.floor(J/60),Y=J%60;return`${Z}m ${Y}s`}var gZ=ZG.memo(()=>{let $=z0((G)=>G.app.subagentProgresses),J=z0((G)=>G.app.subagentProgress),Z=V0(),[Y,X]=EZ(0),[Q,U]=EZ(()=>Date.now()),q=QG(()=>{let G=Object.values($);return G.length>0?G:J?[J]:[]},[J,$]),K=q.some((G)=>G.status==="running");if(XG(()=>{if(!K){X(0);return}let G=setInterval(()=>{X((z)=>(z+1)%hZ.length)},80),O=setInterval(()=>{U(Date.now())},1000);return()=>{clearInterval(G),clearInterval(O)}},[K]),q.length===0)return null;return y$(jZ,{paddingX:2,paddingY:0,flexDirection:"column",children:q.map((G)=>{let O=G.status==="running"?hZ[Y]:G.status==="completed"?"[OK]":"[X]",z=G.status==="running"?Z.colors.info:G.status==="completed"?Z.colors.success:Z.colors.error,_=Math.max(0,Q-G.startTime);return y$(jZ,{flexDirection:"row",gap:1,children:[y$(X1,{color:z,bold:!0,children:O},void 0,!1,void 0,this),y$(X1,{color:Z.colors.muted,children:"Subagent"},void 0,!1,void 0,this),y$(X1,{color:Z.colors.text.primary,bold:!0,children:G.type},void 0,!1,void 0,this),y$(X1,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),y$(X1,{color:Z.colors.text.secondary,children:G.description},void 0,!1,void 0,this),G.currentTool&&y$(Z9,{children:[y$(X1,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),y$(X1,{color:Z.colors.warning,children:G.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.status==="running"&&_>0&&y$(Z9,{children:[y$(X1,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),y$(X1,{color:Z.colors.info,children:UG(_)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.status==="failed"&&G.terminalSummary&&y$(Z9,{children:[y$(X1,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),y$(X1,{color:Z.colors.error,children:G.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},G.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as h2,Text as T1}from"ink";import GG from"react";import{jsxDEV as V$}from"react/jsx-dev-runtime";var X9={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},Q9=GG.memo(()=>{let $=R9().filter((Z)=>Z.status!=="deleted"),J=V0();if($.length===0)return null;return V$(h2,{flexDirection:"column",paddingX:2,children:$.map((Z)=>{let Y=Z.tasks.filter((X)=>X.status==="completed").length;return V$(h2,{flexDirection:"column",marginBottom:1,children:[V$(h2,{gap:1,children:[V$(T1,{bold:!0,color:Z.status==="failed"?J.colors.error:Z.status==="completed"?J.colors.success:J.colors.info,children:[X9[Z.status]," Team"]},void 0,!0,void 0,this),V$(T1,{bold:!0,color:J.colors.text.primary,children:Z.name},void 0,!1,void 0,this),V$(T1,{color:J.colors.muted,children:["| ",Z.members.length-1," members | ",Y,"/",Z.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V$(h2,{flexDirection:"column",paddingLeft:2,children:[Z.members.filter((X)=>X.status!=="leader").map((X)=>V$(h2,{gap:1,children:[V$(T1,{color:J.colors.muted,children:X9[X.status]},void 0,!1,void 0,this),V$(T1,{color:J.colors.text.secondary,children:X.name},void 0,!1,void 0,this),V$(T1,{color:J.colors.muted,children:["(",X.subagentType,", ",X.status,X.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},X.id,!0,void 0,this)),Z.tasks.map((X)=>V$(h2,{gap:1,children:[V$(T1,{color:J.colors.muted,children:X9[X.status]},void 0,!1,void 0,this),V$(T1,{color:J.colors.text.secondary,children:["#",X.id," ",X.subject]},void 0,!0,void 0,this),V$(T1,{color:J.colors.muted,children:["(",X.status,X.owner?`, ${X.owner}`:"",")"]},void 0,!0,void 0,this)]},X.id,!0,void 0,this))]},void 0,!0,void 0,this)]},Z.name,!0,void 0,this)})},void 0,!1,void 0,this)});Q9.displayName="TeamProgress";import{useMemoizedFn as KG}from"ahooks";import{Box as q1,Text as X0}from"ink";import qG from"ink-select-input";import{useState as mZ}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var pZ=K2.map(($)=>({label:$.label,value:$.id})),zG=({theme:$})=>{let{colors:J}=$;return i(q1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[i(X0,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),i(X0,{children:" "},void 0,!1,void 0,this),i(X0,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),i(X0,{children:[i(X0,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),i(X0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),i(X0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),i(X0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(X0,{children:[" ",i(X0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),i(X0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),i(X0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(X0,{children:[" ",i(X0,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),i(X0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),i(X0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),i(X0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(X0,{children:[" ",i(X0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),i(X0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),i(X0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(X0,{children:[" ",i(X0,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",i(X0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(X0,{children:" "},void 0,!1,void 0,this),i(X0,{color:J.error,children:["- print(",i(X0,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),i(X0,{color:J.success,children:["+ print(",i(X0,{color:J.syntax.string,children:['f"Hello, ',"{","name","}",'"']},void 0,!0,void 0,this),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},_G=({theme:$})=>{let{colors:J}=$;return i(q1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[i(X0,{children:" "},void 0,!1,void 0,this),i(X0,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),i(X0,{children:" "},void 0,!1,void 0,this),i(X0,{children:[i(X0,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),i(X0,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(X0,{children:[i(X0,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),i(X0,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(X0,{children:[i(X0,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),i(X0,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(X0,{children:[i(X0,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),i(X0,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(X0,{children:[i(X0,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),i(X0,{color:J.info,children:J.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},xZ=()=>{let $=f1(),J=W$.getCurrentThemeName(),Z=K2.findIndex((H)=>H.label===J),Y=Z>=0?K2[Z].theme:K2[0].theme,[X,Q]=mZ(Y),[U,q]=mZ(!1),K=KG(async(H)=>{if(U)return;q(!0);try{await q$().setTheme(H.value),$.closeModal()}catch(N){console.error("主题切换失败:",N instanceof Error?N.message:N)}finally{q(!1)}}),G=(H)=>{let N=K2.find((w)=>w.id===H.value);if(N)Q(N.theme)},z=X$()==="theme-selector",_=s0(!1);w0((H,N)=>{if(N.ctrl&&H==="c"||N.meta&&H==="c"){_();return}if(N.escape&&!U)$.closeModal()},{isActive:z});let W=(H)=>{let{isSelected:N,label:w}=H,T=w===J?"[OK]":" ";return i(X0,{color:N?X.colors.primary:X.colors.text.primary,children:[T," ",w]},void 0,!0,void 0,this)};return i(q1,{flexDirection:"column",height:"100%",children:[i(q1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:i(X0,{bold:!0,color:X.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(q1,{flexDirection:"row",flexGrow:1,children:[i(q1,{width:"40%",borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,children:i(q1,{flexDirection:"column",children:[i(q1,{paddingTop:1,paddingBottom:1,children:i(X0,{bold:!0,color:X.colors.text.primary,children:["可用主题 (",pZ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(qG,{items:pZ,initialIndex:Z>=0?Z:0,onSelect:K,onHighlight:G,itemComponent:W},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(q1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:X.colors.border.light,children:[i(zG,{theme:X},void 0,!1,void 0,this),i(_G,{theme:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),i(q1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:i(X0,{color:X.colors.text.muted,children:U?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as C4,Text as _1,useStdout as OG}from"ink";import NG,{useCallback as C1,useEffect as q2,useMemo as U9,useRef as E$,useState as z1}from"react";import{jsxDEV as T$}from"react/jsx-dev-runtime";function uZ($,J){let Z=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(Z.length,$.cursor+J))}}function FG($,J,Z){let Y=Array.from($.value);if(Z.leftArrow)return uZ($,-1);if(Z.rightArrow)return uZ($,1);if(Z.home)return{...$,cursor:0};if(Z.end)return{...$,cursor:Y.length};if(Z.backspace&&$.cursor>0)return Y.splice($.cursor-1,1),{value:Y.join(""),cursor:$.cursor-1};if(Z.delete&&$.cursor<Y.length)return Y.splice($.cursor,1),{value:Y.join(""),cursor:$.cursor};if(Z.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(Z.ctrl||Z.meta||J.length===0)return $;let X=J.replace(/[\r\n\t]+/g," ");if(X.length===0)return $;let Q=Array.from(X);return Y.splice($.cursor,0,...Q),{value:Y.join(""),cursor:$.cursor+Q.length}}function WG({editor:$}){let J=Array.from($.value),Z=J.slice(0,$.cursor).join(""),Y=J[$.cursor]??" ",X=J.slice($.cursor+1).join("");return T$(_1,{wrap:"truncate-end",children:["/",Z,T$(_1,{inverse:!0,children:Y},void 0,!1,void 0,this),X,T$(_1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function HG({line:$,matches:J,currentMatchIndex:Z,selected:Y,selectedBlock:X,color:Q,highlightColor:U}){let q=bZ($,J);if(Y||q.length===0)return T$(_1,{wrap:"truncate-end",color:Q,inverse:Y,bold:X,underline:X,children:$.text||" "},void 0,!1,void 0,this);let K=[],G=0;for(let O of q){if(O.start>G)K.push($.text.slice(G,O.start));K.push(T$(_1,{color:U,bold:!0,inverse:O.matchIndex===Z,children:$.text.slice(O.start,O.end)},`${$.key}:match:${O.matchIndex}`,!1,void 0,this)),G=O.end}if(G<$.text.length)K.push($.text.slice(G));return T$(_1,{wrap:"truncate-end",color:Q,bold:X,underline:X,children:K},void 0,!1,void 0,this)}var cZ=NG.memo(({isOpen:$,onClose:J,compact:Z=!1})=>{let Y=N8(),X=T8(),Q=y8(),U=C8(),q=H2(),K=X$(),G=V0(),{stdout:O}=OG(),{width:z,height:_}=P2(),W=Z?Math.max(6,Math.floor(_*0.4)):_,H=Math.max(1,W-3),N=Math.max(12,z-4),w=E$(new Map),y=E$(new G8),[T,B]=z1(new Set),C=E$(T);C.current=T;let F=U9(()=>AZ({messages:Y,currentStreamingMessageId:X,streamingLines:U.lines,streamingTail:U.tail,currentThinkingContent:Q,pendingCommands:q}),[Y,X,U.lines,U.tail,Q,q]),L=U9(()=>{let h=new Set(F.map((c)=>c.id));for(let c of w.current.keys())if(!h.has(c))w.current.delete(c);return F.flatMap((c,x)=>{let W0=T.has(c.id),y0=w.current.get(c.id),O$=y0?.revision===c.revision&&y0.width===N&&y0.expanded===W0?y0.lines:sJ(c,N,W0);if(O$!==y0?.lines)w.current.set(c.id,{revision:c.revision,width:N,expanded:W0,lines:O$});if(x===F.length-1)return O$;return[...O$,{key:`${c.id}:separator`,blockId:c.id,role:c.role,kind:c.kind,text:"",copyText:"",pending:c.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})},[F,N,T]),[A,R]=z1(0),[S,M]=z1(new Set),[k,P]=z1(null),D=E$(null),[e,$0]=z1(!1),m=E$(!1),[S0,o]=z1({value:"",cursor:0}),f=E$(S0),[v,g]=z1(""),[s,U0]=z1(0),V=E$(0),[Z0,n]=z1(null),b=E$(null),[I,j]=z1(null),p=E$(0),t=E$(null),l=E$(0),O0=E$(F),F0=E$(L.length),J0=E$(N);l.current=A,D.current=k,m.current=e,f.current=S0,V.current=s,b.current=Z0;let L0=U9(()=>y.current.search(F,v),[F,v]),G0=Math.max(0,L.length-H),l0=Math.max(0,L.length-A),Y$=Math.max(0,l0-H),m0=C1((h)=>{let c=Math.max(0,Math.min(G0,h));if(l.current=c,R(c),c===0)M(new Set)},[G0]),r0=C1((h)=>{if(L.length===0)return;let c=Math.max(0,Math.min(L.length-1,h)),x=Math.max(0,Math.min(L.length-H,c-Math.floor(H/2))),W0=Math.min(L.length,x+H);m0(L.length-W0)},[L.length,m0,H]),N$=C1((h,c,x)=>{let W0=new Set(C.current);if(c)W0.add(h);else W0.delete(h);C.current=W0,t.current=x,B(W0)},[]),u0=C1((h)=>{let c=F.find((W0)=>W0.id===h.blockId);if(c?.collapsible&&!C.current.has(c.id)){N$(c.id,!0,{blockId:c.id,match:h});return}let x=eJ(L,h);if(x>=0)r0(x)},[F,L,r0,N$]),F$=C1((h,c=L0)=>{if(c.length===0){V.current=0,U0(0);return}let x=(h%c.length+c.length)%c.length;V.current=x,U0(x);let W0=c[x];D.current=W0.blockId,P(W0.blockId),u0(W0)},[L0,u0]),D0=C1((h)=>{let c=F.filter((Z$)=>Z$.collapsible);if(c.length===0)return;let x=c.findIndex((Z$)=>Z$.id===D.current),W0=x<0?h>0?0:c.length-1:(x+h+c.length)%c.length,y0=c[W0].id;D.current=y0,P(y0);let O$=L.findIndex((Z$)=>Z$.blockId===y0&&Z$.header);if(O$>=0)r0(O$)},[F,L,r0]),S1=C1(()=>{let h=D.current;if(!h)h=L.slice(Y$,l0).find((x)=>F.some((W0)=>W0.id===x.blockId&&W0.collapsible))?.blockId??null;if(!h)return;if(!F.find((x)=>x.id===h)?.collapsible)return;D.current=h,P(h),N$(h,!C.current.has(h),{blockId:h})},[F,l0,L,N$,Y$]),Q1=C1((h,c)=>{let x=b.current;if(!x||L.length===0)return;let W0=c==="top"?0:c==="bottom"?L.length-1:Math.max(0,Math.min(L.length-1,x.head+h)),y0={...x,head:W0};b.current=y0,n(y0),r0(W0)},[L.length,r0]),_2=C1(()=>{let h=b.current;if(!h)return;let c=MZ(L,h.anchor,h.head);if(!c.trim()){j("Nothing selected");return}let x=++p.current;j("Copying..."),y4(c,{writeTerminal:(W0)=>O.write(W0)}).then((W0)=>{if(p.current!==x)return;j(W0.success?W0.method==="osc52"?"Copy sent via OSC 52":`Copied ${c.split(`
170
+ `).length} lines`:"Copy failed"),b.current=null,n(null)})},[L,O]);q2(()=>{if(!I)return;let h=setTimeout(()=>j(null),2500);return()=>clearTimeout(h)},[I]),q2(()=>{if(!$){p.current++,O0.current=F,F0.current=L.length;return}C.current=new Set,B(new Set),D.current=null,P(null),m.current=!1,$0(!1),f.current={value:"",cursor:0},o({value:"",cursor:0}),g(""),V.current=0,U0(0),b.current=null,n(null),j(null),l.current=0,R(0),M(new Set),O0.current=F,F0.current=L.length,J0.current=N},[$]),q2(()=>{let h=new Set(F.map((c)=>c.id));if(B((c)=>{let x=new Set([...c].filter((y0)=>h.has(y0)));return C.current=x,x.size===c.size&&[...x].every((y0)=>c.has(y0))?c:x}),D.current&&!h.has(D.current))D.current=null,P(null)},[F]),q2(()=>{let h=F0.current;if(F0.current=L.length,!$)return;let c=t.current;if(c){t.current=null;let W0=c.match?eJ(L,c.match):L.findIndex((y0)=>y0.blockId===c.blockId&&y0.header);if(W0>=0)r0(W0);return}if(l.current===0){M(new Set);return}let x=Math.max(0,L.length-h);if(x>0)R((W0)=>{let y0=Math.min(G0,W0+x);return l.current=y0,y0});else if(l.current>G0)l.current=G0,R(G0)},[N,T,$,L.length,G0,r0]),q2(()=>{let h=O0.current;if(O0.current=F,!$||l.current===0)return;let c=yZ(h,F);if(c.length===0)return;M((x)=>{let W0=new Set(x);for(let y0 of c)W0.add(y0);return W0})},[F,$]),q2(()=>{if(L0.length===0)V.current=0,U0(0);else if(V.current>=L0.length)V.current=L0.length-1,U0(L0.length-1)},[L0.length]),q2(()=>{if(J0.current===N)return;J0.current=N,b.current=null,n(null);let h=L0[V.current];if(h)u0(h)},[N,L0,u0]),w0((h,c)=>{if(!$)return;let x=c,W0=K==="transcript-pager";if((x.ctrl||x.meta)&&h.toLowerCase()==="o")return J(),!0;if(!W0){if(x.pageUp)return m0(l.current+Math.max(1,H-1)),!0;if(x.pageDown)return m0(l.current-Math.max(1,H-1)),!0;return!1}if(m.current){if(x.escape)return m.current=!1,$0(!1),f.current={value:v,cursor:Array.from(v).length},o(f.current),!0;if(x.return){let O$=f.current.value,Z$=y.current.search(F,O$);return g(O$),m.current=!1,$0(!1),F$(0,Z$),!0}let y0=FG(f.current,h,x);return f.current=y0,o(y0),!0}if(h==="q")return J(),!0;if(b.current){if(x.escape)return b.current=null,n(null),!0;if(h==="y"||x.ctrl&&!x.meta&&h.toLowerCase()==="c")return _2(),!0;if(x.upArrow||h==="k")return Q1(-1),!0;if(x.downArrow||h==="j")return Q1(1),!0;if(x.pageUp)return Q1(-Math.max(1,H-1)),!0;if(x.pageDown)return Q1(Math.max(1,H-1)),!0;if(x.home||h==="g")return Q1(0,"top"),!0;if(x.end||h==="G")return Q1(0,"bottom"),!0;return!0}if(x.escape)return J(),!0;if(h==="/"){let y0={value:v,cursor:Array.from(v).length};return f.current=y0,o(y0),m.current=!0,$0(!0),!0}if(h==="n"&&L0.length>0)return F$(V.current+1),!0;if(h==="N"&&L0.length>0)return F$(V.current-1),!0;if(x.tab)return D0(x.shift?-1:1),!0;if(x.return||h==="e")return S1(),!0;if(h==="v"){if(L.length===0)return!0;let y0=Math.max(0,L.length-l.current),O$=Math.max(0,y0-H),Z$=D.current?L.findIndex((q0)=>q0.blockId===D.current&&q0.header):-1,k$=Z$>=0?Z$:Math.max(0,Math.min(L.length-1,O$)),u={anchor:k$,head:k$};return b.current=u,n(u),r0(k$),!0}if(x.upArrow||h==="k")return m0(l.current+1),!0;if(x.downArrow||h==="j")return m0(l.current-1),!0;if(x.pageUp)return m0(l.current+Math.max(1,H-1)),!0;if(x.pageDown)return m0(l.current-Math.max(1,H-1)),!0;if(x.home||h==="g")return m0(G0),!0;if(x.end||h==="G")return m0(0),!0;return!0},{isActive:$,priority:100});let I$=L.slice(Y$,l0),r1=S.size,K0=L.length===0?"0/0":`${Math.min(l0,L.length)}/${L.length}`,M0=Z0?Math.min(Z0.anchor,Z0.head):-1,I0=Z0?Math.max(Z0.anchor,Z0.head):-1,Q0=v.length>0?`/${v} ${L0.length>0?`${s+1}/${L0.length}`:"0/0"}`:null,Y0=I?I:Z0?`${I0-M0+1} lines selected · y copy · Esc cancel`:Q0?`${Q0} · n/N`:r1>0?`${r1} new · G latest`:"Ctrl+O / Esc / q close";return T$(C4,{flexDirection:"column",width:"100%",height:W,paddingX:2,children:[T$(C4,{justifyContent:"space-between",flexShrink:0,children:[T$(_1,{bold:!0,color:G.colors.primary,children:"Transcript"},void 0,!1,void 0,this),T$(_1,{color:G.colors.text.muted,children:K0},void 0,!1,void 0,this)]},void 0,!0,void 0,this),T$(C4,{flexDirection:"column",height:H,flexShrink:0,overflow:"hidden",children:I$.length===0?T$(_1,{color:G.colors.text.muted,children:"No transcript yet"},void 0,!1,void 0,this):I$.map((h,c)=>{let x=Y$+c,W0=M0>=0&&x>=M0&&x<=I0,y0=h.header&&h.blockId===k,O$=h.pending?G.colors.warning:h.kind==="thinking"?G.colors.info:h.role==="user"?G.colors.info:h.role==="assistant"?G.colors.success:G.colors.text.secondary;return T$(HG,{line:h,matches:L0,currentMatchIndex:s,selected:W0,selectedBlock:y0,color:O$,highlightColor:G.colors.warning},h.key,!1,void 0,this)})},void 0,!1,void 0,this),T$(C4,{flexShrink:0,children:e?T$(WG,{editor:S0},void 0,!1,void 0,this):T$(_1,{color:I||r1>0?G.colors.warning:G.colors.text.muted,wrap:"truncate-end",children:[Y0," · / search · Tab/Enter expand · v/y copy · j/k PgUp/PgDn g/G"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{jsxDEV as g0}from"react/jsx-dev-runtime";var C$=V1("UI"),iZ=({debug:$,continue:J,...Z})=>{if($)C$.debug("[Debug] BladeInterface props:",{permissionMode:Z.permissionMode,yolo:Z.yolo,maxTurns:Z.maxTurns,continue:J});let Y=g2(!1),X=g2(!1),Q=g2(!1),U=g2(null),q=g2(!1),K=g2(null);if(!K.current)K.current=new n4;let G=K.current,[O,z]=lZ(G.getState()),[_,W]=lZ(!1),H=A9(),N=P9(),w=F8(),y=y9(),T=T9(),B=M9(),C=f1(),F=D1(),L=N2(),A=U1(),{stdout:R}=LG(),S=f9(),M=F2(),k=D9();o$(()=>{if(W$.getCurrentThemeName()!==k)try{W$.setTheme(k)}catch{}},[k]);let P=H==="ready",D=H==="needsSetup",e=H==="idle",$0=wG(()=>Z.agents?aZ(Z.agents):void 0,[Z.agents]),{confirmationState:m,confirmationHandler:S0,handleResponse:o,dismissAll:f}=fY(),{executeCommand:v,handleAbort:g,isProcessing:s,cleanupAgent:U0}=kY(Z.systemPrompt,Z.appendSystemPrompt,S0,Z.maxTurns,f,$0,{list:()=>G.listAll()});o$(()=>G.subscribe(z),[G]),o$(()=>()=>{G.close()},[G]);let{getPreviousCommand:V,getNextCommand:Z0,addToHistory:n}=SY();$6();let b=vY("",0),I=_$(()=>{c$(),R.write(dZ.eraseScreen+dZ.cursorTo(0,0)),F.incrementClearCount()}),j=_$(()=>{if(_)return;W(!0)}),p=_$(()=>{if(!_)return;W(!1)}),t=_$(()=>{if(_)p();else j()});w0((u,q0)=>{if(P&&!D&&(q0.ctrl||q0.meta)&&u.toLowerCase()==="o")return t(),!0;return!1},{priority:90}),o$(()=>{if(!q.current){q.current=!0;return}I()},[I,_]);let l=_$(async()=>{let u=M,q0;if(u==="default")q0="autoEdit";else if(u==="autoEdit")q0="plan";else if(u==="plan")q0="default";else q0="default";try{await i0.setSessionPermissionMode(L,A,q0),await q$().setPermissionMode(q0)}catch(a0){C$.error("权限模式切换失败:",a0 instanceof Error?a0.message:a0)}}),O0=_$(async(u)=>{try{let q0={displayName:u.displayName,provider:u.provider,model:u.model,overrides:u.overrides};if(u.modelProvider)await q$().addModelWithProvider(q0,u.modelProvider);else await q$().addModel(q0);C.setInitializationStatus("ready")}catch(q0){throw C$.error("初始化配置保存失败:",q0 instanceof Error?q0.message:q0),q0}}),F0=_$(()=>{if(w==="shortcuts")C.closeModal();else C.setActiveModal("shortcuts")}),J0=_$(async(u,q0,a0)=>{return E8({intent:q0,session:u,newSessionId:a0?.newSessionId,announceFork:a0?.announceFork,permissionModeOverride:Z.permissionMode},A,F,U0)}),L0=_$(async(u,q0,a0)=>{await GY(u,q0,{openHistory:(d0,p$)=>{C.showSessionHistoryViewer(d0,p$)},activateLocal:async(d0,p$)=>{await G.closeView(),await J0(d0,p$,a0),C.closeModal()}},a0)}),G0=_$(async(u,q0)=>{let p$=(await j8(q0,A,G)).filter((OX)=>OX.locator.sessionId===u);if(p$.length===0)throw Error(`Session not found: ${u}`);if(p$.length>1)throw Error(`Multiple workspaces contain session ${u}; use the session selector`);return p$[0]}),{showSuggestions:l0,suggestions:Y$,selectedSuggestionIndex:m0}=nY(b,v,V,Z0,n,g,s,l,F0,w==="shortcuts",w==="sessionHistoryViewer");o$(()=>{if(b.value&&w==="shortcuts")C.closeModal()},[b.value,w,C]);let r0=_$(async()=>{Q.current=!0;try{let u=Z.forkSession?"fork":"resume",q0=await j8(u,A,G);if(q0.length===0){if(Z.forkSession){C$.error("没有可供 fork 的历史会话"),n$(1);return}F.addAssistantMessage("没有找到历史会话,开始新对话。");return}let a0=e9(q0);if(!a0){if(Z.forkSession){C$.error("没有可供 fork 的本地历史会话"),n$(1);return}F.addAssistantMessage("没有找到本地历史会话,开始新对话。");return}await L0(a0,u,{newSessionId:Z.forkSession?Z.sessionId:void 0,announceFork:Z.forkSession?!1:void 0})}catch(u){if(C$.error("[BladeInterface] 继续会话失败:",u),Z.forkSession){n$(1);return}F.addAssistantMessage("继续会话失败,开始新对话。")}}),N$=_$(async()=>{Q.current=!0;try{if(typeof Z.resume==="string"&&Z.resume!=="true"){let a0=Z.forkSession?"fork":"resume",d0=await G0(Z.resume,a0);await L0(d0,a0,{newSessionId:Z.forkSession?Z.sessionId:void 0,announceFork:Z.forkSession?!1:void 0});return}let u=Z.forkSession?"fork":"resume",q0=await j8(u,A,G);if(q0.length===0)C$.error("没有找到历史会话"),n$(1);C.showSessionSelector(q0,u)}catch(u){C$.error("[BladeInterface] 加载会话失败:",u),n$(1)}});o$(()=>{if(Y.current)return;if(J){Y.current=!0,r0();return}if(Z.resume)Y.current=!0,N$()},[J,Z.resume,r0,N$]);let u0=_$(async(u)=>{let q0=m.details?.type;if(q0==="enterPlanMode"&&u.approved)try{await i0.setSessionPermissionMode(L,A,"plan"),await q$().setPermissionMode("plan"),C$.debug("[BladeInterface] Entered Plan mode")}catch(a0){C$.error("[BladeInterface] Failed to enter Plan mode:",a0)}if(q0==="exitPlanMode"&&u.approved)C$.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");o(u)}),F$=_$(()=>{F.addAssistantMessage("设置已取消"),F.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),F.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),n$(0)}),D0=_$(()=>{G.closeView(),C.closeModal()}),S1=_$(async(u)=>{try{let q0=y?.intent??"resume";await L0(u,q0,{newSessionId:q0==="fork"&&Z.forkSession?Z.sessionId:void 0})}catch(q0){C$.error("[BladeInterface] Failed to restore session:",q0),F.addAssistantMessage(`会话操作失败: ${q0 instanceof Error?q0.message:"未知错误"}`),C.closeModal()}}),Q1=_$(()=>{if(G.closeView(),Z.resume)n$(0);else C.closeModal()});o$(()=>{if(w==="sessionHistoryViewer"&&T){G.activate(T.session,T.intent);return}if(G.getState().status!=="idle")G.closeView()},[w,G,T]);let _2=_$((u)=>{C.showModelEditWizard(u)}),I$=_$((u)=>{F.addAssistantMessage(`已添加模型配置: ${u.displayName??u.model},并已切换到该模型`),D0()}),r1=_$((u)=>{F.addAssistantMessage(`已更新模型配置: ${u.displayName??u.model}`),D0()});o$(()=>{if(D){S.setFocus("model-config-wizard");return}if(m.isVisible)S.setFocus("confirmation-prompt");else if(w==="sessionSelector")S.setFocus("session-selector");else if(w==="sessionHistoryViewer")S.setFocus("session-history-viewer");else if(w==="themeSelector")S.setFocus("theme-selector");else if(w==="modelSelector")S.setFocus("model-selector");else if(w==="modelAddWizard"||w==="modelEditWizard")S.setFocus("model-config-wizard");else if(w==="permissionsManager")S.setFocus("permissions-manager");else if(w==="agentsManager")S.setFocus("agents-manager");else if(w==="agentCreationWizard")S.setFocus("agent-creation-wizard");else if(w==="skillsManager")S.setFocus("skills-manager");else if(w==="pluginsManager")S.setFocus("plugins-manager");else if(w==="hooksManager")S.setFocus("hooks-manager");else if(_)S.setFocus("transcript-pager");else if(w==="shortcuts")S.setFocus("main-input");else S.setFocus("main-input")},[D,m.isVisible,w,_,S.setFocus]),o$(()=>{if(!P||Q.current)return;if(rZ().length>0){Q.current=!0;return}Q.current=!0,F.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[P]),o$(()=>{if(!N)return;if(U.current===N)return;if(U.current=N,H==="error")F.addAssistantMessage(`初始化失败: ${N}`);else F.addAssistantMessage(`${N}`),F.addAssistantMessage("请重新尝试设置,或检查文件权限")},[N,H,F.addAssistantMessage]);let K0=_$(async(u)=>{try{await v({displayText:u,text:u,images:[],parts:[{type:"text",text:u}]})}catch(q0){let a0=q0 instanceof Error?q0.message:"无法发送初始消息";F.addAssistantMessage(`初始消息发送失败:${a0}`)}});o$(()=>{let u=Z.initialMessage?.trim();if(!u||X.current||!P||D)return;X.current=!0,n(u),K0(u)},[Z.initialMessage,P,D,v,n]);let M0=_$(async(u)=>{try{await q$().setPermissionMode(u)}catch(q0){C$.error("权限模式初始化失败:",q0 instanceof Error?q0.message:q0)}});if(o$(()=>{let u=Z.permissionMode;if($)C$.debug("[Debug] permissionMode from CLI:",u),C$.debug("[Debug] current permissionMode:",M);if(!u||u===M)return;M0(u)},[Z.permissionMode,M]),e)return null;if(D)return g0(oJ,{mode:"setup",onComplete:O0,onCancel:F$},void 0,!1,void 0,this);if($)C$.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:m.isVisible,activeModal:w});let I0=w==="modelSelector",Q0=B,Y0=w==="modelAddWizard"?"add":w==="modelEditWizard"&&Q0?"edit":null,h=I0||Boolean(Y0),c=w==="agentsManager",x=w==="agentCreationWizard",W0=w==="skillsManager",y0=w==="pluginsManager",O$=Q0?{displayName:Q0.displayName,provider:Q0.provider,model:Q0.model,overrides:Q0.overrides}:void 0,Z$=m.isVisible&&m.details?m.details.type==="mcpElicitation"&&m.details.mcpElicitation?g0(v3,{details:m.details.mcpElicitation,onComplete:(u,q0)=>u0({approved:u.action==="accept",elicitation:u,...q0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):m.details.type==="askUserQuestion"&&m.details.questions?g0(LZ,{questions:m.details.questions,onComplete:(u)=>u0({approved:!0,answers:u}),onCancel:()=>u0({approved:!1})},void 0,!1,void 0,this):g0($3,{details:m.details,onResponse:u0},void 0,!1,void 0,this):w==="themeSelector"?g0(xZ,{},void 0,!1,void 0,this):w==="permissionsManager"?g0(qZ,{onClose:D0},void 0,!1,void 0,this):w==="sessionSelector"?g0(SZ,{intent:y?.intent??"resume",sessions:y?.sessions??[],onSelect:S1,onCancel:Q1},void 0,!1,void 0,this):w==="sessionHistoryViewer"?g0(CZ,{state:O,onLoadOlder:(u)=>G.loadOlder(u),onFork:(u)=>G.fork(u),onClose:D0},void 0,!1,void 0,this):w==="hooksManager"?g0(Y3,{workspaceRoot:A,sessionId:L,onClose:D0},void 0,!1,void 0,this):null,k$=Boolean(Z$);return g0(R1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[Z$,g0(R1,{flexDirection:"column",display:k$||_?"none":"flex",children:[g0(u3,{active:!k$&&!_},void 0,!1,void 0,this),g0(gZ,{},void 0,!1,void 0,this),g0(Q9,{},void 0,!1,void 0,this),g0(Y9,{},void 0,!1,void 0,this),g0(S3,{paused:k$||_},void 0,!1,void 0,this),g0(M3,{input:b.value,cursorPosition:b.cursorPosition,onChange:b.setValue,onChangeCursorPosition:b.setCursorPosition,onAddPasteMapping:b.addPasteMapping,onAddImagePasteMapping:b.addImagePasteMapping,disabled:w==="sessionHistoryViewer"},void 0,!1,void 0,this),I0&&g0(R1,{marginTop:1,paddingX:2,children:g0(c3,{onClose:D0,onEdit:_2},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0&&g0(R1,{marginTop:1,paddingX:2,children:g0(oJ,{mode:Y0,modelId:Q0?.id,initialConfig:Y0==="edit"?O$:void 0,onComplete:Y0==="edit"?r1:I$,onCancel:D0},void 0,!1,void 0,this)},void 0,!1,void 0,this),c&&g0(R1,{marginTop:1,paddingX:2,children:g0(F6,{workspaceRoot:A,onComplete:D0,onCancel:D0},void 0,!1,void 0,this)},void 0,!1,void 0,this),x&&g0(R1,{marginTop:1,paddingX:2,children:g0(t2,{onComplete:D0,onCancel:D0},void 0,!1,void 0,this)},void 0,!1,void 0,this),W0&&g0(R1,{marginTop:1,paddingX:2,children:g0(vZ,{onComplete:D0,onCancel:D0},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0&&g0(R1,{marginTop:1,paddingX:2,children:g0(HZ,{workspaceRoot:A,onComplete:D0,onCancel:D0},void 0,!1,void 0,this)},void 0,!1,void 0,this),g0(P6,{suggestions:Y$,selectedIndex:m0,visible:l0&&!h},void 0,!1,void 0,this),g0(A6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g0(R1,{flexDirection:"column",display:_?"flex":"none",children:g0(cZ,{isOpen:_,compact:k$,onClose:p},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as BG,Text as d1}from"ink";import AG from"react";import{jsxDEV as I1}from"react/jsx-dev-runtime";class _8 extends AG.Component{constructor($){super($);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError($){return{hasError:!0,error:$,errorInfo:null}}componentDidCatch($,J){this.setState({error:$,errorInfo:J}),console.error("未捕获的错误:",$,J)}render(){if(this.state.hasError)return I1(BG,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[I1(d1,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),I1(d1,{children:" "},void 0,!1,void 0,this),I1(d1,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),I1(d1,{children:" "},void 0,!1,void 0,this),I1(d1,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),I1(d1,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),I1(d1,{children:" "},void 0,!1,void 0,this),I1(d1,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as z2,Text as k1}from"ink";import{useState as G9}from"react";import{jsxDEV as R$}from"react/jsx-dev-runtime";var R4=[{key:"update",label:"Update now",description:`runs \`${nZ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],sZ=({versionInfo:$,onComplete:J})=>{let[Z,Y]=G9(0),[X,Q]=G9(!1),[U,q]=G9(null);w0((G,O)=>{if(O.ctrl&&G==="c"){i2().shutdown("SIGINT",0);return}if(X||U)return;if(O.upArrow||G==="k")Y((z)=>z>0?z-1:R4.length-1);else if(O.downArrow||G==="j")Y((z)=>z<R4.length-1?z+1:0);else if(O.return)K(R4[Z].key);else if(G==="1")K("update");else if(G==="2")K("skip");else if(G==="3")K("skip_until_next")});let K=async(G)=>{switch(G){case"update":{Q(!0);let O=await tZ();q(O.message),setTimeout(()=>{i2().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await oZ($.latestVersion);J();break}};if(U)return R$(z2,{flexDirection:"column",marginY:1,children:R$(k1,{children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(X)return R$(z2,{flexDirection:"column",marginY:1,children:R$(k1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return R$(z2,{flexDirection:"column",marginY:1,children:[R$(k1,{color:"yellow",bold:!0,children:["Update available! ",R$(k1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),R$(z2,{marginTop:1,children:R$(k1,{color:"gray",children:["Release notes:"," ",R$(k1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R$(z2,{flexDirection:"column",marginTop:1,children:R4.map((G,O)=>{let z=O===Z,_=z?"› ":" ",W=`${O+1}. `;return R$(z2,{children:R$(k1,{color:z?"cyan":void 0,children:[_,W,G.label,G.description&&R$(k1,{color:"gray",children:[" (",G.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},G.key,!1,void 0,this)})},void 0,!1,void 0,this),R$(z2,{marginTop:1,children:R$(k1,{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 I4,Text as m2}from"ink";import{useState as eZ}from"react";import{jsxDEV as O1}from"react/jsx-dev-runtime";var $X=({status:$,onTrust:J,onContinueSafely:Z})=>{let Y=W$.getTheme(),[X,Q]=eZ(!1),[U,q]=eZ(null);return w0((K,G)=>{if(X)return;if(G.return||K.toLowerCase()==="t"){Q(!0),q(null),J().catch((O)=>{q(O instanceof Error?O.message:"Failed to trust workspace"),Q(!1)});return}if(K.toLowerCase()==="s"||G.escape)Q(!0),q(null),Z().catch((O)=>{q(O instanceof Error?O.message:"Failed to continue safely"),Q(!1)})}),O1(I4,{flexDirection:"column",paddingX:1,children:[O1(m2,{bold:!0,color:Y.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),O1(m2,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),O1(I4,{marginTop:1,flexDirection:"column",children:[O1(m2,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((K)=>O1(m2,{children:[" ",K.path," · ",K.effects.length," effect(s)"]},`${K.kind}:${K.path}`,!0,void 0,this))]},void 0,!0,void 0,this),U&&O1(I4,{marginTop:1,children:O1(m2,{color:Y.colors.error,children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),O1(I4,{marginTop:1,children:O1(m2,{bold:!0,children:X?"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 PG}from"ink";import{useEffect as bG}from"react";function JX(){let{stdout:$}=PG();bG(()=>{if(!$.isTTY)return;return $.write(G3),$.write(DJ),()=>{$.write(K3),$.write(DJ)}},[$])}function YX($){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=***")}function MG($){return $.forkSession?void 0:$.resumeSessionId}function ZX($,J){let Z=MG($);if(Z)J(Z)}import{jsxDEV as l1}from"react/jsx-dev-runtime";function TG($){if(U$().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");H$().setInitializationStatus("ready")}var CG=($)=>{JX();let[J,Z]=S4(!1),[Y,X]=S4(null),[Q,U]=S4(!1),[q,K]=S4(null),G=k4((W,H)=>{let N=W instanceof Error?W.message:String(W);if(H$().setInitializationError(N),H$().setInitializationStatus("error"),Z(!0),H)console.error("[FAIL] 应用初始化失败:",N)}),O=k4(async()=>{try{let W=U$().config.config??QX,H=UX(W,$);if(TG(H),ZX(H,(w)=>{GX().restoreSession(w,[])}),H.debug)console.error("[Debug] 运行时配置:",H);let N=H.codeTheme;if(N&&W$.hasTheme(N)){if(W$.setTheme(N),$.debug)console.log(`[OK] 已加载主题: ${N}`)}try{j$.getInstance().loadConfig(H.hooks||{},K$());let y=await KX(K$());if($.debug&&H.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${y.subagents.getAllNames().length} agents, ${y.skills.size} skills, ${y.commands.getCommandCount()+y.commands.getPluginCommandCount()} commands, ${y.plugins.getAll().length} plugins`);let B=U$().session.sessionId;XX(B)}catch(w){if($.debug)console.warn("Hooks 初始化失败:",YX(w))}g8(async()=>{await zX.getInstance().killAll(),await qX.getInstance().disconnectAll(),j$.getInstance().cleanup()}),Z(!0)}catch(W){G(W,!!$.debug)}}),z=k4(async()=>{let W=await K9.getInstance().getStatus(K$());if(W.state==="untrusted"||W.state==="error"){K(W);return}await O()}),_=k4(async()=>{if($.versionCheckPromise){let W=await $.versionCheckPromise;if(W){X(W),U(!0);return}}await z()});if(yG(()=>{_()},[]),Q&&Y)return l1(_8,{children:l1(sZ,{versionInfo:Y,onComplete:()=>{U(!1),z()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(q)return l1(_8,{children:l1($X,{status:q,onTrust:async()=>{await K9.getInstance().trust(K$()),await _X(),K(null),await O()},onContinueSafely:async()=>{K(null),await O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!J)return null;return l1(_8,{children:l1(iZ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},vB=($)=>l1(hY,{children:l1(CG,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{vB as AppWrapper};