blade-code 0.10.205 → 0.10.206

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 (142) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-09kqfdpa.js +3 -0
  3. package/dist/{chunk-efjjkha8.js → chunk-0ef47wgr.js} +2 -2
  4. package/dist/chunk-1j39te3t.js +23 -0
  5. package/dist/{chunk-fdr4fcrf.js → chunk-1n4v80hy.js} +1 -1
  6. package/dist/{chunk-ynd1v33f.js → chunk-28n945me.js} +2 -2
  7. package/dist/{chunk-ys8gysg8.js → chunk-28tzj187.js} +1 -1
  8. package/dist/{chunk-qtwgm95z.js → chunk-3crwyd2r.js} +3 -3
  9. package/dist/{chunk-zfxcef0z.js → chunk-50vwafn5.js} +1 -1
  10. package/dist/chunk-514va7ce.js +2 -0
  11. package/dist/{chunk-kkzznz4w.js → chunk-53vh6vpt.js} +1 -1
  12. package/dist/chunk-5k8k56f2.js +731 -0
  13. package/dist/{chunk-515yj7mt.js → chunk-65wc1h38.js} +1 -1
  14. package/dist/{chunk-xbs91jd8.js → chunk-67wy9mm7.js} +2 -2
  15. package/dist/chunk-6p0hkf4f.js +1 -0
  16. package/dist/{chunk-qdbbke8f.js → chunk-6xzk4hsg.js} +1 -1
  17. package/dist/chunk-793wjhvz.js +332 -0
  18. package/dist/{chunk-rtwd35gd.js → chunk-826xegd8.js} +2 -2
  19. package/dist/chunk-867bpjzg.js +1 -0
  20. package/dist/{chunk-zj1g4nbq.js → chunk-870szc6v.js} +1 -1
  21. package/dist/chunk-983hqzat.js +1 -0
  22. package/dist/{chunk-0eajnhrj.js → chunk-9kj19a8t.js} +1 -1
  23. package/dist/{chunk-430b319j.js → chunk-9sf1t8gw.js} +1 -1
  24. package/dist/chunk-9tpzmy8v.js +4 -0
  25. package/dist/chunk-af0m5227.js +1 -0
  26. package/dist/{chunk-f8kjdxz7.js → chunk-asgmmaec.js} +2 -2
  27. package/dist/{chunk-vz88tqtd.js → chunk-av799ng5.js} +2 -2
  28. package/dist/{chunk-bwe49m6n.js → chunk-az3rehz9.js} +360 -360
  29. package/dist/{chunk-p0wyhp5a.js → chunk-dnpkf5mv.js} +2 -2
  30. package/dist/chunk-dpg006xj.js +1 -0
  31. package/dist/{chunk-xmymx75h.js → chunk-e0ft3vwg.js} +1 -1
  32. package/dist/chunk-e45r1a8r.js +25 -0
  33. package/dist/{chunk-g01mth5d.js → chunk-ebpg1srd.js} +2 -2
  34. package/dist/{chunk-4wx5sya5.js → chunk-ed2hdrwe.js} +1 -1
  35. package/dist/{chunk-7ajvrtb3.js → chunk-erhaedch.js} +1 -1
  36. package/dist/{chunk-kehgewqh.js → chunk-ewwrss2w.js} +1 -1
  37. package/dist/{chunk-kf9gj2gn.js → chunk-fc1gz532.js} +2 -2
  38. package/dist/{chunk-9jz1q7bk.js → chunk-fd0a8h55.js} +2 -2
  39. package/dist/{chunk-qp2qc4p2.js → chunk-fnmqxhv1.js} +2 -2
  40. package/dist/chunk-g7tphxme.js +6 -0
  41. package/dist/{chunk-eg3ms291.js → chunk-gmpsfkgg.js} +1 -1
  42. package/dist/chunk-gpnkxh4c.js +1 -0
  43. package/dist/{chunk-b8ast0cp.js → chunk-gz84aewr.js} +1 -1
  44. package/dist/{chunk-xxbxc31z.js → chunk-h4k69z1b.js} +1 -1
  45. package/dist/{chunk-17d4m89n.js → chunk-h6ahwwpa.js} +2 -2
  46. package/dist/chunk-hpge30p8.js +8 -0
  47. package/dist/{chunk-1cy4ab77.js → chunk-hv8nt7wj.js} +1 -1
  48. package/dist/chunk-mtvbm7xe.js +1 -0
  49. package/dist/chunk-mys9mmcp.js +1 -0
  50. package/dist/{chunk-wezr6wfq.js → chunk-n34qsnks.js} +1 -1
  51. package/dist/chunk-n5jzmwhy.js +25 -0
  52. package/dist/chunk-new78c3h.js +1 -0
  53. package/dist/{chunk-8pd1hp4r.js → chunk-nj6kpdte.js} +2 -2
  54. package/dist/chunk-nng1xbsm.js +10 -0
  55. package/dist/{chunk-xyypxrad.js → chunk-p2y1zqsb.js} +2 -2
  56. package/dist/chunk-p8vpvx07.js +12 -0
  57. package/dist/{chunk-w42j9p3t.js → chunk-pdna2qvv.js} +2 -2
  58. package/dist/{chunk-gn9er641.js → chunk-pga8gxtf.js} +1 -1
  59. package/dist/chunk-pt0y4zrg.js +14 -0
  60. package/dist/{chunk-5zmp7p0n.js → chunk-q6abav45.js} +51 -51
  61. package/dist/chunk-r4em0ha7.js +1 -0
  62. package/dist/chunk-rdzbd5vk.js +1 -0
  63. package/dist/chunk-sbfe9vh3.js +94 -0
  64. package/dist/chunk-sqk8cnej.js +44 -0
  65. package/dist/{chunk-5yyp6njq.js → chunk-t0gm0pn1.js} +1 -1
  66. package/dist/{chunk-egss0m1x.js → chunk-tsm8rhmd.js} +1 -1
  67. package/dist/chunk-tzvb0nd2.js +2 -0
  68. package/dist/{chunk-kvp523gt.js → chunk-v4cxk10d.js} +1 -1
  69. package/dist/{chunk-ak5xvsxr.js → chunk-v5vx6nz9.js} +1 -1
  70. package/dist/{chunk-qq5y7b2r.js → chunk-vx2g1faw.js} +1 -1
  71. package/dist/chunk-w6zat4v4.js +1 -0
  72. package/dist/chunk-wsd3rn0q.js +1 -0
  73. package/dist/{chunk-c51wwnh2.js → chunk-xcq0cehr.js} +5 -6
  74. package/dist/chunk-yjjxv7fn.js +352 -0
  75. package/dist/{chunk-6169xxb4.js → chunk-yzf2jpam.js} +2 -2
  76. package/dist/web/assets/{ChatView-BF6HUrBw.js → ChatView-lUD-61n0.js} +4 -4
  77. package/dist/web/assets/{CodeBlockHighlighter-C4CgCiRf.js → CodeBlockHighlighter--TbfcBxW.js} +1 -1
  78. package/dist/web/assets/FilePreview-R6OKQPf2.js +55 -0
  79. package/dist/web/assets/{KanbanBoard-DDXB-yq1.js → KanbanBoard-BHOKtiv5.js} +1 -1
  80. package/dist/web/assets/{MarkdownRenderer-DS7RznBE.js → MarkdownRenderer-DqxNq8pa.js} +3 -3
  81. package/dist/web/assets/{ScrollArea-BM9NzGZM.js → ScrollArea-Dhu0B-zB.js} +1 -1
  82. package/dist/web/assets/{SessionHistorySurface-DnRySeLE.js → SessionHistorySurface-aZvoj3ma.js} +1 -1
  83. package/dist/web/assets/{SettingsModal-D5YLUtIo.js → SettingsModal-C7QBnIqa.js} +1 -1
  84. package/dist/web/assets/{Sidebar-BZC6OkDJ.js → Sidebar-Bznnq91x.js} +1 -1
  85. package/dist/web/assets/{TaskSwitcher-WewOkw5m.js → TaskSwitcher-DJczhDRp.js} +1 -1
  86. package/dist/web/assets/{TerminalPanel-C5SGdRNr.js → TerminalPanel-Vk4p0V3p.js} +1 -1
  87. package/dist/web/assets/{archive-DkczUU08.js → archive-0hLYBKQf.js} +1 -1
  88. package/dist/web/assets/{arrow-left-9pBiQwu7.js → arrow-left-CXb6Gqf3.js} +1 -1
  89. package/dist/web/assets/{calendar-clock-BFnUlxrU.js → calendar-clock-DiaFI9Jk.js} +1 -1
  90. package/dist/web/assets/{chevron-right-yCVkAEcj.js → chevron-right-CcPXH37D.js} +1 -1
  91. package/dist/web/assets/{clock-3-CcoWoRQs.js → clock-3-D6VR6gJc.js} +1 -1
  92. package/dist/web/assets/{copy-HJF0oQBS.js → copy-C3eUAQgp.js} +1 -1
  93. package/dist/web/assets/{download-DSBCIqk3.js → download-DHvS9tI3.js} +1 -1
  94. package/dist/web/assets/{external-link-zIgEO0KB.js → external-link-BDVaEuqY.js} +1 -1
  95. package/dist/web/assets/{folder-BdRo64o3.js → folder-B80Ac6rr.js} +1 -1
  96. package/dist/web/assets/index-VwIiNjc8.css +1 -0
  97. package/dist/web/assets/{index-BVDkKudh.js → index-YqughEZk.js} +4 -4
  98. package/dist/web/assets/{message-square-plus-3klTXO0S.js → message-square-plus-D15quyPH.js} +1 -1
  99. package/dist/web/assets/{pause-B9Q5JWvH.js → pause-BjMlj6Bx.js} +1 -1
  100. package/dist/web/assets/{pencil-CbYIz1b1.js → pencil-BMoJvcB7.js} +1 -1
  101. package/dist/web/assets/{play-CZMTj43e.js → play-BHh4py3p.js} +1 -1
  102. package/dist/web/assets/{plus-Cc7I8fhb.js → plus-DeFz_gQq.js} +1 -1
  103. package/dist/web/assets/session-events-DCHBz9We.js +25 -0
  104. package/dist/web/assets/{settings-DSF3exX2.js → settings-CI8xbId2.js} +1 -1
  105. package/dist/web/assets/{team-qfeJHL9s.js → team-zZ803hH9.js} +1 -1
  106. package/dist/web/assets/{teamService-Bs9qBKI8.js → teamService-CgLBXgmv.js} +1 -1
  107. package/dist/web/assets/{terminal-DQLqe-Ed.js → terminal-1WxSJ47E.js} +1 -1
  108. package/dist/web/index.html +2 -2
  109. package/package.json +1 -1
  110. package/dist/chunk-18swytk4.js +0 -25
  111. package/dist/chunk-3297ghav.js +0 -1
  112. package/dist/chunk-33ck9ryb.js +0 -1
  113. package/dist/chunk-4fa11h6f.js +0 -94
  114. package/dist/chunk-535s1mm8.js +0 -1
  115. package/dist/chunk-57939tb3.js +0 -8
  116. package/dist/chunk-6v0cdqkw.js +0 -1
  117. package/dist/chunk-8kwj6px8.js +0 -1
  118. package/dist/chunk-a8z11yd2.js +0 -3
  119. package/dist/chunk-aatfjx15.js +0 -2
  120. package/dist/chunk-b2ek44t5.js +0 -12
  121. package/dist/chunk-b9d0ex8n.js +0 -4
  122. package/dist/chunk-ccgtbzrz.js +0 -14
  123. package/dist/chunk-jgxfhk9k.js +0 -733
  124. package/dist/chunk-jhpwwwjt.js +0 -1
  125. package/dist/chunk-jjj86dej.js +0 -1
  126. package/dist/chunk-kejvty9z.js +0 -23
  127. package/dist/chunk-mhe1zppc.js +0 -1
  128. package/dist/chunk-pb1q26gw.js +0 -181
  129. package/dist/chunk-pc5f77qh.js +0 -1
  130. package/dist/chunk-pkx6kfy6.js +0 -1
  131. package/dist/chunk-qjptyj18.js +0 -1
  132. package/dist/chunk-shgxzmdw.js +0 -1
  133. package/dist/chunk-thytjs86.js +0 -44
  134. package/dist/chunk-tm3789m3.js +0 -2
  135. package/dist/chunk-tnmcrvk2.js +0 -25
  136. package/dist/chunk-wejthch2.js +0 -1
  137. package/dist/chunk-xv6ejk2z.js +0 -353
  138. package/dist/chunk-yvgef7rp.js +0 -10
  139. package/dist/chunk-zj48897e.js +0 -6
  140. package/dist/web/assets/FilePreview-BS4PgFKb.js +0 -55
  141. package/dist/web/assets/index-CaCifsSK.css +0 -1
  142. package/dist/web/assets/session-events-NEjosinC.js +0 -31
@@ -1,16 +1,16 @@
1
- import{e as JX,f as YX,h as S$,i as T4}from"./chunk-b8ast0cp.js";import{l as YZ,m as XZ,n as ZZ}from"./chunk-515yj7mt.js";import{A as q4,y as MJ,z as TJ}from"./chunk-qp2qc4p2.js";import{Aa as QY,Ca as UY,Ea as lY,I as dY,M as LZ,O as m6,P as y6,Q as jY,W as AY,X as bY,_ as MY,da as i$,fa as SJ,ga as kJ,ia as TY,ka as q8,la as BX,ma as wX,pa as PX,qa as AX,ua as a9,va as w3,xa as F3,ya as L3,za as BZ}from"./chunk-bwe49m6n.js";import"./chunk-g01mth5d.js";import{Ma as E5,Na as g5,Oa as m5,Ra as FZ}from"./chunk-tnmcrvk2.js";import{Ta as PY}from"./chunk-kf9gj2gn.js";import{Mb as BY,Nb as F4,Zb as wY,ic as b6}from"./chunk-pb1q26gw.js";import{tc as H8}from"./chunk-fdr4fcrf.js";import{Dd as _Y,Nd as bJ,Od as m2,Sd as yJ,Xd as IJ,Zd as t8,fe as z8,ie as a0}from"./chunk-4fa11h6f.js";import"./chunk-egss0m1x.js";import{Me as vJ,Ne as A6,Oe as VJ}from"./chunk-xv6ejk2z.js";import{jf as JY,kf as U4}from"./chunk-efjjkha8.js";import{xf as $Z}from"./chunk-8pd1hp4r.js";import{Bf as Y1,yf as W8,zf as _4}from"./chunk-xbs91jd8.js";import"./chunk-p0wyhp5a.js";import{Ff as R2,Gf as L$,Hf as a1,If as z9,Jf as o8,Kf as CJ,Lf as s3,Mf as I9,Nf as a5,Of as e3,Pf as v2,Qf as m0,Rf as HZ,Sf as B$,Tf as eX,Uf as i4,Vf as O8,Yf as $Y,dg as z$}from"./chunk-18swytk4.js";import"./chunk-5yyp6njq.js";import"./chunk-v508x7cg.js";import"./chunk-57939tb3.js";import"./chunk-ynd1v33f.js";import{vg as S9}from"./chunk-w42j9p3t.js";import"./chunk-zfxcef0z.js";import"./chunk-xyypxrad.js";import{Ig as W4,Kg as pX,Pg as LX,Yg as WZ}from"./chunk-jgxfhk9k.js";import"./chunk-kehgewqh.js";import"./chunk-kkzznz4w.js";import"./chunk-1cy4ab77.js";import"./chunk-7ajvrtb3.js";import{Ah as h$,yh as O9}from"./chunk-c51wwnh2.js";import"./chunk-ys8gysg8.js";import{Ih as mJ,Pi as OZ,Ui as FX,Vi as NZ}from"./chunk-thytjs86.js";import{Wi as p2,Xi as e8,Zi as N9}from"./chunk-tm3789m3.js";import{cj as K$}from"./chunk-qdbbke8f.js";import"./chunk-wezr6wfq.js";import{Bj as _Z,Ej as H1}from"./chunk-a8z11yd2.js";import{Mj as s5,Nj as e5,Qj as R1}from"./chunk-qtwgm95z.js";import"./chunk-0eajnhrj.js";import{ak as c5}from"./chunk-6169xxb4.js";import{ek as l9}from"./chunk-f8kjdxz7.js";import{fk as K8,zk as eJ}from"./chunk-4wx5sya5.js";import{Mk as Y4}from"./chunk-eg3ms291.js";import{useMemoizedFn as G6}from"ahooks";import{useEffect as _z,useState as K6}from"react";import{useMemoizedFn as i0}from"ahooks";import tX from"ansi-escapes";import{Box as m1,useStdout as Zz}from"ink";import{useEffect as J1,useMemo as Qz,useRef as I2,useState as sX}from"react";import{useShallow as AZ}from"zustand/react/shallow";import{useStore as PZ}from"zustand";function z0($){return PZ(v2,$)}var bZ=[],V2=()=>z0(($)=>$.session.sessionId),O1=()=>z0(($)=>$.session.workspaceRoot),V8=()=>z0(($)=>$.session.messages),i9=()=>z0(($)=>$.session.clearCount),o9=()=>z0(($)=>$.session.isCompacting),n9=()=>z0(($)=>$.session.tokenUsage.estimatedCostUsd),t9=()=>z0(($)=>{let{totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:Z}=$.session.tokenUsage;return a9({totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:Z}).hitRate});var j8=()=>z0(($)=>$.session.providerRecovery),s9=()=>z0(($)=>$.session.turnActivity),e9=()=>z0(($)=>$.session.actionStationarity),d1=()=>z0(($)=>$.session.actions),$J=()=>z0(($)=>{let{totalTokens:J,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let Z=Math.max(0,100-J/Y*100);return Math.round(Z)}),JJ=()=>z0(($)=>$.app.initializationStatus),YJ=()=>z0(($)=>$.app.initializationError),j2=()=>z0(($)=>$.app.activeModal),XJ=()=>z0(($)=>$.app.tasks),ZJ=()=>z0(($)=>$.app.modelEditorTarget),QJ=()=>z0(($)=>$.app.sessionSelectorData),UJ=()=>z0(($)=>$.app.sessionHistoryViewerData),GJ=()=>z0(($)=>$.app.taskAttentionStatus),h8=()=>z0(($)=>$.app.taskAttentionUnreadKeys),KJ=()=>z0(($)=>$.app.awaitingSecondCtrlC),N1=()=>z0(($)=>$.app.actions),h2=()=>z0(($)=>$.app.sideConversation),zJ=()=>z0(($)=>$.app.teams),E8=()=>z0(($)=>$.app.initializationStatus==="ready"),qJ=()=>z0(($)=>$.app.tasks.length>0),E2=()=>z0(($)=>$.config.config?.permissionMode||"default"),_J=()=>z0(($)=>$.config.config?.models??bZ),g8=()=>z0(($)=>{let J=$.config.config;if(!J)return;let Y=J.currentModelId;return J.models.find((X)=>X.id===Y)??J.models[0]}),m8=()=>z0(($)=>$.config.config?.currentModelId),OJ=()=>z0(($)=>$.config.config?.agentTeamsEnabled===!0),D0=()=>z0(($)=>{return L$.getTheme()}),NJ=()=>z0(($)=>$.config.config?.codeTheme??"default"),s0=()=>z0(($)=>$.focus.currentFocus),HJ=()=>z0(($)=>$.focus.actions),g2=()=>z0(($)=>$.command.isProcessing),WJ=()=>z0(($)=>$.command.actions),p8=()=>z0(($)=>$.app.followUpQueue),FJ=()=>z0(($)=>$.app.followUpQueueMutation),LJ=()=>z0(($)=>$.command.recoveredSteeringCount),x8=()=>z0(($)=>$.app.reasoningEffort!=="off"),c8=()=>z0(($)=>$.app.reasoningEffort),u8=()=>z0(($)=>$.app.serviceTier),d8=()=>z0(($)=>$.app.responseVerbosity),l8=()=>z0(($)=>$.app.communicationStyle),r8=()=>z0(($)=>$.session.currentThinkingContent),BJ=()=>z0(($)=>$.session.thinkingExpanded),a8=()=>z0(($)=>$.session.currentStreamingMessageId),i8=()=>z0(AZ(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),wJ=()=>z0(($)=>$.session.finalizingStreamingMessageId),PJ=()=>z0(($)=>$.session.historyExpanded),AJ=()=>z0(($)=>$.session.expandedMessageCount);import{randomUUID as H7}from"node:crypto";import{useMemoizedFn as X1}from"ahooks";import{useEffect as l1,useMemo as FY,useRef as N4}from"react";function MZ($,J){try{return $.code===J.code&&$.message===J.message&&$.retryable===J.retryable&&$.resource===J.resource}catch{return!1}}class q6{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((Y)=>{this.handleUnexpectedFailure(Y,$)})})}catch(Y){this.handleUnexpectedFailure(Y,$)}}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={},Y=new AbortController,Z=this.wakeEpoch,X=this.idleEpoch;if(this.attempt++,this.recoveryStartedAt===null)this.recoveryStartedAt=this.now(),this.installDeadlineTimer($);this.activeAttemptToken=J,this.activeRunController=Y;let Q;try{Q=await this.options.run(Y.signal)}finally{if(this.activeAttemptToken===J){if(this.activeAttemptToken=null,this.activeRunController=null,!this.disposed&&$!==this.generation)this.scheduleIfRunnable()}}if(this.disposed||$!==this.generation)return;if(Q.status==="completed"){let U=this.wakeEpoch!==Z;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 Y=m2($.taskFailure),Z=this.options.sessionIdentity;if($.workKind!=="pending_input"||!$.evidence||!Z||!MZ($.taskFailure,$.evidence.taskFailure)){this.terminate("failed",this.attempt,Y);return}let X=TJ({sessionIdentity:Z,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,Y);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),m2($),"pending-resume-coordinator-failed")}installDeadlineTimer($){let J={},Y=this.setTimerCallback(()=>{if(this.disposed||$!==this.generation||this.deadlineTimer?.token!==J)return;this.deadlineTimer=null,this.terminate("exhausted",Math.max(1,this.attempt),bJ("timeout"),"pending-resume-recovery-deadline-exceeded")},MJ);this.deadlineTimer={handle:Y,token:J},Y.unref?.()}terminate($,J,Y,Z){let X=this.activeRunController;if(this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget(),Z)X?.abort(Z);try{this.options.onTerminalFailure?.({phase:$,attempt:J,taskFailure:Y})}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 U8{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)o8(J,$.extraContent);CJ(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function TZ($){if(!($ instanceof Error))return"未知错误";let Z=$.lastError??$;if(Z.responseBody)try{let U=JSON.parse(Z.responseBody)?.error?.message;if(U){let G=Z.statusCode?` (HTTP ${Z.statusCode})`:"";return`${U}${G}`}}catch{}let X=$.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return $.message}function CZ($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function RZ($){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 n8($){let J=CZ($),Y=RZ($),Z;if(Y)Z="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Z=TZ($);return{displayMessage:Z,isAbort:J,isVisionNotSupported:Y}}import{appendFileSync as yZ,mkdirSync as IZ,writeFileSync as SZ}from"node:fs";import kZ from"node:os";import _6 from"node:path";var RJ=null;function DZ(){let $=process.env.BLADE_STORAGE_ROOT||_6.join(kZ.homedir(),".blade");return _6.join($,"logs","stream-debug.log")}function fZ($){if(RJ===$)return;let J=_6.dirname($);IZ(J,{recursive:!0,mode:493}),SZ($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
- `),RJ=$}function O6($,J,Y){try{let Z=DZ();fZ(Z);let X=new Date().toISOString(),Q=Y?` | ${JSON.stringify(Y)}`:"",U=`[${X}] [${$}] ${J}${Q}
3
- `;yZ(Z,U)}catch{}}var G8=H1("UI");function N6($,J){if(J.state==="requires_attention"){let Y=J.reason==="interrupted_tool_call";$.addToolMessage("Turn recovery requires attention",{toolName:"Runtime Recovery",phase:"complete",summary:Y?"An interrupted tool may have partially completed":"A completed tool may already have changed external state",detail:`${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 DJ($,J){let Y=$.streamSession??new U8({signal:$.signal,streamingBuffer:$.streamingBuffer,getStreamingMessageId:$.getStreamingMessageId,finalizeStreamingMessage:$.sessionActions.finalizeStreamingMessage,discardStreamingMessage:$.sessionActions.discardStreamingMessage,clearThinking:()=>$.sessionActions.setCurrentThinkingContent(null)}),Z=(X)=>{for(let Q of X){if((Q.origin??"user")!=="user")continue;let U=$.commandActions.takeFollowUpPresentation(Q.id);if(U){$.sessionActions.addUserMessage(U.displayText);continue}if(!Q.recovered||Q.persisted)continue;let G=typeof Q.content==="string"?Q.content:Q.content.map((z)=>z.type==="text"?z.text:"[Image]").join(`
4
- `);$.sessionActions.addUserMessage(G)}};return(X)=>{switch(X.kind){case"content_delta":if(X.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;J.contentDeltaCount++,J.contentDeltaTotalLen+=X.delta.length,O6("loopEventHandler","onContentDelta",{callCount:J.contentDeltaCount,deltaLen:X.delta.length,totalLen:J.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(X.delta);break;case"thinking_delta":if(X.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(X.delta);break;case"stream_end":{$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),G8.debug("[loopEventHandler] stream_end",{contentDeltaCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Y.isFinalized,signalAborted:$.signal.aborted}),O6("loopEventHandler","onStreamEnd",{contentDeltaCallCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Y.isFinalized,signalAborted:$.signal.aborted}),Y.finalize();break}case"model_fallback":$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y.discard();break;case"provider_admission":{let{kind:Q,...U}=X;$.sessionActions.setProviderAdmission(X.phase==="queued"?U:null);break}case"provider_circuit":{let{kind:Q,...U}=X;$.sessionActions.setProviderCircuit(X.phase==="closed"?null:U);break}case"provider_retry":{let{kind:Q,...U}=X;$.sessionActions.setProviderRetry(X.phase==="recovered"?null:U);break}case"provider_stall":{let{kind:Q,...U}=X;$.sessionActions.setProviderStall(X.phase==="detected"?U:null);break}case"provider_recovery":$.sessionActions.setProviderRecovery(X.recovery);break;case"action_stationarity":{let{kind:Q,...U}=X;$.sessionActions.setActionStationarity(X.phase==="recovered"?null:U);break}case"turn_recovery":{N6($.sessionActions,X.assessment);break}case"tool_start":{J.toolExecutionStarted=!0;let Q=X.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;if(G8.debug("[loopEventHandler] tool_start",{toolName:Q.function.name,toolKind:X.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Q.function.name))break;try{let U=JSON.parse(Q.function.arguments),G=SJ(Q.function.name,U);$.sessionActions.addToolMessage(G,{toolCallId:Q.id,toolName:Q.function.name,phase:"start",summary:G,params:U})}catch(U){G8.error("[loopEventHandler] onToolStart error:",U)}break}case"tool_progress":{J.toolExecutionStarted=!0;let Q=X.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;let U=X.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((X.update.progress??0)/X.update.total*100)))}%`:"",G=`${Q.function.name}${U}: ${X.update.message}`;$.sessionActions.addToolMessage(G,{toolCallId:Q.id,toolName:Q.function.name,phase:"progress",summary:G,...X.update.admission?{admission:X.update.admission}:{}});break}case"tool_result":{J.toolExecutionStarted=!0;let Q=X.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;G8.debug("[loopEventHandler] tool_result",{toolName:Q.function.name,success:X.result.success});let U=IJ(kJ(Q.function.name,X.result),yJ);$.sessionActions.addToolMessage(U.summary,{toolCallId:Q.id,toolName:Q.function.name,phase:"complete",summary:U.summary,detail:U.detail});break}case"structured_output":J.outputStarted=!0,$.sessionActions.replaceLastAssistantMessage(JSON.stringify(X.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(X.usage);break;case"compaction":if($.sessionActions.setCompacting(X.phase==="start"),X.phase==="end"){if(X.outcome!=="failed")$.sessionActions.resetContextUsage(),J.compactionCount=(J.compactionCount??0)+1;if(X.memory?.outcome==="written"){let Q=`Saved ${X.memory.entries} project memories`;$.sessionActions.addToolMessage(Q,{toolName:"Project Memory",phase:"complete",summary:Q})}}break;case"turn_start":G8.debug("[loopEventHandler] turn_start",{turn:X.turn,maxTurns:X.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:X.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y.startTurn();break;case"task_update":$.appActions.setTasks(X.tasks);break;case"goal_frontier_updated":$.appActions.setTasks(X.tasks);break;case"mcp_catalog_changed":{let Q=`MCP catalog r${X.revision}: +${X.added.length} -${X.removed.length} ~${X.updated.length}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Catalog",phase:"complete",summary:Q,detail:[X.added.length>0?`Added: ${X.added.join(", ")}`:"",X.removed.length>0?`Removed: ${X.removed.join(", ")}`:"",X.updated.length>0?`Updated: ${X.updated.join(", ")}`:""].filter(Boolean).join(`
1
+ import{e as $X,f as JX,h as S$,i as C4}from"./chunk-gz84aewr.js";import{l as JZ,m as YZ,n as XZ}from"./chunk-65wc1h38.js";import{B as TJ,C as CJ,D as _4}from"./chunk-fnmqxhv1.js";import{Aa as L3,Ba as B3,Ca as LZ,Da as UY,Fa as GY,Ha as rY,L as lY,P as FZ,R as p6,S as I6,T as EY,Z as bY,_ as MY,ba as TY,ga as i$,ia as kJ,ja as DJ,la as CY,na as q8,oa as LX,pa as BX,sa as wX,ta as PX,xa as i9,ya as P3}from"./chunk-az3rehz9.js";import"./chunk-ebpg1srd.js";import{Pa as E5,Qa as h5,Ra as g5,Ua as WZ}from"./chunk-e45r1a8r.js";import{Wa as AY}from"./chunk-fc1gz532.js";import{Pb as wY,Qb as L4,ac as PY,lc as M6}from"./chunk-793wjhvz.js";import{wc as H8}from"./chunk-1n4v80hy.js";import{Gd as OY,Qd as MJ,Rd as m2,Vd as IJ,_d as SJ,ae as s8,ie as z8,le as a0}from"./chunk-sbfe9vh3.js";import"./chunk-tsm8rhmd.js";import{Pe as VJ,Qe as b6,Re as jJ}from"./chunk-yjjxv7fn.js";import{mf as YY,nf as G4}from"./chunk-0ef47wgr.js";import{Af as eX}from"./chunk-nj6kpdte.js";import{Bf as W8,Cf as O4,Ef as Y1}from"./chunk-67wy9mm7.js";import"./chunk-dnpkf5mv.js";import{$f as JY,If as R2,Jf as L$,Kf as a1,Lf as q9,Mf as n8,Nf as RJ,Of as e3,Pf as S9,Qf as r5,Rf as $5,Sf as v2,Tf as m0,Uf as NZ,Vf as B$,Wf as sX,Xf as o4,Yf as O8,cg as z$}from"./chunk-n5jzmwhy.js";import"./chunk-t0gm0pn1.js";import"./chunk-v508x7cg.js";import"./chunk-hpge30p8.js";import"./chunk-28n945me.js";import{ug as k9}from"./chunk-pdna2qvv.js";import"./chunk-50vwafn5.js";import"./chunk-p2y1zqsb.js";import{Hg as F4,Ig as mX,Ng as FX,Wg as HZ}from"./chunk-5k8k56f2.js";import"./chunk-ewwrss2w.js";import"./chunk-53vh6vpt.js";import"./chunk-hv8nt7wj.js";import"./chunk-erhaedch.js";import{wh as N9,yh as E$}from"./chunk-xcq0cehr.js";import"./chunk-28tzj187.js";import{Gh as pJ,Ni as _Z,Si as WX,Ti as OZ}from"./chunk-sqk8cnej.js";import{Ui as p2,Vi as $4,Xi as H9}from"./chunk-514va7ce.js";import{aj as K$}from"./chunk-6xzk4hsg.js";import"./chunk-n34qsnks.js";import{Cj as H1,zj as qZ}from"./chunk-09kqfdpa.js";import{Kj as t5,Lj as s5,Oj as R1}from"./chunk-3crwyd2r.js";import"./chunk-9kj19a8t.js";import{_j as x5}from"./chunk-yzf2jpam.js";import{ck as r9}from"./chunk-asgmmaec.js";import{dk as K8,xk as $Y}from"./chunk-ed2hdrwe.js";import{Jk as X4}from"./chunk-gmpsfkgg.js";import{useMemoizedFn as K6}from"ahooks";import{useEffect as _z,useState as z6}from"react";import{useMemoizedFn as i0}from"ahooks";import nX from"ansi-escapes";import{Box as m1,useStdout as Zz}from"ink";import{useEffect as J1,useMemo as Qz,useRef as I2,useState as tX}from"react";import{useShallow as PZ}from"zustand/react/shallow";import{useStore as wZ}from"zustand";function z0($){return wZ(v2,$)}var AZ=[],V2=()=>z0(($)=>$.session.sessionId),O1=()=>z0(($)=>$.session.workspaceRoot),j8=()=>z0(($)=>$.session.messages),o9=()=>z0(($)=>$.session.clearCount),n9=()=>z0(($)=>$.session.isCompacting),t9=()=>z0(($)=>$.session.tokenUsage.estimatedCostUsd),s9=()=>z0(($)=>{let{totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:Z}=$.session.tokenUsage;return i9({totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:Z}).hitRate}),E8=()=>z0(($)=>$.session.providerRecovery),e9=()=>z0(($)=>$.session.turnActivity),$J=()=>z0(($)=>$.session.actionStationarity),d1=()=>z0(($)=>$.session.actions),JJ=()=>z0(($)=>{let{totalTokens:J,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let Z=Math.max(0,100-J/Y*100);return Math.round(Z)}),YJ=()=>z0(($)=>$.app.initializationStatus),XJ=()=>z0(($)=>$.app.initializationError),j2=()=>z0(($)=>$.app.activeModal),ZJ=()=>z0(($)=>$.app.tasks),QJ=()=>z0(($)=>$.app.modelEditorTarget),UJ=()=>z0(($)=>$.app.sessionSelectorData),GJ=()=>z0(($)=>$.app.sessionHistoryViewerData),KJ=()=>z0(($)=>$.app.taskAttentionStatus),h8=()=>z0(($)=>$.app.taskAttentionUnreadKeys),zJ=()=>z0(($)=>$.app.awaitingSecondCtrlC),N1=()=>z0(($)=>$.app.actions),E2=()=>z0(($)=>$.app.sideConversation),qJ=()=>z0(($)=>$.app.teams),g8=()=>z0(($)=>$.app.initializationStatus==="ready"),_J=()=>z0(($)=>$.app.tasks.length>0),h2=()=>z0(($)=>$.config.config?.permissionMode||"default"),OJ=()=>z0(($)=>$.config.config?.models??AZ),m8=()=>z0(($)=>{let J=$.config.config;if(!J)return;let Y=J.currentModelId;return J.models.find((X)=>X.id===Y)??J.models[0]}),p8=()=>z0(($)=>$.config.config?.currentModelId),NJ=()=>z0(($)=>$.config.config?.agentTeamsEnabled===!0),D0=()=>z0(($)=>{return L$.getTheme()}),HJ=()=>z0(($)=>$.config.config?.codeTheme??"default"),s0=()=>z0(($)=>$.focus.currentFocus),WJ=()=>z0(($)=>$.focus.actions),g2=()=>z0(($)=>$.command.isProcessing),FJ=()=>z0(($)=>$.command.actions),x8=()=>z0(($)=>$.app.followUpQueue),LJ=()=>z0(($)=>$.app.followUpQueueMutation),BJ=()=>z0(($)=>$.command.recoveredSteeringCount),c8=()=>z0(($)=>$.app.reasoningEffort!=="off"),u8=()=>z0(($)=>$.app.reasoningEffort),d8=()=>z0(($)=>$.app.serviceTier),l8=()=>z0(($)=>$.app.responseVerbosity),r8=()=>z0(($)=>$.app.communicationStyle),a8=()=>z0(($)=>$.session.currentThinkingContent),wJ=()=>z0(($)=>$.session.thinkingExpanded),i8=()=>z0(($)=>$.session.currentStreamingMessageId),o8=()=>z0(PZ(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),PJ=()=>z0(($)=>$.session.finalizingStreamingMessageId),AJ=()=>z0(($)=>$.session.historyExpanded),bJ=()=>z0(($)=>$.session.expandedMessageCount);import{randomUUID as N7}from"node:crypto";import{useMemoizedFn as X1}from"ahooks";import{useEffect as l1,useMemo as LY,useRef as H4}from"react";function bZ($,J){try{return $.code===J.code&&$.message===J.message&&$.retryable===J.retryable&&$.resource===J.resource}catch{return!1}}class _6{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((Y)=>{this.handleUnexpectedFailure(Y,$)})})}catch(Y){this.handleUnexpectedFailure(Y,$)}}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={},Y=new AbortController,Z=this.wakeEpoch,X=this.idleEpoch;if(this.attempt++,this.recoveryStartedAt===null)this.recoveryStartedAt=this.now(),this.installDeadlineTimer($);this.activeAttemptToken=J,this.activeRunController=Y;let Q;try{Q=await this.options.run(Y.signal)}finally{if(this.activeAttemptToken===J){if(this.activeAttemptToken=null,this.activeRunController=null,!this.disposed&&$!==this.generation)this.scheduleIfRunnable()}}if(this.disposed||$!==this.generation)return;if(Q.status==="completed"){let U=this.wakeEpoch!==Z;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 Y=m2($.taskFailure),Z=this.options.sessionIdentity;if($.workKind!=="pending_input"||!$.evidence||!Z||!bZ($.taskFailure,$.evidence.taskFailure)){this.terminate("failed",this.attempt,Y);return}let X=CJ({sessionIdentity:Z,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,Y);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),m2($),"pending-resume-coordinator-failed")}installDeadlineTimer($){let J={},Y=this.setTimerCallback(()=>{if(this.disposed||$!==this.generation||this.deadlineTimer?.token!==J)return;this.deadlineTimer=null,this.terminate("exhausted",Math.max(1,this.attempt),MJ("timeout"),"pending-resume-recovery-deadline-exceeded")},TJ);this.deadlineTimer={handle:Y,token:J},Y.unref?.()}terminate($,J,Y,Z){let X=this.activeRunController;if(this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget(),Z)X?.abort(Z);try{this.options.onTerminalFailure?.({phase:$,attempt:J,taskFailure:Y})}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 U8{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)n8(J,$.extraContent);RJ(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function MZ($){if(!($ instanceof Error))return"未知错误";let Z=$.lastError??$;if(Z.responseBody)try{let U=JSON.parse(Z.responseBody)?.error?.message;if(U){let G=Z.statusCode?` (HTTP ${Z.statusCode})`:"";return`${U}${G}`}}catch{}let X=$.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return $.message}function TZ($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function CZ($){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 t8($){let J=TZ($),Y=CZ($),Z;if(Y)Z="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Z=MZ($);return{displayMessage:Z,isAbort:J,isVisionNotSupported:Y}}import{appendFileSync as RZ,mkdirSync as yZ,writeFileSync as IZ}from"node:fs";import SZ from"node:os";import O6 from"node:path";var yJ=null;function kZ(){let $=process.env.BLADE_STORAGE_ROOT||O6.join(SZ.homedir(),".blade");return O6.join($,"logs","stream-debug.log")}function DZ($){if(yJ===$)return;let J=O6.dirname($);yZ(J,{recursive:!0,mode:493}),IZ($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
+ `),yJ=$}function N6($,J,Y){try{let Z=kZ();DZ(Z);let X=new Date().toISOString(),Q=Y?` | ${JSON.stringify(Y)}`:"",U=`[${X}] [${$}] ${J}${Q}
3
+ `;RZ(Z,U)}catch{}}var G8=H1("UI");function H6($,J){if(J.state==="requires_attention"){let Y=J.reason==="interrupted_tool_call";$.addToolMessage("Turn recovery requires attention",{toolName:"Runtime Recovery",phase:"complete",summary:Y?"An interrupted tool may have partially completed":"A completed tool may already have changed external state",detail:`${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 fJ($,J){let Y=$.streamSession??new U8({signal:$.signal,streamingBuffer:$.streamingBuffer,getStreamingMessageId:$.getStreamingMessageId,finalizeStreamingMessage:$.sessionActions.finalizeStreamingMessage,discardStreamingMessage:$.sessionActions.discardStreamingMessage,clearThinking:()=>$.sessionActions.setCurrentThinkingContent(null)}),Z=(X)=>{for(let Q of X){if((Q.origin??"user")!=="user")continue;let U=$.commandActions.takeFollowUpPresentation(Q.id);if(U){$.sessionActions.addUserMessage(U.displayText);continue}if(!Q.recovered||Q.persisted)continue;let G=typeof Q.content==="string"?Q.content:Q.content.map((z)=>z.type==="text"?z.text:"[Image]").join(`
4
+ `);$.sessionActions.addUserMessage(G)}};return(X)=>{switch(X.kind){case"content_delta":if(X.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;J.contentDeltaCount++,J.contentDeltaTotalLen+=X.delta.length,N6("loopEventHandler","onContentDelta",{callCount:J.contentDeltaCount,deltaLen:X.delta.length,totalLen:J.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(X.delta);break;case"thinking_delta":if(X.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(X.delta);break;case"stream_end":{$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),G8.debug("[loopEventHandler] stream_end",{contentDeltaCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Y.isFinalized,signalAborted:$.signal.aborted}),N6("loopEventHandler","onStreamEnd",{contentDeltaCallCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Y.isFinalized,signalAborted:$.signal.aborted}),Y.finalize();break}case"model_fallback":$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y.discard();break;case"provider_admission":{let{kind:Q,...U}=X;$.sessionActions.setProviderAdmission(X.phase==="queued"?U:null);break}case"provider_circuit":{let{kind:Q,...U}=X;$.sessionActions.setProviderCircuit(X.phase==="closed"?null:U);break}case"provider_retry":{let{kind:Q,...U}=X;$.sessionActions.setProviderRetry(X.phase==="recovered"?null:U);break}case"provider_stall":{let{kind:Q,...U}=X;$.sessionActions.setProviderStall(X.phase==="detected"?U:null);break}case"provider_recovery":$.sessionActions.setProviderRecovery(X.recovery);break;case"action_stationarity":{let{kind:Q,...U}=X;$.sessionActions.setActionStationarity(X.phase==="recovered"?null:U);break}case"turn_recovery":{H6($.sessionActions,X.assessment);break}case"tool_start":{J.toolExecutionStarted=!0;let Q=X.toolCall;if(!("function"in Q))break;if(Q.function.name===s8)break;if(G8.debug("[loopEventHandler] tool_start",{toolName:Q.function.name,toolKind:X.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Q.function.name))break;try{let U=JSON.parse(Q.function.arguments),G=kJ(Q.function.name,U);$.sessionActions.addToolMessage(G,{toolCallId:Q.id,toolName:Q.function.name,phase:"start",summary:G,params:U})}catch(U){G8.error("[loopEventHandler] onToolStart error:",U)}break}case"tool_progress":{J.toolExecutionStarted=!0;let Q=X.toolCall;if(!("function"in Q))break;if(Q.function.name===s8)break;let U=X.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((X.update.progress??0)/X.update.total*100)))}%`:"",G=`${Q.function.name}${U}: ${X.update.message}`;$.sessionActions.addToolMessage(G,{toolCallId:Q.id,toolName:Q.function.name,phase:"progress",summary:G,...X.update.admission?{admission:X.update.admission}:{}});break}case"tool_result":{J.toolExecutionStarted=!0;let Q=X.toolCall;if(!("function"in Q))break;if(Q.function.name===s8)break;G8.debug("[loopEventHandler] tool_result",{toolName:Q.function.name,success:X.result.success});let U=SJ(DJ(Q.function.name,X.result),IJ);$.sessionActions.addToolMessage(U.summary,{toolCallId:Q.id,toolName:Q.function.name,phase:"complete",summary:U.summary,detail:U.detail});break}case"structured_output":J.outputStarted=!0,$.sessionActions.replaceLastAssistantMessage(JSON.stringify(X.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(X.usage);break;case"compaction":if($.sessionActions.setCompacting(X.phase==="start"),X.phase==="end"){if(X.outcome!=="failed")$.sessionActions.resetContextUsage(),J.compactionCount=(J.compactionCount??0)+1;if(X.memory?.outcome==="written"){let Q=`Saved ${X.memory.entries} project memories`;$.sessionActions.addToolMessage(Q,{toolName:"Project Memory",phase:"complete",summary:Q})}}break;case"turn_start":G8.debug("[loopEventHandler] turn_start",{turn:X.turn,maxTurns:X.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:X.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y.startTurn();break;case"task_update":$.appActions.setTasks(X.tasks);break;case"goal_frontier_updated":$.appActions.setTasks(X.tasks);break;case"mcp_catalog_changed":{let Q=`MCP catalog r${X.revision}: +${X.added.length} -${X.removed.length} ~${X.updated.length}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Catalog",phase:"complete",summary:Q,detail:[X.added.length>0?`Added: ${X.added.join(", ")}`:"",X.removed.length>0?`Removed: ${X.removed.join(", ")}`:"",X.updated.length>0?`Updated: ${X.updated.join(", ")}`:""].filter(Boolean).join(`
5
5
  `)});break}case"mcp_content_changed":{let Q=`MCP ${X.contentKind} r${X.revision}: +${X.added.length} -${X.removed.length} ~${X.updated.length}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Content",phase:"complete",summary:Q,detail:[X.added.length>0?`Added: ${X.added.join(", ")}`:"",X.removed.length>0?`Removed: ${X.removed.join(", ")}`:"",X.updated.length>0?`Updated: ${X.updated.join(", ")}`:""].filter(Boolean).join(`
6
6
  `)});break}case"mcp_resource_updated":{let Q=`MCP resource updated: ${X.uri}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Resource",phase:"progress",summary:Q,detail:`${X.serverName} · revision ${X.revision}`});break}case"mcp_connection_changed":{let Q=X.phase==="reconnecting"?"recovering":X.phase==="recovered"?"recovered":"recovery failed",U=`MCP ${X.serverName} ${Q}`+(X.phase==="reconnecting"?` (${X.attempt}/${X.maxAttempts})`:"");$.sessionActions.addToolMessage(U,{toolName:"MCP Connection",phase:"complete",summary:U,detail:[`reason: ${X.reason}`,`revision: ${X.revision}`,X.error?`error: ${X.error}`:""].filter(Boolean).join(`
7
7
  `)});break}case"mcp_log":{let Q=X.logger?`${X.serverName} · ${X.logger}`:X.serverName,U=`MCP ${X.level} · ${Q}`;$.sessionActions.addToolMessage(U,{toolName:"MCP Log",phase:"complete",summary:U,detail:[X.message,`revision: ${X.revision}`,`sha256: ${X.dataSha256}`,X.truncated?"truncated: true":"",X.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
8
8
  `)});break}case"mcp_instructions_changed":{let Q=`MCP instructions ${X.action}: ${X.serverName}`+(X.truncated?" (truncated)":"");$.sessionActions.addToolMessage(Q,{toolName:"MCP Instructions",phase:"complete",summary:Q,detail:[X.text??"",X.sha256?`sha256: ${X.sha256}`:"",X.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
9
9
  `)});break}case"mcp_task_changed":{let Q=`MCP task ${X.status}: ${X.taskId} (${X.serverName}/${X.toolName})`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Task",phase:"complete",summary:Q,detail:[X.statusMessage??"",`revision: ${X.revision}`,X.hasResult?"result available via TaskOutput":"",X.error?`error: ${X.error}`:""].filter(Boolean).join(`
10
10
  `)});break}case"project_rules_loaded":{let Q=`Project rules loaded: ${X.files.length}`+(X.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Q,{toolName:"Project Rules",phase:"complete",summary:Q,detail:X.files.map((U)=>`${U.relativePath} ${U.source} sha256=${U.contentSha256}`).join(`
11
- `)});break}case"steering_applied":if(Z(X.messages),$.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner),X.recovered>0)$.commandActions.setRecoveredSteeringCount(X.recovered);break;case"follow_up_started":if($.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner),X.recovered>0)$.commandActions.setRecoveredSteeringCount(X.recovered);break;case"follow_up_queue_changed":$.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner);break;case"goal_updated":case"goal_continuation_started":break;case"turn_activity":$.sessionActions.setTurnActivity(X.activity);break;case"subagent_spawned":case"subagent_completed":break;default:{let Q=X}}}}function H6($){let{text:J,parts:Y}=$,Z=Y.filter((U)=>U.type==="image");if(Z.length===0)return J;if(Z.length>p2)throw Error(`最多只能发送 ${p2} 张图片`);if(Z.reduce((U,G)=>U+`data:${G.mimeType};base64,`.length+G.base64.length,0)>e8)throw Error("图片编码后总大小不能超过 5 MiB");let Q=[];for(let U of Y)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 fJ($){let J=VJ($.metadata);return{role:$.role,content:J?vJ(J):$.content,...$.metadata?{metadata:$.metadata}:{}}}function $4($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(fJ);let J=$.messages.slice($.restoredVisibleMessageCount).map(fJ);return[...$.restoredContextMessages,...J]}import $7 from"node:path";import{basename as oZ}from"node:path";import{createHash as vZ}from"node:crypto";import*as U2 from"node:fs/promises";import*as X4 from"node:path";import VZ from"write-file-atomic";var W6=1,jZ="tui-task-attention-v1.json",hZ=/^[a-f0-9]{64}$/,EZ=4194304,gZ=20000,pJ=1024,jJ=256,mZ=/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d\.\d{3}Z$/,pZ={realpath:!1,retries:{retries:150,factor:1.2,minTimeout:10,maxTimeout:100,randomize:!0}},hJ;class Z4{static operations=new mJ;filePath;writeFile;openFile;lockFile;chmodFile;reportDiagnostic;entries=[];pending=[];journalOverflowed=!1;constructor($={}){this.filePath=$.filePath??X4.join(K8(),jZ),this.writeFile=$.writeFile??VZ,this.openFile=$.openFile??U2.open,this.lockFile=$.lockFile??iZ,this.chmodFile=$.chmodFile??U2.chmod,this.reportDiagnostic=$.reportDiagnostic??(()=>{return})}reconcile($,J){return this.mutate({kind:"reconcile",sessions:$,visibleLocator:J})}acknowledge($){return this.mutate({kind:"acknowledge",summary:$})}snapshot(){return J4(this.entries)}async mutate($){return Z4.operations.runExclusive(this.filePath,async()=>{if(this.journalOverflowed||this.pending.length>=jJ)return this.journalOverflowed=!0,this.entries=F6(this.entries,$),this.reportDiagnostic("TUI task attention persistence unavailable"),J4(this.entries);let J,Y,Z=!1,X=!1;try{await rZ(this.filePath),J=await this.lockFile(this.filePath,{...pZ,onCompromised:()=>{Z=!0}});let Q=await lZ(this.filePath,this.openFile);if(Y=xZ(Q,[...this.pending,$]),this.entries=Y,Z)throw Error("attention file lock compromised");let U=JSON.stringify({version:W6,entries:Y},null,2);if(await this.writeFile(this.filePath,U+`
12
- `,{mode:384}),Z)throw Error("attention file lock compromised");X=!0,this.pending=[],await this.chmodFile(this.filePath,384)}catch{if(X)return this.reportDiagnostic("TUI task attention persistence unavailable"),J4(this.entries);if(Y===void 0)Y=F6(this.entries,$),this.entries=Y;this.enqueue($),this.reportDiagnostic("TUI task attention persistence unavailable")}finally{if(J)try{await J()}catch{this.reportDiagnostic("TUI task attention persistence unavailable")}}return J4(this.entries)})}enqueue($){if(this.journalOverflowed)return;if(this.pending.length>=jJ){this.journalOverflowed=!0;return}this.pending.push($)}}function xZ($,J){return J.reduce((Y,Z)=>{return F6(Y,Z)},[...$])}function F6($,J){if(J.kind==="reconcile")return EJ(cZ($,J.sessions,J.visibleLocator));let Y=x2(J.summary.locator);return EJ(xJ($,{key:Y,signature:L6(J.summary),unread:!1}))}function cZ($,J,Y){let Z=new Map($.map((O)=>[O.key,O])),X=new Set,Q=Y?x2(Y):void 0,U,G=[],z=[];for(let O of J){let q=x2(O.locator);if(X.has(q))continue;X.add(q);let N=L6(O);if(Q===q){U=O;continue}let _=Z.get(q);if(!_){let W={key:q,signature:N,unread:!1};if(N===null)G.push(W);else z.push(W);continue}if(N===null){G.push({key:q,signature:null,unread:_.unread});continue}if(_.signature!==N){G.push({..._,unread:!0});continue}if(_.unread)G.push(_);else z.push(_)}let K=[...z.slice(0,pJ).reverse(),...G.reverse()];if(U)K=xJ(K,{key:x2(U.locator),signature:L6(U),unread:!1});return K}function EJ($){let J=$.map((Z,X)=>({entry:Z,index:X})).filter(({entry:Z})=>Z.signature!==null&&!Z.unread).map(({index:Z})=>Z),Y=new Set(J.slice(0,Math.max(0,J.length-pJ)));return $.filter((Z,X)=>!Y.has(X))}function xJ($,J){return[...$.filter((Y)=>Y.key!==J.key),J]}function J4($){return Object.freeze({unreadKeys:Object.freeze($.filter((J)=>J.unread).map((J)=>J.key))})}function x2($){let J=$.workspace.kind==="local"?[2,"local",$.workspace.projectPath,$.sessionId]:[2,"acp-remote",$.workspace.workspaceRef,$.sessionId];return vZ("sha256").update("blade-tui-task-attention-locator-v1\x00").update(JSON.stringify(J)).digest("hex")}function L6($){if($.taskStatus!=="completed"&&$.taskStatus!=="failed"&&$.taskStatus!=="interrupted")return null;return JSON.stringify([$.taskStatus,$.taskCompletedAt??null])}function uZ($){try{let J=JSON.parse($);if(!Array.isArray(J)||J.length!==2||J[0]!=="completed"&&J[0]!=="failed"&&J[0]!=="interrupted")return!1;if(J[1]!==null&&(typeof J[1]!=="string"||!mZ.test(J[1])||new Date(J[1]).toISOString()!==J[1]))return!1;return JSON.stringify(J)===$}catch{return!1}}function gJ($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function dZ($){if(!gJ($)||Object.keys($).some((Z)=>Z!=="version"&&Z!=="entries")||$.version!==W6||!Array.isArray($.entries)||$.entries.length>gZ)return;let J=new Set,Y=[];for(let Z of $.entries){if(!gJ(Z)||Object.keys(Z).some((X)=>X!=="key"&&X!=="signature"&&X!=="unread")||typeof Z.key!=="string"||!hZ.test(Z.key)||J.has(Z.key)||Z.signature!==null&&(typeof Z.signature!=="string"||!uZ(Z.signature))||typeof Z.unread!=="boolean")return;J.add(Z.key),Y.push({key:Z.key,signature:Z.signature,unread:Z.unread})}return{version:W6,entries:Y}}async function lZ($,J){let Y;try{Y=await J($,"r");let Z=await Y.readFile();if(Z.byteLength>EZ)return[];let X=JSON.parse(Z.toString("utf8"));return dZ(X)?.entries??[]}catch(Z){if(Z instanceof SyntaxError||Z instanceof Error&&"code"in Z&&Z.code==="ENOENT")return[];throw Z}finally{await Y?.close()}}async function rZ($){let J=X4.dirname($);await U2.mkdir(J,{recursive:!0,mode:448}),await U2.chmod(J,448)}async function aZ(){return hJ??=await import("proper-lockfile"),hJ}async function iZ($,J){return(await aZ()).lock($,J)}function T1($){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 cJ($){return x2($.locator)}async function uJ($,J,Y){if(await $.start(),Y.continueSession||Y.resume!==void 0||Y.forkSession)return;if(Y.requestedSessionId!==void 0&&$.getState().status!=="ready")return;if(Y.requestedSessionId!==void 0&&$.getState().sessions.some((Z)=>nZ(Z.locator,Y.locator)))return;await J.proveLocal(Y.locator)}function nZ($,J){if($.sessionId!==J.sessionId||$.workspace.kind!==J.workspace.kind)return!1;return $.workspace.kind==="local"&&J.workspace.kind==="local"?$.workspace.projectPath===J.workspace.projectPath:$.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}async function tZ($,J,Y,Z){if($==="resume"){await Y.acknowledge(J),await Y.setVisibleLocator(J.locator);return}if(Z)await Y.setVisibleLocator(Z)}function dJ($,J,Y,Z){let X={version:2,sessionId:Y.sessionId,workspace:{kind:"local",projectPath:Y.projectPath}};return tZ($,J,{acknowledge:(Q)=>Z.acknowledge(Q),setVisibleLocator:(Q)=>Q?Z.proveLocal(Q):Promise.resolve()},X)}function lJ($,J){return $.proveLocal(J)}class B6{attention;remote;remoteEpoch=0;provenLocalLocator;remoteActive=!1;constructor($){this.attention=$;this.remote=new rJ((J)=>$.acknowledge(J))}acknowledge($){return this.attention.acknowledge($)}async proveLocal($){if(this.provenLocalLocator=$,this.remoteActive)return;this.remoteEpoch+=1,this.remote.reset(),await this.attention.setVisibleLocator($)}async beginRemote($,J){this.remoteActive=!0,this.remoteEpoch+=1,this.remote.begin($,J)}beginRemoteOpening(){this.remoteActive=!0;let $=++this.remoteEpoch;return this.remote.reset(),{epoch:$,cleared:this.attention.setVisibleLocator(void 0)}}isRemoteOpeningCurrent($){return this.remoteActive&&this.remoteEpoch===$}bindRemoteOpening($,J,Y){if(!this.isRemoteOpeningCurrent($))return!1;return this.remote.begin(J,Y),!0}async endRemote(){if(!this.remoteActive)return;this.remoteActive=!1,this.remoteEpoch+=1,this.remote.reset(),await this.attention.setVisibleLocator(this.provenLocalLocator)}async updateRemote($,J){let Y=this.remoteEpoch;if(!await this.remote.update($,J)||Y!==this.remoteEpoch)return;await this.attention.setVisibleLocator(J.session?.locator)}}class rJ{acknowledge;acknowledgedView;pendingView;expectedView;constructor($){this.acknowledge=$}begin($,J){this.expectedView=$.intent==="resume"?{key:T1($.session),generation:J}:void 0}reset(){this.expectedView=void 0}async update($,J){if($.intent!=="resume"||J.status!=="ready"||!J.session||!this.expectedView||J.viewGeneration!==this.expectedView.generation||T1($.session)!==this.expectedView.key||T1($.session)!==T1(J.session))return!1;let Y=`${J.viewGeneration}\x00${T1(J.session)}`;if(Y===this.acknowledgedView||Y===this.pendingView)return!1;this.pendingView=Y;try{if(await this.acknowledge(J.session),this.expectedView?.generation!==J.viewGeneration||this.expectedView.key!==T1(J.session))return!1;return this.acknowledgedView=Y,!0}finally{if(this.pendingView===Y)this.pendingView=void 0}}}function sZ($){return $.title?.trim()||`Session ${$.locator.sessionId.slice(0,8)}`}function Q4($,J){let Y=$.filter((Z)=>Z.relationType!=="subagent");if(J!=="fork")return Y;return Y.filter((Z)=>Z.archivedAt===void 0&&Z.capabilities.history.fork)}function aJ($){return $.find((J)=>J.relationType!=="subagent"&&J.locator.workspace.kind==="local")}function iJ($,J,Y=!1){let Z=sZ($),X=Y?"[NEW] ":"";if($.locator.workspace.kind==="acp-remote"){let G=$.archivedAt?" · archived":"";return`${X}[remote · ${$.capabilities.connection} · history${G}] ${Z}
13
- ${$.displayCwd} · ${$.messageCount} messages · ${J}${$.hasErrors?" [!]":""}`}let Q=eZ($.taskStatus),U=$.relationType==="subagent"?" ↳ subagent":$.relationType==="fork"?" ↳ fork":"";return`${X}[${Q}] ${Z} · ${J} | ${oZ($.displayCwd)} | ${$.messageCount} 条消息${$.hasErrors?" [!]":""}${U}`}function oJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}function eZ($){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 YY($,J,Y,Z={}){if($.locator.workspace.kind==="acp-remote"){if(J==="fork"&&Z.newSessionId)throw Error("Custom Session IDs are unavailable for remote history forks");return await Y.openHistory($,J),"history-only"}let X=await w6($);return await Y.activateLocal(X,J),"interactive"}function G4($){if($.remoteWorkspace)throw Error("Remote history cannot enter the local compatibility path");let J=$.archivedAt!==void 0,Y=JY($.taskCompletedAt);return U4.parse({locator:{version:2,sessionId:$.sessionId,workspace:{kind:"local",projectPath:$.projectPath}},displayCwd:$.projectPath,title:$.title,rootId:$.rootId,parentId:$.parentId,relationType:$.relationType,taskStatus:$.taskStatus,...Y!==void 0?{taskCompletedAt:Y}:{},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 w6($){if($.locator.workspace.kind!=="local")throw Error("Remote history cannot enter the local activation path");let J=eJ($.locator.workspace.projectPath),Y=await a0.findSessionMetadata($.locator.sessionId,J);if(!Y)throw Error("Session history is no longer available");if(Y.remoteWorkspace)throw Error("Remote history cannot enter the local activation path");return Y}function nJ($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function J7($){return $7.resolve($)}function tJ($){if(!$||!$Y($))return;m0().config.actions.updateConfig({currentModelId:$})}function sJ($){if(!$)return;m0().config.actions.updateConfig({permissionMode:$})}async function K4($,J,Y){let Z=Y?await Y.listAll():(await a0.listSessions({includeSubagents:!1})).map(G4);return Q4(Z,$)}async function z4($,J,Y,Z){let{intent:X,session:Q,newSessionId:U,announceFork:G,permissionModeOverride:z}=$,K=J7(Q.projectPath);if(X==="fork"){let _=await a0.forkSession(Q.sessionId,{...U?{newSessionId:U}:{},sourceProjectPath:K,targetProjectPath:K}),W=await a0.loadSessionModelContext(_.sessionId,_.metadata.projectPath),H=[...a0.toUISafeMessages(_.messages)];if(G!==!1){let A=Date.parse(_.metadata.lastMessageTime);H.push({id:"fork-announcement-"+_.sessionId,role:"assistant",content:"Forked "+nJ(Q.sessionId)+" → "+nJ(_.sessionId),timestamp:Number.isNaN(A)?0:A})}return await Z(),sJ(z??_.metadata.permissionMode),tJ(_.metadata.selectedModelId),Y.restoreSession(_.sessionId,H,W,_.metadata.projectPath),{sessionId:_.sessionId,messages:W,projectPath:_.metadata.projectPath}}await a0.assertSessionWritable(Q.sessionId,Q.projectPath);let[O,q]=await Promise.all([a0.loadSession(Q.sessionId,Q.projectPath),a0.loadSessionModelContext(Q.sessionId,Q.projectPath)]),N=a0.toUISafeMessages(O);return await Z(),sJ(z??Q.permissionMode),tJ(Q.selectedModelId),Y.restoreSession(Q.sessionId,N,q,Q.projectPath),{sessionId:Q.sessionId,messages:q,projectPath:Q.projectPath}}var Y7=H1("UI");function GY($){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 KY($){return U4.safeParse($).success}function XY($){if(typeof $!=="object"||$===null)return!1;return Object.hasOwn($,"locator")?KY($):GY($)}function ZY($){return KY($)?$:G4($)}function X7($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function Z7($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function Q7($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function U7($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function G7($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function K7($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function z7($){if(typeof $!=="object"||$===null)return!1;let J=$.intent;if(J!=="resume"&&J!=="fork")return!1;let Y=$.action;if(Y==="select_session"){let Z=$.sessions;return Array.isArray(Z)&&Z.every(XY)}if(Y==="activate_session"){let Z=$.session;return XY(Z)}return!1}function q7($,J,Y,Z){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_follow_up_queue":return Y.setActiveModal("followUpQueue"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let X=J?.sessions;return Y.showSessionSelector((X??[]).map(G4),"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 Z.restoreSession(X.sessionId,X.visibleMessages,X.messages),!0}case"session_archived":{let X=J?.session;return Z.addAssistantMessage(X?`会话 ${X.sessionId} 已归档。`:"当前会话已归档。"),Y1(0),!0}case"clear_screen":return Z.clearMessages(),Z.setError(null),Z.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":case"compact_cancelled":{let X=J,Q=X?.compactedMessages;if(Q&&$!=="compact_cancelled")Z.setCompactedContext(Q);if(X?.usage)Z.updateTokenUsage({...$==="compact_cancelled"?{scope:"auxiliary"}:{},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});if($!=="compact_cancelled")Z.resetContextUsage();return!0}case"exit_application":return Y1(0),!0;default:return!1}}async function P6($,J,Y,Z,X,Q,U,G,z,K,O,q,N,_,W=K$(),H,A){let{text:b}=$;if(!QY(b))return{type:"not_slash"};let B=await UY(b,{cwd:W,surface:"tui",workspaceRoot:W,sessionId:Q,messages:U,rewind:G,lifecycle:Q===void 0?void 0:{archiveCurrent:async()=>{return await X(),a0.archiveSession(Q,W)}},subagents:z,mcp:K,reasoning:O,serviceTier:q,responseVerbosity:N,communicationStyle:_,codeReview:H,sessionSurfaces:A,signal:Z});if(B.success&&z7(B.data)){if(B.data.action==="select_session")return J.showSessionSelector(B.data.sessions.map(ZY),B.data.intent),{type:"handled",commandResult:{success:!0}};let F=ZY(B.data.session);if(F.locator.workspace.kind==="acp-remote")return J.showSessionHistoryViewer(F,B.data.intent),{type:"handled",commandResult:{success:!0}};let M=GY(B.data.session)?B.data.session:await w6(F),L=await z4({...B.data,session:M},W,Y,X);try{if(B.data.intent==="resume")await A?.acknowledge?.(F),await A?.setVisibleLocator?.(F.locator);else await A?.setVisibleLocator?.({version:2,sessionId:L.sessionId,workspace:{kind:"local",projectPath:L.projectPath}})}catch{Y7.warn("[slashCommandRouter] Task attention activation unavailable")}return{type:"handled",commandResult:{success:!0}}}if(B.success&&K7(B.data))return Y.restoreSession(B.data.sessionId,B.data.visibleMessages,B.data.messages),J.setTasks([]),{type:"handled",commandResult:{success:!0}};if(B.message){if(q7(B.message,B.data,J,Y))return{type:"handled",commandResult:{success:B.message!=="compact_cancelled"}}}if(X7(B.data)){let{skillName:F,skillArgs:M}=B.data,L=M?`Please use the "${F}" skill to help me with: ${M}`:`Please use the "${F}" skill.`;return Y.addUserMessage(L),{type:"continue_as_agent",result:{userDisplayMessage:L,agentInput:{displayText:L,text:L,images:[],parts:[{type:"text",text:L}]},userMessageAlreadyAdded:!0}}}if(Z7(B.data)){let{commandName:F,processedContent:M}=B.data;Y.addUserMessage(b);let L=`# Custom Command: /${F}
11
+ `)});break}case"steering_applied":if(Z(X.messages),$.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner),X.recovered>0)$.commandActions.setRecoveredSteeringCount(X.recovered);break;case"follow_up_started":if($.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner),X.recovered>0)$.commandActions.setRecoveredSteeringCount(X.recovered);break;case"follow_up_queue_changed":$.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner);break;case"goal_updated":case"goal_continuation_started":break;case"turn_activity":$.sessionActions.setTurnActivity(X.activity);break;case"subagent_spawned":case"subagent_completed":break;default:{let Q=X}}}}function W6($){let{text:J,parts:Y}=$,Z=Y.filter((U)=>U.type==="image");if(Z.length===0)return J;if(Z.length>p2)throw Error(`最多只能发送 ${p2} 张图片`);if(Z.reduce((U,G)=>U+`data:${G.mimeType};base64,`.length+G.base64.length,0)>$4)throw Error("图片编码后总大小不能超过 5 MiB");let Q=[];for(let U of Y)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 vJ($){let J=jJ($.metadata);return{role:$.role,content:J?VJ(J):$.content,...$.metadata?{metadata:$.metadata}:{}}}function J4($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(vJ);let J=$.messages.slice($.restoredVisibleMessageCount).map(vJ);return[...$.restoredContextMessages,...J]}import eZ from"node:path";import{basename as iZ}from"node:path";import{createHash as fZ}from"node:crypto";import*as U2 from"node:fs/promises";import*as Z4 from"node:path";import vZ from"write-file-atomic";var F6=1,VZ="tui-task-attention-v1.json",jZ=/^[a-f0-9]{64}$/,EZ=4194304,hZ=20000,xJ=1024,EJ=256,gZ=/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d\.\d{3}Z$/,mZ={realpath:!1,retries:{retries:150,factor:1.2,minTimeout:10,maxTimeout:100,randomize:!0}},hJ;class Q4{static operations=new pJ;filePath;writeFile;openFile;lockFile;chmodFile;reportDiagnostic;entries=[];pending=[];journalOverflowed=!1;constructor($={}){this.filePath=$.filePath??Z4.join(K8(),VZ),this.writeFile=$.writeFile??vZ,this.openFile=$.openFile??U2.open,this.lockFile=$.lockFile??aZ,this.chmodFile=$.chmodFile??U2.chmod,this.reportDiagnostic=$.reportDiagnostic??(()=>{return})}reconcile($,J){return this.mutate({kind:"reconcile",sessions:$,visibleLocator:J})}acknowledge($){return this.mutate({kind:"acknowledge",summary:$})}snapshot(){return Y4(this.entries)}async mutate($){return Q4.operations.runExclusive(this.filePath,async()=>{if(this.journalOverflowed||this.pending.length>=EJ)return this.journalOverflowed=!0,this.entries=L6(this.entries,$),this.reportDiagnostic("TUI task attention persistence unavailable"),Y4(this.entries);let J,Y,Z=!1,X=!1;try{await lZ(this.filePath),J=await this.lockFile(this.filePath,{...mZ,onCompromised:()=>{Z=!0}});let Q=await dZ(this.filePath,this.openFile);if(Y=pZ(Q,[...this.pending,$]),this.entries=Y,Z)throw Error("attention file lock compromised");let U=JSON.stringify({version:F6,entries:Y},null,2);if(await this.writeFile(this.filePath,U+`
12
+ `,{mode:384}),Z)throw Error("attention file lock compromised");X=!0,this.pending=[],await this.chmodFile(this.filePath,384)}catch{if(X)return this.reportDiagnostic("TUI task attention persistence unavailable"),Y4(this.entries);if(Y===void 0)Y=L6(this.entries,$),this.entries=Y;this.enqueue($),this.reportDiagnostic("TUI task attention persistence unavailable")}finally{if(J)try{await J()}catch{this.reportDiagnostic("TUI task attention persistence unavailable")}}return Y4(this.entries)})}enqueue($){if(this.journalOverflowed)return;if(this.pending.length>=EJ){this.journalOverflowed=!0;return}this.pending.push($)}}function pZ($,J){return J.reduce((Y,Z)=>{return L6(Y,Z)},[...$])}function L6($,J){if(J.kind==="reconcile")return gJ(xZ($,J.sessions,J.visibleLocator));let Y=x2(J.summary.locator);return gJ(cJ($,{key:Y,signature:B6(J.summary),unread:!1}))}function xZ($,J,Y){let Z=new Map($.map((O)=>[O.key,O])),X=new Set,Q=Y?x2(Y):void 0,U,G=[],z=[];for(let O of J){let q=x2(O.locator);if(X.has(q))continue;X.add(q);let N=B6(O);if(Q===q){U=O;continue}let _=Z.get(q);if(!_){let W={key:q,signature:N,unread:!1};if(N===null)G.push(W);else z.push(W);continue}if(N===null){G.push({key:q,signature:null,unread:_.unread});continue}if(_.signature!==N){G.push({..._,unread:!0});continue}if(_.unread)G.push(_);else z.push(_)}let K=[...z.slice(0,xJ).reverse(),...G.reverse()];if(U)K=cJ(K,{key:x2(U.locator),signature:B6(U),unread:!1});return K}function gJ($){let J=$.map((Z,X)=>({entry:Z,index:X})).filter(({entry:Z})=>Z.signature!==null&&!Z.unread).map(({index:Z})=>Z),Y=new Set(J.slice(0,Math.max(0,J.length-xJ)));return $.filter((Z,X)=>!Y.has(X))}function cJ($,J){return[...$.filter((Y)=>Y.key!==J.key),J]}function Y4($){return Object.freeze({unreadKeys:Object.freeze($.filter((J)=>J.unread).map((J)=>J.key))})}function x2($){let J=$.workspace.kind==="local"?[2,"local",$.workspace.projectPath,$.sessionId]:[2,"acp-remote",$.workspace.workspaceRef,$.sessionId];return fZ("sha256").update("blade-tui-task-attention-locator-v1\x00").update(JSON.stringify(J)).digest("hex")}function B6($){if($.taskStatus!=="completed"&&$.taskStatus!=="failed"&&$.taskStatus!=="interrupted")return null;return JSON.stringify([$.taskStatus,$.taskCompletedAt??null])}function cZ($){try{let J=JSON.parse($);if(!Array.isArray(J)||J.length!==2||J[0]!=="completed"&&J[0]!=="failed"&&J[0]!=="interrupted")return!1;if(J[1]!==null&&(typeof J[1]!=="string"||!gZ.test(J[1])||new Date(J[1]).toISOString()!==J[1]))return!1;return JSON.stringify(J)===$}catch{return!1}}function mJ($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function uZ($){if(!mJ($)||Object.keys($).some((Z)=>Z!=="version"&&Z!=="entries")||$.version!==F6||!Array.isArray($.entries)||$.entries.length>hZ)return;let J=new Set,Y=[];for(let Z of $.entries){if(!mJ(Z)||Object.keys(Z).some((X)=>X!=="key"&&X!=="signature"&&X!=="unread")||typeof Z.key!=="string"||!jZ.test(Z.key)||J.has(Z.key)||Z.signature!==null&&(typeof Z.signature!=="string"||!cZ(Z.signature))||typeof Z.unread!=="boolean")return;J.add(Z.key),Y.push({key:Z.key,signature:Z.signature,unread:Z.unread})}return{version:F6,entries:Y}}async function dZ($,J){let Y;try{Y=await J($,"r");let Z=await Y.readFile();if(Z.byteLength>EZ)return[];let X=JSON.parse(Z.toString("utf8"));return uZ(X)?.entries??[]}catch(Z){if(Z instanceof SyntaxError||Z instanceof Error&&"code"in Z&&Z.code==="ENOENT")return[];throw Z}finally{await Y?.close()}}async function lZ($){let J=Z4.dirname($);await U2.mkdir(J,{recursive:!0,mode:448}),await U2.chmod(J,448)}async function rZ(){return hJ??=await import("proper-lockfile"),hJ}async function aZ($,J){return(await rZ()).lock($,J)}function T1($){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 uJ($){return x2($.locator)}async function dJ($,J,Y){if(await $.start(),Y.continueSession||Y.resume!==void 0||Y.forkSession)return;if(Y.requestedSessionId!==void 0&&$.getState().status!=="ready")return;if(Y.requestedSessionId!==void 0&&$.getState().sessions.some((Z)=>oZ(Z.locator,Y.locator)))return;await J.proveLocal(Y.locator)}function oZ($,J){if($.sessionId!==J.sessionId||$.workspace.kind!==J.workspace.kind)return!1;return $.workspace.kind==="local"&&J.workspace.kind==="local"?$.workspace.projectPath===J.workspace.projectPath:$.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}async function nZ($,J,Y,Z){if($==="resume"){await Y.acknowledge(J),await Y.setVisibleLocator(J.locator);return}if(Z)await Y.setVisibleLocator(Z)}function lJ($,J,Y,Z){let X={version:2,sessionId:Y.sessionId,workspace:{kind:"local",projectPath:Y.projectPath}};return nZ($,J,{acknowledge:(Q)=>Z.acknowledge(Q),setVisibleLocator:(Q)=>Q?Z.proveLocal(Q):Promise.resolve()},X)}function rJ($,J){return $.proveLocal(J)}class w6{attention;remote;remoteEpoch=0;provenLocalLocator;remoteActive=!1;constructor($){this.attention=$;this.remote=new aJ((J)=>$.acknowledge(J))}acknowledge($){return this.attention.acknowledge($)}async proveLocal($){if(this.provenLocalLocator=$,this.remoteActive)return;this.remoteEpoch+=1,this.remote.reset(),await this.attention.setVisibleLocator($)}async beginRemote($,J){this.remoteActive=!0,this.remoteEpoch+=1,this.remote.begin($,J)}beginRemoteOpening(){this.remoteActive=!0;let $=++this.remoteEpoch;return this.remote.reset(),{epoch:$,cleared:this.attention.setVisibleLocator(void 0)}}isRemoteOpeningCurrent($){return this.remoteActive&&this.remoteEpoch===$}bindRemoteOpening($,J,Y){if(!this.isRemoteOpeningCurrent($))return!1;return this.remote.begin(J,Y),!0}async endRemote(){if(!this.remoteActive)return;this.remoteActive=!1,this.remoteEpoch+=1,this.remote.reset(),await this.attention.setVisibleLocator(this.provenLocalLocator)}async updateRemote($,J){let Y=this.remoteEpoch;if(!await this.remote.update($,J)||Y!==this.remoteEpoch)return;await this.attention.setVisibleLocator(J.session?.locator)}}class aJ{acknowledge;acknowledgedView;pendingView;expectedView;constructor($){this.acknowledge=$}begin($,J){this.expectedView=$.intent==="resume"?{key:T1($.session),generation:J}:void 0}reset(){this.expectedView=void 0}async update($,J){if($.intent!=="resume"||J.status!=="ready"||!J.session||!this.expectedView||J.viewGeneration!==this.expectedView.generation||T1($.session)!==this.expectedView.key||T1($.session)!==T1(J.session))return!1;let Y=`${J.viewGeneration}\x00${T1(J.session)}`;if(Y===this.acknowledgedView||Y===this.pendingView)return!1;this.pendingView=Y;try{if(await this.acknowledge(J.session),this.expectedView?.generation!==J.viewGeneration||this.expectedView.key!==T1(J.session))return!1;return this.acknowledgedView=Y,!0}finally{if(this.pendingView===Y)this.pendingView=void 0}}}function tZ($){return $.title?.trim()||`Session ${$.locator.sessionId.slice(0,8)}`}function U4($,J){let Y=$.filter((Z)=>Z.relationType!=="subagent");if(J!=="fork")return Y;return Y.filter((Z)=>Z.archivedAt===void 0&&Z.capabilities.history.fork)}function iJ($){return $.find((J)=>J.relationType!=="subagent"&&J.locator.workspace.kind==="local")}function oJ($,J,Y=!1){let Z=tZ($),X=Y?"[NEW] ":"";if($.locator.workspace.kind==="acp-remote"){let G=$.archivedAt?" · archived":"";return`${X}[remote · ${$.capabilities.connection} · history${G}] ${Z}
13
+ ${$.displayCwd} · ${$.messageCount} messages · ${J}${$.hasErrors?" [!]":""}`}let Q=sZ($.taskStatus),U=$.relationType==="subagent"?" ↳ subagent":$.relationType==="fork"?" ↳ fork":"";return`${X}[${Q}] ${Z} · ${J} | ${iZ($.displayCwd)} | ${$.messageCount} 条消息${$.hasErrors?" [!]":""}${U}`}function nJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}function sZ($){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 XY($,J,Y,Z={}){if($.locator.workspace.kind==="acp-remote"){if(J==="fork"&&Z.newSessionId)throw Error("Custom Session IDs are unavailable for remote history forks");return await Y.openHistory($,J),"history-only"}let X=await P6($);return await Y.activateLocal(X,J),"interactive"}function K4($){if($.remoteWorkspace)throw Error("Remote history cannot enter the local compatibility path");let J=$.archivedAt!==void 0,Y=YY($.taskCompletedAt);return G4.parse({locator:{version:2,sessionId:$.sessionId,workspace:{kind:"local",projectPath:$.projectPath}},displayCwd:$.projectPath,title:$.title,rootId:$.rootId,parentId:$.parentId,relationType:$.relationType,taskStatus:$.taskStatus,...Y!==void 0?{taskCompletedAt:Y}:{},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 P6($){if($.locator.workspace.kind!=="local")throw Error("Remote history cannot enter the local activation path");let J=$Y($.locator.workspace.projectPath),Y=await a0.findSessionMetadata($.locator.sessionId,J);if(!Y)throw Error("Session history is no longer available");if(Y.remoteWorkspace)throw Error("Remote history cannot enter the local activation path");return Y}function tJ($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function $7($){return eZ.resolve($)}function sJ($){if(!$||!JY($))return;m0().config.actions.updateConfig({currentModelId:$})}function eJ($){if(!$)return;m0().config.actions.updateConfig({permissionMode:$})}async function z4($,J,Y){let Z=Y?await Y.listAll():(await a0.listSessions({includeSubagents:!1})).map(K4);return U4(Z,$)}async function q4($,J,Y,Z){let{intent:X,session:Q,newSessionId:U,announceFork:G,permissionModeOverride:z}=$,K=$7(Q.projectPath);if(X==="fork"){let _=await a0.forkSession(Q.sessionId,{...U?{newSessionId:U}:{},sourceProjectPath:K,targetProjectPath:K}),W=await a0.loadSessionModelContext(_.sessionId,_.metadata.projectPath),H=[...a0.toUISafeMessages(_.messages)];if(G!==!1){let A=Date.parse(_.metadata.lastMessageTime);H.push({id:"fork-announcement-"+_.sessionId,role:"assistant",content:"Forked "+tJ(Q.sessionId)+" → "+tJ(_.sessionId),timestamp:Number.isNaN(A)?0:A})}return await Z(),eJ(z??_.metadata.permissionMode),sJ(_.metadata.selectedModelId),Y.restoreSession(_.sessionId,H,W,_.metadata.projectPath),{sessionId:_.sessionId,messages:W,projectPath:_.metadata.projectPath}}await a0.assertSessionWritable(Q.sessionId,Q.projectPath);let[O,q]=await Promise.all([a0.loadSession(Q.sessionId,Q.projectPath),a0.loadSessionModelContext(Q.sessionId,Q.projectPath)]),N=a0.toUISafeMessages(O);return await Z(),eJ(z??Q.permissionMode),sJ(Q.selectedModelId),Y.restoreSession(Q.sessionId,N,q,Q.projectPath),{sessionId:Q.sessionId,messages:q,projectPath:Q.projectPath}}var J7=H1("UI");function KY($){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 zY($){return G4.safeParse($).success}function ZY($){if(typeof $!=="object"||$===null)return!1;return Object.hasOwn($,"locator")?zY($):KY($)}function QY($){return zY($)?$:K4($)}function Y7($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function X7($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function Z7($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function Q7($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function U7($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function G7($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function K7($){if(typeof $!=="object"||$===null)return!1;let J=$.intent;if(J!=="resume"&&J!=="fork")return!1;let Y=$.action;if(Y==="select_session"){let Z=$.sessions;return Array.isArray(Z)&&Z.every(ZY)}if(Y==="activate_session"){let Z=$.session;return ZY(Z)}return!1}function z7($,J,Y,Z){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_follow_up_queue":return Y.setActiveModal("followUpQueue"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let X=J?.sessions;return Y.showSessionSelector((X??[]).map(K4),"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 Z.restoreSession(X.sessionId,X.visibleMessages,X.messages),!0}case"session_archived":{let X=J?.session;return Z.addAssistantMessage(X?`会话 ${X.sessionId} 已归档。`:"当前会话已归档。"),Y1(0),!0}case"clear_screen":return Z.clearMessages(),Z.setError(null),Z.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":case"compact_cancelled":{let X=J,Q=X?.compactedMessages;if(Q&&$!=="compact_cancelled")Z.setCompactedContext(Q);if(X?.usage)Z.updateTokenUsage({...$==="compact_cancelled"?{scope:"auxiliary"}:{},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});if($!=="compact_cancelled")Z.resetContextUsage();return!0}case"exit_application":return Y1(0),!0;default:return!1}}async function A6($,J,Y,Z,X,Q,U,G,z,K,O,q,N,_,W=K$(),H,A){let{text:b}=$;if(!UY(b))return{type:"not_slash"};let B=await GY(b,{cwd:W,surface:"tui",workspaceRoot:W,sessionId:Q,messages:U,rewind:G,lifecycle:Q===void 0?void 0:{archiveCurrent:async()=>{return await X(),a0.archiveSession(Q,W)}},subagents:z,mcp:K,reasoning:O,serviceTier:q,responseVerbosity:N,communicationStyle:_,codeReview:H,sessionSurfaces:A,signal:Z});if(B.success&&K7(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 M=KY(B.data.session)?B.data.session:await P6(F),L=await q4({...B.data,session:M},W,Y,X);try{if(B.data.intent==="resume")await A?.acknowledge?.(F),await A?.setVisibleLocator?.(F.locator);else await A?.setVisibleLocator?.({version:2,sessionId:L.sessionId,workspace:{kind:"local",projectPath:L.projectPath}})}catch{J7.warn("[slashCommandRouter] Task attention activation unavailable")}return{type:"handled",commandResult:{success:!0}}}if(B.success&&G7(B.data))return Y.restoreSession(B.data.sessionId,B.data.visibleMessages,B.data.messages),J.setTasks([]),{type:"handled",commandResult:{success:!0}};if(B.message){if(z7(B.message,B.data,J,Y))return{type:"handled",commandResult:{success:B.message!=="compact_cancelled"}}}if(Y7(B.data)){let{skillName:F,skillArgs:M}=B.data,L=M?`Please use the "${F}" skill to help me with: ${M}`:`Please use the "${F}" skill.`;return Y.addUserMessage(L),{type:"continue_as_agent",result:{userDisplayMessage:L,agentInput:{displayText:L,text:L,images:[],parts:[{type:"text",text:L}]},userMessageAlreadyAdded:!0}}}if(X7(B.data)){let{commandName:F,processedContent:M}=B.data;Y.addUserMessage(b);let L=`# Custom Command: /${F}
14
14
 
15
15
  The user has invoked the custom command "/${F}". Follow the instructions below to complete the task.
16
16
 
@@ -20,7 +20,7 @@ ${M}
20
20
 
21
21
  ---
22
22
 
23
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:b,agentInput:{displayText:b,text:L,images:[],parts:[{type:"text",text:L}]},userMessageAlreadyAdded:!0}}}if(Q7(B.data)){let{commandName:F,pluginName:M,processedContent:L}=B.data;Y.addUserMessage(b);let y=`# Plugin Command: /${F}
23
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:b,agentInput:{displayText:b,text:L,images:[],parts:[{type:"text",text:L}]},userMessageAlreadyAdded:!0}}}if(Z7(B.data)){let{commandName:F,pluginName:M,processedContent:L}=B.data;Y.addUserMessage(b);let y=`# Plugin Command: /${F}
24
24
 
25
25
  The user has invoked the plugin command "/${F}" from plugin "${M}". Follow the instructions below to complete the task.
26
26
 
@@ -30,19 +30,19 @@ ${L}
30
30
 
31
31
  ---
32
32
 
33
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:b,agentInput:{displayText:b,text:y,images:[],parts:[{type:"text",text:y}]},userMessageAlreadyAdded:!0}}}if(U7(B.data)){let{modelId:F,prompt:M}=B.data;return Y.addUserMessage(M),{type:"continue_as_agent",result:{userDisplayMessage:M,agentInput:{displayText:M,text:M,images:[],parts:[{type:"text",text:M}]},userMessageAlreadyAdded:!0,onceModelId:F}}}if(G7(B.data)){let F=B.data.goal.objective;return Y.addUserMessage(b),{type:"continue_as_agent",result:{userDisplayMessage:b,agentInput:{displayText:b,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!B.success&&B.error)return Y.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()!=="")Y.addAssistantMessage(C);return{type:"handled",commandResult:{success:B.success,output:B.message,error:B.error,metadata:B.data}}}import{useMemoizedFn as p0}from"ahooks";import{useEffect as _7,useRef as C1}from"react";function O7($,J){return $.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot}function zY($,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 OY=new WeakSet;function j$(){let $=new DOMException("TUI Agent lifecycle was invalidated","AbortError");return OY.add($),$}function qY($){return typeof $==="object"&&$!==null&&OY.has($)}function NY($){let J=C1(void 0),Y=C1(void 0),Z=C1(void 0),X=C1(void 0),Q=C1(0),U=C1(!1),G=C1(void 0),z=C1(void 0),K=C1(void 0),O=(I)=>{let D=K.current;if(D?.agent===I)return D.promise;let p={agent:I,promise:Promise.resolve()};return p.promise=Promise.resolve().then(()=>I.destroy()).finally(()=>{if(K.current===p)K.current=void 0}),K.current=p,p.promise},q=p0(()=>{Q.current++;let I=G.current;if(I)I.invalidated=!0;let D=z.current;if(D)D.invalidated=!0;if(X.current)return X.current.promise;let p=J.current,E=Y.current;J.current=void 0,Y.current=void 0,Z.current=void 0;let n=z.current,N0=G.current,X0=K.current?.promise,C0,Q0=(async()=>{let Y0,E0=async(F$)=>{if(!F$)return;try{await F$}catch(g0){if(!qY(g0))Y0??=g0}};if(await E0(n?.promise),n?.cleanupError!==void 0)Y0??=n.cleanupError;if(await E0(X0),p)await E0(O(p));if(await E0(N0?.promise),N0?.cleanupError!==void 0)Y0??=N0.cleanupError;if(E)await E0(E.dispose());if(Y0!==void 0)throw Y0})();C0={promise:Q0},X.current=C0;let S0=()=>{if(X.current===C0)X.current=void 0};return Q0.then(S0,S0),Q0}),N=p0(async(I)=>{let D=X.current;if(D){if(await D.promise,!U.current)throw j$();return N(I)}let p=$.workspaceRoot??Y.current?.workspaceRoot??K$(),E={sessionId:I,workspaceRoot:p};if(!U.current)throw j$();let n=G.current;if(n&&!n.invalidated&&n.generation===Q.current&&O7(n.target,E))return n.promise;if(n){let Q0=q(),S0=Q.current;if(await Q0,!U.current||Q.current!==S0)throw j$();return N(I)}if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==p)){let Q0=q(),S0=Q.current;if(await Q0,!U.current||Q.current!==S0)throw j$();return N(I)}if(!U.current)throw j$();if(Y.current)return Y.current;let N0=Q.current,X0,C0=Promise.resolve().then(async()=>{let Q0,S0=()=>{if(!U.current||X0.invalidated||Q.current!==N0||G.current!==X0)throw j$()};try{S0();let Y0=await a0.findSessionMetadata(I,p);S0();let E0=Y0!==void 0&&(await a0.loadSession(I,p)).length>0;S0(),Q0=await i$.create({sessionId:I,workspaceRoot:p,modelId:$.modelId,permissionMode:$.permissionMode??Y0?.permissionMode,reasoningEffort:Y0?.reasoningEffort??$.reasoningEffort,serviceTier:Y0?.serviceTier??$.serviceTier,responseVerbosity:Y0?.responseVerbosity??$.responseVerbosity,communicationStyle:Y0?.communicationStyle??$.communicationStyle,communicationStyleDigest:Y0?.communicationStyleDigest,agents:$.agents,...E0?{sessionStart:{isResume:!0,resumeSessionId:I}}:{}}),S0();let F$={sessionId:I,modelId:Y0?.selectedModelId,permissionMode:Y0?.permissionMode,reasoningEffort:Y0?.reasoningEffort,serviceTier:Y0?.serviceTier,responseVerbosity:Y0?.responseVerbosity,communicationStyle:Y0?.communicationStyle,communicationStyleDigest:Y0?.communicationStyleDigest},g0=Q0.getReasoningConfiguration().selection,N$=Q0.getServiceTierConfiguration().selection,r$=Q0.getResponseVerbosityConfiguration().selection,r0=Q0.getCommunicationStyleConfiguration().selection;return S0(),B$().setReasoningEffort(g0),B$().setServiceTier(N$),B$().setResponseVerbosity(r$),B$().setCommunicationStyle(r0),S0(),Y.current=Q0,Z.current=F$,Q0}catch(Y0){if(Q0&&Y.current!==Q0)await Q0.dispose().catch((E0)=>{X0.cleanupError??=E0});if(X0.invalidated||Q.current!==N0||!U.current)throw j$();throw Y0}finally{if(G.current===X0)G.current=void 0}});return X0={generation:N0,target:E,invalidated:!1,promise:C0},G.current=X0,C0}),_=async(I,D,p,E,n)=>{let N0;if(p&&D){let X0=I?.modelId??$.modelId,C0=I?.reasoningEffort??(E?$.reasoningEffort:p.getReasoningConfiguration().selection),Q0=I?.serviceTier??(E?$.serviceTier:p.getServiceTierConfiguration().selection),S0=I?.responseVerbosity??(E?$.responseVerbosity:p.getResponseVerbosityConfiguration().selection),Y0=I?.communicationStyle??(E?$.communicationStyle:p.getCommunicationStyleConfiguration().selection),E0=p.getCurrentModelId(),F$=p.getReasoningConfiguration(),g0=p.getServiceTierConfiguration(),N$=p.getResponseVerbosityConfiguration(),r$=p.getCommunicationStyleConfiguration();if($.permissionMode&&(Z.current?.sessionId!==D||Z.current.permissionMode!==$.permissionMode)){let d0=await a0.setSessionPermissionMode(D,p.workspaceRoot,$.permissionMode);n(),Z.current={...Z.current,sessionId:D,permissionMode:d0.permissionMode}}await p.refresh({modelId:X0,...C0?{reasoningEffort:C0}:{},...Q0?{serviceTier:Q0}:{},...S0?{responseVerbosity:S0}:{},...Y0?{communicationStyle:Y0}:{}}),n();let r0=p.getCommunicationStyleConfiguration();if(r0.source!=="built-in"&&!r0.contentSha256)throw Error("Custom communication style has no provenance");let G$={...X0&&X0!=="inherit"&&(Z.current?.sessionId!==D||Z.current.modelId!==X0)?{selectedModelId:X0}:{},...C0&&(Z.current?.sessionId!==D||Z.current.reasoningEffort!==C0)?{reasoningEffort:C0}:{},...Q0&&(Z.current?.sessionId!==D||Z.current.serviceTier!==Q0)?{serviceTier:Q0}:{},...S0&&(Z.current?.sessionId!==D||Z.current.responseVerbosity!==S0)?{responseVerbosity:S0}:{},...Y0&&(Z.current?.sessionId!==D||Z.current.communicationStyle!==Y0||Z.current.communicationStyleDigest!==r0.contentSha256)?{communicationStyle:Y0,communicationStyleDigest:r0.source==="built-in"?null:r0.contentSha256}:{}};if(Object.keys(G$).length>0)try{let d0=await a0.updateSessionMetadata(D,p.workspaceRoot,G$);n(),Z.current={sessionId:D,modelId:d0.selectedModelId,permissionMode:d0.permissionMode,reasoningEffort:d0.reasoningEffort,serviceTier:d0.serviceTier,responseVerbosity:d0.responseVerbosity,communicationStyle:d0.communicationStyle,communicationStyleDigest:d0.communicationStyleDigest}}catch(d0){if(qY(d0))throw d0;throw await p.refresh({...E0?{modelId:E0}:{},reasoningEffort:F$.selection,serviceTier:g0.selection,responseVerbosity:N$.selection,communicationStyle:r$.selection}).catch(()=>{return}),d0}N0=await q8.createWithRuntime(p,{sessionId:D,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents})}else N0=await q8.create({systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents});return N0},W=p0(async(I)=>{let D=X.current;if(D){if(await D.promise,!U.current)throw j$();return W(I)}if(!U.current)throw j$();let p=I?.sessionId??$.sessionId,E=!!I?.modelId&&I.modelId!==$.modelId,n=Y.current,N0={factory:!E&&p?"session":"standalone",sessionId:p,workspaceRoot:!E&&p?$.workspaceRoot??n?.workspaceRoot??K$():$.workspaceRoot??K$(),runtime:!E&&p&&n&&n.sessionId===p&&n.workspaceRoot===($.workspaceRoot??n.workspaceRoot)?n:void 0,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,reasoningEffort:I?.reasoningEffort??$.reasoningEffort,serviceTier:I?.serviceTier??$.serviceTier,responseVerbosity:I?.responseVerbosity??$.responseVerbosity,communicationStyle:I?.communicationStyle??$.communicationStyle,agents:$.agents},X0=z.current;if(X0){if(!X0.invalidated&&X0.generation===Q.current&&zY(X0.target,N0))return X0.promise;X0.invalidated=!0,Q.current++;let G$=Q.current;if(await X0.promise.catch(()=>{return}),X0.cleanupError!==void 0)throw X0.cleanupError;if(!U.current||Q.current!==G$)throw j$();return W(I)}let C0=Y.current!==void 0,Q0=!E&&p?await N(p):void 0;if(!U.current||Q0!==void 0&&Y.current!==Q0)throw j$();let S0={factory:Q0?"session":"standalone",sessionId:p,workspaceRoot:Q0?.workspaceRoot??$.workspaceRoot??K$(),runtime:Q0,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,reasoningEffort:I?.reasoningEffort??$.reasoningEffort,serviceTier:I?.serviceTier??$.serviceTier,responseVerbosity:I?.responseVerbosity??$.responseVerbosity,communicationStyle:I?.communicationStyle??$.communicationStyle,agents:$.agents},Y0=z.current;if(Y0&&!Y0.invalidated&&Y0.generation===Q.current&&zY(Y0.target,S0))return Y0.promise;if(Y0){Y0.invalidated=!0,Q.current++;let r0=Q.current;if(await Y0.promise.catch(()=>{return}),Y0.cleanupError!==void 0)throw Y0.cleanupError;if(!U.current||Q.current!==r0)throw j$();return W(I)}let E0=Q.current,F$=J.current,g0;if(F$)J.current=void 0,g0=O(F$);let N$,r$=Promise.resolve().then(async()=>{let r0,G$=()=>{if(!U.current||N$.invalidated||Q.current!==E0||z.current!==N$||Q0!==void 0&&Y.current!==Q0)throw j$()};try{if(G$(),g0){try{await g0}catch(d0){throw N$.cleanupError??=d0,G$(),d0}G$()}return r0=await _(I,p,Q0,C0,G$),G$(),J.current=r0,r0}catch(d0){if(r0&&J.current!==r0)await O(r0).catch((P1)=>{N$.cleanupError??=P1});if(N$.invalidated||Q.current!==E0||!U.current)throw j$();throw d0}finally{if(z.current===N$)z.current=void 0}});return N$={generation:E0,target:S0,invalidated:!1,promise:r$},z.current=N$,r$}),H=p0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await N($.sessionId)).listRewindCheckpoints()}),A=p0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let p=await(await N($.sessionId)).rewindSession(I);return await q(),p}),b=p0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await N($.sessionId)).listSubagents()}),w=p0(async(I,D)=>{if(!$.sessionId)throw Error("No active session for subagent control");let p=await N($.sessionId),E=!1,n,N0=I,X0=(Q0)=>{let S0=Q0.status==="completed"?Q0.result?.message:Q0.result?.error||Q0.result?.message;v2.getState().app.actions.completeSubagentProgress(N0,Q0.status==="completed",S0)},C0=p.resumeSubagent({agentId:I,prompt:D,onEvent:(Q0)=>{if(Q0.kind==="tool_start"&&"function"in Q0.toolCall)v2.getState().app.actions.updateSubagentTool(N0,Q0.toolCall.function.name)},onCompleted:(Q0)=>{if(E)X0(Q0);else n=Q0}});if(N0=C0.session.id,v2.getState().app.actions.startSubagentProgress(C0.session.id,C0.session.subagentType,`Resumed from ${C0.source.id}: ${C0.session.description}`),E=!0,n)X0(n);return C0}),B=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await N($.sessionId)).getMcpContentCatalog()}),C=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await N($.sessionId)).refreshMcpContentCatalogs(I)}),F=p0(async(I,D,p)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await N($.sessionId)).getMcpPrompt(I,D,p)}),M=p0(async(I,D,p)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await N($.sessionId)).completeMcpArgument(I,D,p)}),L=p0(async(I,D={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await N($.sessionId)).getMcpLogs(I,D)}),y=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).listMcpTasks(I)}),S=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).getMcpTask(I)}),T=p0(async(I,D)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).cancelMcpTask(I,D)}),R=p0(async(I,D)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await N($.sessionId)).setMcpLoggingLevel(I,D)}),P=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await N($.sessionId)).getMcpInstructions()}),j=p0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await N($.sessionId)).getReasoningConfiguration()}),o=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let p=D.getReasoningConfiguration();if(D.resolveReasoningConfiguration(I),p.selection===I)return p;await D.refresh({reasoningEffort:I});try{let E;try{E=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{reasoningEffort:I})}catch(n){if(!(n instanceof z8)&&n.code!=="ENOENT")throw n;E=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:I,serviceTier:D.getServiceTierConfiguration().selection,responseVerbosity:D.getResponseVerbosityConfiguration().selection,communicationStyle:D.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:E.selectedModelId,permissionMode:E.permissionMode,reasoningEffort:E.reasoningEffort,serviceTier:E.serviceTier,responseVerbosity:E.responseVerbosity,communicationStyle:E.communicationStyle,communicationStyleDigest:E.communicationStyleDigest},B$().setReasoningEffort(I),D.getReasoningConfiguration()}catch(E){throw await D.refresh({reasoningEffort:p.selection}),E}}),u=p0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await N($.sessionId)).getServiceTierConfiguration()}),J0=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for service tier");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let p=D.getServiceTierConfiguration();if(D.resolveServiceTierConfiguration(I),p.selection===I)return p;await D.refresh({serviceTier:I});try{let E;try{E=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{serviceTier:I})}catch(n){if(!(n instanceof z8)&&n.code!=="ENOENT")throw n;E=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:D.getReasoningConfiguration().selection,serviceTier:I,responseVerbosity:D.getResponseVerbosityConfiguration().selection,communicationStyle:D.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:E.selectedModelId,permissionMode:E.permissionMode,reasoningEffort:E.reasoningEffort,serviceTier:E.serviceTier,responseVerbosity:E.responseVerbosity,communicationStyle:E.communicationStyle,communicationStyleDigest:E.communicationStyleDigest},B$().setServiceTier(I),D.getServiceTierConfiguration()}catch(E){throw await D.refresh({serviceTier:p.selection}),E}}),K0=p0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await N($.sessionId)).getResponseVerbosityConfiguration()}),q0=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let p=D.getResponseVerbosityConfiguration();if(D.resolveResponseVerbosityConfiguration(I),p.selection===I)return p;await D.refresh({responseVerbosity:I});try{let E;try{E=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{responseVerbosity:I})}catch(n){if(!(n instanceof z8)&&n.code!=="ENOENT")throw n;E=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:D.getReasoningConfiguration().selection,serviceTier:D.getServiceTierConfiguration().selection,responseVerbosity:I,communicationStyle:D.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:E.selectedModelId,permissionMode:E.permissionMode,reasoningEffort:E.reasoningEffort,serviceTier:E.serviceTier,responseVerbosity:E.responseVerbosity,communicationStyle:E.communicationStyle,communicationStyleDigest:E.communicationStyleDigest},B$().setResponseVerbosity(I),D.getResponseVerbosityConfiguration()}catch(E){throw await D.refresh({responseVerbosity:p.selection}),E}}),a=p0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await N($.sessionId)).getCommunicationStyleConfiguration()}),f=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for communication style");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let p=D.getCommunicationStyleConfiguration(),E=D.resolveCommunicationStyleConfiguration(I);if(E.source!=="built-in"&&!E.contentSha256)throw Error("Custom communication style has no provenance");if(p.selection===I)return p;await D.refresh({communicationStyle:I});try{let n;try{n=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{communicationStyle:I,communicationStyleDigest:E.source==="built-in"?null:E.contentSha256})}catch(N0){if(!(N0 instanceof z8)&&N0.code!=="ENOENT")throw N0;n=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:D.getReasoningConfiguration().selection,serviceTier:D.getServiceTierConfiguration().selection,responseVerbosity:D.getResponseVerbosityConfiguration().selection,communicationStyle:I,...E.source!=="built-in"&&E.contentSha256?{communicationStyleDigest:E.contentSha256}:{}})}return Z.current={sessionId:$.sessionId,modelId:n.selectedModelId,permissionMode:n.permissionMode,reasoningEffort:n.reasoningEffort,serviceTier:n.serviceTier,responseVerbosity:n.responseVerbosity,communicationStyle:n.communicationStyle,communicationStyleDigest:n.communicationStyleDigest},B$().setCommunicationStyle(I),D.getCommunicationStyleConfiguration()}catch(n){throw await D.refresh({communicationStyle:p.selection}),n}}),v=p0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),G0=p0(async(I,D)=>{let p=$.sessionId;if(!p)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await N(p)).enqueueSteering(I,{allowBeforeTurn:!0,...D})}),V=p0(async()=>{let I=$.sessionId;if(!I)throw Error("Follow-up queue requires a Session");return(await N(I)).getFollowUpQueueSnapshot()}),x=p0(async(I)=>{let D=$.sessionId;if(!D)throw Error("Follow-up queue requires a Session");return(await N(D)).mutateFollowUpQueue(I)}),l=p0(async(I,D)=>{let p=$.sessionId;if(!p)throw Error("Side conversation requires a Session");return(await N(p)).askSideQuestion(I,{signal:D,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),H0=p0(async(I,D)=>{let p=$.sessionId;if(!p)throw Error("User shell command requires a Session");return(await N(p)).executeUserShellCommand(I,D)}),F0=p0(()=>Y.current?.getTurnRecoveryAssessment()??{state:"none"}),T0=p0(async(I,D)=>{let p=$.sessionId;if(!p)throw Error("Code review requires a Session");let E=await N(p);await q4.recoverInterrupted(E.workspaceRoot,p,E);let n=await q4.start({sessionId:p,projectPath:E.workspaceRoot,runtime:E,request:I,signal:D}),N0=await n.completion,X0=(await q4.list(E.workspaceRoot,p)).find((C0)=>C0.start.reviewId===n.reviewId);if(!X0)throw Error(`Review not found after completion: ${n.reviewId}`);return{reviewId:n.reviewId,status:N0.status,findings:N0.findings.length,content:_Y(X0.start,N0)}});return _7(()=>{U.current=!0;let D=_4(async()=>{U.current=!1,await q()});return()=>{D(),U.current=!1,q().catch(()=>{return})}},[q]),{agentRef:J,createAgent:W,cleanupAgent:q,steerActiveTurn:v,enqueueSessionInput:G0,getFollowUpQueue:V,mutateFollowUpQueue:x,askSideQuestion:l,runCodeReview:T0,executeUserShellCommand:H0,getTurnRecoveryAssessment:F0,listRewindCheckpoints:H,rewindSession:A,listSubagents:b,resumeSubagent:w,getMcpContentCatalog:B,refreshMcpContentCatalogs:C,getMcpPrompt:F,completeMcpArgument:M,listMcpTasks:y,getMcpTask:S,cancelMcpTask:T,getMcpLogs:L,setMcpLoggingLevel:R,getMcpInstructions:P,getReasoningConfiguration:j,setReasoningEffort:o,getServiceTierConfiguration:u,setServiceTier:J0,getResponseVerbosityConfiguration:K0,setResponseVerbosity:q0,getCommunicationStyleConfiguration:a,setCommunicationStyle:f}}import{useMemoizedFn as c2}from"ahooks";import{useEffect as N7,useRef as O4}from"react";function HY($){let J=0;for(let Y of $)if(Y===`
34
- `)J++;return J}function WY($,J){let Y=J?.flushTimeout??300,Z=J?.minLinesToFlush??5,X=J?.minCharsToFlush??400,Q=O4(""),U=O4(null),G=O4(""),z=O4(null),K=c2(()=>{if(Q.current){let H=Q.current,A=$.appendAssistantContent(H);o8(A,H),Q.current=""}if(U.current)clearTimeout(U.current),U.current=null}),O=c2(()=>{if(G.current)$.appendThinkingContent(G.current),G.current="";if(z.current)clearTimeout(z.current),z.current=null}),q=c2((H)=>{Q.current+=H;let A=Q.current;if(HY(A)>=Z||A.length>=X){K();return}if(!U.current)U.current=setTimeout(K,Y)}),N=c2((H)=>{G.current+=H;let A=G.current;if(HY(A)>=Z||A.length>=X){O();return}if(!z.current)z.current=setTimeout(O,Y)}),_=c2(()=>{if(Q.current="",U.current)clearTimeout(U.current),U.current=null;if(G.current="",z.current)clearTimeout(z.current),z.current=null}),W=c2(()=>{if(U.current)clearTimeout(U.current),U.current=null;if(z.current)clearTimeout(z.current),z.current=null;let H=Q.current,A=G.current;return Q.current="",G.current="",{extraContent:H,extraThinking:A}});return N7(()=>{return()=>{_()}},[_]),{batchAppendContent:q,batchAppendThinking:N,flushContentBuffer:K,flushThinkingBuffer:O,resetStreamingBuffers:_,drainPendingBuffers:W}}var _8=H1("UI");function H4($,J){return[...($??[]).filter((Y)=>Y!==J),J].slice(-16)}function LY($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var CY=($,J,Y,Z,X,Q,U)=>{let G=g2(),z=V2(),K=O1(),O=m8(),q=E2(),N=x8(),_=c8(),W=u8(),H=d8(),A=l8(),b=h2(),w=OJ(),B=d1(),C=N1(),F=WJ(),M=N4(!1),L=N4(null),y=N4(null),S=N4(null),{createAgent:T,cleanupAgent:R,steerActiveTurn:P,enqueueSessionInput:j,getFollowUpQueue:o,mutateFollowUpQueue:u,listRewindCheckpoints:J0,rewindSession:K0,listSubagents:q0,resumeSubagent:a,getMcpContentCatalog:f,refreshMcpContentCatalogs:v,getMcpPrompt:G0,completeMcpArgument:V,listMcpTasks:x,getMcpTask:l,cancelMcpTask:H0,getMcpLogs:F0,setMcpLoggingLevel:T0,getMcpInstructions:I,getReasoningConfiguration:D,setReasoningEffort:p,getServiceTierConfiguration:E,setServiceTier:n,getResponseVerbosityConfiguration:N0,setResponseVerbosity:X0,getCommunicationStyleConfiguration:C0,setCommunicationStyle:Q0,runCodeReview:S0,askSideQuestion:Y0,executeUserShellCommand:E0,getTurnRecoveryAssessment:F$}=NY({sessionId:z,workspaceRoot:K,systemPrompt:$,appendSystemPrompt:J,maxTurns:Z,modelId:O,permissionMode:q,reasoningEffort:_,serviceTier:W,responseVerbosity:H,communicationStyle:A,agents:Q}),g0=FY(()=>[K,z,H7()].join("\x00"),[z,K]),N$=X1(async()=>{let k=m0().app.followUpQueue?.version,h=m0().app.followUpQueueMutation;try{let m=await o(),c=m0().app.followUpQueue?.version,r=c===k||c===m.version;if(r)C.projectFollowUpQueue(m,g0);let P0=m0().app.followUpQueueMutation.supersededVersions;C.setFollowUpQueueMutation(h.errorCode==="revision_conflict"?{pending:!1,errorCode:h.errorCode,errorMessage:h.errorMessage,supersededVersions:r?P0:H4(P0,m.version)}:{pending:!1,supersededVersions:r?P0:H4(P0,m.version)},g0)}catch{C.setFollowUpQueueMutation({pending:!1,errorMessage:"Follow-up queue is unavailable"},g0)}}),r$=X1(async(k)=>{let h=m0().app.followUpQueue;if(!h||m0().app.followUpQueueMutation.pending)return!1;C.setFollowUpQueueMutation({pending:!0,messageId:k.messageId},g0);try{let m=await u({expectedVersion:h.version,operation:k}),c=m0().app.followUpQueue?.version;if(c===h.version||c===m.snapshot.version)C.projectFollowUpQueue(m.snapshot,g0);let r=c===h.version||c===m.snapshot.version,P0=m0().app.followUpQueueMutation.supersededVersions;if(C.setFollowUpQueueMutation({pending:!1,supersededVersions:r?P0:H4(P0,m.snapshot.version)},g0),k.type==="remove")F.takeFollowUpPresentation(k.messageId);return!0}catch(m){if(m instanceof MY){let c=m0().app.followUpQueue?.version,r=c===h.version||c===m.snapshot.version;if(r)C.projectFollowUpQueue(m.snapshot,g0);let P0=m0().app.followUpQueueMutation.supersededVersions;C.setFollowUpQueueMutation({pending:!1,errorCode:m.code,errorMessage:m.message,supersededVersions:r?P0:H4(P0,m.snapshot.version)},g0)}else C.setFollowUpQueueMutation({pending:!1,errorMessage:"Follow-up queue is unavailable"},g0);return!1}}),r0=WY(B),G$=X1((k)=>new U8({signal:k,streamingBuffer:r0,getStreamingMessageId:()=>m0().session.currentStreamingMessageId,finalizeStreamingMessage:B.finalizeStreamingMessage,discardStreamingMessage:B.discardStreamingMessage,clearThinking:()=>B.setCurrentThinkingContent(null)})),d0=X1(async()=>{if(!w||!z){C.setTeams([]);return}try{let h=await new TY({configDir:K8(),subagentRegistry:W4(K)}).list({sessionId:z,projectPath:K});if(m0().session.sessionId===z&&m0().session.workspaceRoot===K)C.setTeams(h)}catch(k){_8.warn("[useCommandHandler] Failed to refresh Agent Teams",k)}}),P1=X1(async(k,h)=>{if(k.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let m=k.text.trimStart().slice(1).trim();if(!m)return{success:!1,error:"User shell command cannot be empty"};B.setCommand(`! ${m}`);try{let c=await E0(m,{signal:h});if(B.addMessage({id:`user-shell-${c.executionId}`,role:"user",content:A6(c.record),timestamp:Date.now(),metadata:{userShellCommand:c.record}}),c.delivery==="next_turn"){let r=m0().session;if(r.sessionId===z&&r.workspaceRoot===K)y.current?.request()}return{success:c.record.status!=="spawn_error",output:A6(c.record),...c.record.status==="spawn_error"?{error:c.record.stderr||"User shell command failed"}:{}}}finally{B.setCommand(null)}});l1(()=>{return()=>{L.current=null,r0.resetStreamingBuffers()}},[r0.resetStreamingBuffers]),l1(()=>{return()=>{S.current?.abort("side-conversation-session-change"),S.current=null,C.dismissSideConversation()}},[C,z,K]),l1(()=>{C.setTeams([]),d0()},[w,C,d0,z,K]),l1(()=>{if(!N)B.setCurrentThinkingContent(null)},[N,B]);let A1=X1(()=>{if(S.current){S.current.abort("user-cancel"),S.current=null,C.dismissSideConversation();return}if(!G)return;X?.();let k=F.getAbortController()?.signal??new AbortController().signal;if((L.current??G$(k)).abortAndFinalize(()=>{F.abort("user-cancel"),C.setTasks([])}),!M.current)B.addAssistantMessage("任务已停止"),M.current=!0}),Q8=X1(async(k,h)=>{let m=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(C.startSideConversation(m,h),k.images.length>0){C.failSideConversation(m,"Side conversations do not accept image attachments");return}if(!h){C.failSideConversation(m,"Usage: /btw <question>");return}S.current?.abort("side-conversation-replaced");let c=new AbortController;S.current=c;try{let r=await Y0(h,c.signal);if(c.signal.aborted||S.current!==c)return;if(C.completeSideConversation(m,r),r.usage)B.updateTokenUsage({scope:"auxiliary",inputTokens:r.usage.promptTokens,outputTokens:r.usage.completionTokens,totalTokens:r.usage.totalTokens,cacheReadTokens:r.usage.cacheReadInputTokens??0,cacheWriteTokens:r.usage.cacheCreationInputTokens??0,costUsd:r.usage.costUsd})}catch(r){if(c.signal.aborted||S.current!==c)return;C.failSideConversation(m,r instanceof Error?r.message:String(r))}finally{if(S.current===c)S.current=null}}),c1=X1(async(k,h)=>{let m={contentDeltaCount:0,contentDeltaTotalLen:0,outputStarted:!1,toolExecutionStarted:!1,compactionCount:0},c=G$(h.signal);L.current=c;let r=DJ({sessionActions:B,appActions:C,commandActions:F,streamingBuffer:r0,thinkingModeEnabled:N,getStreamingMessageId:()=>m0().session.currentStreamingMessageId,signal:h.signal,streamSession:c,followUpQueueOwner:g0},m);try{return{loopResult:await wY(k,r),stats:m}}finally{if(L.current===c)L.current=null}}),k2=X1(async(k)=>{let h=!1,m,c=!1,r=k;try{if(k.text.trimStart().startsWith("!")){let Z$=F.getAbortController()??F.createAbortController();return await P1(k,Z$.signal)}await O8();let P0=F.getAbortController()??F.createAbortController(),l0=$4(m0().session),c0=await P6(k,C,B,P0.signal,R,z,$4(m0().session),{listCheckpoints:J0,execute:K0},{list:q0,resume:a},{getCatalog:f,refresh:v,getPrompt:G0,complete:V,listTasks:x,getTask:l,cancelTask:H0,getLogs:F0,setLoggingLevel:T0,getInstructions:I},{get:D,set:p},{get:E,set:n},{get:N0,set:X0},{get:C0,set:Q0},K,{run:S0},U);if(c0.type==="handled")return c0.commandResult;if(c0.type==="continue_as_agent")h=c0.result.userMessageAlreadyAdded,m=c0.result.onceModelId,c=c0.result.goalContinuationOnly===!0,r=c0.result.agentInput;let b$=h$.getInstance(),_1;if(!c){let Z$=await b$.executeUserPromptSubmitHooks(r.text,{projectDir:K,sessionId:z,permissionMode:q,hasImages:r.images.length>0,imageCount:r.images.length});if(!Z$.proceed){if(Z$.warning)B.addAssistantMessage(`${Z$.warning}`);return{success:!1,error:"blocked by hook"}}if(Z$.updatedPrompt)r={...r,text:Z$.updatedPrompt,displayText:Z$.updatedPrompt,parts:[{type:"text",text:Z$.updatedPrompt},...r.parts.filter((D2)=>D2.type==="image")]};if(Z$.contextInjection)_1=Z$.contextInjection}if(!h)B.addUserMessage(r.displayText);let Q2=H6(r),w$=await T(m?{modelId:m}:void 0);if(P0.signal.aborted)return _8.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(_1)l0.push({role:"system",content:`<user-prompt-submit-hook>
33
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:b,agentInput:{displayText:b,text:y,images:[],parts:[{type:"text",text:y}]},userMessageAlreadyAdded:!0}}}if(Q7(B.data)){let{modelId:F,prompt:M}=B.data;return Y.addUserMessage(M),{type:"continue_as_agent",result:{userDisplayMessage:M,agentInput:{displayText:M,text:M,images:[],parts:[{type:"text",text:M}]},userMessageAlreadyAdded:!0,onceModelId:F}}}if(U7(B.data)){let F=B.data.goal.objective;return Y.addUserMessage(b),{type:"continue_as_agent",result:{userDisplayMessage:b,agentInput:{displayText:b,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!B.success&&B.error)return Y.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()!=="")Y.addAssistantMessage(C);return{type:"handled",commandResult:{success:B.success,output:B.message,error:B.error,metadata:B.data}}}import{useMemoizedFn as p0}from"ahooks";import{useEffect as q7,useRef as C1}from"react";function _7($,J){return $.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot}function qY($,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 NY=new WeakSet;function j$(){let $=new DOMException("TUI Agent lifecycle was invalidated","AbortError");return NY.add($),$}function _Y($){return typeof $==="object"&&$!==null&&NY.has($)}function HY($){let J=C1(void 0),Y=C1(void 0),Z=C1(void 0),X=C1(void 0),Q=C1(0),U=C1(!1),G=C1(void 0),z=C1(void 0),K=C1(void 0),O=(I)=>{let D=K.current;if(D?.agent===I)return D.promise;let p={agent:I,promise:Promise.resolve()};return p.promise=Promise.resolve().then(()=>I.destroy()).finally(()=>{if(K.current===p)K.current=void 0}),K.current=p,p.promise},q=p0(()=>{Q.current++;let I=G.current;if(I)I.invalidated=!0;let D=z.current;if(D)D.invalidated=!0;if(X.current)return X.current.promise;let p=J.current,h=Y.current;J.current=void 0,Y.current=void 0,Z.current=void 0;let n=z.current,N0=G.current,X0=K.current?.promise,C0,Q0=(async()=>{let Y0,h0=async(F$)=>{if(!F$)return;try{await F$}catch(g0){if(!_Y(g0))Y0??=g0}};if(await h0(n?.promise),n?.cleanupError!==void 0)Y0??=n.cleanupError;if(await h0(X0),p)await h0(O(p));if(await h0(N0?.promise),N0?.cleanupError!==void 0)Y0??=N0.cleanupError;if(h)await h0(h.dispose());if(Y0!==void 0)throw Y0})();C0={promise:Q0},X.current=C0;let S0=()=>{if(X.current===C0)X.current=void 0};return Q0.then(S0,S0),Q0}),N=p0(async(I)=>{let D=X.current;if(D){if(await D.promise,!U.current)throw j$();return N(I)}let p=$.workspaceRoot??Y.current?.workspaceRoot??K$(),h={sessionId:I,workspaceRoot:p};if(!U.current)throw j$();let n=G.current;if(n&&!n.invalidated&&n.generation===Q.current&&_7(n.target,h))return n.promise;if(n){let Q0=q(),S0=Q.current;if(await Q0,!U.current||Q.current!==S0)throw j$();return N(I)}if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==p)){let Q0=q(),S0=Q.current;if(await Q0,!U.current||Q.current!==S0)throw j$();return N(I)}if(!U.current)throw j$();if(Y.current)return Y.current;let N0=Q.current,X0,C0=Promise.resolve().then(async()=>{let Q0,S0=()=>{if(!U.current||X0.invalidated||Q.current!==N0||G.current!==X0)throw j$()};try{S0();let Y0=await a0.findSessionMetadata(I,p);S0();let h0=Y0!==void 0&&(await a0.loadSession(I,p)).length>0;S0(),Q0=await i$.create({sessionId:I,workspaceRoot:p,modelId:$.modelId,permissionMode:$.permissionMode??Y0?.permissionMode,reasoningEffort:Y0?.reasoningEffort??$.reasoningEffort,serviceTier:Y0?.serviceTier??$.serviceTier,responseVerbosity:Y0?.responseVerbosity??$.responseVerbosity,communicationStyle:Y0?.communicationStyle??$.communicationStyle,communicationStyleDigest:Y0?.communicationStyleDigest,agents:$.agents,...h0?{sessionStart:{isResume:!0,resumeSessionId:I}}:{}}),S0();let F$={sessionId:I,modelId:Y0?.selectedModelId,permissionMode:Y0?.permissionMode,reasoningEffort:Y0?.reasoningEffort,serviceTier:Y0?.serviceTier,responseVerbosity:Y0?.responseVerbosity,communicationStyle:Y0?.communicationStyle,communicationStyleDigest:Y0?.communicationStyleDigest},g0=Q0.getReasoningConfiguration().selection,N$=Q0.getServiceTierConfiguration().selection,r$=Q0.getResponseVerbosityConfiguration().selection,r0=Q0.getCommunicationStyleConfiguration().selection;return S0(),B$().setReasoningEffort(g0),B$().setServiceTier(N$),B$().setResponseVerbosity(r$),B$().setCommunicationStyle(r0),S0(),Y.current=Q0,Z.current=F$,Q0}catch(Y0){if(Q0&&Y.current!==Q0)await Q0.dispose().catch((h0)=>{X0.cleanupError??=h0});if(X0.invalidated||Q.current!==N0||!U.current)throw j$();throw Y0}finally{if(G.current===X0)G.current=void 0}});return X0={generation:N0,target:h,invalidated:!1,promise:C0},G.current=X0,C0}),_=async(I,D,p,h,n)=>{let N0;if(p&&D){let X0=I?.modelId??$.modelId,C0=I?.reasoningEffort??(h?$.reasoningEffort:p.getReasoningConfiguration().selection),Q0=I?.serviceTier??(h?$.serviceTier:p.getServiceTierConfiguration().selection),S0=I?.responseVerbosity??(h?$.responseVerbosity:p.getResponseVerbosityConfiguration().selection),Y0=I?.communicationStyle??(h?$.communicationStyle:p.getCommunicationStyleConfiguration().selection),h0=p.getCurrentModelId(),F$=p.getReasoningConfiguration(),g0=p.getServiceTierConfiguration(),N$=p.getResponseVerbosityConfiguration(),r$=p.getCommunicationStyleConfiguration();if($.permissionMode&&(Z.current?.sessionId!==D||Z.current.permissionMode!==$.permissionMode)){let d0=await a0.setSessionPermissionMode(D,p.workspaceRoot,$.permissionMode);n(),Z.current={...Z.current,sessionId:D,permissionMode:d0.permissionMode}}await p.refresh({modelId:X0,...C0?{reasoningEffort:C0}:{},...Q0?{serviceTier:Q0}:{},...S0?{responseVerbosity:S0}:{},...Y0?{communicationStyle:Y0}:{}}),n();let r0=p.getCommunicationStyleConfiguration();if(r0.source!=="built-in"&&!r0.contentSha256)throw Error("Custom communication style has no provenance");let G$={...X0&&X0!=="inherit"&&(Z.current?.sessionId!==D||Z.current.modelId!==X0)?{selectedModelId:X0}:{},...C0&&(Z.current?.sessionId!==D||Z.current.reasoningEffort!==C0)?{reasoningEffort:C0}:{},...Q0&&(Z.current?.sessionId!==D||Z.current.serviceTier!==Q0)?{serviceTier:Q0}:{},...S0&&(Z.current?.sessionId!==D||Z.current.responseVerbosity!==S0)?{responseVerbosity:S0}:{},...Y0&&(Z.current?.sessionId!==D||Z.current.communicationStyle!==Y0||Z.current.communicationStyleDigest!==r0.contentSha256)?{communicationStyle:Y0,communicationStyleDigest:r0.source==="built-in"?null:r0.contentSha256}:{}};if(Object.keys(G$).length>0)try{let d0=await a0.updateSessionMetadata(D,p.workspaceRoot,G$);n(),Z.current={sessionId:D,modelId:d0.selectedModelId,permissionMode:d0.permissionMode,reasoningEffort:d0.reasoningEffort,serviceTier:d0.serviceTier,responseVerbosity:d0.responseVerbosity,communicationStyle:d0.communicationStyle,communicationStyleDigest:d0.communicationStyleDigest}}catch(d0){if(_Y(d0))throw d0;throw await p.refresh({...h0?{modelId:h0}:{},reasoningEffort:F$.selection,serviceTier:g0.selection,responseVerbosity:N$.selection,communicationStyle:r$.selection}).catch(()=>{return}),d0}N0=await q8.createWithRuntime(p,{sessionId:D,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents})}else N0=await q8.create({systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents});return N0},W=p0(async(I)=>{let D=X.current;if(D){if(await D.promise,!U.current)throw j$();return W(I)}if(!U.current)throw j$();let p=I?.sessionId??$.sessionId,h=!!I?.modelId&&I.modelId!==$.modelId,n=Y.current,N0={factory:!h&&p?"session":"standalone",sessionId:p,workspaceRoot:!h&&p?$.workspaceRoot??n?.workspaceRoot??K$():$.workspaceRoot??K$(),runtime:!h&&p&&n&&n.sessionId===p&&n.workspaceRoot===($.workspaceRoot??n.workspaceRoot)?n:void 0,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,reasoningEffort:I?.reasoningEffort??$.reasoningEffort,serviceTier:I?.serviceTier??$.serviceTier,responseVerbosity:I?.responseVerbosity??$.responseVerbosity,communicationStyle:I?.communicationStyle??$.communicationStyle,agents:$.agents},X0=z.current;if(X0){if(!X0.invalidated&&X0.generation===Q.current&&qY(X0.target,N0))return X0.promise;X0.invalidated=!0,Q.current++;let G$=Q.current;if(await X0.promise.catch(()=>{return}),X0.cleanupError!==void 0)throw X0.cleanupError;if(!U.current||Q.current!==G$)throw j$();return W(I)}let C0=Y.current!==void 0,Q0=!h&&p?await N(p):void 0;if(!U.current||Q0!==void 0&&Y.current!==Q0)throw j$();let S0={factory:Q0?"session":"standalone",sessionId:p,workspaceRoot:Q0?.workspaceRoot??$.workspaceRoot??K$(),runtime:Q0,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,reasoningEffort:I?.reasoningEffort??$.reasoningEffort,serviceTier:I?.serviceTier??$.serviceTier,responseVerbosity:I?.responseVerbosity??$.responseVerbosity,communicationStyle:I?.communicationStyle??$.communicationStyle,agents:$.agents},Y0=z.current;if(Y0&&!Y0.invalidated&&Y0.generation===Q.current&&qY(Y0.target,S0))return Y0.promise;if(Y0){Y0.invalidated=!0,Q.current++;let r0=Q.current;if(await Y0.promise.catch(()=>{return}),Y0.cleanupError!==void 0)throw Y0.cleanupError;if(!U.current||Q.current!==r0)throw j$();return W(I)}let h0=Q.current,F$=J.current,g0;if(F$)J.current=void 0,g0=O(F$);let N$,r$=Promise.resolve().then(async()=>{let r0,G$=()=>{if(!U.current||N$.invalidated||Q.current!==h0||z.current!==N$||Q0!==void 0&&Y.current!==Q0)throw j$()};try{if(G$(),g0){try{await g0}catch(d0){throw N$.cleanupError??=d0,G$(),d0}G$()}return r0=await _(I,p,Q0,C0,G$),G$(),J.current=r0,r0}catch(d0){if(r0&&J.current!==r0)await O(r0).catch((P1)=>{N$.cleanupError??=P1});if(N$.invalidated||Q.current!==h0||!U.current)throw j$();throw d0}finally{if(z.current===N$)z.current=void 0}});return N$={generation:h0,target:S0,invalidated:!1,promise:r$},z.current=N$,r$}),H=p0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await N($.sessionId)).listRewindCheckpoints()}),A=p0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let p=await(await N($.sessionId)).rewindSession(I);return await q(),p}),b=p0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await N($.sessionId)).listSubagents()}),w=p0(async(I,D)=>{if(!$.sessionId)throw Error("No active session for subagent control");let p=await N($.sessionId),h=!1,n,N0=I,X0=(Q0)=>{let S0=Q0.status==="completed"?Q0.result?.message:Q0.result?.error||Q0.result?.message;v2.getState().app.actions.completeSubagentProgress(N0,Q0.status==="completed",S0)},C0=p.resumeSubagent({agentId:I,prompt:D,onEvent:(Q0)=>{if(Q0.kind==="tool_start"&&"function"in Q0.toolCall)v2.getState().app.actions.updateSubagentTool(N0,Q0.toolCall.function.name)},onCompleted:(Q0)=>{if(h)X0(Q0);else n=Q0}});if(N0=C0.session.id,v2.getState().app.actions.startSubagentProgress(C0.session.id,C0.session.subagentType,`Resumed from ${C0.source.id}: ${C0.session.description}`),h=!0,n)X0(n);return C0}),B=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await N($.sessionId)).getMcpContentCatalog()}),C=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await N($.sessionId)).refreshMcpContentCatalogs(I)}),F=p0(async(I,D,p)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await N($.sessionId)).getMcpPrompt(I,D,p)}),M=p0(async(I,D,p)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await N($.sessionId)).completeMcpArgument(I,D,p)}),L=p0(async(I,D={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await N($.sessionId)).getMcpLogs(I,D)}),y=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).listMcpTasks(I)}),S=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).getMcpTask(I)}),T=p0(async(I,D)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).cancelMcpTask(I,D)}),R=p0(async(I,D)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await N($.sessionId)).setMcpLoggingLevel(I,D)}),P=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await N($.sessionId)).getMcpInstructions()}),j=p0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await N($.sessionId)).getReasoningConfiguration()}),o=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let p=D.getReasoningConfiguration();if(D.resolveReasoningConfiguration(I),p.selection===I)return p;await D.refresh({reasoningEffort:I});try{let h;try{h=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{reasoningEffort:I})}catch(n){if(!(n instanceof z8)&&n.code!=="ENOENT")throw n;h=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:I,serviceTier:D.getServiceTierConfiguration().selection,responseVerbosity:D.getResponseVerbosityConfiguration().selection,communicationStyle:D.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:h.selectedModelId,permissionMode:h.permissionMode,reasoningEffort:h.reasoningEffort,serviceTier:h.serviceTier,responseVerbosity:h.responseVerbosity,communicationStyle:h.communicationStyle,communicationStyleDigest:h.communicationStyleDigest},B$().setReasoningEffort(I),D.getReasoningConfiguration()}catch(h){throw await D.refresh({reasoningEffort:p.selection}),h}}),u=p0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await N($.sessionId)).getServiceTierConfiguration()}),J0=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for service tier");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let p=D.getServiceTierConfiguration();if(D.resolveServiceTierConfiguration(I),p.selection===I)return p;await D.refresh({serviceTier:I});try{let h;try{h=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{serviceTier:I})}catch(n){if(!(n instanceof z8)&&n.code!=="ENOENT")throw n;h=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:D.getReasoningConfiguration().selection,serviceTier:I,responseVerbosity:D.getResponseVerbosityConfiguration().selection,communicationStyle:D.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:h.selectedModelId,permissionMode:h.permissionMode,reasoningEffort:h.reasoningEffort,serviceTier:h.serviceTier,responseVerbosity:h.responseVerbosity,communicationStyle:h.communicationStyle,communicationStyleDigest:h.communicationStyleDigest},B$().setServiceTier(I),D.getServiceTierConfiguration()}catch(h){throw await D.refresh({serviceTier:p.selection}),h}}),K0=p0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await N($.sessionId)).getResponseVerbosityConfiguration()}),q0=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let p=D.getResponseVerbosityConfiguration();if(D.resolveResponseVerbosityConfiguration(I),p.selection===I)return p;await D.refresh({responseVerbosity:I});try{let h;try{h=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{responseVerbosity:I})}catch(n){if(!(n instanceof z8)&&n.code!=="ENOENT")throw n;h=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:D.getReasoningConfiguration().selection,serviceTier:D.getServiceTierConfiguration().selection,responseVerbosity:I,communicationStyle:D.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:h.selectedModelId,permissionMode:h.permissionMode,reasoningEffort:h.reasoningEffort,serviceTier:h.serviceTier,responseVerbosity:h.responseVerbosity,communicationStyle:h.communicationStyle,communicationStyleDigest:h.communicationStyleDigest},B$().setResponseVerbosity(I),D.getResponseVerbosityConfiguration()}catch(h){throw await D.refresh({responseVerbosity:p.selection}),h}}),a=p0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await N($.sessionId)).getCommunicationStyleConfiguration()}),f=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for communication style");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let p=D.getCommunicationStyleConfiguration(),h=D.resolveCommunicationStyleConfiguration(I);if(h.source!=="built-in"&&!h.contentSha256)throw Error("Custom communication style has no provenance");if(p.selection===I)return p;await D.refresh({communicationStyle:I});try{let n;try{n=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{communicationStyle:I,communicationStyleDigest:h.source==="built-in"?null:h.contentSha256})}catch(N0){if(!(N0 instanceof z8)&&N0.code!=="ENOENT")throw N0;n=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:D.getReasoningConfiguration().selection,serviceTier:D.getServiceTierConfiguration().selection,responseVerbosity:D.getResponseVerbosityConfiguration().selection,communicationStyle:I,...h.source!=="built-in"&&h.contentSha256?{communicationStyleDigest:h.contentSha256}:{}})}return Z.current={sessionId:$.sessionId,modelId:n.selectedModelId,permissionMode:n.permissionMode,reasoningEffort:n.reasoningEffort,serviceTier:n.serviceTier,responseVerbosity:n.responseVerbosity,communicationStyle:n.communicationStyle,communicationStyleDigest:n.communicationStyleDigest},B$().setCommunicationStyle(I),D.getCommunicationStyleConfiguration()}catch(n){throw await D.refresh({communicationStyle:p.selection}),n}}),v=p0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),G0=p0(async(I,D)=>{let p=$.sessionId;if(!p)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await N(p)).enqueueSteering(I,{allowBeforeTurn:!0,...D})}),V=p0(async()=>{let I=$.sessionId;if(!I)throw Error("Follow-up queue requires a Session");return(await N(I)).getFollowUpQueueSnapshot()}),x=p0(async(I)=>{let D=$.sessionId;if(!D)throw Error("Follow-up queue requires a Session");return(await N(D)).mutateFollowUpQueue(I)}),l=p0(async(I,D)=>{let p=$.sessionId;if(!p)throw Error("Side conversation requires a Session");return(await N(p)).askSideQuestion(I,{signal:D,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),H0=p0(async(I,D)=>{let p=$.sessionId;if(!p)throw Error("User shell command requires a Session");return(await N(p)).executeUserShellCommand(I,D)}),F0=p0(()=>Y.current?.getTurnRecoveryAssessment()??{state:"none"}),T0=p0(async(I,D)=>{let p=$.sessionId;if(!p)throw Error("Code review requires a Session");let h=await N(p);await _4.recoverInterrupted(h.workspaceRoot,p,h);let n=await _4.start({sessionId:p,projectPath:h.workspaceRoot,runtime:h,request:I,signal:D}),N0=await n.completion,X0=(await _4.list(h.workspaceRoot,p)).find((C0)=>C0.start.reviewId===n.reviewId);if(!X0)throw Error(`Review not found after completion: ${n.reviewId}`);return{reviewId:n.reviewId,status:N0.status,findings:N0.findings.length,content:OY(X0.start,N0)}});return q7(()=>{U.current=!0;let D=O4(async()=>{U.current=!1,await q()});return()=>{D(),U.current=!1,q().catch(()=>{return})}},[q]),{agentRef:J,createAgent:W,cleanupAgent:q,steerActiveTurn:v,enqueueSessionInput:G0,getFollowUpQueue:V,mutateFollowUpQueue:x,askSideQuestion:l,runCodeReview:T0,executeUserShellCommand:H0,getTurnRecoveryAssessment:F0,listRewindCheckpoints:H,rewindSession:A,listSubagents:b,resumeSubagent:w,getMcpContentCatalog:B,refreshMcpContentCatalogs:C,getMcpPrompt:F,completeMcpArgument:M,listMcpTasks:y,getMcpTask:S,cancelMcpTask:T,getMcpLogs:L,setMcpLoggingLevel:R,getMcpInstructions:P,getReasoningConfiguration:j,setReasoningEffort:o,getServiceTierConfiguration:u,setServiceTier:J0,getResponseVerbosityConfiguration:K0,setResponseVerbosity:q0,getCommunicationStyleConfiguration:a,setCommunicationStyle:f}}import{useMemoizedFn as c2}from"ahooks";import{useEffect as O7,useRef as N4}from"react";function WY($){let J=0;for(let Y of $)if(Y===`
34
+ `)J++;return J}function FY($,J){let Y=J?.flushTimeout??300,Z=J?.minLinesToFlush??5,X=J?.minCharsToFlush??400,Q=N4(""),U=N4(null),G=N4(""),z=N4(null),K=c2(()=>{if(Q.current){let H=Q.current,A=$.appendAssistantContent(H);n8(A,H),Q.current=""}if(U.current)clearTimeout(U.current),U.current=null}),O=c2(()=>{if(G.current)$.appendThinkingContent(G.current),G.current="";if(z.current)clearTimeout(z.current),z.current=null}),q=c2((H)=>{Q.current+=H;let A=Q.current;if(WY(A)>=Z||A.length>=X){K();return}if(!U.current)U.current=setTimeout(K,Y)}),N=c2((H)=>{G.current+=H;let A=G.current;if(WY(A)>=Z||A.length>=X){O();return}if(!z.current)z.current=setTimeout(O,Y)}),_=c2(()=>{if(Q.current="",U.current)clearTimeout(U.current),U.current=null;if(G.current="",z.current)clearTimeout(z.current),z.current=null}),W=c2(()=>{if(U.current)clearTimeout(U.current),U.current=null;if(z.current)clearTimeout(z.current),z.current=null;let H=Q.current,A=G.current;return Q.current="",G.current="",{extraContent:H,extraThinking:A}});return O7(()=>{return()=>{_()}},[_]),{batchAppendContent:q,batchAppendThinking:N,flushContentBuffer:K,flushThinkingBuffer:O,resetStreamingBuffers:_,drainPendingBuffers:W}}var _8=H1("UI");function W4($,J){return[...($??[]).filter((Y)=>Y!==J),J].slice(-16)}function BY($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var RY=($,J,Y,Z,X,Q,U)=>{let G=g2(),z=V2(),K=O1(),O=p8(),q=h2(),N=c8(),_=u8(),W=d8(),H=l8(),A=r8(),b=E2(),w=NJ(),B=d1(),C=N1(),F=FJ(),M=H4(!1),L=H4(null),y=H4(null),S=H4(null),{createAgent:T,cleanupAgent:R,steerActiveTurn:P,enqueueSessionInput:j,getFollowUpQueue:o,mutateFollowUpQueue:u,listRewindCheckpoints:J0,rewindSession:K0,listSubagents:q0,resumeSubagent:a,getMcpContentCatalog:f,refreshMcpContentCatalogs:v,getMcpPrompt:G0,completeMcpArgument:V,listMcpTasks:x,getMcpTask:l,cancelMcpTask:H0,getMcpLogs:F0,setMcpLoggingLevel:T0,getMcpInstructions:I,getReasoningConfiguration:D,setReasoningEffort:p,getServiceTierConfiguration:h,setServiceTier:n,getResponseVerbosityConfiguration:N0,setResponseVerbosity:X0,getCommunicationStyleConfiguration:C0,setCommunicationStyle:Q0,runCodeReview:S0,askSideQuestion:Y0,executeUserShellCommand:h0,getTurnRecoveryAssessment:F$}=HY({sessionId:z,workspaceRoot:K,systemPrompt:$,appendSystemPrompt:J,maxTurns:Z,modelId:O,permissionMode:q,reasoningEffort:_,serviceTier:W,responseVerbosity:H,communicationStyle:A,agents:Q}),g0=LY(()=>[K,z,N7()].join("\x00"),[z,K]),N$=X1(async()=>{let k=m0().app.followUpQueue?.version,E=m0().app.followUpQueueMutation;try{let m=await o(),c=m0().app.followUpQueue?.version,r=c===k||c===m.version;if(r)C.projectFollowUpQueue(m,g0);let P0=m0().app.followUpQueueMutation.supersededVersions;C.setFollowUpQueueMutation(E.errorCode==="revision_conflict"?{pending:!1,errorCode:E.errorCode,errorMessage:E.errorMessage,supersededVersions:r?P0:W4(P0,m.version)}:{pending:!1,supersededVersions:r?P0:W4(P0,m.version)},g0)}catch{C.setFollowUpQueueMutation({pending:!1,errorMessage:"Follow-up queue is unavailable"},g0)}}),r$=X1(async(k)=>{let E=m0().app.followUpQueue;if(!E||m0().app.followUpQueueMutation.pending)return!1;C.setFollowUpQueueMutation({pending:!0,messageId:k.messageId},g0);try{let m=await u({expectedVersion:E.version,operation:k}),c=m0().app.followUpQueue?.version;if(c===E.version||c===m.snapshot.version)C.projectFollowUpQueue(m.snapshot,g0);let r=c===E.version||c===m.snapshot.version,P0=m0().app.followUpQueueMutation.supersededVersions;if(C.setFollowUpQueueMutation({pending:!1,supersededVersions:r?P0:W4(P0,m.snapshot.version)},g0),k.type==="remove")F.takeFollowUpPresentation(k.messageId);return!0}catch(m){if(m instanceof TY){let c=m0().app.followUpQueue?.version,r=c===E.version||c===m.snapshot.version;if(r)C.projectFollowUpQueue(m.snapshot,g0);let P0=m0().app.followUpQueueMutation.supersededVersions;C.setFollowUpQueueMutation({pending:!1,errorCode:m.code,errorMessage:m.message,supersededVersions:r?P0:W4(P0,m.snapshot.version)},g0)}else C.setFollowUpQueueMutation({pending:!1,errorMessage:"Follow-up queue is unavailable"},g0);return!1}}),r0=FY(B),G$=X1((k)=>new U8({signal:k,streamingBuffer:r0,getStreamingMessageId:()=>m0().session.currentStreamingMessageId,finalizeStreamingMessage:B.finalizeStreamingMessage,discardStreamingMessage:B.discardStreamingMessage,clearThinking:()=>B.setCurrentThinkingContent(null)})),d0=X1(async()=>{if(!w||!z){C.setTeams([]);return}try{let E=await new CY({configDir:K8(),subagentRegistry:F4(K)}).list({sessionId:z,projectPath:K});if(m0().session.sessionId===z&&m0().session.workspaceRoot===K)C.setTeams(E)}catch(k){_8.warn("[useCommandHandler] Failed to refresh Agent Teams",k)}}),P1=X1(async(k,E)=>{if(k.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let m=k.text.trimStart().slice(1).trim();if(!m)return{success:!1,error:"User shell command cannot be empty"};B.setCommand(`! ${m}`);try{let c=await h0(m,{signal:E});if(B.addMessage({id:`user-shell-${c.executionId}`,role:"user",content:b6(c.record),timestamp:Date.now(),metadata:{userShellCommand:c.record}}),c.delivery==="next_turn"){let r=m0().session;if(r.sessionId===z&&r.workspaceRoot===K)y.current?.request()}return{success:c.record.status!=="spawn_error",output:b6(c.record),...c.record.status==="spawn_error"?{error:c.record.stderr||"User shell command failed"}:{}}}finally{B.setCommand(null)}});l1(()=>{return()=>{L.current=null,r0.resetStreamingBuffers()}},[r0.resetStreamingBuffers]),l1(()=>{return()=>{S.current?.abort("side-conversation-session-change"),S.current=null,C.dismissSideConversation()}},[C,z,K]),l1(()=>{C.setTeams([]),d0()},[w,C,d0,z,K]),l1(()=>{if(!N)B.setCurrentThinkingContent(null)},[N,B]);let A1=X1(()=>{if(S.current){S.current.abort("user-cancel"),S.current=null,C.dismissSideConversation();return}if(!G)return;X?.();let k=F.getAbortController()?.signal??new AbortController().signal;if((L.current??G$(k)).abortAndFinalize(()=>{F.abort("user-cancel"),C.setTasks([])}),!M.current)B.addAssistantMessage("任务已停止"),M.current=!0}),Q8=X1(async(k,E)=>{let m=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(C.startSideConversation(m,E),k.images.length>0){C.failSideConversation(m,"Side conversations do not accept image attachments");return}if(!E){C.failSideConversation(m,"Usage: /btw <question>");return}S.current?.abort("side-conversation-replaced");let c=new AbortController;S.current=c;try{let r=await Y0(E,c.signal);if(c.signal.aborted||S.current!==c)return;if(C.completeSideConversation(m,r),r.usage)B.updateTokenUsage({scope:"auxiliary",inputTokens:r.usage.promptTokens,outputTokens:r.usage.completionTokens,totalTokens:r.usage.totalTokens,cacheReadTokens:r.usage.cacheReadInputTokens??0,cacheWriteTokens:r.usage.cacheCreationInputTokens??0,costUsd:r.usage.costUsd})}catch(r){if(c.signal.aborted||S.current!==c)return;C.failSideConversation(m,r instanceof Error?r.message:String(r))}finally{if(S.current===c)S.current=null}}),c1=X1(async(k,E)=>{let m={contentDeltaCount:0,contentDeltaTotalLen:0,outputStarted:!1,toolExecutionStarted:!1,compactionCount:0},c=G$(E.signal);L.current=c;let r=fJ({sessionActions:B,appActions:C,commandActions:F,streamingBuffer:r0,thinkingModeEnabled:N,getStreamingMessageId:()=>m0().session.currentStreamingMessageId,signal:E.signal,streamSession:c,followUpQueueOwner:g0},m);try{return{loopResult:await PY(k,r),stats:m}}finally{if(L.current===c)L.current=null}}),k2=X1(async(k)=>{let E=!1,m,c=!1,r=k;try{if(k.text.trimStart().startsWith("!")){let Z$=F.getAbortController()??F.createAbortController();return await P1(k,Z$.signal)}await O8();let P0=F.getAbortController()??F.createAbortController(),l0=J4(m0().session),c0=await A6(k,C,B,P0.signal,R,z,J4(m0().session),{listCheckpoints:J0,execute:K0},{list:q0,resume:a},{getCatalog:f,refresh:v,getPrompt:G0,complete:V,listTasks:x,getTask:l,cancelTask:H0,getLogs:F0,setLoggingLevel:T0,getInstructions:I},{get:D,set:p},{get:h,set:n},{get:N0,set:X0},{get:C0,set:Q0},K,{run:S0},U);if(c0.type==="handled")return c0.commandResult;if(c0.type==="continue_as_agent")E=c0.result.userMessageAlreadyAdded,m=c0.result.onceModelId,c=c0.result.goalContinuationOnly===!0,r=c0.result.agentInput;let b$=E$.getInstance(),_1;if(!c){let Z$=await b$.executeUserPromptSubmitHooks(r.text,{projectDir:K,sessionId:z,permissionMode:q,hasImages:r.images.length>0,imageCount:r.images.length});if(!Z$.proceed){if(Z$.warning)B.addAssistantMessage(`${Z$.warning}`);return{success:!1,error:"blocked by hook"}}if(Z$.updatedPrompt)r={...r,text:Z$.updatedPrompt,displayText:Z$.updatedPrompt,parts:[{type:"text",text:Z$.updatedPrompt},...r.parts.filter((D2)=>D2.type==="image")]};if(Z$.contextInjection)_1=Z$.contextInjection}if(!E)B.addUserMessage(r.displayText);let Q2=W6(r),w$=await T(m?{modelId:m}:void 0);if(P0.signal.aborted)return _8.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(_1)l0.push({role:"system",content:`<user-prompt-submit-hook>
35
35
  ${_1}
36
- </user-prompt-submit-hook>`});let a$={messages:l0,userId:"cli-user",sessionId:z,workspaceRoot:K,signal:P0.signal,confirmationHandler:Y,permissionMode:q,onPermissionModeChange:async(Z$)=>{await z$().setPermissionMode(Z$)}},{loopResult:O$,stats:b1}=await c1(w$.chatStream(Q2,a$,{stream:!0,goalContinuationOnly:c,onTurnLimitReached:Y?async(Z$)=>{let D2=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${Z$.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:D2.approved,reason:D2.reason}}:void 0}),P0);if(b1.compactionCount>0)B.setCompactedContext(a$.messages);if(O$.success&&O$.metadata?.outputTruncated)B.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let M1=O$.finalMessage||"";if(_8.debug("[handleCommandSubmit] final reply",{success:O$.success,outputLength:M1.length,turnsCount:O$.metadata?.turnsCount,toolCallsCount:O$.metadata?.toolCallsCount}),!O$.success&&!LY(O$)){let Z$=O$.error?.message||"任务执行失败";return B.addAssistantMessage(Z$),{success:!1,error:Z$}}if(!M1||M1.trim()===""){let Z$=O$.metadata?.abortReason;if(!M.current&&b1.contentDeltaCount===0&&Z$!=="interrupt")return B.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:M1??""}}return{success:!0,output:M1}}catch(P0){if(M.current)return{success:!1,error:"aborted"};let l0=n8(P0),c0=typeof P0==="object"&&P0!==null&&"name"in P0&&P0.name==="AbortError";if(l0.isAbort||c0)return{success:!1,error:"aborted"};return B.addAssistantMessage(`${l0.displayMessage}`),{success:!1,error:l0.displayMessage}}}),Z2=X1(async(k)=>{if(k.aborted)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};let h=await i$.hasPendingInbox(K,z),m=!h&&await i$.hasActiveGoal(K,z),c=!h&&!m&&await i$.hasRecoverableTurn(K,z);if(k.aborted)return{status:"completed"};if(!h&&!m&&!c)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};if(await O8(),k.aborted)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};let r=F.createAbortController(),P0="preflight",l0=()=>{if(!r.signal.aborted)r.abort("pending-resume-coordinator-disposed")};if(k.addEventListener("abort",l0,{once:!0}),k.aborted)l0();r0.resetStreamingBuffers(),B.clearFinalizingStreamingMessageId(),F.setProcessing(!0);try{let c0=await T();if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};let b$=await i$.hasPendingInbox(K,z),_1=!b$&&await i$.hasActiveGoal(K,z);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(!b$&&!_1){let O$=F$();if(O$.state!=="none")N6(B,O$);return{status:"completed"}}P0=b$?"pending_input":"goal";let Q2={messages:$4(m0().session),userId:"cli-user",sessionId:z,workspaceRoot:K,signal:r.signal,confirmationHandler:Y,permissionMode:q,onPermissionModeChange:async(O$)=>{await z$().setPermissionMode(O$)}},{loopResult:w$,stats:a$}=await c1(c0.chatStream("",Q2,{stream:!0,pendingInputOnly:b$,goalContinuationOnly:_1}),r);if(a$.compactionCount>0)B.setCompactedContext(Q2.messages);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(w$.success&&w$.metadata?.outputTruncated)B.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!w$.success&&!LY(w$)){let O$=m2(w$.error?.details??w$.error?.message??"恢复排队指令失败");if(P0==="pending_input"){let b1=w$.metadata?.toolCallsCount,M1=typeof b1==="number"&&Number.isInteger(b1)&&b1>=0?b1:-1,Z$=await i$.hasPendingInbox(K,z);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};return{status:"failed",workKind:P0,workStillPending:Z$,taskFailure:O$,evidence:{taskFailure:O$,outputStarted:a$.outputStarted,toolExecutionStarted:a$.toolExecutionStarted,toolCallsCount:M1}}}return{status:"failed",workKind:P0,workStillPending:!1,taskFailure:O$}}return{status:"completed"}}catch(c0){let b$=n8(c0);if(r.signal.reason==="interrupted-by-new-command")return{status:"deferred"};if(b$.isAbort||k.aborted)return{status:"completed"};return{status:"failed",workKind:P0,workStillPending:!1,taskFailure:m2(c0)}}finally{if(k.removeEventListener("abort",l0),F.getAbortController()===r)F.setProcessing(!1),F.clearAbortController(r),B.setCurrentThinkingContent(null),y.current?.notifyIdle()}}),I$=FY(()=>{let k="preflight";return new q6({canRun:()=>!m0().command.isProcessing,run:async(h)=>{k="preflight";let m=await Z2(h);if(m.status==="failed")k=m.workKind;return m},sessionIdentity:JSON.stringify([K,z]),onTerminalFailure:({taskFailure:h})=>{if(k==="preflight")B.setError(`恢复排队指令失败: ${h.message}`);else B.addAssistantMessage(h.message)}})},[Z2,B,z,K]);l1(()=>{return y.current=I$,()=>{if(I$.dispose(),y.current===I$)y.current=null}},[I$]),l1(()=>{return C.claimFollowUpQueueOwner(g0),()=>{C.clearFollowUpQueue(g0)}},[C,g0]);let e=X1(async(k)=>{if(m0().app.activeModal==="sessionHistoryViewer")return;if(!k.text.trim()&&k.images.length===0)return;let h=PY(k.text);if(h){await Q8(k,h.question);return}if(S.current?.abort("main-conversation-submitted"),S.current=null,C.dismissSideConversation(),k.text.trimStart().startsWith("!")&&G){let c=F.getAbortController();if(!c){B.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let r=await P1(k,c.signal);if(!r.success&&r.error&&r.error!=="aborted")B.setError(r.error);return}if(G){if(k.text.trimStart().startsWith("/")){let c0=k.text.trim();if(/^\/(?:goal|queue)(?:\s|$)/i.test(c0)){await O8();let b$=F.getAbortController(),_1=/^\/queue(?:\s|$)/i.test(c0)?b$?.signal??new AbortController().signal:(b$??F.createAbortController()).signal;await P6(k,C,B,_1,R,z,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,K);return}B.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await O8();let c=await h$.getInstance().executeUserPromptSubmitHooks(k.text,{projectDir:K,sessionId:z,permissionMode:q,hasImages:k.images.length>0,imageCount:k.images.length});if(!c.proceed){if(c.warning)B.addAssistantMessage(c.warning);return}let r=k;if(c.updatedPrompt)r={...k,text:c.updatedPrompt,parts:[{type:"text",text:c.updatedPrompt},...k.parts.filter((c0)=>c0.type==="image")]};if(c.contextInjection){let c0=`<user-prompt-submit-hook>
36
+ </user-prompt-submit-hook>`});let a$={messages:l0,userId:"cli-user",sessionId:z,workspaceRoot:K,signal:P0.signal,confirmationHandler:Y,permissionMode:q,onPermissionModeChange:async(Z$)=>{await z$().setPermissionMode(Z$)}},{loopResult:O$,stats:b1}=await c1(w$.chatStream(Q2,a$,{stream:!0,goalContinuationOnly:c,onTurnLimitReached:Y?async(Z$)=>{let D2=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${Z$.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:D2.approved,reason:D2.reason}}:void 0}),P0);if(b1.compactionCount>0)B.setCompactedContext(a$.messages);if(O$.success&&O$.metadata?.outputTruncated)B.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let M1=O$.finalMessage||"";if(_8.debug("[handleCommandSubmit] final reply",{success:O$.success,outputLength:M1.length,turnsCount:O$.metadata?.turnsCount,toolCallsCount:O$.metadata?.toolCallsCount}),!O$.success&&!BY(O$)){let Z$=O$.error?.message||"任务执行失败";return B.addAssistantMessage(Z$),{success:!1,error:Z$}}if(!M1||M1.trim()===""){let Z$=O$.metadata?.abortReason;if(!M.current&&b1.contentDeltaCount===0&&Z$!=="interrupt")return B.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:M1??""}}return{success:!0,output:M1}}catch(P0){if(M.current)return{success:!1,error:"aborted"};let l0=t8(P0),c0=typeof P0==="object"&&P0!==null&&"name"in P0&&P0.name==="AbortError";if(l0.isAbort||c0)return{success:!1,error:"aborted"};return B.addAssistantMessage(`${l0.displayMessage}`),{success:!1,error:l0.displayMessage}}}),Z2=X1(async(k)=>{if(k.aborted)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};let E=await i$.hasPendingInbox(K,z),m=!E&&await i$.hasActiveGoal(K,z),c=!E&&!m&&await i$.hasRecoverableTurn(K,z);if(k.aborted)return{status:"completed"};if(!E&&!m&&!c)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};if(await O8(),k.aborted)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};let r=F.createAbortController(),P0="preflight",l0=()=>{if(!r.signal.aborted)r.abort("pending-resume-coordinator-disposed")};if(k.addEventListener("abort",l0,{once:!0}),k.aborted)l0();r0.resetStreamingBuffers(),B.clearFinalizingStreamingMessageId(),F.setProcessing(!0);try{let c0=await T();if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};let b$=await i$.hasPendingInbox(K,z),_1=!b$&&await i$.hasActiveGoal(K,z);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(!b$&&!_1){let O$=F$();if(O$.state!=="none")H6(B,O$);return{status:"completed"}}P0=b$?"pending_input":"goal";let Q2={messages:J4(m0().session),userId:"cli-user",sessionId:z,workspaceRoot:K,signal:r.signal,confirmationHandler:Y,permissionMode:q,onPermissionModeChange:async(O$)=>{await z$().setPermissionMode(O$)}},{loopResult:w$,stats:a$}=await c1(c0.chatStream("",Q2,{stream:!0,pendingInputOnly:b$,goalContinuationOnly:_1}),r);if(a$.compactionCount>0)B.setCompactedContext(Q2.messages);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(w$.success&&w$.metadata?.outputTruncated)B.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!w$.success&&!BY(w$)){let O$=m2(w$.error?.details??w$.error?.message??"恢复排队指令失败");if(P0==="pending_input"){let b1=w$.metadata?.toolCallsCount,M1=typeof b1==="number"&&Number.isInteger(b1)&&b1>=0?b1:-1,Z$=await i$.hasPendingInbox(K,z);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};return{status:"failed",workKind:P0,workStillPending:Z$,taskFailure:O$,evidence:{taskFailure:O$,outputStarted:a$.outputStarted,toolExecutionStarted:a$.toolExecutionStarted,toolCallsCount:M1}}}return{status:"failed",workKind:P0,workStillPending:!1,taskFailure:O$}}return{status:"completed"}}catch(c0){let b$=t8(c0);if(r.signal.reason==="interrupted-by-new-command")return{status:"deferred"};if(b$.isAbort||k.aborted)return{status:"completed"};return{status:"failed",workKind:P0,workStillPending:!1,taskFailure:m2(c0)}}finally{if(k.removeEventListener("abort",l0),F.getAbortController()===r)F.setProcessing(!1),F.clearAbortController(r),B.setCurrentThinkingContent(null),y.current?.notifyIdle()}}),I$=LY(()=>{let k="preflight";return new _6({canRun:()=>!m0().command.isProcessing,run:async(E)=>{k="preflight";let m=await Z2(E);if(m.status==="failed")k=m.workKind;return m},sessionIdentity:JSON.stringify([K,z]),onTerminalFailure:({taskFailure:E})=>{if(k==="preflight")B.setError(`恢复排队指令失败: ${E.message}`);else B.addAssistantMessage(E.message)}})},[Z2,B,z,K]);l1(()=>{return y.current=I$,()=>{if(I$.dispose(),y.current===I$)y.current=null}},[I$]),l1(()=>{return C.claimFollowUpQueueOwner(g0),()=>{C.clearFollowUpQueue(g0)}},[C,g0]);let e=X1(async(k)=>{if(m0().app.activeModal==="sessionHistoryViewer")return;if(!k.text.trim()&&k.images.length===0)return;let E=AY(k.text);if(E){await Q8(k,E.question);return}if(S.current?.abort("main-conversation-submitted"),S.current=null,C.dismissSideConversation(),k.text.trimStart().startsWith("!")&&G){let c=F.getAbortController();if(!c){B.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let r=await P1(k,c.signal);if(!r.success&&r.error&&r.error!=="aborted")B.setError(r.error);return}if(G){if(k.text.trimStart().startsWith("/")){let c0=k.text.trim();if(/^\/(?:goal|queue)(?:\s|$)/i.test(c0)){await O8();let b$=F.getAbortController(),_1=/^\/queue(?:\s|$)/i.test(c0)?b$?.signal??new AbortController().signal:(b$??F.createAbortController()).signal;await A6(k,C,B,_1,R,z,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,K);return}B.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await O8();let c=await E$.getInstance().executeUserPromptSubmitHooks(k.text,{projectDir:K,sessionId:z,permissionMode:q,hasImages:k.images.length>0,imageCount:k.images.length});if(!c.proceed){if(c.warning)B.addAssistantMessage(c.warning);return}let r=k;if(c.updatedPrompt)r={...k,text:c.updatedPrompt,parts:[{type:"text",text:c.updatedPrompt},...k.parts.filter((c0)=>c0.type==="image")]};if(c.contextInjection){let c0=`<user-prompt-submit-hook>
37
37
  ${c.contextInjection}
38
38
  </user-prompt-submit-hook>`;r={...r,text:`${r.text}
39
39
 
40
40
  ${c0}`,parts:[...r.parts,{type:"text",text:`
41
41
 
42
- ${c0}`}]}}let P0=H6(r),l0=await P(P0);if(!l0.accepted){let c0=l0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";B.addAssistantMessage(c0);return}if(l0.messageId)F.rememberFollowUpPresentation(l0.messageId,k);if(l0.queue)C.projectFollowUpQueue(l0.queue,g0);if(l0.delivery==="next_turn")I$.request();return}C.setTasks([]),F.setRecoveredSteeringCount(0),M.current=!1;let m=F.createAbortController();r0.resetStreamingBuffers(),B.clearFinalizingStreamingMessageId(),F.setProcessing(!0);try{let c=await k2(k);if(!c.success&&c.error&&c.error!=="aborted")B.setError(c.error)}catch(c){let r=n8(c);if(r.isAbort);else B.setError(`执行失败: ${r.displayMessage}`)}finally{if(F.getAbortController()===m)F.setProcessing(!1),F.clearAbortController(m),B.setCurrentThinkingContent(null),y.current?.notifyIdle()}});return l1(()=>{let k=F4.subscribe((h)=>{if(!BY(h,{sessionId:z,projectPath:K}))return;if(h.type.startsWith("team.")){let{teamName:m,messageId:c,content:r}=h.properties,P0=h.properties.metadata;if(h.type==="team.message.received"&&typeof m==="string"&&typeof c==="string"&&typeof r==="string"&&bY(P0,{messageId:c,teamName:m}))(async()=>{let l0=await j(r,{messageId:c,origin:"team_message",metadata:P0});if(!l0.accepted)return;if(await new AY(m,K8()).markDelivered([c]),l0.delivery==="next_turn")I$.request()})().catch((l0)=>{_8.warn("[useCommandHandler] Failed to deliver teammate message",l0)});queueMicrotask(()=>{d0()});return}if(h.type!=="subagent.completion.queued")return;I$.request()});return()=>{k()}},[j,I$,d0,z,K]),l1(()=>{let k=!1;return(async()=>{if(Y)await b6.resolvePendingWithHandler(K,z,Y);else await b6.cancelPendingNonInteractive(K,z);if(k)return;let[h,m]=await Promise.all([i$.hasPendingInbox(K,z),i$.hasActiveGoal(K,z)]),c=!h&&!m&&await i$.hasRecoverableTurn(K,z);if(h||m||c)I$.request()})().catch((h)=>{if(!k)_8.warn("[useCommandHandler] Failed to recover pending interaction or inbox",h)}),()=>{k=!0}},[Y,I$,z,K]),{executeCommand:e,handleAbort:A1,isProcessing:G||b?.status==="loading",cleanupAgent:R,refreshFollowUpQueue:N$,controlFollowUpQueue:r$}};import{useMemoizedFn as L4}from"ahooks";import{useRef as W7,useState as F7}from"react";var RY=()=>{let[$,J]=F7([]),Y=W7(-1),Z=L4((G,z)=>{let K={display:G,pasteMappings:z?new Map(z):new Map};J((O)=>[...O,K]),Y.current=-1}),X=L4(()=>{if($.length===0)return null;let G=Y.current===-1?$.length-1:Math.max(0,Y.current-1);return Y.current=G,$[G]||null}),Q=L4(()=>{if(Y.current===-1)return null;let G=Y.current+1;if(G>=$.length)return Y.current=-1,null;else return Y.current=G,$[G]||null}),U=L4(()=>{Y.current=-1});return{commandHistory:$,historyIndex:Y.current,addToHistory:Z,getPreviousCommand:X,getNextCommand:Q,resetHistoryIndex:U}};import{useMemoizedFn as N8}from"ahooks";import{useMemo as L7,useRef as yY,useState as B7}from"react";var IY=()=>{let[$,J]=B7({isVisible:!1,details:null,resolver:null}),Y=yY(null),Z=yY([]),X=N8((O)=>{Y.current=O,J({isVisible:Boolean(O),details:O?.details??null,resolver:O?.resolve??null})}),Q=N8((O,q)=>{if(O.settled)return;if(O.settled=!0,O.signal&&O.abortListener)O.signal.removeEventListener("abort",O.abortListener);O.resolve(q)}),U=N8((O,q)=>{return new Promise((N)=>{let _={details:O,resolve:N,signal:q,settled:!1},W=()=>{if(Y.current===_){Q(_,{approved:!1,reason:H8}),X(Z.current.shift()??null);return}let H=Z.current.indexOf(_);if(H>=0)Z.current.splice(H,1);Q(_,{approved:!1,reason:H8})};if(_.abortListener=W,q?.aborted){W();return}if(q?.addEventListener("abort",W,{once:!0}),!Y.current){X(_);return}Z.current.push(_)})}),G=N8((O)=>{let q=Y.current;if(q)Q(q,O);let N=Z.current.shift()??null;X(N)}),z=N8(()=>{if(Y.current)Q(Y.current,{approved:!1,reason:H8});for(let O of Z.current)Q(O,{approved:!1,reason:H8});Z.current=[],X(null)}),K=L7(()=>({requestConfirmation:U}),[U]);return{confirmationState:$,confirmationHandler:K,handleResponse:G,dismissAll:z}};import{useMemoizedFn as G2}from"ahooks";import{useRef as SY,useState as w7}from"react";var M6="␞",T6="␟";function B4($){return`${M6}PASTE:${$}:`}function C6(){return T6}var P7=`${M6}PASTE:(\\d+):[\\s\\S]*?${T6}`;function A7($){return $.includes(M6)&&$.includes(T6)}function b7($,J,Y){let Z=[...$.values()].filter((U)=>U.type==="image");if(Z.length>=p2)throw Error(`最多只能粘贴 ${p2} 张图片`);let X=Z.reduce((U,G)=>U+`data:${G.mimeType};base64,`.length+G.data.length,0),Q=`data:${Y};base64,`.length+J.length;if(X+Q>e8)throw Error("图片编码后总大小不能超过 5 MiB")}function M7($,J){let Y=[],Z=[];if(!A7($)){let q=$.trim();if(q)Z.push({type:"text",text:q});return{displayText:$,text:$,images:Y,parts:Z}}let X=Array.from($.matchAll(new RegExp(P7,"g"))),Q=0,U="",G="";for(let q of X){let N=q.index,_=N+q[0].length,W=parseInt(q[1],10),H=J.get(W);if(N>Q){let A=$.slice(Q,N);Z.push({type:"text",text:A}),U+=A,G+=A}if(!H)U+=q[0],G+=q[0],Z.push({type:"text",text:q[0]});else if(H.type==="text")U+=H.data,G+=H.data,Z.push({type:"text",text:H.data});else{let A={id:W,base64:H.data,mimeType:H.mimeType};Y.push(A),Z.push({type:"image",...A}),G+=`[Image #${W}]`}Q=_}if(Q<$.length){let q=$.slice(Q);Z.push({type:"text",text:q}),U+=q,G+=q}let z=[];for(let q of Z){let N=z[z.length-1];if(q.type==="text"&&N?.type==="text")N.text+=q.text;else z.push(q)}let K=0,O=z.length;while(K<z.length){let q=z[K];if(q.type!=="text"||q.text.trim()!=="")break;K++}while(O>K){let q=z[O-1];if(q.type!=="text"||q.text.trim()!=="")break;O--}return{displayText:G.trim(),text:U.trim(),images:Y,parts:z.slice(K,O)}}function kY($="",J=0){let[Y,Z]=w7({value:$,cursorPosition:J}),X=SY(0),Q=SY(new Map),U=G2((_)=>{Z((W)=>({value:_,cursorPosition:W.cursorPosition}));for(let W of Q.current.keys()){let H=B4(W);if(!_.includes(H))Q.current.delete(W)}}),G=G2((_)=>{Z((W)=>({...W,cursorPosition:Math.max(0,Math.min(_,W.value.length))}))}),z=G2(()=>{Z({value:"",cursorPosition:0}),Q.current.clear()}),K=G2((_)=>{X.current+=1;let W=X.current;return Q.current.set(W,{type:"text",data:_}),W}),O=G2((_,W)=>{b7(Q.current,_,W),X.current+=1;let H=X.current;return Q.current.set(H,{type:"image",data:_,mimeType:W}),H}),q=G2((_)=>{for(let[W,H]of _)if(Q.current.set(W,H),W>=X.current)X.current=W}),N=G2((_)=>M7(_,Q.current));return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:U,setCursorPosition:G,clear:z,pasteMap:Q.current,addPasteMapping:K,addImagePasteMapping:O,restorePasteMappings:q,resolveInput:N}}import{useMemoizedFn as xY}from"ahooks";import{useEffect as cY,useRef as uY,useState as I6}from"react";function T7($){return{supportsThinking:R1().resolveConfig($).reasoning}}function w4($){return T7($).supportsThinking}import{useInput as DY}from"ink";import{createContext as C7,useCallback as R7,useContext as y7,useEffect as I7,useMemo as S7,useRef as P4}from"react";import{jsxDEV as k7}from"react/jsx-dev-runtime";var fY=C7(null);function vY({children:$}){let J=P4(new Map),Y=P4(0),Z=R7((Q,U,G)=>{let z=Y.current++;return J.current.set(z,{id:z,priority:U,handler:Q}),G?.(),()=>{J.current.delete(z)}},[]),X=S7(()=>({register:Z}),[Z]);return DY((Q,U)=>{let G=[...J.current.values()].sort((z,K)=>K.priority-z.priority||z.id-K.id);for(let z of G)if(z.handler(Q,U)===!0)break}),k7(fY.Provider,{value:X,children:$},void 0,!1,void 0,this)}function O0($,J={}){let Y=y7(fY),Z=P4($);Z.current=$;let X=J.isActive??!0,Q=J.priority??0,U=P4(J.onRegistered);U.current=J.onRegistered,DY((G,z)=>{if(!Y&&X)Z.current(G,z)},{isActive:!Y&&X}),I7(()=>{if(!Y||!X)return;return Y.register((G,z)=>Z.current(G,z),Q,()=>U.current?.())},[X,Q,Y])}import D7 from"fast-glob";import f7 from"fuse.js";import{useEffect as VY,useMemo as A4,useRef as v7,useState as R6}from"react";var u2=null,V7=5000;function j7($,J){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let Z of Y){let X=Z[1],Q=Z.index+(Z[0].length-X.length),U=Q+X.length;if(J>=Q&&J<=U){let G=X.slice(1),z=!1;if(G.startsWith('"')){if(z=!0,G=G.slice(1),G.endsWith('"'))G=G.slice(0,-1)}return{hasQuery:!0,query:G,startIndex:Q,endIndex:U,quoted:z}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var h7=[...y6.map(($)=>`${$}/**`),...y6,...jY.map(($)=>`**/${$}`)];function hY($,J,Y={}){let{cwd:Z=K$(),maxSuggestions:X=15,ignorePatterns:Q=h7,debounceDelay:U=300,fuzzyMatch:G=!0,disabled:z=!1,canRequest:K}=Y,O=v7(K);O.current=K;let[q,N]=R6([]),[_,W]=R6(!1),[H,A]=R6(0),b=A4(()=>JSON.stringify(Q),[Q]),w=!z&&$.includes("@"),B=A4(()=>{if(J===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return j7($,J)},[$,J]);VY(()=>{if(!w){N([]),W(!1);return}let M=Date.now();if(u2&&u2.cwd===Z&&u2.ignoreKey===b&&M-u2.timestamp<V7){N(u2.files),W(!1);return}let L=!1,S=setTimeout(async()=>{if(z||O.current?.()===!1){N([]),W(!1);return}W(!0);try{let R=(await D7("**/*",{cwd:Z,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Q})).map((P)=>P.replace(/\\/g,"/"));if(!L)N(R),u2={cwd:Z,ignoreKey:b,files:R,timestamp:M}}catch(T){if(console.error("Failed to load files for @ completion:",T),!L)N([])}finally{if(!L)W(!1)}},U);return()=>{L=!0,clearTimeout(S)}},[w,Z,U,b,z]);let C=A4(()=>G&&q.length>0?new f7(q,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}):null,[q,G]),F=A4(()=>{if(!B.hasQuery||q.length===0)return[];let M=B.query.toLowerCase();if(M==="")return q.slice(0,X);if(C)return C.search(M).slice(0,X).map((y)=>y.item);return q.filter((L)=>L.toLowerCase().includes(M)).slice(0,X)},[B,q,C,X]);return VY(()=>{A(0)},[F]),{...B,suggestions:F,selectedIndex:H,loading:_}}function E7($,J=!1){if($.includes(" ")||J)return`@"${$}"`;return`@${$}`}function EY($,J,Y){if(!J.hasQuery)return{newInput:$,newCursorPos:$.length};let Z=E7(Y,J.quoted),X=$.slice(0,J.startIndex),Q=$.slice(J.endIndex),U=X+Z+" "+Q,G=J.startIndex+Z.length+1;return{newInput:U,newCursorPos:G}}import{useMemoizedFn as gY}from"ahooks";import{useEffect as mY,useRef as pY}from"react";var e0=($,J)=>{let Y=pY(!1),Z=pY(null),X=gY(()=>{if(Z.current)clearTimeout(Z.current);Z.current=setTimeout(()=>{B$().setAwaitingSecondCtrlC(!1),Y.current=!1,Z.current=null},3000)}),Q=()=>{W8().shutdown("SIGINT",0)},U=gY(()=>{if(!Y.current){if(Y.current=!0,$&&J)J();B$().setAwaitingSecondCtrlC(!0),X()}else{if(Z.current)clearTimeout(Z.current),Z.current=null;B$().setAwaitingSecondCtrlC(!1),Q()}});return mY(()=>{if($){if(B$().setAwaitingSecondCtrlC(!1),Y.current=!1,Z.current)clearTimeout(Z.current),Z.current=null}},[$]),mY(()=>{return()=>{if(Z.current)clearTimeout(Z.current)}},[]),U};var b4=H1("UI"),rY=($,J,Y,Z,X,Q,U,G,z,K,O=!1)=>{let N=s0()==="main-input",_=$.value,W=$.setValue,H=$.cursorPosition,A=d1(),b=O1(),w=N1(),B=g8(),C=B?w4(B):!1,[F,M]=I6(!1),[L,y]=I6([]),[S,T]=I6(0),R=hY(_,H,{cwd:b,maxSuggestions:10,disabled:O,canRequest:()=>m0().app.activeModal!=="sessionHistoryViewer"}),P=e0(U||!1,Q),j=uY(0),o=500,u=uY(!1),J0=h2(),K0=J0?.status==="loading"?J0.requestId:void 0;cY(()=>{u.current=!1},[U,K0]),cY(()=>{if(O){M(!1),y([]);return}if(R.hasQuery&&R.suggestions.length>0){let f=R.suggestions.map((v)=>({command:v,description:dY(v)?`Directory: ${v}`:`File: ${v}`,matchScore:1}));y(f),M(!0),T(0)}else if(_.startsWith("/"))if(_.includes(" "))M(!1),y([]);else{let v=lY(_,b);y(v),M(v.length>0),T(0)}else M(!1),y([])},[_,R.hasQuery,R.suggestions,b,O]);let q0=xY(()=>{A.clearMessages(),A.setError(null)}),a=xY(()=>{if(O)return;b4.debug("[DIAG] handleSubmit called:",{input:_,showSuggestions:F});let f=_.trim();if(f){let v=$.resolveInput(f);b4.debug("[DIAG] Submitting command:",{displayText:f,textLength:v.text.length,imageCount:v.images.length}),M(!1),y([]);let G0=$.pasteMap.size>0?new Map($.pasteMap):new Map;X(f,G0),$.clear(),J(v),b4.debug("[DIAG] Command submitted to onSubmit callback")}else b4.debug("[DIAG] Empty command, not submitting")});return O0((f,v)=>{if(f==="?"&&!_)return z?.(),setTimeout(()=>$.clear(),0),!0;if(v.backspace||v.delete||v.leftArrow||v.rightArrow||v.pageUp||v.pageDown||!v.ctrl&&!v.meta&&!v.escape&&!v.tab&&!v.upArrow&&!v.downArrow&&!v.return&&!(f==="?"&&!_))return!1;if(v.ctrl&&f==="c"||v.meta&&f==="c"||v.ctrl&&f==="d"||v.meta&&f==="d")return P(),!0;if(v.ctrl&&f==="l"||v.meta&&f==="l")return q0(),!0;if(v.ctrl&&f==="t"||v.meta&&f==="t")return A.toggleThinkingExpanded(),!0;if(v.escape){if(K)z?.();else if(U&&Q){if(u.current)return!0;u.current=!0,Q()}else if(F)M(!1),y([]);else if(_){let V=Date.now();if(V-j.current<500)$.clear(),j.current=0;else j.current=V}return!0}if(v.tab&&v.shift)return G?.(),!0;if(v.tab){if(F&&L.length>0){let V=L[S].command;if(R.hasQuery&&R.suggestions.includes(V)){let{newInput:x,newCursorPos:l}=EY(_,R,V);W(x),$.setCursorPosition(l)}else{let x=V+" ";W(x),$.setCursorPosition(x.length)}M(!1),y([])}else if(C)w.toggleThinkingMode();return!0}if(v.return)return a(),!0;if(v.upArrow){if(F&&L.length>0){let V=L.length-1;T((x)=>x>0?x-1:V)}else{let V=Y();if(V){if(V.pasteMappings.size>0)$.restorePasteMappings(V.pasteMappings);W(V.display),$.setCursorPosition(V.display.length)}}return!0}if(v.downArrow){if(F&&L.length>0){let V=L.length-1;T((x)=>x<V?x+1:0)}else{let V=Z();if(V){if(V.pasteMappings.size>0)$.restorePasteMappings(V.pasteMappings);W(V.display),$.setCursorPosition(V.display.length)}}return!0}return!1},{isActive:N&&!O,priority:20}),{handleSubmit:a,showSuggestions:F,suggestions:L,selectedSuggestionIndex:S}};import r7 from"ansi-escapes";import{useStdout as a7}from"ink";import{useCallback as i7,useEffect as o7,useRef as n7}from"react";import{useStdout as g7}from"ink";import{debounce as m7}from"lodash-es";import{useEffect as p7,useState as x7}from"react";var aY={columns:80,rows:24};function c7($){return{width:$.columns||80,height:$.rows||24}}function u7($,J){return $.width===J.width&&$.height===J.height}function iY($,J,Y){let{stdout:Z}=g7(),[X,Q]=x7(()=>$(Z));return p7(()=>{let U=()=>{let z=$(Z);Q((K)=>J(K,z)?K:z)},G=m7(U,Y);return U(),Z.on("resize",G),()=>{Z.off("resize",G),G.cancel()}},[Z,Y,J,$]),X}function d7($){return $.columns||aY.columns}function l7($){return $.rows||aY.rows}function M4($,J=200){return iY($==="columns"?d7:l7,Object.is,J)}function r1($=200){return iY(c7,u7,$)}function d2($=200){return M4("columns",$)}function oY(){let{stdout:$}=a7(),J=d2(),Y=n7(!0),Z=z0((Q)=>Q.session.actions.incrementClearCount),X=i7(()=>{if($)$.write(r7.clearTerminal);Z()},[$,Z]);return o7(()=>{if(Y.current){Y.current=!1;return}X()},[J,X]),{refreshStatic:X}}import{useEffect as JQ}from"react";var t7=50,eY=500,s7=new Set(["session_surface_cursor_invalid","session_surface_snapshot_changed"]);function nY($=0){return{viewGeneration:$,status:"idle",messages:[],truncated:!1}}function S6($,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 tY($,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 k6($){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 F8($){let J=$ instanceof S$?$.code:null;return{code:J,message:k6(J)}}function e7($){return $.slice(-eY).map((Y)=>({...Y}))}function $Q($,J){let Y=new Set(J.map((Z)=>Z.id));return[...$.filter((Z)=>!Y.has(Z.id)),...J].slice(0,eY).map((Z)=>({...Z}))}class D6{serviceFactory;pageLimit;listeners=new Set;service=null;pendingServiceClose=null;ownerClosePromise=null;activeController=null;generation=0;pageRequest=null;activeActivation=null;disposed=!1;state=nY();constructor($={}){this.serviceFactory=$.serviceFactory??(()=>new T4),this.pageLimit=$.pageLimit??t7}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 Y=this.service??this.createService(),Z=await Y.listPage($);if(!this.isCurrent(J,Y))throw new S$("session_surface_unavailable");return Z}async listAll(){let $=this.generation,J=[],Y=new Set,Z;do{if(!this.isCurrent($))throw new S$("session_surface_unavailable");let X=await this.listPage({cursor:Z,limit:this.pageLimit});if(!this.isCurrent($))throw new S$("session_surface_unavailable");for(let Q of X.sessions){let U=sY(Q.locator);if(Y.has(U))continue;Y.add(U),J.push(Q)}Z=X.nextCursor}while(Z);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 Y=this.service;if(this.service=null,!$.capabilities.history.read){this.setState({status:"error",session:$,messages:[],truncated:!1,error:{code:"session_surface_capability_unavailable",message:k6("session_surface_capability_unavailable")}}),await this.closeService(Y,"history-view-replaced");return}if(this.setState({status:"loading",session:$,messages:[],truncated:!1}),await this.closeService(Y,"history-view-replaced"),!this.isCurrent(J))return;let Z=this.createService(),X=this.beginRequest();try{let Q=await Z.open($.locator,{limit:this.pageLimit});if(!this.isCurrent(J,Z,X))return;if(!S6($.locator,Q.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(Q,"ready")}catch(Q){if(!this.isCurrent(J,Z,X))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:F8(Q)})}finally{if(this.activeController===X)this.activeController=null}}activate($,J){let Y=`${J}\x00${sY($.locator)}`;if(this.activeActivation?.key===Y)return this.activeActivation.promise;let Z=this.activateUnshared($,J).finally(()=>{if(this.activeActivation?.promise===Z)this.activeActivation=null});return this.activeActivation={key:Y,promise:Z},Z}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 Y=++this.generation;this.abortActiveRequest("history-view-replaced"),this.setState({status:"forking",session:$,messages:[],truncated:!1});let Z=this.service;if(this.service=null,await this.closeService(Z,"history-view-replaced"),!this.isCurrent(Y))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork($.locator);if(!this.isCurrent(Y,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!tY($.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({status:"error",session:$,messages:[],truncated:!1,error:F8(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:Y,snapshot:Z}=this.state,X=this.service;if(!X||!J||!Y||!Z||!J.capabilities.history.read||!this.matchesActionTarget($)||$.olderCursor!==Y)return Promise.resolve();let Q=this.generation,U=this.beginRequest();this.setState({...this.state,status:"loading-older",error:void 0});let G=X.historyPage(J.locator,{cursor:Y,expectedSnapshot:Z,limit:this.pageLimit}).then((z)=>{if(!this.isCurrent(Q,X,U))return;if(z.snapshot!==Z)throw new S$("session_surface_snapshot_changed");this.setState({...this.state,status:"ready",messages:$Q(z.messages,this.state.messages),olderCursor:z.olderCursor,snapshot:z.snapshot,truncated:this.state.truncated||z.truncated,error:void 0})}).catch(async(z)=>{if(!this.isCurrent(Q,X,U))return;if(z instanceof S$&&s7.has(z.code)){this.setState({status:"loading",session:J,messages:[],truncated:!1});try{let K=await X.open(J.locator,{limit:this.pageLimit});if(!this.isCurrent(Q,X,U))return;if(!S6(J.locator,K.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(K,"ready")}catch(K){if(!this.isCurrent(Q,X,U))return;this.setState({status:"error",session:J,messages:[],truncated:!1,error:F8(K)})}return}this.setState({...this.state,status:"error",error:F8(z)})}).finally(()=>{if(this.activeController===U)this.activeController=null;if(this.pageRequest===G)this.pageRequest=null});return this.pageRequest=G,G}async fork($){if(this.state.status!=="ready")return;let J=this.state.session,Y=this.service;if(!J||!Y||!this.matchesActionTarget($))return;if(!J.capabilities.history.fork){this.setState({...this.state,status:"error",error:{code:"session_surface_capability_unavailable",message:k6("session_surface_capability_unavailable")}});return}let Z=++this.generation;if(this.abortActiveRequest("history-fork"),this.setState({...this.state,status:"forking",error:void 0}),this.service=null,await this.closeService(Y,"history-fork"),!this.isCurrent(Z))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork(J.locator);if(!this.isCurrent(Z,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!tY(J.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({...this.state,status:"error",error:F8(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(nY(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 Y=this.pendingServiceClose,Z=(async()=>{if(Y)await Y;await $.close(J)})();this.pendingServiceClose=Z;let X=()=>{if(this.pendingServiceClose===Z)this.pendingServiceClose=null};return Z.then(X,X),Z}waitForPendingServiceClose(){return this.pendingServiceClose??Promise.resolve()}matchesActionTarget($){let J=this.state.session;return J!==void 0&&$.viewGeneration===this.state.viewGeneration&&S6($.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,Y){return!this.disposed&&$===this.generation&&(J===void 0||J===this.service)&&(Y===void 0||!Y.signal.aborted)}commitResult($,J){this.setState({status:J,session:$.session,messages:e7($.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 sY($){return $.workspace.kind==="local"?`${$.version}\x00local\x00${$.workspace.projectPath}\x00${$.sessionId}`:`${$.version}\x00acp-remote\x00${$.workspace.workspaceRef}\x00${$.sessionId}`}class f6{factory;active;generation=0;remoteRequestEpoch=0;constructor($=()=>new D6){this.factory=$}acquire($){let J=++this.generation;this.active??=this.factory();let Y=this.active,Z=Y.subscribe($);return async()=>{if(Z(),await Promise.resolve(),this.generation!==J)return;if(this.active===Y)this.active=void 0;await Y.close()}}getState(){return this.active?.getState()??{viewGeneration:0,status:"idle",messages:[],truncated:!1}}activate($,J){return this.active?.activate($,J)??Promise.resolve()}closeView(){return this.cancelRemoteRequest(),this.active?.closeView()??Promise.resolve()}loadOlder($){return this.active?.loadOlder($)??Promise.resolve()}fork($){return this.active?.fork($)??Promise.resolve()}beginRemoteRequest(){return++this.remoteRequestEpoch}cancelRemoteRequest(){this.remoteRequestEpoch+=1}isCurrentRemoteRequest($){return this.active!==void 0&&this.remoteRequestEpoch===$}}async function $3($,J,Y){let Z=$.beginRemoteRequest(),X=J.beginRemoteOpening();if(await X.cleared.catch(()=>{return}),!$.isCurrentRemoteRequest(Z)||!J.isRemoteOpeningCurrent(X.epoch))return;let Q=$.activate(Y.session,Y.intent);if(!$.isCurrentRemoteRequest(Z)||!J.bindRemoteOpening(X.epoch,Y,$.getState().viewGeneration)){await Q;return}await Q}function J3({lifecycle:$,project:J,report:Y}){JQ(()=>{let Z=$.acquire(J);return()=>{Z().catch(Y)}},[$,J,Y])}import{useEffect as GQ}from"react";var YQ=100,XQ=30000,ZQ=new Set(["task.status","session.deleted","session.archived"]);class X3{timers=new WeakMap;setInterval($,J){let Y=setInterval($,J),Z={unref:()=>Y.unref()};return this.timers.set(Z,Y),Z}clearInterval($){let J=this.timers.get($);if(!J)return;clearInterval(J),this.timers.delete($)}}var QQ=new X3;class v6{service;store;bus;timerApi;listeners=new Set;ownedOperations=new Set;mutationTail=Promise.resolve();state;visibleLocator;hasCompleteCatalog=!1;activeRefresh=null;dirty=!1;disposed=!1;started=!1;unsubscribeBus;pollTimer;closePromise;constructor($={}){this.service=$.service??new T4,this.store=$.store??new Z4,this.bus=$.bus??F4,this.timerApi=$.timerApi??QQ,this.state=Y3("idle",[],this.store.snapshot().unreadKeys)}getState(){return this.state}subscribe($){if(this.disposed)return()=>{return};return this.listeners.add($),()=>this.listeners.delete($)}async start(){if(this.disposed)return;if(!this.started)this.started=!0,this.unsubscribeBus=this.bus.subscribe(($)=>{if(ZQ.has($.type))this.consume(this.requestRefresh(!0))}),this.pollTimer=this.timerApi.setInterval(()=>{this.consume(this.requestRefresh(!0))},XQ),this.pollTimer.unref();await this.requestRefresh(!1)}listAll(){return this.requestRefresh(!1)}requestRefresh($){if(this.disposed)return Promise.resolve(K2(this.state.sessions));if(this.activeRefresh){if($)this.dirty=!0;return this.activeRefresh}let J,Y,Z=new Promise((X,Q)=>{J=X,Y=Q});return this.activeRefresh=Z,this.trackOperation(Z),this.consume(this.drainRefresh(Z,J,Y)),Z}acknowledge($){return this.trackOperation(this.acknowledgeInternal($))}async acknowledgeInternal($){if(this.disposed)return;return this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.acknowledge($);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async drainRefresh($,J,Y){try{let Z=K2(this.state.sessions);do this.dirty=!1,Z=await this.refreshOnce();while(!this.disposed&&this.dirty);if(this.activeRefresh===$)this.activeRefresh=null;J(Z)}catch(Z){if(this.activeRefresh===$)this.activeRefresh=null;Y(Z)}}setVisibleLocator($){return this.trackOperation(this.setVisibleLocatorInternal($))}async setVisibleLocatorInternal($){if(this.disposed)return;if(this.visibleLocator=$?Z3($):void 0,await this.waitForActiveRefresh(),this.disposed)return;if(!this.hasCompleteCatalog)return;await this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.reconcile(this.state.sessions,this.visibleLocator);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async waitForActiveRefresh(){let $=this.activeRefresh;while($){if(await $,this.disposed)return;$=this.activeRefresh}}close(){if(this.closePromise)return this.closePromise;if(this.disposed=!0,this.dirty=!1,this.unsubscribeBus?.(),this.unsubscribeBus=void 0,this.pollTimer)this.timerApi.clearInterval(this.pollTimer),this.pollTimer=void 0;this.listeners.clear();let $=this.service.close("tui-task-attention-controller-closed");return this.closePromise=this.drainOwnedOperations($),this.closePromise}async drainOwnedOperations($){let J=Promise.allSettled([$]);while(this.ownedOperations.size>0)await Promise.allSettled([...this.ownedOperations]);let[Y]=await J;if(Y?.status==="rejected")throw Y.reason}enqueueMutation($){let J=this.mutationTail.then($,$);return this.mutationTail=J.then(()=>{return},()=>{return}),J}trackOperation($){return this.ownedOperations.add($),$.then(()=>this.ownedOperations.delete($),()=>this.ownedOperations.delete($)),$}consume($){$.catch(()=>{return})}async refreshOnce(){this.publish("loading",this.state.sessions,this.state.unreadKeys);try{let $=await this.readCompleteCatalog();if(this.disposed)return K2(this.state.sessions);return await this.enqueueMutation(async()=>{if(this.disposed)return!1;let Y=await this.store.reconcile($,this.visibleLocator);if(this.disposed)return!1;return this.hasCompleteCatalog=!0,this.publish("ready",$,Y.unreadKeys),!0})?K2($):K2(this.state.sessions)}catch{if(!this.disposed)this.publish("error",this.state.sessions,this.state.unreadKeys);return K2(this.state.sessions)}}async readCompleteCatalog(){let $=[],J;do{let Y=await this.service.listPage({...J?{cursor:J}:{},limit:YQ});if(this.disposed)return[];$.push(...Y.sessions),J=Y.nextCursor}while(J);return $}publish($,J,Y){if(this.disposed)return;this.state=Y3($,J,Y);for(let Z of this.listeners)try{let X=Z(this.state);if(X)this.consume(X)}catch{}}}function Y3($,J,Y){return Object.freeze({status:$,sessions:Object.freeze(K2(J).map(UQ)),unreadKeys:Object.freeze([...Y])})}function UQ($){return Object.freeze($.locator.workspace),Object.freeze($.locator),Object.freeze($.capabilities.history),Object.freeze($.capabilities.turn),Object.freeze($.capabilities.files),Object.freeze($.capabilities.terminal),Object.freeze($.capabilities),Object.freeze($)}function K2($){return $.map((J)=>({...J,locator:Z3(J.locator),capabilities:{...J.capabilities,history:{...J.capabilities.history},turn:{...J.capabilities.turn},files:{...J.capabilities.files},terminal:{...J.capabilities.terminal}}}))}function Z3($){return $.workspace.kind==="local"?{...$,workspace:{...$.workspace}}:{...$,workspace:{...$.workspace}}}class V6{factory;active;generation=0;constructor($=()=>new v6){this.factory=$}acquire($){let J=++this.generation;if(!this.active){let U=this.factory();this.active={controller:U,visibility:new B6(U)}}let Y=this.active,{controller:Z,visibility:X}=Y,Q=Z.subscribe($);return{controller:Z,visibility:X,release:async()=>{if(Q(),await Promise.resolve(),this.generation!==J)return;if(this.active===Y)this.active=void 0;await Z.close()}}}listAll(){let $=this.active?.controller;return $?$.listAll():Promise.reject(Error("TUI task attention lifecycle is not active"))}acknowledge($){return this.active?.controller.acknowledge($)??Promise.resolve()}setVisibleLocator($){return this.active?.controller.setVisibleLocator($)??Promise.resolve()}proveLocal($){return this.active?.visibility.proveLocal($)??Promise.resolve()}beginRemote($,J){return this.active?.visibility.beginRemote($,J)??Promise.resolve()}beginRemoteOpening(){return this.active?.visibility.beginRemoteOpening()??{epoch:0,cleared:Promise.resolve()}}isRemoteOpeningCurrent($){return this.active?.visibility.isRemoteOpeningCurrent($)??!1}bindRemoteOpening($,J,Y){return this.active?.visibility.bindRemoteOpening($,J,Y)??!1}endRemote(){return this.active?.visibility.endRemote()??Promise.resolve()}updateRemote($,J){return this.active?.visibility.updateRemote($,J)??Promise.resolve()}controller(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.controller}visibility(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.visibility}}function Q3({ready:$,lifecycle:J,initialize:Y,project:Z,report:X}){GQ(()=>{if(!$)return;let Q=J.acquire(Z);return Y(Q).catch(()=>X("startup")),()=>{Q.release().catch(()=>X("shutdown"))}},[Y,J,Z,$,X])}import z2 from"chalk";import KQ from"string-width";var k0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},R4="\x1B",j6=`${R4}[2K`,C4=($)=>$>0?`${R4}[${$}A`:"",U3=`${R4}[?25l`,G3=`${R4}[?25h`;function K3($,J){k0.active=!0,k0.renderedLineCount=0,k0.lastRenderedLines=[],k0.terminalWidth=$,k0.terminalHeight=J,k0.isFirstRender=!0}function z3($,J){k0.terminalWidth=$,k0.terminalHeight=J}function q3($,J,Y,Z){if(!k0.active)return;let X=8,Q=Math.max(1,k0.terminalHeight-X),U=[],G=L$.getTheme(),z=" ".repeat(k0.prefixIndent),K=z2.dim.hex(G.colors.border.light);if(J>0)U.push(`${z}${z2.dim.hex(G.colors.text.muted)(`^ ${J} lines above (streaming...)`)}`);let O=Y==="code",q=Y==="diff",N="",_=$;if(O&&$.length>0)N=$[0].match(/^```(\w+)?/)?.[1]||"",_=$.slice(1);else if(q&&$.length>0&&$[0]==="<<<DIFF>>>")_=$.slice(1);let W=_.slice(-Q);if(O&&J===0){let A=N?` ${z2.hex(G.colors.text.secondary)(N)}`:"";U.push(`${z}${K("╭─")}${A}`)}for(let A=0;A<W.length;A++){let b=W[A],w=z;if(A===0&&!Z&&k0.isFirstRender&&!O&&!q)w=z2.bold.hex(G.colors.success)("• ")+" ",k0.isFirstRender=!1;let B=O?4:0,C=k0.terminalWidth-k0.prefixIndent-2-B,F=b;if(KQ(b)>C)F=b.slice(0,C);if(O)U.push(`${z}${K("│")} ${F}`);else if(q){let M=F;if(M.startsWith("+"))U.push(`${w}${z2.green(F)}`);else if(M.startsWith("-"))U.push(`${w}${z2.red(F)}`);else if(M.startsWith("@@"))U.push(`${w}${z2.dim(F)}`);else U.push(`${w}${F}`)}else U.push(`${w}${F}`);if(A===0&&!Z&&k0.isFirstRender)k0.isFirstRender=!1}let H=[];if(H.push(U3),k0.renderedLineCount>0)H.push(C4(k0.renderedLineCount)),H.push("\r");for(let A=0;A<U.length;A++){let b=U[A],w=k0.lastRenderedLines[A];if(b!==w)H.push(j6),H.push(b);if(A<U.length-1)H.push(`
42
+ ${c0}`}]}}let P0=W6(r),l0=await P(P0);if(!l0.accepted){let c0=l0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";B.addAssistantMessage(c0);return}if(l0.messageId)F.rememberFollowUpPresentation(l0.messageId,k);if(l0.queue)C.projectFollowUpQueue(l0.queue,g0);if(l0.delivery==="next_turn")I$.request();return}C.setTasks([]),F.setRecoveredSteeringCount(0),M.current=!1;let m=F.createAbortController();r0.resetStreamingBuffers(),B.clearFinalizingStreamingMessageId(),F.setProcessing(!0);try{let c=await k2(k);if(!c.success&&c.error&&c.error!=="aborted")B.setError(c.error)}catch(c){let r=t8(c);if(r.isAbort);else B.setError(`执行失败: ${r.displayMessage}`)}finally{if(F.getAbortController()===m)F.setProcessing(!1),F.clearAbortController(m),B.setCurrentThinkingContent(null),y.current?.notifyIdle()}});return l1(()=>{let k=L4.subscribe((E)=>{if(!wY(E,{sessionId:z,projectPath:K}))return;if(E.type.startsWith("team.")){let{teamName:m,messageId:c,content:r}=E.properties,P0=E.properties.metadata;if(E.type==="team.message.received"&&typeof m==="string"&&typeof c==="string"&&typeof r==="string"&&MY(P0,{messageId:c,teamName:m}))(async()=>{let l0=await j(r,{messageId:c,origin:"team_message",metadata:P0});if(!l0.accepted)return;if(await new bY(m,K8()).markDelivered([c]),l0.delivery==="next_turn")I$.request()})().catch((l0)=>{_8.warn("[useCommandHandler] Failed to deliver teammate message",l0)});queueMicrotask(()=>{d0()});return}if(E.type!=="subagent.completion.queued")return;I$.request()});return()=>{k()}},[j,I$,d0,z,K]),l1(()=>{let k=!1;return(async()=>{if(Y)await M6.resolvePendingWithHandler(K,z,Y);else await M6.cancelPendingNonInteractive(K,z);if(k)return;let[E,m]=await Promise.all([i$.hasPendingInbox(K,z),i$.hasActiveGoal(K,z)]),c=!E&&!m&&await i$.hasRecoverableTurn(K,z);if(E||m||c)I$.request()})().catch((E)=>{if(!k)_8.warn("[useCommandHandler] Failed to recover pending interaction or inbox",E)}),()=>{k=!0}},[Y,I$,z,K]),{executeCommand:e,handleAbort:A1,isProcessing:G||b?.status==="loading",cleanupAgent:R,refreshFollowUpQueue:N$,controlFollowUpQueue:r$}};import{useMemoizedFn as B4}from"ahooks";import{useRef as H7,useState as W7}from"react";var yY=()=>{let[$,J]=W7([]),Y=H7(-1),Z=B4((G,z)=>{let K={display:G,pasteMappings:z?new Map(z):new Map};J((O)=>[...O,K]),Y.current=-1}),X=B4(()=>{if($.length===0)return null;let G=Y.current===-1?$.length-1:Math.max(0,Y.current-1);return Y.current=G,$[G]||null}),Q=B4(()=>{if(Y.current===-1)return null;let G=Y.current+1;if(G>=$.length)return Y.current=-1,null;else return Y.current=G,$[G]||null}),U=B4(()=>{Y.current=-1});return{commandHistory:$,historyIndex:Y.current,addToHistory:Z,getPreviousCommand:X,getNextCommand:Q,resetHistoryIndex:U}};import{useMemoizedFn as N8}from"ahooks";import{useMemo as F7,useRef as IY,useState as L7}from"react";var SY=()=>{let[$,J]=L7({isVisible:!1,details:null,resolver:null}),Y=IY(null),Z=IY([]),X=N8((O)=>{Y.current=O,J({isVisible:Boolean(O),details:O?.details??null,resolver:O?.resolve??null})}),Q=N8((O,q)=>{if(O.settled)return;if(O.settled=!0,O.signal&&O.abortListener)O.signal.removeEventListener("abort",O.abortListener);O.resolve(q)}),U=N8((O,q)=>{return new Promise((N)=>{let _={details:O,resolve:N,signal:q,settled:!1},W=()=>{if(Y.current===_){Q(_,{approved:!1,reason:H8}),X(Z.current.shift()??null);return}let H=Z.current.indexOf(_);if(H>=0)Z.current.splice(H,1);Q(_,{approved:!1,reason:H8})};if(_.abortListener=W,q?.aborted){W();return}if(q?.addEventListener("abort",W,{once:!0}),!Y.current){X(_);return}Z.current.push(_)})}),G=N8((O)=>{let q=Y.current;if(q)Q(q,O);let N=Z.current.shift()??null;X(N)}),z=N8(()=>{if(Y.current)Q(Y.current,{approved:!1,reason:H8});for(let O of Z.current)Q(O,{approved:!1,reason:H8});Z.current=[],X(null)}),K=F7(()=>({requestConfirmation:U}),[U]);return{confirmationState:$,confirmationHandler:K,handleResponse:G,dismissAll:z}};import{useMemoizedFn as G2}from"ahooks";import{useRef as kY,useState as B7}from"react";var T6="␞",C6="␟";function w4($){return`${T6}PASTE:${$}:`}function R6(){return C6}var w7=`${T6}PASTE:(\\d+):[\\s\\S]*?${C6}`;function P7($){return $.includes(T6)&&$.includes(C6)}function A7($,J,Y){let Z=[...$.values()].filter((U)=>U.type==="image");if(Z.length>=p2)throw Error(`最多只能粘贴 ${p2} 张图片`);let X=Z.reduce((U,G)=>U+`data:${G.mimeType};base64,`.length+G.data.length,0),Q=`data:${Y};base64,`.length+J.length;if(X+Q>$4)throw Error("图片编码后总大小不能超过 5 MiB")}function b7($,J){let Y=[],Z=[];if(!P7($)){let q=$.trim();if(q)Z.push({type:"text",text:q});return{displayText:$,text:$,images:Y,parts:Z}}let X=Array.from($.matchAll(new RegExp(w7,"g"))),Q=0,U="",G="";for(let q of X){let N=q.index,_=N+q[0].length,W=parseInt(q[1],10),H=J.get(W);if(N>Q){let A=$.slice(Q,N);Z.push({type:"text",text:A}),U+=A,G+=A}if(!H)U+=q[0],G+=q[0],Z.push({type:"text",text:q[0]});else if(H.type==="text")U+=H.data,G+=H.data,Z.push({type:"text",text:H.data});else{let A={id:W,base64:H.data,mimeType:H.mimeType};Y.push(A),Z.push({type:"image",...A}),G+=`[Image #${W}]`}Q=_}if(Q<$.length){let q=$.slice(Q);Z.push({type:"text",text:q}),U+=q,G+=q}let z=[];for(let q of Z){let N=z[z.length-1];if(q.type==="text"&&N?.type==="text")N.text+=q.text;else z.push(q)}let K=0,O=z.length;while(K<z.length){let q=z[K];if(q.type!=="text"||q.text.trim()!=="")break;K++}while(O>K){let q=z[O-1];if(q.type!=="text"||q.text.trim()!=="")break;O--}return{displayText:G.trim(),text:U.trim(),images:Y,parts:z.slice(K,O)}}function DY($="",J=0){let[Y,Z]=B7({value:$,cursorPosition:J}),X=kY(0),Q=kY(new Map),U=G2((_)=>{Z((W)=>({value:_,cursorPosition:W.cursorPosition}));for(let W of Q.current.keys()){let H=w4(W);if(!_.includes(H))Q.current.delete(W)}}),G=G2((_)=>{Z((W)=>({...W,cursorPosition:Math.max(0,Math.min(_,W.value.length))}))}),z=G2(()=>{Z({value:"",cursorPosition:0}),Q.current.clear()}),K=G2((_)=>{X.current+=1;let W=X.current;return Q.current.set(W,{type:"text",data:_}),W}),O=G2((_,W)=>{A7(Q.current,_,W),X.current+=1;let H=X.current;return Q.current.set(H,{type:"image",data:_,mimeType:W}),H}),q=G2((_)=>{for(let[W,H]of _)if(Q.current.set(W,H),W>=X.current)X.current=W}),N=G2((_)=>b7(_,Q.current));return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:U,setCursorPosition:G,clear:z,pasteMap:Q.current,addPasteMapping:K,addImagePasteMapping:O,restorePasteMappings:q,resolveInput:N}}import{useMemoizedFn as cY}from"ahooks";import{useEffect as uY,useRef as dY,useState as S6}from"react";function M7($){return{supportsThinking:R1().resolveConfig($).reasoning}}function P4($){return M7($).supportsThinking}import{useInput as fY}from"ink";import{createContext as T7,useCallback as C7,useContext as R7,useEffect as y7,useMemo as I7,useRef as A4}from"react";import{jsxDEV as S7}from"react/jsx-dev-runtime";var vY=T7(null);function VY({children:$}){let J=A4(new Map),Y=A4(0),Z=C7((Q,U,G)=>{let z=Y.current++;return J.current.set(z,{id:z,priority:U,handler:Q}),G?.(),()=>{J.current.delete(z)}},[]),X=I7(()=>({register:Z}),[Z]);return fY((Q,U)=>{let G=[...J.current.values()].sort((z,K)=>K.priority-z.priority||z.id-K.id);for(let z of G)if(z.handler(Q,U)===!0)break}),S7(vY.Provider,{value:X,children:$},void 0,!1,void 0,this)}function O0($,J={}){let Y=R7(vY),Z=A4($);Z.current=$;let X=J.isActive??!0,Q=J.priority??0,U=A4(J.onRegistered);U.current=J.onRegistered,fY((G,z)=>{if(!Y&&X)Z.current(G,z)},{isActive:!Y&&X}),y7(()=>{if(!Y||!X)return;return Y.register((G,z)=>Z.current(G,z),Q,()=>U.current?.())},[X,Q,Y])}import k7 from"fast-glob";import D7 from"fuse.js";import{useEffect as jY,useMemo as b4,useRef as f7,useState as y6}from"react";var u2=null,v7=5000;function V7($,J){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let Z of Y){let X=Z[1],Q=Z.index+(Z[0].length-X.length),U=Q+X.length;if(J>=Q&&J<=U){let G=X.slice(1),z=!1;if(G.startsWith('"')){if(z=!0,G=G.slice(1),G.endsWith('"'))G=G.slice(0,-1)}return{hasQuery:!0,query:G,startIndex:Q,endIndex:U,quoted:z}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var j7=[...I6.map(($)=>`${$}/**`),...I6,...EY.map(($)=>`**/${$}`)];function hY($,J,Y={}){let{cwd:Z=K$(),maxSuggestions:X=15,ignorePatterns:Q=j7,debounceDelay:U=300,fuzzyMatch:G=!0,disabled:z=!1,canRequest:K}=Y,O=f7(K);O.current=K;let[q,N]=y6([]),[_,W]=y6(!1),[H,A]=y6(0),b=b4(()=>JSON.stringify(Q),[Q]),w=!z&&$.includes("@"),B=b4(()=>{if(J===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return V7($,J)},[$,J]);jY(()=>{if(!w){N([]),W(!1);return}let M=Date.now();if(u2&&u2.cwd===Z&&u2.ignoreKey===b&&M-u2.timestamp<v7){N(u2.files),W(!1);return}let L=!1,S=setTimeout(async()=>{if(z||O.current?.()===!1){N([]),W(!1);return}W(!0);try{let R=(await k7("**/*",{cwd:Z,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Q})).map((P)=>P.replace(/\\/g,"/"));if(!L)N(R),u2={cwd:Z,ignoreKey:b,files:R,timestamp:M}}catch(T){if(console.error("Failed to load files for @ completion:",T),!L)N([])}finally{if(!L)W(!1)}},U);return()=>{L=!0,clearTimeout(S)}},[w,Z,U,b,z]);let C=b4(()=>G&&q.length>0?new D7(q,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}):null,[q,G]),F=b4(()=>{if(!B.hasQuery||q.length===0)return[];let M=B.query.toLowerCase();if(M==="")return q.slice(0,X);if(C)return C.search(M).slice(0,X).map((y)=>y.item);return q.filter((L)=>L.toLowerCase().includes(M)).slice(0,X)},[B,q,C,X]);return jY(()=>{A(0)},[F]),{...B,suggestions:F,selectedIndex:H,loading:_}}function E7($,J=!1){if($.includes(" ")||J)return`@"${$}"`;return`@${$}`}function gY($,J,Y){if(!J.hasQuery)return{newInput:$,newCursorPos:$.length};let Z=E7(Y,J.quoted),X=$.slice(0,J.startIndex),Q=$.slice(J.endIndex),U=X+Z+" "+Q,G=J.startIndex+Z.length+1;return{newInput:U,newCursorPos:G}}import{useMemoizedFn as mY}from"ahooks";import{useEffect as pY,useRef as xY}from"react";var e0=($,J)=>{let Y=xY(!1),Z=xY(null),X=mY(()=>{if(Z.current)clearTimeout(Z.current);Z.current=setTimeout(()=>{B$().setAwaitingSecondCtrlC(!1),Y.current=!1,Z.current=null},3000)}),Q=()=>{W8().shutdown("SIGINT",0)},U=mY(()=>{if(!Y.current){if(Y.current=!0,$&&J)J();B$().setAwaitingSecondCtrlC(!0),X()}else{if(Z.current)clearTimeout(Z.current),Z.current=null;B$().setAwaitingSecondCtrlC(!1),Q()}});return pY(()=>{if($){if(B$().setAwaitingSecondCtrlC(!1),Y.current=!1,Z.current)clearTimeout(Z.current),Z.current=null}},[$]),pY(()=>{return()=>{if(Z.current)clearTimeout(Z.current)}},[]),U};var M4=H1("UI"),aY=($,J,Y,Z,X,Q,U,G,z,K,O=!1)=>{let N=s0()==="main-input",_=$.value,W=$.setValue,H=$.cursorPosition,A=d1(),b=O1(),w=N1(),B=m8(),C=B?P4(B):!1,[F,M]=S6(!1),[L,y]=S6([]),[S,T]=S6(0),R=hY(_,H,{cwd:b,maxSuggestions:10,disabled:O,canRequest:()=>m0().app.activeModal!=="sessionHistoryViewer"}),P=e0(U||!1,Q),j=dY(0),o=500,u=dY(!1),J0=E2(),K0=J0?.status==="loading"?J0.requestId:void 0;uY(()=>{u.current=!1},[U,K0]),uY(()=>{if(O){M(!1),y([]);return}if(R.hasQuery&&R.suggestions.length>0){let f=R.suggestions.map((v)=>({command:v,description:lY(v)?`Directory: ${v}`:`File: ${v}`,matchScore:1}));y(f),M(!0),T(0)}else if(_.startsWith("/"))if(_.includes(" "))M(!1),y([]);else{let v=rY(_,b);y(v),M(v.length>0),T(0)}else M(!1),y([])},[_,R.hasQuery,R.suggestions,b,O]);let q0=cY(()=>{A.clearMessages(),A.setError(null)}),a=cY(()=>{if(O)return;M4.debug("[DIAG] handleSubmit called:",{input:_,showSuggestions:F});let f=_.trim();if(f){let v=$.resolveInput(f);M4.debug("[DIAG] Submitting command:",{displayText:f,textLength:v.text.length,imageCount:v.images.length}),M(!1),y([]);let G0=$.pasteMap.size>0?new Map($.pasteMap):new Map;X(f,G0),$.clear(),J(v),M4.debug("[DIAG] Command submitted to onSubmit callback")}else M4.debug("[DIAG] Empty command, not submitting")});return O0((f,v)=>{if(f==="?"&&!_)return z?.(),setTimeout(()=>$.clear(),0),!0;if(v.backspace||v.delete||v.leftArrow||v.rightArrow||v.pageUp||v.pageDown||!v.ctrl&&!v.meta&&!v.escape&&!v.tab&&!v.upArrow&&!v.downArrow&&!v.return&&!(f==="?"&&!_))return!1;if(v.ctrl&&f==="c"||v.meta&&f==="c"||v.ctrl&&f==="d"||v.meta&&f==="d")return P(),!0;if(v.ctrl&&f==="l"||v.meta&&f==="l")return q0(),!0;if(v.ctrl&&f==="t"||v.meta&&f==="t")return A.toggleThinkingExpanded(),!0;if(v.escape){if(K)z?.();else if(U&&Q){if(u.current)return!0;u.current=!0,Q()}else if(F)M(!1),y([]);else if(_){let V=Date.now();if(V-j.current<500)$.clear(),j.current=0;else j.current=V}return!0}if(v.tab&&v.shift)return G?.(),!0;if(v.tab){if(F&&L.length>0){let V=L[S].command;if(R.hasQuery&&R.suggestions.includes(V)){let{newInput:x,newCursorPos:l}=gY(_,R,V);W(x),$.setCursorPosition(l)}else{let x=V+" ";W(x),$.setCursorPosition(x.length)}M(!1),y([])}else if(C)w.toggleThinkingMode();return!0}if(v.return)return a(),!0;if(v.upArrow){if(F&&L.length>0){let V=L.length-1;T((x)=>x>0?x-1:V)}else{let V=Y();if(V){if(V.pasteMappings.size>0)$.restorePasteMappings(V.pasteMappings);W(V.display),$.setCursorPosition(V.display.length)}}return!0}if(v.downArrow){if(F&&L.length>0){let V=L.length-1;T((x)=>x<V?x+1:0)}else{let V=Z();if(V){if(V.pasteMappings.size>0)$.restorePasteMappings(V.pasteMappings);W(V.display),$.setCursorPosition(V.display.length)}}return!0}return!1},{isActive:N&&!O,priority:20}),{handleSubmit:a,showSuggestions:F,suggestions:L,selectedSuggestionIndex:S}};import l7 from"ansi-escapes";import{useStdout as r7}from"ink";import{useCallback as a7,useEffect as i7,useRef as o7}from"react";import{useStdout as h7}from"ink";import{debounce as g7}from"lodash-es";import{useEffect as m7,useState as p7}from"react";var iY={columns:80,rows:24};function x7($){return{width:$.columns||80,height:$.rows||24}}function c7($,J){return $.width===J.width&&$.height===J.height}function oY($,J,Y){let{stdout:Z}=h7(),[X,Q]=p7(()=>$(Z));return m7(()=>{let U=()=>{let z=$(Z);Q((K)=>J(K,z)?K:z)},G=g7(U,Y);return U(),Z.on("resize",G),()=>{Z.off("resize",G),G.cancel()}},[Z,Y,J,$]),X}function u7($){return $.columns||iY.columns}function d7($){return $.rows||iY.rows}function T4($,J=200){return oY($==="columns"?u7:d7,Object.is,J)}function r1($=200){return oY(x7,c7,$)}function d2($=200){return T4("columns",$)}function nY(){let{stdout:$}=r7(),J=d2(),Y=o7(!0),Z=z0((Q)=>Q.session.actions.incrementClearCount),X=a7(()=>{if($)$.write(l7.clearTerminal);Z()},[$,Z]);return i7(()=>{if(Y.current){Y.current=!1;return}X()},[J,X]),{refreshStatic:X}}import{useEffect as $Q}from"react";var n7=50,$3=500,t7=new Set(["session_surface_cursor_invalid","session_surface_snapshot_changed"]);function tY($=0){return{viewGeneration:$,status:"idle",messages:[],truncated:!1}}function k6($,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 sY($,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 D6($){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 F8($){let J=$ instanceof S$?$.code:null;return{code:J,message:D6(J)}}function s7($){return $.slice(-$3).map((Y)=>({...Y}))}function e7($,J){let Y=new Set(J.map((Z)=>Z.id));return[...$.filter((Z)=>!Y.has(Z.id)),...J].slice(0,$3).map((Z)=>({...Z}))}class f6{serviceFactory;pageLimit;listeners=new Set;service=null;pendingServiceClose=null;ownerClosePromise=null;activeController=null;generation=0;pageRequest=null;activeActivation=null;disposed=!1;state=tY();constructor($={}){this.serviceFactory=$.serviceFactory??(()=>new C4),this.pageLimit=$.pageLimit??n7}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 Y=this.service??this.createService(),Z=await Y.listPage($);if(!this.isCurrent(J,Y))throw new S$("session_surface_unavailable");return Z}async listAll(){let $=this.generation,J=[],Y=new Set,Z;do{if(!this.isCurrent($))throw new S$("session_surface_unavailable");let X=await this.listPage({cursor:Z,limit:this.pageLimit});if(!this.isCurrent($))throw new S$("session_surface_unavailable");for(let Q of X.sessions){let U=eY(Q.locator);if(Y.has(U))continue;Y.add(U),J.push(Q)}Z=X.nextCursor}while(Z);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 Y=this.service;if(this.service=null,!$.capabilities.history.read){this.setState({status:"error",session:$,messages:[],truncated:!1,error:{code:"session_surface_capability_unavailable",message:D6("session_surface_capability_unavailable")}}),await this.closeService(Y,"history-view-replaced");return}if(this.setState({status:"loading",session:$,messages:[],truncated:!1}),await this.closeService(Y,"history-view-replaced"),!this.isCurrent(J))return;let Z=this.createService(),X=this.beginRequest();try{let Q=await Z.open($.locator,{limit:this.pageLimit});if(!this.isCurrent(J,Z,X))return;if(!k6($.locator,Q.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(Q,"ready")}catch(Q){if(!this.isCurrent(J,Z,X))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:F8(Q)})}finally{if(this.activeController===X)this.activeController=null}}activate($,J){let Y=`${J}\x00${eY($.locator)}`;if(this.activeActivation?.key===Y)return this.activeActivation.promise;let Z=this.activateUnshared($,J).finally(()=>{if(this.activeActivation?.promise===Z)this.activeActivation=null});return this.activeActivation={key:Y,promise:Z},Z}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 Y=++this.generation;this.abortActiveRequest("history-view-replaced"),this.setState({status:"forking",session:$,messages:[],truncated:!1});let Z=this.service;if(this.service=null,await this.closeService(Z,"history-view-replaced"),!this.isCurrent(Y))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork($.locator);if(!this.isCurrent(Y,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!sY($.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({status:"error",session:$,messages:[],truncated:!1,error:F8(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:Y,snapshot:Z}=this.state,X=this.service;if(!X||!J||!Y||!Z||!J.capabilities.history.read||!this.matchesActionTarget($)||$.olderCursor!==Y)return Promise.resolve();let Q=this.generation,U=this.beginRequest();this.setState({...this.state,status:"loading-older",error:void 0});let G=X.historyPage(J.locator,{cursor:Y,expectedSnapshot:Z,limit:this.pageLimit}).then((z)=>{if(!this.isCurrent(Q,X,U))return;if(z.snapshot!==Z)throw new S$("session_surface_snapshot_changed");this.setState({...this.state,status:"ready",messages:e7(z.messages,this.state.messages),olderCursor:z.olderCursor,snapshot:z.snapshot,truncated:this.state.truncated||z.truncated,error:void 0})}).catch(async(z)=>{if(!this.isCurrent(Q,X,U))return;if(z instanceof S$&&t7.has(z.code)){this.setState({status:"loading",session:J,messages:[],truncated:!1});try{let K=await X.open(J.locator,{limit:this.pageLimit});if(!this.isCurrent(Q,X,U))return;if(!k6(J.locator,K.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(K,"ready")}catch(K){if(!this.isCurrent(Q,X,U))return;this.setState({status:"error",session:J,messages:[],truncated:!1,error:F8(K)})}return}this.setState({...this.state,status:"error",error:F8(z)})}).finally(()=>{if(this.activeController===U)this.activeController=null;if(this.pageRequest===G)this.pageRequest=null});return this.pageRequest=G,G}async fork($){if(this.state.status!=="ready")return;let J=this.state.session,Y=this.service;if(!J||!Y||!this.matchesActionTarget($))return;if(!J.capabilities.history.fork){this.setState({...this.state,status:"error",error:{code:"session_surface_capability_unavailable",message:D6("session_surface_capability_unavailable")}});return}let Z=++this.generation;if(this.abortActiveRequest("history-fork"),this.setState({...this.state,status:"forking",error:void 0}),this.service=null,await this.closeService(Y,"history-fork"),!this.isCurrent(Z))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork(J.locator);if(!this.isCurrent(Z,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!sY(J.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({...this.state,status:"error",error:F8(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(tY(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 Y=this.pendingServiceClose,Z=(async()=>{if(Y)await Y;await $.close(J)})();this.pendingServiceClose=Z;let X=()=>{if(this.pendingServiceClose===Z)this.pendingServiceClose=null};return Z.then(X,X),Z}waitForPendingServiceClose(){return this.pendingServiceClose??Promise.resolve()}matchesActionTarget($){let J=this.state.session;return J!==void 0&&$.viewGeneration===this.state.viewGeneration&&k6($.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,Y){return!this.disposed&&$===this.generation&&(J===void 0||J===this.service)&&(Y===void 0||!Y.signal.aborted)}commitResult($,J){this.setState({status:J,session:$.session,messages:s7($.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 eY($){return $.workspace.kind==="local"?`${$.version}\x00local\x00${$.workspace.projectPath}\x00${$.sessionId}`:`${$.version}\x00acp-remote\x00${$.workspace.workspaceRef}\x00${$.sessionId}`}class v6{factory;active;generation=0;remoteRequestEpoch=0;constructor($=()=>new f6){this.factory=$}acquire($){let J=++this.generation;this.active??=this.factory();let Y=this.active,Z=Y.subscribe($);return async()=>{if(Z(),await Promise.resolve(),this.generation!==J)return;if(this.active===Y)this.active=void 0;await Y.close()}}getState(){return this.active?.getState()??{viewGeneration:0,status:"idle",messages:[],truncated:!1}}activate($,J){return this.active?.activate($,J)??Promise.resolve()}closeView(){return this.cancelRemoteRequest(),this.active?.closeView()??Promise.resolve()}loadOlder($){return this.active?.loadOlder($)??Promise.resolve()}fork($){return this.active?.fork($)??Promise.resolve()}beginRemoteRequest(){return++this.remoteRequestEpoch}cancelRemoteRequest(){this.remoteRequestEpoch+=1}isCurrentRemoteRequest($){return this.active!==void 0&&this.remoteRequestEpoch===$}}async function J3($,J,Y){let Z=$.beginRemoteRequest(),X=J.beginRemoteOpening();if(await X.cleared.catch(()=>{return}),!$.isCurrentRemoteRequest(Z)||!J.isRemoteOpeningCurrent(X.epoch))return;let Q=$.activate(Y.session,Y.intent);if(!$.isCurrentRemoteRequest(Z)||!J.bindRemoteOpening(X.epoch,Y,$.getState().viewGeneration)){await Q;return}await Q}function Y3({lifecycle:$,project:J,report:Y}){$Q(()=>{let Z=$.acquire(J);return()=>{Z().catch(Y)}},[$,J,Y])}import{useEffect as UQ}from"react";var JQ=100,YQ=30000,XQ=new Set(["task.status","session.deleted","session.archived"]);class Z3{timers=new WeakMap;setInterval($,J){let Y=setInterval($,J),Z={unref:()=>Y.unref()};return this.timers.set(Z,Y),Z}clearInterval($){let J=this.timers.get($);if(!J)return;clearInterval(J),this.timers.delete($)}}var ZQ=new Z3;class V6{service;store;bus;timerApi;listeners=new Set;ownedOperations=new Set;mutationTail=Promise.resolve();state;visibleLocator;hasCompleteCatalog=!1;activeRefresh=null;dirty=!1;disposed=!1;started=!1;unsubscribeBus;pollTimer;closePromise;constructor($={}){this.service=$.service??new C4,this.store=$.store??new Q4,this.bus=$.bus??L4,this.timerApi=$.timerApi??ZQ,this.state=X3("idle",[],this.store.snapshot().unreadKeys)}getState(){return this.state}subscribe($){if(this.disposed)return()=>{return};return this.listeners.add($),()=>this.listeners.delete($)}async start(){if(this.disposed)return;if(!this.started)this.started=!0,this.unsubscribeBus=this.bus.subscribe(($)=>{if(XQ.has($.type))this.consume(this.requestRefresh(!0))}),this.pollTimer=this.timerApi.setInterval(()=>{this.consume(this.requestRefresh(!0))},YQ),this.pollTimer.unref();await this.requestRefresh(!1)}listAll(){return this.requestRefresh(!1)}requestRefresh($){if(this.disposed)return Promise.resolve(K2(this.state.sessions));if(this.activeRefresh){if($)this.dirty=!0;return this.activeRefresh}let J,Y,Z=new Promise((X,Q)=>{J=X,Y=Q});return this.activeRefresh=Z,this.trackOperation(Z),this.consume(this.drainRefresh(Z,J,Y)),Z}acknowledge($){return this.trackOperation(this.acknowledgeInternal($))}async acknowledgeInternal($){if(this.disposed)return;return this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.acknowledge($);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async drainRefresh($,J,Y){try{let Z=K2(this.state.sessions);do this.dirty=!1,Z=await this.refreshOnce();while(!this.disposed&&this.dirty);if(this.activeRefresh===$)this.activeRefresh=null;J(Z)}catch(Z){if(this.activeRefresh===$)this.activeRefresh=null;Y(Z)}}setVisibleLocator($){return this.trackOperation(this.setVisibleLocatorInternal($))}async setVisibleLocatorInternal($){if(this.disposed)return;if(this.visibleLocator=$?Q3($):void 0,await this.waitForActiveRefresh(),this.disposed)return;if(!this.hasCompleteCatalog)return;await this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.reconcile(this.state.sessions,this.visibleLocator);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async waitForActiveRefresh(){let $=this.activeRefresh;while($){if(await $,this.disposed)return;$=this.activeRefresh}}close(){if(this.closePromise)return this.closePromise;if(this.disposed=!0,this.dirty=!1,this.unsubscribeBus?.(),this.unsubscribeBus=void 0,this.pollTimer)this.timerApi.clearInterval(this.pollTimer),this.pollTimer=void 0;this.listeners.clear();let $=this.service.close("tui-task-attention-controller-closed");return this.closePromise=this.drainOwnedOperations($),this.closePromise}async drainOwnedOperations($){let J=Promise.allSettled([$]);while(this.ownedOperations.size>0)await Promise.allSettled([...this.ownedOperations]);let[Y]=await J;if(Y?.status==="rejected")throw Y.reason}enqueueMutation($){let J=this.mutationTail.then($,$);return this.mutationTail=J.then(()=>{return},()=>{return}),J}trackOperation($){return this.ownedOperations.add($),$.then(()=>this.ownedOperations.delete($),()=>this.ownedOperations.delete($)),$}consume($){$.catch(()=>{return})}async refreshOnce(){this.publish("loading",this.state.sessions,this.state.unreadKeys);try{let $=await this.readCompleteCatalog();if(this.disposed)return K2(this.state.sessions);return await this.enqueueMutation(async()=>{if(this.disposed)return!1;let Y=await this.store.reconcile($,this.visibleLocator);if(this.disposed)return!1;return this.hasCompleteCatalog=!0,this.publish("ready",$,Y.unreadKeys),!0})?K2($):K2(this.state.sessions)}catch{if(!this.disposed)this.publish("error",this.state.sessions,this.state.unreadKeys);return K2(this.state.sessions)}}async readCompleteCatalog(){let $=[],J;do{let Y=await this.service.listPage({...J?{cursor:J}:{},limit:JQ});if(this.disposed)return[];$.push(...Y.sessions),J=Y.nextCursor}while(J);return $}publish($,J,Y){if(this.disposed)return;this.state=X3($,J,Y);for(let Z of this.listeners)try{let X=Z(this.state);if(X)this.consume(X)}catch{}}}function X3($,J,Y){return Object.freeze({status:$,sessions:Object.freeze(K2(J).map(QQ)),unreadKeys:Object.freeze([...Y])})}function QQ($){return Object.freeze($.locator.workspace),Object.freeze($.locator),Object.freeze($.capabilities.history),Object.freeze($.capabilities.turn),Object.freeze($.capabilities.files),Object.freeze($.capabilities.terminal),Object.freeze($.capabilities),Object.freeze($)}function K2($){return $.map((J)=>({...J,locator:Q3(J.locator),capabilities:{...J.capabilities,history:{...J.capabilities.history},turn:{...J.capabilities.turn},files:{...J.capabilities.files},terminal:{...J.capabilities.terminal}}}))}function Q3($){return $.workspace.kind==="local"?{...$,workspace:{...$.workspace}}:{...$,workspace:{...$.workspace}}}class j6{factory;active;generation=0;constructor($=()=>new V6){this.factory=$}acquire($){let J=++this.generation;if(!this.active){let U=this.factory();this.active={controller:U,visibility:new w6(U)}}let Y=this.active,{controller:Z,visibility:X}=Y,Q=Z.subscribe($);return{controller:Z,visibility:X,release:async()=>{if(Q(),await Promise.resolve(),this.generation!==J)return;if(this.active===Y)this.active=void 0;await Z.close()}}}listAll(){let $=this.active?.controller;return $?$.listAll():Promise.reject(Error("TUI task attention lifecycle is not active"))}acknowledge($){return this.active?.controller.acknowledge($)??Promise.resolve()}setVisibleLocator($){return this.active?.controller.setVisibleLocator($)??Promise.resolve()}proveLocal($){return this.active?.visibility.proveLocal($)??Promise.resolve()}beginRemote($,J){return this.active?.visibility.beginRemote($,J)??Promise.resolve()}beginRemoteOpening(){return this.active?.visibility.beginRemoteOpening()??{epoch:0,cleared:Promise.resolve()}}isRemoteOpeningCurrent($){return this.active?.visibility.isRemoteOpeningCurrent($)??!1}bindRemoteOpening($,J,Y){return this.active?.visibility.bindRemoteOpening($,J,Y)??!1}endRemote(){return this.active?.visibility.endRemote()??Promise.resolve()}updateRemote($,J){return this.active?.visibility.updateRemote($,J)??Promise.resolve()}controller(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.controller}visibility(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.visibility}}function U3({ready:$,lifecycle:J,initialize:Y,project:Z,report:X}){UQ(()=>{if(!$)return;let Q=J.acquire(Z);return Y(Q).catch(()=>X("startup")),()=>{Q.release().catch(()=>X("shutdown"))}},[Y,J,Z,$,X])}import z2 from"chalk";import GQ from"string-width";var k0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},y4="\x1B",E6=`${y4}[2K`,R4=($)=>$>0?`${y4}[${$}A`:"",G3=`${y4}[?25l`,K3=`${y4}[?25h`;function z3($,J){k0.active=!0,k0.renderedLineCount=0,k0.lastRenderedLines=[],k0.terminalWidth=$,k0.terminalHeight=J,k0.isFirstRender=!0}function q3($,J){k0.terminalWidth=$,k0.terminalHeight=J}function _3($,J,Y,Z){if(!k0.active)return;let X=8,Q=Math.max(1,k0.terminalHeight-X),U=[],G=L$.getTheme(),z=" ".repeat(k0.prefixIndent),K=z2.dim.hex(G.colors.border.light);if(J>0)U.push(`${z}${z2.dim.hex(G.colors.text.muted)(`^ ${J} lines above (streaming...)`)}`);let O=Y==="code",q=Y==="diff",N="",_=$;if(O&&$.length>0)N=$[0].match(/^```(\w+)?/)?.[1]||"",_=$.slice(1);else if(q&&$.length>0&&$[0]==="<<<DIFF>>>")_=$.slice(1);let W=_.slice(-Q);if(O&&J===0){let A=N?` ${z2.hex(G.colors.text.secondary)(N)}`:"";U.push(`${z}${K("╭─")}${A}`)}for(let A=0;A<W.length;A++){let b=W[A],w=z;if(A===0&&!Z&&k0.isFirstRender&&!O&&!q)w=z2.bold.hex(G.colors.success)("• ")+" ",k0.isFirstRender=!1;let B=O?4:0,C=k0.terminalWidth-k0.prefixIndent-2-B,F=b;if(GQ(b)>C)F=b.slice(0,C);if(O)U.push(`${z}${K("│")} ${F}`);else if(q){let M=F;if(M.startsWith("+"))U.push(`${w}${z2.green(F)}`);else if(M.startsWith("-"))U.push(`${w}${z2.red(F)}`);else if(M.startsWith("@@"))U.push(`${w}${z2.dim(F)}`);else U.push(`${w}${F}`)}else U.push(`${w}${F}`);if(A===0&&!Z&&k0.isFirstRender)k0.isFirstRender=!1}let H=[];if(H.push(G3),k0.renderedLineCount>0)H.push(R4(k0.renderedLineCount)),H.push("\r");for(let A=0;A<U.length;A++){let b=U[A],w=k0.lastRenderedLines[A];if(b!==w)H.push(E6),H.push(b);if(A<U.length-1)H.push(`
43
43
  `)}if(U.length<k0.renderedLineCount){for(let b=U.length;b<k0.renderedLineCount;b++)H.push(`
44
- `),H.push(j6);let A=k0.renderedLineCount-U.length;H.push(C4(A))}H.push(G3),process.stdout.write(H.join("")),k0.renderedLineCount=U.length,k0.lastRenderedLines=U}function o$(){if(!k0.active)return;if(k0.renderedLineCount>0){let $=[];$.push(U3),$.push(C4(k0.renderedLineCount)),$.push("\r");for(let J=0;J<k0.renderedLineCount;J++)if($.push(j6),J<k0.renderedLineCount-1)$.push(`
45
- `);if(k0.renderedLineCount>1)$.push(C4(k0.renderedLineCount-1)),$.push("\r");$.push(G3),process.stdout.write($.join(""))}k0.active=!1,k0.renderedLineCount=0,k0.lastRenderedLines=[],k0.isFirstRender=!0}function Z1(){return k0.active}import _3 from"node:fs";import zQ from"node:os";import h6 from"node:path";import{MultiSelect as qQ}from"@inkjs/ui";import{useMemoizedFn as y4}from"ahooks";import{Box as b0,Text as W0,useFocus as _Q,useFocusManager as OQ}from"ink";import I4 from"ink-select-input";import NQ from"ink-spinner";import L8 from"ink-text-input";import{useEffect as O3,useState as l2}from"react";import{jsxDEV as g}from"react/jsx-dev-runtime";var HQ=[{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"}],WQ=[{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 FQ($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function B8({onComplete:$,onCancel:J,initialConfig:Y}){let[Z,X]=l2(Y?"name":"mode"),[Q,U]=l2({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[G,z]=l2(""),[K,O]=l2(!1),[q,N]=l2(""),[_,W]=l2(Y?"edit":"manual"),{focus:H}=OQ(),b={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[_];O3(()=>{if(Z==="name"||Z==="description"||Z==="systemPrompt"||Z==="aiPrompt")return;H(`step-${Z}`)},[Z,H]);let w=y4(()=>{let L=b.indexOf(Z);if(L<b.length-1)X(b[L+1])}),B=y4(()=>{if(q)N("");if(Z==="confirm"&&_==="ai"){X("aiPrompt");return}let L=b.indexOf(Z);if(L>0)X(b[L-1]);else J()}),C=y4(async()=>{O(!0),N("");try{let L=await q8.create(),y=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
44
+ `),H.push(E6);let A=k0.renderedLineCount-U.length;H.push(R4(A))}H.push(K3),process.stdout.write(H.join("")),k0.renderedLineCount=U.length,k0.lastRenderedLines=U}function o$(){if(!k0.active)return;if(k0.renderedLineCount>0){let $=[];$.push(G3),$.push(R4(k0.renderedLineCount)),$.push("\r");for(let J=0;J<k0.renderedLineCount;J++)if($.push(E6),J<k0.renderedLineCount-1)$.push(`
45
+ `);if(k0.renderedLineCount>1)$.push(R4(k0.renderedLineCount-1)),$.push("\r");$.push(K3),process.stdout.write($.join(""))}k0.active=!1,k0.renderedLineCount=0,k0.lastRenderedLines=[],k0.isFirstRender=!0}function Z1(){return k0.active}import O3 from"node:fs";import KQ from"node:os";import h6 from"node:path";import{MultiSelect as zQ}from"@inkjs/ui";import{useMemoizedFn as I4}from"ahooks";import{Box as b0,Text as W0,useFocus as qQ,useFocusManager as _Q}from"ink";import S4 from"ink-select-input";import OQ from"ink-spinner";import L8 from"ink-text-input";import{useEffect as N3,useState as l2}from"react";import{jsxDEV as g}from"react/jsx-dev-runtime";var NQ=[{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"}],HQ=[{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 WQ($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function B8({onComplete:$,onCancel:J,initialConfig:Y}){let[Z,X]=l2(Y?"name":"mode"),[Q,U]=l2({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[G,z]=l2(""),[K,O]=l2(!1),[q,N]=l2(""),[_,W]=l2(Y?"edit":"manual"),{focus:H}=_Q(),b={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[_];N3(()=>{if(Z==="name"||Z==="description"||Z==="systemPrompt"||Z==="aiPrompt")return;H(`step-${Z}`)},[Z,H]);let w=I4(()=>{let L=b.indexOf(Z);if(L<b.length-1)X(b[L+1])}),B=I4(()=>{if(q)N("");if(Z==="confirm"&&_==="ai"){X("aiPrompt");return}let L=b.indexOf(Z);if(L>0)X(b[L-1]);else J()}),C=I4(async()=>{O(!0),N("");try{let L=await q8.create(),y=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
46
46
 
47
47
  ## 可用工具列表
48
48
 
@@ -118,54 +118,54 @@ ${c0}`}]}}let P0=H6(r),l0=await P(P0);if(!l0.accepted){let c0=l0.reason==="queue
118
118
  4. **color**: 选择一个合适的颜色用于 UI 区分
119
119
  5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
120
120
 
121
- **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,G)).trim(),R=T.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(R)T=R[1];let P=JSON.parse(T);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(L){N(L instanceof Error?L.message:String(L))}finally{O(!1)}});O3(()=>{if(Z==="aiGenerating"&&!K&&!q)C()},[Z,K,q,C]);let F=y4(async()=>{try{let L=Q.location==="project"?h6.join(K$(),".blade","agents"):h6.join(zQ.homedir(),".blade","agents");await _3.promises.mkdir(L,{recursive:!0});let y=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){y.push("tools:");for(let R of Q.tools)y.push(` - ${R}`)}if(Q.color)y.push(`color: ${Q.color}`);y.push("---");let S=[y.join(`
121
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,G)).trim(),R=T.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(R)T=R[1];let P=JSON.parse(T);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(L){N(L instanceof Error?L.message:String(L))}finally{O(!1)}});N3(()=>{if(Z==="aiGenerating"&&!K&&!q)C()},[Z,K,q,C]);let F=I4(async()=>{try{let L=Q.location==="project"?h6.join(K$(),".blade","agents"):h6.join(KQ.homedir(),".blade","agents");await O3.promises.mkdir(L,{recursive:!0});let y=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){y.push("tools:");for(let R of Q.tools)y.push(` - ${R}`)}if(Q.color)y.push(`color: ${Q.color}`);y.push("---");let S=[y.join(`
122
122
  `),"",`# ${Q.name} Subagent`,"",Q.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
123
- `),T=h6.join(L,`${Q.name}.md`);await _3.promises.writeFile(T,S,"utf-8"),$()}catch(L){console.error("保存配置失败:",L)}}),M=e0(!1,J);if(O0((L,y)=>{if(y.escape)B();else if(y.ctrl&&L==="c"||y.meta&&L==="c")M()},{isActive:Z!=="tools"}),Z==="mode")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(I4,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(L)=>{if(L.value==="ai")W("ai"),X("aiPrompt");else W("manual"),X("name")}},void 0,!1,void 0,this),g(b0,{marginTop:1,children:g(W0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="aiPrompt")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:[g(W0,{color:"green",children:"描述: "},void 0,!1,void 0,this),g(L8,{value:G,onChange:z,onSubmit:(L)=>{if(!L.trim())return;X("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(b0,{children:g(W0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="aiGenerating"){if(q)return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{color:"red",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"yellow",children:[g(NQ,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:['根据你的描述:"',G,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(Z==="name"){let L=_==="edit";return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:["Step 1/7: ",L?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:L?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:[g(W0,{color:"green",children:"名称: "},void 0,!1,void 0,this),L?g(W0,{children:Q.name},void 0,!1,void 0,this):g(L8,{value:Q.name,onChange:(y)=>U({...Q,name:y}),onSubmit:(y)=>{if(FQ(y))return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(b0,{children:g(W0,{dimColor:!0,children:L?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L&&g(L8,{value:"",onChange:()=>{},onSubmit:w,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(Z==="description")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:[g(W0,{color:"green",children:"描述: "},void 0,!1,void 0,this),g(L8,{value:Q.description,onChange:(L)=>U({...Q,description:L}),onSubmit:(L)=>{if(!L.trim())return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(b0,{children:g(W0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="tools")return g(LQ,{config:Q,setConfig:U,onNext:w,onPrev:B},void 0,!1,void 0,this);if(Z==="color")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(I4,{items:WQ,onSelect:(L)=>{let y=L.value==="none"?void 0:L.value;U({...Q,color:y}),w()}},void 0,!1,void 0,this),g(b0,{marginTop:1,children:g(W0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="location")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(I4,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(L)=>{U({...Q,location:L.value}),w()}},void 0,!1,void 0,this),g(b0,{marginTop:1,children:g(W0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="systemPrompt")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:[g(W0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),g(L8,{value:Q.systemPrompt,onChange:(L)=>U({...Q,systemPrompt:L}),onSubmit:()=>w()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(b0,{children:g(W0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="confirm")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[g(W0,{children:[g(W0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(I4,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(L)=>{if(L.value==="save")F();else if(L.value==="back")B();else J()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function LQ({config:$,setConfig:J,onNext:Y,onPrev:Z}){let{isFocused:X}=_Q({id:"step-tools"});O0((U,G)=>{if(G.escape)Z()},{isActive:X});let Q=(U)=>{if(U.includes("all"))J({...$,tools:["all"]});else J({...$,tools:U});Y()};return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(qQ,{options:HQ,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import BQ from"node:fs";import{useMemoizedFn as q2}from"ahooks";import{Box as o0,Text as $$}from"ink";import E6 from"ink-select-input";import{useEffect as wQ,useMemo as N3,useState as S4}from"react";import{jsxDEV as _0}from"react/jsx-dev-runtime";var g6=10;function H3({workspaceRoot:$,initialMode:J="menu",onComplete:Y,onCancel:Z}){let X=W4($),[Q,U]=S4(J),[G,z]=S4(null),[K,O]=S4(0),[q,N]=S4(0),_=q2(()=>{X.clear(),X.loadFromStandardLocations(),O((T)=>T+1)}),W=N3(()=>{return X.getAllSubagents()},[K]),H=Math.ceil(W.length/g6)||1,A=N3(()=>{let T=q*g6;return W.slice(T,T+g6)},[W,q]);wQ(()=>{let T=Math.max(0,H-1);if(q>T)N(T)},[H,q]);let b=q2(()=>{if(q<H-1)N((T)=>T+1)}),w=q2(()=>{if(q>0)N((T)=>T-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=q2((T)=>{if(T.value==="cancel"){Z?.();return}U(T.value)}),F=q2((T)=>{if(z(T.value),Q==="edit")U("editWizard");else if(Q==="delete")U("deleteConfirm")}),M=q2(async()=>{if(!G?.configPath)return;try{await BQ.promises.unlink(G.configPath),_(),L()}catch(T){console.error("删除失败:",T)}}),L=q2(()=>{U("menu"),z(null)}),y=e0(!1,Z);if(O0((T,R)=>{if(R.escape){if(Q==="menu")Z?.();else if(Q==="list"||Q==="edit"||Q==="delete")N(0),L();else if(Q==="deleteConfirm")L()}else if(R.ctrl&&T==="c"||R.meta&&T==="c")y();else if(Q==="list"){if(R.leftArrow||T==="h")w();else if(R.rightArrow||T==="l")b()}},{isActive:Q!=="create"&&Q!=="editWizard"}),Q==="menu")return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(E6,{items:B,onSelect:C},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0($$,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="list"){if(W.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0($$,{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($$,{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($$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),_0($$,{color:"gray",children:[" (共 ",W.length," 个)"]},void 0,!0,void 0,this),H>1&&_0($$,{color:"yellow",children:[" ","第 ",q+1,"/",H," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A.map((T)=>_0(o0,{flexDirection:"column",paddingLeft:2,children:[_0(o0,{children:_0($$,{children:[_0($$,{bold:!0,color:T.color||"white",children:["• ",T.name]},void 0,!0,void 0,this),_0($$,{color:"gray",children:[" - ",T.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),T.tools&&T.tools.length>0&&_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",children:["工具: ",T.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),T.configPath&&_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",dimColor:!0,children:T.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},T.name,!0,void 0,this)),_0(o0,{marginTop:1,paddingLeft:2,children:H>1?_0($$,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):_0($$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let S=(T)=>{if(W.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0($$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let R=W.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($$,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(E6,{items:R,onSelect:F},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0($$,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(Q==="create")return _0(B8,{onComplete:()=>{_(),L()},onCancel:L},void 0,!1,void 0,this);if(Q==="edit")return S("编辑 Agent");if(Q==="editWizard"&&G){let T={name:G.name,description:G.description,tools:G.tools||[],color:G.color,location:G.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:G.systemPrompt||""};return _0(B8,{initialConfig:T,onComplete:()=>{_(),L()},onCancel:L},void 0,!1,void 0,this)}if(Q==="delete")return S("删除 Agent");if(Q==="deleteConfirm"&&G)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{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($$,{children:["你确定要删除 Agent"," ",_0($$,{bold:!0,color:"yellow",children:G.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0($$,{dimColor:!0,children:["文件路径: ",G.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0($$,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(E6,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(T)=>{if(T.value==="confirm")M();else L()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as r2,Text as M0}from"ink";import bQ,{useEffect as MQ,useState as TQ}from"react";import{useEffect as PQ,useState as W3}from"react";function B3($=K$(),J=5000){let[Y,Z]=W3(null),[X,Q]=W3(!0);return PQ(()=>{let U=!0,G=async()=>{try{let K=await F3($);if(!U)return;if(!K){Z(null),Q(!1);return}let O=await L3($);if(!U)return;Z(O)}catch{if(U)Z(null)}finally{if(U)Q(!1)}};G();let z=null;if(J>0)z=setInterval(G,J);return()=>{if(U=!1,z)clearInterval(z)}},[$,J]),{branch:Y,loading:X}}function _2($){let J=Math.max(0,Math.ceil($/1000)),Y=Math.floor(J/60),Z=J%60;return Y>0?`${Y}m ${Z}s`:`${Z}s`}function AQ($,J=Date.now()){let Y=$.snapshot?.nextActionAt;return Y===void 0?void 0:Math.max(0,Y-J)}function k4($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let Z=AQ($,J),X=Z===void 0?void 0:_2(Z);switch(Y.activity){case"admission_wait":{let Q=Y.admission;return{primary:"等待 Provider 容量",secondary:Q?`队列 ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)} · ${Q.scope} · 已等待 ${_2(Q.waitMs)}`:"等待可用请求容量",compact:Q?`Provider 排队 · ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)}`:"Provider 排队"}}case"retry_wait":{let Q=Y.retry,U=Y.reason==="rate_limit"?`Provider 请求受限${X?`,${X} 后重试`:""}`:`Provider 暂时不可用${X?`,${X} 后重试`:""}`,G=Q?[`尝试 ${Q.attempt}/${Q.maxRetries}`,Q.recoveryRemainingMs!==void 0?`剩余预算 ${_2(Q.recoveryRemainingMs)}`:void 0].filter((z)=>z!==void 0):[];return{primary:U,secondary:G.join(" · "),compact:`${Y.reason==="rate_limit"?"Provider 限流":"Provider 恢复"}${X?` · ${X}`:""}${Q?` · ${Q.attempt}/${Q.maxRetries}`:""}`}}case"retry_attempt":{let Q=Y.retry;return{primary:"正在重试 Provider",secondary:Q?`尝试 ${Q.attempt}/${Q.maxRetries}`:"",compact:`Provider 重试${Q?` · ${Q.attempt}/${Q.maxRetries}`:""}`}}case"circuit_open":return{primary:`${Y.reason==="rate_limit"?"Provider 请求受限":"Provider 故障已隔离"},等待恢复探测${X?`(${X})`:""}`,secondary:Y.circuit?.recoveryRemainingMs!==void 0?`剩余预算 ${_2(Y.circuit.recoveryRemainingMs)}`:"",compact:`Provider ${Y.reason==="rate_limit"?"限流":"熔断"}${X?` · ${X}`:""}`};case"circuit_probe":return{primary:"Provider 正在执行恢复探测",secondary:"",compact:"Provider 恢复探测"};case"stream_stall":{let Q=Y.stall;return{primary:Q?.outputStarted?"Provider 流暂时停滞":"Provider 尚未返回流数据",secondary:Q?`已等待 ${_2(Q.durationMs)} · 超时上限 ${_2(Q.timeoutMs)}`:"",compact:Q?`Provider 等待 · ${_2(Q.durationMs)}`:"Provider 等待"}}case"fallback":{let Q=Y.fallback;return{primary:Q?`正在切换到 ${Q.to.model}`:"正在切换模型",secondary:Q?`候选 ${Q.candidate}/${Q.candidateCount} · 来源 ${Q.from.model}`:"",compact:Q?`Provider 切换 · ${Q.to.model}`:"Provider 切换"}}}}import{jsxDEV as Z0,Fragment as E$}from"react/jsx-dev-runtime";function CQ($){return $?`exec-host:${$.category}:${$.consecutiveCount}`:""}function RQ($){if(!$)return"";return`lineage:${$.rootTurnId?.slice(0,8)??"?"}:${$.currentTurnId.slice(0,8)}`}var P3=bQ.memo(()=>{let $=E8(),J=E2(),Z=j2()==="shortcuts",X=KJ(),Q=O1(),{branch:U}=B3(Q),G=g8(),z=$J(),K=o9(),O=x8(),q=c8(),N=u8(),_=d8(),W=l8(),H=n9(),A=t9(),b=j8(),w=p8(),B=LJ(),C=GJ(),F=h8(),M=V2(),[L,y]=TQ(null),S=k4(b);MQ(()=>{let u=!1;new m6(Q,M).get().then((q0)=>{if(!u)y(q0)}).catch(()=>{if(!u)y(null)});let K0=m6.subscribe((q0)=>{if(!u&&q0.sessionId===M&&q0.workspaceRoot===Q)y(q0.goal)});return()=>{u=!0,K0()}},[M,Q]);let T=G?w4(G):!1,P=(()=>{if(J==="default")return null;if(J==="autoEdit")return Z0(M0,{color:"magenta",children:[">> ","auto edit on ",Z0(M0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return Z0(M0,{color:"cyan",children:["‖ plan mode on ",Z0(M0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return Z0(M0,{color:"red",children:["yolo mode on ",Z0(M0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),j=P!==null,o=[["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 Z0(r2,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[Z?Z0(r2,{flexDirection:"column",gap:0,children:o.map((u,J0)=>Z0(r2,{flexDirection:"row",children:[u.map((K0,q0)=>{let[a,f]=K0.split(":");return Z0(r2,{flexDirection:"row",width:20,children:[Z0(M0,{color:"yellow",children:a},void 0,!1,void 0,this),Z0(M0,{color:"gray",children:":"},void 0,!1,void 0,this),Z0(M0,{color:"white",children:f},void 0,!1,void 0,this)]},q0,!0,void 0,this)}),J0===o.length-1&&Z0(M0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},J0,!0,void 0,this))},void 0,!1,void 0,this):Z0(r2,{flexDirection:"row",gap:1,children:[U&&Z0(E$,{children:[Z0(M0,{color:"gray",children:[" ",U]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P,j&&Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),L&&Z0(E$,{children:[Z0(M0,{color:L.status==="active"?"green":L.status==="verifying"?"cyan":L.status==="blocked"||L.status==="budget_limited"?"yellow":"gray",children:["goal:",L.status," ",L.objective.slice(0,32),L.prematureStop?` recovery:${L.prematureStop.consecutiveCount}`:"",L.verificationStall?` verify-gap:${L.verificationStall.consecutiveCount}`:"",L.frontierStall?` frontier:${L.frontierStall.category}:${L.frontierStall.consecutiveCount}`:"",L.executionHostFailure?` ${CQ(L.executionHostFailure)}`:"",L.turnLineage?` ${RQ(L.turnLineage)}`:""]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z0(r2,{flexDirection:"row",gap:1,children:!$?Z0(M0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):Z0(E$,{children:[T&&Z0(E$,{children:[O?Z0(M0,{color:"cyan",children:["Effort ",q]},void 0,!0,void 0,this):Z0(M0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N!=="auto"&&Z0(E$,{children:[Z0(M0,{color:N==="fast"?"yellow":"gray",children:["Speed ",N]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&Z0(E$,{children:[Z0(M0,{color:"gray",children:["Output ",_]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&Z0(E$,{children:[Z0(M0,{color:"gray",children:["Style ",W]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G&&Z0(M0,{color:"gray",children:G.model},void 0,!1,void 0,this),S&&Z0(E$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"yellow",children:S.compact},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),K?Z0(M0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):Z0(M0,{color:z<20?"red":z<50?"yellow":"gray",children:[z,"%"]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:A===void 0?"gray":"cyan",children:["Cache ",w3(A)]},void 0,!0,void 0,this),H>0.001&&Z0(E$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"green",children:["$",H<0.01?H.toFixed(4):H.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),(w?.pending??0)>0&&Z0(E$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"yellow",children:["Queued ",w?.pending??0," · /queue"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B>0&&Z0(E$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"cyan",children:["已恢复 ",B," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.length>0&&Z0(E$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"cyan",children:["New tasks ",F.length," · /resume"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C==="error"&&Z0(E$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"yellow",children:"Task sync unavailable"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&Z0(E$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{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 p6,Text as x6}from"ink";import yQ from"react";import{jsxDEV as a2}from"react/jsx-dev-runtime";var A3=yQ.memo(({suggestions:$,selectedIndex:J,visible:Y,maxDisplay:Z=8})=>{if(!Y||$.length===0)return null;let X=0,Q=Math.min(Z,$.length),U=J>=$.length;if(J>=Z&&!U)X=J-Z+1,Q=J+1;let G=$.slice(X,Q),z=$.length>Z;return a2(p6,{flexDirection:"column",paddingX:2,paddingY:0,children:[G.map((K,O)=>{let N=X+O===J;return a2(p6,{flexDirection:"row",paddingX:1,gap:2,children:[a2(x6,{color:N?"cyan":"white",bold:N,children:K.command},void 0,!1,void 0,this),a2(x6,{color:N?"cyan":"gray",dimColor:!N,children:["- ",K.description]},void 0,!0,void 0,this)]},K.command,!0,void 0,this)}),z&&a2(p6,{paddingX:1,children:a2(x6,{color:U?"cyan":"gray",bold:U,dimColor:!U,children:["... and ",$.length-Z," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as t$,Text as W1,useStdout as RU}from"ink";import yU from"ink-select-input";import q9,{useMemo as $5}from"react";import{Box as I0,Text as u0}from"ink";import N2,{useEffect as K9,useMemo as O2,useRef as t3}from"react";import{Box as s6,Text as V3}from"ink";import xQ from"react";import{Text as Q1}from"ink";import gQ from"react";import k3 from"string-width";import w8 from"string-width";function c6({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 IQ=c6();function u6($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(IQ,"")}var b3=($=0)=>(J)=>`\x1B[${J+$}m`,M3=($=0)=>(J)=>`\x1B[${38+$};5;${J}m`,T3=($=0)=>(J,Y,Z)=>`\x1B[${38+$};2;${J};${Y};${Z}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]}},wN=Object.keys(Q$.modifier),SQ=Object.keys(Q$.color),kQ=Object.keys(Q$.bgColor),PN=[...SQ,...kQ];function DQ(){let $=new Map;for(let[J,Y]of Object.entries(Q$)){for(let[Z,X]of Object.entries(Y))Q$[Z]={open:`\x1B[${X[0]}m`,close:`\x1B[${X[1]}m`},Y[Z]=Q$[Z],$.set(X[0],X[1]);Object.defineProperty(Q$,J,{value:Y,enumerable:!1})}return Object.defineProperty(Q$,"codes",{value:$,enumerable:!1}),Q$.color.close="\x1B[39m",Q$.bgColor.close="\x1B[49m",Q$.color.ansi=b3(),Q$.color.ansi256=M3(),Q$.color.ansi16m=T3(),Q$.bgColor.ansi=b3(10),Q$.bgColor.ansi256=M3(10),Q$.bgColor.ansi16m=T3(10),Object.defineProperties(Q$,{rgbToAnsi256:{value(J,Y,Z){if(J===Y&&Y===Z){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(Y/255*5)+Math.round(Z/255*5)},enumerable:!1},hexToRgb:{value(J){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(J.toString(16));if(!Y)return[0,0,0];let[Z]=Y;if(Z.length===3)Z=[...Z].map((Q)=>Q+Q).join("");let X=Number.parseInt(Z,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 Y,Z,X;if(J>=232)Y=((J-232)*10+8)/255,Z=Y,X=Y;else{J-=16;let G=J%36;Y=Math.floor(J/36)/5,Z=Math.floor(G/6)/5,X=G%6/5}let Q=Math.max(Y,Z,X)*2;if(Q===0)return 30;let U=30+(Math.round(X)<<2|Math.round(Z)<<1|Math.round(Y));if(Q===2)U+=60;return U},enumerable:!1},rgbToAnsi:{value:(J,Y,Z)=>Q$.ansi256ToAnsi(Q$.rgbToAnsi256(J,Y,Z)),enumerable:!1},hexToAnsi:{value:(J)=>Q$.ansi256ToAnsi(Q$.hexToAnsi256(J)),enumerable:!1}}),Q$}var fQ=DQ(),C3=fQ;var f4=new Set(["\x1B","›"]),vQ=39,l6="\x07",I3="[",VQ="]",S3="m",D4=`${VQ}8;;`,R3=($)=>`${f4.values().next().value}${I3}${$}${S3}`,y3=($)=>`${f4.values().next().value}${D4}${$}${l6}`,jQ=($)=>$.split(" ").map((J)=>w8(J)),d6=($,J,Y)=>{let Z=[...J],X=!1,Q=!1,U=w8(u6($.at(-1)));for(let[G,z]of Z.entries()){let K=w8(z);if(U+K<=Y)$[$.length-1]+=z;else $.push(z),U=0;if(f4.has(z))X=!0,Q=Z.slice(G+1,G+1+D4.length).join("")===D4;if(X){if(Q){if(z===l6)X=!1,Q=!1}else if(z===S3)X=!1;continue}if(U+=K,U===Y&&G<Z.length-1)$.push(""),U=0}if(!U&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},hQ=($)=>{let J=$.split(" "),Y=J.length;while(Y>0){if(w8(J[Y-1])>0)break;Y--}if(Y===J.length)return $;return J.slice(0,Y).join(" ")+J.slice(Y).join("")},EQ=($,J,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let Z="",X,Q,U=jQ($),G=[""];for(let[q,N]of $.split(" ").entries()){if(Y.trim!==!1)G[G.length-1]=G.at(-1).trimStart();let _=w8(G.at(-1));if(q!==0){if(_>=J&&(Y.wordWrap===!1||Y.trim===!1))G.push(""),_=0;if(_>0||Y.trim===!1)G[G.length-1]+=" ",_++}if(Y.hard&&U[q]>J){let W=J-_,H=1+Math.floor((U[q]-W-1)/J);if(Math.floor((U[q]-1)/J)<H)G.push("");d6(G,N,J);continue}if(_+U[q]>J&&_>0&&U[q]>0){if(Y.wordWrap===!1&&_<J){d6(G,N,J);continue}G.push("")}if(_+U[q]>J&&Y.wordWrap===!1){d6(G,N,J);continue}G[G.length-1]+=N}if(Y.trim!==!1)G=G.map((q)=>hQ(q));let z=G.join(`
124
- `),K=[...z],O=0;for(let[q,N]of K.entries()){if(Z+=N,f4.has(N)){let{groups:W}=new RegExp(`(?:\\${I3}(?<code>\\d+)m|\\${D4}(?<uri>.*)${l6})`).exec(z.slice(O))||{groups:{}};if(W.code!==void 0){let H=Number.parseFloat(W.code);X=H===vQ?void 0:H}else if(W.uri!==void 0)Q=W.uri.length===0?void 0:W.uri}let _=C3.codes.get(Number(X));if(K[q+1]===`
125
- `){if(Q)Z+=y3("");if(X&&_)Z+=R3(_)}else if(N===`
126
- `){if(X&&_)Z+=R3(X);if(Q)Z+=y3(Q)}O+=N.length}return Z};function r6($,J,Y){return String($).normalize().replaceAll(`\r
123
+ `),T=h6.join(L,`${Q.name}.md`);await O3.promises.writeFile(T,S,"utf-8"),$()}catch(L){console.error("保存配置失败:",L)}}),M=e0(!1,J);if(O0((L,y)=>{if(y.escape)B();else if(y.ctrl&&L==="c"||y.meta&&L==="c")M()},{isActive:Z!=="tools"}),Z==="mode")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(S4,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(L)=>{if(L.value==="ai")W("ai"),X("aiPrompt");else W("manual"),X("name")}},void 0,!1,void 0,this),g(b0,{marginTop:1,children:g(W0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="aiPrompt")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:[g(W0,{color:"green",children:"描述: "},void 0,!1,void 0,this),g(L8,{value:G,onChange:z,onSubmit:(L)=>{if(!L.trim())return;X("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(b0,{children:g(W0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="aiGenerating"){if(q)return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{color:"red",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"yellow",children:[g(OQ,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:['根据你的描述:"',G,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(Z==="name"){let L=_==="edit";return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:["Step 1/7: ",L?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:L?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:[g(W0,{color:"green",children:"名称: "},void 0,!1,void 0,this),L?g(W0,{children:Q.name},void 0,!1,void 0,this):g(L8,{value:Q.name,onChange:(y)=>U({...Q,name:y}),onSubmit:(y)=>{if(WQ(y))return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(b0,{children:g(W0,{dimColor:!0,children:L?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L&&g(L8,{value:"",onChange:()=>{},onSubmit:w,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(Z==="description")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:[g(W0,{color:"green",children:"描述: "},void 0,!1,void 0,this),g(L8,{value:Q.description,onChange:(L)=>U({...Q,description:L}),onSubmit:(L)=>{if(!L.trim())return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(b0,{children:g(W0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="tools")return g(FQ,{config:Q,setConfig:U,onNext:w,onPrev:B},void 0,!1,void 0,this);if(Z==="color")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(S4,{items:HQ,onSelect:(L)=>{let y=L.value==="none"?void 0:L.value;U({...Q,color:y}),w()}},void 0,!1,void 0,this),g(b0,{marginTop:1,children:g(W0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="location")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(S4,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(L)=>{U({...Q,location:L.value}),w()}},void 0,!1,void 0,this),g(b0,{marginTop:1,children:g(W0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="systemPrompt")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:[g(W0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),g(L8,{value:Q.systemPrompt,onChange:(L)=>U({...Q,systemPrompt:L}),onSubmit:()=>w()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(b0,{children:g(W0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="confirm")return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[g(W0,{children:[g(W0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(S4,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(L)=>{if(L.value==="save")F();else if(L.value==="back")B();else J()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function FQ({config:$,setConfig:J,onNext:Y,onPrev:Z}){let{isFocused:X}=qQ({id:"step-tools"});O0((U,G)=>{if(G.escape)Z()},{isActive:X});let Q=(U)=>{if(U.includes("all"))J({...$,tools:["all"]});else J({...$,tools:U});Y()};return g(b0,{flexDirection:"column",paddingY:1,children:[g(b0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(zQ,{options:NQ,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import LQ from"node:fs";import{useMemoizedFn as q2}from"ahooks";import{Box as o0,Text as $$}from"ink";import g6 from"ink-select-input";import{useEffect as BQ,useMemo as H3,useState as k4}from"react";import{jsxDEV as _0}from"react/jsx-dev-runtime";var m6=10;function W3({workspaceRoot:$,initialMode:J="menu",onComplete:Y,onCancel:Z}){let X=F4($),[Q,U]=k4(J),[G,z]=k4(null),[K,O]=k4(0),[q,N]=k4(0),_=q2(()=>{X.clear(),X.loadFromStandardLocations(),O((T)=>T+1)}),W=H3(()=>{return X.getAllSubagents()},[K]),H=Math.ceil(W.length/m6)||1,A=H3(()=>{let T=q*m6;return W.slice(T,T+m6)},[W,q]);BQ(()=>{let T=Math.max(0,H-1);if(q>T)N(T)},[H,q]);let b=q2(()=>{if(q<H-1)N((T)=>T+1)}),w=q2(()=>{if(q>0)N((T)=>T-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=q2((T)=>{if(T.value==="cancel"){Z?.();return}U(T.value)}),F=q2((T)=>{if(z(T.value),Q==="edit")U("editWizard");else if(Q==="delete")U("deleteConfirm")}),M=q2(async()=>{if(!G?.configPath)return;try{await LQ.promises.unlink(G.configPath),_(),L()}catch(T){console.error("删除失败:",T)}}),L=q2(()=>{U("menu"),z(null)}),y=e0(!1,Z);if(O0((T,R)=>{if(R.escape){if(Q==="menu")Z?.();else if(Q==="list"||Q==="edit"||Q==="delete")N(0),L();else if(Q==="deleteConfirm")L()}else if(R.ctrl&&T==="c"||R.meta&&T==="c")y();else if(Q==="list"){if(R.leftArrow||T==="h")w();else if(R.rightArrow||T==="l")b()}},{isActive:Q!=="create"&&Q!=="editWizard"}),Q==="menu")return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(g6,{items:B,onSelect:C},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0($$,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="list"){if(W.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0($$,{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($$,{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($$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),_0($$,{color:"gray",children:[" (共 ",W.length," 个)"]},void 0,!0,void 0,this),H>1&&_0($$,{color:"yellow",children:[" ","第 ",q+1,"/",H," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A.map((T)=>_0(o0,{flexDirection:"column",paddingLeft:2,children:[_0(o0,{children:_0($$,{children:[_0($$,{bold:!0,color:T.color||"white",children:["• ",T.name]},void 0,!0,void 0,this),_0($$,{color:"gray",children:[" - ",T.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),T.tools&&T.tools.length>0&&_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",children:["工具: ",T.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),T.configPath&&_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",dimColor:!0,children:T.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},T.name,!0,void 0,this)),_0(o0,{marginTop:1,paddingLeft:2,children:H>1?_0($$,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):_0($$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let S=(T)=>{if(W.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0($$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let R=W.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($$,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(g6,{items:R,onSelect:F},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0($$,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(Q==="create")return _0(B8,{onComplete:()=>{_(),L()},onCancel:L},void 0,!1,void 0,this);if(Q==="edit")return S("编辑 Agent");if(Q==="editWizard"&&G){let T={name:G.name,description:G.description,tools:G.tools||[],color:G.color,location:G.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:G.systemPrompt||""};return _0(B8,{initialConfig:T,onComplete:()=>{_(),L()},onCancel:L},void 0,!1,void 0,this)}if(Q==="delete")return S("删除 Agent");if(Q==="deleteConfirm"&&G)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{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($$,{children:["你确定要删除 Agent"," ",_0($$,{bold:!0,color:"yellow",children:G.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0($$,{dimColor:!0,children:["文件路径: ",G.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0($$,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(g6,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(T)=>{if(T.value==="confirm")M();else L()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as r2,Text as M0}from"ink";import AQ,{useEffect as bQ,useState as MQ}from"react";import{useEffect as wQ,useState as F3}from"react";function w3($=K$(),J=5000){let[Y,Z]=F3(null),[X,Q]=F3(!0);return wQ(()=>{let U=!0,G=async()=>{try{let K=await L3($);if(!U)return;if(!K){Z(null),Q(!1);return}let O=await B3($);if(!U)return;Z(O)}catch{if(U)Z(null)}finally{if(U)Q(!1)}};G();let z=null;if(J>0)z=setInterval(G,J);return()=>{if(U=!1,z)clearInterval(z)}},[$,J]),{branch:Y,loading:X}}function _2($){let J=Math.max(0,Math.ceil($/1000)),Y=Math.floor(J/60),Z=J%60;return Y>0?`${Y}m ${Z}s`:`${Z}s`}function PQ($,J=Date.now()){let Y=$.snapshot?.nextActionAt;return Y===void 0?void 0:Math.max(0,Y-J)}function D4($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let Z=PQ($,J),X=Z===void 0?void 0:_2(Z);switch(Y.activity){case"admission_wait":{let Q=Y.admission;return{primary:"等待 Provider 容量",secondary:Q?`队列 ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)} · ${Q.scope} · 已等待 ${_2(Q.waitMs)}`:"等待可用请求容量",compact:Q?`Provider 排队 · ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)}`:"Provider 排队"}}case"retry_wait":{let Q=Y.retry,U=Y.reason==="rate_limit"?`Provider 请求受限${X?`,${X} 后重试`:""}`:`Provider 暂时不可用${X?`,${X} 后重试`:""}`,G=Q?[`尝试 ${Q.attempt}/${Q.maxRetries}`,Q.recoveryRemainingMs!==void 0?`剩余预算 ${_2(Q.recoveryRemainingMs)}`:void 0].filter((z)=>z!==void 0):[];return{primary:U,secondary:G.join(" · "),compact:`${Y.reason==="rate_limit"?"Provider 限流":"Provider 恢复"}${X?` · ${X}`:""}${Q?` · ${Q.attempt}/${Q.maxRetries}`:""}`}}case"retry_attempt":{let Q=Y.retry;return{primary:"正在重试 Provider",secondary:Q?`尝试 ${Q.attempt}/${Q.maxRetries}`:"",compact:`Provider 重试${Q?` · ${Q.attempt}/${Q.maxRetries}`:""}`}}case"circuit_open":return{primary:`${Y.reason==="rate_limit"?"Provider 请求受限":"Provider 故障已隔离"},等待恢复探测${X?`(${X})`:""}`,secondary:Y.circuit?.recoveryRemainingMs!==void 0?`剩余预算 ${_2(Y.circuit.recoveryRemainingMs)}`:"",compact:`Provider ${Y.reason==="rate_limit"?"限流":"熔断"}${X?` · ${X}`:""}`};case"circuit_probe":return{primary:"Provider 正在执行恢复探测",secondary:"",compact:"Provider 恢复探测"};case"stream_stall":{let Q=Y.stall;return{primary:Q?.outputStarted?"Provider 流暂时停滞":"Provider 尚未返回流数据",secondary:Q?`已等待 ${_2(Q.durationMs)} · 超时上限 ${_2(Q.timeoutMs)}`:"",compact:Q?`Provider 等待 · ${_2(Q.durationMs)}`:"Provider 等待"}}case"fallback":{let Q=Y.fallback;return{primary:Q?`正在切换到 ${Q.to.model}`:"正在切换模型",secondary:Q?`候选 ${Q.candidate}/${Q.candidateCount} · 来源 ${Q.from.model}`:"",compact:Q?`Provider 切换 · ${Q.to.model}`:"Provider 切换"}}}}import{jsxDEV as Z0,Fragment as h$}from"react/jsx-dev-runtime";function TQ($){return $?`exec-host:${$.category}:${$.consecutiveCount}`:""}function CQ($){if(!$)return"";return`lineage:${$.rootTurnId?.slice(0,8)??"?"}:${$.currentTurnId.slice(0,8)}`}var A3=AQ.memo(()=>{let $=g8(),J=h2(),Z=j2()==="shortcuts",X=zJ(),Q=O1(),{branch:U}=w3(Q),G=m8(),z=JJ(),K=n9(),O=c8(),q=u8(),N=d8(),_=l8(),W=r8(),H=t9(),A=s9(),b=E8(),w=x8(),B=BJ(),C=KJ(),F=h8(),M=V2(),[L,y]=MQ(null),S=D4(b);bQ(()=>{let u=!1;new p6(Q,M).get().then((q0)=>{if(!u)y(q0)}).catch(()=>{if(!u)y(null)});let K0=p6.subscribe((q0)=>{if(!u&&q0.sessionId===M&&q0.workspaceRoot===Q)y(q0.goal)});return()=>{u=!0,K0()}},[M,Q]);let T=G?P4(G):!1,P=(()=>{if(J==="default")return null;if(J==="autoEdit")return Z0(M0,{color:"magenta",children:[">> ","auto edit on ",Z0(M0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return Z0(M0,{color:"cyan",children:["‖ plan mode on ",Z0(M0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return Z0(M0,{color:"red",children:["yolo mode on ",Z0(M0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),j=P!==null,o=[["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 Z0(r2,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[Z?Z0(r2,{flexDirection:"column",gap:0,children:o.map((u,J0)=>Z0(r2,{flexDirection:"row",children:[u.map((K0,q0)=>{let[a,f]=K0.split(":");return Z0(r2,{flexDirection:"row",width:20,children:[Z0(M0,{color:"yellow",children:a},void 0,!1,void 0,this),Z0(M0,{color:"gray",children:":"},void 0,!1,void 0,this),Z0(M0,{color:"white",children:f},void 0,!1,void 0,this)]},q0,!0,void 0,this)}),J0===o.length-1&&Z0(M0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},J0,!0,void 0,this))},void 0,!1,void 0,this):Z0(r2,{flexDirection:"row",gap:1,children:[U&&Z0(h$,{children:[Z0(M0,{color:"gray",children:[" ",U]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P,j&&Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),L&&Z0(h$,{children:[Z0(M0,{color:L.status==="active"?"green":L.status==="verifying"?"cyan":L.status==="blocked"||L.status==="budget_limited"?"yellow":"gray",children:["goal:",L.status," ",L.objective.slice(0,32),L.prematureStop?` recovery:${L.prematureStop.consecutiveCount}`:"",L.verificationStall?` verify-gap:${L.verificationStall.consecutiveCount}`:"",L.frontierStall?` frontier:${L.frontierStall.category}:${L.frontierStall.consecutiveCount}`:"",L.executionHostFailure?` ${TQ(L.executionHostFailure)}`:"",L.turnLineage?` ${CQ(L.turnLineage)}`:""]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z0(r2,{flexDirection:"row",gap:1,children:!$?Z0(M0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):Z0(h$,{children:[T&&Z0(h$,{children:[O?Z0(M0,{color:"cyan",children:["Effort ",q]},void 0,!0,void 0,this):Z0(M0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N!=="auto"&&Z0(h$,{children:[Z0(M0,{color:N==="fast"?"yellow":"gray",children:["Speed ",N]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&Z0(h$,{children:[Z0(M0,{color:"gray",children:["Output ",_]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&Z0(h$,{children:[Z0(M0,{color:"gray",children:["Style ",W]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G&&Z0(M0,{color:"gray",children:G.model},void 0,!1,void 0,this),S&&Z0(h$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"yellow",children:S.compact},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),K?Z0(M0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):Z0(M0,{color:z<20?"red":z<50?"yellow":"gray",children:[z,"%"]},void 0,!0,void 0,this),Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:A===void 0?"gray":"cyan",children:["Cache ",P3(A)]},void 0,!0,void 0,this),H>0.001&&Z0(h$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"green",children:["$",H<0.01?H.toFixed(4):H.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),(w?.pending??0)>0&&Z0(h$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"yellow",children:["Queued ",w?.pending??0," · /queue"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B>0&&Z0(h$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"cyan",children:["已恢复 ",B," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.length>0&&Z0(h$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"cyan",children:["New tasks ",F.length," · /resume"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C==="error"&&Z0(h$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{color:"yellow",children:"Task sync unavailable"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&Z0(h$,{children:[Z0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(M0,{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 x6,Text as c6}from"ink";import RQ from"react";import{jsxDEV as a2}from"react/jsx-dev-runtime";var b3=RQ.memo(({suggestions:$,selectedIndex:J,visible:Y,maxDisplay:Z=8})=>{if(!Y||$.length===0)return null;let X=0,Q=Math.min(Z,$.length),U=J>=$.length;if(J>=Z&&!U)X=J-Z+1,Q=J+1;let G=$.slice(X,Q),z=$.length>Z;return a2(x6,{flexDirection:"column",paddingX:2,paddingY:0,children:[G.map((K,O)=>{let N=X+O===J;return a2(x6,{flexDirection:"row",paddingX:1,gap:2,children:[a2(c6,{color:N?"cyan":"white",bold:N,children:K.command},void 0,!1,void 0,this),a2(c6,{color:N?"cyan":"gray",dimColor:!N,children:["- ",K.description]},void 0,!0,void 0,this)]},K.command,!0,void 0,this)}),z&&a2(x6,{paddingX:1,children:a2(c6,{color:U?"cyan":"gray",bold:U,dimColor:!U,children:["... and ",$.length-Z," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as t$,Text as W1,useStdout as CU}from"ink";import RU from"ink-select-input";import _9,{useMemo as J5}from"react";import{Box as I0,Text as u0}from"ink";import N2,{useEffect as z9,useMemo as O2,useRef as s3}from"react";import{Box as e6,Text as j3}from"ink";import pQ from"react";import{Text as Q1}from"ink";import hQ from"react";import D3 from"string-width";import w8 from"string-width";function u6({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 yQ=u6();function d6($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(yQ,"")}var M3=($=0)=>(J)=>`\x1B[${J+$}m`,T3=($=0)=>(J)=>`\x1B[${38+$};5;${J}m`,C3=($=0)=>(J,Y,Z)=>`\x1B[${38+$};2;${J};${Y};${Z}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]}},wN=Object.keys(Q$.modifier),IQ=Object.keys(Q$.color),SQ=Object.keys(Q$.bgColor),PN=[...IQ,...SQ];function kQ(){let $=new Map;for(let[J,Y]of Object.entries(Q$)){for(let[Z,X]of Object.entries(Y))Q$[Z]={open:`\x1B[${X[0]}m`,close:`\x1B[${X[1]}m`},Y[Z]=Q$[Z],$.set(X[0],X[1]);Object.defineProperty(Q$,J,{value:Y,enumerable:!1})}return Object.defineProperty(Q$,"codes",{value:$,enumerable:!1}),Q$.color.close="\x1B[39m",Q$.bgColor.close="\x1B[49m",Q$.color.ansi=M3(),Q$.color.ansi256=T3(),Q$.color.ansi16m=C3(),Q$.bgColor.ansi=M3(10),Q$.bgColor.ansi256=T3(10),Q$.bgColor.ansi16m=C3(10),Object.defineProperties(Q$,{rgbToAnsi256:{value(J,Y,Z){if(J===Y&&Y===Z){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(Y/255*5)+Math.round(Z/255*5)},enumerable:!1},hexToRgb:{value(J){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(J.toString(16));if(!Y)return[0,0,0];let[Z]=Y;if(Z.length===3)Z=[...Z].map((Q)=>Q+Q).join("");let X=Number.parseInt(Z,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 Y,Z,X;if(J>=232)Y=((J-232)*10+8)/255,Z=Y,X=Y;else{J-=16;let G=J%36;Y=Math.floor(J/36)/5,Z=Math.floor(G/6)/5,X=G%6/5}let Q=Math.max(Y,Z,X)*2;if(Q===0)return 30;let U=30+(Math.round(X)<<2|Math.round(Z)<<1|Math.round(Y));if(Q===2)U+=60;return U},enumerable:!1},rgbToAnsi:{value:(J,Y,Z)=>Q$.ansi256ToAnsi(Q$.rgbToAnsi256(J,Y,Z)),enumerable:!1},hexToAnsi:{value:(J)=>Q$.ansi256ToAnsi(Q$.hexToAnsi256(J)),enumerable:!1}}),Q$}var DQ=kQ(),R3=DQ;var v4=new Set(["\x1B","›"]),fQ=39,r6="\x07",S3="[",vQ="]",k3="m",f4=`${vQ}8;;`,y3=($)=>`${v4.values().next().value}${S3}${$}${k3}`,I3=($)=>`${v4.values().next().value}${f4}${$}${r6}`,VQ=($)=>$.split(" ").map((J)=>w8(J)),l6=($,J,Y)=>{let Z=[...J],X=!1,Q=!1,U=w8(d6($.at(-1)));for(let[G,z]of Z.entries()){let K=w8(z);if(U+K<=Y)$[$.length-1]+=z;else $.push(z),U=0;if(v4.has(z))X=!0,Q=Z.slice(G+1,G+1+f4.length).join("")===f4;if(X){if(Q){if(z===r6)X=!1,Q=!1}else if(z===k3)X=!1;continue}if(U+=K,U===Y&&G<Z.length-1)$.push(""),U=0}if(!U&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},jQ=($)=>{let J=$.split(" "),Y=J.length;while(Y>0){if(w8(J[Y-1])>0)break;Y--}if(Y===J.length)return $;return J.slice(0,Y).join(" ")+J.slice(Y).join("")},EQ=($,J,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let Z="",X,Q,U=VQ($),G=[""];for(let[q,N]of $.split(" ").entries()){if(Y.trim!==!1)G[G.length-1]=G.at(-1).trimStart();let _=w8(G.at(-1));if(q!==0){if(_>=J&&(Y.wordWrap===!1||Y.trim===!1))G.push(""),_=0;if(_>0||Y.trim===!1)G[G.length-1]+=" ",_++}if(Y.hard&&U[q]>J){let W=J-_,H=1+Math.floor((U[q]-W-1)/J);if(Math.floor((U[q]-1)/J)<H)G.push("");l6(G,N,J);continue}if(_+U[q]>J&&_>0&&U[q]>0){if(Y.wordWrap===!1&&_<J){l6(G,N,J);continue}G.push("")}if(_+U[q]>J&&Y.wordWrap===!1){l6(G,N,J);continue}G[G.length-1]+=N}if(Y.trim!==!1)G=G.map((q)=>jQ(q));let z=G.join(`
124
+ `),K=[...z],O=0;for(let[q,N]of K.entries()){if(Z+=N,v4.has(N)){let{groups:W}=new RegExp(`(?:\\${S3}(?<code>\\d+)m|\\${f4}(?<uri>.*)${r6})`).exec(z.slice(O))||{groups:{}};if(W.code!==void 0){let H=Number.parseFloat(W.code);X=H===fQ?void 0:H}else if(W.uri!==void 0)Q=W.uri.length===0?void 0:W.uri}let _=R3.codes.get(Number(X));if(K[q+1]===`
125
+ `){if(Q)Z+=I3("");if(X&&_)Z+=y3(_)}else if(N===`
126
+ `){if(X&&_)Z+=y3(X);if(Q)Z+=I3(Q)}O+=N.length}return Z};function a6($,J,Y){return String($).normalize().replaceAll(`\r
127
127
  `,`
128
128
  `).split(`
129
129
  `).map((Z)=>EQ(Z,J,Y)).join(`
130
- `)}var P8=($)=>{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 k3(J)},D3=($,J,Y="...")=>{if(P8($)<=J)return $;if(J<=Y.length)return Y.substring(0,J);let X=0,Q=$.length,U="";while(X<=Q){let G=Math.floor((X+Q)/2),z=$.substring(0,G);if(P8(z)<=J-Y.length)U=z,X=G+1;else Q=G-1}return U+Y},f3=($)=>{return/[*_~`<[\]https?:]/.test($)},a6=($)=>{let Y=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((Z)=>Z.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((Z)=>k3(Z)))},i2=($,J,Y=!1)=>{if(J<=0)return[$];let Z=$.trimEnd(),Q=r6(Z,J,{hard:Y,trim:!1,wordWrap:!0}).split(`
131
- `).filter((U)=>U.length>0);return Q.length>0?Q:[""]},v3=($,J,Y,Z)=>{let X=Math.max(0,Y-J);if(Z==="center"){let Q=Math.floor(X/2);return" ".repeat(Q)+$+" ".repeat(X-Q)}if(Z==="right")return" ".repeat(X)+$;return $+" ".repeat(X)};import{jsxDEV as n$,Fragment as pQ}from"react/jsx-dev-runtime";var i6=2,o6=1,n6=2;function t6($,J){return`inline-${$}-${J}`}var mQ=({text:$})=>{let J=D0();if(!f3($))return n$(Q1,{children:$},void 0,!1,void 0,this);let Y=[],Z=0,X=0,Q=0,U=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,G;while((G=U.exec($))!==null){if(G.index>Z){let q=$.slice(Z,G.index);Y.push(n$(Q1,{children:q},t6("text",X++),!1,void 0,this))}let z=G[0],K=null,O=t6("match",Q++);try{if(z.startsWith("**")&&z.endsWith("**")&&z.length>i6*2)K=n$(Q1,{bold:!0,children:z.slice(i6,-i6)},O,!1,void 0,this);else if(z.length>o6*2&&(z.startsWith("*")&&z.endsWith("*")||z.startsWith("_")&&z.endsWith("_"))){let q=$.substring(G.index-1,G.index),N=$.substring(U.lastIndex,U.lastIndex+1);if(!(/\w/.test(q)||/\w/.test(N)||/[./\\]/.test(q+N)))K=n$(Q1,{italic:!0,children:z.slice(o6,-o6)},O,!1,void 0,this)}else if(z.startsWith("~~")&&z.endsWith("~~")&&z.length>n6*2)K=n$(Q1,{strikethrough:!0,children:z.slice(n6,-n6)},O,!1,void 0,this);else if(z.startsWith("`")&&z.endsWith("`")){let q=z.match(/^(`+)([^`]+)\1$/);if(q&&q[2])K=n$(Q1,{color:J.colors.syntax.keyword,backgroundColor:J.colors.background.secondary,bold:!0,children:` ${q[2]} `},O,!1,void 0,this)}else if(z.startsWith("[")&&z.includes("](")&&z.endsWith(")")){let q=z.match(/\[(.*?)\]\((.*?)\)/);if(q){let N=q[1],_=q[2];K=n$(Q1,{children:[N,n$(Q1,{color:J.colors.info,children:[" (",_,")"]},void 0,!0,void 0,this)]},O,!0,void 0,this)}}else if(z.match(/^https?:\/\//))K=n$(Q1,{color:J.colors.info,children:z},O,!1,void 0,this)}catch(q){console.error("InlineRenderer 解析错误:",z,q),K=null}Y.push(K??n$(Q1,{children:z},O,!1,void 0,this)),Z=U.lastIndex}if(Z<$.length){let z=$.slice(Z);Y.push(n$(Q1,{children:z},t6("text",X++),!1,void 0,this))}return n$(pQ,{children:Y.filter((z)=>z!==null)},void 0,!1,void 0,this)},U1=gQ.memo(mQ);import{jsxDEV as o2}from"react/jsx-dev-runtime";var cQ="▎",j3=xQ.memo(({lines:$,level:J})=>{let Y=D0(),Z=cQ.repeat(J);return o2(s6,{flexDirection:"column",children:$.map((X,Q)=>{if(X.trim()==="")return o2(s6,{height:1},Q,!1,void 0,this);return o2(s6,{flexDirection:"row",children:[o2(V3,{dimColor:!0,color:Y.colors.text.muted,children:[Z," "]},void 0,!0,void 0,this),o2(V3,{italic:!0,wrap:"wrap",children:o2(U1,{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 V4,Text as S1}from"ink";import{isPlainObject as Y9}from"lodash-es";import{common as sQ,createLowlight as eQ}from"lowlight";import{LRUCache as $U}from"lru-cache";import c3 from"react";import{Box as v4,Text as A8}from"ink";import I1,{Fragment as p3}from"react";import{LRUCache as m3}from"lru-cache";import uQ from"string-width";var dQ=1024,lQ=1048576,h3=1000,E3=new m3({max:dQ,maxSize:lQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+$.length*8)});function e6($){let J=!0;for(let Z=0;Z<$.length;Z++)if($.charCodeAt(Z)>127){J=!1;break}if(J)return $.split("");if($.length<=h3){let Z=E3.get($);if(Z)return Z}let Y=Array.from($);if($.length<=h3)E3.set($,Y);return Y}var rQ=2048,aQ=524288,iQ=4096,g3=new m3({max:rQ,maxSize:aQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+8)});function y1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let J=g3.get($);if(J!==void 0)return J;let Y=uQ($);if($.length<=iQ)g3.set($,Y);return Y}import{jsxDEV as n2}from"react/jsx-dev-runtime";var $9=2,x3=I1.memo(({children:$,maxWidth:J,maxHeight:Y,overflowDirection:Z="top",additionalHiddenLinesCount:X=0})=>{let Q=D0(),U=[],G=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),$9);function z(H){if(!I1.isValidElement(H))return;if(H.type===p3){I1.Children.forEach(H.props.children,z);return}if(H.type===v4){nQ(H,J,U);return}}I1.Children.forEach($,z);let O=U.length>G||X>0?G-1:G,q=O!==void 0?Math.max(0,U.length-O):0,N=q+X,W=(q>0?Z==="top"?U.slice(q):U.slice(0,O):U).map((H,A)=>n2(v4,{children:H.length>0?H.map((b,w)=>n2(A8,{...b.props,children:b.text},w,!1,void 0,this)):n2(A8,{children:" "},void 0,!1,void 0,this)},A,!1,void 0,this));return n2(v4,{flexDirection:"column",width:J,flexShrink:0,children:[N>0&&Z==="top"&&n2(A8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),W,N>0&&Z==="bottom"&&n2(A8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function oQ($){if(!I1.isValidElement($)||$.type!==v4)return{noWrapSegments:[],segments:[]};let J={noWrapSegments:[],segments:[]},Y=!1;function Z(X,Q){if(X===null||X===void 0)return;if(typeof X==="string"||typeof X==="number"){let K=String(X);if(!K)return;let O={text:K,props:Q??{}};if(Q===void 0||Q.wrap==="wrap")Y=!0,J.segments.push(O);else if(!Y)J.noWrapSegments.push(O);else J.segments.push(O);return}if(!I1.isValidElement(X))return;if(X.type===p3){I1.Children.forEach(X.props.children,(K)=>Z(K,Q));return}if(X.type!==A8)return;let{children:U,...G}=X.props,z=Q===void 0?G:{...Q,...G};I1.Children.forEach(U,(K)=>Z(K,z))}return I1.Children.forEach($.props.children,(X)=>Z(X,void 0)),J}function nQ($,J,Y){let Z=oQ($);if(Z.segments.length===0&&Z.noWrapSegments.length===0){Y.push([]);return}let X=0;for(let q of Z.noWrapSegments)X+=y1(q.text);if(Z.segments.length===0){let q=[],N=[];for(let _ of Z.noWrapSegments){let W=_.text.split(`
132
- `);for(let H=0;H<W.length;H++){if(H>0)q.push(N),N=[];if(W[H])N.push({text:W[H],props:_.props})}}if(N.length>0)q.push(N);for(let _ of q)Y.push(_);return}let Q=J-X;if(Q<1){tQ(Z.noWrapSegments,J,Y);return}let U=[],G=[],z=0;function K(){if(U.length===0)U.push([...Z.noWrapSegments,...G]);else if(X>0)U.push([{text:" ".repeat(X),props:{}},...G]);else U.push(G);G=[],z=0}function O(q,N){if(G.length>0&&G[G.length-1].props===N)G[G.length-1].text+=q;else G.push({text:q,props:N})}for(let q of Z.segments){let N=q.text.split(`
133
- `);for(let _=0;_<N.length;_++){if(_>0)K();let H=N[_].split(/(\s+)/);for(let A of H){if(!A)continue;let b=y1(A);if(z+b>Q&&z>0){if(K(),/^\s+$/.test(A))continue}if(b>Q){let B=e6(A);while(B.length>0){let C=0,F=0;for(let M of B){let L=y1(M);if(z+F+L>Q)break;F+=L,C++}if(C>0){let M=B.slice(0,C).join("");O(M,q.props),z+=y1(M),B=B.slice(C)}if(B.length>0)K()}}else O(A,q.props),z+=b}}if(q.text.endsWith(`
134
- `))K()}if(G.length>0)K();for(let q of U)Y.push(q)}function tQ($,J,Y){let Z=[],X=[],Q=0;for(let U of $){let G=U.text.split(`
135
- `);for(let z=0;z<G.length;z++){if(z>0)Z.push(X),X=[],Q=0;let K=G[z];if(!K)continue;let O=y1(K),q=Math.max(0,J-y1("…"));if(O<=q&&Q===0)X.push({text:K,props:U.props}),Q+=O;else{let N=e6(K),_=Q,W=0;for(let A of N){let b=y1(A);if(_+b>q)break;_+=b,W++}let H=N.slice(0,W).join("");if(H)X.push({text:H,props:U.props});X.push({text:"…",props:{}}),Q=_+y1("…")}}}if(X.length>0)Z.push(X);if(Z.length===0)Z.push([{text:"…",props:{}}]);for(let U of Z)Y.push(U)}import{jsxDEV as k$}from"react/jsx-dev-runtime";var J9=eQ(sQ),JU=200,YU=524288,XU=4096,u3=new $U({max:JU,maxSize:YU,sizeCalculation:($)=>$.retainedChars});function d3($,J){return`${J??"__auto__"}\x00${$}`}function ZU($,J){return u3.get(d3($,J))?.root}function QU($,J,Y){if($.length>XU)return;let Z=J?.length??0;u3.set(d3($,J),{root:Y,retainedChars:Math.max(1,$.length*2+Z)})}function UU($){return Y9($)&&$.type==="text"&&typeof $.value==="string"}function GU($){return Y9($)&&$.type==="element"}function KU($){return Y9($)&&$.type==="root"&&Array.isArray($.children)}function j4($,J,Y=0){if(UU($))return k$(S1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(GU($)){let Z=$.properties?.className?.[0]||"",X=J.default;if(Z.includes("comment"))X=J.comment;else if(Z.includes("string"))X=J.string;else if(Z.includes("number"))X=J.number;else if(Z.includes("keyword"))X=J.keyword;else if(Z.includes("function"))X=J.function;else if(Z.includes("variable"))X=J.variable;else if(Z.includes("operator"))X=J.operator;else if(Z.includes("type"))X=J.type;else if(Z.includes("tag"))X=J.tag;else if(Z.includes("attr"))X=J.attr;let Q=$.children?.map((U,G)=>j4(U,J,G));return k$(S1,{color:X,wrap:"wrap",children:Q},Y,!1,void 0,this)}if(KU($))return k$(c3.Fragment,{children:$.children.map((Z,X)=>j4(Z,J,X))},Y,!1,void 0,this);return k$(S1,{},Y,!1,void 0,this)}function zU($,J,Y){let Z=Y||L$.getTheme().colors.syntax;try{let X=ZU($,J);if(X)return j4(X,Z);let Q;if(!J||!J9.registered(J))Q=J9.highlightAuto($);else Q=J9.highlight(J,$);let U=Q;if(!U.children||U.children.length===0)return k$(S1,{color:Z.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return QU($,J,Q),j4(Q,Z)}catch(X){return k$(S1,{color:Z.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var h4=c3.memo(({content:$,language:J,showLineNumbers:Y=!0,terminalWidth:Z,availableHeight:X})=>{let Q=D0(),U=$.split(`
136
- `),G=0;if(X&&U.length>X){let q=Math.max(X,$9);if(U.length>q)G=U.length-q,U=U.slice(G)}let z=U.length+G,K=String(z).length+1,O=Math.max(20,Z-4);return k$(V4,{borderStyle:"round",borderColor:Q.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[J&&k$(V4,{marginBottom:0,children:k$(S1,{color:Q.colors.text.secondary,children:J},void 0,!1,void 0,this)},void 0,!1,void 0,this),G>0&&k$(V4,{marginBottom:0,children:k$(S1,{color:Q.colors.text.muted,dimColor:!0,children:["... ",G," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),k$(x3,{maxWidth:O,maxHeight:X,children:U.map((q,N)=>{let _=N+G+1;return k$(V4,{flexDirection:"row",children:[Y&&k$(S1,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(_).padStart(K-1," ")," "]},void 0,!0,void 0,this),q.trim()===""?k$(S1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):zU(q,J,Q.colors.syntax)]},N,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as l3,Text as x$}from"ink";import qU,{useState as _U}from"react";import{jsxDEV as D$}from"react/jsx-dev-runtime";var r3=400;function OU($){let J=$.split(`
137
- `),Y=[],Z=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)Z=parseInt(U[1],10),X=parseInt(U[3],10);Y.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Y.push({type:"remove",content:Q.substring(1),lineNumber:Z}),Z++;continue}if(Q.startsWith("+")){Y.push({type:"add",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith(" ")||Q===""){Y.push({type:"context",content:Q.substring(1),lineNumber:X}),Z++,X++;continue}}return Y}var X9=qU.memo(({patch:$,startLine:J,matchLine:Y,terminalWidth:Z,maxLines:X=20,isFocused:Q=!1})=>{let U=D0(),G=OU($),[z,K]=_U(!1);O0((w)=>{if(w.toLowerCase()==="e")K((B)=>!B)},{isActive:Q&&G.length>X});let q=Math.max(...G.map((w)=>w.lineNumber||0)).toString().length+1,N=G.filter((w)=>w.type==="add").length,_=G.filter((w)=>w.type==="remove").length,W=G.length,H=W>X,A;if(!H)A=G;else if(z)A=G.slice(0,r3);else A=G.slice(0,X);let b=W-A.length;return D$(l3,{flexDirection:"column",marginTop:1,marginBottom:1,children:[D$(x$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Z)))},void 0,!1,void 0,this),H&&D$(x$,{color:U.colors.info,children:[z?`已展开 ${A.length}/${W} 行`:`显示前 ${X} 行,共 ${W} 行`," · ",D$(x$,{color:U.colors.success,children:["+",N]},void 0,!0,void 0,this)," ",D$(x$,{color:U.colors.error,children:["-",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H&&D$(x$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Z)))},void 0,!1,void 0,this),A.map((w,B)=>{if(w.type==="header")return D$(x$,{color:U.colors.muted,dimColor:!0,children:w.content},B,!1,void 0,this);let C=w.lineNumber?w.lineNumber.toString().padStart(q," "):" ".repeat(q),F=" ",M,L;if(w.type==="add")F="+",L=U.colors.success,M=void 0;else if(w.type==="remove")F="-",L=U.colors.error,M=void 0;else L=U.colors.text.primary;let y=Math.max(0,Z-q-2),S=w.content;if(S.length>y)S=S.substring(0,y-3)+"...";return D$(x$,{color:L,backgroundColor:M,children:[D$(x$,{dimColor:!0,children:C},void 0,!1,void 0,this),D$(x$,{children:F},void 0,!1,void 0,this),D$(x$,{children:[" ",S]},void 0,!0,void 0,this)]},B,!0,void 0,this)}),H&&D$(l3,{marginTop:1,children:z?D$(x$,{color:U.colors.info,dimColor:!0,children:[b>0?`已达显示上限 ${r3} 行,仍有 ${b} 行未显示`:"已显示全部内容",Q?" · 按 E 折叠":""]},void 0,!0,void 0,this):D$(x$,{color:U.colors.info,dimColor:!0,children:["已隐藏剩余 ",b," 行",Q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D$(x$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Z)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as Z9,Text as a3}from"ink";import NU from"react";import{jsxDEV as t2}from"react/jsx-dev-runtime";var HU=({itemText:$,type:J,marker:Y,leadingWhitespace:Z=""})=>{let X=J==="ol"?`${Y}. `:`${Y} `,Q=X.length,U=Z.length;return t2(Z9,{paddingLeft:U+1,flexDirection:"row",children:[t2(Z9,{width:Q,children:t2(a3,{children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),t2(Z9,{flexGrow:1,children:t2(a3,{wrap:"wrap",children:t2(U1,{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)},Q9=NU.memo(HU);import{Text as U9}from"ink";import WU,{useMemo as FU}from"react";import i3 from"string-width";import{jsxDEV as G9}from"react/jsx-dev-runtime";var o3=4,s2=3,LU=4,n3=WU.memo(({headers:$,rows:J,terminalWidth:Y})=>{let Z=D0(),X=FU(()=>{if($.length===0||J.length===0)return null;let q=$.length,N=$.map((L,y)=>{let S=Math.max(a6(L),s2);for(let T of J)S=Math.max(S,a6(T[y]||""));return S}),_=$.map((L,y)=>{let S=Math.max(P8(L),s2);for(let T of J)S=Math.max(S,P8(T[y]||""));return S}),W=1+q*3,H=Math.max(Y-W-o3,q*s2),A=N.reduce((L,y)=>L+y,0),b=_.reduce((L,y)=>L+y,0),w=!1,B;if(b<=H)B=_;else if(A<=H){let L=H-A,y=_.map((T,R)=>T-N[R]),S=y.reduce((T,R)=>T+R,0);B=N.map((T,R)=>{if(S===0)return T;let P=Math.floor(y[R]/S*L);return T+P})}else{w=!0;let L=H/A;B=N.map((y)=>Math.max(Math.floor(y*L),s2))}function C(){let L=1;for(let y=0;y<$.length;y++){let S=i2($[y],B[y],w);L=Math.max(L,S.length)}for(let y of J)for(let S=0;S<y.length;S++){let T=i2(y[S]||"",B[S],w);L=Math.max(L,T.length)}return L}if(C()>LU)return{type:"vertical",columnWidths:B,needsHardWrap:w};return{type:"horizontal",columnWidths:B,needsHardWrap:w}},[$,J,Y]);if(!X)return null;if(X.type==="vertical"){let q=Math.min(Y-1,40),N="─".repeat(q);return G9(U9,{children:J.map((_,W)=>{let H=[];if(W>0)H.push(N);return _.forEach((A,b)=>{let w=$[b]||`Column ${b+1}`,B=(A||"").replace(/\n+/g," ").trim();H.push(`\x1B[1m${w}:\x1B[22m ${B}`)}),H.join(`
130
+ `)}var P8=($)=>{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 D3(J)},f3=($,J,Y="...")=>{if(P8($)<=J)return $;if(J<=Y.length)return Y.substring(0,J);let X=0,Q=$.length,U="";while(X<=Q){let G=Math.floor((X+Q)/2),z=$.substring(0,G);if(P8(z)<=J-Y.length)U=z,X=G+1;else Q=G-1}return U+Y},v3=($)=>{return/[*_~`<[\]https?:]/.test($)},i6=($)=>{let Y=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((Z)=>Z.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((Z)=>D3(Z)))},i2=($,J,Y=!1)=>{if(J<=0)return[$];let Z=$.trimEnd(),Q=a6(Z,J,{hard:Y,trim:!1,wordWrap:!0}).split(`
131
+ `).filter((U)=>U.length>0);return Q.length>0?Q:[""]},V3=($,J,Y,Z)=>{let X=Math.max(0,Y-J);if(Z==="center"){let Q=Math.floor(X/2);return" ".repeat(Q)+$+" ".repeat(X-Q)}if(Z==="right")return" ".repeat(X)+$;return $+" ".repeat(X)};import{jsxDEV as n$,Fragment as mQ}from"react/jsx-dev-runtime";var o6=2,n6=1,t6=2;function s6($,J){return`inline-${$}-${J}`}var gQ=({text:$})=>{let J=D0();if(!v3($))return n$(Q1,{children:$},void 0,!1,void 0,this);let Y=[],Z=0,X=0,Q=0,U=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,G;while((G=U.exec($))!==null){if(G.index>Z){let q=$.slice(Z,G.index);Y.push(n$(Q1,{children:q},s6("text",X++),!1,void 0,this))}let z=G[0],K=null,O=s6("match",Q++);try{if(z.startsWith("**")&&z.endsWith("**")&&z.length>o6*2)K=n$(Q1,{bold:!0,children:z.slice(o6,-o6)},O,!1,void 0,this);else if(z.length>n6*2&&(z.startsWith("*")&&z.endsWith("*")||z.startsWith("_")&&z.endsWith("_"))){let q=$.substring(G.index-1,G.index),N=$.substring(U.lastIndex,U.lastIndex+1);if(!(/\w/.test(q)||/\w/.test(N)||/[./\\]/.test(q+N)))K=n$(Q1,{italic:!0,children:z.slice(n6,-n6)},O,!1,void 0,this)}else if(z.startsWith("~~")&&z.endsWith("~~")&&z.length>t6*2)K=n$(Q1,{strikethrough:!0,children:z.slice(t6,-t6)},O,!1,void 0,this);else if(z.startsWith("`")&&z.endsWith("`")){let q=z.match(/^(`+)([^`]+)\1$/);if(q&&q[2])K=n$(Q1,{color:J.colors.syntax.keyword,backgroundColor:J.colors.background.secondary,bold:!0,children:` ${q[2]} `},O,!1,void 0,this)}else if(z.startsWith("[")&&z.includes("](")&&z.endsWith(")")){let q=z.match(/\[(.*?)\]\((.*?)\)/);if(q){let N=q[1],_=q[2];K=n$(Q1,{children:[N,n$(Q1,{color:J.colors.info,children:[" (",_,")"]},void 0,!0,void 0,this)]},O,!0,void 0,this)}}else if(z.match(/^https?:\/\//))K=n$(Q1,{color:J.colors.info,children:z},O,!1,void 0,this)}catch(q){console.error("InlineRenderer 解析错误:",z,q),K=null}Y.push(K??n$(Q1,{children:z},O,!1,void 0,this)),Z=U.lastIndex}if(Z<$.length){let z=$.slice(Z);Y.push(n$(Q1,{children:z},s6("text",X++),!1,void 0,this))}return n$(mQ,{children:Y.filter((z)=>z!==null)},void 0,!1,void 0,this)},U1=hQ.memo(gQ);import{jsxDEV as o2}from"react/jsx-dev-runtime";var xQ="▎",E3=pQ.memo(({lines:$,level:J})=>{let Y=D0(),Z=xQ.repeat(J);return o2(e6,{flexDirection:"column",children:$.map((X,Q)=>{if(X.trim()==="")return o2(e6,{height:1},Q,!1,void 0,this);return o2(e6,{flexDirection:"row",children:[o2(j3,{dimColor:!0,color:Y.colors.text.muted,children:[Z," "]},void 0,!0,void 0,this),o2(j3,{italic:!0,wrap:"wrap",children:o2(U1,{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 j4,Text as S1}from"ink";import{isPlainObject as X9}from"lodash-es";import{common as tQ,createLowlight as sQ}from"lowlight";import{LRUCache as eQ}from"lru-cache";import u3 from"react";import{Box as V4,Text as A8}from"ink";import I1,{Fragment as x3}from"react";import{LRUCache as p3}from"lru-cache";import cQ from"string-width";var uQ=1024,dQ=1048576,h3=1000,g3=new p3({max:uQ,maxSize:dQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+$.length*8)});function $9($){let J=!0;for(let Z=0;Z<$.length;Z++)if($.charCodeAt(Z)>127){J=!1;break}if(J)return $.split("");if($.length<=h3){let Z=g3.get($);if(Z)return Z}let Y=Array.from($);if($.length<=h3)g3.set($,Y);return Y}var lQ=2048,rQ=524288,aQ=4096,m3=new p3({max:lQ,maxSize:rQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+8)});function y1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let J=m3.get($);if(J!==void 0)return J;let Y=cQ($);if($.length<=aQ)m3.set($,Y);return Y}import{jsxDEV as n2}from"react/jsx-dev-runtime";var J9=2,c3=I1.memo(({children:$,maxWidth:J,maxHeight:Y,overflowDirection:Z="top",additionalHiddenLinesCount:X=0})=>{let Q=D0(),U=[],G=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),J9);function z(H){if(!I1.isValidElement(H))return;if(H.type===x3){I1.Children.forEach(H.props.children,z);return}if(H.type===V4){oQ(H,J,U);return}}I1.Children.forEach($,z);let O=U.length>G||X>0?G-1:G,q=O!==void 0?Math.max(0,U.length-O):0,N=q+X,W=(q>0?Z==="top"?U.slice(q):U.slice(0,O):U).map((H,A)=>n2(V4,{children:H.length>0?H.map((b,w)=>n2(A8,{...b.props,children:b.text},w,!1,void 0,this)):n2(A8,{children:" "},void 0,!1,void 0,this)},A,!1,void 0,this));return n2(V4,{flexDirection:"column",width:J,flexShrink:0,children:[N>0&&Z==="top"&&n2(A8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),W,N>0&&Z==="bottom"&&n2(A8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function iQ($){if(!I1.isValidElement($)||$.type!==V4)return{noWrapSegments:[],segments:[]};let J={noWrapSegments:[],segments:[]},Y=!1;function Z(X,Q){if(X===null||X===void 0)return;if(typeof X==="string"||typeof X==="number"){let K=String(X);if(!K)return;let O={text:K,props:Q??{}};if(Q===void 0||Q.wrap==="wrap")Y=!0,J.segments.push(O);else if(!Y)J.noWrapSegments.push(O);else J.segments.push(O);return}if(!I1.isValidElement(X))return;if(X.type===x3){I1.Children.forEach(X.props.children,(K)=>Z(K,Q));return}if(X.type!==A8)return;let{children:U,...G}=X.props,z=Q===void 0?G:{...Q,...G};I1.Children.forEach(U,(K)=>Z(K,z))}return I1.Children.forEach($.props.children,(X)=>Z(X,void 0)),J}function oQ($,J,Y){let Z=iQ($);if(Z.segments.length===0&&Z.noWrapSegments.length===0){Y.push([]);return}let X=0;for(let q of Z.noWrapSegments)X+=y1(q.text);if(Z.segments.length===0){let q=[],N=[];for(let _ of Z.noWrapSegments){let W=_.text.split(`
132
+ `);for(let H=0;H<W.length;H++){if(H>0)q.push(N),N=[];if(W[H])N.push({text:W[H],props:_.props})}}if(N.length>0)q.push(N);for(let _ of q)Y.push(_);return}let Q=J-X;if(Q<1){nQ(Z.noWrapSegments,J,Y);return}let U=[],G=[],z=0;function K(){if(U.length===0)U.push([...Z.noWrapSegments,...G]);else if(X>0)U.push([{text:" ".repeat(X),props:{}},...G]);else U.push(G);G=[],z=0}function O(q,N){if(G.length>0&&G[G.length-1].props===N)G[G.length-1].text+=q;else G.push({text:q,props:N})}for(let q of Z.segments){let N=q.text.split(`
133
+ `);for(let _=0;_<N.length;_++){if(_>0)K();let H=N[_].split(/(\s+)/);for(let A of H){if(!A)continue;let b=y1(A);if(z+b>Q&&z>0){if(K(),/^\s+$/.test(A))continue}if(b>Q){let B=$9(A);while(B.length>0){let C=0,F=0;for(let M of B){let L=y1(M);if(z+F+L>Q)break;F+=L,C++}if(C>0){let M=B.slice(0,C).join("");O(M,q.props),z+=y1(M),B=B.slice(C)}if(B.length>0)K()}}else O(A,q.props),z+=b}}if(q.text.endsWith(`
134
+ `))K()}if(G.length>0)K();for(let q of U)Y.push(q)}function nQ($,J,Y){let Z=[],X=[],Q=0;for(let U of $){let G=U.text.split(`
135
+ `);for(let z=0;z<G.length;z++){if(z>0)Z.push(X),X=[],Q=0;let K=G[z];if(!K)continue;let O=y1(K),q=Math.max(0,J-y1("…"));if(O<=q&&Q===0)X.push({text:K,props:U.props}),Q+=O;else{let N=$9(K),_=Q,W=0;for(let A of N){let b=y1(A);if(_+b>q)break;_+=b,W++}let H=N.slice(0,W).join("");if(H)X.push({text:H,props:U.props});X.push({text:"…",props:{}}),Q=_+y1("…")}}}if(X.length>0)Z.push(X);if(Z.length===0)Z.push([{text:"…",props:{}}]);for(let U of Z)Y.push(U)}import{jsxDEV as k$}from"react/jsx-dev-runtime";var Y9=sQ(tQ),$U=200,JU=524288,YU=4096,d3=new eQ({max:$U,maxSize:JU,sizeCalculation:($)=>$.retainedChars});function l3($,J){return`${J??"__auto__"}\x00${$}`}function XU($,J){return d3.get(l3($,J))?.root}function ZU($,J,Y){if($.length>YU)return;let Z=J?.length??0;d3.set(l3($,J),{root:Y,retainedChars:Math.max(1,$.length*2+Z)})}function QU($){return X9($)&&$.type==="text"&&typeof $.value==="string"}function UU($){return X9($)&&$.type==="element"}function GU($){return X9($)&&$.type==="root"&&Array.isArray($.children)}function E4($,J,Y=0){if(QU($))return k$(S1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(UU($)){let Z=$.properties?.className?.[0]||"",X=J.default;if(Z.includes("comment"))X=J.comment;else if(Z.includes("string"))X=J.string;else if(Z.includes("number"))X=J.number;else if(Z.includes("keyword"))X=J.keyword;else if(Z.includes("function"))X=J.function;else if(Z.includes("variable"))X=J.variable;else if(Z.includes("operator"))X=J.operator;else if(Z.includes("type"))X=J.type;else if(Z.includes("tag"))X=J.tag;else if(Z.includes("attr"))X=J.attr;let Q=$.children?.map((U,G)=>E4(U,J,G));return k$(S1,{color:X,wrap:"wrap",children:Q},Y,!1,void 0,this)}if(GU($))return k$(u3.Fragment,{children:$.children.map((Z,X)=>E4(Z,J,X))},Y,!1,void 0,this);return k$(S1,{},Y,!1,void 0,this)}function KU($,J,Y){let Z=Y||L$.getTheme().colors.syntax;try{let X=XU($,J);if(X)return E4(X,Z);let Q;if(!J||!Y9.registered(J))Q=Y9.highlightAuto($);else Q=Y9.highlight(J,$);let U=Q;if(!U.children||U.children.length===0)return k$(S1,{color:Z.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return ZU($,J,Q),E4(Q,Z)}catch(X){return k$(S1,{color:Z.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var h4=u3.memo(({content:$,language:J,showLineNumbers:Y=!0,terminalWidth:Z,availableHeight:X})=>{let Q=D0(),U=$.split(`
136
+ `),G=0;if(X&&U.length>X){let q=Math.max(X,J9);if(U.length>q)G=U.length-q,U=U.slice(G)}let z=U.length+G,K=String(z).length+1,O=Math.max(20,Z-4);return k$(j4,{borderStyle:"round",borderColor:Q.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[J&&k$(j4,{marginBottom:0,children:k$(S1,{color:Q.colors.text.secondary,children:J},void 0,!1,void 0,this)},void 0,!1,void 0,this),G>0&&k$(j4,{marginBottom:0,children:k$(S1,{color:Q.colors.text.muted,dimColor:!0,children:["... ",G," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),k$(c3,{maxWidth:O,maxHeight:X,children:U.map((q,N)=>{let _=N+G+1;return k$(j4,{flexDirection:"row",children:[Y&&k$(S1,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(_).padStart(K-1," ")," "]},void 0,!0,void 0,this),q.trim()===""?k$(S1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):KU(q,J,Q.colors.syntax)]},N,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as r3,Text as x$}from"ink";import zU,{useState as qU}from"react";import{jsxDEV as D$}from"react/jsx-dev-runtime";var a3=400;function _U($){let J=$.split(`
137
+ `),Y=[],Z=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)Z=parseInt(U[1],10),X=parseInt(U[3],10);Y.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Y.push({type:"remove",content:Q.substring(1),lineNumber:Z}),Z++;continue}if(Q.startsWith("+")){Y.push({type:"add",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith(" ")||Q===""){Y.push({type:"context",content:Q.substring(1),lineNumber:X}),Z++,X++;continue}}return Y}var Z9=zU.memo(({patch:$,startLine:J,matchLine:Y,terminalWidth:Z,maxLines:X=20,isFocused:Q=!1})=>{let U=D0(),G=_U($),[z,K]=qU(!1);O0((w)=>{if(w.toLowerCase()==="e")K((B)=>!B)},{isActive:Q&&G.length>X});let q=Math.max(...G.map((w)=>w.lineNumber||0)).toString().length+1,N=G.filter((w)=>w.type==="add").length,_=G.filter((w)=>w.type==="remove").length,W=G.length,H=W>X,A;if(!H)A=G;else if(z)A=G.slice(0,a3);else A=G.slice(0,X);let b=W-A.length;return D$(r3,{flexDirection:"column",marginTop:1,marginBottom:1,children:[D$(x$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Z)))},void 0,!1,void 0,this),H&&D$(x$,{color:U.colors.info,children:[z?`已展开 ${A.length}/${W} 行`:`显示前 ${X} 行,共 ${W} 行`," · ",D$(x$,{color:U.colors.success,children:["+",N]},void 0,!0,void 0,this)," ",D$(x$,{color:U.colors.error,children:["-",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H&&D$(x$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Z)))},void 0,!1,void 0,this),A.map((w,B)=>{if(w.type==="header")return D$(x$,{color:U.colors.muted,dimColor:!0,children:w.content},B,!1,void 0,this);let C=w.lineNumber?w.lineNumber.toString().padStart(q," "):" ".repeat(q),F=" ",M,L;if(w.type==="add")F="+",L=U.colors.success,M=void 0;else if(w.type==="remove")F="-",L=U.colors.error,M=void 0;else L=U.colors.text.primary;let y=Math.max(0,Z-q-2),S=w.content;if(S.length>y)S=S.substring(0,y-3)+"...";return D$(x$,{color:L,backgroundColor:M,children:[D$(x$,{dimColor:!0,children:C},void 0,!1,void 0,this),D$(x$,{children:F},void 0,!1,void 0,this),D$(x$,{children:[" ",S]},void 0,!0,void 0,this)]},B,!0,void 0,this)}),H&&D$(r3,{marginTop:1,children:z?D$(x$,{color:U.colors.info,dimColor:!0,children:[b>0?`已达显示上限 ${a3} 行,仍有 ${b} 行未显示`:"已显示全部内容",Q?" · 按 E 折叠":""]},void 0,!0,void 0,this):D$(x$,{color:U.colors.info,dimColor:!0,children:["已隐藏剩余 ",b," 行",Q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D$(x$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Z)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as Q9,Text as i3}from"ink";import OU from"react";import{jsxDEV as t2}from"react/jsx-dev-runtime";var NU=({itemText:$,type:J,marker:Y,leadingWhitespace:Z=""})=>{let X=J==="ol"?`${Y}. `:`${Y} `,Q=X.length,U=Z.length;return t2(Q9,{paddingLeft:U+1,flexDirection:"row",children:[t2(Q9,{width:Q,children:t2(i3,{children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),t2(Q9,{flexGrow:1,children:t2(i3,{wrap:"wrap",children:t2(U1,{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)},U9=OU.memo(NU);import{Text as G9}from"ink";import HU,{useMemo as WU}from"react";import o3 from"string-width";import{jsxDEV as K9}from"react/jsx-dev-runtime";var n3=4,s2=3,FU=4,t3=HU.memo(({headers:$,rows:J,terminalWidth:Y})=>{let Z=D0(),X=WU(()=>{if($.length===0||J.length===0)return null;let q=$.length,N=$.map((L,y)=>{let S=Math.max(i6(L),s2);for(let T of J)S=Math.max(S,i6(T[y]||""));return S}),_=$.map((L,y)=>{let S=Math.max(P8(L),s2);for(let T of J)S=Math.max(S,P8(T[y]||""));return S}),W=1+q*3,H=Math.max(Y-W-n3,q*s2),A=N.reduce((L,y)=>L+y,0),b=_.reduce((L,y)=>L+y,0),w=!1,B;if(b<=H)B=_;else if(A<=H){let L=H-A,y=_.map((T,R)=>T-N[R]),S=y.reduce((T,R)=>T+R,0);B=N.map((T,R)=>{if(S===0)return T;let P=Math.floor(y[R]/S*L);return T+P})}else{w=!0;let L=H/A;B=N.map((y)=>Math.max(Math.floor(y*L),s2))}function C(){let L=1;for(let y=0;y<$.length;y++){let S=i2($[y],B[y],w);L=Math.max(L,S.length)}for(let y of J)for(let S=0;S<y.length;S++){let T=i2(y[S]||"",B[S],w);L=Math.max(L,T.length)}return L}if(C()>FU)return{type:"vertical",columnWidths:B,needsHardWrap:w};return{type:"horizontal",columnWidths:B,needsHardWrap:w}},[$,J,Y]);if(!X)return null;if(X.type==="vertical"){let q=Math.min(Y-1,40),N="─".repeat(q);return K9(G9,{children:J.map((_,W)=>{let H=[];if(W>0)H.push(N);return _.forEach((A,b)=>{let w=$[b]||`Column ${b+1}`,B=(A||"").replace(/\n+/g," ").trim();H.push(`\x1B[1m${w}:\x1B[22m ${B}`)}),H.join(`
138
138
  `)}).join(`
139
- `)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:U}=X;function G(q){let _={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[q],W=_.left;return Q.forEach((H,A)=>{W+=_.h.repeat(H+2),W+=A<Q.length-1?_.mid:_.right}),W}function z(q,N){let _=q.map((b,w)=>{let B=Q[w]||s2;return i2(b||"",B,U)}),W=Math.max(..._.map((b)=>b.length),1),H=_.map((b)=>Math.floor((W-b.length)/2)),A=[];for(let b=0;b<W;b++){let w="│";for(let B=0;B<q.length;B++){let C=_[B],F=H[B],M=b-F,L=M>=0&&M<C.length?C[M]:"",y=Q[B]||s2,S=i3(L),T=v3(N?`\x1B[1m${L}\x1B[22m`:L,S,y,N?"center":"left");w+=` ${T} │`}A.push(w)}return A}let K=[];if(K.push(G("top")),K.push(...z($,!0)),K.push(G("middle")),J.forEach((q,N)=>{if(K.push(...z(q,!1)),N<J.length-1)K.push(G("middle"))}),K.push(G("bottom")),Math.max(...K.map((q)=>i3(q)))>Y-o3){let q=Math.min(Y-1,40),N="─".repeat(q);return G9(U9,{children:J.map((_,W)=>{let H=[];if(W>0)H.push(N);return _.forEach((A,b)=>{let w=$[b]||`Column ${b+1}`,B=(A||"").replace(/\n+/g," ").trim();H.push(`\x1B[1m${w}:\x1B[22m ${B}`)}),H.join(`
139
+ `)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:U}=X;function G(q){let _={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[q],W=_.left;return Q.forEach((H,A)=>{W+=_.h.repeat(H+2),W+=A<Q.length-1?_.mid:_.right}),W}function z(q,N){let _=q.map((b,w)=>{let B=Q[w]||s2;return i2(b||"",B,U)}),W=Math.max(..._.map((b)=>b.length),1),H=_.map((b)=>Math.floor((W-b.length)/2)),A=[];for(let b=0;b<W;b++){let w="│";for(let B=0;B<q.length;B++){let C=_[B],F=H[B],M=b-F,L=M>=0&&M<C.length?C[M]:"",y=Q[B]||s2,S=o3(L),T=V3(N?`\x1B[1m${L}\x1B[22m`:L,S,y,N?"center":"left");w+=` ${T} │`}A.push(w)}return A}let K=[];if(K.push(G("top")),K.push(...z($,!0)),K.push(G("middle")),J.forEach((q,N)=>{if(K.push(...z(q,!1)),N<J.length-1)K.push(G("middle"))}),K.push(G("bottom")),Math.max(...K.map((q)=>o3(q)))>Y-n3){let q=Math.min(Y-1,40),N="─".repeat(q);return K9(G9,{children:J.map((_,W)=>{let H=[];if(W>0)H.push(N);return _.forEach((A,b)=>{let w=$[b]||`Column ${b+1}`,B=(A||"").replace(/\n+/g," ").trim();H.push(`\x1B[1m${w}:\x1B[22m ${B}`)}),H.join(`
140
140
  `)}).join(`
141
- `)},void 0,!1,void 0,this)}return G9(U9,{color:Z.colors.text.primary,children:K.join(`
142
- `)},void 0,!1,void 0,this)});import{jsxDEV as d}from"react/jsx-dev-runtime";var BU=($,J,Y)=>{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 Z=Y&&"phase"in Y?Y.phase:void 0;return{color:J.text.secondary,prefix:Z==="start"?"• ":Z==="complete"?" └ ":" "}}default:return{color:J.text.primary,prefix:" "}}},wU=N2.memo(({content:$,language:J,terminalWidth:Y,isPending:Z=!1,availableHeight:X})=>{let Q=D0();if(Z&&X!==void 0){let U=$.split(`
141
+ `)},void 0,!1,void 0,this)}return K9(G9,{color:Z.colors.text.primary,children:K.join(`
142
+ `)},void 0,!1,void 0,this)});import{jsxDEV as d}from"react/jsx-dev-runtime";var LU=($,J,Y)=>{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 Z=Y&&"phase"in Y?Y.phase:void 0;return{color:J.text.secondary,prefix:Z==="start"?"• ":Z==="complete"?" └ ":" "}}default:return{color:J.text.primary,prefix:" "}}},BU=N2.memo(({content:$,language:J,terminalWidth:Y,isPending:Z=!1,availableHeight:X})=>{let Q=D0();if(Z&&X!==void 0){let U=$.split(`
143
143
  `),G=4,z=Math.max(1,X-4);if(U.length>z){let K=U.slice(0,z).join(`
144
- `);return d(I0,{flexDirection:"column",flexShrink:0,children:[d(h4,{content:K,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),d(u0,{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(h4,{content:$,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),PU=N2.memo(({content:$,level:J})=>{let Y=D0();switch(J){case 1:return d(u0,{bold:!0,color:Y.colors.primary,children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return d(u0,{bold:!0,color:Y.colors.primary,children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return d(u0,{bold:!0,color:Y.colors.text.primary,children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return d(u0,{italic:!0,color:Y.colors.text.muted,children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return d(u0,{children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),AU=N2.memo(({terminalWidth:$})=>{let J=D0(),Y=Math.max(0,Math.min($-4,80));return d(u0,{dimColor:!0,color:J.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),bU=N2.memo(({content:$})=>{return d(u0,{wrap:"wrap",children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),MU=N2.memo(({content:$})=>{let J=D0();return d(I0,{flexDirection:"row",gap:1,children:[d(u0,{color:J.colors.info,children:" "},void 0,!1,void 0,this),d(u0,{color:J.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),TU=N2.memo(({detail:$,terminalWidth:J})=>{let Y=D0(),Z=50,X=$.split(`
144
+ `);return d(I0,{flexDirection:"column",flexShrink:0,children:[d(h4,{content:K,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),d(u0,{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(h4,{content:$,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),wU=N2.memo(({content:$,level:J})=>{let Y=D0();switch(J){case 1:return d(u0,{bold:!0,color:Y.colors.primary,children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return d(u0,{bold:!0,color:Y.colors.primary,children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return d(u0,{bold:!0,color:Y.colors.text.primary,children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return d(u0,{italic:!0,color:Y.colors.text.muted,children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return d(u0,{children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),PU=N2.memo(({terminalWidth:$})=>{let J=D0(),Y=Math.max(0,Math.min($-4,80));return d(u0,{dimColor:!0,color:J.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),AU=N2.memo(({content:$})=>{return d(u0,{wrap:"wrap",children:d(U1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),bU=N2.memo(({content:$})=>{let J=D0();return d(I0,{flexDirection:"row",gap:1,children:[d(u0,{color:J.colors.info,children:" "},void 0,!1,void 0,this),d(u0,{color:J.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),MU=N2.memo(({detail:$,terminalWidth:J})=>{let Y=D0(),Z=50,X=$.split(`
145
145
  `);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,G=U.join(`
146
- `),z=G.includes("<<<DIFF>>>"),K=G.includes("```");if(z){let O=G.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(O)try{let q=JSON.parse(O[1]);return d(I0,{flexDirection:"column",children:[d(X9,{patch:q.patch,startLine:q.startLine,matchLine:q.matchLine,terminalWidth:J},void 0,!1,void 0,this),Q&&d(I0,{marginTop:1,children:d(u0,{dimColor:!0,color:Y.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(K){let O=G.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(O){let q=O[1]||"text",N=O[2];return d(I0,{flexDirection:"column",children:[d(h4,{content:N,language:q,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&d(I0,{marginTop:1,children:d(u0,{dimColor:!0,color:Y.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(I0,{flexDirection:"column",children:[U.map((O,q)=>d(u0,{color:Y.colors.text.primary,children:O},q,!1,void 0,this)),Q&&d(I0,{marginTop:1,children:d(u0,{dimColor:!0,color:Y.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 CU($,J,Y,Z=80){if(!Y||J===void 0||J<=0)return{content:$,isTruncated:!1,hiddenLines:0};let Q=Math.max(1,J-8),U=Math.max(40,Z*0.8),G=Q*U;if($.length<=G)return{content:$,isTruncated:!1,hiddenLines:0};let z=Math.floor(G*0.9),K=$.length-z,O=K,q=$.indexOf(`
147
- `,K);if(q!==-1&&q-K<U)O=q+1;let N=$.slice(O),W=($.slice(0,O).match(/\n/g)||[]).length+1;return{content:N,isTruncated:!0,hiddenLines:W}}var k1=N2.memo(({content:$,role:J,terminalWidth:Y,metadata:Z,isPending:X=!1,availableTerminalHeight:Q,hidePrefix:U=!1,noMargin:G=!1,renderPlainTextOnly:z=!1,streamingLines:K,streamingHiddenLines:O,messageId:q,blocksOverride:N,currentLineOverride:_,streamingMode:W="text",renderCodeBlocksAsPlainText:H=!1})=>{let A=D0(),b=N!==void 0,w=O2(()=>BU(J,A.colors,Z),[J,A.colors,Z]),{color:B,prefix:C}=w,F=C.length+1,M=O2(()=>{if(!Z||typeof Z!=="object")return null;if(!("subtaskRef"in Z))return null;let f=Z.subtaskRef;if(!f||typeof f!=="object")return null;return f},[Z]),L=J==="tool"&&Z?.phase==="start",y=!G&&!L,S=O2(()=>{if(!z)return[];return $.split(/\r?\n/)},[$,z]);if(!b&&X){let f=K??$.split(/\r?\n/),v=O??0,G0=!1,V=!1,x=!1;if(W!=="text")G0=W==="code",V=W==="diff",x=W==="table";return d(I0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[v>0&&d(I0,{flexDirection:"row",flexShrink:0,children:[d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(u0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",v," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),f.map((l,H0)=>{if(W==="text"){if(l.match(a1.codeBlock))G0=!G0;else if(l.match(a1.diffStart))V=!0;else if(l.match(a1.diffEnd))V=!1;else if(l.match(a1.table))x=!0;else if(x&&!l.match(a1.table))x=!1}let F0=W==="text"&&!G0&&!V&&!x,T0=F0?l.match(a1.ulItem):null,I=F0?l.match(a1.olItem):null,D=T0??I;return d(I0,{flexDirection:"row",flexShrink:0,children:[H0===0&&!U?d(I0,{marginRight:1,flexShrink:0,children:d(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(I0,{flexGrow:1,flexShrink:0,children:D?d(Q9,{type:T0?"ul":"ol",marker:D[2],itemText:D[3],leadingWhitespace:D[1]},void 0,!1,void 0,this):d(u0,{wrap:"wrap",children:l===""?" ":l},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},H0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!b&&z)return d(I0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:S.map((f,v)=>d(I0,{flexDirection:"row",flexShrink:0,children:[v===0&&!U?d(I0,{marginRight:1,flexShrink:0,children:d(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(I0,{flexGrow:1,flexShrink:0,children:d(u0,{wrap:"wrap",children:f===""?" ":f},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},v,!0,void 0,this))},void 0,!1,void 0,this);let T=t3(null);K9(()=>{T.current=null},[q]);let R=O2(()=>{if(b)return null;if(!q)return null;return s3(q)},[q,b]);K9(()=>{if(b)return;if(!R||!q)return;T.current={messageId:q,blocks:R}},[R,q,b]),K9(()=>{if(b)return;if(!R||!q)return;e3(q)},[R,q,b]);let P=O2(()=>b?{content:$,isTruncated:!1,hiddenLines:0}:CU($,Q,X,Y),[$,Q,X,Y,b]),{content:j,isTruncated:o,hiddenLines:u}=P;if(!b&&J==="tool"&&Z&&"detail"in Z){let f=Z;if(f.detail)return d(I0,{flexDirection:"column",marginBottom:G?0:1,children:[d(I0,{flexDirection:"row",children:[d(I0,{marginRight:1,children:d(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(u0,{color:B,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),d(I0,{marginLeft:C.length+1,children:d(TU,{detail:f.detail,terminalWidth:Y-(C.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:J0,currentLine:K0}=O2(()=>{if(b)return{completedContent:"",currentLine:_??""};if(!X)return{completedContent:j,currentLine:""};let f=j.lastIndexOf(`
148
- `);if(f===-1)return{completedContent:"",currentLine:j};return{completedContent:j.slice(0,f+1),currentLine:j.slice(f+1)}},[j,X,b,_]),q0=t3({content:"",blocks:[]}),a=O2(()=>{if(b)return N??[];if(R)return R;if(T.current&&T.current.messageId===q)return T.current.blocks;let f=q0.current;if(!X||!J0.startsWith(f.content)){let x=z9(J0);return q0.current={content:J0,blocks:x},x}if(J0===f.content)return f.blocks;let v=J0.slice(f.content.length),G0=z9(v),V=[...f.blocks,...G0];return q0.current={content:J0,blocks:V},V},[J0,X,b,N]);return d(I0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[o&&d(I0,{flexDirection:"row",flexShrink:0,children:[d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(u0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",u," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a.map((f,v)=>{if(f.type==="empty")return d(I0,{height:1,flexShrink:0},v,!1,void 0,this);return d(I0,{flexDirection:"row",flexShrink:0,children:[v===0&&!U&&d(I0,{marginRight:1,flexShrink:0,children:d(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),(v>0||U)&&d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(I0,{flexGrow:1,flexShrink:0,children:f.type==="code"?H?d(u0,{wrap:"wrap",children:f.content},void 0,!1,void 0,this):d(wU,{content:f.content,language:f.language,terminalWidth:Y-F,isPending:X,availableHeight:Q},void 0,!1,void 0,this):f.type==="table"&&f.tableData?d(n3,{headers:f.tableData.headers,rows:f.tableData.rows,terminalWidth:Y-F},void 0,!1,void 0,this):f.type==="heading"?d(PU,{content:f.content,level:f.level||1},void 0,!1,void 0,this):f.type==="list"?d(Q9,{type:f.listType||"ul",marker:f.marker||"-",itemText:f.content,leadingWhitespace:" ".repeat(f.indentation||0)},void 0,!1,void 0,this):f.type==="hr"?d(AU,{terminalWidth:Y-F},void 0,!1,void 0,this):f.type==="diff"&&f.diffData?d(X9,{patch:f.diffData.patch,startLine:f.diffData.startLine,matchLine:f.diffData.matchLine,terminalWidth:Y-F},void 0,!1,void 0,this):f.type==="command-message"?d(MU,{content:f.content},void 0,!1,void 0,this):f.type==="blockquote"&&f.blockquoteLines?d(j3,{lines:f.blockquoteLines,level:f.blockquoteLevel||1},void 0,!1,void 0,this):d(bU,{content:f.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},v,!0,void 0,this)}),K0&&d(I0,{flexDirection:"row",flexShrink:0,children:[a.length===0&&!U?d(I0,{marginRight:1,flexShrink:0,children:d(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(I0,{flexGrow:1,flexShrink:0,children:d(u0,{wrap:"wrap",children:K0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M&&d(I0,{flexDirection:"row",flexShrink:0,children:[d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(I0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[d(u0,{color:A.colors.text.muted,children:["Subtask"," ",typeof M.agentType==="string"?`@${M.agentType}`:"",typeof M.status==="string"?` · ${M.status}`:""]},void 0,!0,void 0,this),typeof M.summary==="string"&&M.summary.trim()!==""&&d(u0,{wrap:"wrap",children:M.summary},void 0,!1,void 0,this),typeof M.childSessionId==="string"&&d(u0,{color:A.colors.text.muted,children:["Session ",M.childSessionId]},void 0,!0,void 0,this),typeof M.resumedFrom==="string"&&d(u0,{color:A.colors.text.muted,children:["Resumed from ",M.resumedFrom,typeof M.resumeDepth==="number"?` · depth ${M.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 DU}from"react/jsx-dev-runtime";var IU=q9.memo(({label:$,isSelected:J})=>n0(W1,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),SU=q9.memo(({details:$,headerColor:J,isPlanModeExit:Y,isPlanModeEnter:Z,terminalWidth:X})=>n0(DU,{children:[n0(t$,{marginBottom:1,children:n0(W1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&n0(t$,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:J,padding:1,children:[n0(W1,{bold:!0,color:J,children:"实施方案"},void 0,!1,void 0,this),n0(t$,{marginTop:1,children:n0(k1,{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(t$,{flexDirection:"column",marginBottom:1,children:n0(k1,{content:$.details,role:"assistant",terminalWidth:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&n0(t$,{flexDirection:"column",marginBottom:1,children:[n0(W1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,U)=>n0(t$,{marginLeft:2,children:n0(W1,{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(t$,{flexDirection:"column",marginBottom:1,children:[n0(W1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,U)=>n0(t$,{marginLeft:2,children:n0(W1,{children:["• ",Q]},void 0,!0,void 0,this)},U,!1,void 0,this)),$.affectedFiles.length>3&&n0(t$,{marginLeft:2,children:n0(W1,{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 kU($,J,Y,Z){return`使用 ↑↓ 选择,回车确认 · ${J||Y||Z?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var J5=q9.memo(({details:$,onResponse:J})=>{let{stdout:Y}=RU(),Z=Y.columns||80,Q=s0()==="confirmation-prompt",U=e0(!1),G=$.type==="exitPlanMode",z=$.type==="enterPlanMode",K=$.type==="maxTurnsExceeded",O=$.type==="mcpSampling";O0((_,W)=>{if(W.ctrl&&_==="c"||W.meta&&_==="c"){U();return}if(W.escape){J({approved:!1,reason:"用户取消"});return}let H=_.toLowerCase();if(G){if(H==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(H==="s"){J({approved:!0,targetMode:"default"});return}if(H==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(z){if(H==="y"){J({approved:!0});return}if(H==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(K){if(H==="y"){J({approved:!0});return}if(H==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(O){if(H==="y"){J({approved:!0,scope:"once"});return}if(H==="n"){J({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(H==="y"){J({approved:!0,scope:"once"});return}if(H==="s"){J({approved:!0,scope:"session"});return}if(H==="p"){J({approved:!0,scope:"project"});return}if(H==="n"){J({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let q=$5(()=>{if(G)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(z)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(K)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:"用户拒绝"}}]},[G,z,K,O]),N=$5(()=>{if(G)return{color:"cyan",title:"方案审核"};if(z)return{color:"magenta",title:"进入规划模式"};if(K)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[G,z,K,$.title]);return n0(t$,{flexDirection:"column",borderStyle:"round",borderColor:Q?N.color:"gray",padding:1,children:[n0(t$,{marginBottom:1,children:n0(W1,{bold:!0,color:N.color,children:N.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(SU,{details:$,headerColor:N.color,isPlanModeExit:G,isPlanModeEnter:z,terminalWidth:Z},void 0,!1,void 0,this),n0(t$,{flexDirection:"column",children:[n0(W1,{color:"gray",children:kU(G,z,K,O)},void 0,!1,void 0,this),n0(yU,{items:q,isFocused:Q,itemComponent:IU,onSelect:(_)=>{J(_.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as _9,Text as G1}from"ink";import{useEffect as fU,useMemo as vU,useState as VU}from"react";import{jsxDEV as g$}from"react/jsx-dev-runtime";function jU($,J){let Y=J,Z=J;while(Y>0&&$.items[Y-1]?.mutable)Y--;while(Z<$.items.length-1&&$.items[Z+1]?.mutable)Z++;return{start:Y,end:Z}}function Y5({queue:$,mutation:J,onMutate:Y,onRefresh:Z,onClose:X}){let{width:Q,height:U}=r1(),[G,z]=VU($?.items[0]?.id??null),K=Math.max(0,$?.items.findIndex((_)=>_.id===G)??0);fU(()=>{if(!$||$.items.length===0){z(null);return}if(!G||!$.items.some((_)=>_.id===G))z($.items[Math.min(K,$.items.length-1)].id)},[$,G,K]);let O=(_)=>{Promise.resolve(Y(_)).catch(()=>{return})};O0((_,W)=>{if(W.escape||_==="q")return X(),!0;if(_==="r")return Promise.resolve(Z()).catch(()=>{return}),!0;if(!$||$.items.length===0)return!0;if(W.downArrow||_==="j"){let w=Math.min($.items.length-1,K+1);return z($.items[w].id),!0}if(W.upArrow||_==="k"){let w=Math.max(0,K-1);return z($.items[w].id),!0}let H=$.items[K];if(!H?.mutable||J.pending)return!0;let A=jU($,K);if(_==="d")return O({type:"remove",messageId:H.id}),!0;let b=_==="K"?Math.max(A.start,K-1):_==="J"?Math.min(A.end,K+1):_==="g"?A.start:_==="G"?A.end:void 0;if(b!==void 0&&b!==K)O({type:"move",messageId:H.id,toPosition:b});return!0},{priority:120});let q=vU(()=>{if(!$)return[];let _=Math.max(1,U-9),W=Math.max(0,Math.min(K-Math.floor(_/2),$.items.length-_));return $.items.slice(W,W+_)},[U,$,K]),N=Math.max(8,Q-38);return g$(_9,{flexDirection:"column",borderStyle:"double",borderColor:"yellow",paddingX:1,children:[g$(_9,{justifyContent:"space-between",children:[g$(G1,{bold:!0,color:"yellow",children:["Follow-up queue · ",$?.pending??0]},void 0,!0,void 0,this),g$(G1,{dimColor:!0,children:"Esc/q close · r refresh"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g$(G1,{dimColor:!0,children:"j/k select · d delete · J/K move · g/G segment edge"},void 0,!1,void 0,this),(J.errorCode||J.errorMessage)&&g$(G1,{color:"red",children:J.errorCode==="revision_conflict"?"Queue changed; showing the latest order":J.errorMessage},void 0,!1,void 0,this),!$||$.items.length===0?g$(G1,{dimColor:!0,children:"No queued follow-ups."},void 0,!1,void 0,this):q.map((_)=>{let W=_.id===G,H=_.kind==="internal"?"Internal runtime item":_.preview||"Attachment-only follow-up";return g$(_9,{gap:1,children:[g$(G1,{color:W?"cyan":void 0,children:W?"›":" "},void 0,!1,void 0,this),g$(G1,{dimColor:!0,children:String(_.position+1).padStart(2," ")},void 0,!1,void 0,this),g$(G1,{color:_.mutable?"white":"gray",children:D3(H.replace(/\s+/g," "),N,"…")},void 0,!1,void 0,this),_.attachmentCount>0&&g$(G1,{color:"cyan",children:["[",_.attachmentCount," attachment]"]},void 0,!0,void 0,this),g$(G1,{color:_.mutable?"green":"yellow",children:_.mutable?_.delivery.replace("_"," "):"locked"},void 0,!1,void 0,this),J.pending&&J.messageId===_.id&&g$(G1,{color:"yellow",children:"updating…"},void 0,!1,void 0,this)]},_.id,!0,void 0,this)})]},void 0,!0,void 0,this)}import{Box as j0,Text as R0}from"ink";import X5 from"ink-text-input";import{useState as D1}from"react";import{jsxDEV as t}from"react/jsx-dev-runtime";var b8=[{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"}],E4=[{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"}],g4=[{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"}],hU=[`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"],Z5=({workspaceRoot:$,sessionId:J,onClose:Y,onSave:Z})=>{let X=L$.getTheme(),[Q,U]=D1("action"),[G,z]=D1(0),[K,O]=D1(0),[q,N]=D1(0),[_,W]=D1(""),[H,A]=D1(""),[b,w]=D1(null),[B,C]=D1(!1),[F,M]=D1(null),L=b8[G],y=g4[K],S=E4[q],T=()=>{if(F){M(null);return}switch(Q){case"action":Y();break;case"event":U("action");break;case"matcher":U("event");break;case"command":U("matcher");break;case"location":U("command");break;case"confirm":U("location");break}};O0((a,f)=>{if(f.escape){T();return}if(Q==="action"){if(f.upArrow)z((v)=>v>0?v-1:b8.length-1);else if(f.downArrow)z((v)=>v<b8.length-1?v+1:0);else if(f.return)R()}else if(Q==="event"){if(f.upArrow)O((v)=>v>0?v-1:g4.length-1);else if(f.downArrow)O((v)=>v<g4.length-1?v+1:0);else if(f.return)U("matcher")}else if(Q==="location"){if(f.upArrow)N((v)=>v>0?v-1:E4.length-1);else if(f.downArrow)N((v)=>v<E4.length-1?v+1:0);else if(f.return)U("confirm")}else if(Q==="confirm"){if(f.return)q0()}});let R=()=>{let a=b8[G].action;if(a==="add")U("event");else if(a==="status")P();else if(a==="list")u();else if(a==="enable")h$.getInstance().enableSession(J,$),M("Hooks enabled for this session");else if(a==="disable")h$.getInstance().disableSession(J,$),M("Hooks disabled for this session");else if(a==="trust")j();else if(a==="revoke")o()},P=async()=>{let a=h$.getInstance(),f=a.isEnabled($,J),v=a.getConfig($),G0=await a.getTrustStatus($),V={};for(let l of Object.values(O9)){let H0=v[l];if(H0&&Array.isArray(H0)){let F0=H0.reduce((T0,I)=>T0+(I.hooks?.length||0),0);if(F0>0)V[l]=F0}}let x=[`Status: ${f?"Enabled":"Disabled"}`,`Trust: ${G0.state}`,`Digest: ${G0.currentDigest??"none"}`,""];if(Object.keys(V).length>0){x.push("Configured hooks:");for(let[l,H0]of Object.entries(V))x.push(` ${l}: ${H0} hook(s)`)}else x.push("No hooks configured");M(x.join(`
149
- `))},j=async()=>{try{let a=await h$.getInstance().trustProject($);M(`Trust: ${a.state}
150
- Digest: ${a.currentDigest??"none"}`)}catch(a){w(a instanceof Error?a.message:"Failed to trust hooks")}},o=async()=>{try{let a=await h$.getInstance().revokeProjectTrust($);M(`Trust: ${a.state}`)}catch(a){w(a instanceof Error?a.message:"Failed to revoke hook trust")}},u=()=>{let f=h$.getInstance().getConfig($),v=[],G0=!1;for(let V of Object.values(O9)){let x=f[V];if(!x||!Array.isArray(x)||x.length===0)continue;G0=!0,v.push(`${V}:`);for(let l of x){let H0=l.matcher,F0="all";if(H0?.tools)F0=`tools: ${Array.isArray(H0.tools)?H0.tools.join(", "):H0.tools}`;v.push(` [${F0}]`);for(let T0 of l.hooks||[])if(T0.type==="command")v.push(` -> ${T0.command}`)}v.push("")}if(!G0)v.push("No hooks configured"),v.push(""),v.push("Configure hooks in .blade/settings.local.json");M(v.join(`
151
- `))},J0=()=>{U("command")},K0=()=>{if(!H.trim()){w("Command cannot be empty");return}w(null),U("location")},q0=async()=>{C(!0),w(null);try{let a=h$.getInstance(),f=await import("node:fs/promises"),v=await import("node:path"),G0=await import("node:os"),V={matcher:_.trim()?{tools:_.trim()}:{},hooks:[{type:"command",command:H.trim()}]},x;switch(S.location){case"local":x=v.join($,".blade","settings.local.json");break;case"project":x=v.join($,".blade","settings.json");break;case"user":x=v.join(G0.homedir(),".blade","settings.json");break}await f.mkdir(v.dirname(x),{recursive:!0});let l={};try{let I=await f.readFile(x,"utf-8");l=JSON.parse(I)}catch{}let H0=l.hooks||{},F0=H0[y.event]||[],T0={...H0,enabled:!0,[y.event]:[...F0,V]};if(l.hooks=T0,await f.writeFile(x,JSON.stringify(l,null,2),"utf-8"),await a.reloadConfig($),Z)Z({event:y.event,matcher:_.trim(),command:H.trim()});Y()}catch(a){w(`Failed to save hook: ${a instanceof Error?a.message:"Unknown error"}`),C(!1)}};return t(j0,{flexDirection:"column",padding:1,children:[t(j0,{marginBottom:1,children:t(R0,{bold:!0,color:X.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginBottom:1,children:t(R0,{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&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(R0,{children:F},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{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&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",marginTop:1,children:b8.map((a,f)=>t(j0,{children:[t(R0,{color:f===G?X.colors.primary:void 0,bold:f===G,children:[f===G?"> ":" ",a.action]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",a.description]},void 0,!0,void 0,this)]},a.action,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{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"&&t(j0,{flexDirection:"column",children:[t(R0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:g4.map((a,f)=>t(j0,{children:[t(R0,{color:f===K?X.colors.primary:void 0,bold:f===K,children:[f===K?"> ":" ",a.event]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",a.description]},void 0,!0,void 0,this)]},a.event,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{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"&&t(j0,{marginBottom:1,children:t(R0,{children:["Event:"," ",t(R0,{bold:!0,color:X.colors.primary,children:y.event},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",y.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")&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(R0,{color:X.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),t(R0,{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"&&t(j0,{flexDirection:"column",children:[t(j0,{children:[t(R0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),t(X5,{value:_,onChange:W,onSubmit:J0,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{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),t(j0,{marginTop:1,children:t(R0,{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")&&t(j0,{marginBottom:1,children:t(R0,{children:["Matcher: ",t(R0,{bold:!0,children:_||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q==="command"&&t(j0,{flexDirection:"column",children:[t(j0,{children:t(R0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,marginTop:1,children:t(X5,{value:H,onChange:A,onSubmit:K0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:[t(R0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),hU.map((a,f)=>t(R0,{color:X.colors.muted,children:["• ",a]},f,!0,void 0,this))]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{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"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[t(R0,{bold:!0,color:X.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),t(R0,{children:" "},void 0,!1,void 0,this),t(R0,{children:[" ","Event: ",y.event," - ",y.description]},void 0,!0,void 0,this),t(R0,{children:[" Matcher: ",_||"(all)"]},void 0,!0,void 0,this),t(R0,{children:[" Command: ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(R0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:E4.map((a,f)=>t(j0,{children:[t(R0,{color:f===q?X.colors.primary:void 0,bold:f===q,children:[f===q?"> ":" ",f+1,". ",a.name]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" ",a.description]},void 0,!0,void 0,this)]},a.location,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{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"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.success,paddingX:2,paddingY:1,children:[t(R0,{bold:!0,children:["Saving hook to ",S.description,"..."]},void 0,!0,void 0,this),t(R0,{children:" "},void 0,!1,void 0,this),t(R0,{children:["Event: ",y.event]},void 0,!0,void 0,this),t(R0,{children:["Matcher: ",_||"(all tools)"]},void 0,!0,void 0,this),t(R0,{children:["Command: ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{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),b&&t(j0,{marginTop:1,children:t(R0,{color:X.colors.error,children:b},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as T5}from"ahooks";import{Box as $G,Text as JG}from"ink";import YG from"react";import{useMemoizedFn as p4}from"ahooks";import W2 from"chalk";import{Text as nU}from"ink";import{useEffect as A5,useRef as M8}from"react";var m4={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};function Q5($){return typeof $==="string"&&/^[0-9a-f]{32}$/.test($)}function EU($){if(!Q5($))throw Error("TUI composer ready nonce must be 32 lowercase hexadecimal chars");return`\x1B]99;blade-composer-ready=${$}\x07`}function gU($=process.env){let J=$.BLADE_TUI_COMPOSER_READY_NONCE;if(!Q5(J))return;return EU(J)}function U5($=process.env,J=(Y)=>process.stdout.write(Y)){let Y=gU($);if(!Y)return!1;return J(Y),!0}var H2="\x1B",mU=`${H2}[200~`,pU=`${H2}[201~`,xU="[200~",cU="[201~",uU=[`${H2}[I`,`${H2}[O`,"[I","[O"],z5=`${H2}[?2004h`,q5=`${H2}[?2004l`,H9=`${H2}[?1004l`,dU=[mU,xU],lU=[pU,cU];function _5(){return{pasteBuffer:null,pasteOverflowed:!1}}function G5($,J){let Y;for(let Z of J){let X=$.indexOf(Z);if(X===-1)continue;if(!Y||X<Y.index||X===Y.index&&Z.length>Y.marker.length)Y={index:X,marker:Z}}return Y}function K5($){return uU.some((J)=>$===J)}function O5($,J){let Y=J,Z=$.pasteBuffer,X=$.pasteOverflowed,Q=Z!==null,U=[];while(Y.length>0){if(Z!==null){let K=G5(Y,lU);if(!K){if(Z.length+Y.length>N9)Z="",X=!0;else if(!X)Z+=Y;Y="";break}if(Z.length+K.index>N9)X=!0;else if(!X)Z+=Y.slice(0,K.index),U.push({kind:"paste",text:Z});Z=null,X=!1,Q=!0,Y=Y.slice(K.index+K.marker.length);continue}let G=G5(Y,dU);if(!G){if(K5(Y))Q=!0;else U.push({kind:"text",text:Y});Y="";break}let z=Y.slice(0,G.index);if(z&&!K5(z))U.push({kind:"text",text:z});Z="",X=!1,Q=!0,Y=Y.slice(G.index+G.marker.length)}if(J.length===0&&Z!==null)Q=!0;return{handled:Q,state:{pasteBuffer:Z,pasteOverflowed:X},segments:U}}import{execSync as e2}from"node:child_process";import{existsSync as rU,readFileSync as W9}from"node:fs";import{basename as N5,isAbsolute as aU}from"node:path";function H5($){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 W5(){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"},Y={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(Z)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${Z}" 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:(Z)=>`rm -f "${Z}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(Z)=>`xclip -selection clipboard -t image/png -o > "${Z}" || wl-paste --type image/png > "${Z}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(Z)=>`rm -f "${Z}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(Z)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${Z.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(Z)=>`del /f "${Z}"`}};return{commands:Y[$]||Y.linux,screenshotPath:J[$]||J.linux}}function iU(){let{commands:$}=W5();try{return e2($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function F5($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function L5($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function F9($){let J=F5($.trim()),Y=L5(J);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function oU($){let J=F5($.trim()),Y=L5(J);if(F9(Y))return Y;return null}async function B5($){let J=oU($);if(!J)return null;let Y;try{if(aU(J))Y=W9(J);else{let U=iU();if(U&&J===N5(U))Y=W9(U);else return null}}catch(U){return console.error("Failed to read image file:",U),null}let Z=Y.toString("base64"),X=H5(Z),Q=N5(J);return{path:J,base64:Z,mediaType:X,filename:Q}}async function w5(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=J[$]||J.linux;try{return e2(Y,{encoding:"utf-8"})||null}catch{return null}}async function P5(){let{commands:$,screenshotPath:J}=W5();try{if(e2($.checkImage,{stdio:"ignore"}),e2($.saveImage(J),{stdio:"ignore"}),!rU(J))return null;let Z=W9(J).toString("base64"),X=H5(Z);return e2($.deleteFile(J),{stdio:"ignore"}),{base64:Z,mediaType:X}}catch(Y){try{e2($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as eU}from"react/jsx-dev-runtime";var tU=/\r\n/g,sU=/\r/g;function L9($){if(!$.includes("\r"))return $;return $.replace(tU,`
152
- `).replace(sU,`
153
- `)}function b5($,J,Y){let Z=Math.max(0,Math.min(Y,J.length)),X=J.slice(0,Z),Q=J.slice(Z);return{newValue:X+$+Q,newCursorPosition:Z+$.length}}function M5({value:$,placeholder:J="",focus:Y=!0,onChange:Z,cursorPosition:X,onChangeCursorPosition:Q,onPaste:U,onImagePaste:G,disabledKeys:z=[]}){let K=M8(_5()),O=M8($),q=M8(X),N=M8(null),_=M8(!1);A5(()=>{O.current=$,q.current=X},[$,X]),A5(()=>{if(X>$.length)Q($.length)},[$,X,Q]);let W=p4((F,M)=>{let L=O.current,y=q.current;if(O.current=F,q.current=M,F!==L)Z(F);if(M!==y)Q(M)}),H=p4((F)=>{if(!F)return;let{newValue:M,newCursorPosition:L}=b5(L9(F),O.current,q.current);W(M,L)}),A=p4(async(F)=>{let M=L9(F);if(!M)return;if(G&&F9(M))try{let y=await B5(M);if(y){let S=await G(y.base64,y.mediaType,y.filename);if(S?.prompt)H(S.prompt);return}}catch(y){console.error("Failed to process image path:",y)}if((M.length>m4.LARGE_INPUT_THRESHOLD||M.includes(`
154
- `))&&U){let y=await U(M);if(y?.prompt){H(y.prompt);return}}H(M)}),b=p4((F)=>{let M=N.current;if(!M){try{let y=F();if(!y)return;let S=y.catch(()=>{return});N.current=S,S.finally(()=>{if(N.current===S)N.current=null})}catch{}return}let L=M.then(F).then(()=>{return}).catch(()=>{return});N.current=L,L.finally(()=>{if(N.current===L)N.current=null})});O0((F,M)=>{return b(()=>{let L=L9(F),y=O5(K.current,L);if(K.current=y.state,y.handled)return(async()=>{for(let o of y.segments)if(o.kind==="paste")await A(o.text);else H(o.text)})();if(z.some((o)=>M[o])||M.ctrl&&F==="c"||M.ctrl&&F==="l"||M.ctrl&&F==="t"||M.ctrl&&F==="o"||M.meta&&F==="l"||M.meta&&F==="t"||M.meta&&F==="o"||M.shift&&M.tab||L==="?"&&O.current==="")return;let T=O.current,R=q.current,P=R,j=T;if(M.leftArrow)P--;else if(M.rightArrow)P++;else if(M.backspace||M.delete){if(F===""){if(R>0)j=T.slice(0,R-1)+T.slice(R,T.length),P--}else if(R<T.length)j=T.slice(0,R)+T.slice(R+1,T.length)}else if(M.ctrl&&L==="a")P=0;else if(M.ctrl&&L==="e")P=T.length;else if(M.ctrl&&L==="k")j=T.slice(0,R);else if(M.ctrl&&L==="u")j=T.slice(R),P=0;else if(M.ctrl&&L==="w"){let u=T.slice(0,R).match(/\s*\S+\s*$/);if(u){let J0=u[0].length;j=T.slice(0,R-J0)+T.slice(R),P-=J0}}else if(M.ctrl&&L==="v"){let o=process.platform==="darwin";return(async()=>{if(G){let J0=await P5();if(J0){let K0=await G(J0.base64,J0.mediaType,"clipboard.png");if(K0?.prompt)H(K0.prompt);return}}if(o)return;let u=await w5();if(u)await A(u)})()}else if(M.pageUp)P=0;else if(M.pageDown)P=T.length;else if(L===`
155
- `&&(M.shift||M.meta)){let{newValue:o,newCursorPosition:u}=b5(L,T,R);W(o,u);return}else if(!M.ctrl&&!M.meta){if(U&&(L.length>m4.LARGE_INPUT_THRESHOLD||L.includes(`
156
- `)))return A(L);j=T.slice(0,R)+L+T.slice(R,T.length),P+=L.length}if(P<0)P=0;if(P>j.length)P=j.length;W(j,P)}),!0},{isActive:Y,priority:0,onRegistered:()=>{if(_.current)return;_.current=U5()}});let w=Y,B=$,C=J?W2.grey(J):void 0;if(w)if(C=J.length>0?W2.inverse(J[0])+W2.grey(J.slice(1)):W2.inverse(" "),$.length===0)B=W2.inverse(" ");else{B="";for(let F=0;F<$.length;F++)if(F===X&&X<$.length)B+=W2.inverse($[F]);else B+=$[F];if(X>=$.length)B+=W2.inverse(" ")}return eU(nU,{children:J?$.length>0?B:C:B},void 0,!1,void 0,this)}import{jsxDEV as B9}from"react/jsx-dev-runtime";var C5=YG.memo(({input:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:Z,onAddPasteMapping:X,onAddImagePasteMapping:Q,disabled:U=!1})=>{let z=s0()==="main-input"&&!U,K=$.trimStart().startsWith("!"),O=T5((N)=>{let _=N.split(`
157
- `).length,W=N.length,H=500,A=10;if(W>500||_>10){let b=X(N),w=N.slice(0,30).replace(/\n/g," "),B=`${W} chars, ${_} lines: ${w}...`;return{prompt:`${B4(b)}${B}${C6()}`}}return{}}),q=T5(async(N,_,W)=>{try{let H=Q(N,_);return{prompt:`${B4(H)}[Image #${H}]${C6()}`}}catch(H){return console.error("[Image Paste] Failed to process image:",H),{prompt:`[Image paste failed: ${H instanceof Error?H.message:"Unknown error"}] `}}});return B9($G,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[B9(JG,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),B9(M5,{value:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:Z,onPaste:O,onImagePaste:q,placeholder:" 输入命令...",focus:z,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as $8,Text as f$}from"ink";import _G,{useEffect as v5,useState as V5}from"react";import{useEffect as GG,useRef as KG,useState as zG}from"react";import{useEffect as XG,useRef as ZG,useState as QG}from"react";var UG=15000,R5="等待用户确认...",y5=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],I5=["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 S5(){if(Math.random()<0.25){let Y=Math.floor(Math.random()*I5.length);return I5[Y]}let J=Math.floor(Math.random()*y5.length);return y5[J]}function k5($,J,Y=!1){let[Z,X]=QG(""),Q=ZG(Y);return Q.current=Y,XG(()=>{if(J){X(R5);return}if(!$){X("");return}X((G)=>G===""||G===R5?S5():G);let U=setInterval(()=>{if(!Q.current)X(S5())},UG);return()=>{clearInterval(U)}},[$,J]),Z}function D5($,J=!1,Y=!1){let[Z,X]=zG(0),Q=KG(null),U=k5($,J,Y);return GG(()=>{if(!$){X(0),Q.current=null;return}if(Y)return;if(Q.current===null)Q.current=Date.now();let G=setInterval(()=>{if(Q.current!==null){let z=Math.floor((Date.now()-Q.current)/1000);X(z)}},1000);return()=>{clearInterval(G)}},[$,Y]),{currentPhrase:U,elapsedTime:Z}}function qG($){let J=Math.max(0,Math.floor($/1000));if(J<60)return`${J}s`;let Y=Math.floor(J/60),Z=J%60;if(Y<60)return`${Y}m ${Z}s`;return`${Math.floor(Y/60)}h ${Y%60}m ${Z}s`}function f5($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let Z=Y.activeTools.length+Y.activeToolOverflow,X=Y.phase==="starting"?"正在启动任务":Y.phase==="thinking"?"正在思考":Y.phase==="responding"?"正在生成回复":Y.phase==="compacting"?"正在压缩上下文":Y.phase==="continuing"?"正在推进下一步":`正在执行 ${Z} 个工具`,Q=Y.activeTools.slice(0,2).map((K)=>K.progress!==void 0&&K.total!==void 0?`${K.name} ${K.progress}/${K.total}`:K.name),U=Math.max(0,Y.activeTools.length-Q.length+Y.activeToolOverflow);if(U>0)Q.push(`+${U}`);let G=[...Q,Y.toolCallsStarted>0?`工具 ${Y.toolCallsCompleted}/${Y.toolCallsStarted}`:void 0,Y.turn>0?`回合 ${Y.turn}${Y.maxTurns===null?"":`/${Y.maxTurns}`}`:void 0].filter((K)=>K!==void 0),z=qG(J-Y.startedAt);return{primary:X,secondary:G.join(" · "),compact:Y.phase==="executing_tools"?`执行工具 · ${Z} 个 · ${z}`:`${X} · ${z}`,elapsed:z}}import{jsxDEV as q$,Fragment as NG}from"react/jsx-dev-runtime";var w9=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],OG=80;function j5($){if($<60)return`${$}s`;let J=Math.floor($/60),Y=$%60;return`${J}m ${Y}s`}var h5=_G.memo(({message:$,paused:J=!1})=>{let Y=g2(),Z=E8(),X=j8(),Q=s9(),U=e9(),G=Y||!Z,[z,K]=V5(0),[O,q]=V5(Date.now()),N=D0(),W=d2()>=OG,{currentPhrase:H,elapsedTime:A}=D5(G,!1,J);if(v5(()=>{if(!G||J){K(0);return}let F=setInterval(()=>{K((M)=>(M+1)%w9.length)},150);return()=>clearInterval(F)},[G,J]),v5(()=>{if(!X?.snapshot?.nextActionAt&&!Q?.snapshot||J)return;q(Date.now());let F=setInterval(()=>q(Date.now()),1000);return()=>clearInterval(F)},[J,X?.snapshot?.nextActionAt,Q?.snapshot]),!G)return null;let b=k4(X,O),w=f5(Q,O),C=(U?.phase==="detected"?`检测到 ${U.toolName} 连续 ${U.runLength} 次无进展,正在要求 Agent 切换策略`:U?.phase==="halted"?`已停止 ${U.toolName} 空转循环`:null)||b?.primary||w?.primary||$||H||"正在思考中...";if(W)return q$($8,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.warning,bold:!0,children:w9[z]},void 0,!1,void 0,this),q$(f$,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this),b?.secondary&&q$(f$,{color:N.colors.info,children:b.secondary},void 0,!1,void 0,this),!b?.secondary&&w?.secondary&&q$(f$,{color:N.colors.info,children:w.secondary},void 0,!1,void 0,this),(w||A>0)&&q$(NG,{children:[q$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),q$(f$,{color:N.colors.info,children:["已用时:"," ",w?.elapsed??j5(A)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),q$(f$,{color:N.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return q$($8,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[q$($8,{flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.warning,bold:!0,children:w9[z]},void 0,!1,void 0,this),q$(f$,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b?.secondary&&q$($8,{marginLeft:2,children:q$(f$,{color:N.colors.info,children:b.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),!b?.secondary&&w?.secondary&&q$($8,{marginLeft:2,children:q$(f$,{color:N.colors.info,children:w.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),(w||A>0)&&q$($8,{marginLeft:2,flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.info,children:["已用时: ",w?.elapsed??j5(A)]},void 0,!0,void 0,this),q$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),q$(f$,{color:N.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 u4,Text as J$,useStdout as HG}from"ink";import WG from"ink-text-input";import FG,{useCallback as x4,useEffect as LG,useMemo as BG,useState as F2}from"react";import{jsxDEV as f0}from"react/jsx-dev-runtime";var p5=FG.memo(({details:$,onComplete:J})=>{let{stdout:Y}=HG(),Z=Y.columns||80,X=s0()==="confirmation-prompt",Q=e0(!1),U=$.fields??[],[G,z]=F2("field"),[K,O]=F2(0),[q,N]=F2(()=>E5($)),[_,W]=F2(""),[H,A]=F2(0),[b,w]=F2([]),[B,C]=F2(),F=U[K],M=BG(()=>wG(F),[F]);LG(()=>{if(!F)return;let R=q[F.name];W(typeof R==="string"||typeof R==="number"?String(R):""),w(Array.isArray(R)?[...R]:[]);let P=M.findIndex((j)=>j.value===String(R));A(P>=0?P:0),C(void 0)},[q,F,M]);let L=x4((R)=>{if(N(R),K<U.length-1){O((P)=>P+1);return}z("review")},[K,U.length]),y=x4((R)=>{if(!F)return;let P={...q};if(R===void 0)delete P[F.name];else P[F.name]=R;L(P)},[q,F,L]),S=x4((R)=>{if(!F)return;try{y(g5(F,R))}catch(P){C(P instanceof Error?P.message:String(P))}},[F,y]),T=x4(()=>{try{let R=m5($,{action:"accept",content:q});J({action:R.action,...R.content?{content:R.content}:{}})}catch(R){C(R instanceof Error?R.message:String(R))}},[q,$,J]);if(O0((R,P)=>{if(P.ctrl&&R==="c"||P.meta&&R==="c"){Q();return}if(P.escape){J({action:"cancel"});return}if($.mode==="url"){if(R.toLowerCase()==="y")J({action:"accept"},!0);else if(R.toLowerCase()==="n")J({action:"decline"});return}if(G==="review"){if(R.toLowerCase()==="y"||P.return)T();else if(R.toLowerCase()==="e")O(0),z("field");else if(R.toLowerCase()==="d")J({action:"decline"});return}if(!F){if(P.return)T();return}if(P9(F))return;if(R.toLowerCase()==="d"){J({action:"decline"});return}if(P.upArrow){A((j)=>j>0?j-1:Math.max(M.length-1,0));return}if(P.downArrow||P.tab){A((j)=>j<M.length-1?j+1:0);return}if(R===" "&&F.type==="multi-select"){let j=M[H];if(j)w((o)=>o.includes(j.value)?o.filter((u)=>u!==j.value):[...o,j.value]);return}if(P.return)if(F.type==="multi-select")y(b);else{let j=M[H];if(j)y(j.typedValue)}},{isActive:X}),$.mode==="url")return f0(c4,{width:Z,color:"yellow",children:[f0(J$,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),f0(J$,{children:$.message},void 0,!1,void 0,this),f0(J$,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),f0(J$,{children:["Domain: ",f0(J$,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0(J$,{wrap:"wrap",children:["URL: ",f0(J$,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0(J$,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(G==="review")return f0(c4,{width:Z,color:"green",children:[f0(J$,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),f0(J$,{children:$.message},void 0,!1,void 0,this),U.map((R)=>f0(J$,{children:[R.title,": ",AG(q[R.name])]},R.name,!0,void 0,this)),B&&f0(J$,{color:"red",children:B},void 0,!1,void 0,this),f0(J$,{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 f0(c4,{width:Z,color:"cyan",children:[f0(J$,{children:$.message},void 0,!1,void 0,this),f0(J$,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),f0(J$,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return f0(c4,{width:Z,color:"cyan",children:[f0(J$,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),f0(J$,{children:$.message},void 0,!1,void 0,this),f0(u4,{flexDirection:"column",marginTop:1,children:[f0(J$,{bold:!0,children:[F.title,F.required?" *":""]},void 0,!0,void 0,this),F.description&&f0(J$,{color:"gray",children:F.description},void 0,!1,void 0,this),f0(J$,{color:"gray",children:PG(F)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P9(F)?f0(u4,{children:[f0(J$,{color:"cyan",children:"> "},void 0,!1,void 0,this),f0(WG,{value:_,onChange:W,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):f0(u4,{flexDirection:"column",children:M.map((R,P)=>{let j=F.type==="multi-select"&&b.includes(R.value);return f0(J$,{color:H===P?"yellow":void 0,children:[H===P?"> ":" ",F.type==="multi-select"?j?"(*) ":"( ) ":"",R.label]},R.value,!0,void 0,this)})},void 0,!1,void 0,this),B&&f0(J$,{color:"red",children:B},void 0,!1,void 0,this),f0(J$,{color:"gray",children:[P9(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),f0(J$,{color:"gray",children:["Field ",K+1," of ",U.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function c4({children:$,width:J,color:Y}){return f0(u4,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(J-4,88),children:$},void 0,!1,void 0,this)}function P9($){return $.type==="string"||$.type==="number"||$.type==="integer"}function wG($){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 PG($){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 AG($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import l4 from"ansi-escapes";import{Box as L2,Static as DG,useStdout as fG}from"ink";import vG,{useEffect as v1,useMemo as R9,useRef as o1,useState as y9}from"react";import{Box as bG,Text as x5}from"ink";import MG from"react";import{jsxDEV as A9}from"react/jsx-dev-runtime";var b9=MG.memo(({collapsedCount:$})=>{let J=D0();if($<=0)return null;let Y=J.colors.text.muted;return A9(bG,{flexDirection:"row",marginBottom:1,children:[A9(x5,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),A9(x5,{color:Y,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});b9.displayName="CollapsedHistorySummary";import{Box as T8,Text as C8}from"ink";import TG from"ink-big-text";import CG from"ink-gradient";import RG from"react";import{jsxDEV as s$}from"react/jsx-dev-runtime";var u5=RG.memo(()=>{return s$(T8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[s$(T8,{flexDirection:"column",children:s$(CG,{name:"pastel",children:s$(TG,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),s$(T8,{marginBottom:1,children:s$(C8,{color:"white",dimColor:!0,children:c5()},void 0,!1,void 0,this)},void 0,!1,void 0,this),s$(T8,{flexDirection:"column",marginBottom:1,children:[s$(T8,{marginBottom:1,children:s$(C8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s$(C8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),s$(C8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),s$(C8,{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 d4,Text as M9}from"ink";import d5 from"react";import{jsxDEV as i1}from"react/jsx-dev-runtime";var l5=d5.memo(({tasks:$,visible:J=!0,compact:Y=!1})=>{let{colors:Z}=D0();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 i1(d4,{flexDirection:"column",borderStyle:"single",borderColor:Z.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[i1(d4,{marginBottom:Y?0:1,children:[i1(M9,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),i1(M9,{color:Z.text.muted,children:[X.completed,"/",X.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),i1(d4,{flexDirection:"column",children:$.map((Q,U)=>i1(yG,{task:Q,compact:Y},Q.id||U,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),yG=d5.memo(({task:$,compact:J})=>{let Y,Z=!1,X;switch($.status){case"completed":Y="[OK]",Z=!0,X=$.subject;break;case"in_progress":Y=">",Z=!1,X=$.activeForm||$.subject;break;case"pending":default:Y="-",Z=!0,X=$.subject;break}return i1(d4,{paddingY:J?0:0,children:i1(M9,{dimColor:Z,children:[Y," ",X]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as T9,Text as J8}from"ink";import IG,{useMemo as r5}from"react";import{jsxDEV as f1}from"react/jsx-dev-runtime";function SG($,J=60){if(!$)return"";let Y=$.split(`
146
+ `),z=G.includes("<<<DIFF>>>"),K=G.includes("```");if(z){let O=G.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(O)try{let q=JSON.parse(O[1]);return d(I0,{flexDirection:"column",children:[d(Z9,{patch:q.patch,startLine:q.startLine,matchLine:q.matchLine,terminalWidth:J},void 0,!1,void 0,this),Q&&d(I0,{marginTop:1,children:d(u0,{dimColor:!0,color:Y.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(K){let O=G.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(O){let q=O[1]||"text",N=O[2];return d(I0,{flexDirection:"column",children:[d(h4,{content:N,language:q,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&d(I0,{marginTop:1,children:d(u0,{dimColor:!0,color:Y.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(I0,{flexDirection:"column",children:[U.map((O,q)=>d(u0,{color:Y.colors.text.primary,children:O},q,!1,void 0,this)),Q&&d(I0,{marginTop:1,children:d(u0,{dimColor:!0,color:Y.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 TU($,J,Y,Z=80){if(!Y||J===void 0||J<=0)return{content:$,isTruncated:!1,hiddenLines:0};let Q=Math.max(1,J-8),U=Math.max(40,Z*0.8),G=Q*U;if($.length<=G)return{content:$,isTruncated:!1,hiddenLines:0};let z=Math.floor(G*0.9),K=$.length-z,O=K,q=$.indexOf(`
147
+ `,K);if(q!==-1&&q-K<U)O=q+1;let N=$.slice(O),W=($.slice(0,O).match(/\n/g)||[]).length+1;return{content:N,isTruncated:!0,hiddenLines:W}}var k1=N2.memo(({content:$,role:J,terminalWidth:Y,metadata:Z,isPending:X=!1,availableTerminalHeight:Q,hidePrefix:U=!1,noMargin:G=!1,renderPlainTextOnly:z=!1,streamingLines:K,streamingHiddenLines:O,messageId:q,blocksOverride:N,currentLineOverride:_,streamingMode:W="text",renderCodeBlocksAsPlainText:H=!1})=>{let A=D0(),b=N!==void 0,w=O2(()=>LU(J,A.colors,Z),[J,A.colors,Z]),{color:B,prefix:C}=w,F=C.length+1,M=O2(()=>{if(!Z||typeof Z!=="object")return null;if(!("subtaskRef"in Z))return null;let f=Z.subtaskRef;if(!f||typeof f!=="object")return null;return f},[Z]),L=J==="tool"&&Z?.phase==="start",y=!G&&!L,S=O2(()=>{if(!z)return[];return $.split(/\r?\n/)},[$,z]);if(!b&&X){let f=K??$.split(/\r?\n/),v=O??0,G0=!1,V=!1,x=!1;if(W!=="text")G0=W==="code",V=W==="diff",x=W==="table";return d(I0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[v>0&&d(I0,{flexDirection:"row",flexShrink:0,children:[d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(u0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",v," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),f.map((l,H0)=>{if(W==="text"){if(l.match(a1.codeBlock))G0=!G0;else if(l.match(a1.diffStart))V=!0;else if(l.match(a1.diffEnd))V=!1;else if(l.match(a1.table))x=!0;else if(x&&!l.match(a1.table))x=!1}let F0=W==="text"&&!G0&&!V&&!x,T0=F0?l.match(a1.ulItem):null,I=F0?l.match(a1.olItem):null,D=T0??I;return d(I0,{flexDirection:"row",flexShrink:0,children:[H0===0&&!U?d(I0,{marginRight:1,flexShrink:0,children:d(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(I0,{flexGrow:1,flexShrink:0,children:D?d(U9,{type:T0?"ul":"ol",marker:D[2],itemText:D[3],leadingWhitespace:D[1]},void 0,!1,void 0,this):d(u0,{wrap:"wrap",children:l===""?" ":l},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},H0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!b&&z)return d(I0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:S.map((f,v)=>d(I0,{flexDirection:"row",flexShrink:0,children:[v===0&&!U?d(I0,{marginRight:1,flexShrink:0,children:d(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(I0,{flexGrow:1,flexShrink:0,children:d(u0,{wrap:"wrap",children:f===""?" ":f},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},v,!0,void 0,this))},void 0,!1,void 0,this);let T=s3(null);z9(()=>{T.current=null},[q]);let R=O2(()=>{if(b)return null;if(!q)return null;return e3(q)},[q,b]);z9(()=>{if(b)return;if(!R||!q)return;T.current={messageId:q,blocks:R}},[R,q,b]),z9(()=>{if(b)return;if(!R||!q)return;$5(q)},[R,q,b]);let P=O2(()=>b?{content:$,isTruncated:!1,hiddenLines:0}:TU($,Q,X,Y),[$,Q,X,Y,b]),{content:j,isTruncated:o,hiddenLines:u}=P;if(!b&&J==="tool"&&Z&&"detail"in Z){let f=Z;if(f.detail)return d(I0,{flexDirection:"column",marginBottom:G?0:1,children:[d(I0,{flexDirection:"row",children:[d(I0,{marginRight:1,children:d(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(u0,{color:B,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),d(I0,{marginLeft:C.length+1,children:d(MU,{detail:f.detail,terminalWidth:Y-(C.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:J0,currentLine:K0}=O2(()=>{if(b)return{completedContent:"",currentLine:_??""};if(!X)return{completedContent:j,currentLine:""};let f=j.lastIndexOf(`
148
+ `);if(f===-1)return{completedContent:"",currentLine:j};return{completedContent:j.slice(0,f+1),currentLine:j.slice(f+1)}},[j,X,b,_]),q0=s3({content:"",blocks:[]}),a=O2(()=>{if(b)return N??[];if(R)return R;if(T.current&&T.current.messageId===q)return T.current.blocks;let f=q0.current;if(!X||!J0.startsWith(f.content)){let x=q9(J0);return q0.current={content:J0,blocks:x},x}if(J0===f.content)return f.blocks;let v=J0.slice(f.content.length),G0=q9(v),V=[...f.blocks,...G0];return q0.current={content:J0,blocks:V},V},[J0,X,b,N]);return d(I0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[o&&d(I0,{flexDirection:"row",flexShrink:0,children:[d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(u0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",u," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a.map((f,v)=>{if(f.type==="empty")return d(I0,{height:1,flexShrink:0},v,!1,void 0,this);return d(I0,{flexDirection:"row",flexShrink:0,children:[v===0&&!U&&d(I0,{marginRight:1,flexShrink:0,children:d(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),(v>0||U)&&d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(I0,{flexGrow:1,flexShrink:0,children:f.type==="code"?H?d(u0,{wrap:"wrap",children:f.content},void 0,!1,void 0,this):d(BU,{content:f.content,language:f.language,terminalWidth:Y-F,isPending:X,availableHeight:Q},void 0,!1,void 0,this):f.type==="table"&&f.tableData?d(t3,{headers:f.tableData.headers,rows:f.tableData.rows,terminalWidth:Y-F},void 0,!1,void 0,this):f.type==="heading"?d(wU,{content:f.content,level:f.level||1},void 0,!1,void 0,this):f.type==="list"?d(U9,{type:f.listType||"ul",marker:f.marker||"-",itemText:f.content,leadingWhitespace:" ".repeat(f.indentation||0)},void 0,!1,void 0,this):f.type==="hr"?d(PU,{terminalWidth:Y-F},void 0,!1,void 0,this):f.type==="diff"&&f.diffData?d(Z9,{patch:f.diffData.patch,startLine:f.diffData.startLine,matchLine:f.diffData.matchLine,terminalWidth:Y-F},void 0,!1,void 0,this):f.type==="command-message"?d(bU,{content:f.content},void 0,!1,void 0,this):f.type==="blockquote"&&f.blockquoteLines?d(E3,{lines:f.blockquoteLines,level:f.blockquoteLevel||1},void 0,!1,void 0,this):d(AU,{content:f.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},v,!0,void 0,this)}),K0&&d(I0,{flexDirection:"row",flexShrink:0,children:[a.length===0&&!U?d(I0,{marginRight:1,flexShrink:0,children:d(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(I0,{flexGrow:1,flexShrink:0,children:d(u0,{wrap:"wrap",children:K0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M&&d(I0,{flexDirection:"row",flexShrink:0,children:[d(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),d(I0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[d(u0,{color:A.colors.text.muted,children:["Subtask"," ",typeof M.agentType==="string"?`@${M.agentType}`:"",typeof M.status==="string"?` · ${M.status}`:""]},void 0,!0,void 0,this),typeof M.summary==="string"&&M.summary.trim()!==""&&d(u0,{wrap:"wrap",children:M.summary},void 0,!1,void 0,this),typeof M.childSessionId==="string"&&d(u0,{color:A.colors.text.muted,children:["Session ",M.childSessionId]},void 0,!0,void 0,this),typeof M.resumedFrom==="string"&&d(u0,{color:A.colors.text.muted,children:["Resumed from ",M.resumedFrom,typeof M.resumeDepth==="number"?` · depth ${M.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 kU}from"react/jsx-dev-runtime";var yU=_9.memo(({label:$,isSelected:J})=>n0(W1,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),IU=_9.memo(({details:$,headerColor:J,isPlanModeExit:Y,isPlanModeEnter:Z,terminalWidth:X})=>n0(kU,{children:[n0(t$,{marginBottom:1,children:n0(W1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&n0(t$,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:J,padding:1,children:[n0(W1,{bold:!0,color:J,children:"实施方案"},void 0,!1,void 0,this),n0(t$,{marginTop:1,children:n0(k1,{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(t$,{flexDirection:"column",marginBottom:1,children:n0(k1,{content:$.details,role:"assistant",terminalWidth:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&n0(t$,{flexDirection:"column",marginBottom:1,children:[n0(W1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,U)=>n0(t$,{marginLeft:2,children:n0(W1,{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(t$,{flexDirection:"column",marginBottom:1,children:[n0(W1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,U)=>n0(t$,{marginLeft:2,children:n0(W1,{children:["• ",Q]},void 0,!0,void 0,this)},U,!1,void 0,this)),$.affectedFiles.length>3&&n0(t$,{marginLeft:2,children:n0(W1,{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 SU($,J,Y,Z){return`使用 ↑↓ 选择,回车确认 · ${J||Y||Z?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var Y5=_9.memo(({details:$,onResponse:J})=>{let{stdout:Y}=CU(),Z=Y.columns||80,Q=s0()==="confirmation-prompt",U=e0(!1),G=$.type==="exitPlanMode",z=$.type==="enterPlanMode",K=$.type==="maxTurnsExceeded",O=$.type==="mcpSampling";O0((_,W)=>{if(W.ctrl&&_==="c"||W.meta&&_==="c"){U();return}if(W.escape){J({approved:!1,reason:"用户取消"});return}let H=_.toLowerCase();if(G){if(H==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(H==="s"){J({approved:!0,targetMode:"default"});return}if(H==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(z){if(H==="y"){J({approved:!0});return}if(H==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(K){if(H==="y"){J({approved:!0});return}if(H==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(O){if(H==="y"){J({approved:!0,scope:"once"});return}if(H==="n"){J({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(H==="y"){J({approved:!0,scope:"once"});return}if(H==="s"){J({approved:!0,scope:"session"});return}if(H==="p"){J({approved:!0,scope:"project"});return}if(H==="n"){J({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let q=J5(()=>{if(G)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(z)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(K)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:"用户拒绝"}}]},[G,z,K,O]),N=J5(()=>{if(G)return{color:"cyan",title:"方案审核"};if(z)return{color:"magenta",title:"进入规划模式"};if(K)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[G,z,K,$.title]);return n0(t$,{flexDirection:"column",borderStyle:"round",borderColor:Q?N.color:"gray",padding:1,children:[n0(t$,{marginBottom:1,children:n0(W1,{bold:!0,color:N.color,children:N.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(IU,{details:$,headerColor:N.color,isPlanModeExit:G,isPlanModeEnter:z,terminalWidth:Z},void 0,!1,void 0,this),n0(t$,{flexDirection:"column",children:[n0(W1,{color:"gray",children:SU(G,z,K,O)},void 0,!1,void 0,this),n0(RU,{items:q,isFocused:Q,itemComponent:yU,onSelect:(_)=>{J(_.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as O9,Text as G1}from"ink";import{useEffect as DU,useMemo as fU,useState as vU}from"react";import{jsxDEV as g$}from"react/jsx-dev-runtime";function VU($,J){let Y=J,Z=J;while(Y>0&&$.items[Y-1]?.mutable)Y--;while(Z<$.items.length-1&&$.items[Z+1]?.mutable)Z++;return{start:Y,end:Z}}function X5({queue:$,mutation:J,onMutate:Y,onRefresh:Z,onClose:X}){let{width:Q,height:U}=r1(),[G,z]=vU($?.items[0]?.id??null),K=Math.max(0,$?.items.findIndex((_)=>_.id===G)??0);DU(()=>{if(!$||$.items.length===0){z(null);return}if(!G||!$.items.some((_)=>_.id===G))z($.items[Math.min(K,$.items.length-1)].id)},[$,G,K]);let O=(_)=>{Promise.resolve(Y(_)).catch(()=>{return})};O0((_,W)=>{if(W.escape||_==="q")return X(),!0;if(_==="r")return Promise.resolve(Z()).catch(()=>{return}),!0;if(!$||$.items.length===0)return!0;if(W.downArrow||_==="j"){let w=Math.min($.items.length-1,K+1);return z($.items[w].id),!0}if(W.upArrow||_==="k"){let w=Math.max(0,K-1);return z($.items[w].id),!0}let H=$.items[K];if(!H?.mutable||J.pending)return!0;let A=VU($,K);if(_==="d")return O({type:"remove",messageId:H.id}),!0;let b=_==="K"?Math.max(A.start,K-1):_==="J"?Math.min(A.end,K+1):_==="g"?A.start:_==="G"?A.end:void 0;if(b!==void 0&&b!==K)O({type:"move",messageId:H.id,toPosition:b});return!0},{priority:120});let q=fU(()=>{if(!$)return[];let _=Math.max(1,U-9),W=Math.max(0,Math.min(K-Math.floor(_/2),$.items.length-_));return $.items.slice(W,W+_)},[U,$,K]),N=Math.max(8,Q-38);return g$(O9,{flexDirection:"column",borderStyle:"double",borderColor:"yellow",paddingX:1,children:[g$(O9,{justifyContent:"space-between",children:[g$(G1,{bold:!0,color:"yellow",children:["Follow-up queue · ",$?.pending??0]},void 0,!0,void 0,this),g$(G1,{dimColor:!0,children:"Esc/q close · r refresh"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g$(G1,{dimColor:!0,children:"j/k select · d delete · J/K move · g/G segment edge"},void 0,!1,void 0,this),(J.errorCode||J.errorMessage)&&g$(G1,{color:"red",children:J.errorCode==="revision_conflict"?"Queue changed; showing the latest order":J.errorMessage},void 0,!1,void 0,this),!$||$.items.length===0?g$(G1,{dimColor:!0,children:"No queued follow-ups."},void 0,!1,void 0,this):q.map((_)=>{let W=_.id===G,H=_.kind==="internal"?"Internal runtime item":_.preview||"Attachment-only follow-up";return g$(O9,{gap:1,children:[g$(G1,{color:W?"cyan":void 0,children:W?"›":" "},void 0,!1,void 0,this),g$(G1,{dimColor:!0,children:String(_.position+1).padStart(2," ")},void 0,!1,void 0,this),g$(G1,{color:_.mutable?"white":"gray",children:f3(H.replace(/\s+/g," "),N,"…")},void 0,!1,void 0,this),_.attachmentCount>0&&g$(G1,{color:"cyan",children:["[",_.attachmentCount," attachment]"]},void 0,!0,void 0,this),g$(G1,{color:_.mutable?"green":"yellow",children:_.mutable?_.delivery.replace("_"," "):"locked"},void 0,!1,void 0,this),J.pending&&J.messageId===_.id&&g$(G1,{color:"yellow",children:"updating…"},void 0,!1,void 0,this)]},_.id,!0,void 0,this)})]},void 0,!0,void 0,this)}import{Box as j0,Text as R0}from"ink";import Z5 from"ink-text-input";import{useState as D1}from"react";import{jsxDEV as t}from"react/jsx-dev-runtime";var b8=[{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"}],g4=[{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"}],m4=[{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"}],jU=[`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"],Q5=({workspaceRoot:$,sessionId:J,onClose:Y,onSave:Z})=>{let X=L$.getTheme(),[Q,U]=D1("action"),[G,z]=D1(0),[K,O]=D1(0),[q,N]=D1(0),[_,W]=D1(""),[H,A]=D1(""),[b,w]=D1(null),[B,C]=D1(!1),[F,M]=D1(null),L=b8[G],y=m4[K],S=g4[q],T=()=>{if(F){M(null);return}switch(Q){case"action":Y();break;case"event":U("action");break;case"matcher":U("event");break;case"command":U("matcher");break;case"location":U("command");break;case"confirm":U("location");break}};O0((a,f)=>{if(f.escape){T();return}if(Q==="action"){if(f.upArrow)z((v)=>v>0?v-1:b8.length-1);else if(f.downArrow)z((v)=>v<b8.length-1?v+1:0);else if(f.return)R()}else if(Q==="event"){if(f.upArrow)O((v)=>v>0?v-1:m4.length-1);else if(f.downArrow)O((v)=>v<m4.length-1?v+1:0);else if(f.return)U("matcher")}else if(Q==="location"){if(f.upArrow)N((v)=>v>0?v-1:g4.length-1);else if(f.downArrow)N((v)=>v<g4.length-1?v+1:0);else if(f.return)U("confirm")}else if(Q==="confirm"){if(f.return)q0()}});let R=()=>{let a=b8[G].action;if(a==="add")U("event");else if(a==="status")P();else if(a==="list")u();else if(a==="enable")E$.getInstance().enableSession(J,$),M("Hooks enabled for this session");else if(a==="disable")E$.getInstance().disableSession(J,$),M("Hooks disabled for this session");else if(a==="trust")j();else if(a==="revoke")o()},P=async()=>{let a=E$.getInstance(),f=a.isEnabled($,J),v=a.getConfig($),G0=await a.getTrustStatus($),V={};for(let l of Object.values(N9)){let H0=v[l];if(H0&&Array.isArray(H0)){let F0=H0.reduce((T0,I)=>T0+(I.hooks?.length||0),0);if(F0>0)V[l]=F0}}let x=[`Status: ${f?"Enabled":"Disabled"}`,`Trust: ${G0.state}`,`Digest: ${G0.currentDigest??"none"}`,""];if(Object.keys(V).length>0){x.push("Configured hooks:");for(let[l,H0]of Object.entries(V))x.push(` ${l}: ${H0} hook(s)`)}else x.push("No hooks configured");M(x.join(`
149
+ `))},j=async()=>{try{let a=await E$.getInstance().trustProject($);M(`Trust: ${a.state}
150
+ Digest: ${a.currentDigest??"none"}`)}catch(a){w(a instanceof Error?a.message:"Failed to trust hooks")}},o=async()=>{try{let a=await E$.getInstance().revokeProjectTrust($);M(`Trust: ${a.state}`)}catch(a){w(a instanceof Error?a.message:"Failed to revoke hook trust")}},u=()=>{let f=E$.getInstance().getConfig($),v=[],G0=!1;for(let V of Object.values(N9)){let x=f[V];if(!x||!Array.isArray(x)||x.length===0)continue;G0=!0,v.push(`${V}:`);for(let l of x){let H0=l.matcher,F0="all";if(H0?.tools)F0=`tools: ${Array.isArray(H0.tools)?H0.tools.join(", "):H0.tools}`;v.push(` [${F0}]`);for(let T0 of l.hooks||[])if(T0.type==="command")v.push(` -> ${T0.command}`)}v.push("")}if(!G0)v.push("No hooks configured"),v.push(""),v.push("Configure hooks in .blade/settings.local.json");M(v.join(`
151
+ `))},J0=()=>{U("command")},K0=()=>{if(!H.trim()){w("Command cannot be empty");return}w(null),U("location")},q0=async()=>{C(!0),w(null);try{let a=E$.getInstance(),f=await import("node:fs/promises"),v=await import("node:path"),G0=await import("node:os"),V={matcher:_.trim()?{tools:_.trim()}:{},hooks:[{type:"command",command:H.trim()}]},x;switch(S.location){case"local":x=v.join($,".blade","settings.local.json");break;case"project":x=v.join($,".blade","settings.json");break;case"user":x=v.join(G0.homedir(),".blade","settings.json");break}await f.mkdir(v.dirname(x),{recursive:!0});let l={};try{let I=await f.readFile(x,"utf-8");l=JSON.parse(I)}catch{}let H0=l.hooks||{},F0=H0[y.event]||[],T0={...H0,enabled:!0,[y.event]:[...F0,V]};if(l.hooks=T0,await f.writeFile(x,JSON.stringify(l,null,2),"utf-8"),await a.reloadConfig($),Z)Z({event:y.event,matcher:_.trim(),command:H.trim()});Y()}catch(a){w(`Failed to save hook: ${a instanceof Error?a.message:"Unknown error"}`),C(!1)}};return t(j0,{flexDirection:"column",padding:1,children:[t(j0,{marginBottom:1,children:t(R0,{bold:!0,color:X.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginBottom:1,children:t(R0,{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&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(R0,{children:F},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{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&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",marginTop:1,children:b8.map((a,f)=>t(j0,{children:[t(R0,{color:f===G?X.colors.primary:void 0,bold:f===G,children:[f===G?"> ":" ",a.action]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",a.description]},void 0,!0,void 0,this)]},a.action,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{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"&&t(j0,{flexDirection:"column",children:[t(R0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:m4.map((a,f)=>t(j0,{children:[t(R0,{color:f===K?X.colors.primary:void 0,bold:f===K,children:[f===K?"> ":" ",a.event]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",a.description]},void 0,!0,void 0,this)]},a.event,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{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"&&t(j0,{marginBottom:1,children:t(R0,{children:["Event:"," ",t(R0,{bold:!0,color:X.colors.primary,children:y.event},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",y.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")&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(R0,{color:X.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),t(R0,{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"&&t(j0,{flexDirection:"column",children:[t(j0,{children:[t(R0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),t(Z5,{value:_,onChange:W,onSubmit:J0,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{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),t(j0,{marginTop:1,children:t(R0,{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")&&t(j0,{marginBottom:1,children:t(R0,{children:["Matcher: ",t(R0,{bold:!0,children:_||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q==="command"&&t(j0,{flexDirection:"column",children:[t(j0,{children:t(R0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,marginTop:1,children:t(Z5,{value:H,onChange:A,onSubmit:K0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:[t(R0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),jU.map((a,f)=>t(R0,{color:X.colors.muted,children:["• ",a]},f,!0,void 0,this))]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{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"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[t(R0,{bold:!0,color:X.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),t(R0,{children:" "},void 0,!1,void 0,this),t(R0,{children:[" ","Event: ",y.event," - ",y.description]},void 0,!0,void 0,this),t(R0,{children:[" Matcher: ",_||"(all)"]},void 0,!0,void 0,this),t(R0,{children:[" Command: ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(R0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:g4.map((a,f)=>t(j0,{children:[t(R0,{color:f===q?X.colors.primary:void 0,bold:f===q,children:[f===q?"> ":" ",f+1,". ",a.name]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" ",a.description]},void 0,!0,void 0,this)]},a.location,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{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"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.success,paddingX:2,paddingY:1,children:[t(R0,{bold:!0,children:["Saving hook to ",S.description,"..."]},void 0,!0,void 0,this),t(R0,{children:" "},void 0,!1,void 0,this),t(R0,{children:["Event: ",y.event]},void 0,!0,void 0,this),t(R0,{children:["Matcher: ",_||"(all tools)"]},void 0,!0,void 0,this),t(R0,{children:["Command: ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{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),b&&t(j0,{marginTop:1,children:t(R0,{color:X.colors.error,children:b},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as C5}from"ahooks";import{Box as eU,Text as $G}from"ink";import JG from"react";import{useMemoizedFn as x4}from"ahooks";import W2 from"chalk";import{Text as oU}from"ink";import{useEffect as b5,useRef as M8}from"react";var p4={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var H2="\x1B",EU=`${H2}[200~`,hU=`${H2}[201~`,gU="[200~",mU="[201~",pU=[`${H2}[I`,`${H2}[O`,"[I","[O"],K5=`${H2}[?2004h`,z5=`${H2}[?2004l`,W9=`${H2}[?1004l`,xU=[EU,gU],cU=[hU,mU];function q5(){return{pasteBuffer:null,pasteOverflowed:!1}}function U5($,J){let Y;for(let Z of J){let X=$.indexOf(Z);if(X===-1)continue;if(!Y||X<Y.index||X===Y.index&&Z.length>Y.marker.length)Y={index:X,marker:Z}}return Y}function G5($){return pU.some((J)=>$===J)}function _5($,J){let Y=J,Z=$.pasteBuffer,X=$.pasteOverflowed,Q=Z!==null,U=[];while(Y.length>0){if(Z!==null){let K=U5(Y,cU);if(!K){if(Z.length+Y.length>H9)Z="",X=!0;else if(!X)Z+=Y;Y="";break}if(Z.length+K.index>H9)X=!0;else if(!X)Z+=Y.slice(0,K.index),U.push({kind:"paste",text:Z});Z=null,X=!1,Q=!0,Y=Y.slice(K.index+K.marker.length);continue}let G=U5(Y,xU);if(!G){if(G5(Y))Q=!0;else U.push({kind:"text",text:Y});Y="";break}let z=Y.slice(0,G.index);if(z&&!G5(z))U.push({kind:"text",text:z});Z="",X=!1,Q=!0,Y=Y.slice(G.index+G.marker.length)}if(J.length===0&&Z!==null)Q=!0;return{handled:Q,state:{pasteBuffer:Z,pasteOverflowed:X},segments:U}}function O5($){return typeof $==="string"&&/^[0-9a-f]{32}$/.test($)}function uU($){if(!O5($))throw Error("TUI composer ready nonce must be 32 lowercase hexadecimal chars");return`\x1B]99;blade-composer-ready=${$}\x07`}function dU($=process.env){let J=$.BLADE_TUI_COMPOSER_READY_NONCE;if(!O5(J))return;return uU(J)}function N5($=process.env,J=(Y)=>process.stdout.write(Y)){let Y=dU($);if(!Y)return!1;return J(Y),!0}import{execSync as e2}from"node:child_process";import{existsSync as lU,readFileSync as F9}from"node:fs";import{basename as H5,isAbsolute as rU}from"node:path";function W5($){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 F5(){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"},Y={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(Z)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${Z}" 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:(Z)=>`rm -f "${Z}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(Z)=>`xclip -selection clipboard -t image/png -o > "${Z}" || wl-paste --type image/png > "${Z}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(Z)=>`rm -f "${Z}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(Z)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${Z.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(Z)=>`del /f "${Z}"`}};return{commands:Y[$]||Y.linux,screenshotPath:J[$]||J.linux}}function aU(){let{commands:$}=F5();try{return e2($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function L5($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function B5($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function L9($){let J=L5($.trim()),Y=B5(J);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function iU($){let J=L5($.trim()),Y=B5(J);if(L9(Y))return Y;return null}async function w5($){let J=iU($);if(!J)return null;let Y;try{if(rU(J))Y=F9(J);else{let U=aU();if(U&&J===H5(U))Y=F9(U);else return null}}catch(U){return console.error("Failed to read image file:",U),null}let Z=Y.toString("base64"),X=W5(Z),Q=H5(J);return{path:J,base64:Z,mediaType:X,filename:Q}}async function P5(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=J[$]||J.linux;try{return e2(Y,{encoding:"utf-8"})||null}catch{return null}}async function A5(){let{commands:$,screenshotPath:J}=F5();try{if(e2($.checkImage,{stdio:"ignore"}),e2($.saveImage(J),{stdio:"ignore"}),!lU(J))return null;let Z=F9(J).toString("base64"),X=W5(Z);return e2($.deleteFile(J),{stdio:"ignore"}),{base64:Z,mediaType:X}}catch(Y){try{e2($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as sU}from"react/jsx-dev-runtime";var nU=/\r\n/g,tU=/\r/g;function B9($){if(!$.includes("\r"))return $;return $.replace(nU,`
152
+ `).replace(tU,`
153
+ `)}function M5($,J,Y){let Z=Math.max(0,Math.min(Y,J.length)),X=J.slice(0,Z),Q=J.slice(Z);return{newValue:X+$+Q,newCursorPosition:Z+$.length}}function T5({value:$,placeholder:J="",focus:Y=!0,onChange:Z,cursorPosition:X,onChangeCursorPosition:Q,onPaste:U,onImagePaste:G,disabledKeys:z=[]}){let K=M8(q5()),O=M8($),q=M8(X),N=M8(null),_=M8(!1);b5(()=>{O.current=$,q.current=X},[$,X]),b5(()=>{if(X>$.length)Q($.length)},[$,X,Q]);let W=x4((F,M)=>{let L=O.current,y=q.current;if(O.current=F,q.current=M,F!==L)Z(F);if(M!==y)Q(M)}),H=x4((F)=>{if(!F)return;let{newValue:M,newCursorPosition:L}=M5(B9(F),O.current,q.current);W(M,L)}),A=x4(async(F)=>{let M=B9(F);if(!M)return;if(G&&L9(M))try{let y=await w5(M);if(y){let S=await G(y.base64,y.mediaType,y.filename);if(S?.prompt)H(S.prompt);return}}catch(y){console.error("Failed to process image path:",y)}if((M.length>p4.LARGE_INPUT_THRESHOLD||M.includes(`
154
+ `))&&U){let y=await U(M);if(y?.prompt){H(y.prompt);return}}H(M)}),b=x4((F)=>{let M=N.current;if(!M){try{let y=F();if(!y)return;let S=y.catch(()=>{return});N.current=S,S.finally(()=>{if(N.current===S)N.current=null})}catch{}return}let L=M.then(F).then(()=>{return}).catch(()=>{return});N.current=L,L.finally(()=>{if(N.current===L)N.current=null})});O0((F,M)=>{return b(()=>{let L=B9(F),y=_5(K.current,L);if(K.current=y.state,y.handled)return(async()=>{for(let o of y.segments)if(o.kind==="paste")await A(o.text);else H(o.text)})();if(z.some((o)=>M[o])||M.ctrl&&F==="c"||M.ctrl&&F==="l"||M.ctrl&&F==="t"||M.ctrl&&F==="o"||M.meta&&F==="l"||M.meta&&F==="t"||M.meta&&F==="o"||M.shift&&M.tab||L==="?"&&O.current==="")return;let T=O.current,R=q.current,P=R,j=T;if(M.leftArrow)P--;else if(M.rightArrow)P++;else if(M.backspace||M.delete){if(F===""){if(R>0)j=T.slice(0,R-1)+T.slice(R,T.length),P--}else if(R<T.length)j=T.slice(0,R)+T.slice(R+1,T.length)}else if(M.ctrl&&L==="a")P=0;else if(M.ctrl&&L==="e")P=T.length;else if(M.ctrl&&L==="k")j=T.slice(0,R);else if(M.ctrl&&L==="u")j=T.slice(R),P=0;else if(M.ctrl&&L==="w"){let u=T.slice(0,R).match(/\s*\S+\s*$/);if(u){let J0=u[0].length;j=T.slice(0,R-J0)+T.slice(R),P-=J0}}else if(M.ctrl&&L==="v"){let o=process.platform==="darwin";return(async()=>{if(G){let J0=await A5();if(J0){let K0=await G(J0.base64,J0.mediaType,"clipboard.png");if(K0?.prompt)H(K0.prompt);return}}if(o)return;let u=await P5();if(u)await A(u)})()}else if(M.pageUp)P=0;else if(M.pageDown)P=T.length;else if(L===`
155
+ `&&(M.shift||M.meta)){let{newValue:o,newCursorPosition:u}=M5(L,T,R);W(o,u);return}else if(!M.ctrl&&!M.meta){if(U&&(L.length>p4.LARGE_INPUT_THRESHOLD||L.includes(`
156
+ `)))return A(L);j=T.slice(0,R)+L+T.slice(R,T.length),P+=L.length}if(P<0)P=0;if(P>j.length)P=j.length;W(j,P)}),!0},{isActive:Y,priority:0,onRegistered:()=>{if(_.current)return;_.current=N5()}});let w=Y,B=$,C=J?W2.grey(J):void 0;if(w)if(C=J.length>0?W2.inverse(J[0])+W2.grey(J.slice(1)):W2.inverse(" "),$.length===0)B=W2.inverse(" ");else{B="";for(let F=0;F<$.length;F++)if(F===X&&X<$.length)B+=W2.inverse($[F]);else B+=$[F];if(X>=$.length)B+=W2.inverse(" ")}return sU(oU,{children:J?$.length>0?B:C:B},void 0,!1,void 0,this)}import{jsxDEV as w9}from"react/jsx-dev-runtime";var R5=JG.memo(({input:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:Z,onAddPasteMapping:X,onAddImagePasteMapping:Q,disabled:U=!1})=>{let z=s0()==="main-input"&&!U,K=$.trimStart().startsWith("!"),O=C5((N)=>{let _=N.split(`
157
+ `).length,W=N.length,H=500,A=10;if(W>500||_>10){let b=X(N),w=N.slice(0,30).replace(/\n/g," "),B=`${W} chars, ${_} lines: ${w}...`;return{prompt:`${w4(b)}${B}${R6()}`}}return{}}),q=C5(async(N,_,W)=>{try{let H=Q(N,_);return{prompt:`${w4(H)}[Image #${H}]${R6()}`}}catch(H){return console.error("[Image Paste] Failed to process image:",H),{prompt:`[Image paste failed: ${H instanceof Error?H.message:"Unknown error"}] `}}});return w9(eU,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[w9($G,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),w9(T5,{value:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:Z,onPaste:O,onImagePaste:q,placeholder:" 输入命令...",focus:z,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as $8,Text as f$}from"ink";import _G,{useEffect as f5,useState as v5}from"react";import{useEffect as GG,useRef as KG,useState as zG}from"react";import{useEffect as XG,useRef as ZG,useState as QG}from"react";var T8={loading:["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],tips:["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 临时切换模型"]};var UG=15000,y5="等待用户确认...";function I5(){if(Math.random()<0.25){let Y=Math.floor(Math.random()*T8.tips.length);return T8.tips[Y]}let J=Math.floor(Math.random()*T8.loading.length);return T8.loading[J]}function S5($,J,Y=!1){let[Z,X]=QG(""),Q=ZG(Y);return Q.current=Y,XG(()=>{if(J){X(y5);return}if(!$){X("");return}X((G)=>G===""||G===y5?I5():G);let U=setInterval(()=>{if(!Q.current)X(I5())},UG);return()=>{clearInterval(U)}},[$,J]),Z}function k5($,J=!1,Y=!1){let[Z,X]=zG(0),Q=KG(null),U=S5($,J,Y);return GG(()=>{if(!$){X(0),Q.current=null;return}if(Y)return;if(Q.current===null)Q.current=Date.now();let G=setInterval(()=>{if(Q.current!==null){let z=Math.floor((Date.now()-Q.current)/1000);X(z)}},1000);return()=>{clearInterval(G)}},[$,Y]),{currentPhrase:U,elapsedTime:Z}}function qG($){let J=Math.max(0,Math.floor($/1000));if(J<60)return`${J}s`;let Y=Math.floor(J/60),Z=J%60;if(Y<60)return`${Y}m ${Z}s`;return`${Math.floor(Y/60)}h ${Y%60}m ${Z}s`}function D5($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let Z=Y.activeTools.length+Y.activeToolOverflow,X=Y.phase==="starting"?"正在启动任务":Y.phase==="thinking"?"正在思考":Y.phase==="responding"?"正在生成回复":Y.phase==="compacting"?"正在压缩上下文":Y.phase==="continuing"?"正在推进下一步":`正在执行 ${Z} 个工具`,Q=Y.activeTools.slice(0,2).map((K)=>K.progress!==void 0&&K.total!==void 0?`${K.name} ${K.progress}/${K.total}`:K.name),U=Math.max(0,Y.activeTools.length-Q.length+Y.activeToolOverflow);if(U>0)Q.push(`+${U}`);let G=[...Q,Y.toolCallsStarted>0?`工具 ${Y.toolCallsCompleted}/${Y.toolCallsStarted}`:void 0,Y.turn>0?`回合 ${Y.turn}${Y.maxTurns===null?"":`/${Y.maxTurns}`}`:void 0].filter((K)=>K!==void 0),z=qG(J-Y.startedAt);return{primary:X,secondary:G.join(" · "),compact:Y.phase==="executing_tools"?`执行工具 · ${Z} 个 · ${z}`:`${X} · ${z}`,elapsed:z}}import{jsxDEV as q$,Fragment as NG}from"react/jsx-dev-runtime";var P9=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],OG=80;function V5($){if($<60)return`${$}s`;let J=Math.floor($/60),Y=$%60;return`${J}m ${Y}s`}var j5=_G.memo(({message:$,paused:J=!1})=>{let Y=g2(),Z=g8(),X=E8(),Q=e9(),U=$J(),G=Y||!Z,[z,K]=v5(0),[O,q]=v5(Date.now()),N=D0(),W=d2()>=OG,{currentPhrase:H,elapsedTime:A}=k5(G,!1,J);if(f5(()=>{if(!G||J){K(0);return}let F=setInterval(()=>{K((M)=>(M+1)%P9.length)},150);return()=>clearInterval(F)},[G,J]),f5(()=>{if(!X?.snapshot?.nextActionAt&&!Q?.snapshot||J)return;q(Date.now());let F=setInterval(()=>q(Date.now()),1000);return()=>clearInterval(F)},[J,X?.snapshot?.nextActionAt,Q?.snapshot]),!G)return null;let b=D4(X,O),w=D5(Q,O),C=(U?.phase==="detected"?`检测到 ${U.toolName} 连续 ${U.runLength} 次无进展,正在要求 Agent 切换策略`:U?.phase==="halted"?`已停止 ${U.toolName} 空转循环`:null)||b?.primary||w?.primary||$||H||"正在思考中...";if(W)return q$($8,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.warning,bold:!0,children:P9[z]},void 0,!1,void 0,this),q$(f$,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this),b?.secondary&&q$(f$,{color:N.colors.info,children:b.secondary},void 0,!1,void 0,this),!b?.secondary&&w?.secondary&&q$(f$,{color:N.colors.info,children:w.secondary},void 0,!1,void 0,this),(w||A>0)&&q$(NG,{children:[q$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),q$(f$,{color:N.colors.info,children:["已用时:"," ",w?.elapsed??V5(A)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),q$(f$,{color:N.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return q$($8,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[q$($8,{flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.warning,bold:!0,children:P9[z]},void 0,!1,void 0,this),q$(f$,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b?.secondary&&q$($8,{marginLeft:2,children:q$(f$,{color:N.colors.info,children:b.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),!b?.secondary&&w?.secondary&&q$($8,{marginLeft:2,children:q$(f$,{color:N.colors.info,children:w.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),(w||A>0)&&q$($8,{marginLeft:2,flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.info,children:["已用时: ",w?.elapsed??V5(A)]},void 0,!0,void 0,this),q$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),q$(f$,{color:N.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 d4,Text as J$,useStdout as HG}from"ink";import WG from"ink-text-input";import FG,{useCallback as c4,useEffect as LG,useMemo as BG,useState as F2}from"react";import{jsxDEV as f0}from"react/jsx-dev-runtime";var m5=FG.memo(({details:$,onComplete:J})=>{let{stdout:Y}=HG(),Z=Y.columns||80,X=s0()==="confirmation-prompt",Q=e0(!1),U=$.fields??[],[G,z]=F2("field"),[K,O]=F2(0),[q,N]=F2(()=>E5($)),[_,W]=F2(""),[H,A]=F2(0),[b,w]=F2([]),[B,C]=F2(),F=U[K],M=BG(()=>wG(F),[F]);LG(()=>{if(!F)return;let R=q[F.name];W(typeof R==="string"||typeof R==="number"?String(R):""),w(Array.isArray(R)?[...R]:[]);let P=M.findIndex((j)=>j.value===String(R));A(P>=0?P:0),C(void 0)},[q,F,M]);let L=c4((R)=>{if(N(R),K<U.length-1){O((P)=>P+1);return}z("review")},[K,U.length]),y=c4((R)=>{if(!F)return;let P={...q};if(R===void 0)delete P[F.name];else P[F.name]=R;L(P)},[q,F,L]),S=c4((R)=>{if(!F)return;try{y(h5(F,R))}catch(P){C(P instanceof Error?P.message:String(P))}},[F,y]),T=c4(()=>{try{let R=g5($,{action:"accept",content:q});J({action:R.action,...R.content?{content:R.content}:{}})}catch(R){C(R instanceof Error?R.message:String(R))}},[q,$,J]);if(O0((R,P)=>{if(P.ctrl&&R==="c"||P.meta&&R==="c"){Q();return}if(P.escape){J({action:"cancel"});return}if($.mode==="url"){if(R.toLowerCase()==="y")J({action:"accept"},!0);else if(R.toLowerCase()==="n")J({action:"decline"});return}if(G==="review"){if(R.toLowerCase()==="y"||P.return)T();else if(R.toLowerCase()==="e")O(0),z("field");else if(R.toLowerCase()==="d")J({action:"decline"});return}if(!F){if(P.return)T();return}if(A9(F))return;if(R.toLowerCase()==="d"){J({action:"decline"});return}if(P.upArrow){A((j)=>j>0?j-1:Math.max(M.length-1,0));return}if(P.downArrow||P.tab){A((j)=>j<M.length-1?j+1:0);return}if(R===" "&&F.type==="multi-select"){let j=M[H];if(j)w((o)=>o.includes(j.value)?o.filter((u)=>u!==j.value):[...o,j.value]);return}if(P.return)if(F.type==="multi-select")y(b);else{let j=M[H];if(j)y(j.typedValue)}},{isActive:X}),$.mode==="url")return f0(u4,{width:Z,color:"yellow",children:[f0(J$,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),f0(J$,{children:$.message},void 0,!1,void 0,this),f0(J$,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),f0(J$,{children:["Domain: ",f0(J$,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0(J$,{wrap:"wrap",children:["URL: ",f0(J$,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0(J$,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(G==="review")return f0(u4,{width:Z,color:"green",children:[f0(J$,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),f0(J$,{children:$.message},void 0,!1,void 0,this),U.map((R)=>f0(J$,{children:[R.title,": ",AG(q[R.name])]},R.name,!0,void 0,this)),B&&f0(J$,{color:"red",children:B},void 0,!1,void 0,this),f0(J$,{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 f0(u4,{width:Z,color:"cyan",children:[f0(J$,{children:$.message},void 0,!1,void 0,this),f0(J$,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),f0(J$,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return f0(u4,{width:Z,color:"cyan",children:[f0(J$,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),f0(J$,{children:$.message},void 0,!1,void 0,this),f0(d4,{flexDirection:"column",marginTop:1,children:[f0(J$,{bold:!0,children:[F.title,F.required?" *":""]},void 0,!0,void 0,this),F.description&&f0(J$,{color:"gray",children:F.description},void 0,!1,void 0,this),f0(J$,{color:"gray",children:PG(F)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A9(F)?f0(d4,{children:[f0(J$,{color:"cyan",children:"> "},void 0,!1,void 0,this),f0(WG,{value:_,onChange:W,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):f0(d4,{flexDirection:"column",children:M.map((R,P)=>{let j=F.type==="multi-select"&&b.includes(R.value);return f0(J$,{color:H===P?"yellow":void 0,children:[H===P?"> ":" ",F.type==="multi-select"?j?"(*) ":"( ) ":"",R.label]},R.value,!0,void 0,this)})},void 0,!1,void 0,this),B&&f0(J$,{color:"red",children:B},void 0,!1,void 0,this),f0(J$,{color:"gray",children:[A9(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),f0(J$,{color:"gray",children:["Field ",K+1," of ",U.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function u4({children:$,width:J,color:Y}){return f0(d4,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(J-4,88),children:$},void 0,!1,void 0,this)}function A9($){return $.type==="string"||$.type==="number"||$.type==="integer"}function wG($){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 PG($){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 AG($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import r4 from"ansi-escapes";import{Box as L2,Static as DG,useStdout as fG}from"ink";import vG,{useEffect as v1,useMemo as y9,useRef as o1,useState as I9}from"react";import{Box as bG,Text as p5}from"ink";import MG from"react";import{jsxDEV as b9}from"react/jsx-dev-runtime";var M9=MG.memo(({collapsedCount:$})=>{let J=D0();if($<=0)return null;let Y=J.colors.text.muted;return b9(bG,{flexDirection:"row",marginBottom:1,children:[b9(p5,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),b9(p5,{color:Y,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});M9.displayName="CollapsedHistorySummary";import{Box as C8,Text as R8}from"ink";import TG from"ink-big-text";import CG from"ink-gradient";import RG from"react";import{jsxDEV as s$}from"react/jsx-dev-runtime";var c5=RG.memo(()=>{return s$(C8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[s$(C8,{flexDirection:"column",children:s$(CG,{name:"pastel",children:s$(TG,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),s$(C8,{marginBottom:1,children:s$(R8,{color:"white",dimColor:!0,children:x5()},void 0,!1,void 0,this)},void 0,!1,void 0,this),s$(C8,{flexDirection:"column",marginBottom:1,children:[s$(C8,{marginBottom:1,children:s$(R8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s$(R8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),s$(R8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),s$(R8,{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 l4,Text as T9}from"ink";import u5 from"react";import{jsxDEV as i1}from"react/jsx-dev-runtime";var d5=u5.memo(({tasks:$,visible:J=!0,compact:Y=!1})=>{let{colors:Z}=D0();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 i1(l4,{flexDirection:"column",borderStyle:"single",borderColor:Z.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[i1(l4,{marginBottom:Y?0:1,children:[i1(T9,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),i1(T9,{color:Z.text.muted,children:[X.completed,"/",X.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),i1(l4,{flexDirection:"column",children:$.map((Q,U)=>i1(yG,{task:Q,compact:Y},Q.id||U,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),yG=u5.memo(({task:$,compact:J})=>{let Y,Z=!1,X;switch($.status){case"completed":Y="[OK]",Z=!0,X=$.subject;break;case"in_progress":Y=">",Z=!1,X=$.activeForm||$.subject;break;case"pending":default:Y="-",Z=!0,X=$.subject;break}return i1(l4,{paddingY:J?0:0,children:i1(T9,{dimColor:Z,children:[Y," ",X]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as C9,Text as J8}from"ink";import IG,{useMemo as l5}from"react";import{jsxDEV as f1}from"react/jsx-dev-runtime";function SG($,J=60){if(!$)return"";let Y=$.split(`
158
158
  `)[0]||"";if(Y.length<=J)return Y;return`${Y.slice(0,J)}...`}function kG($){if(!$)return 0;return $.split(`
159
- `).length}var C9=IG.memo(({content:$,isStreaming:J=!1,isExpanded:Y})=>{let Z=D0(),X=r5(()=>kG($),[$]),Q=r5(()=>SG($),[$]),U=Z.colors.info,G=Z.colors.muted;return f1(T9,{flexDirection:"column",marginBottom:1,children:[f1(T9,{flexDirection:"row",children:[f1(J8,{color:U,children:Y?"v":">"},void 0,!1,void 0,this),f1(J8,{children:" "},void 0,!1,void 0,this),f1(J8,{color:G,children:["Thinking",J?"...":` (${X} lines)`]},void 0,!0,void 0,this),!Y&&!J&&Q&&f1(J8,{color:G,children:[" - ",Q]},void 0,!0,void 0,this),f1(J8,{color:G,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&f1(T9,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:f1(J8,{color:G,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});C9.displayName="ThinkingBlock";import{jsxDEV as v$}from"react/jsx-dev-runtime";var VG=({active:$=!0})=>{let J=V8(),Y=a8(),Z=i8(),X=wJ(),Q=g2(),U=XJ(),G=qJ(),z=r8(),K=BJ(),O=i9(),q=AJ(),N=PJ(),{width:_,height:W}=r1(),{stdout:H}=fG(),A=d1(),[b,w]=y9(null),[B,C]=y9([]),[F,M]=y9(new Set),L=o1(N),y=o1(null),S=o1(0),T=o1(0),R=o1(new Set),P=o1(new Set),j=o1([]),o=o1(null);v1(()=>{if(L.current!==N){if(L.current=N,!$)return;if(Z1())o$();if(H)H.write(l4.clearTerminal);A.incrementClearCount()}},[$,N,H,A]);let u=J,J0=X;v1(()=>{if(!X||Q){o.current=null;return}if(o.current===X)return;if(o.current=X,Z1())o$();if($&&H)H.write(l4.eraseScreen+l4.cursorTo(0,0));R.current=new Set,P.current=new Set(u.filter((V)=>V.role==="tool").map((V)=>V.id)),y.current=null,S.current=0,T.current=0,j.current=[],C([]),M(new Set),A.incrementClearCount(),A.clearFinalizingStreamingMessageId()},[X,Q,H,A,u,$]);let K0=Y??X;v1(()=>{if($&&Z1())o$();y.current=null,S.current=0,T.current=0,R.current=new Set,P.current=new Set(u.filter((V)=>V.role==="tool").map((V)=>V.id)),j.current=[],C([]),M(new Set)},[O]),v1(()=>{if(!K0)return;if(y.current===K0)return;y.current=K0,S.current=0,T.current=0,P.current=new Set(u.filter((V)=>V.role==="tool").map((V)=>V.id)),j.current=[],C([])},[K0,O]),v1(()=>{if(!K0)return;let V=I9(K0);if(!V||V.length<=S.current)return;let x=V.slice(S.current);S.current=V.length;let l=x,H0=j.current;if(H0.length>0)if(l.some((D)=>D.type!=="empty"))l=[...H0,...l],j.current=[];else{j.current=[...H0,...l];return}let F0=l.length;while(F0>0&&l[F0-1].type==="empty")F0-=1;if(F0!==l.length)j.current=l.slice(F0),l=l.slice(0,F0);if(l.length===0)return;let T0=T.current;T.current+=1;let I=T0>0;if(Z1())o$();M((D)=>{if(!K0||D.has(K0))return D;let p=new Set(D);return p.add(K0),p}),C((D)=>[...D,v$(L2,{flexDirection:"column",children:v$(k1,{content:"",role:"assistant",terminalWidth:_,isPending:!1,hidePrefix:I,noMargin:!0,blocksOverride:l,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${K0}-${T0}`,!1,void 0,this)])},[K0,Z.version,_,O,$]),v1(()=>{if(!K0)return;let V=P.current,x=u.filter((l)=>l.role==="tool"&&!V.has(l.id)&&!R.current.has(l.id));if(x.length===0)return;if($&&Z1())o$();for(let l of x)R.current.add(l.id);C((l)=>[...l,...x.map((H0)=>v$(L2,{flexDirection:"column",children:v$(k1,{content:H0.content,role:H0.role,terminalWidth:_,metadata:H0.metadata,isPending:!1,messageId:H0.id},void 0,!1,void 0,this)},`streaming-tool-${H0.id}`,!1,void 0,this))])},[$,K0,u,_]),v1(()=>{if(!$){if(Z1())o$();return}if(!K0){if(Z1())o$();return}if(!Z1())K3(_,W);else z3(_,W);let V=a5(K0);if(!V||V.lines.length===0)return;let l=Math.max(1,W-8),H0=Math.max(0,V.lines.length-l),F0=V.lines.slice(-l),T0=(I9(K0)?.length??0)>0;q3(F0,H0,V.mode,T0)},[K0,Z.version,W,_,$]),v1(()=>{if(!K0&&Z1())o$()},[K0]),v1(()=>{if(b===null&&u.length>q){if(w(u.length),$&&Z1())o$();if($&&H)H.write(l4.clearTerminal);A.incrementClearCount()}},[u.length,q,b,H,A,$]);let q0=R9(()=>{return U.some((V)=>V.status==="pending"||V.status==="in_progress")},[U]),a=N?0:b??0,f=a,v=R9(()=>{let V=[];if(V.push(v$(u5,{},"header",!1,void 0,this)),f>0)V.push(v$(b9,{collapsedCount:f},"collapsed-summary",!1,void 0,this));for(let x=a;x<u.length;x++){let l=u[x];if(J0&&l.id===J0)continue;if(l.role==="tool"&&R.current.has(l.id))continue;if(l.role==="assistant"&&F.has(l.id))continue;V.push(v$(L2,{flexDirection:"column",children:v$(k1,{content:l.content,role:l.role,terminalWidth:_,metadata:l.metadata,isPending:!1,messageId:l.id},void 0,!1,void 0,this)},l.id,!1,void 0,this))}return V},[u,a,f,_,J0,F]),G0=R9(()=>B.length>0?[...v,...B]:v,[v,B]);return v$(L2,{flexDirection:"column",paddingX:2,children:v$(L2,{flexDirection:"column",children:[v$(DG,{items:G0,children:(V)=>V},O,!1,void 0,this),z&&v$(L2,{marginBottom:1,children:v$(C9,{content:z,isStreaming:Q,isExpanded:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&q0&&v$(L2,{marginTop:1,children:v$(l5,{tasks:U,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},i5=vG.memo(VG);import{useMemoizedFn as r4,useMount as jG}from"ahooks";import{Box as e$,Text as v0,useFocus as hG,useFocusManager as EG}from"ink";import gG from"ink-select-input";import{memo as mG,useMemo as pG,useState as a4}from"react";import{jsxDEV as L0,Fragment as uG}from"react/jsx-dev-runtime";var xG=({isSelected:$})=>L0(e$,{marginRight:1,children:L0(v0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),cG=({isSelected:$,label:J})=>L0(v0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),o5=mG(({onClose:$,onEdit:J})=>{let Y=_J(),Z=m8()??"",{isFocused:X}=hG({id:"model-selector"}),Q=EG(),[U,G]=a4(""),[z,K]=a4(!1),[O,q]=a4(null),N=e0(!1),[_]=a4(()=>{let L=process.stdout?.columns||80;return Math.max(20,L-8)});jG(()=>{if(Q?.focus("model-selector"),Y.length>0)G(Y[0].id)}),O0((L,y)=>{if(z)return;if(y.ctrl&&L==="c"||y.meta&&L==="c"){N();return}if(y.escape){$();return}if(!X)return;if(L==="d"||L==="D"){H();return}if((L==="e"||L==="E")&&J)A()},{isActive:!0});let W=r4(async(L)=>{if(z)return;let y=L.value;if(y===Z){$();return}K(!0),q(null);try{await z$().setCurrentModel(y),$()}catch(S){q(S.message),K(!1)}}),H=r4(async()=>{if(z||U===Z)return;K(!0),q(null);try{if(await z$().removeModel(U),Y.length<=1)$()}catch(L){q(L.message)}finally{K(!1)}}),A=r4(()=>{if(z||!J)return;let L=Y.find((y)=>y.id===U);if(!L)return;J(L)}),b=r4((L)=>{G(L.value)}),w=pG(()=>{return Y.find((L)=>L.id===U)},[Y,U]),B=w?i4()?.modelProviders[w.provider]:void 0,C=Y.map((L)=>{let y=L.id===Z?" (当前)":"";return{label:S9(L)+y,value:L.id}}),F=U===Z;return L0(e$,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[L0(e$,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[L0(v0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),L0(v0,{dimColor:!0,children:[z?"处理中...":F?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L0(e$,{flexDirection:"row",children:[L0(e$,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[L0(v0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),L0(e$,{marginTop:1,children:L0(gG,{items:C,onSelect:W,onHighlight:b,indicatorComponent:xG,itemComponent:cG},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(e$,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[L0(v0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),L0(e$,{marginY:1,children:L0(v0,{color:F?"green":"yellow",children:F?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w?L0(e$,{flexDirection:"column",children:[L0(v0,{children:[L0(v0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),L0(v0,{bold:!0,color:"cyan",children:S9(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),L0(v0,{bold:!0,children:B?.name??w.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B&&L0(uG,{children:[L0(v0,{children:[L0(v0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),L0(v0,{children:w.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),L0(v0,{children:B.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),L0(v0,{color:"blueBright",children:B.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),L0(v0,{bold:!0,children:w.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w.overrides?.baseUrl&&L0(v0,{children:[L0(v0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),L0(v0,{color:"blueBright",children:w.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),L0(v0,{children:R1().resolveConfig(w).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):L0(v0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),O&&L0(e$,{marginTop:1,children:L0(v0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(e$,{justifyContent:"center",marginTop:1,children:L0(v0,{dimColor:!0,children:"─".repeat(_)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(e$,{justifyContent:"center",children:L0(v0,{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 k9}from"ahooks";import{Box as UK,Text as D9}from"ink";import{useState as P2}from"react";import{Box as B2,Text as V1}from"ink";import dG from"ink-text-input";import{jsxDEV as P$}from"react/jsx-dev-runtime";var n5=({provider:$,value:J,onChange:Y,onSubmit:Z,onCancel:X,error:Q})=>{return O0((U,G)=>{if(G.escape)X()}),P$(B2,{flexDirection:"column",children:[P$(B2,{marginBottom:1,children:P$(V1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(B2,{marginBottom:1,children:P$(V1,{children:["Provider: ",P$(V1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P$(B2,{marginBottom:1,children:P$(V1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(B2,{children:[P$(V1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),P$(dG,{value:J,onChange:Y,onSubmit:Z,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&P$(B2,{marginTop:1,children:P$(V1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(B2,{marginTop:1,children:P$(V1,{dimColor:!0,children:["输入完成后按 ",P$(V1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",P$(V1,{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 o4,Text as n1}from"ink";import lG from"ink-text-input";import{useState as n4}from"react";import{jsxDEV as c$}from"react/jsx-dev-runtime";var t4=["id","name","baseUrl","model"];function t5($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function rG($,J,Y){switch($){case"id":return"team-gateway";case"name":return Y||"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 aG($,J){let Y=$.id.trim(),Z={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:J},X=e5(Y,Z);if(!$.model.trim())X.push("Model ID must not be empty");if(X.length>0)throw Error(X[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:Z}}var $X=({wireApi:$,initialConfig:J,onSubmit:Y,onCancel:Z})=>{let X={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,U]=n4(J?3:0),[G,z]=n4(J?.model??""),[K,O]=n4(X),[q,N]=n4(),_=t4[Q];O0((H,A)=>{if(!A.escape)return;if(N(void 0),Q===0){Z();return}let b=Q-1,w=t4[b];U(b),z(K[w])});let W=(H)=>{let A=H.trim();if(_==="id"&&!s5.test(A)){N("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(_==="baseUrl")try{let w=new URL(A);if(!["http:","https:"].includes(w.protocol))throw Error()}catch{N("Base URL 必须是绝对 HTTP(S) URL");return}if(_==="model"&&!A){N("Model ID 不能为空");return}let b={...K,[_]:_==="name"&&!A?K.id:A};if(O(b),N(void 0),Q===t4.length-1){try{Y(aG(b,$))}catch(w){N(w instanceof Error?w.message:"渠道配置无效")}return}U(Q+1),z("")};return c$(o4,{flexDirection:"column",children:[c$(o4,{marginBottom:1,children:c$(n1,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c$(n1,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),t4.slice(0,Q).map((H)=>c$(n1,{children:[t5(H),": ",c$(n1,{color:"cyan",children:K[H]},void 0,!1,void 0,this)]},H,!0,void 0,this)),c$(o4,{marginTop:1,children:[c$(n1,{bold:!0,children:[t5(_),": "]},void 0,!0,void 0,this),c$(lG,{value:G,onChange:(H)=>{z(H),N(void 0)},onSubmit:W,placeholder:rG(_,$,K.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_==="name"&&c$(n1,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),q&&c$(n1,{color:"red",children:q},void 0,!1,void 0,this),c$(o4,{marginTop:1,children:c$(n1,{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 XX,useState as Y8}from"react";var ZX=()=>{let[$,J]=Y8([]),[Y,Z]=Y8(!0),[X,Q]=Y8(null);return XX(()=>{let U=!1;return(async()=>{try{let z=await JX();if(!U)J(z)}catch(z){if(!U)Q(z instanceof Error?z.message:"加载 Provider 列表失败")}finally{if(!U)Z(!1)}})(),()=>{U=!0}},[]),{providers:$,isLoading:Y,error:X}},QX=($)=>{let[J,Y]=Y8([]),[Z,X]=Y8(!1),[Q,U]=Y8(null);return XX(()=>{if(!$){Y([]),X(!1),U(null);return}let G=!1;return Y([]),X(!0),U(null),(async()=>{try{let K=await YX($);if(!G)Y(K)}catch(K){if(!G)U(K instanceof Error?K.message:"加载模型列表失败")}finally{if(!G)X(!1)}})(),()=>{G=!0}},[$]),{models:J,isLoading:Z,error:Q}};import{Box as j1,Text as K1}from"ink";import iG from"ink-select-input";import oG from"ink-text-input";import{useMemo as UX,useState as nG}from"react";import{jsxDEV as U$,Fragment as $K}from"react/jsx-dev-runtime";var tG=({isSelected:$})=>U$(j1,{marginRight:1,children:U$(K1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),sG=($)=>{let J=[$.name];if($.contextWindow){let Y=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;J.push(`[${Y} 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(" ")},eG=({isSelected:$,label:J})=>U$(K1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),GX=({provider:$,models:J,isLoading:Y,error:Z,onSelect:X,onCancel:Q})=>{let[U,G]=nG("");O0((O,q)=>{if(q.escape)if(U)G("");else Q()});let z=UX(()=>{if(!U)return J;let O=U.toLowerCase();return J.filter((q)=>q.name.toLowerCase().includes(O)||q.id.toLowerCase().includes(O))},[J,U]),K=UX(()=>z.map((O)=>({key:O.id,label:sG(O),value:O})),[z]);if(Y)return U$(j1,{flexDirection:"column",children:U$(K1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(Z)return U$(j1,{flexDirection:"column",children:[U$(K1,{color:"red",children:Z},void 0,!1,void 0,this),U$(K1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return U$(j1,{flexDirection:"column",children:[U$(j1,{marginBottom:1,children:U$(K1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),U$(j1,{marginBottom:1,children:U$(K1,{children:["Provider: ",U$(K1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),U$($K,{children:[U$(j1,{marginBottom:1,children:[U$(K1,{color:"cyan",children:"> "},void 0,!1,void 0,this),U$(oG,{value:U,onChange:G,placeholder:`搜索 ${J.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U$(j1,{marginBottom:1,children:U$(K1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),U$(j1,{flexDirection:"column",height:12,children:U$(iG,{items:K,onSelect:(O)=>X(O.value),indicatorComponent:tG,itemComponent:eG,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.length===0&&U$(K1,{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 w2,Text as t1}from"ink";import JK from"ink-select-input";import YK from"ink-text-input";import{useMemo as KX,useState as XK}from"react";import{jsxDEV as A$}from"react/jsx-dev-runtime";var ZK=({isSelected:$})=>A$(w2,{marginRight:1,children:A$(t1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),QK=({isSelected:$,label:J})=>A$(t1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),zX=({providers:$,isLoading:J,error:Y,onSelect:Z,onCancel:X})=>{let[Q,U]=XK("");O0((K,O)=>{if(O.escape)if(Q)U("");else X()});let G=KX(()=>{if(!Q)return $;let K=Q.toLowerCase();return $.filter((O)=>O.name.toLowerCase().includes(K)||O.id.toLowerCase().includes(K))},[$,Q]),z=KX(()=>G.map((K)=>({key:K.id,label:`${K.name} - ${K.modelCount} models${K.configured?" [configured]":""}`,value:K})),[G]);if(J)return A$(w2,{flexDirection:"column",children:A$(t1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return A$(w2,{flexDirection:"column",children:[A$(t1,{color:"red",children:Y},void 0,!1,void 0,this),A$(t1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return A$(w2,{flexDirection:"column",children:[A$(w2,{marginBottom:1,children:A$(t1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A$(w2,{marginBottom:1,children:[A$(t1,{color:"cyan",children:"> "},void 0,!1,void 0,this),A$(YK,{value:Q,onChange:U,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A$(w2,{flexDirection:"column",height:12,children:A$(JK,{items:z,onSelect:(K)=>Z(K.value),indicatorComponent:ZK,itemComponent:QK,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&A$(t1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function qX($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as s1}from"react/jsx-dev-runtime";var f9=({mode:$,initialConfig:J,modelId:Y,onComplete:Z,onCancel:X})=>{let[Q,U]=P2("provider"),[G,z]=P2(),[K,O]=P2(),[q,N]=P2(),[_,W]=P2(""),[H,A]=P2(),[b,w]=P2(!1),B=ZX(),C=QX(G?.id),F=e0(!1);O0((S,T)=>{if(T.ctrl&&S==="c"||T.meta&&S==="c")$==="setup"?F():X()});let M=k9(async(S)=>{if(!G)return;let T=q??(K?{provider:G.id,model:K.id,displayName:J?.displayName}:void 0);if(!T)return;w(!0),A(void 0);try{if(T.modelProvider)R1().registerModelProvider(T.provider,T.modelProvider,[T.model]);if(S?.trim())await R1().setApiKey(T.provider,S.trim());let R={displayName:T.displayName,provider:T.provider,model:T.model,overrides:T.overrides};if($==="setup")await Z(T);else if($==="add"){let P=T.modelProvider?await z$().addModelWithProvider(R,T.modelProvider):await z$().addModel(R);await z$().setCurrentModel(P.id),await Z(T)}else if(Y){if(T.modelProvider)await z$().updateModelWithProvider(Y,R,T.modelProvider);else await z$().updateModel(Y,R);await Z(T)}}catch(R){if(T.modelProvider){await R1().credentials.delete(T.provider);let P=i4();R1().configureModelProviders(P?.modelProviders??{},P?.models??[])}A(R instanceof Error?R.message:"保存配置失败"),w(!1)}}),L=k9((S)=>{if(O(S),G?.configured)M();else if(G?.supportsApiKey)U("credential");else A(`${G?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),y=k9(()=>{if(A(void 0),Q==="credential"&&q){U("custom");return}let S=qX(Q);if(S)U(S)});return s1(UK,{flexDirection:"column",padding:1,children:[s1(D9,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&s1(zX,{...B,onSelect:(S)=>{z(S),O(void 0),N(void 0),U(S.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:X},void 0,!1,void 0,this),Q==="custom"&&G?.factoryWireApi&&s1($X,{wireApi:G.factoryWireApi,initialConfig:q,onSubmit:(S)=>{N(S),U("credential")},onCancel:y},void 0,!1,void 0,this),Q==="model"&&G&&s1(GX,{provider:G,...C,onSelect:L,onCancel:y},void 0,!1,void 0,this),Q==="credential"&&G&&s1(n5,{provider:G,value:_,onChange:W,onSubmit:()=>void M(_),onCancel:y,error:H},void 0,!1,void 0,this),b&&s1(D9,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),H&&Q!=="credential"&&s1(D9,{color:"red",children:H},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as R8}from"ahooks";import{promises as HX}from"fs";import{Box as u$,Text as X$}from"ink";import _X from"ink-select-input";import GK from"ink-text-input";import KK from"os";import s4 from"path";import{useEffect as zK,useMemo as e4,useRef as qK,useState as e1}from"react";import{jsxDEV as y0}from"react/jsx-dev-runtime";var y8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],_K={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},OK={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},OX={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},NK=["project","global","local"],HK={allow:[],ask:[],deny:[]},WK={localExists:!1,projectExists:!1,globalExists:!1},NX={allow:[],ask:[],deny:[]};function FK($){let J=(Z)=>Array.isArray(Z)?Z.filter((X)=>typeof X==="string"):[],Y=$?.permissions??{};return{allow:J(Y?.allow),ask:J(Y?.ask),deny:J(Y?.deny)}}async function LK($){try{let J=await HX.readFile($,"utf-8"),Y=JSON.parse(J);return{exists:!0,raw:Y,permissions:FK(Y)}}catch(J){if(J.code==="ENOENT")return{exists:!1,raw:{},permissions:{...NX}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,J),{exists:!0,raw:{},permissions:{...NX}}}}function BK($,J){let Y=$.padEnd(32," "),Z=J==="local"?`${OX[J]} <- 可删除`:OX[J];return`${Y} ${Z}`}var WX=({onClose:$})=>{let Y=s0()==="permissions-manager",Z=e0(!1),[X,Q]=e1(0),U=y8[X].key,[G,z]=e1(HK),[K,O]=e1(WK),[q,N]=e1(!0),[_,W]=e1("list"),[H,A]=e1(""),[b,w]=e1(null),[B,C]=e1(null),F=qK(!1),M=e4(()=>s4.join(K$(),".blade","settings.local.json"),[]),L=e4(()=>s4.join(K$(),".blade","settings.json"),[]),y=e4(()=>s4.join(KK.homedir(),".blade","settings.json"),[]),S=R8(async()=>{N(!0);let V=await Promise.all([{source:"local",path:M},{source:"project",path:L},{source:"global",path:y}].map(async({source:F0,path:T0})=>{let I=await LK(T0);return{source:F0,path:T0,...I}})),x={localExists:V.find((F0)=>F0.source==="local")?.exists??!1,projectExists:V.find((F0)=>F0.source==="project")?.exists??!1,globalExists:V.find((F0)=>F0.source==="global")?.exists??!1};O(x);let l={allow:[],ask:[],deny:[]},H0=Object.fromEntries(V.map((F0)=>[F0.source,F0]));["allow","ask","deny"].forEach((F0)=>{NK.forEach((T0)=>{(H0[T0]?.permissions[F0]??[]).forEach((D,p)=>{let E={key:`${T0}:${p}:${D}`,rule:D,source:T0};l[F0].push(E)})})}),z(l),N(!1)});zK(()=>{S()},[S]);let T=R8(async(G0,V)=>{try{let x=s4.join(K$(),".blade","settings.local.json"),l={allow:[],ask:[],deny:[]};try{let F0=await HX.readFile(x,"utf-8"),I=JSON.parse(F0).permissions||{};l={allow:Array.isArray(I.allow)?I.allow:[],ask:Array.isArray(I.ask)?I.ask:[],deny:Array.isArray(I.deny)?I.deny:[]}}catch(F0){}let H0=V(l);await z$().updateConfig({permissions:H0},{scope:"local",immediate:!0}),await S()}catch(x){throw console.error("[PermissionsManager] 修改权限规则失败:",x),x}});O0((G0,V)=>{if(V.ctrl&&G0==="c"||V.meta&&G0==="c"){Z();return}if(_==="locked"){if(F.current){F.current=!1;return}W("list"),w(null),C(null);return}if(V.escape){if(_==="list"||U==="info")$();else W("list"),A(""),w(null),C(null);return}if(_==="list"){if(V.tab&&V.shift)Q((x)=>(x-1+y8.length)%y8.length);else if(V.tab)Q((x)=>(x+1)%y8.length);else if(G0?.toLowerCase()==="q")$()}},{isActive:Y});let R=R8((G0)=>{let V=G0.value;if(U==="info")return;if(V.type==="add"){W("add"),A(""),C(null);return}if(V.entry.source!=="local"){W("locked"),F.current=!0,w({tab:U,entry:V.entry}),C({type:"error",text:V.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}W("confirm-delete"),w({tab:U,entry:V.entry}),C(null)}),P=R8(async()=>{if(U==="info")return;let G0=H.trim();if(!G0){C({type:"error",text:"Permission rule 不能为空"});return}if(G[U].map((x)=>x.rule).includes(G0)){C({type:"error",text:"该规则已存在"});return}try{await T(U,(x)=>{let l={allow:[...x.allow],ask:[...x.ask],deny:[...x.deny]};return l[U]=[...new Set([...x[U],G0])],l}),W("list"),A(""),C({type:"success",text:"已添加本地权限规则"})}catch(x){C({type:"error",text:`保存失败: ${x instanceof Error?x.message:"未知错误"}`})}}),j=R8(async()=>{if(!b)return;let{tab:G0,entry:V}=b;try{await T(G0,(x)=>{let l={allow:[...x.allow],ask:[...x.ask],deny:[...x.deny]};return l[G0]=x[G0].filter((H0)=>H0!==V.rule),l}),W("list"),w(null),C({type:"success",text:"已删除本地权限规则"})}catch(x){C({type:"error",text:`删除失败: ${x instanceof Error?x.message:"未知错误"}`})}}),o=e4(()=>{if(U==="info")return[];let G0=U;return[{key:"add-new-rule",label:`› ${_K[G0]}`,value:{type:"add"}},...G[G0].map((x)=>({key:x.key,label:BK(x.rule,x.source),value:{type:"rule",entry:x}}))]},[U,G]),u=()=>y0(u$,{marginBottom:1,children:y8.map((G0,V)=>y0(u$,{marginRight:2,children:y0(X$,{color:V===X?"yellow":"gray",children:["[",G0.label,"]"]},void 0,!0,void 0,this)},G0.key,!1,void 0,this))},void 0,!1,void 0,this),J0=()=>y0(u$,{flexDirection:"column",gap:1,children:[y0(X$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),y0(u$,{flexDirection:"column",marginLeft:2,children:[y0(X$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",K.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(X$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",K.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(X$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",K.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y0(X$,{children:"说明:"},void 0,!1,void 0,this),y0(u$,{flexDirection:"column",marginLeft:2,children:[y0(X$,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),y0(X$,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),y0(X$,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K0=(G0)=>y0(u$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:OK[G0]},void 0,!1,void 0,this),y0(X$,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),y0(u$,{marginTop:1,children:y0(GK,{value:H,onChange:A,onSubmit:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q0=(G0,V)=>y0(u$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:["Delete ",G0," permission rule?"]},void 0,!0,void 0,this),y0(X$,{children:V.rule},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),y0(X$,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),y0(_X,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(x)=>{if(x.value==="yes")j();else W("list"),w(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a=(G0)=>y0(u$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),y0(X$,{children:G0.rule},void 0,!1,void 0,this),y0(X$,{color:"gray",children:G0.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f=(G0)=>y0(_X,{items:o,isFocused:_==="list",onSelect:R},void 0,!1,void 0,this),v=()=>{if(q)return y0(X$,{children:"加载中..."},void 0,!1,void 0,this);if(U==="info")return J0();if(_==="add")return K0(U);if(_==="confirm-delete"&&b)return q0(b.tab,b.entry);if(_==="locked"&&b)return a(b.entry);return f(U)};return y0(u$,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[y0(X$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),u(),y0(u$,{flexDirection:"column",gap:1,children:v()},void 0,!1,void 0,this),B&&y0(u$,{marginTop:1,children:y0(X$,{color:B.type==="success"?"green":"red",children:B.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(u$,{marginTop:1,children:y0(X$,{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 x0,Text as A0}from"ink";import{useEffect as wK,useState as A2}from"react";import{jsxDEV as s}from"react/jsx-dev-runtime";var v9=["local","project","global"];function bX({workspaceRoot:$,onCancel:J}){let Y=s0()==="plugins-manager",Z=LX($),X=Z.getAll(),[Q,U]=A2(0),[G,z]=A2(!1),[K,O]=A2(""),[q,N]=A2(null),[_,W]=A2("local"),[H,A]=A2(null),[b,w]=A2(0),B=Z.getBySource(),C=Z.getStats(),F=Z.getSourcePolicy(),M=e0(!1,J);wK(()=>{let P=!0;return FX.getInstance().loadWorkspacePluginSettingsResolution(Z.getWorkspaceRoot()).then((j)=>{if(P)A(j.settings)}).catch((j)=>{if(P)O(j instanceof Error?j.message:"无法读取插件作用域配置")}),()=>{P=!1}},[Z,b]);let L=()=>{W((P)=>{let j=v9.indexOf(P);return v9[(j+1)%v9.length]}),N(null)},y=async()=>{let P=X[Q];if(!P||G)return;if(P.source==="cli"){O(`${P.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(P.status==="error"){O(P.error??`${P.manifest.name} 当前不可用`);return}z(!0),O("");try{let j=await BX(Z.getWorkspaceRoot(),P.manifest.name,P.status!=="active",_);O(j.effectiveEnabled?`已启用 ${P.manifest.name} · 生效层级 ${j.effectiveScope}`:`已禁用 ${P.manifest.name} · 生效层级 ${j.effectiveScope}`),w((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{z(!1)}},S=async()=>{if(G)return;z(!0),O("");try{await wX(Z.getWorkspaceRoot()),U(0),O("插件列表已刷新"),w((P)=>P+1)}catch(P){O(P instanceof Error?P.message:String(P))}finally{z(!1)}},T=async()=>{let P=X[Q];if(!P||G)return;if(!P.installation){O(`${P.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}z(!0),N(null),O("");try{let{result:j}=await PX(Z.getWorkspaceRoot(),P.manifest.name,{trusted:!0});if(!j.success)throw Error(j.error);O(j.changed?`已更新 ${P.manifest.name} 到 ${j.installation?.revision}`:`${P.manifest.name} 已是最新版本`),w((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{z(!1)}},R=async()=>{let P=X[Q];if(!P||G)return;if(!P.installation){O(`${P.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(q!==P.manifest.name){N(P.manifest.name),O(`再次按 x 确认卸载 ${P.manifest.name}`);return}z(!0),O("");try{let{result:j}=await AX(Z.getWorkspaceRoot(),P.manifest.name,!0);if(!j.success)throw Error(j.error);N(null),U(0),O(`已卸载 ${P.manifest.name}`),w((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{z(!1)}};if(O0((P,j)=>{if(j.escape)J?.();else if(j.ctrl&&P==="c"||j.meta&&P==="c")M();else if((j.upArrow||P==="k")&&X.length>0)N(null),U((o)=>(o-1+X.length)%X.length);else if((j.downArrow||P==="j")&&X.length>0)N(null),U((o)=>(o+1)%X.length);else if(P===" "||j.return)y();else if(P==="r")S();else if(P==="s")L();else if(P==="u")T();else if(P==="x")R()},{isActive:Y}),X.length===0)return s(x0,{flexDirection:"column",paddingY:1,children:[s(x0,{marginBottom:1,children:s(A0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[s(A0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{marginTop:1,paddingLeft:2,children:s(A0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{marginTop:1,children:s(A0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return s(x0,{flexDirection:"column",paddingY:1,children:[s(x0,{marginBottom:1,children:[s(A0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),s(A0,{color:"gray",children:[" (共 ",C.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,marginBottom:1,children:s(A0,{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),s(x0,{paddingLeft:2,marginBottom:1,children:s(A0,{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),s(x0,{paddingLeft:2,marginBottom:1,children:s(A0,{color:"gray",children:["写入层级: ",s(A0,{color:"cyan",children:_},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B.cli.length>0&&s(x0,{flexDirection:"column",marginBottom:1,children:[s(x0,{paddingLeft:1,children:[s(A0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),s(A0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.cli.map((P)=>{let j=P.status==="active"?"[on]":"[off]",o=X.indexOf(P)===Q;return s(x0,{flexDirection:"column",paddingLeft:2,children:[s(A0,{children:[s(A0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",P.manifest.name]},void 0,!0,void 0,this),s(A0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&s(x0,{paddingLeft:2,children:s(A0,{color:"blue",children:["命令:"," ",P.commands.map((u)=>`/${u.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&&s(x0,{flexDirection:"column",marginBottom:1,children:[s(x0,{paddingLeft:1,children:[s(A0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),s(A0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.project.map((P)=>{let j=P.status==="active"?"[on]":"[off]",o=X.indexOf(P)===Q;return s(x0,{flexDirection:"column",paddingLeft:2,children:[s(A0,{children:[s(A0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",P.manifest.name]},void 0,!0,void 0,this),s(A0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",dimColor:!0,children:["生效层级:"," ",H?.[P.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&s(x0,{paddingLeft:2,children:s(A0,{color:"blue",children:["命令:"," ",P.commands.map((u)=>`/${u.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&&s(x0,{flexDirection:"column",marginBottom:1,children:[s(x0,{paddingLeft:1,children:[s(A0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),s(A0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.user.map((P)=>{let j=P.status==="active"?"[on]":"[off]",o=X.indexOf(P)===Q;return s(x0,{flexDirection:"column",paddingLeft:2,children:[s(A0,{children:[s(A0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",P.manifest.name]},void 0,!0,void 0,this),s(A0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",dimColor:!0,children:["生效层级:"," ",H?.[P.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&s(x0,{paddingLeft:2,children:s(A0,{color:"blue",children:["命令:"," ",P.commands.map((u)=>`/${u.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),s(x0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[s(A0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{marginTop:1,children:s(A0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&s(x0,{marginTop:1,children:s(A0,{color:K.includes("失败")?"red":"cyan",children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&s(A0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as M$,Text as T$,useStdout as PK}from"ink";import AK from"ink-text-input";import V9,{useCallback as I8,useMemo as bK,useState as $2}from"react";import{jsxDEV as V0}from"react/jsx-dev-runtime";var MK=V9.memo(({option:$,index:J,isSelected:Y,isMultiSelect:Z,isHighlighted:X})=>V0(M$,{flexDirection:"column",marginBottom:1,children:[V0(T$,{color:X?"yellow":Y?"green":void 0,bold:X,children:[Z?Y?"(*) ":"( ) ":X?"> ":" ",J+1,". ",$.label]},void 0,!0,void 0,this),V0(M$,{marginLeft:4,children:V0(T$,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),TK=V9.memo(({questions:$,answers:J})=>V0(M$,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let Z=J[Y.header],X=Array.isArray(Z)?Z.join(", "):Z||"(no answer)";return V0(M$,{marginBottom:1,children:[V0(T$,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),V0(T$,{color:"green",children:[" ",X]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),MX=V9.memo(({questions:$,onComplete:J,onCancel:Y})=>{let{stdout:Z}=PK(),X=Z.columns||80,U=s0()==="confirmation-prompt",G=e0(!1),[z,K]=$2("answering"),[O,q]=$2(0),[N,_]=$2({}),[W,H]=$2(0),[A,b]=$2([]),[w,B]=$2(!1),[C,F]=$2(""),[M,L]=$2(0),y=$[O],S=bK(()=>{if(!y)return[];return[...y.options.map((u)=>({label:u.label,value:u.label,description:u.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[y]),T=I8((u)=>{let J0={...N,[y.header]:u};if(_(J0),O<$.length-1)q(O+1),H(0),b([]),B(!1),F("");else K("submit"),L(0)},[N,y?.header,O,$.length]),R=I8((u)=>{let J0=S[u];if(!J0)return;if(J0.value==="__other__"){B(!0);return}if(y.multiSelect)b((K0)=>K0.includes(J0.value)?K0.filter((q0)=>q0!==J0.value):[...K0,J0.value]);else T(J0.value)},[S,y?.multiSelect,T]),P=I8((u)=>{if(u.trim())T(u.trim())},[T]),j=I8(()=>{K("answering"),q(0),H(0),b([]),B(!1)},[]),o=I8(()=>{J(N)},[N,J]);if(O0((u,J0)=>{if(J0.ctrl&&u==="c"||J0.meta&&u==="c"){G();return}if(w){if(J0.escape)B(!1),F("");return}if(J0.escape){Y();return}let K0=parseInt(u);if(K0>=1&&K0<=S.length){R(K0-1);return}if(J0.upArrow){H((q0)=>q0>0?q0-1:S.length-1);return}if(J0.downArrow||J0.tab){H((q0)=>q0<S.length-1?q0+1:0);return}if(J0.return){if(y.multiSelect&&A.length>0)T(A);else R(W);return}if(u===" "&&y.multiSelect){let q0=S[W];if(q0&&q0.value!=="__other__")b((a)=>a.includes(q0.value)?a.filter((f)=>f!==q0.value):[...a,q0.value]);return}},{isActive:U&&z==="answering"&&!w}),O0((u,J0)=>{if(J0.ctrl&&u==="c"||J0.meta&&u==="c"){G();return}if(J0.escape){Y();return}if(J0.upArrow||J0.downArrow||J0.tab){L((K0)=>K0===0?1:0);return}if(J0.return){if(M===0)o();else j();return}if(u.toLowerCase()==="y"){o();return}if(u.toLowerCase()==="e"){j();return}},{isActive:U&&z==="submit"}),z==="submit")return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:U?"green":"gray",padding:1,width:Math.min(X-4,80),children:[V0(M$,{marginBottom:1,children:V0(T$,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V0(TK,{questions:$,answers:N},void 0,!1,void 0,this),V0(M$,{flexDirection:"column",marginTop:1,children:[V0(T$,{color:M===0?"yellow":void 0,bold:M===0,children:[M===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),V0(T$,{color:M===1?"yellow":void 0,bold:M===1,children:[M===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V0(M$,{marginTop:1,children:V0(T$,{color:"gray",children:"Enter to confirm · Up/Down to navigate · Y/E for quick select"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!y)return null;return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:U?"cyan":"gray",padding:1,width:Math.min(X-4,80),children:[V0(M$,{marginBottom:1,children:[V0(T$,{backgroundColor:"blue",color:"white",children:[" ",y.header," "]},void 0,!0,void 0,this),V0(T$,{children:[" ",y.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w?V0(M$,{flexDirection:"column",marginTop:1,children:[V0(T$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),V0(M$,{marginTop:1,children:[V0(T$,{color:"cyan",children:"> "},void 0,!1,void 0,this),V0(AK,{value:C,onChange:F,onSubmit:P,focus:U},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V0(M$,{marginTop:1,children:V0(T$,{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):V0(M$,{flexDirection:"column",children:S.map((u,J0)=>V0(MK,{option:u,index:J0,isSelected:A.includes(u.value),isMultiSelect:y.multiSelect,isHighlighted:W===J0},u.value,!1,void 0,this))},void 0,!1,void 0,this),!w&&V0(M$,{marginTop:1,flexDirection:"column",children:[V0(T$,{color:"gray",children:y.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),y.multiSelect&&A.length>0&&V0(T$,{color:"green",children:["Selected: ",A.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&V0(M$,{marginTop:1,children:V0(T$,{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 E9,Text as h1,useStdout as fK}from"ink";import{useEffect as g9,useMemo as Y6,useRef as b2,useState as M2}from"react";function CK($,J){return[...$,J].join(`
160
- `).replace(/\n+$/,"")}function S8($){let J=2166136261;for(let Y=0;Y<$.length;Y++)J^=$.charCodeAt(Y),J=Math.imul(J,16777619);return`${$.length}:${(J>>>0).toString(16)}`}function RX({messages:$,currentStreamingMessageId:J,streamingLines:Y,streamingTail:Z,currentThinkingContent:X}){let Q=CK(Y,Z),U=[];for(let G of $){let z=G.id===J?Q:G.content,K=G.metadata&&"phase"in G.metadata?String(G.metadata.phase):"",O=G.id===J?X??G.thinkingContent:G.thinkingContent;if(G.role==="assistant"&&O)U.push({id:`${G.id}:thinking`,messageId:G.id,role:"assistant",kind:"thinking",content:O,revision:`${G.timestamp}:thinking:${S8(O)}`,collapsible:!0});let q=G.role==="tool"&&G.metadata&&"detail"in G.metadata&&typeof G.metadata.detail==="string"&&G.metadata.detail.length>0?G.metadata.detail:void 0;U.push({id:G.id,messageId:G.id,role:G.role,kind:G.role==="tool"?"tool":"message",content:z,detail:q,revision:`${G.timestamp}:${S8(z)}:${S8(q??"")}:${K}`,collapsible:q!==void 0})}if(J&&!U.some((G)=>G.id===J)){if(X)U.push({id:`${J}:thinking`,messageId:J,role:"assistant",kind:"thinking",content:X,revision:`stream:thinking:${S8(X)}`,collapsible:!0});U.push({id:J,messageId:J,role:"assistant",kind:"message",content:Q,revision:`stream:${S8(Q)}`,collapsible:!1})}return U}var TX={user:"> ",assistant:"• ",system:" ",tool:"└ "};function $6($,J,Y){let Z=J.text.length>0?J.text.split(`
161
- `):[""],X=[];for(let[Q,U]of Z.entries()){let G=X.length===0?J.firstPrefix:J.nextPrefix,z=Math.max(1,Y-G.length),K=i2(U,z,!0),O=0;for(let q of K){let N=q.length>0?U.indexOf(q,O):O,_=N>=0?N:O,W=_+q.length,H=X.length===0?J.firstPrefix:J.nextPrefix;X.push({key:`${$.id}:${J.key}:${Q}:${X.length}`,blockId:$.id,role:$.role,kind:$.kind,text:`${H}${q}`,copyText:q,pending:$.pending===!0,header:J.header&&X.length===0,sourceLine:J.sourceLineOffset+Q,sourceStart:_,sourceEnd:W,sourceTextOffset:H.length}),O=W}}return X}function CX($){return $.length===0?0:$.split(`
159
+ `).length}var R9=IG.memo(({content:$,isStreaming:J=!1,isExpanded:Y})=>{let Z=D0(),X=l5(()=>kG($),[$]),Q=l5(()=>SG($),[$]),U=Z.colors.info,G=Z.colors.muted;return f1(C9,{flexDirection:"column",marginBottom:1,children:[f1(C9,{flexDirection:"row",children:[f1(J8,{color:U,children:Y?"v":">"},void 0,!1,void 0,this),f1(J8,{children:" "},void 0,!1,void 0,this),f1(J8,{color:G,children:["Thinking",J?"...":` (${X} lines)`]},void 0,!0,void 0,this),!Y&&!J&&Q&&f1(J8,{color:G,children:[" - ",Q]},void 0,!0,void 0,this),f1(J8,{color:G,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&f1(C9,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:f1(J8,{color:G,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});R9.displayName="ThinkingBlock";import{jsxDEV as v$}from"react/jsx-dev-runtime";var VG=({active:$=!0})=>{let J=j8(),Y=i8(),Z=o8(),X=PJ(),Q=g2(),U=ZJ(),G=_J(),z=a8(),K=wJ(),O=o9(),q=bJ(),N=AJ(),{width:_,height:W}=r1(),{stdout:H}=fG(),A=d1(),[b,w]=I9(null),[B,C]=I9([]),[F,M]=I9(new Set),L=o1(N),y=o1(null),S=o1(0),T=o1(0),R=o1(new Set),P=o1(new Set),j=o1([]),o=o1(null);v1(()=>{if(L.current!==N){if(L.current=N,!$)return;if(Z1())o$();if(H)H.write(r4.clearTerminal);A.incrementClearCount()}},[$,N,H,A]);let u=J,J0=X;v1(()=>{if(!X||Q){o.current=null;return}if(o.current===X)return;if(o.current=X,Z1())o$();if($&&H)H.write(r4.eraseScreen+r4.cursorTo(0,0));R.current=new Set,P.current=new Set(u.filter((V)=>V.role==="tool").map((V)=>V.id)),y.current=null,S.current=0,T.current=0,j.current=[],C([]),M(new Set),A.incrementClearCount(),A.clearFinalizingStreamingMessageId()},[X,Q,H,A,u,$]);let K0=Y??X;v1(()=>{if($&&Z1())o$();y.current=null,S.current=0,T.current=0,R.current=new Set,P.current=new Set(u.filter((V)=>V.role==="tool").map((V)=>V.id)),j.current=[],C([]),M(new Set)},[O]),v1(()=>{if(!K0)return;if(y.current===K0)return;y.current=K0,S.current=0,T.current=0,P.current=new Set(u.filter((V)=>V.role==="tool").map((V)=>V.id)),j.current=[],C([])},[K0,O]),v1(()=>{if(!K0)return;let V=S9(K0);if(!V||V.length<=S.current)return;let x=V.slice(S.current);S.current=V.length;let l=x,H0=j.current;if(H0.length>0)if(l.some((D)=>D.type!=="empty"))l=[...H0,...l],j.current=[];else{j.current=[...H0,...l];return}let F0=l.length;while(F0>0&&l[F0-1].type==="empty")F0-=1;if(F0!==l.length)j.current=l.slice(F0),l=l.slice(0,F0);if(l.length===0)return;let T0=T.current;T.current+=1;let I=T0>0;if(Z1())o$();M((D)=>{if(!K0||D.has(K0))return D;let p=new Set(D);return p.add(K0),p}),C((D)=>[...D,v$(L2,{flexDirection:"column",children:v$(k1,{content:"",role:"assistant",terminalWidth:_,isPending:!1,hidePrefix:I,noMargin:!0,blocksOverride:l,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${K0}-${T0}`,!1,void 0,this)])},[K0,Z.version,_,O,$]),v1(()=>{if(!K0)return;let V=P.current,x=u.filter((l)=>l.role==="tool"&&!V.has(l.id)&&!R.current.has(l.id));if(x.length===0)return;if($&&Z1())o$();for(let l of x)R.current.add(l.id);C((l)=>[...l,...x.map((H0)=>v$(L2,{flexDirection:"column",children:v$(k1,{content:H0.content,role:H0.role,terminalWidth:_,metadata:H0.metadata,isPending:!1,messageId:H0.id},void 0,!1,void 0,this)},`streaming-tool-${H0.id}`,!1,void 0,this))])},[$,K0,u,_]),v1(()=>{if(!$){if(Z1())o$();return}if(!K0){if(Z1())o$();return}if(!Z1())z3(_,W);else q3(_,W);let V=r5(K0);if(!V||V.lines.length===0)return;let l=Math.max(1,W-8),H0=Math.max(0,V.lines.length-l),F0=V.lines.slice(-l),T0=(S9(K0)?.length??0)>0;_3(F0,H0,V.mode,T0)},[K0,Z.version,W,_,$]),v1(()=>{if(!K0&&Z1())o$()},[K0]),v1(()=>{if(b===null&&u.length>q){if(w(u.length),$&&Z1())o$();if($&&H)H.write(r4.clearTerminal);A.incrementClearCount()}},[u.length,q,b,H,A,$]);let q0=y9(()=>{return U.some((V)=>V.status==="pending"||V.status==="in_progress")},[U]),a=N?0:b??0,f=a,v=y9(()=>{let V=[];if(V.push(v$(c5,{},"header",!1,void 0,this)),f>0)V.push(v$(M9,{collapsedCount:f},"collapsed-summary",!1,void 0,this));for(let x=a;x<u.length;x++){let l=u[x];if(J0&&l.id===J0)continue;if(l.role==="tool"&&R.current.has(l.id))continue;if(l.role==="assistant"&&F.has(l.id))continue;V.push(v$(L2,{flexDirection:"column",children:v$(k1,{content:l.content,role:l.role,terminalWidth:_,metadata:l.metadata,isPending:!1,messageId:l.id},void 0,!1,void 0,this)},l.id,!1,void 0,this))}return V},[u,a,f,_,J0,F]),G0=y9(()=>B.length>0?[...v,...B]:v,[v,B]);return v$(L2,{flexDirection:"column",paddingX:2,children:v$(L2,{flexDirection:"column",children:[v$(DG,{items:G0,children:(V)=>V},O,!1,void 0,this),z&&v$(L2,{marginBottom:1,children:v$(R9,{content:z,isStreaming:Q,isExpanded:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&q0&&v$(L2,{marginTop:1,children:v$(d5,{tasks:U,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},a5=vG.memo(VG);import{useMemoizedFn as a4,useMount as jG}from"ahooks";import{Box as e$,Text as v0,useFocus as EG,useFocusManager as hG}from"ink";import gG from"ink-select-input";import{memo as mG,useMemo as pG,useState as i4}from"react";import{jsxDEV as L0,Fragment as uG}from"react/jsx-dev-runtime";var xG=({isSelected:$})=>L0(e$,{marginRight:1,children:L0(v0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),cG=({isSelected:$,label:J})=>L0(v0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),i5=mG(({onClose:$,onEdit:J})=>{let Y=OJ(),Z=p8()??"",{isFocused:X}=EG({id:"model-selector"}),Q=hG(),[U,G]=i4(""),[z,K]=i4(!1),[O,q]=i4(null),N=e0(!1),[_]=i4(()=>{let L=process.stdout?.columns||80;return Math.max(20,L-8)});jG(()=>{if(Q?.focus("model-selector"),Y.length>0)G(Y[0].id)}),O0((L,y)=>{if(z)return;if(y.ctrl&&L==="c"||y.meta&&L==="c"){N();return}if(y.escape){$();return}if(!X)return;if(L==="d"||L==="D"){H();return}if((L==="e"||L==="E")&&J)A()},{isActive:!0});let W=a4(async(L)=>{if(z)return;let y=L.value;if(y===Z){$();return}K(!0),q(null);try{await z$().setCurrentModel(y),$()}catch(S){q(S.message),K(!1)}}),H=a4(async()=>{if(z||U===Z)return;K(!0),q(null);try{if(await z$().removeModel(U),Y.length<=1)$()}catch(L){q(L.message)}finally{K(!1)}}),A=a4(()=>{if(z||!J)return;let L=Y.find((y)=>y.id===U);if(!L)return;J(L)}),b=a4((L)=>{G(L.value)}),w=pG(()=>{return Y.find((L)=>L.id===U)},[Y,U]),B=w?o4()?.modelProviders[w.provider]:void 0,C=Y.map((L)=>{let y=L.id===Z?" (当前)":"";return{label:k9(L)+y,value:L.id}}),F=U===Z;return L0(e$,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[L0(e$,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[L0(v0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),L0(v0,{dimColor:!0,children:[z?"处理中...":F?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L0(e$,{flexDirection:"row",children:[L0(e$,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[L0(v0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),L0(e$,{marginTop:1,children:L0(gG,{items:C,onSelect:W,onHighlight:b,indicatorComponent:xG,itemComponent:cG},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(e$,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[L0(v0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),L0(e$,{marginY:1,children:L0(v0,{color:F?"green":"yellow",children:F?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w?L0(e$,{flexDirection:"column",children:[L0(v0,{children:[L0(v0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),L0(v0,{bold:!0,color:"cyan",children:k9(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),L0(v0,{bold:!0,children:B?.name??w.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B&&L0(uG,{children:[L0(v0,{children:[L0(v0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),L0(v0,{children:w.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),L0(v0,{children:B.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),L0(v0,{color:"blueBright",children:B.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),L0(v0,{bold:!0,children:w.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w.overrides?.baseUrl&&L0(v0,{children:[L0(v0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),L0(v0,{color:"blueBright",children:w.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),L0(v0,{children:R1().resolveConfig(w).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):L0(v0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),O&&L0(e$,{marginTop:1,children:L0(v0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(e$,{justifyContent:"center",marginTop:1,children:L0(v0,{dimColor:!0,children:"─".repeat(_)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(e$,{justifyContent:"center",children:L0(v0,{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 D9}from"ahooks";import{Box as UK,Text as f9}from"ink";import{useState as P2}from"react";import{Box as B2,Text as V1}from"ink";import dG from"ink-text-input";import{jsxDEV as P$}from"react/jsx-dev-runtime";var o5=({provider:$,value:J,onChange:Y,onSubmit:Z,onCancel:X,error:Q})=>{return O0((U,G)=>{if(G.escape)X()}),P$(B2,{flexDirection:"column",children:[P$(B2,{marginBottom:1,children:P$(V1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(B2,{marginBottom:1,children:P$(V1,{children:["Provider: ",P$(V1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P$(B2,{marginBottom:1,children:P$(V1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(B2,{children:[P$(V1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),P$(dG,{value:J,onChange:Y,onSubmit:Z,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&P$(B2,{marginTop:1,children:P$(V1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(B2,{marginTop:1,children:P$(V1,{dimColor:!0,children:["输入完成后按 ",P$(V1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",P$(V1,{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 n4,Text as n1}from"ink";import lG from"ink-text-input";import{useState as t4}from"react";import{jsxDEV as c$}from"react/jsx-dev-runtime";var s4=["id","name","baseUrl","model"];function n5($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function rG($,J,Y){switch($){case"id":return"team-gateway";case"name":return Y||"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 aG($,J){let Y=$.id.trim(),Z={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:J},X=s5(Y,Z);if(!$.model.trim())X.push("Model ID must not be empty");if(X.length>0)throw Error(X[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:Z}}var e5=({wireApi:$,initialConfig:J,onSubmit:Y,onCancel:Z})=>{let X={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,U]=t4(J?3:0),[G,z]=t4(J?.model??""),[K,O]=t4(X),[q,N]=t4(),_=s4[Q];O0((H,A)=>{if(!A.escape)return;if(N(void 0),Q===0){Z();return}let b=Q-1,w=s4[b];U(b),z(K[w])});let W=(H)=>{let A=H.trim();if(_==="id"&&!t5.test(A)){N("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(_==="baseUrl")try{let w=new URL(A);if(!["http:","https:"].includes(w.protocol))throw Error()}catch{N("Base URL 必须是绝对 HTTP(S) URL");return}if(_==="model"&&!A){N("Model ID 不能为空");return}let b={...K,[_]:_==="name"&&!A?K.id:A};if(O(b),N(void 0),Q===s4.length-1){try{Y(aG(b,$))}catch(w){N(w instanceof Error?w.message:"渠道配置无效")}return}U(Q+1),z("")};return c$(n4,{flexDirection:"column",children:[c$(n4,{marginBottom:1,children:c$(n1,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c$(n1,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),s4.slice(0,Q).map((H)=>c$(n1,{children:[n5(H),": ",c$(n1,{color:"cyan",children:K[H]},void 0,!1,void 0,this)]},H,!0,void 0,this)),c$(n4,{marginTop:1,children:[c$(n1,{bold:!0,children:[n5(_),": "]},void 0,!0,void 0,this),c$(lG,{value:G,onChange:(H)=>{z(H),N(void 0)},onSubmit:W,placeholder:rG(_,$,K.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_==="name"&&c$(n1,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),q&&c$(n1,{color:"red",children:q},void 0,!1,void 0,this),c$(n4,{marginTop:1,children:c$(n1,{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 YX,useState as Y8}from"react";var XX=()=>{let[$,J]=Y8([]),[Y,Z]=Y8(!0),[X,Q]=Y8(null);return YX(()=>{let U=!1;return(async()=>{try{let z=await $X();if(!U)J(z)}catch(z){if(!U)Q(z instanceof Error?z.message:"加载 Provider 列表失败")}finally{if(!U)Z(!1)}})(),()=>{U=!0}},[]),{providers:$,isLoading:Y,error:X}},ZX=($)=>{let[J,Y]=Y8([]),[Z,X]=Y8(!1),[Q,U]=Y8(null);return YX(()=>{if(!$){Y([]),X(!1),U(null);return}let G=!1;return Y([]),X(!0),U(null),(async()=>{try{let K=await JX($);if(!G)Y(K)}catch(K){if(!G)U(K instanceof Error?K.message:"加载模型列表失败")}finally{if(!G)X(!1)}})(),()=>{G=!0}},[$]),{models:J,isLoading:Z,error:Q}};import{Box as j1,Text as K1}from"ink";import iG from"ink-select-input";import oG from"ink-text-input";import{useMemo as QX,useState as nG}from"react";import{jsxDEV as U$,Fragment as $K}from"react/jsx-dev-runtime";var tG=({isSelected:$})=>U$(j1,{marginRight:1,children:U$(K1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),sG=($)=>{let J=[$.name];if($.contextWindow){let Y=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;J.push(`[${Y} 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(" ")},eG=({isSelected:$,label:J})=>U$(K1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),UX=({provider:$,models:J,isLoading:Y,error:Z,onSelect:X,onCancel:Q})=>{let[U,G]=nG("");O0((O,q)=>{if(q.escape)if(U)G("");else Q()});let z=QX(()=>{if(!U)return J;let O=U.toLowerCase();return J.filter((q)=>q.name.toLowerCase().includes(O)||q.id.toLowerCase().includes(O))},[J,U]),K=QX(()=>z.map((O)=>({key:O.id,label:sG(O),value:O})),[z]);if(Y)return U$(j1,{flexDirection:"column",children:U$(K1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(Z)return U$(j1,{flexDirection:"column",children:[U$(K1,{color:"red",children:Z},void 0,!1,void 0,this),U$(K1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return U$(j1,{flexDirection:"column",children:[U$(j1,{marginBottom:1,children:U$(K1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),U$(j1,{marginBottom:1,children:U$(K1,{children:["Provider: ",U$(K1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),U$($K,{children:[U$(j1,{marginBottom:1,children:[U$(K1,{color:"cyan",children:"> "},void 0,!1,void 0,this),U$(oG,{value:U,onChange:G,placeholder:`搜索 ${J.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U$(j1,{marginBottom:1,children:U$(K1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),U$(j1,{flexDirection:"column",height:12,children:U$(iG,{items:K,onSelect:(O)=>X(O.value),indicatorComponent:tG,itemComponent:eG,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.length===0&&U$(K1,{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 w2,Text as t1}from"ink";import JK from"ink-select-input";import YK from"ink-text-input";import{useMemo as GX,useState as XK}from"react";import{jsxDEV as A$}from"react/jsx-dev-runtime";var ZK=({isSelected:$})=>A$(w2,{marginRight:1,children:A$(t1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),QK=({isSelected:$,label:J})=>A$(t1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),KX=({providers:$,isLoading:J,error:Y,onSelect:Z,onCancel:X})=>{let[Q,U]=XK("");O0((K,O)=>{if(O.escape)if(Q)U("");else X()});let G=GX(()=>{if(!Q)return $;let K=Q.toLowerCase();return $.filter((O)=>O.name.toLowerCase().includes(K)||O.id.toLowerCase().includes(K))},[$,Q]),z=GX(()=>G.map((K)=>({key:K.id,label:`${K.name} - ${K.modelCount} models${K.configured?" [configured]":""}`,value:K})),[G]);if(J)return A$(w2,{flexDirection:"column",children:A$(t1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return A$(w2,{flexDirection:"column",children:[A$(t1,{color:"red",children:Y},void 0,!1,void 0,this),A$(t1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return A$(w2,{flexDirection:"column",children:[A$(w2,{marginBottom:1,children:A$(t1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A$(w2,{marginBottom:1,children:[A$(t1,{color:"cyan",children:"> "},void 0,!1,void 0,this),A$(YK,{value:Q,onChange:U,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A$(w2,{flexDirection:"column",height:12,children:A$(JK,{items:z,onSelect:(K)=>Z(K.value),indicatorComponent:ZK,itemComponent:QK,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&A$(t1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function zX($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as s1}from"react/jsx-dev-runtime";var v9=({mode:$,initialConfig:J,modelId:Y,onComplete:Z,onCancel:X})=>{let[Q,U]=P2("provider"),[G,z]=P2(),[K,O]=P2(),[q,N]=P2(),[_,W]=P2(""),[H,A]=P2(),[b,w]=P2(!1),B=XX(),C=ZX(G?.id),F=e0(!1);O0((S,T)=>{if(T.ctrl&&S==="c"||T.meta&&S==="c")$==="setup"?F():X()});let M=D9(async(S)=>{if(!G)return;let T=q??(K?{provider:G.id,model:K.id,displayName:J?.displayName}:void 0);if(!T)return;w(!0),A(void 0);try{if(T.modelProvider)R1().registerModelProvider(T.provider,T.modelProvider,[T.model]);if(S?.trim())await R1().setApiKey(T.provider,S.trim());let R={displayName:T.displayName,provider:T.provider,model:T.model,overrides:T.overrides};if($==="setup")await Z(T);else if($==="add"){let P=T.modelProvider?await z$().addModelWithProvider(R,T.modelProvider):await z$().addModel(R);await z$().setCurrentModel(P.id),await Z(T)}else if(Y){if(T.modelProvider)await z$().updateModelWithProvider(Y,R,T.modelProvider);else await z$().updateModel(Y,R);await Z(T)}}catch(R){if(T.modelProvider){await R1().credentials.delete(T.provider);let P=o4();R1().configureModelProviders(P?.modelProviders??{},P?.models??[])}A(R instanceof Error?R.message:"保存配置失败"),w(!1)}}),L=D9((S)=>{if(O(S),G?.configured)M();else if(G?.supportsApiKey)U("credential");else A(`${G?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),y=D9(()=>{if(A(void 0),Q==="credential"&&q){U("custom");return}let S=zX(Q);if(S)U(S)});return s1(UK,{flexDirection:"column",padding:1,children:[s1(f9,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&s1(KX,{...B,onSelect:(S)=>{z(S),O(void 0),N(void 0),U(S.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:X},void 0,!1,void 0,this),Q==="custom"&&G?.factoryWireApi&&s1(e5,{wireApi:G.factoryWireApi,initialConfig:q,onSubmit:(S)=>{N(S),U("credential")},onCancel:y},void 0,!1,void 0,this),Q==="model"&&G&&s1(UX,{provider:G,...C,onSelect:L,onCancel:y},void 0,!1,void 0,this),Q==="credential"&&G&&s1(o5,{provider:G,value:_,onChange:W,onSubmit:()=>void M(_),onCancel:y,error:H},void 0,!1,void 0,this),b&&s1(f9,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),H&&Q!=="credential"&&s1(f9,{color:"red",children:H},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as y8}from"ahooks";import{promises as NX}from"fs";import{Box as u$,Text as X$}from"ink";import qX from"ink-select-input";import GK from"ink-text-input";import KK from"os";import e4 from"path";import{useEffect as zK,useMemo as $6,useRef as qK,useState as e1}from"react";import{jsxDEV as y0}from"react/jsx-dev-runtime";var I8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],_K={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},OK={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},_X={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},NK=["project","global","local"],HK={allow:[],ask:[],deny:[]},WK={localExists:!1,projectExists:!1,globalExists:!1},OX={allow:[],ask:[],deny:[]};function FK($){let J=(Z)=>Array.isArray(Z)?Z.filter((X)=>typeof X==="string"):[],Y=$?.permissions??{};return{allow:J(Y?.allow),ask:J(Y?.ask),deny:J(Y?.deny)}}async function LK($){try{let J=await NX.readFile($,"utf-8"),Y=JSON.parse(J);return{exists:!0,raw:Y,permissions:FK(Y)}}catch(J){if(J.code==="ENOENT")return{exists:!1,raw:{},permissions:{...OX}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,J),{exists:!0,raw:{},permissions:{...OX}}}}function BK($,J){let Y=$.padEnd(32," "),Z=J==="local"?`${_X[J]} <- 可删除`:_X[J];return`${Y} ${Z}`}var HX=({onClose:$})=>{let Y=s0()==="permissions-manager",Z=e0(!1),[X,Q]=e1(0),U=I8[X].key,[G,z]=e1(HK),[K,O]=e1(WK),[q,N]=e1(!0),[_,W]=e1("list"),[H,A]=e1(""),[b,w]=e1(null),[B,C]=e1(null),F=qK(!1),M=$6(()=>e4.join(K$(),".blade","settings.local.json"),[]),L=$6(()=>e4.join(K$(),".blade","settings.json"),[]),y=$6(()=>e4.join(KK.homedir(),".blade","settings.json"),[]),S=y8(async()=>{N(!0);let V=await Promise.all([{source:"local",path:M},{source:"project",path:L},{source:"global",path:y}].map(async({source:F0,path:T0})=>{let I=await LK(T0);return{source:F0,path:T0,...I}})),x={localExists:V.find((F0)=>F0.source==="local")?.exists??!1,projectExists:V.find((F0)=>F0.source==="project")?.exists??!1,globalExists:V.find((F0)=>F0.source==="global")?.exists??!1};O(x);let l={allow:[],ask:[],deny:[]},H0=Object.fromEntries(V.map((F0)=>[F0.source,F0]));["allow","ask","deny"].forEach((F0)=>{NK.forEach((T0)=>{(H0[T0]?.permissions[F0]??[]).forEach((D,p)=>{let h={key:`${T0}:${p}:${D}`,rule:D,source:T0};l[F0].push(h)})})}),z(l),N(!1)});zK(()=>{S()},[S]);let T=y8(async(G0,V)=>{try{let x=e4.join(K$(),".blade","settings.local.json"),l={allow:[],ask:[],deny:[]};try{let F0=await NX.readFile(x,"utf-8"),I=JSON.parse(F0).permissions||{};l={allow:Array.isArray(I.allow)?I.allow:[],ask:Array.isArray(I.ask)?I.ask:[],deny:Array.isArray(I.deny)?I.deny:[]}}catch(F0){}let H0=V(l);await z$().updateConfig({permissions:H0},{scope:"local",immediate:!0}),await S()}catch(x){throw console.error("[PermissionsManager] 修改权限规则失败:",x),x}});O0((G0,V)=>{if(V.ctrl&&G0==="c"||V.meta&&G0==="c"){Z();return}if(_==="locked"){if(F.current){F.current=!1;return}W("list"),w(null),C(null);return}if(V.escape){if(_==="list"||U==="info")$();else W("list"),A(""),w(null),C(null);return}if(_==="list"){if(V.tab&&V.shift)Q((x)=>(x-1+I8.length)%I8.length);else if(V.tab)Q((x)=>(x+1)%I8.length);else if(G0?.toLowerCase()==="q")$()}},{isActive:Y});let R=y8((G0)=>{let V=G0.value;if(U==="info")return;if(V.type==="add"){W("add"),A(""),C(null);return}if(V.entry.source!=="local"){W("locked"),F.current=!0,w({tab:U,entry:V.entry}),C({type:"error",text:V.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}W("confirm-delete"),w({tab:U,entry:V.entry}),C(null)}),P=y8(async()=>{if(U==="info")return;let G0=H.trim();if(!G0){C({type:"error",text:"Permission rule 不能为空"});return}if(G[U].map((x)=>x.rule).includes(G0)){C({type:"error",text:"该规则已存在"});return}try{await T(U,(x)=>{let l={allow:[...x.allow],ask:[...x.ask],deny:[...x.deny]};return l[U]=[...new Set([...x[U],G0])],l}),W("list"),A(""),C({type:"success",text:"已添加本地权限规则"})}catch(x){C({type:"error",text:`保存失败: ${x instanceof Error?x.message:"未知错误"}`})}}),j=y8(async()=>{if(!b)return;let{tab:G0,entry:V}=b;try{await T(G0,(x)=>{let l={allow:[...x.allow],ask:[...x.ask],deny:[...x.deny]};return l[G0]=x[G0].filter((H0)=>H0!==V.rule),l}),W("list"),w(null),C({type:"success",text:"已删除本地权限规则"})}catch(x){C({type:"error",text:`删除失败: ${x instanceof Error?x.message:"未知错误"}`})}}),o=$6(()=>{if(U==="info")return[];let G0=U;return[{key:"add-new-rule",label:`› ${_K[G0]}`,value:{type:"add"}},...G[G0].map((x)=>({key:x.key,label:BK(x.rule,x.source),value:{type:"rule",entry:x}}))]},[U,G]),u=()=>y0(u$,{marginBottom:1,children:I8.map((G0,V)=>y0(u$,{marginRight:2,children:y0(X$,{color:V===X?"yellow":"gray",children:["[",G0.label,"]"]},void 0,!0,void 0,this)},G0.key,!1,void 0,this))},void 0,!1,void 0,this),J0=()=>y0(u$,{flexDirection:"column",gap:1,children:[y0(X$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),y0(u$,{flexDirection:"column",marginLeft:2,children:[y0(X$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",K.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(X$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",K.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(X$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",K.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y0(X$,{children:"说明:"},void 0,!1,void 0,this),y0(u$,{flexDirection:"column",marginLeft:2,children:[y0(X$,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),y0(X$,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),y0(X$,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K0=(G0)=>y0(u$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:OK[G0]},void 0,!1,void 0,this),y0(X$,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),y0(u$,{marginTop:1,children:y0(GK,{value:H,onChange:A,onSubmit:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q0=(G0,V)=>y0(u$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:["Delete ",G0," permission rule?"]},void 0,!0,void 0,this),y0(X$,{children:V.rule},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),y0(X$,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),y0(qX,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(x)=>{if(x.value==="yes")j();else W("list"),w(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a=(G0)=>y0(u$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),y0(X$,{children:G0.rule},void 0,!1,void 0,this),y0(X$,{color:"gray",children:G0.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f=(G0)=>y0(qX,{items:o,isFocused:_==="list",onSelect:R},void 0,!1,void 0,this),v=()=>{if(q)return y0(X$,{children:"加载中..."},void 0,!1,void 0,this);if(U==="info")return J0();if(_==="add")return K0(U);if(_==="confirm-delete"&&b)return q0(b.tab,b.entry);if(_==="locked"&&b)return a(b.entry);return f(U)};return y0(u$,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[y0(X$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),u(),y0(u$,{flexDirection:"column",gap:1,children:v()},void 0,!1,void 0,this),B&&y0(u$,{marginTop:1,children:y0(X$,{color:B.type==="success"?"green":"red",children:B.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(u$,{marginTop:1,children:y0(X$,{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 x0,Text as A0}from"ink";import{useEffect as wK,useState as A2}from"react";import{jsxDEV as s}from"react/jsx-dev-runtime";var V9=["local","project","global"];function AX({workspaceRoot:$,onCancel:J}){let Y=s0()==="plugins-manager",Z=FX($),X=Z.getAll(),[Q,U]=A2(0),[G,z]=A2(!1),[K,O]=A2(""),[q,N]=A2(null),[_,W]=A2("local"),[H,A]=A2(null),[b,w]=A2(0),B=Z.getBySource(),C=Z.getStats(),F=Z.getSourcePolicy(),M=e0(!1,J);wK(()=>{let P=!0;return WX.getInstance().loadWorkspacePluginSettingsResolution(Z.getWorkspaceRoot()).then((j)=>{if(P)A(j.settings)}).catch((j)=>{if(P)O(j instanceof Error?j.message:"无法读取插件作用域配置")}),()=>{P=!1}},[Z,b]);let L=()=>{W((P)=>{let j=V9.indexOf(P);return V9[(j+1)%V9.length]}),N(null)},y=async()=>{let P=X[Q];if(!P||G)return;if(P.source==="cli"){O(`${P.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(P.status==="error"){O(P.error??`${P.manifest.name} 当前不可用`);return}z(!0),O("");try{let j=await LX(Z.getWorkspaceRoot(),P.manifest.name,P.status!=="active",_);O(j.effectiveEnabled?`已启用 ${P.manifest.name} · 生效层级 ${j.effectiveScope}`:`已禁用 ${P.manifest.name} · 生效层级 ${j.effectiveScope}`),w((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{z(!1)}},S=async()=>{if(G)return;z(!0),O("");try{await BX(Z.getWorkspaceRoot()),U(0),O("插件列表已刷新"),w((P)=>P+1)}catch(P){O(P instanceof Error?P.message:String(P))}finally{z(!1)}},T=async()=>{let P=X[Q];if(!P||G)return;if(!P.installation){O(`${P.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}z(!0),N(null),O("");try{let{result:j}=await wX(Z.getWorkspaceRoot(),P.manifest.name,{trusted:!0});if(!j.success)throw Error(j.error);O(j.changed?`已更新 ${P.manifest.name} 到 ${j.installation?.revision}`:`${P.manifest.name} 已是最新版本`),w((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{z(!1)}},R=async()=>{let P=X[Q];if(!P||G)return;if(!P.installation){O(`${P.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(q!==P.manifest.name){N(P.manifest.name),O(`再次按 x 确认卸载 ${P.manifest.name}`);return}z(!0),O("");try{let{result:j}=await PX(Z.getWorkspaceRoot(),P.manifest.name,!0);if(!j.success)throw Error(j.error);N(null),U(0),O(`已卸载 ${P.manifest.name}`),w((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{z(!1)}};if(O0((P,j)=>{if(j.escape)J?.();else if(j.ctrl&&P==="c"||j.meta&&P==="c")M();else if((j.upArrow||P==="k")&&X.length>0)N(null),U((o)=>(o-1+X.length)%X.length);else if((j.downArrow||P==="j")&&X.length>0)N(null),U((o)=>(o+1)%X.length);else if(P===" "||j.return)y();else if(P==="r")S();else if(P==="s")L();else if(P==="u")T();else if(P==="x")R()},{isActive:Y}),X.length===0)return s(x0,{flexDirection:"column",paddingY:1,children:[s(x0,{marginBottom:1,children:s(A0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[s(A0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{marginTop:1,paddingLeft:2,children:s(A0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{marginTop:1,children:s(A0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return s(x0,{flexDirection:"column",paddingY:1,children:[s(x0,{marginBottom:1,children:[s(A0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),s(A0,{color:"gray",children:[" (共 ",C.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,marginBottom:1,children:s(A0,{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),s(x0,{paddingLeft:2,marginBottom:1,children:s(A0,{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),s(x0,{paddingLeft:2,marginBottom:1,children:s(A0,{color:"gray",children:["写入层级: ",s(A0,{color:"cyan",children:_},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B.cli.length>0&&s(x0,{flexDirection:"column",marginBottom:1,children:[s(x0,{paddingLeft:1,children:[s(A0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),s(A0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.cli.map((P)=>{let j=P.status==="active"?"[on]":"[off]",o=X.indexOf(P)===Q;return s(x0,{flexDirection:"column",paddingLeft:2,children:[s(A0,{children:[s(A0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",P.manifest.name]},void 0,!0,void 0,this),s(A0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&s(x0,{paddingLeft:2,children:s(A0,{color:"blue",children:["命令:"," ",P.commands.map((u)=>`/${u.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&&s(x0,{flexDirection:"column",marginBottom:1,children:[s(x0,{paddingLeft:1,children:[s(A0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),s(A0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.project.map((P)=>{let j=P.status==="active"?"[on]":"[off]",o=X.indexOf(P)===Q;return s(x0,{flexDirection:"column",paddingLeft:2,children:[s(A0,{children:[s(A0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",P.manifest.name]},void 0,!0,void 0,this),s(A0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",dimColor:!0,children:["生效层级:"," ",H?.[P.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&s(x0,{paddingLeft:2,children:s(A0,{color:"blue",children:["命令:"," ",P.commands.map((u)=>`/${u.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&&s(x0,{flexDirection:"column",marginBottom:1,children:[s(x0,{paddingLeft:1,children:[s(A0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),s(A0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.user.map((P)=>{let j=P.status==="active"?"[on]":"[off]",o=X.indexOf(P)===Q;return s(x0,{flexDirection:"column",paddingLeft:2,children:[s(A0,{children:[s(A0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",P.manifest.name]},void 0,!0,void 0,this),s(A0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",dimColor:!0,children:["生效层级:"," ",H?.[P.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&s(x0,{paddingLeft:2,children:s(A0,{color:"blue",children:["命令:"," ",P.commands.map((u)=>`/${u.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),s(x0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[s(A0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{marginTop:1,children:s(A0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&s(x0,{marginTop:1,children:s(A0,{color:K.includes("失败")?"red":"cyan",children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&s(A0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as M$,Text as T$,useStdout as PK}from"ink";import AK from"ink-text-input";import j9,{useCallback as S8,useMemo as bK,useState as $2}from"react";import{jsxDEV as V0}from"react/jsx-dev-runtime";var MK=j9.memo(({option:$,index:J,isSelected:Y,isMultiSelect:Z,isHighlighted:X})=>V0(M$,{flexDirection:"column",marginBottom:1,children:[V0(T$,{color:X?"yellow":Y?"green":void 0,bold:X,children:[Z?Y?"(*) ":"( ) ":X?"> ":" ",J+1,". ",$.label]},void 0,!0,void 0,this),V0(M$,{marginLeft:4,children:V0(T$,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),TK=j9.memo(({questions:$,answers:J})=>V0(M$,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let Z=J[Y.header],X=Array.isArray(Z)?Z.join(", "):Z||"(no answer)";return V0(M$,{marginBottom:1,children:[V0(T$,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),V0(T$,{color:"green",children:[" ",X]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),bX=j9.memo(({questions:$,onComplete:J,onCancel:Y})=>{let{stdout:Z}=PK(),X=Z.columns||80,U=s0()==="confirmation-prompt",G=e0(!1),[z,K]=$2("answering"),[O,q]=$2(0),[N,_]=$2({}),[W,H]=$2(0),[A,b]=$2([]),[w,B]=$2(!1),[C,F]=$2(""),[M,L]=$2(0),y=$[O],S=bK(()=>{if(!y)return[];return[...y.options.map((u)=>({label:u.label,value:u.label,description:u.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[y]),T=S8((u)=>{let J0={...N,[y.header]:u};if(_(J0),O<$.length-1)q(O+1),H(0),b([]),B(!1),F("");else K("submit"),L(0)},[N,y?.header,O,$.length]),R=S8((u)=>{let J0=S[u];if(!J0)return;if(J0.value==="__other__"){B(!0);return}if(y.multiSelect)b((K0)=>K0.includes(J0.value)?K0.filter((q0)=>q0!==J0.value):[...K0,J0.value]);else T(J0.value)},[S,y?.multiSelect,T]),P=S8((u)=>{if(u.trim())T(u.trim())},[T]),j=S8(()=>{K("answering"),q(0),H(0),b([]),B(!1)},[]),o=S8(()=>{J(N)},[N,J]);if(O0((u,J0)=>{if(J0.ctrl&&u==="c"||J0.meta&&u==="c"){G();return}if(w){if(J0.escape)B(!1),F("");return}if(J0.escape){Y();return}let K0=parseInt(u);if(K0>=1&&K0<=S.length){R(K0-1);return}if(J0.upArrow){H((q0)=>q0>0?q0-1:S.length-1);return}if(J0.downArrow||J0.tab){H((q0)=>q0<S.length-1?q0+1:0);return}if(J0.return){if(y.multiSelect&&A.length>0)T(A);else R(W);return}if(u===" "&&y.multiSelect){let q0=S[W];if(q0&&q0.value!=="__other__")b((a)=>a.includes(q0.value)?a.filter((f)=>f!==q0.value):[...a,q0.value]);return}},{isActive:U&&z==="answering"&&!w}),O0((u,J0)=>{if(J0.ctrl&&u==="c"||J0.meta&&u==="c"){G();return}if(J0.escape){Y();return}if(J0.upArrow||J0.downArrow||J0.tab){L((K0)=>K0===0?1:0);return}if(J0.return){if(M===0)o();else j();return}if(u.toLowerCase()==="y"){o();return}if(u.toLowerCase()==="e"){j();return}},{isActive:U&&z==="submit"}),z==="submit")return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:U?"green":"gray",padding:1,width:Math.min(X-4,80),children:[V0(M$,{marginBottom:1,children:V0(T$,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V0(TK,{questions:$,answers:N},void 0,!1,void 0,this),V0(M$,{flexDirection:"column",marginTop:1,children:[V0(T$,{color:M===0?"yellow":void 0,bold:M===0,children:[M===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),V0(T$,{color:M===1?"yellow":void 0,bold:M===1,children:[M===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V0(M$,{marginTop:1,children:V0(T$,{color:"gray",children:"Enter to confirm · Up/Down to navigate · Y/E for quick select"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!y)return null;return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:U?"cyan":"gray",padding:1,width:Math.min(X-4,80),children:[V0(M$,{marginBottom:1,children:[V0(T$,{backgroundColor:"blue",color:"white",children:[" ",y.header," "]},void 0,!0,void 0,this),V0(T$,{children:[" ",y.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w?V0(M$,{flexDirection:"column",marginTop:1,children:[V0(T$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),V0(M$,{marginTop:1,children:[V0(T$,{color:"cyan",children:"> "},void 0,!1,void 0,this),V0(AK,{value:C,onChange:F,onSubmit:P,focus:U},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V0(M$,{marginTop:1,children:V0(T$,{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):V0(M$,{flexDirection:"column",children:S.map((u,J0)=>V0(MK,{option:u,index:J0,isSelected:A.includes(u.value),isMultiSelect:y.multiSelect,isHighlighted:W===J0},u.value,!1,void 0,this))},void 0,!1,void 0,this),!w&&V0(M$,{marginTop:1,flexDirection:"column",children:[V0(T$,{color:"gray",children:y.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),y.multiSelect&&A.length>0&&V0(T$,{color:"green",children:["Selected: ",A.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&V0(M$,{marginTop:1,children:V0(T$,{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 g9,Text as E1,useStdout as fK}from"ink";import{useEffect as m9,useMemo as X6,useRef as b2,useState as M2}from"react";function CK($,J){return[...$,J].join(`
160
+ `).replace(/\n+$/,"")}function k8($){let J=2166136261;for(let Y=0;Y<$.length;Y++)J^=$.charCodeAt(Y),J=Math.imul(J,16777619);return`${$.length}:${(J>>>0).toString(16)}`}function CX({messages:$,currentStreamingMessageId:J,streamingLines:Y,streamingTail:Z,currentThinkingContent:X}){let Q=CK(Y,Z),U=[];for(let G of $){let z=G.id===J?Q:G.content,K=G.metadata&&"phase"in G.metadata?String(G.metadata.phase):"",O=G.id===J?X??G.thinkingContent:G.thinkingContent;if(G.role==="assistant"&&O)U.push({id:`${G.id}:thinking`,messageId:G.id,role:"assistant",kind:"thinking",content:O,revision:`${G.timestamp}:thinking:${k8(O)}`,collapsible:!0});let q=G.role==="tool"&&G.metadata&&"detail"in G.metadata&&typeof G.metadata.detail==="string"&&G.metadata.detail.length>0?G.metadata.detail:void 0;U.push({id:G.id,messageId:G.id,role:G.role,kind:G.role==="tool"?"tool":"message",content:z,detail:q,revision:`${G.timestamp}:${k8(z)}:${k8(q??"")}:${K}`,collapsible:q!==void 0})}if(J&&!U.some((G)=>G.id===J)){if(X)U.push({id:`${J}:thinking`,messageId:J,role:"assistant",kind:"thinking",content:X,revision:`stream:thinking:${k8(X)}`,collapsible:!0});U.push({id:J,messageId:J,role:"assistant",kind:"message",content:Q,revision:`stream:${k8(Q)}`,collapsible:!1})}return U}var MX={user:"> ",assistant:"• ",system:" ",tool:"└ "};function J6($,J,Y){let Z=J.text.length>0?J.text.split(`
161
+ `):[""],X=[];for(let[Q,U]of Z.entries()){let G=X.length===0?J.firstPrefix:J.nextPrefix,z=Math.max(1,Y-G.length),K=i2(U,z,!0),O=0;for(let q of K){let N=q.length>0?U.indexOf(q,O):O,_=N>=0?N:O,W=_+q.length,H=X.length===0?J.firstPrefix:J.nextPrefix;X.push({key:`${$.id}:${J.key}:${Q}:${X.length}`,blockId:$.id,role:$.role,kind:$.kind,text:`${H}${q}`,copyText:q,pending:$.pending===!0,header:J.header&&X.length===0,sourceLine:J.sourceLineOffset+Q,sourceStart:_,sourceEnd:W,sourceTextOffset:H.length}),O=W}}return X}function TX($){return $.length===0?0:$.split(`
162
162
  `).length}function RK($){let J=$.split(`
163
- `)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function j9($,J,Y=!1){if($.kind==="thinking"){let Z=Y?"[-]":"[+]",X=RK($.content),Q=`${Z} Thinking (${CX($.content)} lines)${!Y&&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(!Y)return[U];return[U,...$6($,{text:$.content,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:0,key:"thinking",header:!1},J)]}if($.kind==="tool"&&$.detail){let Z=Y?"[-]":"[+]",X=$6($,{text:$.content,firstPrefix:`${TX.tool}${Z} `,nextPrefix:" ",sourceLineOffset:0,key:"summary",header:!0},J);if(!Y)return X;return[...X,...$6($,{text:$.detail,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:CX($.content),key:"detail",header:!1},J)]}return $6($,{text:$.content.length>0?$.content:"…",firstPrefix:TX[$.role],nextPrefix:" ",sourceLineOffset:0,key:"content",header:!0},J)}function yX($,J,Y=new Set){return $.flatMap((Z,X)=>{let Q=j9(Z,J,Y.has(Z.id));if(X===$.length-1)return Q;return[...Q,{key:`${Z.id}:separator`,blockId:Z.id,role:Z.role,kind:Z.kind,text:"",copyText:"",pending:Z.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})}function yK($){if($.kind==="tool"&&$.detail)return[...$.content.split(`
163
+ `)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function E9($,J,Y=!1){if($.kind==="thinking"){let Z=Y?"[-]":"[+]",X=RK($.content),Q=`${Z} Thinking (${TX($.content)} lines)${!Y&&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(!Y)return[U];return[U,...J6($,{text:$.content,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:0,key:"thinking",header:!1},J)]}if($.kind==="tool"&&$.detail){let Z=Y?"[-]":"[+]",X=J6($,{text:$.content,firstPrefix:`${MX.tool}${Z} `,nextPrefix:" ",sourceLineOffset:0,key:"summary",header:!0},J);if(!Y)return X;return[...X,...J6($,{text:$.detail,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:TX($.content),key:"detail",header:!1},J)]}return J6($,{text:$.content.length>0?$.content:"…",firstPrefix:MX[$.role],nextPrefix:" ",sourceLineOffset:0,key:"content",header:!0},J)}function RX($,J,Y=new Set){return $.flatMap((Z,X)=>{let Q=E9(Z,J,Y.has(Z.id));if(X===$.length-1)return Q;return[...Q,{key:`${Z.id}:separator`,blockId:Z.id,role:Z.role,kind:Z.kind,text:"",copyText:"",pending:Z.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})}function yK($){if($.kind==="tool"&&$.detail)return[...$.content.split(`
164
164
  `),...$.detail.split(`
165
165
  `)];return $.content.split(`
166
- `)}function IK($,J){let Y=[];for(let[Z,X]of yK($).entries())for(let Q of X.matchAll(J)){let U=Q.index,G=Q[0];if(G.length===0)continue;Y.push({blockId:$.id,sourceLine:Z,start:U,end:U+G.length})}return Y}class k8{cache=new Map;search($,J){if(J.length===0)return[];let Y=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Z=new RegExp(Y,"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 G=IK(Q,Z);return this.cache.set(Q.id,{revision:Q.revision,query:J,matches:G}),G})}}function h9($,J){let Y=$.findIndex((Z)=>Z.blockId===J.blockId&&Z.sourceLine===J.sourceLine&&J.start>=Z.sourceStart&&J.start<Math.max(Z.sourceEnd,Z.sourceStart+1));if(Y>=0)return Y;return $.findIndex((Z)=>Z.blockId===J.blockId)}function IX($,J){if($.sourceLine===null||$.sourceEnd<=$.sourceStart)return[];let Y=[];for(let[Z,X]of J.entries()){if(X.blockId!==$.blockId||X.sourceLine!==$.sourceLine||X.end<=$.sourceStart||X.start>=$.sourceEnd)continue;Y.push({start:$.sourceTextOffset+Math.max($.sourceStart,X.start)-$.sourceStart,end:$.sourceTextOffset+Math.min($.sourceEnd,X.end)-$.sourceStart,matchIndex:Z})}return Y}function SX($,J,Y){let Z=Math.max(0,Math.min(J,Y)),X=Math.min($.length-1,Math.max(J,Y));if(X<Z)return"";let Q=$.slice(Z,X+1),U="";for(let[G,z]of Q.entries()){if(G===0){U=z.copyText;continue}let K=Q[G-1],O=z.sourceLine!==null&&z.blockId===K.blockId&&z.sourceLine===K.sourceLine;U+=`${O?"":`
167
- `}${z.copyText}`}return U}function kX($,J){let Y=new Map($.map((Z)=>[Z.id,Z.revision]));return J.filter((Z)=>Y.get(Z.id)!==Z.revision).map((Z)=>Z.id)}import{spawn as SK}from"node:child_process";function kK($){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 DK($,J,Y){return new Promise((Z)=>{let X=!1,Q=SK($,[...J],{stdio:["pipe","ignore","ignore"]}),U=setTimeout(()=>{if(X)return;X=!0,Q.kill("SIGKILL"),Z(!1)},2000),G=(z)=>{if(X)return;X=!0,clearTimeout(U),Z(z)};Q.once("error",()=>G(!1)),Q.once("close",(z)=>G(z===0)),Q.stdin.once("error",()=>G(!1)),Q.stdin.end(Y)})}function DX($,J=!1){let Y=`\x1B]52;c;${Buffer.from($,"utf8").toString("base64")}\x07`;if(!J)return Y;return`\x1BPtmux;${Y.replaceAll("\x1B","\x1B\x1B")}\x1B\\`}async function J6($,J={}){if($.length===0)return{success:!1};let Y=J.platform??process.platform,Z=J.env??process.env,X=J.runCommand??DK,Q=J.writeTerminal??((z)=>process.stdout.write(z)),U=Boolean(Z.SSH_CONNECTION),G=async(z)=>{try{return await X(z.command,z.args,$)}catch{return!1}};if(!U){for(let z of kK(Y))if(await G(z))return{success:!0,method:"native"}}if(Z.TMUX){if(await G({command:"tmux",args:["load-buffer","-w","-"]})){try{Q(DX($,!0))}catch{}return{success:!0,method:"tmux"}}}try{return Q(DX($)),{success:!0,method:"osc52"}}catch{return{success:!1}}}import{jsxDEV as $1}from"react/jsx-dev-runtime";function vK($){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 VK($,J,Y){let Z=Array.from($.value);if(Y.backspace||Y.delete){if($.cursor===0)return $;return Z.splice($.cursor-1,1),{value:Z.join(""),cursor:$.cursor-1}}if(Y.leftArrow)return{...$,cursor:Math.max(0,$.cursor-1)};if(Y.rightArrow)return{...$,cursor:Math.min(Z.length,$.cursor+1)};if(!J||Y.ctrl||Y.meta)return $;return Z.splice($.cursor,0,...Array.from(J)),{value:Z.join(""),cursor:$.cursor+Array.from(J).length}}var fX=({state:$,onLoadOlder:J,onFork:Y,onClose:Z})=>{let X=s0(),{width:Q,height:U}=r1(),{stdout:G}=fK(),z=Math.max(20,Q-4),K=Math.max(1,U-8),O=Y6(()=>vK($.messages),[$.messages]),q=Y6(()=>yX(O,z),[O,z]),N=Math.max(0,q.length-K),[_,W]=M2(0),H=b2(0),[A,b]=M2(()=>Math.max(0,q.length-1)),w=b2(A),B=b2(q.at(-1)?.key??null),[C,F]=M2(!1),M=b2(!1),[L,y]=M2({value:"",cursor:0}),S=b2(L),[T,R]=M2(""),[P,j]=M2(0),o=b2(new k8),u=b2(null),[J0,K0]=M2(null),q0=Y6(()=>$.session?{viewGeneration:$.viewGeneration,locator:$.session.locator,snapshot:$.snapshot,olderCursor:$.olderCursor}:void 0,[$.olderCursor,$.session,$.snapshot,$.viewGeneration]);H.current=_,w.current=A,M.current=C,S.current=L;let a=Y6(()=>o.current.search(O,T),[O,T]);g9(()=>{u.current=null},[$.olderCursor]),g9(()=>{if($.status==="error")u.current=null},[$.status]),g9(()=>{let E=B.current?q.findIndex((X0)=>X0.key===B.current):-1,n=q.length===0?0:E>=0?E:q.length-1;w.current=n,B.current=q[n]?.key??null,b(n);let N0=Math.max(0,Math.min(H.current,N));H.current=N0,W(N0)},[q,N]);let f=()=>{let E=$.olderCursor;if(!E||!q0||!$.session?.capabilities.history.read||$.status!=="ready"&&$.status!=="error")return;if(u.current===E)return;u.current=E,J(q0)},v=(E,n=!0)=>{let N0=Math.max(0,Math.min(N,E));H.current=N0,W(N0);let X0=Math.max(1,q.length-N0),C0=Math.max(0,X0-K),Q0=Math.max(C0,Math.min(X0-1,w.current));if(w.current=Q0,B.current=q[Q0]?.key??null,b(Q0),n&&N0===N)f()},G0=(E)=>{if(a.length===0)return;let n=(E%a.length+a.length)%a.length,N0=a[n],X0=q.findIndex((Q0)=>Q0.blockId===N0.blockId);if(j(n),X0<0)return;w.current=X0,B.current=q[X0]?.key??null,b(X0);let C0=Math.max(0,q.length-Math.min(q.length,X0+1));v(C0,!1)},V=()=>{let E=q[w.current];if(!E)return;J6(E.copyText,{writeTerminal:(n)=>G.write(n)}).then((n)=>{K0(n.success?"Copied":"Copy failed")})};O0((E,n)=>{let N0=n;if(M.current){if(N0.escape)return M.current=!1,F(!1),!0;if(N0.return){let C0=S.current.value;R(C0),M.current=!1,F(!1);let Q0=o.current.search(O,C0);if(Q0.length>0){let S0=Q0[0],Y0=q.findIndex((E0)=>E0.blockId===S0.blockId);if(j(0),Y0>=0)w.current=Y0,B.current=q[Y0]?.key??null,b(Y0),v(Math.max(0,q.length-Math.min(q.length,Y0+1)),!1)}return!0}let X0=VK(S.current,E,N0);return S.current=X0,y(X0),!0}if(N0.escape||E==="q")return Z(),!0;if(E==="/"){let X0={value:T,cursor:Array.from(T).length};return S.current=X0,y(X0),M.current=!0,F(!0),!0}if(E==="n"&&a.length>0)return G0(P+1),!0;if(E==="N"&&a.length>0)return G0(P-1),!0;if(E==="y")return V(),!0;if(E==="f"){if(q0&&$.session?.capabilities.history.fork&&$.status==="ready")Y(q0);return!0}if(N0.home||E==="g")return w.current=0,B.current=q[0]?.key??null,b(0),v(N),!0;if(N0.end||E==="G")return w.current=Math.max(0,q.length-1),B.current=q[w.current]?.key??null,b(w.current),v(0),!0;if(N0.pageUp)return v(H.current+Math.max(1,K-1)),!0;if(N0.pageDown)return v(H.current-Math.max(1,K-1)),!0;if(N0.upArrow||E==="k")return w.current=Math.max(0,w.current-1),B.current=q[w.current]?.key??null,b(w.current),v(H.current+1),!0;if(N0.downArrow||E==="j")return w.current=Math.min(q.length-1,w.current+1),B.current=q[w.current]?.key??null,b(w.current),v(H.current-1),!0;return!0},{isActive:X==="session-history-viewer",priority:200});let x=Math.max(0,q.length-_),l=Math.max(0,x-K),H0=q.slice(l,x),F0=T?`/${T} ${a.length>0?`${P+1}/${a.length}`:"0/0"} · loaded pages only`:null,T0=$.session,I=[T0&&!T0.capabilities.history.read?"Older history unavailable":null,T0&&!T0.capabilities.history.fork?"Fork unavailable":null].filter((E)=>E!==null).join(" · "),D=$.status==="loading"?"Loading Session history…":$.status==="forking"?"Forking Session history…":$.status==="loading-older"?"Loading older history…":null,p=$.error?.message??D??J0??F0??(I||`${$.status==="loading-older"?"Loading older history… · ":""}/ search · y copy · f fork · Esc close`);return $1(E9,{flexDirection:"column",width:"100%",height:U,paddingX:2,children:[$1(E9,{justifyContent:"space-between",children:[$1(h1,{bold:!0,color:"cyan",children:T0?.title?.trim()||"Session history"},void 0,!1,void 0,this),$1(h1,{color:"yellow",children:["Remote · ",T0?.capabilities.connection??"offline"," · History only"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$1(h1,{dimColor:!0,children:T0?.displayCwd??""},void 0,!1,void 0,this),$.truncated?$1(h1,{color:"yellow",children:"History content was truncated."},void 0,!1,void 0,this):null,$1(E9,{flexDirection:"column",height:K,children:H0.map((E,n)=>$1(h1,{color:l+n===A?"cyan":void 0,children:E.text},E.key,!1,void 0,this))},void 0,!1,void 0,this),C?$1(h1,{children:["/",L.value]},void 0,!0,void 0,this):null,$1(h1,{color:$.error?"red":"gray",children:p},void 0,!1,void 0,this),$1(h1,{dimColor:!0,children:"Open this Session from its ACP owner to continue."},void 0,!1,void 0,this),$1(h1,{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 T2,Text as z1}from"ink";import{useEffect as jK,useMemo as J2,useRef as vX,useState as VX}from"react";import{jsxDEV as W$}from"react/jsx-dev-runtime";function hK($){let J=new Date($),Z=new Date().getTime()-J.getTime(),X=Math.floor(Z/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 EK=({isSelected:$})=>W$(T2,{marginRight:1,children:W$(z1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),gK=({isSelected:$,label:J})=>W$(z1,{color:$?"cyan":"white",bold:$,children:J},void 0,!1,void 0,this),d$=20,jX=({intent:$,sessions:J,taskAttentionUnreadKeys:Y=[],onSelect:Z,onCancel:X})=>{let[Q,U]=VX(null),[G,z]=VX(!1),K=vX(!1),O=vX(!0);jK(()=>{return O.current=!0,()=>{O.current=!1}},[]);let N=s0()==="session-selector",_=e0(!1);O0((R,P)=>{if(P.ctrl&&R==="c"||P.meta&&R==="c"){_();return}if(K.current)return;if(P.escape&&X){X();return}if(W.length===0)return;if(P.leftArrow||R==="h"||R==="H"){if(C>0)F((C-1)*d$);return}if(P.rightArrow||R==="l"||R==="L"){if(C<M-1)F((C+1)*d$);return}if(P.upArrow||R==="k"){F(C*d$+(w%d$-1+y.length)%y.length);return}if(P.downArrow||R==="j"){F(C*d$+(w%d$+1)%y.length);return}if(/^[1-9]$/.test(R)){let j=y[Number(R)-1];if(j)T(j);return}if(P.return){let j=y[w%d$];if(j)T(j)}},{isActive:N});let W=J2(()=>Q4(J,$),[$,J]),H=J2(()=>oJ($),[$]),A=J2(()=>new Set(Y),[Y]),b=J2(()=>W.map(T1),[W]),w=Math.max(0,Q?.intent===$&&Q.key!==null?b.indexOf(Q.key):-1),B=b[w]??null,C=Math.floor(w/d$),F=(R)=>{U({intent:$,key:b[R]??null})},M=J2(()=>Math.max(1,Math.ceil(W.length/d$)),[W.length]),L=J2(()=>{let R=C*d$;return W.slice(R,R+d$)},[C,W]),y=J2(()=>{return L.map((R)=>{let P=hK(R.lastMessageTime);return{key:T1(R),label:iJ(R,P,$==="resume"&&A.has(cJ(R))),value:R}})},[$,L,A]),S=J2(()=>({start:C*d$+1,end:Math.min((C+1)*d$,W.length)}),[C,W.length]);if(Q?.intent!==$||Q.key!==B)U({intent:$,key:B});let T=(R)=>{if(K.current)return;K.current=!0,z(!0);let P=()=>{if(!O.current)return;K.current=!1,z(!1)};Promise.resolve().then(()=>Z(R.value)).then(P,P)};if(W.length===0)return W$(T2,{flexDirection:"column",paddingX:2,paddingY:1,children:[W$(z1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),W$(z1,{dimColor:!0,children:[`
166
+ `)}function IK($,J){let Y=[];for(let[Z,X]of yK($).entries())for(let Q of X.matchAll(J)){let U=Q.index,G=Q[0];if(G.length===0)continue;Y.push({blockId:$.id,sourceLine:Z,start:U,end:U+G.length})}return Y}class D8{cache=new Map;search($,J){if(J.length===0)return[];let Y=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Z=new RegExp(Y,"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 G=IK(Q,Z);return this.cache.set(Q.id,{revision:Q.revision,query:J,matches:G}),G})}}function h9($,J){let Y=$.findIndex((Z)=>Z.blockId===J.blockId&&Z.sourceLine===J.sourceLine&&J.start>=Z.sourceStart&&J.start<Math.max(Z.sourceEnd,Z.sourceStart+1));if(Y>=0)return Y;return $.findIndex((Z)=>Z.blockId===J.blockId)}function yX($,J){if($.sourceLine===null||$.sourceEnd<=$.sourceStart)return[];let Y=[];for(let[Z,X]of J.entries()){if(X.blockId!==$.blockId||X.sourceLine!==$.sourceLine||X.end<=$.sourceStart||X.start>=$.sourceEnd)continue;Y.push({start:$.sourceTextOffset+Math.max($.sourceStart,X.start)-$.sourceStart,end:$.sourceTextOffset+Math.min($.sourceEnd,X.end)-$.sourceStart,matchIndex:Z})}return Y}function IX($,J,Y){let Z=Math.max(0,Math.min(J,Y)),X=Math.min($.length-1,Math.max(J,Y));if(X<Z)return"";let Q=$.slice(Z,X+1),U="";for(let[G,z]of Q.entries()){if(G===0){U=z.copyText;continue}let K=Q[G-1],O=z.sourceLine!==null&&z.blockId===K.blockId&&z.sourceLine===K.sourceLine;U+=`${O?"":`
167
+ `}${z.copyText}`}return U}function SX($,J){let Y=new Map($.map((Z)=>[Z.id,Z.revision]));return J.filter((Z)=>Y.get(Z.id)!==Z.revision).map((Z)=>Z.id)}import{spawn as SK}from"node:child_process";function kK($){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 DK($,J,Y){return new Promise((Z)=>{let X=!1,Q=SK($,[...J],{stdio:["pipe","ignore","ignore"]}),U=setTimeout(()=>{if(X)return;X=!0,Q.kill("SIGKILL"),Z(!1)},2000),G=(z)=>{if(X)return;X=!0,clearTimeout(U),Z(z)};Q.once("error",()=>G(!1)),Q.once("close",(z)=>G(z===0)),Q.stdin.once("error",()=>G(!1)),Q.stdin.end(Y)})}function kX($,J=!1){let Y=`\x1B]52;c;${Buffer.from($,"utf8").toString("base64")}\x07`;if(!J)return Y;return`\x1BPtmux;${Y.replaceAll("\x1B","\x1B\x1B")}\x1B\\`}async function Y6($,J={}){if($.length===0)return{success:!1};let Y=J.platform??process.platform,Z=J.env??process.env,X=J.runCommand??DK,Q=J.writeTerminal??((z)=>process.stdout.write(z)),U=Boolean(Z.SSH_CONNECTION),G=async(z)=>{try{return await X(z.command,z.args,$)}catch{return!1}};if(!U){for(let z of kK(Y))if(await G(z))return{success:!0,method:"native"}}if(Z.TMUX){if(await G({command:"tmux",args:["load-buffer","-w","-"]})){try{Q(kX($,!0))}catch{}return{success:!0,method:"tmux"}}}try{return Q(kX($)),{success:!0,method:"osc52"}}catch{return{success:!1}}}import{jsxDEV as $1}from"react/jsx-dev-runtime";function vK($){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 VK($,J,Y){let Z=Array.from($.value);if(Y.backspace||Y.delete){if($.cursor===0)return $;return Z.splice($.cursor-1,1),{value:Z.join(""),cursor:$.cursor-1}}if(Y.leftArrow)return{...$,cursor:Math.max(0,$.cursor-1)};if(Y.rightArrow)return{...$,cursor:Math.min(Z.length,$.cursor+1)};if(!J||Y.ctrl||Y.meta)return $;return Z.splice($.cursor,0,...Array.from(J)),{value:Z.join(""),cursor:$.cursor+Array.from(J).length}}var DX=({state:$,onLoadOlder:J,onFork:Y,onClose:Z})=>{let X=s0(),{width:Q,height:U}=r1(),{stdout:G}=fK(),z=Math.max(20,Q-4),K=Math.max(1,U-8),O=X6(()=>vK($.messages),[$.messages]),q=X6(()=>RX(O,z),[O,z]),N=Math.max(0,q.length-K),[_,W]=M2(0),H=b2(0),[A,b]=M2(()=>Math.max(0,q.length-1)),w=b2(A),B=b2(q.at(-1)?.key??null),[C,F]=M2(!1),M=b2(!1),[L,y]=M2({value:"",cursor:0}),S=b2(L),[T,R]=M2(""),[P,j]=M2(0),o=b2(new D8),u=b2(null),[J0,K0]=M2(null),q0=X6(()=>$.session?{viewGeneration:$.viewGeneration,locator:$.session.locator,snapshot:$.snapshot,olderCursor:$.olderCursor}:void 0,[$.olderCursor,$.session,$.snapshot,$.viewGeneration]);H.current=_,w.current=A,M.current=C,S.current=L;let a=X6(()=>o.current.search(O,T),[O,T]);m9(()=>{u.current=null},[$.olderCursor]),m9(()=>{if($.status==="error")u.current=null},[$.status]),m9(()=>{let h=B.current?q.findIndex((X0)=>X0.key===B.current):-1,n=q.length===0?0:h>=0?h:q.length-1;w.current=n,B.current=q[n]?.key??null,b(n);let N0=Math.max(0,Math.min(H.current,N));H.current=N0,W(N0)},[q,N]);let f=()=>{let h=$.olderCursor;if(!h||!q0||!$.session?.capabilities.history.read||$.status!=="ready"&&$.status!=="error")return;if(u.current===h)return;u.current=h,J(q0)},v=(h,n=!0)=>{let N0=Math.max(0,Math.min(N,h));H.current=N0,W(N0);let X0=Math.max(1,q.length-N0),C0=Math.max(0,X0-K),Q0=Math.max(C0,Math.min(X0-1,w.current));if(w.current=Q0,B.current=q[Q0]?.key??null,b(Q0),n&&N0===N)f()},G0=(h)=>{if(a.length===0)return;let n=(h%a.length+a.length)%a.length,N0=a[n],X0=q.findIndex((Q0)=>Q0.blockId===N0.blockId);if(j(n),X0<0)return;w.current=X0,B.current=q[X0]?.key??null,b(X0);let C0=Math.max(0,q.length-Math.min(q.length,X0+1));v(C0,!1)},V=()=>{let h=q[w.current];if(!h)return;Y6(h.copyText,{writeTerminal:(n)=>G.write(n)}).then((n)=>{K0(n.success?"Copied":"Copy failed")})};O0((h,n)=>{let N0=n;if(M.current){if(N0.escape)return M.current=!1,F(!1),!0;if(N0.return){let C0=S.current.value;R(C0),M.current=!1,F(!1);let Q0=o.current.search(O,C0);if(Q0.length>0){let S0=Q0[0],Y0=q.findIndex((h0)=>h0.blockId===S0.blockId);if(j(0),Y0>=0)w.current=Y0,B.current=q[Y0]?.key??null,b(Y0),v(Math.max(0,q.length-Math.min(q.length,Y0+1)),!1)}return!0}let X0=VK(S.current,h,N0);return S.current=X0,y(X0),!0}if(N0.escape||h==="q")return Z(),!0;if(h==="/"){let X0={value:T,cursor:Array.from(T).length};return S.current=X0,y(X0),M.current=!0,F(!0),!0}if(h==="n"&&a.length>0)return G0(P+1),!0;if(h==="N"&&a.length>0)return G0(P-1),!0;if(h==="y")return V(),!0;if(h==="f"){if(q0&&$.session?.capabilities.history.fork&&$.status==="ready")Y(q0);return!0}if(N0.home||h==="g")return w.current=0,B.current=q[0]?.key??null,b(0),v(N),!0;if(N0.end||h==="G")return w.current=Math.max(0,q.length-1),B.current=q[w.current]?.key??null,b(w.current),v(0),!0;if(N0.pageUp)return v(H.current+Math.max(1,K-1)),!0;if(N0.pageDown)return v(H.current-Math.max(1,K-1)),!0;if(N0.upArrow||h==="k")return w.current=Math.max(0,w.current-1),B.current=q[w.current]?.key??null,b(w.current),v(H.current+1),!0;if(N0.downArrow||h==="j")return w.current=Math.min(q.length-1,w.current+1),B.current=q[w.current]?.key??null,b(w.current),v(H.current-1),!0;return!0},{isActive:X==="session-history-viewer",priority:200});let x=Math.max(0,q.length-_),l=Math.max(0,x-K),H0=q.slice(l,x),F0=T?`/${T} ${a.length>0?`${P+1}/${a.length}`:"0/0"} · loaded pages only`:null,T0=$.session,I=[T0&&!T0.capabilities.history.read?"Older history unavailable":null,T0&&!T0.capabilities.history.fork?"Fork unavailable":null].filter((h)=>h!==null).join(" · "),D=$.status==="loading"?"Loading Session history…":$.status==="forking"?"Forking Session history…":$.status==="loading-older"?"Loading older history…":null,p=$.error?.message??D??J0??F0??(I||`${$.status==="loading-older"?"Loading older history… · ":""}/ search · y copy · f fork · Esc close`);return $1(g9,{flexDirection:"column",width:"100%",height:U,paddingX:2,children:[$1(g9,{justifyContent:"space-between",children:[$1(E1,{bold:!0,color:"cyan",children:T0?.title?.trim()||"Session history"},void 0,!1,void 0,this),$1(E1,{color:"yellow",children:["Remote · ",T0?.capabilities.connection??"offline"," · History only"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$1(E1,{dimColor:!0,children:T0?.displayCwd??""},void 0,!1,void 0,this),$.truncated?$1(E1,{color:"yellow",children:"History content was truncated."},void 0,!1,void 0,this):null,$1(g9,{flexDirection:"column",height:K,children:H0.map((h,n)=>$1(E1,{color:l+n===A?"cyan":void 0,children:h.text},h.key,!1,void 0,this))},void 0,!1,void 0,this),C?$1(E1,{children:["/",L.value]},void 0,!0,void 0,this):null,$1(E1,{color:$.error?"red":"gray",children:p},void 0,!1,void 0,this),$1(E1,{dimColor:!0,children:"Open this Session from its ACP owner to continue."},void 0,!1,void 0,this),$1(E1,{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 T2,Text as z1}from"ink";import{useEffect as jK,useMemo as J2,useRef as fX,useState as vX}from"react";import{jsxDEV as W$}from"react/jsx-dev-runtime";function EK($){let J=new Date($),Z=new Date().getTime()-J.getTime(),X=Math.floor(Z/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 hK=({isSelected:$})=>W$(T2,{marginRight:1,children:W$(z1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),gK=({isSelected:$,label:J})=>W$(z1,{color:$?"cyan":"white",bold:$,children:J},void 0,!1,void 0,this),d$=20,VX=({intent:$,sessions:J,taskAttentionUnreadKeys:Y=[],onSelect:Z,onCancel:X})=>{let[Q,U]=vX(null),[G,z]=vX(!1),K=fX(!1),O=fX(!0);jK(()=>{return O.current=!0,()=>{O.current=!1}},[]);let N=s0()==="session-selector",_=e0(!1);O0((R,P)=>{if(P.ctrl&&R==="c"||P.meta&&R==="c"){_();return}if(K.current)return;if(P.escape&&X){X();return}if(W.length===0)return;if(P.leftArrow||R==="h"||R==="H"){if(C>0)F((C-1)*d$);return}if(P.rightArrow||R==="l"||R==="L"){if(C<M-1)F((C+1)*d$);return}if(P.upArrow||R==="k"){F(C*d$+(w%d$-1+y.length)%y.length);return}if(P.downArrow||R==="j"){F(C*d$+(w%d$+1)%y.length);return}if(/^[1-9]$/.test(R)){let j=y[Number(R)-1];if(j)T(j);return}if(P.return){let j=y[w%d$];if(j)T(j)}},{isActive:N});let W=J2(()=>U4(J,$),[$,J]),H=J2(()=>nJ($),[$]),A=J2(()=>new Set(Y),[Y]),b=J2(()=>W.map(T1),[W]),w=Math.max(0,Q?.intent===$&&Q.key!==null?b.indexOf(Q.key):-1),B=b[w]??null,C=Math.floor(w/d$),F=(R)=>{U({intent:$,key:b[R]??null})},M=J2(()=>Math.max(1,Math.ceil(W.length/d$)),[W.length]),L=J2(()=>{let R=C*d$;return W.slice(R,R+d$)},[C,W]),y=J2(()=>{return L.map((R)=>{let P=EK(R.lastMessageTime);return{key:T1(R),label:oJ(R,P,$==="resume"&&A.has(uJ(R))),value:R}})},[$,L,A]),S=J2(()=>({start:C*d$+1,end:Math.min((C+1)*d$,W.length)}),[C,W.length]);if(Q?.intent!==$||Q.key!==B)U({intent:$,key:B});let T=(R)=>{if(K.current)return;K.current=!0,z(!0);let P=()=>{if(!O.current)return;K.current=!1,z(!1)};Promise.resolve().then(()=>Z(R.value)).then(P,P)};if(W.length===0)return W$(T2,{flexDirection:"column",paddingX:2,paddingY:1,children:[W$(z1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),W$(z1,{dimColor:!0,children:[`
168
168
  `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return W$(T2,{flexDirection:"column",paddingX:2,paddingY:1,children:[W$(z1,{bold:!0,color:"cyan",children:H.title},void 0,!1,void 0,this),W$(z1,{dimColor:!0,children:[`
169
169
  `,H.instructions,`
170
- `]},void 0,!0,void 0,this),W$(T2,{flexDirection:"column",children:y.map((R)=>W$(T2,{children:[W$(EK,{isSelected:R.key===B},void 0,!1,void 0,this),W$(gK,{label:R.label,isSelected:R.key===B},void 0,!1,void 0,this)]},R.key,!0,void 0,this))},void 0,!1,void 0,this),G&&W$(z1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),W$(T2,{marginTop:1,flexDirection:"column",children:[W$(z1,{dimColor:!0,children:["第 ",C+1,"/",M," 页 · 共 ",W.length," 个会话 · 显示"," ",S.start,"-",S.end]},void 0,!0,void 0,this),M>1&&W$(T2,{marginTop:1,children:[W$(z1,{color:C>0?"cyan":"gray",children:C>0?"<< 上一页":" "},void 0,!1,void 0,this),W$(z1,{children:" "},void 0,!1,void 0,this),W$(z1,{color:C<M-1?"cyan":"gray",children:C<M-1?"下一页 >>":""},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as X6,getInnerHeight as mK,getScrollHeight as pK,Text as C2}from"ink";import xK,{useEffect as EX,useRef as cK,useState as gX}from"react";function hX($=200){return M4("rows",$)}import{jsxDEV as l$,Fragment as uK}from"react/jsx-dev-runtime";var mX=["|","/","-","\\"],m9=xK.memo(()=>{let $=h2(),J=D0(),Y=d2(),Z=hX(),X=j2(),{dismissSideConversation:Q}=N1(),U=s0(),G=cK(null),[z,K]=gX(0),[O,q]=gX(0),N=Math.max(1,Math.floor(Z/2)-3),_=$?.status==="error"||$?.status==="completed"&&Boolean($.response);if(EX(()=>{K(0)},[$?.requestId]),O0((W,H)=>{if(H.escape)return Q(),!0;if(!H.pageDown&&!H.pageUp)return!1;let A=G.current;if(!A)return!1;let b=mK(A),w=Math.max(0,pK(A)-b);return K((B)=>{let C=Math.min(B,w),F=Math.max(1,b-1)*(H.pageDown?1:-1);return Math.max(0,Math.min(w,C+F))}),!0},{isActive:Boolean(_)&&X==="none"&&U==="main-input",priority:30}),EX(()=>{if($?.status!=="loading"){q(0);return}let W=setInterval(()=>{q((H)=>(H+1)%mX.length)},100);return()=>clearInterval(W)},[$?.status]),!$)return null;return l$(X6,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[l$(X6,{height:1,flexShrink:0,children:l$(C2,{wrap:"truncate-end",children:[l$(C2,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),l$(C2,{color:J.colors.muted,children:[" | ",$.question.replace(/\s+/g," ")]},void 0,!0,void 0,this),$.durationMs!==void 0&&l$(C2,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$.status==="loading"&&l$(C2,{color:J.colors.text.secondary,children:[mX[O]," Answering..."]},void 0,!0,void 0,this),_&&l$(uK,{children:[l$(X6,{ref:G,flexDirection:"column",maxHeight:N,overflowY:"scroll",scrollTop:z,children:l$(X6,{flexDirection:"column",flexShrink:0,width:"100%",children:$.status==="error"?l$(C2,{color:J.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this):l$(k1,{content:$.response??"",role:"assistant",terminalWidth:Math.max(1,Y-9),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),l$(C2,{color:J.colors.muted,dimColor:!0,wrap:"truncate-end",children:"PgUp/PgDn: scroll side answer · Esc: dismiss"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});m9.displayName="SideConversationPanel";import{Box as _$,Text as t0}from"ink";import{jsxDEV as B0}from"react/jsx-dev-runtime";function xX({onCancel:$}){let J=O1(),Y=s0()==="skills-manager",X=pX({cwd:J}).getAll(),Q=X.filter((K)=>K.source==="builtin"),U=X.filter((K)=>K.source==="user"),G=X.filter((K)=>K.source==="project"),z=e0(!1,$);if(O0((K,O)=>{if(O.escape)$?.();else if(O.ctrl&&K==="c"||O.meta&&K==="c")z()},{isActive:Y}),X.length===0)return B0(_$,{flexDirection:"column",paddingY:1,children:[B0(_$,{marginBottom:1,children:B0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(_$,{marginTop:1,paddingLeft:2,children:B0(t0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(_$,{marginTop:1,children:B0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return B0(_$,{flexDirection:"column",paddingY:1,children:[B0(_$,{marginBottom:1,children:[B0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:[" (找到 ",X.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&B0(_$,{flexDirection:"column",marginBottom:1,children:[B0(_$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(_$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),U.length>0&&B0(_$,{flexDirection:"column",marginBottom:1,children:[B0(_$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(_$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q.length>0&&B0(_$,{flexDirection:"column",marginBottom:1,children:[B0(_$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(_$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&B0(_$,{paddingLeft:2,children:B0(t0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),B0(_$,{marginTop:1,children:B0(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 cX,Text as q1}from"ink";import dK,{useEffect as lK,useMemo as rK,useState as uX}from"react";import{jsxDEV as C$,Fragment as p9}from"react/jsx-dev-runtime";var dX=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function aK($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let Y=Math.floor(J/60),Z=J%60;return`${Y}m ${Z}s`}var lX=dK.memo(()=>{let $=z0((K)=>K.app.subagentProgresses),J=z0((K)=>K.app.subagentProgress),Y=D0(),[Z,X]=uX(0),[Q,U]=uX(()=>Date.now()),G=rK(()=>{let K=Object.values($);return K.length>0?K:J?[J]:[]},[J,$]),z=G.some((K)=>K.status==="running");if(lK(()=>{if(!z){X(0);return}let K=setInterval(()=>{X((q)=>(q+1)%dX.length)},80),O=setInterval(()=>{U(Date.now())},1000);return()=>{clearInterval(K),clearInterval(O)}},[z]),G.length===0)return null;return C$(cX,{paddingX:2,paddingY:0,flexDirection:"column",children:G.map((K)=>{let O=K.status==="running"?dX[Z]:K.status==="completed"?"[OK]":"[X]",q=K.status==="running"?Y.colors.info:K.status==="completed"?Y.colors.success:Y.colors.error,N=Math.max(0,Q-K.startTime);return C$(cX,{flexDirection:"row",gap:1,children:[C$(q1,{color:q,bold:!0,children:O},void 0,!1,void 0,this),C$(q1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),C$(q1,{color:Y.colors.text.primary,bold:!0,children:K.type},void 0,!1,void 0,this),C$(q1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(q1,{color:Y.colors.text.secondary,children:K.description},void 0,!1,void 0,this),K.currentTool&&C$(p9,{children:[C$(q1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(q1,{color:Y.colors.warning,children:K.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="running"&&N>0&&C$(p9,{children:[C$(q1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(q1,{color:Y.colors.info,children:aK(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="failed"&&K.terminalSummary&&C$(p9,{children:[C$(q1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(q1,{color:Y.colors.error,children:K.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},K.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as X8,Text as E1}from"ink";import iK 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"},c9=iK.memo(()=>{let $=zJ().filter((Y)=>Y.status!=="deleted"),J=D0();if($.length===0)return null;return V$(X8,{flexDirection:"column",paddingX:2,children:$.map((Y)=>{let Z=Y.tasks.filter((X)=>X.status==="completed").length;return V$(X8,{flexDirection:"column",marginBottom:1,children:[V$(X8,{gap:1,children:[V$(E1,{bold:!0,color:Y.status==="failed"?J.colors.error:Y.status==="completed"?J.colors.success:J.colors.info,children:[x9[Y.status]," Team"]},void 0,!0,void 0,this),V$(E1,{bold:!0,color:J.colors.text.primary,children:Y.name},void 0,!1,void 0,this),V$(E1,{color:J.colors.muted,children:["| ",Y.members.length-1," members | ",Z,"/",Y.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V$(X8,{flexDirection:"column",paddingLeft:2,children:[Y.members.filter((X)=>X.status!=="leader").map((X)=>V$(X8,{gap:1,children:[V$(E1,{color:J.colors.muted,children:x9[X.status]},void 0,!1,void 0,this),V$(E1,{color:J.colors.text.secondary,children:X.name},void 0,!1,void 0,this),V$(E1,{color:J.colors.muted,children:["(",X.subagentType,", ",X.status,X.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},X.id,!0,void 0,this)),Y.tasks.map((X)=>V$(X8,{gap:1,children:[V$(E1,{color:J.colors.muted,children:x9[X.status]},void 0,!1,void 0,this),V$(E1,{color:J.colors.text.secondary,children:["#",X.id," ",X.subject]},void 0,!0,void 0,this),V$(E1,{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)]},Y.name,!0,void 0,this)})},void 0,!1,void 0,this)});c9.displayName="TeamProgress";import{useMemoizedFn as oK}from"ahooks";import{Box as F1,Text as U0}from"ink";import nK from"ink-select-input";import{useState as rX}from"react";import{jsxDEV as $0}from"react/jsx-dev-runtime";var aX=R2.map(($)=>({label:$.label,value:$.id})),tK=({theme:$})=>{let{colors:J}=$;return $0(F1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(U0,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),$0(U0,{children:" "},void 0,!1,void 0,this),$0(U0,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),$0(U0,{children:[$0(U0,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),$0(U0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(U0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(U0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[" ",$0(U0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(U0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),$0(U0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[" ",$0(U0,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),$0(U0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(U0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(U0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[" ",$0(U0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(U0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),$0(U0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[" ",$0(U0,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:" "},void 0,!1,void 0,this),$0(U0,{color:J.error,children:["- print(",$0(U0,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),$0(U0,{color:J.success,children:["+ print(",$0(U0,{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)},sK=({theme:$})=>{let{colors:J}=$;return $0(F1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(U0,{children:" "},void 0,!1,void 0,this),$0(U0,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),$0(U0,{children:" "},void 0,!1,void 0,this),$0(U0,{children:[$0(U0,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),$0(U0,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[$0(U0,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),$0(U0,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[$0(U0,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),$0(U0,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[$0(U0,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),$0(U0,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[$0(U0,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),$0(U0,{color:J.info,children:J.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},iX=()=>{let $=N1(),J=L$.getCurrentThemeName(),Y=R2.findIndex((W)=>W.label===J),Z=Y>=0?R2[Y].theme:R2[0].theme,[X,Q]=rX(Z),[U,G]=rX(!1),z=oK(async(W)=>{if(U)return;G(!0);try{await z$().setTheme(W.value),$.closeModal()}catch(H){console.error("主题切换失败:",H instanceof Error?H.message:H)}finally{G(!1)}}),K=(W)=>{let H=R2.find((A)=>A.id===W.value);if(H)Q(H.theme)},q=s0()==="theme-selector",N=e0(!1);O0((W,H)=>{if(H.ctrl&&W==="c"||H.meta&&W==="c"){N();return}if(H.escape&&!U)$.closeModal()},{isActive:q});let _=(W)=>{let{isSelected:H,label:A}=W,w=A===J?"[OK]":" ";return $0(U0,{color:H?X.colors.primary:X.colors.text.primary,children:[w," ",A]},void 0,!0,void 0,this)};return $0(F1,{flexDirection:"column",height:"100%",children:[$0(F1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:$0(U0,{bold:!0,color:X.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(F1,{flexDirection:"row",flexGrow:1,children:[$0(F1,{width:"40%",borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,children:$0(F1,{flexDirection:"column",children:[$0(F1,{paddingTop:1,paddingBottom:1,children:$0(U0,{bold:!0,color:X.colors.text.primary,children:["可用主题 (",aX.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(nK,{items:aX,initialIndex:Y>=0?Y:0,onSelect:z,onHighlight:K,itemComponent:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(F1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:X.colors.border.light,children:[$0(tK,{theme:X},void 0,!1,void 0,this),$0(sK,{theme:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(F1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:$0(U0,{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 Z6,Text as B1,useStdout as eK}from"ink";import $z,{useCallback as g1,useEffect as y2,useMemo as u9,useRef as m$,useState as L1}from"react";import{jsxDEV as R$}from"react/jsx-dev-runtime";function oX($,J){let Y=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(Y.length,$.cursor+J))}}function Jz($,J,Y){let Z=Array.from($.value);if(Y.leftArrow)return oX($,-1);if(Y.rightArrow)return oX($,1);if(Y.home)return{...$,cursor:0};if(Y.end)return{...$,cursor:Z.length};if(Y.backspace&&$.cursor>0)return Z.splice($.cursor-1,1),{value:Z.join(""),cursor:$.cursor-1};if(Y.delete&&$.cursor<Z.length)return Z.splice($.cursor,1),{value:Z.join(""),cursor:$.cursor};if(Y.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(Y.ctrl||Y.meta||J.length===0)return $;let X=J.replace(/[\r\n\t]+/g," ");if(X.length===0)return $;let Q=Array.from(X);return Z.splice($.cursor,0,...Q),{value:Z.join(""),cursor:$.cursor+Q.length}}function Yz({editor:$}){let J=Array.from($.value),Y=J.slice(0,$.cursor).join(""),Z=J[$.cursor]??" ",X=J.slice($.cursor+1).join("");return R$(B1,{wrap:"truncate-end",children:["/",Y,R$(B1,{inverse:!0,children:Z},void 0,!1,void 0,this),X,R$(B1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Xz({line:$,matches:J,currentMatchIndex:Y,selected:Z,selectedBlock:X,color:Q,highlightColor:U}){let G=IX($,J);if(Z||G.length===0)return R$(B1,{wrap:"truncate-end",color:Q,inverse:Z,bold:X,underline:X,children:$.text||" "},void 0,!1,void 0,this);let z=[],K=0;for(let O of G){if(O.start>K)z.push($.text.slice(K,O.start));z.push(R$(B1,{color:U,bold:!0,inverse:O.matchIndex===Y,children:$.text.slice(O.start,O.end)},`${$.key}:match:${O.matchIndex}`,!1,void 0,this)),K=O.end}if(K<$.text.length)z.push($.text.slice(K));return R$(B1,{wrap:"truncate-end",color:Q,bold:X,underline:X,children:z},void 0,!1,void 0,this)}var nX=$z.memo(({isOpen:$,onClose:J,compact:Y=!1})=>{let Z=V8(),X=a8(),Q=r8(),U=i8(),G=s0(),z=D0(),{stdout:K}=eK(),{width:O,height:q}=r1(),N=Y?Math.max(6,Math.floor(q*0.4)):q,_=Math.max(1,N-3),W=Math.max(12,O-4),H=m$(new Map),A=m$(new k8),[b,w]=L1(new Set),B=m$(b);B.current=b;let C=u9(()=>RX({messages:Z,currentStreamingMessageId:X,streamingLines:U.lines,streamingTail:U.tail,currentThinkingContent:Q}),[Z,X,U.lines,U.tail,Q]),F=u9(()=>{let e=new Set(C.map((k)=>k.id));for(let k of H.current.keys())if(!e.has(k))H.current.delete(k);return C.flatMap((k,h)=>{let m=b.has(k.id),c=H.current.get(k.id),r=c?.revision===k.revision&&c.width===W&&c.expanded===m?c.lines:j9(k,W,m);if(r!==c?.lines)H.current.set(k.id,{revision:k.revision,width:W,expanded:m,lines:r});if(h===C.length-1)return r;return[...r,{key:`${k.id}:separator`,blockId:k.id,role:k.role,kind:k.kind,text:"",copyText:"",pending:k.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})},[C,W,b]),[M,L]=L1(0),[y,S]=L1(new Set),[T,R]=L1(null),P=m$(null),[j,o]=L1(!1),u=m$(!1),[J0,K0]=L1({value:"",cursor:0}),q0=m$(J0),[a,f]=L1(""),[v,G0]=L1(0),V=m$(0),[x,l]=L1(null),H0=m$(null),[F0,T0]=L1(null),I=m$(0),D=m$(null),p=m$(0),E=m$(C),n=m$(F.length),N0=m$(W);p.current=M,P.current=T,u.current=j,q0.current=J0,V.current=v,H0.current=x;let X0=u9(()=>A.current.search(C,a),[C,a]),C0=Math.max(0,F.length-_),Q0=Math.max(0,F.length-M),S0=Math.max(0,Q0-_),Y0=g1((e)=>{let k=Math.max(0,Math.min(C0,e));if(p.current=k,L(k),k===0)S(new Set)},[C0]),E0=g1((e)=>{if(F.length===0)return;let k=Math.max(0,Math.min(F.length-1,e)),h=Math.max(0,Math.min(F.length-_,k-Math.floor(_/2))),m=Math.min(F.length,h+_);Y0(F.length-m)},[F.length,Y0,_]),F$=g1((e,k,h)=>{let m=new Set(B.current);if(k)m.add(e);else m.delete(e);B.current=m,D.current=h,w(m)},[]),g0=g1((e)=>{let k=C.find((m)=>m.id===e.blockId);if(k?.collapsible&&!B.current.has(k.id)){F$(k.id,!0,{blockId:k.id,match:e});return}let h=h9(F,e);if(h>=0)E0(h)},[C,F,E0,F$]),N$=g1((e,k=X0)=>{if(k.length===0){V.current=0,G0(0);return}let h=(e%k.length+k.length)%k.length;V.current=h,G0(h);let m=k[h];P.current=m.blockId,R(m.blockId),g0(m)},[X0,g0]),r$=g1((e)=>{let k=C.filter((P0)=>P0.collapsible);if(k.length===0)return;let h=k.findIndex((P0)=>P0.id===P.current),m=h<0?e>0?0:k.length-1:(h+e+k.length)%k.length,c=k[m].id;P.current=c,R(c);let r=F.findIndex((P0)=>P0.blockId===c&&P0.header);if(r>=0)E0(r)},[C,F,E0]),r0=g1(()=>{let e=P.current;if(!e)e=F.slice(S0,Q0).find((h)=>C.some((m)=>m.id===h.blockId&&m.collapsible))?.blockId??null;if(!e)return;if(!C.find((h)=>h.id===e)?.collapsible)return;P.current=e,R(e),F$(e,!B.current.has(e),{blockId:e})},[C,Q0,F,F$,S0]),G$=g1((e,k)=>{let h=H0.current;if(!h||F.length===0)return;let m=k==="top"?0:k==="bottom"?F.length-1:Math.max(0,Math.min(F.length-1,h.head+e)),c={...h,head:m};H0.current=c,l(c),E0(m)},[F.length,E0]),d0=g1(()=>{let e=H0.current;if(!e)return;let k=SX(F,e.anchor,e.head);if(!k.trim()){T0("Nothing selected");return}let h=++I.current;T0("Copying..."),J6(k,{writeTerminal:(m)=>K.write(m)}).then((m)=>{if(I.current!==h)return;T0(m.success?m.method==="osc52"?"Copy sent via OSC 52":`Copied ${k.split(`
171
- `).length} lines`:"Copy failed"),H0.current=null,l(null)})},[F,K]);y2(()=>{if(!F0)return;let e=setTimeout(()=>T0(null),2500);return()=>clearTimeout(e)},[F0]),y2(()=>{if(!$){I.current++,E.current=C,n.current=F.length;return}B.current=new Set,w(new Set),P.current=null,R(null),u.current=!1,o(!1),q0.current={value:"",cursor:0},K0({value:"",cursor:0}),f(""),V.current=0,G0(0),H0.current=null,l(null),T0(null),p.current=0,L(0),S(new Set),E.current=C,n.current=F.length,N0.current=W},[$]),y2(()=>{let e=new Set(C.map((k)=>k.id));if(w((k)=>{let h=new Set([...k].filter((c)=>e.has(c)));return B.current=h,h.size===k.size&&[...h].every((c)=>k.has(c))?k:h}),P.current&&!e.has(P.current))P.current=null,R(null)},[C]),y2(()=>{let e=n.current;if(n.current=F.length,!$)return;let k=D.current;if(k){D.current=null;let m=k.match?h9(F,k.match):F.findIndex((c)=>c.blockId===k.blockId&&c.header);if(m>=0)E0(m);return}if(p.current===0){S(new Set);return}let h=Math.max(0,F.length-e);if(h>0)L((m)=>{let c=Math.min(C0,m+h);return p.current=c,c});else if(p.current>C0)p.current=C0,L(C0)},[W,b,$,F.length,C0,E0]),y2(()=>{let e=E.current;if(E.current=C,!$||p.current===0)return;let k=kX(e,C);if(k.length===0)return;S((h)=>{let m=new Set(h);for(let c of k)m.add(c);return m})},[C,$]),y2(()=>{if(X0.length===0)V.current=0,G0(0);else if(V.current>=X0.length)V.current=X0.length-1,G0(X0.length-1)},[X0.length]),y2(()=>{if(N0.current===W)return;N0.current=W,H0.current=null,l(null);let e=X0[V.current];if(e)g0(e)},[W,X0,g0]),O0((e,k)=>{if(!$)return;let h=k,m=G==="transcript-pager";if((h.ctrl||h.meta)&&e.toLowerCase()==="o")return J(),!0;if(!m){if(h.pageUp)return Y0(p.current+Math.max(1,_-1)),!0;if(h.pageDown)return Y0(p.current-Math.max(1,_-1)),!0;return!1}if(u.current){if(h.escape)return u.current=!1,o(!1),q0.current={value:a,cursor:Array.from(a).length},K0(q0.current),!0;if(h.return){let r=q0.current.value,P0=A.current.search(C,r);return f(r),u.current=!1,o(!1),N$(0,P0),!0}let c=Jz(q0.current,e,h);return q0.current=c,K0(c),!0}if(e==="q")return J(),!0;if(H0.current){if(h.escape)return H0.current=null,l(null),!0;if(e==="y"||h.ctrl&&!h.meta&&e.toLowerCase()==="c")return d0(),!0;if(h.upArrow||e==="k")return G$(-1),!0;if(h.downArrow||e==="j")return G$(1),!0;if(h.pageUp)return G$(-Math.max(1,_-1)),!0;if(h.pageDown)return G$(Math.max(1,_-1)),!0;if(h.home||e==="g")return G$(0,"top"),!0;if(h.end||e==="G")return G$(0,"bottom"),!0;return!0}if(h.escape)return J(),!0;if(e==="/"){let c={value:a,cursor:Array.from(a).length};return q0.current=c,K0(c),u.current=!0,o(!0),!0}if(e==="n"&&X0.length>0)return N$(V.current+1),!0;if(e==="N"&&X0.length>0)return N$(V.current-1),!0;if(h.tab)return r$(h.shift?-1:1),!0;if(h.return||e==="e")return r0(),!0;if(e==="v"){if(F.length===0)return!0;let c=Math.max(0,F.length-p.current),r=Math.max(0,c-_),P0=P.current?F.findIndex((b$)=>b$.blockId===P.current&&b$.header):-1,l0=P0>=0?P0:Math.max(0,Math.min(F.length-1,r)),c0={anchor:l0,head:l0};return H0.current=c0,l(c0),E0(l0),!0}if(h.upArrow||e==="k")return Y0(p.current+1),!0;if(h.downArrow||e==="j")return Y0(p.current-1),!0;if(h.pageUp)return Y0(p.current+Math.max(1,_-1)),!0;if(h.pageDown)return Y0(p.current-Math.max(1,_-1)),!0;if(h.home||e==="g")return Y0(C0),!0;if(h.end||e==="G")return Y0(0),!0;return!0},{isActive:$,priority:100});let P1=F.slice(S0,Q0),A1=y.size,Q8=F.length===0?"0/0":`${Math.min(Q0,F.length)}/${F.length}`,c1=x?Math.min(x.anchor,x.head):-1,k2=x?Math.max(x.anchor,x.head):-1,Z2=a.length>0?`/${a} ${X0.length>0?`${v+1}/${X0.length}`:"0/0"}`:null,I$=F0?F0:x?`${k2-c1+1} lines selected · y copy · Esc cancel`:Z2?`${Z2} · n/N`:A1>0?`${A1} new · G latest`:"Ctrl+O / Esc / q close";return R$(Z6,{flexDirection:"column",width:"100%",height:N,paddingX:2,children:[R$(Z6,{justifyContent:"space-between",flexShrink:0,children:[R$(B1,{bold:!0,color:z.colors.primary,children:"Transcript"},void 0,!1,void 0,this),R$(B1,{color:z.colors.text.muted,children:Q8},void 0,!1,void 0,this)]},void 0,!0,void 0,this),R$(Z6,{flexDirection:"column",height:_,flexShrink:0,overflow:"hidden",children:P1.length===0?R$(B1,{color:z.colors.text.muted,children:"No transcript yet"},void 0,!1,void 0,this):P1.map((e,k)=>{let h=S0+k,m=c1>=0&&h>=c1&&h<=k2,c=e.header&&e.blockId===T,r=e.pending?z.colors.warning:e.kind==="thinking"?z.colors.info:e.role==="user"?z.colors.info:e.role==="assistant"?z.colors.success:z.colors.text.secondary;return R$(Xz,{line:e,matches:X0,currentMatchIndex:v,selected:m,selectedBlock:c,color:r,highlightColor:z.colors.warning},e.key,!1,void 0,this)})},void 0,!1,void 0,this),R$(Z6,{flexShrink:0,children:j?R$(Yz,{editor:J0},void 0,!1,void 0,this):R$(B1,{color:F0||A1>0?z.colors.warning:z.colors.text.muted,wrap:"truncate-end",children:[I$," · / 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 h0}from"react/jsx-dev-runtime";var Y$=H1("UI"),JZ=({debug:$,continue:J,...Y})=>{if($)Y$.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:J});let Z=I2(!1),X=I2(!1),Q=I2(!1),U=I2(null),G=I2(!1),z=I2(null);if(!z.current)z.current=new f6;let K=z.current,O=I2(null);if(!O.current)O.current=new V6;let q=O.current,[N,_]=sX(K.getState()),[W,H]=sX(!1),A=JJ(),b=YJ(),w=j2(),B=QJ(),C=UJ(),F=h8(),M=p8(),L=FJ(),y=ZJ(),S=N1(),T=d1(),R=V2(),P=O1(),{stdout:j}=Zz(),o=HJ(),u=E2(),J0=NJ();J1(()=>{if(L$.getCurrentThemeName()!==J0)try{L$.setTheme(J0)}catch{}},[J0]);let K0=A==="ready",q0=A==="needsSetup",a=A==="idle",f=Qz(()=>Y.agents?$Z(Y.agents):void 0,[Y.agents]),{confirmationState:v,confirmationHandler:G0,handleResponse:V,dismissAll:x}=IY(),{executeCommand:l,handleAbort:H0,isProcessing:F0,cleanupAgent:T0,refreshFollowUpQueue:I,controlFollowUpQueue:D}=CY(Y.systemPrompt,Y.appendSystemPrompt,G0,Y.maxTurns,x,f,{list:()=>q.listAll(),acknowledge:(i)=>q.acknowledge(i),setVisibleLocator:(i)=>i?q.proveLocal(i):q.setVisibleLocator()}),p=i0(async(i)=>{await uJ(i.controller,i.visibility,{continueSession:J===!0,resume:Y.resume,forkSession:Y.forkSession===!0,requestedSessionId:Y.sessionId,locator:{version:2,sessionId:R,workspace:{kind:"local",projectPath:P}}})}),E=i0((i)=>{S.projectTaskAttentionState(i.status,i.unreadKeys,i.sessions)}),n=i0((i)=>{Y$.warn(`[BladeInterface] Task attention ${i} unavailable`)});Q3({ready:K0,lifecycle:q,initialize:p,project:E,report:n});let N0=i0(_),X0=i0(()=>{Y$.warn("[BladeInterface] Session history shutdown unavailable")});J3({lifecycle:K,project:N0,report:X0});let{getPreviousCommand:C0,getNextCommand:Q0,addToHistory:S0}=RY();oY();let Y0=kY("",0),E0=i0(()=>{o$(),j.write(tX.eraseScreen+tX.cursorTo(0,0)),T.incrementClearCount()}),F$=i0(()=>{if(W)return;H(!0)}),g0=i0(()=>{if(!W)return;H(!1)}),N$=i0(()=>{if(W)g0();else F$()});O0((i,w0)=>{if(K0&&!q0&&(w0.ctrl||w0.meta)&&i.toLowerCase()==="o")return N$(),!0;return!1},{priority:90}),J1(()=>{if(!G.current){G.current=!0;return}E0()},[E0,W]);let r$=i0(async()=>{let i=u,w0;if(i==="default")w0="autoEdit";else if(i==="autoEdit")w0="plan";else if(i==="plan")w0="default";else w0="default";try{await a0.setSessionPermissionMode(R,P,w0),await z$().setPermissionMode(w0)}catch(H$){Y$.error("权限模式切换失败:",H$ instanceof Error?H$.message:H$)}}),r0=i0(async(i)=>{try{let w0={displayName:i.displayName,provider:i.provider,model:i.model,overrides:i.overrides};if(i.modelProvider)await z$().addModelWithProvider(w0,i.modelProvider);else await z$().addModel(w0);S.setInitializationStatus("ready")}catch(w0){throw Y$.error("初始化配置保存失败:",w0 instanceof Error?w0.message:w0),w0}}),G$=i0(()=>{if(w==="shortcuts")S.closeModal();else S.setActiveModal("shortcuts")}),d0=i0(async()=>{try{await lJ(q.visibility(),{version:2,sessionId:R,workspace:{kind:"local",projectPath:P}})}catch{Y$.warn("[BladeInterface] Task attention fallback visibility unavailable")}}),P1=i0(async(i,w0,H$)=>{return z4({intent:w0,session:i,newSessionId:H$?.newSessionId,announceFork:H$?.announceFork,permissionModeOverride:Y.permissionMode},P,T,T0)}),A1=i0(async(i,w0,H$)=>{await YY(i,w0,{openHistory:(f2,u1)=>{S.showSessionHistoryViewer(f2,u1)},activateLocal:async(f2,u1)=>{await K.closeView();let z6=await P1(f2,u1,H$);try{await dJ(u1,i,z6,q.visibility())}catch{Y$.warn("[BladeInterface] Task attention local activation unavailable")}S.closeModal()}},H$)}),Q8=i0(async(i,w0)=>{let u1=(await K4(w0,P,q)).filter((z6)=>z6.locator.sessionId===i);if(u1.length===0)throw Error(`Session not found: ${i}`);if(u1.length>1)throw Error(`Multiple workspaces contain session ${i}; use the session selector`);return u1[0]}),{showSuggestions:c1,suggestions:k2,selectedSuggestionIndex:Z2}=rY(Y0,l,C0,Q0,S0,H0,F0,r$,G$,w==="shortcuts",w==="sessionHistoryViewer");J1(()=>{if(Y0.value&&w==="shortcuts")S.closeModal()},[Y0.value,w,S]),J1(()=>{if(w==="followUpQueue")I()},[w,I]);let I$=i0(async()=>{Q.current=!0;try{let i=Y.forkSession?"fork":"resume",w0=await K4(i,P,q);if(w0.length===0){if(Y.forkSession){Y$.error("没有可供 fork 的历史会话"),Y1(1);return}T.addAssistantMessage("没有找到历史会话,开始新对话。"),await d0();return}let H$=aJ(w0);if(!H$){if(Y.forkSession){Y$.error("没有可供 fork 的本地历史会话"),Y1(1);return}T.addAssistantMessage("没有找到本地历史会话,开始新对话。"),await d0();return}await A1(H$,i,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(i){if(Y$.error("[BladeInterface] 继续会话失败:",i),Y.forkSession){Y1(1);return}T.addAssistantMessage("继续会话失败,开始新对话。"),await d0()}}),e=i0(async()=>{Q.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let H$=Y.forkSession?"fork":"resume",f2=await Q8(Y.resume,H$);await A1(f2,H$,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let i=Y.forkSession?"fork":"resume",w0=await K4(i,P,q);if(w0.length===0)Y$.error("没有找到历史会话"),Y1(1);S.showSessionSelector(w0,i)}catch(i){Y$.error("[BladeInterface] 加载会话失败:",i),Y1(1)}});J1(()=>{if(Z.current)return;if(J){Z.current=!0,I$();return}if(Y.resume)Z.current=!0,e()},[J,Y.resume,I$,e]);let k=i0(async(i)=>{let w0=v.details?.type;if(w0==="enterPlanMode"&&i.approved)try{await a0.setSessionPermissionMode(R,P,"plan"),await z$().setPermissionMode("plan"),Y$.debug("[BladeInterface] Entered Plan mode")}catch(H$){Y$.error("[BladeInterface] Failed to enter Plan mode:",H$)}if(w0==="exitPlanMode"&&i.approved)Y$.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");V(i)}),h=i0(()=>{T.addAssistantMessage("设置已取消"),T.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),T.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),Y1(0)}),m=i0(()=>{K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")}),S.closeModal()}),c=i0(async(i)=>{try{let w0=B?.intent??"resume";await A1(i,w0,{newSessionId:w0==="fork"&&Y.forkSession?Y.sessionId:void 0})}catch(w0){Y$.error("[BladeInterface] Failed to restore session:",w0),T.addAssistantMessage(`会话操作失败: ${w0 instanceof Error?w0.message:"未知错误"}`),S.closeModal()}}),r=i0(()=>{if(K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")}),Y.resume)Y1(0);else S.closeModal()});J1(()=>{if(w==="sessionHistoryViewer"&&C){$3(K,q,C).catch(()=>{Y$.warn("[BladeInterface] Session history activation unavailable")});return}if(K.cancelRemoteRequest(),q.endRemote().catch(()=>{Y$.warn("[BladeInterface] Task attention visibility unavailable")}),K.getState().status!=="idle")K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")})},[w,K,C,q]),J1(()=>{if(!C)return;q.updateRemote(C,N).catch(()=>{Y$.warn("[BladeInterface] Task attention acknowledgement unavailable")})},[N,C,q]);let P0=i0((i)=>{S.showModelEditWizard(i)}),l0=i0((i)=>{T.addAssistantMessage(`已添加模型配置: ${i.displayName??i.model},并已切换到该模型`),m()}),c0=i0((i)=>{T.addAssistantMessage(`已更新模型配置: ${i.displayName??i.model}`),m()});J1(()=>{if(q0){o.setFocus("model-config-wizard");return}if(v.isVisible)o.setFocus("confirmation-prompt");else if(w==="sessionSelector")o.setFocus("session-selector");else if(w==="sessionHistoryViewer")o.setFocus("session-history-viewer");else if(w==="followUpQueue")o.setFocus("follow-up-queue");else if(w==="themeSelector")o.setFocus("theme-selector");else if(w==="modelSelector")o.setFocus("model-selector");else if(w==="modelAddWizard"||w==="modelEditWizard")o.setFocus("model-config-wizard");else if(w==="permissionsManager")o.setFocus("permissions-manager");else if(w==="agentsManager")o.setFocus("agents-manager");else if(w==="agentCreationWizard")o.setFocus("agent-creation-wizard");else if(w==="skillsManager")o.setFocus("skills-manager");else if(w==="pluginsManager")o.setFocus("plugins-manager");else if(w==="hooksManager")o.setFocus("hooks-manager");else if(W)o.setFocus("transcript-pager");else if(w==="shortcuts")o.setFocus("main-input");else o.setFocus("main-input")},[q0,v.isVisible,w,W,o.setFocus]),J1(()=>{if(!K0||Q.current)return;if(eX().length>0){Q.current=!0;return}Q.current=!0,T.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[K0]),J1(()=>{if(!b)return;if(U.current===b)return;if(U.current=b,A==="error")T.addAssistantMessage(`初始化失败: ${b}`);else T.addAssistantMessage(`${b}`),T.addAssistantMessage("请重新尝试设置,或检查文件权限")},[b,A,T.addAssistantMessage]);let b$=i0(async(i)=>{try{await l({displayText:i,text:i,images:[],parts:[{type:"text",text:i}]})}catch(w0){let H$=w0 instanceof Error?w0.message:"无法发送初始消息";T.addAssistantMessage(`初始消息发送失败:${H$}`)}});J1(()=>{let i=Y.initialMessage?.trim();if(!i||X.current||!K0||q0)return;X.current=!0,S0(i),b$(i)},[Y.initialMessage,K0,q0,l,S0]);let _1=i0(async(i)=>{try{await z$().setPermissionMode(i)}catch(w0){Y$.error("权限模式初始化失败:",w0 instanceof Error?w0.message:w0)}});if(J1(()=>{let i=Y.permissionMode;if($)Y$.debug("[Debug] permissionMode from CLI:",i),Y$.debug("[Debug] current permissionMode:",u);if(!i||i===u)return;_1(i)},[Y.permissionMode,u]),a)return null;if(q0)return h0(f9,{mode:"setup",onComplete:r0,onCancel:h},void 0,!1,void 0,this);if($)Y$.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:v.isVisible,activeModal:w});let Q2=w==="modelSelector",w$=y,a$=w==="modelAddWizard"?"add":w==="modelEditWizard"&&w$?"edit":null,O$=Q2||Boolean(a$),b1=w==="agentsManager",M1=w==="agentCreationWizard",Z$=w==="skillsManager",D2=w==="pluginsManager",wZ=w$?{displayName:w$.displayName,provider:w$.provider,model:w$.model,overrides:w$.overrides}:void 0,r9=v.isVisible&&v.details?v.details.type==="mcpElicitation"&&v.details.mcpElicitation?h0(p5,{details:v.details.mcpElicitation,onComplete:(i,w0)=>k({approved:i.action==="accept",elicitation:i,...w0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):v.details.type==="askUserQuestion"&&v.details.questions?h0(MX,{questions:v.details.questions,onComplete:(i)=>k({approved:!0,answers:i}),onCancel:()=>k({approved:!1})},void 0,!1,void 0,this):h0(J5,{details:v.details,onResponse:k},void 0,!1,void 0,this):w==="themeSelector"?h0(iX,{},void 0,!1,void 0,this):w==="permissionsManager"?h0(WX,{onClose:m},void 0,!1,void 0,this):w==="sessionSelector"?h0(jX,{intent:B?.intent??"resume",sessions:B?.sessions??[],taskAttentionUnreadKeys:F,onSelect:c,onCancel:r},void 0,!1,void 0,this):w==="sessionHistoryViewer"?h0(fX,{state:N,onLoadOlder:(i)=>K.loadOlder(i),onFork:(i)=>K.fork(i),onClose:m},void 0,!1,void 0,this):w==="followUpQueue"?h0(Y5,{queue:M,mutation:L,onMutate:D,onRefresh:I,onClose:m},void 0,!1,void 0,this):w==="hooksManager"?h0(Z5,{workspaceRoot:P,sessionId:R,onClose:m},void 0,!1,void 0,this):null,f8=Boolean(r9);return h0(m1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[r9,h0(m1,{flexDirection:"column",display:f8||W?"none":"flex",children:[h0(i5,{active:!f8&&!W},void 0,!1,void 0,this),h0(lX,{},void 0,!1,void 0,this),h0(c9,{},void 0,!1,void 0,this),h0(m9,{},void 0,!1,void 0,this),h0(h5,{paused:f8||W},void 0,!1,void 0,this),h0(C5,{input:Y0.value,cursorPosition:Y0.cursorPosition,onChange:Y0.setValue,onChangeCursorPosition:Y0.setCursorPosition,onAddPasteMapping:Y0.addPasteMapping,onAddImagePasteMapping:Y0.addImagePasteMapping,disabled:w==="sessionHistoryViewer"},void 0,!1,void 0,this),Q2&&h0(m1,{marginTop:1,paddingX:2,children:h0(o5,{onClose:m,onEdit:P0},void 0,!1,void 0,this)},void 0,!1,void 0,this),a$&&h0(m1,{marginTop:1,paddingX:2,children:h0(f9,{mode:a$,modelId:w$?.id,initialConfig:a$==="edit"?wZ:void 0,onComplete:a$==="edit"?c0:l0,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),b1&&h0(m1,{marginTop:1,paddingX:2,children:h0(H3,{workspaceRoot:P,onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),M1&&h0(m1,{marginTop:1,paddingX:2,children:h0(B8,{onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z$&&h0(m1,{marginTop:1,paddingX:2,children:h0(xX,{onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),D2&&h0(m1,{marginTop:1,paddingX:2,children:h0(bX,{workspaceRoot:P,onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(A3,{suggestions:k2,selectedIndex:Z2,visible:c1&&!O$},void 0,!1,void 0,this),h0(P3,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h0(m1,{flexDirection:"column",display:W?"flex":"none",children:h0(nX,{isOpen:W,compact:f8,onClose:g0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as Uz,Text as Y2}from"ink";import Gz from"react";import{jsxDEV as p1}from"react/jsx-dev-runtime";class D8 extends Gz.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 p1(Uz,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[p1(Y2,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),p1(Y2,{children:" "},void 0,!1,void 0,this),p1(Y2,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),p1(Y2,{children:" "},void 0,!1,void 0,this),p1(Y2,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),p1(Y2,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),p1(Y2,{children:" "},void 0,!1,void 0,this),p1(Y2,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as S2,Text as x1}from"ink";import{useState as d9}from"react";import{jsxDEV as y$}from"react/jsx-dev-runtime";var Q6=[{key:"update",label:"Update now",description:`runs \`${XZ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],QZ=({versionInfo:$,onComplete:J})=>{let[Y,Z]=d9(0),[X,Q]=d9(!1),[U,G]=d9(null);O0((K,O)=>{if(O.ctrl&&K==="c"){W8().shutdown("SIGINT",0);return}if(X||U)return;if(O.upArrow||K==="k")Z((q)=>q>0?q-1:Q6.length-1);else if(O.downArrow||K==="j")Z((q)=>q<Q6.length-1?q+1:0);else if(O.return)z(Q6[Y].key);else if(K==="1")z("update");else if(K==="2")z("skip");else if(K==="3")z("skip_until_next")});let z=async(K)=>{switch(K){case"update":{Q(!0);let O=await ZZ();G(O.message),setTimeout(()=>{W8().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await YZ($.latestVersion);J();break}};if(U)return y$(S2,{flexDirection:"column",marginY:1,children:y$(x1,{children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(X)return y$(S2,{flexDirection:"column",marginY:1,children:y$(x1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return y$(S2,{flexDirection:"column",marginY:1,children:[y$(x1,{color:"yellow",bold:!0,children:["Update available! ",y$(x1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y$(S2,{marginTop:1,children:y$(x1,{color:"gray",children:["Release notes:"," ",y$(x1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y$(S2,{flexDirection:"column",marginTop:1,children:Q6.map((K,O)=>{let q=O===Y,N=q?"› ":" ",_=`${O+1}. `;return y$(S2,{children:y$(x1,{color:q?"cyan":void 0,children:[N,_,K.label,K.description&&y$(x1,{color:"gray",children:[" (",K.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},K.key,!1,void 0,this)})},void 0,!1,void 0,this),y$(S2,{marginTop:1,children:y$(x1,{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 U6,Text as Z8}from"ink";import{useState as UZ}from"react";import{jsxDEV as w1}from"react/jsx-dev-runtime";var GZ=({status:$,onTrust:J,onContinueSafely:Y})=>{let Z=L$.getTheme(),[X,Q]=UZ(!1),[U,G]=UZ(null);return O0((z,K)=>{if(X)return;if(K.return||z.toLowerCase()==="t"){Q(!0),G(null),J().catch((O)=>{G(O instanceof Error?O.message:"Failed to trust workspace"),Q(!1)});return}if(z.toLowerCase()==="s"||K.escape)Q(!0),G(null),Y().catch((O)=>{G(O instanceof Error?O.message:"Failed to continue safely"),Q(!1)})}),w1(U6,{flexDirection:"column",paddingX:1,children:[w1(Z8,{bold:!0,color:Z.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),w1(Z8,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),w1(U6,{marginTop:1,flexDirection:"column",children:[w1(Z8,{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((z)=>w1(Z8,{children:[" ",z.path," · ",z.effects.length," effect(s)"]},`${z.kind}:${z.path}`,!0,void 0,this))]},void 0,!0,void 0,this),U&&w1(U6,{marginTop:1,children:w1(Z8,{color:Z.colors.error,children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),w1(U6,{marginTop:1,children:w1(Z8,{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 Kz}from"ink";import{useEffect as zz}from"react";function KZ(){let{stdout:$}=Kz();zz(()=>{if(!$.isTTY)return;return $.write(z5),$.write(H9),()=>{$.write(q5),$.write(H9)}},[$])}function zZ($){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 qz($){return $.forkSession?void 0:$.resumeSessionId}function qZ($,J){let Y=qz($);if(Y)J(Y)}import{jsxDEV as X2}from"react/jsx-dev-runtime";function Oz($){if(m0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");B$().setInitializationStatus("ready")}var Nz=($)=>{KZ();let[J,Y]=K6(!1),[Z,X]=K6(null),[Q,U]=K6(!1),[G,z]=K6(null),K=G6((_,W)=>{let H=_ instanceof Error?_.message:String(_);if(B$().setInitializationError(H),B$().setInitializationStatus("error"),Y(!0),W)console.error("[FAIL] 应用初始化失败:",H)}),O=G6(async()=>{try{let _=m0().config.config??OZ,W=NZ(_,$);if(Oz(W),qZ(W,(A)=>{HZ().restoreSession(A,[])}),W.debug)console.error("[Debug] 运行时配置:",W);let H=W.codeTheme;if(H&&L$.hasTheme(H)){if(L$.setTheme(H),$.debug)console.log(`[OK] 已加载主题: ${H}`)}try{h$.getInstance().loadConfig(W.hooks||{},K$());let b=await WZ(K$());if($.debug&&W.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${b.subagents.getAllNames().length} agents, ${b.skills.size} skills, ${b.commands.getCommandCount()+b.commands.getPluginCommandCount()} commands, ${b.plugins.getAll().length} plugins`);let B=m0().session.sessionId;_Z(B)}catch(A){if($.debug)console.warn("Hooks 初始化失败:",zZ(A))}_4(async()=>{await LZ.getInstance().killAll(),await FZ.getInstance().disconnectAll(),h$.getInstance().cleanup()}),Y(!0)}catch(_){K(_,!!$.debug)}}),q=G6(async()=>{let _=await l9.getInstance().getStatus(K$());if(_.state==="untrusted"||_.state==="error"){z(_);return}await O()}),N=G6(async()=>{if($.versionCheckPromise){let _=await $.versionCheckPromise;if(_){X(_),U(!0);return}}await q()});if(_z(()=>{N()},[]),Q&&Z)return X2(D8,{children:X2(QZ,{versionInfo:Z,onComplete:()=>{U(!1),q()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(G)return X2(D8,{children:X2(GZ,{status:G,onTrust:async()=>{await l9.getInstance().trust(K$()),await BZ(),z(null),await O()},onContinueSafely:async()=>{z(null),await O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!J)return null;return X2(D8,{children:X2(JZ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},Ub=($)=>X2(vY,{children:X2(Nz,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{Ub as AppWrapper};
170
+ `]},void 0,!0,void 0,this),W$(T2,{flexDirection:"column",children:y.map((R)=>W$(T2,{children:[W$(hK,{isSelected:R.key===B},void 0,!1,void 0,this),W$(gK,{label:R.label,isSelected:R.key===B},void 0,!1,void 0,this)]},R.key,!0,void 0,this))},void 0,!1,void 0,this),G&&W$(z1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),W$(T2,{marginTop:1,flexDirection:"column",children:[W$(z1,{dimColor:!0,children:["第 ",C+1,"/",M," 页 · 共 ",W.length," 个会话 · 显示"," ",S.start,"-",S.end]},void 0,!0,void 0,this),M>1&&W$(T2,{marginTop:1,children:[W$(z1,{color:C>0?"cyan":"gray",children:C>0?"<< 上一页":" "},void 0,!1,void 0,this),W$(z1,{children:" "},void 0,!1,void 0,this),W$(z1,{color:C<M-1?"cyan":"gray",children:C<M-1?"下一页 >>":""},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as Z6,getInnerHeight as mK,getScrollHeight as pK,Text as C2}from"ink";import xK,{useEffect as EX,useRef as cK,useState as hX}from"react";function jX($=200){return T4("rows",$)}import{jsxDEV as l$,Fragment as uK}from"react/jsx-dev-runtime";var gX=["|","/","-","\\"],p9=xK.memo(()=>{let $=E2(),J=D0(),Y=d2(),Z=jX(),X=j2(),{dismissSideConversation:Q}=N1(),U=s0(),G=cK(null),[z,K]=hX(0),[O,q]=hX(0),N=Math.max(1,Math.floor(Z/2)-3),_=$?.status==="error"||$?.status==="completed"&&Boolean($.response);if(EX(()=>{K(0)},[$?.requestId]),O0((W,H)=>{if(H.escape)return Q(),!0;if(!H.pageDown&&!H.pageUp)return!1;let A=G.current;if(!A)return!1;let b=mK(A),w=Math.max(0,pK(A)-b);return K((B)=>{let C=Math.min(B,w),F=Math.max(1,b-1)*(H.pageDown?1:-1);return Math.max(0,Math.min(w,C+F))}),!0},{isActive:Boolean(_)&&X==="none"&&U==="main-input",priority:30}),EX(()=>{if($?.status!=="loading"){q(0);return}let W=setInterval(()=>{q((H)=>(H+1)%gX.length)},100);return()=>clearInterval(W)},[$?.status]),!$)return null;return l$(Z6,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[l$(Z6,{height:1,flexShrink:0,children:l$(C2,{wrap:"truncate-end",children:[l$(C2,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),l$(C2,{color:J.colors.muted,children:[" | ",$.question.replace(/\s+/g," ")]},void 0,!0,void 0,this),$.durationMs!==void 0&&l$(C2,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$.status==="loading"&&l$(C2,{color:J.colors.text.secondary,children:[gX[O]," Answering..."]},void 0,!0,void 0,this),_&&l$(uK,{children:[l$(Z6,{ref:G,flexDirection:"column",maxHeight:N,overflowY:"scroll",scrollTop:z,children:l$(Z6,{flexDirection:"column",flexShrink:0,width:"100%",children:$.status==="error"?l$(C2,{color:J.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this):l$(k1,{content:$.response??"",role:"assistant",terminalWidth:Math.max(1,Y-9),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),l$(C2,{color:J.colors.muted,dimColor:!0,wrap:"truncate-end",children:"PgUp/PgDn: scroll side answer · Esc: dismiss"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});p9.displayName="SideConversationPanel";import{Box as _$,Text as t0}from"ink";import{jsxDEV as B0}from"react/jsx-dev-runtime";function pX({onCancel:$}){let J=O1(),Y=s0()==="skills-manager",X=mX({cwd:J}).getAll(),Q=X.filter((K)=>K.source==="builtin"),U=X.filter((K)=>K.source==="user"),G=X.filter((K)=>K.source==="project"),z=e0(!1,$);if(O0((K,O)=>{if(O.escape)$?.();else if(O.ctrl&&K==="c"||O.meta&&K==="c")z()},{isActive:Y}),X.length===0)return B0(_$,{flexDirection:"column",paddingY:1,children:[B0(_$,{marginBottom:1,children:B0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(_$,{marginTop:1,paddingLeft:2,children:B0(t0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(_$,{marginTop:1,children:B0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return B0(_$,{flexDirection:"column",paddingY:1,children:[B0(_$,{marginBottom:1,children:[B0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:[" (找到 ",X.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&B0(_$,{flexDirection:"column",marginBottom:1,children:[B0(_$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(_$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),U.length>0&&B0(_$,{flexDirection:"column",marginBottom:1,children:[B0(_$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(_$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q.length>0&&B0(_$,{flexDirection:"column",marginBottom:1,children:[B0(_$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(_$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&B0(_$,{paddingLeft:2,children:B0(t0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),B0(_$,{marginTop:1,children:B0(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 xX,Text as q1}from"ink";import dK,{useEffect as lK,useMemo as rK,useState as cX}from"react";import{jsxDEV as C$,Fragment as x9}from"react/jsx-dev-runtime";var uX=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function aK($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let Y=Math.floor(J/60),Z=J%60;return`${Y}m ${Z}s`}var dX=dK.memo(()=>{let $=z0((K)=>K.app.subagentProgresses),J=z0((K)=>K.app.subagentProgress),Y=D0(),[Z,X]=cX(0),[Q,U]=cX(()=>Date.now()),G=rK(()=>{let K=Object.values($);return K.length>0?K:J?[J]:[]},[J,$]),z=G.some((K)=>K.status==="running");if(lK(()=>{if(!z){X(0);return}let K=setInterval(()=>{X((q)=>(q+1)%uX.length)},80),O=setInterval(()=>{U(Date.now())},1000);return()=>{clearInterval(K),clearInterval(O)}},[z]),G.length===0)return null;return C$(xX,{paddingX:2,paddingY:0,flexDirection:"column",children:G.map((K)=>{let O=K.status==="running"?uX[Z]:K.status==="completed"?"[OK]":"[X]",q=K.status==="running"?Y.colors.info:K.status==="completed"?Y.colors.success:Y.colors.error,N=Math.max(0,Q-K.startTime);return C$(xX,{flexDirection:"row",gap:1,children:[C$(q1,{color:q,bold:!0,children:O},void 0,!1,void 0,this),C$(q1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),C$(q1,{color:Y.colors.text.primary,bold:!0,children:K.type},void 0,!1,void 0,this),C$(q1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(q1,{color:Y.colors.text.secondary,children:K.description},void 0,!1,void 0,this),K.currentTool&&C$(x9,{children:[C$(q1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(q1,{color:Y.colors.warning,children:K.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="running"&&N>0&&C$(x9,{children:[C$(q1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(q1,{color:Y.colors.info,children:aK(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="failed"&&K.terminalSummary&&C$(x9,{children:[C$(q1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(q1,{color:Y.colors.error,children:K.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},K.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as X8,Text as h1}from"ink";import iK from"react";import{jsxDEV as V$}from"react/jsx-dev-runtime";var c9={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},u9=iK.memo(()=>{let $=qJ().filter((Y)=>Y.status!=="deleted"),J=D0();if($.length===0)return null;return V$(X8,{flexDirection:"column",paddingX:2,children:$.map((Y)=>{let Z=Y.tasks.filter((X)=>X.status==="completed").length;return V$(X8,{flexDirection:"column",marginBottom:1,children:[V$(X8,{gap:1,children:[V$(h1,{bold:!0,color:Y.status==="failed"?J.colors.error:Y.status==="completed"?J.colors.success:J.colors.info,children:[c9[Y.status]," Team"]},void 0,!0,void 0,this),V$(h1,{bold:!0,color:J.colors.text.primary,children:Y.name},void 0,!1,void 0,this),V$(h1,{color:J.colors.muted,children:["| ",Y.members.length-1," members | ",Z,"/",Y.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V$(X8,{flexDirection:"column",paddingLeft:2,children:[Y.members.filter((X)=>X.status!=="leader").map((X)=>V$(X8,{gap:1,children:[V$(h1,{color:J.colors.muted,children:c9[X.status]},void 0,!1,void 0,this),V$(h1,{color:J.colors.text.secondary,children:X.name},void 0,!1,void 0,this),V$(h1,{color:J.colors.muted,children:["(",X.subagentType,", ",X.status,X.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},X.id,!0,void 0,this)),Y.tasks.map((X)=>V$(X8,{gap:1,children:[V$(h1,{color:J.colors.muted,children:c9[X.status]},void 0,!1,void 0,this),V$(h1,{color:J.colors.text.secondary,children:["#",X.id," ",X.subject]},void 0,!0,void 0,this),V$(h1,{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)]},Y.name,!0,void 0,this)})},void 0,!1,void 0,this)});u9.displayName="TeamProgress";import{useMemoizedFn as oK}from"ahooks";import{Box as F1,Text as U0}from"ink";import nK from"ink-select-input";import{useState as lX}from"react";import{jsxDEV as $0}from"react/jsx-dev-runtime";var rX=R2.map(($)=>({label:$.label,value:$.id})),tK=({theme:$})=>{let{colors:J}=$;return $0(F1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(U0,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),$0(U0,{children:" "},void 0,!1,void 0,this),$0(U0,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),$0(U0,{children:[$0(U0,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),$0(U0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(U0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(U0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[" ",$0(U0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(U0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),$0(U0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[" ",$0(U0,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),$0(U0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(U0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(U0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[" ",$0(U0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(U0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),$0(U0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[" ",$0(U0,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",$0(U0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:" "},void 0,!1,void 0,this),$0(U0,{color:J.error,children:["- print(",$0(U0,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),$0(U0,{color:J.success,children:["+ print(",$0(U0,{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)},sK=({theme:$})=>{let{colors:J}=$;return $0(F1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(U0,{children:" "},void 0,!1,void 0,this),$0(U0,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),$0(U0,{children:" "},void 0,!1,void 0,this),$0(U0,{children:[$0(U0,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),$0(U0,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[$0(U0,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),$0(U0,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[$0(U0,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),$0(U0,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[$0(U0,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),$0(U0,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(U0,{children:[$0(U0,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),$0(U0,{color:J.info,children:J.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},aX=()=>{let $=N1(),J=L$.getCurrentThemeName(),Y=R2.findIndex((W)=>W.label===J),Z=Y>=0?R2[Y].theme:R2[0].theme,[X,Q]=lX(Z),[U,G]=lX(!1),z=oK(async(W)=>{if(U)return;G(!0);try{await z$().setTheme(W.value),$.closeModal()}catch(H){console.error("主题切换失败:",H instanceof Error?H.message:H)}finally{G(!1)}}),K=(W)=>{let H=R2.find((A)=>A.id===W.value);if(H)Q(H.theme)},q=s0()==="theme-selector",N=e0(!1);O0((W,H)=>{if(H.ctrl&&W==="c"||H.meta&&W==="c"){N();return}if(H.escape&&!U)$.closeModal()},{isActive:q});let _=(W)=>{let{isSelected:H,label:A}=W,w=A===J?"[OK]":" ";return $0(U0,{color:H?X.colors.primary:X.colors.text.primary,children:[w," ",A]},void 0,!0,void 0,this)};return $0(F1,{flexDirection:"column",height:"100%",children:[$0(F1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:$0(U0,{bold:!0,color:X.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(F1,{flexDirection:"row",flexGrow:1,children:[$0(F1,{width:"40%",borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,children:$0(F1,{flexDirection:"column",children:[$0(F1,{paddingTop:1,paddingBottom:1,children:$0(U0,{bold:!0,color:X.colors.text.primary,children:["可用主题 (",rX.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(nK,{items:rX,initialIndex:Y>=0?Y:0,onSelect:z,onHighlight:K,itemComponent:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(F1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:X.colors.border.light,children:[$0(tK,{theme:X},void 0,!1,void 0,this),$0(sK,{theme:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(F1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:$0(U0,{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 Q6,Text as B1,useStdout as eK}from"ink";import $z,{useCallback as g1,useEffect as y2,useMemo as d9,useRef as m$,useState as L1}from"react";import{jsxDEV as R$}from"react/jsx-dev-runtime";function iX($,J){let Y=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(Y.length,$.cursor+J))}}function Jz($,J,Y){let Z=Array.from($.value);if(Y.leftArrow)return iX($,-1);if(Y.rightArrow)return iX($,1);if(Y.home)return{...$,cursor:0};if(Y.end)return{...$,cursor:Z.length};if(Y.backspace&&$.cursor>0)return Z.splice($.cursor-1,1),{value:Z.join(""),cursor:$.cursor-1};if(Y.delete&&$.cursor<Z.length)return Z.splice($.cursor,1),{value:Z.join(""),cursor:$.cursor};if(Y.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(Y.ctrl||Y.meta||J.length===0)return $;let X=J.replace(/[\r\n\t]+/g," ");if(X.length===0)return $;let Q=Array.from(X);return Z.splice($.cursor,0,...Q),{value:Z.join(""),cursor:$.cursor+Q.length}}function Yz({editor:$}){let J=Array.from($.value),Y=J.slice(0,$.cursor).join(""),Z=J[$.cursor]??" ",X=J.slice($.cursor+1).join("");return R$(B1,{wrap:"truncate-end",children:["/",Y,R$(B1,{inverse:!0,children:Z},void 0,!1,void 0,this),X,R$(B1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Xz({line:$,matches:J,currentMatchIndex:Y,selected:Z,selectedBlock:X,color:Q,highlightColor:U}){let G=yX($,J);if(Z||G.length===0)return R$(B1,{wrap:"truncate-end",color:Q,inverse:Z,bold:X,underline:X,children:$.text||" "},void 0,!1,void 0,this);let z=[],K=0;for(let O of G){if(O.start>K)z.push($.text.slice(K,O.start));z.push(R$(B1,{color:U,bold:!0,inverse:O.matchIndex===Y,children:$.text.slice(O.start,O.end)},`${$.key}:match:${O.matchIndex}`,!1,void 0,this)),K=O.end}if(K<$.text.length)z.push($.text.slice(K));return R$(B1,{wrap:"truncate-end",color:Q,bold:X,underline:X,children:z},void 0,!1,void 0,this)}var oX=$z.memo(({isOpen:$,onClose:J,compact:Y=!1})=>{let Z=j8(),X=i8(),Q=a8(),U=o8(),G=s0(),z=D0(),{stdout:K}=eK(),{width:O,height:q}=r1(),N=Y?Math.max(6,Math.floor(q*0.4)):q,_=Math.max(1,N-3),W=Math.max(12,O-4),H=m$(new Map),A=m$(new D8),[b,w]=L1(new Set),B=m$(b);B.current=b;let C=d9(()=>CX({messages:Z,currentStreamingMessageId:X,streamingLines:U.lines,streamingTail:U.tail,currentThinkingContent:Q}),[Z,X,U.lines,U.tail,Q]),F=d9(()=>{let e=new Set(C.map((k)=>k.id));for(let k of H.current.keys())if(!e.has(k))H.current.delete(k);return C.flatMap((k,E)=>{let m=b.has(k.id),c=H.current.get(k.id),r=c?.revision===k.revision&&c.width===W&&c.expanded===m?c.lines:E9(k,W,m);if(r!==c?.lines)H.current.set(k.id,{revision:k.revision,width:W,expanded:m,lines:r});if(E===C.length-1)return r;return[...r,{key:`${k.id}:separator`,blockId:k.id,role:k.role,kind:k.kind,text:"",copyText:"",pending:k.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})},[C,W,b]),[M,L]=L1(0),[y,S]=L1(new Set),[T,R]=L1(null),P=m$(null),[j,o]=L1(!1),u=m$(!1),[J0,K0]=L1({value:"",cursor:0}),q0=m$(J0),[a,f]=L1(""),[v,G0]=L1(0),V=m$(0),[x,l]=L1(null),H0=m$(null),[F0,T0]=L1(null),I=m$(0),D=m$(null),p=m$(0),h=m$(C),n=m$(F.length),N0=m$(W);p.current=M,P.current=T,u.current=j,q0.current=J0,V.current=v,H0.current=x;let X0=d9(()=>A.current.search(C,a),[C,a]),C0=Math.max(0,F.length-_),Q0=Math.max(0,F.length-M),S0=Math.max(0,Q0-_),Y0=g1((e)=>{let k=Math.max(0,Math.min(C0,e));if(p.current=k,L(k),k===0)S(new Set)},[C0]),h0=g1((e)=>{if(F.length===0)return;let k=Math.max(0,Math.min(F.length-1,e)),E=Math.max(0,Math.min(F.length-_,k-Math.floor(_/2))),m=Math.min(F.length,E+_);Y0(F.length-m)},[F.length,Y0,_]),F$=g1((e,k,E)=>{let m=new Set(B.current);if(k)m.add(e);else m.delete(e);B.current=m,D.current=E,w(m)},[]),g0=g1((e)=>{let k=C.find((m)=>m.id===e.blockId);if(k?.collapsible&&!B.current.has(k.id)){F$(k.id,!0,{blockId:k.id,match:e});return}let E=h9(F,e);if(E>=0)h0(E)},[C,F,h0,F$]),N$=g1((e,k=X0)=>{if(k.length===0){V.current=0,G0(0);return}let E=(e%k.length+k.length)%k.length;V.current=E,G0(E);let m=k[E];P.current=m.blockId,R(m.blockId),g0(m)},[X0,g0]),r$=g1((e)=>{let k=C.filter((P0)=>P0.collapsible);if(k.length===0)return;let E=k.findIndex((P0)=>P0.id===P.current),m=E<0?e>0?0:k.length-1:(E+e+k.length)%k.length,c=k[m].id;P.current=c,R(c);let r=F.findIndex((P0)=>P0.blockId===c&&P0.header);if(r>=0)h0(r)},[C,F,h0]),r0=g1(()=>{let e=P.current;if(!e)e=F.slice(S0,Q0).find((E)=>C.some((m)=>m.id===E.blockId&&m.collapsible))?.blockId??null;if(!e)return;if(!C.find((E)=>E.id===e)?.collapsible)return;P.current=e,R(e),F$(e,!B.current.has(e),{blockId:e})},[C,Q0,F,F$,S0]),G$=g1((e,k)=>{let E=H0.current;if(!E||F.length===0)return;let m=k==="top"?0:k==="bottom"?F.length-1:Math.max(0,Math.min(F.length-1,E.head+e)),c={...E,head:m};H0.current=c,l(c),h0(m)},[F.length,h0]),d0=g1(()=>{let e=H0.current;if(!e)return;let k=IX(F,e.anchor,e.head);if(!k.trim()){T0("Nothing selected");return}let E=++I.current;T0("Copying..."),Y6(k,{writeTerminal:(m)=>K.write(m)}).then((m)=>{if(I.current!==E)return;T0(m.success?m.method==="osc52"?"Copy sent via OSC 52":`Copied ${k.split(`
171
+ `).length} lines`:"Copy failed"),H0.current=null,l(null)})},[F,K]);y2(()=>{if(!F0)return;let e=setTimeout(()=>T0(null),2500);return()=>clearTimeout(e)},[F0]),y2(()=>{if(!$){I.current++,h.current=C,n.current=F.length;return}B.current=new Set,w(new Set),P.current=null,R(null),u.current=!1,o(!1),q0.current={value:"",cursor:0},K0({value:"",cursor:0}),f(""),V.current=0,G0(0),H0.current=null,l(null),T0(null),p.current=0,L(0),S(new Set),h.current=C,n.current=F.length,N0.current=W},[$]),y2(()=>{let e=new Set(C.map((k)=>k.id));if(w((k)=>{let E=new Set([...k].filter((c)=>e.has(c)));return B.current=E,E.size===k.size&&[...E].every((c)=>k.has(c))?k:E}),P.current&&!e.has(P.current))P.current=null,R(null)},[C]),y2(()=>{let e=n.current;if(n.current=F.length,!$)return;let k=D.current;if(k){D.current=null;let m=k.match?h9(F,k.match):F.findIndex((c)=>c.blockId===k.blockId&&c.header);if(m>=0)h0(m);return}if(p.current===0){S(new Set);return}let E=Math.max(0,F.length-e);if(E>0)L((m)=>{let c=Math.min(C0,m+E);return p.current=c,c});else if(p.current>C0)p.current=C0,L(C0)},[W,b,$,F.length,C0,h0]),y2(()=>{let e=h.current;if(h.current=C,!$||p.current===0)return;let k=SX(e,C);if(k.length===0)return;S((E)=>{let m=new Set(E);for(let c of k)m.add(c);return m})},[C,$]),y2(()=>{if(X0.length===0)V.current=0,G0(0);else if(V.current>=X0.length)V.current=X0.length-1,G0(X0.length-1)},[X0.length]),y2(()=>{if(N0.current===W)return;N0.current=W,H0.current=null,l(null);let e=X0[V.current];if(e)g0(e)},[W,X0,g0]),O0((e,k)=>{if(!$)return;let E=k,m=G==="transcript-pager";if((E.ctrl||E.meta)&&e.toLowerCase()==="o")return J(),!0;if(!m){if(E.pageUp)return Y0(p.current+Math.max(1,_-1)),!0;if(E.pageDown)return Y0(p.current-Math.max(1,_-1)),!0;return!1}if(u.current){if(E.escape)return u.current=!1,o(!1),q0.current={value:a,cursor:Array.from(a).length},K0(q0.current),!0;if(E.return){let r=q0.current.value,P0=A.current.search(C,r);return f(r),u.current=!1,o(!1),N$(0,P0),!0}let c=Jz(q0.current,e,E);return q0.current=c,K0(c),!0}if(e==="q")return J(),!0;if(H0.current){if(E.escape)return H0.current=null,l(null),!0;if(e==="y"||E.ctrl&&!E.meta&&e.toLowerCase()==="c")return d0(),!0;if(E.upArrow||e==="k")return G$(-1),!0;if(E.downArrow||e==="j")return G$(1),!0;if(E.pageUp)return G$(-Math.max(1,_-1)),!0;if(E.pageDown)return G$(Math.max(1,_-1)),!0;if(E.home||e==="g")return G$(0,"top"),!0;if(E.end||e==="G")return G$(0,"bottom"),!0;return!0}if(E.escape)return J(),!0;if(e==="/"){let c={value:a,cursor:Array.from(a).length};return q0.current=c,K0(c),u.current=!0,o(!0),!0}if(e==="n"&&X0.length>0)return N$(V.current+1),!0;if(e==="N"&&X0.length>0)return N$(V.current-1),!0;if(E.tab)return r$(E.shift?-1:1),!0;if(E.return||e==="e")return r0(),!0;if(e==="v"){if(F.length===0)return!0;let c=Math.max(0,F.length-p.current),r=Math.max(0,c-_),P0=P.current?F.findIndex((b$)=>b$.blockId===P.current&&b$.header):-1,l0=P0>=0?P0:Math.max(0,Math.min(F.length-1,r)),c0={anchor:l0,head:l0};return H0.current=c0,l(c0),h0(l0),!0}if(E.upArrow||e==="k")return Y0(p.current+1),!0;if(E.downArrow||e==="j")return Y0(p.current-1),!0;if(E.pageUp)return Y0(p.current+Math.max(1,_-1)),!0;if(E.pageDown)return Y0(p.current-Math.max(1,_-1)),!0;if(E.home||e==="g")return Y0(C0),!0;if(E.end||e==="G")return Y0(0),!0;return!0},{isActive:$,priority:100});let P1=F.slice(S0,Q0),A1=y.size,Q8=F.length===0?"0/0":`${Math.min(Q0,F.length)}/${F.length}`,c1=x?Math.min(x.anchor,x.head):-1,k2=x?Math.max(x.anchor,x.head):-1,Z2=a.length>0?`/${a} ${X0.length>0?`${v+1}/${X0.length}`:"0/0"}`:null,I$=F0?F0:x?`${k2-c1+1} lines selected · y copy · Esc cancel`:Z2?`${Z2} · n/N`:A1>0?`${A1} new · G latest`:"Ctrl+O / Esc / q close";return R$(Q6,{flexDirection:"column",width:"100%",height:N,paddingX:2,children:[R$(Q6,{justifyContent:"space-between",flexShrink:0,children:[R$(B1,{bold:!0,color:z.colors.primary,children:"Transcript"},void 0,!1,void 0,this),R$(B1,{color:z.colors.text.muted,children:Q8},void 0,!1,void 0,this)]},void 0,!0,void 0,this),R$(Q6,{flexDirection:"column",height:_,flexShrink:0,overflow:"hidden",children:P1.length===0?R$(B1,{color:z.colors.text.muted,children:"No transcript yet"},void 0,!1,void 0,this):P1.map((e,k)=>{let E=S0+k,m=c1>=0&&E>=c1&&E<=k2,c=e.header&&e.blockId===T,r=e.pending?z.colors.warning:e.kind==="thinking"?z.colors.info:e.role==="user"?z.colors.info:e.role==="assistant"?z.colors.success:z.colors.text.secondary;return R$(Xz,{line:e,matches:X0,currentMatchIndex:v,selected:m,selectedBlock:c,color:r,highlightColor:z.colors.warning},e.key,!1,void 0,this)})},void 0,!1,void 0,this),R$(Q6,{flexShrink:0,children:j?R$(Yz,{editor:J0},void 0,!1,void 0,this):R$(B1,{color:F0||A1>0?z.colors.warning:z.colors.text.muted,wrap:"truncate-end",children:[I$," · / 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 E0}from"react/jsx-dev-runtime";var Y$=H1("UI"),$Z=({debug:$,continue:J,...Y})=>{if($)Y$.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:J});let Z=I2(!1),X=I2(!1),Q=I2(!1),U=I2(null),G=I2(!1),z=I2(null);if(!z.current)z.current=new v6;let K=z.current,O=I2(null);if(!O.current)O.current=new j6;let q=O.current,[N,_]=tX(K.getState()),[W,H]=tX(!1),A=YJ(),b=XJ(),w=j2(),B=UJ(),C=GJ(),F=h8(),M=x8(),L=LJ(),y=QJ(),S=N1(),T=d1(),R=V2(),P=O1(),{stdout:j}=Zz(),o=WJ(),u=h2(),J0=HJ();J1(()=>{if(L$.getCurrentThemeName()!==J0)try{L$.setTheme(J0)}catch{}},[J0]);let K0=A==="ready",q0=A==="needsSetup",a=A==="idle",f=Qz(()=>Y.agents?eX(Y.agents):void 0,[Y.agents]),{confirmationState:v,confirmationHandler:G0,handleResponse:V,dismissAll:x}=SY(),{executeCommand:l,handleAbort:H0,isProcessing:F0,cleanupAgent:T0,refreshFollowUpQueue:I,controlFollowUpQueue:D}=RY(Y.systemPrompt,Y.appendSystemPrompt,G0,Y.maxTurns,x,f,{list:()=>q.listAll(),acknowledge:(i)=>q.acknowledge(i),setVisibleLocator:(i)=>i?q.proveLocal(i):q.setVisibleLocator()}),p=i0(async(i)=>{await dJ(i.controller,i.visibility,{continueSession:J===!0,resume:Y.resume,forkSession:Y.forkSession===!0,requestedSessionId:Y.sessionId,locator:{version:2,sessionId:R,workspace:{kind:"local",projectPath:P}}})}),h=i0((i)=>{S.projectTaskAttentionState(i.status,i.unreadKeys,i.sessions)}),n=i0((i)=>{Y$.warn(`[BladeInterface] Task attention ${i} unavailable`)});U3({ready:K0,lifecycle:q,initialize:p,project:h,report:n});let N0=i0(_),X0=i0(()=>{Y$.warn("[BladeInterface] Session history shutdown unavailable")});Y3({lifecycle:K,project:N0,report:X0});let{getPreviousCommand:C0,getNextCommand:Q0,addToHistory:S0}=yY();nY();let Y0=DY("",0),h0=i0(()=>{o$(),j.write(nX.eraseScreen+nX.cursorTo(0,0)),T.incrementClearCount()}),F$=i0(()=>{if(W)return;H(!0)}),g0=i0(()=>{if(!W)return;H(!1)}),N$=i0(()=>{if(W)g0();else F$()});O0((i,w0)=>{if(K0&&!q0&&(w0.ctrl||w0.meta)&&i.toLowerCase()==="o")return N$(),!0;return!1},{priority:90}),J1(()=>{if(!G.current){G.current=!0;return}h0()},[h0,W]);let r$=i0(async()=>{let i=u,w0;if(i==="default")w0="autoEdit";else if(i==="autoEdit")w0="plan";else if(i==="plan")w0="default";else w0="default";try{await a0.setSessionPermissionMode(R,P,w0),await z$().setPermissionMode(w0)}catch(H$){Y$.error("权限模式切换失败:",H$ instanceof Error?H$.message:H$)}}),r0=i0(async(i)=>{try{let w0={displayName:i.displayName,provider:i.provider,model:i.model,overrides:i.overrides};if(i.modelProvider)await z$().addModelWithProvider(w0,i.modelProvider);else await z$().addModel(w0);S.setInitializationStatus("ready")}catch(w0){throw Y$.error("初始化配置保存失败:",w0 instanceof Error?w0.message:w0),w0}}),G$=i0(()=>{if(w==="shortcuts")S.closeModal();else S.setActiveModal("shortcuts")}),d0=i0(async()=>{try{await rJ(q.visibility(),{version:2,sessionId:R,workspace:{kind:"local",projectPath:P}})}catch{Y$.warn("[BladeInterface] Task attention fallback visibility unavailable")}}),P1=i0(async(i,w0,H$)=>{return q4({intent:w0,session:i,newSessionId:H$?.newSessionId,announceFork:H$?.announceFork,permissionModeOverride:Y.permissionMode},P,T,T0)}),A1=i0(async(i,w0,H$)=>{await XY(i,w0,{openHistory:(f2,u1)=>{S.showSessionHistoryViewer(f2,u1)},activateLocal:async(f2,u1)=>{await K.closeView();let q6=await P1(f2,u1,H$);try{await lJ(u1,i,q6,q.visibility())}catch{Y$.warn("[BladeInterface] Task attention local activation unavailable")}S.closeModal()}},H$)}),Q8=i0(async(i,w0)=>{let u1=(await z4(w0,P,q)).filter((q6)=>q6.locator.sessionId===i);if(u1.length===0)throw Error(`Session not found: ${i}`);if(u1.length>1)throw Error(`Multiple workspaces contain session ${i}; use the session selector`);return u1[0]}),{showSuggestions:c1,suggestions:k2,selectedSuggestionIndex:Z2}=aY(Y0,l,C0,Q0,S0,H0,F0,r$,G$,w==="shortcuts",w==="sessionHistoryViewer");J1(()=>{if(Y0.value&&w==="shortcuts")S.closeModal()},[Y0.value,w,S]),J1(()=>{if(w==="followUpQueue")I()},[w,I]);let I$=i0(async()=>{Q.current=!0;try{let i=Y.forkSession?"fork":"resume",w0=await z4(i,P,q);if(w0.length===0){if(Y.forkSession){Y$.error("没有可供 fork 的历史会话"),Y1(1);return}T.addAssistantMessage("没有找到历史会话,开始新对话。"),await d0();return}let H$=iJ(w0);if(!H$){if(Y.forkSession){Y$.error("没有可供 fork 的本地历史会话"),Y1(1);return}T.addAssistantMessage("没有找到本地历史会话,开始新对话。"),await d0();return}await A1(H$,i,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(i){if(Y$.error("[BladeInterface] 继续会话失败:",i),Y.forkSession){Y1(1);return}T.addAssistantMessage("继续会话失败,开始新对话。"),await d0()}}),e=i0(async()=>{Q.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let H$=Y.forkSession?"fork":"resume",f2=await Q8(Y.resume,H$);await A1(f2,H$,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let i=Y.forkSession?"fork":"resume",w0=await z4(i,P,q);if(w0.length===0)Y$.error("没有找到历史会话"),Y1(1);S.showSessionSelector(w0,i)}catch(i){Y$.error("[BladeInterface] 加载会话失败:",i),Y1(1)}});J1(()=>{if(Z.current)return;if(J){Z.current=!0,I$();return}if(Y.resume)Z.current=!0,e()},[J,Y.resume,I$,e]);let k=i0(async(i)=>{let w0=v.details?.type;if(w0==="enterPlanMode"&&i.approved)try{await a0.setSessionPermissionMode(R,P,"plan"),await z$().setPermissionMode("plan"),Y$.debug("[BladeInterface] Entered Plan mode")}catch(H$){Y$.error("[BladeInterface] Failed to enter Plan mode:",H$)}if(w0==="exitPlanMode"&&i.approved)Y$.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");V(i)}),E=i0(()=>{T.addAssistantMessage("设置已取消"),T.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),T.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),Y1(0)}),m=i0(()=>{K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")}),S.closeModal()}),c=i0(async(i)=>{try{let w0=B?.intent??"resume";await A1(i,w0,{newSessionId:w0==="fork"&&Y.forkSession?Y.sessionId:void 0})}catch(w0){Y$.error("[BladeInterface] Failed to restore session:",w0),T.addAssistantMessage(`会话操作失败: ${w0 instanceof Error?w0.message:"未知错误"}`),S.closeModal()}}),r=i0(()=>{if(K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")}),Y.resume)Y1(0);else S.closeModal()});J1(()=>{if(w==="sessionHistoryViewer"&&C){J3(K,q,C).catch(()=>{Y$.warn("[BladeInterface] Session history activation unavailable")});return}if(K.cancelRemoteRequest(),q.endRemote().catch(()=>{Y$.warn("[BladeInterface] Task attention visibility unavailable")}),K.getState().status!=="idle")K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")})},[w,K,C,q]),J1(()=>{if(!C)return;q.updateRemote(C,N).catch(()=>{Y$.warn("[BladeInterface] Task attention acknowledgement unavailable")})},[N,C,q]);let P0=i0((i)=>{S.showModelEditWizard(i)}),l0=i0((i)=>{T.addAssistantMessage(`已添加模型配置: ${i.displayName??i.model},并已切换到该模型`),m()}),c0=i0((i)=>{T.addAssistantMessage(`已更新模型配置: ${i.displayName??i.model}`),m()});J1(()=>{if(q0){o.setFocus("model-config-wizard");return}if(v.isVisible)o.setFocus("confirmation-prompt");else if(w==="sessionSelector")o.setFocus("session-selector");else if(w==="sessionHistoryViewer")o.setFocus("session-history-viewer");else if(w==="followUpQueue")o.setFocus("follow-up-queue");else if(w==="themeSelector")o.setFocus("theme-selector");else if(w==="modelSelector")o.setFocus("model-selector");else if(w==="modelAddWizard"||w==="modelEditWizard")o.setFocus("model-config-wizard");else if(w==="permissionsManager")o.setFocus("permissions-manager");else if(w==="agentsManager")o.setFocus("agents-manager");else if(w==="agentCreationWizard")o.setFocus("agent-creation-wizard");else if(w==="skillsManager")o.setFocus("skills-manager");else if(w==="pluginsManager")o.setFocus("plugins-manager");else if(w==="hooksManager")o.setFocus("hooks-manager");else if(W)o.setFocus("transcript-pager");else if(w==="shortcuts")o.setFocus("main-input");else o.setFocus("main-input")},[q0,v.isVisible,w,W,o.setFocus]),J1(()=>{if(!K0||Q.current)return;if(sX().length>0){Q.current=!0;return}Q.current=!0,T.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[K0]),J1(()=>{if(!b)return;if(U.current===b)return;if(U.current=b,A==="error")T.addAssistantMessage(`初始化失败: ${b}`);else T.addAssistantMessage(`${b}`),T.addAssistantMessage("请重新尝试设置,或检查文件权限")},[b,A,T.addAssistantMessage]);let b$=i0(async(i)=>{try{await l({displayText:i,text:i,images:[],parts:[{type:"text",text:i}]})}catch(w0){let H$=w0 instanceof Error?w0.message:"无法发送初始消息";T.addAssistantMessage(`初始消息发送失败:${H$}`)}});J1(()=>{let i=Y.initialMessage?.trim();if(!i||X.current||!K0||q0)return;X.current=!0,S0(i),b$(i)},[Y.initialMessage,K0,q0,l,S0]);let _1=i0(async(i)=>{try{await z$().setPermissionMode(i)}catch(w0){Y$.error("权限模式初始化失败:",w0 instanceof Error?w0.message:w0)}});if(J1(()=>{let i=Y.permissionMode;if($)Y$.debug("[Debug] permissionMode from CLI:",i),Y$.debug("[Debug] current permissionMode:",u);if(!i||i===u)return;_1(i)},[Y.permissionMode,u]),a)return null;if(q0)return E0(v9,{mode:"setup",onComplete:r0,onCancel:E},void 0,!1,void 0,this);if($)Y$.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:v.isVisible,activeModal:w});let Q2=w==="modelSelector",w$=y,a$=w==="modelAddWizard"?"add":w==="modelEditWizard"&&w$?"edit":null,O$=Q2||Boolean(a$),b1=w==="agentsManager",M1=w==="agentCreationWizard",Z$=w==="skillsManager",D2=w==="pluginsManager",BZ=w$?{displayName:w$.displayName,provider:w$.provider,model:w$.model,overrides:w$.overrides}:void 0,a9=v.isVisible&&v.details?v.details.type==="mcpElicitation"&&v.details.mcpElicitation?E0(m5,{details:v.details.mcpElicitation,onComplete:(i,w0)=>k({approved:i.action==="accept",elicitation:i,...w0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):v.details.type==="askUserQuestion"&&v.details.questions?E0(bX,{questions:v.details.questions,onComplete:(i)=>k({approved:!0,answers:i}),onCancel:()=>k({approved:!1})},void 0,!1,void 0,this):E0(Y5,{details:v.details,onResponse:k},void 0,!1,void 0,this):w==="themeSelector"?E0(aX,{},void 0,!1,void 0,this):w==="permissionsManager"?E0(HX,{onClose:m},void 0,!1,void 0,this):w==="sessionSelector"?E0(VX,{intent:B?.intent??"resume",sessions:B?.sessions??[],taskAttentionUnreadKeys:F,onSelect:c,onCancel:r},void 0,!1,void 0,this):w==="sessionHistoryViewer"?E0(DX,{state:N,onLoadOlder:(i)=>K.loadOlder(i),onFork:(i)=>K.fork(i),onClose:m},void 0,!1,void 0,this):w==="followUpQueue"?E0(X5,{queue:M,mutation:L,onMutate:D,onRefresh:I,onClose:m},void 0,!1,void 0,this):w==="hooksManager"?E0(Q5,{workspaceRoot:P,sessionId:R,onClose:m},void 0,!1,void 0,this):null,v8=Boolean(a9);return E0(m1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[a9,E0(m1,{flexDirection:"column",display:v8||W?"none":"flex",children:[E0(a5,{active:!v8&&!W},void 0,!1,void 0,this),E0(dX,{},void 0,!1,void 0,this),E0(u9,{},void 0,!1,void 0,this),E0(p9,{},void 0,!1,void 0,this),E0(j5,{paused:v8||W},void 0,!1,void 0,this),E0(R5,{input:Y0.value,cursorPosition:Y0.cursorPosition,onChange:Y0.setValue,onChangeCursorPosition:Y0.setCursorPosition,onAddPasteMapping:Y0.addPasteMapping,onAddImagePasteMapping:Y0.addImagePasteMapping,disabled:w==="sessionHistoryViewer"},void 0,!1,void 0,this),Q2&&E0(m1,{marginTop:1,paddingX:2,children:E0(i5,{onClose:m,onEdit:P0},void 0,!1,void 0,this)},void 0,!1,void 0,this),a$&&E0(m1,{marginTop:1,paddingX:2,children:E0(v9,{mode:a$,modelId:w$?.id,initialConfig:a$==="edit"?BZ:void 0,onComplete:a$==="edit"?c0:l0,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),b1&&E0(m1,{marginTop:1,paddingX:2,children:E0(W3,{workspaceRoot:P,onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),M1&&E0(m1,{marginTop:1,paddingX:2,children:E0(B8,{onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z$&&E0(m1,{marginTop:1,paddingX:2,children:E0(pX,{onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),D2&&E0(m1,{marginTop:1,paddingX:2,children:E0(AX,{workspaceRoot:P,onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(b3,{suggestions:k2,selectedIndex:Z2,visible:c1&&!O$},void 0,!1,void 0,this),E0(A3,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(m1,{flexDirection:"column",display:W?"flex":"none",children:E0(oX,{isOpen:W,compact:v8,onClose:g0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as Uz,Text as Y2}from"ink";import Gz from"react";import{jsxDEV as p1}from"react/jsx-dev-runtime";class f8 extends Gz.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 p1(Uz,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[p1(Y2,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),p1(Y2,{children:" "},void 0,!1,void 0,this),p1(Y2,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),p1(Y2,{children:" "},void 0,!1,void 0,this),p1(Y2,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),p1(Y2,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),p1(Y2,{children:" "},void 0,!1,void 0,this),p1(Y2,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as S2,Text as x1}from"ink";import{useState as l9}from"react";import{jsxDEV as y$}from"react/jsx-dev-runtime";var U6=[{key:"update",label:"Update now",description:`runs \`${YZ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],ZZ=({versionInfo:$,onComplete:J})=>{let[Y,Z]=l9(0),[X,Q]=l9(!1),[U,G]=l9(null);O0((K,O)=>{if(O.ctrl&&K==="c"){W8().shutdown("SIGINT",0);return}if(X||U)return;if(O.upArrow||K==="k")Z((q)=>q>0?q-1:U6.length-1);else if(O.downArrow||K==="j")Z((q)=>q<U6.length-1?q+1:0);else if(O.return)z(U6[Y].key);else if(K==="1")z("update");else if(K==="2")z("skip");else if(K==="3")z("skip_until_next")});let z=async(K)=>{switch(K){case"update":{Q(!0);let O=await XZ();G(O.message),setTimeout(()=>{W8().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await JZ($.latestVersion);J();break}};if(U)return y$(S2,{flexDirection:"column",marginY:1,children:y$(x1,{children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(X)return y$(S2,{flexDirection:"column",marginY:1,children:y$(x1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return y$(S2,{flexDirection:"column",marginY:1,children:[y$(x1,{color:"yellow",bold:!0,children:["Update available! ",y$(x1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y$(S2,{marginTop:1,children:y$(x1,{color:"gray",children:["Release notes:"," ",y$(x1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y$(S2,{flexDirection:"column",marginTop:1,children:U6.map((K,O)=>{let q=O===Y,N=q?"› ":" ",_=`${O+1}. `;return y$(S2,{children:y$(x1,{color:q?"cyan":void 0,children:[N,_,K.label,K.description&&y$(x1,{color:"gray",children:[" (",K.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},K.key,!1,void 0,this)})},void 0,!1,void 0,this),y$(S2,{marginTop:1,children:y$(x1,{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 G6,Text as Z8}from"ink";import{useState as QZ}from"react";import{jsxDEV as w1}from"react/jsx-dev-runtime";var UZ=({status:$,onTrust:J,onContinueSafely:Y})=>{let Z=L$.getTheme(),[X,Q]=QZ(!1),[U,G]=QZ(null);return O0((z,K)=>{if(X)return;if(K.return||z.toLowerCase()==="t"){Q(!0),G(null),J().catch((O)=>{G(O instanceof Error?O.message:"Failed to trust workspace"),Q(!1)});return}if(z.toLowerCase()==="s"||K.escape)Q(!0),G(null),Y().catch((O)=>{G(O instanceof Error?O.message:"Failed to continue safely"),Q(!1)})}),w1(G6,{flexDirection:"column",paddingX:1,children:[w1(Z8,{bold:!0,color:Z.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),w1(Z8,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),w1(G6,{marginTop:1,flexDirection:"column",children:[w1(Z8,{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((z)=>w1(Z8,{children:[" ",z.path," · ",z.effects.length," effect(s)"]},`${z.kind}:${z.path}`,!0,void 0,this))]},void 0,!0,void 0,this),U&&w1(G6,{marginTop:1,children:w1(Z8,{color:Z.colors.error,children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),w1(G6,{marginTop:1,children:w1(Z8,{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 Kz}from"ink";import{useEffect as zz}from"react";function GZ(){let{stdout:$}=Kz();zz(()=>{if(!$.isTTY)return;return $.write(K5),$.write(W9),()=>{$.write(z5),$.write(W9)}},[$])}function KZ($){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 qz($){return $.forkSession?void 0:$.resumeSessionId}function zZ($,J){let Y=qz($);if(Y)J(Y)}import{jsxDEV as X2}from"react/jsx-dev-runtime";function Oz($){if(m0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");B$().setInitializationStatus("ready")}var Nz=($)=>{GZ();let[J,Y]=z6(!1),[Z,X]=z6(null),[Q,U]=z6(!1),[G,z]=z6(null),K=K6((_,W)=>{let H=_ instanceof Error?_.message:String(_);if(B$().setInitializationError(H),B$().setInitializationStatus("error"),Y(!0),W)console.error("[FAIL] 应用初始化失败:",H)}),O=K6(async()=>{try{let _=m0().config.config??_Z,W=OZ(_,$);if(Oz(W),zZ(W,(A)=>{NZ().restoreSession(A,[])}),W.debug)console.error("[Debug] 运行时配置:",W);let H=W.codeTheme;if(H&&L$.hasTheme(H)){if(L$.setTheme(H),$.debug)console.log(`[OK] 已加载主题: ${H}`)}try{E$.getInstance().loadConfig(W.hooks||{},K$());let b=await HZ(K$());if($.debug&&W.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${b.subagents.getAllNames().length} agents, ${b.skills.size} skills, ${b.commands.getCommandCount()+b.commands.getPluginCommandCount()} commands, ${b.plugins.getAll().length} plugins`);let B=m0().session.sessionId;qZ(B)}catch(A){if($.debug)console.warn("Hooks 初始化失败:",KZ(A))}O4(async()=>{await FZ.getInstance().killAll(),await WZ.getInstance().disconnectAll(),E$.getInstance().cleanup()}),Y(!0)}catch(_){K(_,!!$.debug)}}),q=K6(async()=>{let _=await r9.getInstance().getStatus(K$());if(_.state==="untrusted"||_.state==="error"){z(_);return}await O()}),N=K6(async()=>{if($.versionCheckPromise){let _=await $.versionCheckPromise;if(_){X(_),U(!0);return}}await q()});if(_z(()=>{N()},[]),Q&&Z)return X2(f8,{children:X2(ZZ,{versionInfo:Z,onComplete:()=>{U(!1),q()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(G)return X2(f8,{children:X2(UZ,{status:G,onTrust:async()=>{await r9.getInstance().trust(K$()),await LZ(),z(null),await O()},onContinueSafely:async()=>{z(null),await O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!J)return null;return X2(f8,{children:X2($Z,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},Kb=($)=>X2(VY,{children:X2(Nz,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{Kb as AppWrapper};