blade-code 0.10.140 → 0.10.141
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blade.js +2 -2
- package/dist/{chunk-svsgtj41.js → chunk-0b67y4j1.js} +2 -2
- package/dist/{chunk-eqe3smcg.js → chunk-0chvj0qt.js} +2 -2
- package/dist/chunk-0s0er9wr.js +1 -0
- package/dist/{chunk-nxsarfy6.js → chunk-28tzj187.js} +1 -1
- package/dist/chunk-2b3j2egw.js +1 -0
- package/dist/{chunk-cf3dvysj.js → chunk-34fmx68h.js} +1 -1
- package/dist/{chunk-y5bqd8gh.js → chunk-3da7sqx6.js} +1 -1
- package/dist/chunk-3kszepm6.js +2 -0
- package/dist/chunk-44edbaa1.js +1 -0
- package/dist/{chunk-w5057h27.js → chunk-4dtshx9v.js} +2 -2
- package/dist/{chunk-rrtptbzv.js → chunk-4pexd8a7.js} +2 -2
- package/dist/{chunk-hj1yrssp.js → chunk-4w8v677q.js} +1 -1
- package/dist/chunk-514va7ce.js +2 -0
- package/dist/{chunk-pg7cgvs8.js → chunk-5q4z0sfr.js} +2 -2
- package/dist/{chunk-ffkzessq.js → chunk-5v3eng7c.js} +1 -1
- package/dist/chunk-5vxhttdq.js +10 -0
- package/dist/{chunk-xagh2qb6.js → chunk-6w8p6c0g.js} +2 -2
- package/dist/{chunk-7eepxhcp.js → chunk-7azws27d.js} +28 -28
- package/dist/chunk-7g76xzzg.js +2 -0
- package/dist/{chunk-hvmrcd84.js → chunk-7wcxjbyg.js} +1 -1
- package/dist/{chunk-c562kd2m.js → chunk-7xhw74hk.js} +1 -1
- package/dist/{chunk-mnk0b4nz.js → chunk-7xtxvrh8.js} +1 -1
- package/dist/{chunk-q9qts6bq.js → chunk-83je3g6c.js} +3 -3
- package/dist/chunk-8tvf39jm.js +1 -0
- package/dist/{chunk-2g8avyq6.js → chunk-9kj19a8t.js} +1 -1
- package/dist/{chunk-9ced7jf0.js → chunk-9tk6wq70.js} +1 -1
- package/dist/{chunk-kmg8ad2j.js → chunk-9xbwtjac.js} +1 -1
- package/dist/{chunk-e6j4vzta.js → chunk-ae0fws1f.js} +2 -2
- package/dist/chunk-be1fyzb3.js +181 -0
- package/dist/{chunk-eh901zhx.js → chunk-cbgsjzdw.js} +2 -2
- package/dist/chunk-enf0egke.js +1 -0
- package/dist/{chunk-ma1mn6hn.js → chunk-erhaedch.js} +1 -1
- package/dist/{chunk-19zsecpx.js → chunk-f2jm4x5q.js} +2 -2
- package/dist/{chunk-cww9pp1q.js → chunk-f2y0gxyq.js} +2 -2
- package/dist/chunk-f5t7a64t.js +1 -0
- package/dist/{chunk-6zxm9pen.js → chunk-frvdjy8y.js} +1 -1
- package/dist/{chunk-ppmy3n74.js → chunk-fx4xr1g6.js} +360 -357
- package/dist/{chunk-zfaenqqx.js → chunk-fx9vm1n5.js} +2 -2
- package/dist/{chunk-85b3kacc.js → chunk-gm2yfq3r.js} +2 -2
- package/dist/chunk-h273dnvq.js +1 -0
- package/dist/{chunk-pwct7cj7.js → chunk-h5xad96g.js} +1 -1
- package/dist/{chunk-r4q06wbs.js → chunk-hv8nt7wj.js} +1 -1
- package/dist/{chunk-1myft5nb.js → chunk-j1pptwsq.js} +1 -1
- package/dist/chunk-j7784bxm.js +1 -0
- package/dist/{chunk-gq727fet.js → chunk-jbpasjg9.js} +1 -1
- package/dist/chunk-jr402gf8.js +1 -0
- package/dist/{chunk-g38d2ezm.js → chunk-jsv3e4k6.js} +1 -1
- package/dist/{chunk-pw9axk0e.js → chunk-k1tfry97.js} +2 -2
- package/dist/{chunk-8fx20am1.js → chunk-k3ne93k8.js} +2 -2
- package/dist/{chunk-0c2y17xy.js → chunk-kf9j9z9k.js} +1 -1
- package/dist/{chunk-n8qg68y2.js → chunk-n34qsnks.js} +1 -1
- package/dist/{chunk-5cw3bevx.js → chunk-n9819k4p.js} +1 -1
- package/dist/{chunk-tagzy876.js → chunk-ppp4gpy4.js} +1 -1
- package/dist/{chunk-5jq1mrqd.js → chunk-pv6cgfv1.js} +1 -1
- package/dist/{chunk-50m1czz9.js → chunk-pzxg2sdv.js} +1 -1
- package/dist/{chunk-0kghtvxj.js → chunk-r5dmdsjb.js} +2 -2
- package/dist/{chunk-es0cbtx1.js → chunk-rv80nkve.js} +2 -2
- package/dist/{chunk-n6tvswa8.js → chunk-ryyzbd76.js} +2 -2
- package/dist/chunk-s56t6kzj.js +2 -0
- package/dist/{chunk-w2m4yczv.js → chunk-sd9bze9x.js} +1 -1
- package/dist/{chunk-tecbx0ek.js → chunk-sdapqhj0.js} +1 -1
- package/dist/chunk-se0q0p3v.js +1 -0
- package/dist/chunk-sz5g7eh5.js +1 -0
- package/dist/{chunk-2ff55pvt.js → chunk-tp4yy3a6.js} +3 -3
- package/dist/{chunk-kxwc5wrx.js → chunk-tqg9y2p6.js} +1 -1
- package/dist/{chunk-d1qe06f0.js → chunk-tya95jej.js} +1 -1
- package/dist/{chunk-08z32sky.js → chunk-v1mamd1x.js} +2 -2
- package/dist/{chunk-g4kydkyz.js → chunk-v67st2xb.js} +2 -2
- package/dist/chunk-wemdt9n6.js +6 -0
- package/dist/{chunk-0sx7ak0b.js → chunk-wm896gnx.js} +1 -1
- package/dist/chunk-yjbpfd3b.js +1 -0
- package/dist/{chunk-g5scqxq3.js → chunk-ze1ra6f9.js} +2 -2
- package/dist/{chunk-15fpc0qg.js → chunk-zj32chp7.js} +1 -1
- package/dist/chunk-znrafpad.js +1 -0
- package/dist/chunk-zqjm9yd8.js +1 -0
- package/dist/{chunk-8vqhcx3s.js → chunk-zrgfvc4k.js} +1 -1
- package/dist/web/assets/ChatView-BBYsaZIk.js +63 -0
- package/dist/web/assets/{CodeBlockHighlighter-BM1MZv6w.js → CodeBlockHighlighter-BC17_i4m.js} +1 -1
- package/dist/web/assets/{FilePreview-P77KS9tr.js → FilePreview-DuvfuHLi.js} +1 -1
- package/dist/web/assets/{KanbanBoard-B0c7sE2y.js → KanbanBoard-B-Z7lSaC.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-DHa0FqU0.js → MarkdownRenderer-DF-nYnJu.js} +3 -3
- package/dist/web/assets/{ScrollArea-C6yf2fqq.js → ScrollArea-dipnxnqf.js} +1 -1
- package/dist/web/assets/{SessionHistorySurface-CXYBWqlN.js → SessionHistorySurface-CnMBkiZW.js} +1 -1
- package/dist/web/assets/{SettingsModal-BVjVlENY.js → SettingsModal-DLA1WQ6g.js} +1 -1
- package/dist/web/assets/{Sidebar-DDW9Xs6e.js → Sidebar-tu4OcImk.js} +1 -1
- package/dist/web/assets/{TaskSwitcher-D74_5q1F.js → TaskSwitcher-D2TIUyr3.js} +1 -1
- package/dist/web/assets/{TerminalPanel-DNEKapEi.js → TerminalPanel-CcJVvSnz.js} +1 -1
- package/dist/web/assets/{archive-Ao0WD7pU.js → archive-EoUobrxu.js} +1 -1
- package/dist/web/assets/{arrow-left-a5_iLemp.js → arrow-left-Y8E5lnQ1.js} +1 -1
- package/dist/web/assets/{calendar-clock-BKbdz6Cu.js → calendar-clock-Cl0Spu99.js} +1 -1
- package/dist/web/assets/{chevron-right-8qYRfCj4.js → chevron-right-DmM1dl1s.js} +1 -1
- package/dist/web/assets/{chevrons-up-down-BXNG4GvK.js → chevrons-up-down-DFQNAYac.js} +1 -1
- package/dist/web/assets/{clock-3-DEL1ixyh.js → clock-3-D3dzsSrc.js} +1 -1
- package/dist/web/assets/{copy-Bd5v-KkM.js → copy-BwNmbccC.js} +1 -1
- package/dist/web/assets/{download-CIKvpDBW.js → download-DHzGZhJT.js} +1 -1
- package/dist/web/assets/{external-link-B33h3DQN.js → external-link-Dr_8T3Ah.js} +1 -1
- package/dist/web/assets/{folder-lOczceoh.js → folder-DcgRdL_P.js} +1 -1
- package/dist/web/assets/index-BZZUIkal.js +203 -0
- package/dist/web/assets/{pause-nnvVbgsj.js → pause-DXzNhd_w.js} +1 -1
- package/dist/web/assets/{pencil-_yfoOmUq.js → pencil-CYRCKPnu.js} +1 -1
- package/dist/web/assets/{play-BilJ7SDs.js → play-CfNxuNSd.js} +1 -1
- package/dist/web/assets/{plus-BqqpYKaK.js → plus-DBUPwsji.js} +1 -1
- package/dist/web/assets/{session-events-FPOvcMBw.js → session-events-DTVYDdaH.js} +23 -23
- package/dist/web/assets/{settings-CmJXtYTH.js → settings-K2UJIIf_.js} +1 -1
- package/dist/web/assets/{team-Bb04o2Tb.js → team-BoulGGnJ.js} +1 -1
- package/dist/web/assets/{teamService-B5w9cpsa.js → teamService-Cfm0Cd6e.js} +1 -1
- package/dist/web/assets/{terminal-DOjdChj0.js → terminal-C9ZyLrcq.js} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/chunk-1nreg14s.js +0 -1
- package/dist/chunk-2d3zksr0.js +0 -1
- package/dist/chunk-3kvt23m3.js +0 -1
- package/dist/chunk-4rh40xhc.js +0 -1
- package/dist/chunk-4xr4hz19.js +0 -2
- package/dist/chunk-61yd46c0.js +0 -1
- package/dist/chunk-8774agqd.js +0 -1
- package/dist/chunk-8brb7c6j.js +0 -6
- package/dist/chunk-abpmpyqa.js +0 -1
- package/dist/chunk-ascjys4e.js +0 -2
- package/dist/chunk-bb0z7c3g.js +0 -1
- package/dist/chunk-m9dv5177.js +0 -10
- package/dist/chunk-mwgx87vw.js +0 -1
- package/dist/chunk-ntq4h4jh.js +0 -1
- package/dist/chunk-r324qme7.js +0 -1
- package/dist/chunk-ra6ksfdy.js +0 -1
- package/dist/chunk-tnts2de5.js +0 -1
- package/dist/chunk-w0710yj4.js +0 -1
- package/dist/chunk-we13xwds.js +0 -180
- package/dist/chunk-zp5097qk.js +0 -2
- package/dist/web/assets/ChatView-BlAGPVC-.js +0 -63
- package/dist/web/assets/index-hZ37pkxs.js +0 -203
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{e as $5,f as J5,h as S$,i as M4}from"./chunk-50m1czz9.js";import{l as $X,m as JX,n as YX}from"./chunk-kxwc5wrx.js";import{A as q4,y as A9,z as b9}from"./chunk-cf3dvysj.js";import{Ba as XY,Da as uY,I as cY,M as HX,O as h6,P as R6,Q as vY,W as wY,X as PY,_ as AY,ca as l$,ea as y9,fa as I9,ha as bY,ja as Q8,ka as L5,la as B5,oa as w5,pa as P5,ta as lJ,ua as B3,wa as H3,xa as F3,ya as FX,za as ZY}from"./chunk-ppmy3n74.js";import"./chunk-8vqhcx3s.js";import{La as EZ,Ma as hZ,Na as gZ,Qa as WX}from"./chunk-pwct7cj7.js";import{Sa as BY}from"./chunk-4xr4hz19.js";import{Jb as FY,Kb as F4,Wb as LY,ec as P6}from"./chunk-we13xwds.js";import{pc as z8}from"./chunk-0sx7ak0b.js";import{Jd as P9,Kd as V2,Od as R9,Td as C9,Vd as t8,be as X8,ee as a0,zd as zY}from"./chunk-n6tvswa8.js";import"./chunk-kmg8ad2j.js";import{Ie as D9,Je as w6,Ke as f9}from"./chunk-es0cbtx1.js";import{ff as e9,gf as G4}from"./chunk-zfaenqqx.js";import{tf as s5}from"./chunk-g4kydkyz.js";import{uf as q8,vf as _4,xf as $1}from"./chunk-eh901zhx.js";import"./chunk-08z32sky.js";import{$f as z$,Bf as M2,Cf as F$,Df as l1,Ef as UJ,Ff as o8,Gf as M9,Hf as t3,If as CJ,Jf as rZ,Kf as s3,Lf as k2,Mf as m0,Nf as OX,Of as L$,Pf as t5,Qf as a4,Rf as U8,Uf as s9}from"./chunk-0kghtvxj.js";import"./chunk-v508x7cg.js";import"./chunk-c562kd2m.js";import"./chunk-pw9axk0e.js";import"./chunk-cww9pp1q.js";import{rg as yJ}from"./chunk-8fx20am1.js";import"./chunk-hvmrcd84.js";import"./chunk-eqe3smcg.js";import{Eg as H4,Hg as g5,Mg as F5,Vg as NX}from"./chunk-xagh2qb6.js";import"./chunk-ascjys4e.js";import"./chunk-r4q06wbs.js";import"./chunk-ma1mn6hn.js";import{sh as qJ,uh as E$}from"./chunk-2ff55pvt.js";import"./chunk-nxsarfy6.js";import{Hi as qX,Mi as H5,Ni as _X}from"./chunk-e6j4vzta.js";import{Pi as h9}from"./chunk-w2m4yczv.js";import{Qi as j2,Ri as e8,Ti as _J}from"./chunk-zp5097qk.js";import{Yi as K$}from"./chunk-g38d2ezm.js";import"./chunk-n8qg68y2.js";import{vj as zX,yj as _1}from"./chunk-pg7cgvs8.js";import{Gj as tZ,Hj as sZ,Kj as b1}from"./chunk-svsgtj41.js";import"./chunk-2g8avyq6.js";import{Wj as xZ}from"./chunk-19zsecpx.js";import{Zj as uJ}from"./chunk-85b3kacc.js";import"./chunk-5cw3bevx.js";import{ak as Z8,uk as t9}from"./chunk-mnk0b4nz.js";import{Hk as Y4}from"./chunk-tecbx0ek.js";import{useMemoizedFn as Q6}from"ahooks";import{useEffect as Qz,useState as G6}from"react";import{useMemoizedFn as i0}from"ahooks";import o5 from"ansi-escapes";import{Box as j1,useStdout as sK}from"ink";import{useEffect as e$,useMemo as eK,useRef as R2,useState as n5}from"react";import{useShallow as wX}from"zustand/react/shallow";import{useStore as BX}from"zustand";function q0($){return BX(k2,$)}var PX=[],D2=()=>q0(($)=>$.session.sessionId),q1=()=>q0(($)=>$.session.workspaceRoot),f8=()=>q0(($)=>$.session.messages),rJ=()=>q0(($)=>$.session.clearCount),aJ=()=>q0(($)=>$.session.isCompacting),iJ=()=>q0(($)=>$.session.tokenUsage.estimatedCostUsd),oJ=()=>q0(($)=>{let{totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:X}=$.session.tokenUsage;return lJ({totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:X}).hitRate});var v8=()=>q0(($)=>$.session.providerRecovery),nJ=()=>q0(($)=>$.session.turnActivity),tJ=()=>q0(($)=>$.session.actionStationarity),p1=()=>q0(($)=>$.session.actions),sJ=()=>q0(($)=>{let{totalTokens:J,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let X=Math.max(0,100-J/Y*100);return Math.round(X)}),eJ=()=>q0(($)=>$.app.initializationStatus),$9=()=>q0(($)=>$.app.initializationError),V8=()=>q0(($)=>$.app.activeModal),J9=()=>q0(($)=>$.app.tasks),Y9=()=>q0(($)=>$.app.modelEditorTarget),Z9=()=>q0(($)=>$.app.sessionSelectorData),X9=()=>q0(($)=>$.app.sessionHistoryViewerData),Q9=()=>q0(($)=>$.app.taskAttentionStatus),j8=()=>q0(($)=>$.app.taskAttentionUnreadKeys),G9=()=>q0(($)=>$.app.awaitingSecondCtrlC),x1=()=>q0(($)=>$.app.actions),E8=()=>q0(($)=>$.app.sideConversation),U9=()=>q0(($)=>$.app.teams),h8=()=>q0(($)=>$.app.initializationStatus==="ready"),K9=()=>q0(($)=>$.app.tasks.length>0),f2=()=>q0(($)=>$.config.config?.permissionMode||"default"),z9=()=>q0(($)=>$.config.config?.models??PX),g8=()=>q0(($)=>{let J=$.config.config;if(!J)return;let Y=J.currentModelId;return J.models.find((Z)=>Z.id===Y)??J.models[0]}),m8=()=>q0(($)=>$.config.config?.currentModelId),q9=()=>q0(($)=>$.config.config?.agentTeamsEnabled===!0),D0=()=>q0(($)=>{return F$.getTheme()}),_9=()=>q0(($)=>$.config.config?.codeTheme??"default"),X$=()=>q0(($)=>$.focus.currentFocus),O9=()=>q0(($)=>$.focus.actions),v2=()=>q0(($)=>$.command.isProcessing),N9=()=>q0(($)=>$.command.actions),p8=()=>q0(($)=>$.app.followUpQueue),W9=()=>q0(($)=>$.app.followUpQueueMutation),H9=()=>q0(($)=>$.command.recoveredSteeringCount),x8=()=>q0(($)=>$.app.reasoningEffort!=="off"),c8=()=>q0(($)=>$.app.reasoningEffort),u8=()=>q0(($)=>$.app.serviceTier),d8=()=>q0(($)=>$.app.responseVerbosity),l8=()=>q0(($)=>$.app.communicationStyle),r8=()=>q0(($)=>$.session.currentThinkingContent),F9=()=>q0(($)=>$.session.thinkingExpanded),a8=()=>q0(($)=>$.session.currentStreamingMessageId),i8=()=>q0(wX(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),L9=()=>q0(($)=>$.session.finalizingStreamingMessageId),B9=()=>q0(($)=>$.session.historyExpanded),w9=()=>q0(($)=>$.session.expandedMessageCount);import{randomUUID as O7}from"node:crypto";import{useMemoizedFn as J1}from"ahooks";import{useEffect as u1,useMemo as WY,useRef as N4}from"react";function AX($,J){try{return $.code===J.code&&$.message===J.message&&$.retryable===J.retryable&&$.resource===J.resource}catch{return!1}}class K6{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,X=this.wakeEpoch,Z=this.idleEpoch;if(this.attempt++,this.recoveryStartedAt===null)this.recoveryStartedAt=this.now(),this.installDeadlineTimer($);this.activeAttemptToken=J,this.activeRunController=Y;let Q=await this.options.run(Y.signal);if(this.disposed||$!==this.generation||this.activeAttemptToken!==J)return;if(this.activeAttemptToken=null,this.activeRunController=null,Q.status==="completed"){let G=this.wakeEpoch!==X;if(this.clearEpisode(),G)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!==Z)this.waitingForIdle=!1,this.scheduleIfRunnable();else this.waitingForIdle=!0;return}this.handleFailure(Q,$)}handleFailure($,J){let Y=V2($.taskFailure),X=this.options.sessionIdentity;if($.workKind!=="pending_input"||!$.evidence||!X||!AX($.taskFailure,$.evidence.taskFailure)){this.terminate("failed",this.attempt,Y);return}let Z=b9({sessionIdentity:X,failedAttempt:this.attempt,recoveryStartedAt:this.recoveryStartedAt??this.now(),now:this.now(),workStillPending:$.workStillPending,evidence:$.evidence});if(Z.phase!=="retry_scheduled"){this.terminate(Z.phase,this.attempt,Y);return}this.requested=!0,this.waitingForIdle=!1;let Q={},G=this.setTimerCallback(()=>{if(this.disposed||J!==this.generation||this.retryTimer?.token!==Q)return;this.retryTimer=null,this.scheduleIfRunnable()},Z.delayMs);this.retryTimer={handle:G,token:Q},G.unref?.()}handleUnexpectedFailure($,J){if(this.disposed||J!==this.generation)return;this.terminate("failed",Math.max(1,this.attempt),V2($),"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),P9("timeout"),"pending-resume-recovery-deadline-exceeded")},A9);this.deadlineTimer={handle:Y,token:J},Y.unref?.()}terminate($,J,Y,X){let Z=this.activeRunController;if(this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.activeAttemptToken=null,this.activeRunController=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget(),X)Z?.abort(X);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 J8{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);M9(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function bX($){if(!($ instanceof Error))return"未知错误";let X=$.lastError??$;if(X.responseBody)try{let G=JSON.parse(X.responseBody)?.error?.message;if(G){let U=X.statusCode?` (HTTP ${X.statusCode})`:"";return`${G}${U}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function MX($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function TX($){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=MX($),Y=TX($),X;if(Y)X="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else X=bX($);return{displayMessage:X,isAbort:J,isVisionNotSupported:Y}}import{appendFileSync as RX,mkdirSync as CX,writeFileSync as yX}from"node:fs";import IX from"node:os";import z6 from"node:path";var T9=null;function SX(){let $=process.env.BLADE_STORAGE_ROOT||z6.join(IX.homedir(),".blade");return z6.join($,"logs","stream-debug.log")}function kX($){if(T9===$)return;let J=z6.dirname($);CX(J,{recursive:!0,mode:493}),yX($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
|
|
1
|
+
import{e as $5,f as J5,h as S$,i as M4}from"./chunk-pzxg2sdv.js";import{l as $X,m as JX,n as YX}from"./chunk-tqg9y2p6.js";import{A as q4,y as A9,z as b9}from"./chunk-34fmx68h.js";import{Ba as XY,Da as uY,I as cY,M as HX,O as h6,P as R6,Q as vY,W as wY,X as PY,_ as AY,ca as l$,ea as y9,fa as I9,ha as bY,ja as Q8,ka as L5,la as B5,oa as w5,pa as P5,ta as lJ,ua as B3,wa as H3,xa as F3,ya as FX,za as ZY}from"./chunk-fx4xr1g6.js";import"./chunk-zrgfvc4k.js";import{La as EZ,Ma as hZ,Na as gZ,Qa as WX}from"./chunk-h5xad96g.js";import{Sa as BY}from"./chunk-7g76xzzg.js";import{Lb as FY,Mb as F4,Yb as LY,gc as P6}from"./chunk-be1fyzb3.js";import{rc as z8}from"./chunk-wm896gnx.js";import{Bd as zY,Ld as P9,Md as V2,Qd as R9,Vd as C9,Xd as t8,de as X8,ge as a0}from"./chunk-ryyzbd76.js";import"./chunk-9xbwtjac.js";import{Ke as D9,Le as w6,Me as f9}from"./chunk-rv80nkve.js";import{hf as e9,if as G4}from"./chunk-fx9vm1n5.js";import{vf as s5}from"./chunk-v67st2xb.js";import{wf as q8,xf as _4,zf as $1}from"./chunk-cbgsjzdw.js";import"./chunk-v1mamd1x.js";import{Df as M2,Ef as F$,Ff as l1,Gf as UJ,Hf as o8,If as M9,Jf as t3,Kf as CJ,Lf as rZ,Mf as s3,Nf as k2,Of as m0,Pf as OX,Qf as L$,Rf as t5,Sf as a4,Tf as U8,Wf as s9,bg as z$}from"./chunk-r5dmdsjb.js";import"./chunk-v508x7cg.js";import"./chunk-7xhw74hk.js";import"./chunk-k1tfry97.js";import"./chunk-f2y0gxyq.js";import{tg as yJ}from"./chunk-k3ne93k8.js";import"./chunk-7wcxjbyg.js";import"./chunk-0chvj0qt.js";import{Gg as H4,Jg as g5,Og as F5,Xg as NX}from"./chunk-6w8p6c0g.js";import"./chunk-3kszepm6.js";import"./chunk-s56t6kzj.js";import"./chunk-hv8nt7wj.js";import"./chunk-erhaedch.js";import{wh as qJ,yh as E$}from"./chunk-tp4yy3a6.js";import"./chunk-28tzj187.js";import{Li as qX,Qi as H5,Ri as _X}from"./chunk-ae0fws1f.js";import{Ti as h9}from"./chunk-sd9bze9x.js";import{Ui as j2,Vi as e8,Xi as _J}from"./chunk-514va7ce.js";import{aj as K$}from"./chunk-jsv3e4k6.js";import"./chunk-n34qsnks.js";import{Cj as _1,zj as zX}from"./chunk-5q4z0sfr.js";import{Kj as tZ,Lj as sZ,Oj as b1}from"./chunk-0b67y4j1.js";import"./chunk-9kj19a8t.js";import{_j as xZ}from"./chunk-f2jm4x5q.js";import{bk as uJ}from"./chunk-gm2yfq3r.js";import"./chunk-n9819k4p.js";import{ek as Z8,yk as t9}from"./chunk-7xtxvrh8.js";import{Lk as Y4}from"./chunk-sdapqhj0.js";import{useMemoizedFn as Q6}from"ahooks";import{useEffect as Gz,useState as G6}from"react";import{useMemoizedFn as i0}from"ahooks";import o5 from"ansi-escapes";import{Box as j1,useStdout as eK}from"ink";import{useEffect as e$,useMemo as $z,useRef as R2,useState as n5}from"react";import{useShallow as wX}from"zustand/react/shallow";import{useStore as BX}from"zustand";function q0($){return BX(k2,$)}var PX=[],D2=()=>q0(($)=>$.session.sessionId),q1=()=>q0(($)=>$.session.workspaceRoot),f8=()=>q0(($)=>$.session.messages),rJ=()=>q0(($)=>$.session.clearCount),aJ=()=>q0(($)=>$.session.isCompacting),iJ=()=>q0(($)=>$.session.tokenUsage.estimatedCostUsd),oJ=()=>q0(($)=>{let{totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:X}=$.session.tokenUsage;return lJ({totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:X}).hitRate});var v8=()=>q0(($)=>$.session.providerRecovery),nJ=()=>q0(($)=>$.session.turnActivity),tJ=()=>q0(($)=>$.session.actionStationarity),p1=()=>q0(($)=>$.session.actions),sJ=()=>q0(($)=>{let{totalTokens:J,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let X=Math.max(0,100-J/Y*100);return Math.round(X)}),eJ=()=>q0(($)=>$.app.initializationStatus),$9=()=>q0(($)=>$.app.initializationError),V8=()=>q0(($)=>$.app.activeModal),J9=()=>q0(($)=>$.app.tasks),Y9=()=>q0(($)=>$.app.modelEditorTarget),Z9=()=>q0(($)=>$.app.sessionSelectorData),X9=()=>q0(($)=>$.app.sessionHistoryViewerData),Q9=()=>q0(($)=>$.app.taskAttentionStatus),j8=()=>q0(($)=>$.app.taskAttentionUnreadKeys),G9=()=>q0(($)=>$.app.awaitingSecondCtrlC),x1=()=>q0(($)=>$.app.actions),E8=()=>q0(($)=>$.app.sideConversation),U9=()=>q0(($)=>$.app.teams),h8=()=>q0(($)=>$.app.initializationStatus==="ready"),K9=()=>q0(($)=>$.app.tasks.length>0),f2=()=>q0(($)=>$.config.config?.permissionMode||"default"),z9=()=>q0(($)=>$.config.config?.models??PX),g8=()=>q0(($)=>{let J=$.config.config;if(!J)return;let Y=J.currentModelId;return J.models.find((Z)=>Z.id===Y)??J.models[0]}),m8=()=>q0(($)=>$.config.config?.currentModelId),q9=()=>q0(($)=>$.config.config?.agentTeamsEnabled===!0),D0=()=>q0(($)=>{return F$.getTheme()}),_9=()=>q0(($)=>$.config.config?.codeTheme??"default"),X$=()=>q0(($)=>$.focus.currentFocus),O9=()=>q0(($)=>$.focus.actions),v2=()=>q0(($)=>$.command.isProcessing),N9=()=>q0(($)=>$.command.actions),p8=()=>q0(($)=>$.app.followUpQueue),W9=()=>q0(($)=>$.app.followUpQueueMutation),H9=()=>q0(($)=>$.command.recoveredSteeringCount),x8=()=>q0(($)=>$.app.reasoningEffort!=="off"),c8=()=>q0(($)=>$.app.reasoningEffort),u8=()=>q0(($)=>$.app.serviceTier),d8=()=>q0(($)=>$.app.responseVerbosity),l8=()=>q0(($)=>$.app.communicationStyle),r8=()=>q0(($)=>$.session.currentThinkingContent),F9=()=>q0(($)=>$.session.thinkingExpanded),a8=()=>q0(($)=>$.session.currentStreamingMessageId),i8=()=>q0(wX(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),L9=()=>q0(($)=>$.session.finalizingStreamingMessageId),B9=()=>q0(($)=>$.session.historyExpanded),w9=()=>q0(($)=>$.session.expandedMessageCount);import{randomUUID as O7}from"node:crypto";import{useMemoizedFn as J1}from"ahooks";import{useEffect as u1,useMemo as WY,useRef as N4}from"react";function AX($,J){try{return $.code===J.code&&$.message===J.message&&$.retryable===J.retryable&&$.resource===J.resource}catch{return!1}}class K6{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,X=this.wakeEpoch,Z=this.idleEpoch;if(this.attempt++,this.recoveryStartedAt===null)this.recoveryStartedAt=this.now(),this.installDeadlineTimer($);this.activeAttemptToken=J,this.activeRunController=Y;let Q=await this.options.run(Y.signal);if(this.disposed||$!==this.generation||this.activeAttemptToken!==J)return;if(this.activeAttemptToken=null,this.activeRunController=null,Q.status==="completed"){let G=this.wakeEpoch!==X;if(this.clearEpisode(),G)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!==Z)this.waitingForIdle=!1,this.scheduleIfRunnable();else this.waitingForIdle=!0;return}this.handleFailure(Q,$)}handleFailure($,J){let Y=V2($.taskFailure),X=this.options.sessionIdentity;if($.workKind!=="pending_input"||!$.evidence||!X||!AX($.taskFailure,$.evidence.taskFailure)){this.terminate("failed",this.attempt,Y);return}let Z=b9({sessionIdentity:X,failedAttempt:this.attempt,recoveryStartedAt:this.recoveryStartedAt??this.now(),now:this.now(),workStillPending:$.workStillPending,evidence:$.evidence});if(Z.phase!=="retry_scheduled"){this.terminate(Z.phase,this.attempt,Y);return}this.requested=!0,this.waitingForIdle=!1;let Q={},G=this.setTimerCallback(()=>{if(this.disposed||J!==this.generation||this.retryTimer?.token!==Q)return;this.retryTimer=null,this.scheduleIfRunnable()},Z.delayMs);this.retryTimer={handle:G,token:Q},G.unref?.()}handleUnexpectedFailure($,J){if(this.disposed||J!==this.generation)return;this.terminate("failed",Math.max(1,this.attempt),V2($),"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),P9("timeout"),"pending-resume-recovery-deadline-exceeded")},A9);this.deadlineTimer={handle:Y,token:J},Y.unref?.()}terminate($,J,Y,X){let Z=this.activeRunController;if(this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.activeAttemptToken=null,this.activeRunController=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget(),X)Z?.abort(X);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 J8{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);M9(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function bX($){if(!($ instanceof Error))return"未知错误";let X=$.lastError??$;if(X.responseBody)try{let G=JSON.parse(X.responseBody)?.error?.message;if(G){let U=X.statusCode?` (HTTP ${X.statusCode})`:"";return`${G}${U}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function MX($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function TX($){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=MX($),Y=TX($),X;if(Y)X="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else X=bX($);return{displayMessage:X,isAbort:J,isVisionNotSupported:Y}}import{appendFileSync as RX,mkdirSync as CX,writeFileSync as yX}from"node:fs";import IX from"node:os";import z6 from"node:path";var T9=null;function SX(){let $=process.env.BLADE_STORAGE_ROOT||z6.join(IX.homedir(),".blade");return z6.join($,"logs","stream-debug.log")}function kX($){if(T9===$)return;let J=z6.dirname($);CX(J,{recursive:!0,mode:493}),yX($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
|
|
2
2
|
`),T9=$}function q6($,J,Y){try{let X=SX();kX(X);let Z=new Date().toISOString(),Q=Y?` | ${JSON.stringify(Y)}`:"",G=`[${Z}] [${$}] ${J}${Q}
|
|
3
3
|
`;RX(X,G)}catch{}}var Y8=_1("UI");function _6($,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 S9($,J){let Y=$.streamSession??new J8({signal:$.signal,streamingBuffer:$.streamingBuffer,getStreamingMessageId:$.getStreamingMessageId,finalizeStreamingMessage:$.sessionActions.finalizeStreamingMessage,discardStreamingMessage:$.sessionActions.discardStreamingMessage,clearThinking:()=>$.sessionActions.setCurrentThinkingContent(null)}),X=(Z)=>{for(let Q of Z){if((Q.origin??"user")!=="user")continue;let G=$.commandActions.takeFollowUpPresentation(Q.id);if(G){$.sessionActions.addUserMessage(G.displayText);continue}if(!Q.recovered||Q.persisted)continue;let U=typeof Q.content==="string"?Q.content:Q.content.map((z)=>z.type==="text"?z.text:"[Image]").join(`
|
|
4
4
|
`);$.sessionActions.addUserMessage(U)}};return(Z)=>{switch(Z.kind){case"content_delta":if(Z.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;J.contentDeltaCount++,J.contentDeltaTotalLen+=Z.delta.length,q6("loopEventHandler","onContentDelta",{callCount:J.contentDeltaCount,deltaLen:Z.delta.length,totalLen:J.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(Z.delta);break;case"thinking_delta":if(Z.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(Z.delta);break;case"stream_end":{$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y8.debug("[loopEventHandler] stream_end",{contentDeltaCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Y.isFinalized,signalAborted:$.signal.aborted}),q6("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,...G}=Z;$.sessionActions.setProviderAdmission(Z.phase==="queued"?G:null);break}case"provider_circuit":{let{kind:Q,...G}=Z;$.sessionActions.setProviderCircuit(Z.phase==="closed"?null:G);break}case"provider_retry":{let{kind:Q,...G}=Z;$.sessionActions.setProviderRetry(Z.phase==="recovered"?null:G);break}case"provider_stall":{let{kind:Q,...G}=Z;$.sessionActions.setProviderStall(Z.phase==="detected"?G:null);break}case"provider_recovery":$.sessionActions.setProviderRecovery(Z.recovery);break;case"action_stationarity":{let{kind:Q,...G}=Z;$.sessionActions.setActionStationarity(Z.phase==="recovered"?null:G);break}case"turn_recovery":{_6($.sessionActions,Z.assessment);break}case"tool_start":{J.toolExecutionStarted=!0;let Q=Z.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;if(Y8.debug("[loopEventHandler] tool_start",{toolName:Q.function.name,toolKind:Z.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Q.function.name))break;try{let G=JSON.parse(Q.function.arguments),U=y9(Q.function.name,G);$.sessionActions.addToolMessage(U,{toolCallId:Q.id,toolName:Q.function.name,phase:"start",summary:U,params:G})}catch(G){Y8.error("[loopEventHandler] onToolStart error:",G)}break}case"tool_progress":{J.toolExecutionStarted=!0;let Q=Z.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;let G=Z.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((Z.update.progress??0)/Z.update.total*100)))}%`:"",U=`${Q.function.name}${G}: ${Z.update.message}`;$.sessionActions.addToolMessage(U,{toolCallId:Q.id,toolName:Q.function.name,phase:"progress",summary:U,...Z.update.admission?{admission:Z.update.admission}:{}});break}case"tool_result":{J.toolExecutionStarted=!0;let Q=Z.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;Y8.debug("[loopEventHandler] tool_result",{toolName:Q.function.name,success:Z.result.success});let G=C9(I9(Q.function.name,Z.result),R9);$.sessionActions.addToolMessage(G.summary,{toolCallId:Q.id,toolName:Q.function.name,phase:"complete",summary:G.summary,detail:G.detail});break}case"structured_output":J.outputStarted=!0,$.sessionActions.replaceLastAssistantMessage(JSON.stringify(Z.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(Z.usage);break;case"compaction":if($.sessionActions.setCompacting(Z.phase==="start"),Z.phase==="end"){if($.sessionActions.resetContextUsage(),Z.outcome!=="failed")J.compactionCount=(J.compactionCount??0)+1;if(Z.memory?.outcome==="written"){let Q=`Saved ${Z.memory.entries} project memories`;$.sessionActions.addToolMessage(Q,{toolName:"Project Memory",phase:"complete",summary:Q})}}break;case"turn_start":Y8.debug("[loopEventHandler] turn_start",{turn:Z.turn,maxTurns:Z.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:Z.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y.startTurn();break;case"task_update":$.appActions.setTasks(Z.tasks);break;case"goal_frontier_updated":$.appActions.setTasks(Z.tasks);break;case"mcp_catalog_changed":{let Q=`MCP catalog r${Z.revision}: +${Z.added.length} -${Z.removed.length} ~${Z.updated.length}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Catalog",phase:"complete",summary:Q,detail:[Z.added.length>0?`Added: ${Z.added.join(", ")}`:"",Z.removed.length>0?`Removed: ${Z.removed.join(", ")}`:"",Z.updated.length>0?`Updated: ${Z.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
@@ -120,52 +120,52 @@ ${c0}`}]}}let P0=O6(r),l0=await P(P0);if(!l0.accepted){let c0=l0.reason==="queue
|
|
|
120
120
|
|
|
121
121
|
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,U)).trim(),I=T.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(I)T=I[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)");G({name:P.name,description:P.description,tools:Array.isArray(P.tools)?P.tools:[],color:P.color||"blue",location:"project",systemPrompt:P.systemPrompt}),Z("confirm")}catch(L){N(L instanceof Error?L.message:String(L))}finally{O(!1)}});_3(()=>{if(X==="aiGenerating"&&!K&&!q)C()},[X,K,q,C]);let F=C4(async()=>{try{let L=Q.location==="project"?V6.join(K$(),".blade","agents"):V6.join(UQ.homedir(),".blade","agents");await q3.promises.mkdir(L,{recursive:!0});let R=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){R.push("tools:");for(let I of Q.tools)R.push(` - ${I}`)}if(Q.color)R.push(`color: ${Q.color}`);R.push("---");let k=[R.join(`
|
|
122
122
|
`),"",`# ${Q.name} Subagent`,"",Q.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
|
|
123
|
-
`),T=V6.join(L,`${Q.name}.md`);await q3.promises.writeFile(T,k,"utf-8"),$()}catch(L){console.error("保存配置失败:",L)}}),A=s0(!1,J);if(N0((L,R)=>{if(R.escape)B();else if(R.ctrl&&L==="c"||R.meta&&L==="c")A()},{isActive:X!=="tools"}),X==="mode")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(y4,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(L)=>{if(L.value==="ai")H("ai"),Z("aiPrompt");else H("manual"),Z("name")}},void 0,!1,void 0,this),h(b0,{marginTop:1,children:h(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="aiPrompt")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"描述: "},void 0,!1,void 0,this),h(O8,{value:U,onChange:z,onSubmit:(L)=>{if(!L.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="aiGenerating"){if(q)return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{color:"red",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"yellow",children:[h(_Q,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:['根据你的描述:"',U,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(X==="name"){let L=_==="edit";return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:["Step 1/7: ",L?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:L?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"名称: "},void 0,!1,void 0,this),L?h(H0,{children:Q.name},void 0,!1,void 0,this):h(O8,{value:Q.name,onChange:(R)=>G({...Q,name:R}),onSubmit:(R)=>{if(WQ(R))return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:L?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L&&h(O8,{value:"",onChange:()=>{},onSubmit:w,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(X==="description")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"描述: "},void 0,!1,void 0,this),h(O8,{value:Q.description,onChange:(L)=>G({...Q,description:L}),onSubmit:(L)=>{if(!L.trim())return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="tools")return h(HQ,{config:Q,setConfig:G,onNext:w,onPrev:B},void 0,!1,void 0,this);if(X==="color")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(y4,{items:NQ,onSelect:(L)=>{let R=L.value==="none"?void 0:L.value;G({...Q,color:R}),w()}},void 0,!1,void 0,this),h(b0,{marginTop:1,children:h(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="location")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(y4,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(L)=>{G({...Q,location:L.value}),w()}},void 0,!1,void 0,this),h(b0,{marginTop:1,children:h(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="systemPrompt")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),h(O8,{value:Q.systemPrompt,onChange:(L)=>G({...Q,systemPrompt:L}),onSubmit:()=>w()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="confirm")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[h(H0,{children:[h(H0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),h(y4,{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 HQ({config:$,setConfig:J,onNext:Y,onPrev:X}){let{isFocused:Z}=zQ({id:"step-tools"});N0((G,U)=>{if(U.escape)X()},{isActive:Z});let Q=(G)=>{if(G.includes("all"))J({...$,tools:["all"]});else J({...$,tools:G});Y()};return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(KQ,{options:OQ,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import FQ from"node:fs";import{useMemoizedFn as K2}from"ahooks";import{Box as o0,Text as e0}from"ink";import j6 from"ink-select-input";import{useEffect as LQ,useMemo as O3,useState as I4}from"react";import{jsxDEV as _0}from"react/jsx-dev-runtime";var E6=10;function N3({workspaceRoot:$,initialMode:J="menu",onComplete:Y,onCancel:X}){let Z=H4($),[Q,G]=I4(J),[U,z]=I4(null),[K,O]=I4(0),[q,N]=I4(0),_=K2(()=>{Z.clear(),Z.loadFromStandardLocations(),O((T)=>T+1)}),H=O3(()=>{return Z.getAllSubagents()},[K]),W=Math.ceil(H.length/E6)||1,b=O3(()=>{let T=q*E6;return H.slice(T,T+E6)},[H,q]);LQ(()=>{let T=Math.max(0,W-1);if(q>T)N(T)},[W,q]);let M=K2(()=>{if(q<W-1)N((T)=>T+1)}),w=K2(()=>{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=K2((T)=>{if(T.value==="cancel"){X?.();return}G(T.value)}),F=K2((T)=>{if(z(T.value),Q==="edit")G("editWizard");else if(Q==="delete")G("deleteConfirm")}),A=K2(async()=>{if(!U?.configPath)return;try{await FQ.promises.unlink(U.configPath),_(),L()}catch(T){console.error("删除失败:",T)}}),L=K2(()=>{G("menu"),z(null)}),R=s0(!1,X);if(N0((T,I)=>{if(I.escape){if(Q==="menu")X?.();else if(Q==="list"||Q==="edit"||Q==="delete")N(0),L();else if(Q==="deleteConfirm")L()}else if(I.ctrl&&T==="c"||I.meta&&T==="c")R();else if(Q==="list"){if(I.leftArrow||T==="h")w();else if(I.rightArrow||T==="l")M()}},{isActive:Q!=="create"&&Q!=="editWizard"}),Q==="menu")return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j6,{items:B,onSelect:C},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0(e0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="list"){if(H.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0(e0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:[_0(e0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),_0(e0,{color:"gray",children:[" (共 ",H.length," 个)"]},void 0,!0,void 0,this),W>1&&_0(e0,{color:"yellow",children:[" ","第 ",q+1,"/",W," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b.map((T)=>_0(o0,{flexDirection:"column",paddingLeft:2,children:[_0(o0,{children:_0(e0,{children:[_0(e0,{bold:!0,color:T.color||"white",children:["• ",T.name]},void 0,!0,void 0,this),_0(e0,{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(e0,{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(e0,{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:W>1?_0(e0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let k=(T)=>{if(H.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0(e0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let I=H.map((P)=>({key:P.name,label:`${P.name} - ${P.description}`,value:P}));return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j6,{items:I,onSelect:F},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0(e0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(Q==="create")return _0(N8,{onComplete:()=>{_(),L()},onCancel:L},void 0,!1,void 0,this);if(Q==="edit")return k("编辑 Agent");if(Q==="editWizard"&&U){let T={name:U.name,description:U.description,tools:U.tools||[],color:U.color,location:U.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:U.systemPrompt||""};return _0(N8,{initialConfig:T,onComplete:()=>{_(),L()},onCancel:L},void 0,!1,void 0,this)}if(Q==="delete")return k("删除 Agent");if(Q==="deleteConfirm"&&U)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{children:["你确定要删除 Agent"," ",_0(e0,{bold:!0,color:"yellow",children:U.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:["文件路径: ",U.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j6,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(T)=>{if(T.value==="confirm")A();else L()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as x2,Text as M0}from"ink";import PQ,{useEffect as AQ,useState as bQ}from"react";import{useEffect as BQ,useState as W3}from"react";function L3($=K$(),J=5000){let[Y,X]=W3(null),[Z,Q]=W3(!0);return BQ(()=>{let G=!0,U=async()=>{try{let K=await H3($);if(!G)return;if(!K){X(null),Q(!1);return}let O=await F3($);if(!G)return;X(O)}catch{if(G)X(null)}finally{if(G)Q(!1)}};U();let z=null;if(J>0)z=setInterval(U,J);return()=>{if(G=!1,z)clearInterval(z)}},[$,J]),{branch:Y,loading:Z}}function z2($){let J=Math.max(0,Math.ceil($/1000)),Y=Math.floor(J/60),X=J%60;return Y>0?`${Y}m ${X}s`:`${X}s`}function wQ($,J=Date.now()){let Y=$.snapshot?.nextActionAt;return Y===void 0?void 0:Math.max(0,Y-J)}function S4($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let X=wQ($,J),Z=X===void 0?void 0:z2(X);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} · 已等待 ${z2(Q.waitMs)}`:"等待可用请求容量",compact:Q?`Provider 排队 · ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)}`:"Provider 排队"}}case"retry_wait":{let Q=Y.retry,G=Y.reason==="rate_limit"?`Provider 请求受限${Z?`,${Z} 后重试`:""}`:`Provider 暂时不可用${Z?`,${Z} 后重试`:""}`,U=Q?[`尝试 ${Q.attempt}/${Q.maxRetries}`,Q.recoveryRemainingMs!==void 0?`剩余预算 ${z2(Q.recoveryRemainingMs)}`:void 0].filter((z)=>z!==void 0):[];return{primary:G,secondary:U.join(" · "),compact:`${Y.reason==="rate_limit"?"Provider 限流":"Provider 恢复"}${Z?` · ${Z}`:""}${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 故障已隔离"},等待恢复探测${Z?`(${Z})`:""}`,secondary:Y.circuit?.recoveryRemainingMs!==void 0?`剩余预算 ${z2(Y.circuit.recoveryRemainingMs)}`:"",compact:`Provider ${Y.reason==="rate_limit"?"限流":"熔断"}${Z?` · ${Z}`:""}`};case"circuit_probe":return{primary:"Provider 正在执行恢复探测",secondary:"",compact:"Provider 恢复探测"};case"stream_stall":{let Q=Y.stall;return{primary:Q?.outputStarted?"Provider 流暂时停滞":"Provider 尚未返回流数据",secondary:Q?`已等待 ${z2(Q.durationMs)} · 超时上限 ${z2(Q.timeoutMs)}`:"",compact:Q?`Provider 等待 · ${z2(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 G0,Fragment as h$}from"react/jsx-dev-runtime";var w3=PQ.memo(()=>{let $=h8(),J=f2(),X=V8()==="shortcuts",Z=G9(),Q=q1(),{branch:G}=L3(Q),U=g8(),z=sJ(),K=aJ(),O=x8(),q=c8(),N=u8(),_=d8(),H=l8(),W=iJ(),b=oJ(),M=v8(),w=p8(),B=H9(),C=Q9(),F=j8(),A=D2(),[L,R]=bQ(null),k=S4(M);AQ(()=>{let u=!1;new h6(Q,A).get().then((J0)=>{if(!u)R(J0)}).catch(()=>{if(!u)R(null)});let z0=h6.subscribe((J0)=>{if(!u&&J0.sessionId===A&&J0.workspaceRoot===Q)R(J0.goal)});return()=>{u=!0,z0()}},[A,Q]);let T=U?w4(U):!1,P=(()=>{if(J==="default")return null;if(J==="autoEdit")return G0(M0,{color:"magenta",children:[">> ","auto edit on ",G0(M0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return G0(M0,{color:"cyan",children:["‖ plan mode on ",G0(M0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return G0(M0,{color:"red",children:["yolo mode on ",G0(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 G0(x2,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[X?G0(x2,{flexDirection:"column",gap:0,children:o.map((u,Z0)=>G0(x2,{flexDirection:"row",children:[u.map((z0,J0)=>{let[f,E]=z0.split(":");return G0(x2,{flexDirection:"row",width:20,children:[G0(M0,{color:"yellow",children:f},void 0,!1,void 0,this),G0(M0,{color:"gray",children:":"},void 0,!1,void 0,this),G0(M0,{color:"white",children:E},void 0,!1,void 0,this)]},J0,!0,void 0,this)}),Z0===o.length-1&&G0(M0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},Z0,!0,void 0,this))},void 0,!1,void 0,this):G0(x2,{flexDirection:"row",gap:1,children:[G&&G0(h$,{children:[G0(M0,{color:"gray",children:[" ",G]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P,j&&G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),L&&G0(h$,{children:[G0(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}`:""]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(x2,{flexDirection:"row",gap:1,children:!$?G0(M0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):G0(h$,{children:[T&&G0(h$,{children:[O?G0(M0,{color:"cyan",children:["Effort ",q]},void 0,!0,void 0,this):G0(M0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N!=="auto"&&G0(h$,{children:[G0(M0,{color:N==="fast"?"yellow":"gray",children:["Speed ",N]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&G0(h$,{children:[G0(M0,{color:"gray",children:["Output ",_]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H!=="auto"&&G0(h$,{children:[G0(M0,{color:"gray",children:["Style ",H]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&G0(M0,{color:"gray",children:U.model},void 0,!1,void 0,this),k&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"yellow",children:k.compact},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),K?G0(M0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):G0(M0,{color:z<20?"red":z<50?"yellow":"gray",children:[z,"%"]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:b===void 0?"gray":"cyan",children:["Cache ",B3(b)]},void 0,!0,void 0,this),W>0.001&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"green",children:["$",W<0.01?W.toFixed(4):W.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),(w?.pending??0)>0&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"yellow",children:["Queued ",w?.pending??0," · /queue"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B>0&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"cyan",children:["已恢复 ",B," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.length>0&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"cyan",children:["New tasks ",F.length," · /resume"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C==="error"&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"yellow",children:"Task sync unavailable"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(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 g6,Text as m6}from"ink";import MQ from"react";import{jsxDEV as c2}from"react/jsx-dev-runtime";var P3=MQ.memo(({suggestions:$,selectedIndex:J,visible:Y,maxDisplay:X=8})=>{if(!Y||$.length===0)return null;let Z=0,Q=Math.min(X,$.length),G=J>=$.length;if(J>=X&&!G)Z=J-X+1,Q=J+1;let U=$.slice(Z,Q),z=$.length>X;return c2(g6,{flexDirection:"column",paddingX:2,paddingY:0,children:[U.map((K,O)=>{let N=Z+O===J;return c2(g6,{flexDirection:"row",paddingX:1,gap:2,children:[c2(m6,{color:N?"cyan":"white",bold:N,children:K.command},void 0,!1,void 0,this),c2(m6,{color:N?"cyan":"gray",dimColor:!N,children:["- ",K.description]},void 0,!0,void 0,this)]},K.command,!0,void 0,this)}),z&&c2(g6,{paddingX:1,children:c2(m6,{color:G?"cyan":"gray",bold:G,dimColor:!G,children:["... and ",$.length-X," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as o$,Text as O1,useStdout as bG}from"ink";import MG from"ink-select-input";import KJ,{useMemo as e3}from"react";import{Box as I0,Text as u0}from"ink";import _2,{useEffect as GJ,useMemo as q2,useRef as n3}from"react";import{Box as n6,Text as v3}from"ink";import hQ from"react";import{Text as Z1}from"ink";import VQ from"react";import S3 from"string-width";import W8 from"string-width";function p6({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 TQ=p6();function x6($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(TQ,"")}var A3=($=0)=>(J)=>`\x1B[${J+$}m`,b3=($=0)=>(J)=>`\x1B[${38+$};5;${J}m`,M3=($=0)=>(J,Y,X)=>`\x1B[${38+$};2;${J};${Y};${X}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]}},NN=Object.keys(Q$.modifier),RQ=Object.keys(Q$.color),CQ=Object.keys(Q$.bgColor),WN=[...RQ,...CQ];function yQ(){let $=new Map;for(let[J,Y]of Object.entries(Q$)){for(let[X,Z]of Object.entries(Y))Q$[X]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[X]=Q$[X],$.set(Z[0],Z[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=A3(),Q$.color.ansi256=b3(),Q$.color.ansi16m=M3(),Q$.bgColor.ansi=A3(10),Q$.bgColor.ansi256=b3(10),Q$.bgColor.ansi16m=M3(10),Object.defineProperties(Q$,{rgbToAnsi256:{value(J,Y,X){if(J===Y&&Y===X){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(X/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[X]=Y;if(X.length===3)X=[...X].map((Q)=>Q+Q).join("");let Z=Number.parseInt(X,16);return[Z>>16&255,Z>>8&255,Z&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,X,Z;if(J>=232)Y=((J-232)*10+8)/255,X=Y,Z=Y;else{J-=16;let U=J%36;Y=Math.floor(J/36)/5,X=Math.floor(U/6)/5,Z=U%6/5}let Q=Math.max(Y,X,Z)*2;if(Q===0)return 30;let G=30+(Math.round(Z)<<2|Math.round(X)<<1|Math.round(Y));if(Q===2)G+=60;return G},enumerable:!1},rgbToAnsi:{value:(J,Y,X)=>Q$.ansi256ToAnsi(Q$.rgbToAnsi256(J,Y,X)),enumerable:!1},hexToAnsi:{value:(J)=>Q$.ansi256ToAnsi(Q$.hexToAnsi256(J)),enumerable:!1}}),Q$}var IQ=yQ(),T3=IQ;var D4=new Set(["\x1B",""]),SQ=39,u6="\x07",y3="[",kQ="]",I3="m",k4=`${kQ}8;;`,R3=($)=>`${D4.values().next().value}${y3}${$}${I3}`,C3=($)=>`${D4.values().next().value}${k4}${$}${u6}`,DQ=($)=>$.split(" ").map((J)=>W8(J)),c6=($,J,Y)=>{let X=[...J],Z=!1,Q=!1,G=W8(x6($.at(-1)));for(let[U,z]of X.entries()){let K=W8(z);if(G+K<=Y)$[$.length-1]+=z;else $.push(z),G=0;if(D4.has(z))Z=!0,Q=X.slice(U+1,U+1+k4.length).join("")===k4;if(Z){if(Q){if(z===u6)Z=!1,Q=!1}else if(z===I3)Z=!1;continue}if(G+=K,G===Y&&U<X.length-1)$.push(""),G=0}if(!G&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},fQ=($)=>{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("")},vQ=($,J,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let X="",Z,Q,G=DQ($),U=[""];for(let[q,N]of $.split(" ").entries()){if(Y.trim!==!1)U[U.length-1]=U.at(-1).trimStart();let _=W8(U.at(-1));if(q!==0){if(_>=J&&(Y.wordWrap===!1||Y.trim===!1))U.push(""),_=0;if(_>0||Y.trim===!1)U[U.length-1]+=" ",_++}if(Y.hard&&G[q]>J){let H=J-_,W=1+Math.floor((G[q]-H-1)/J);if(Math.floor((G[q]-1)/J)<W)U.push("");c6(U,N,J);continue}if(_+G[q]>J&&_>0&&G[q]>0){if(Y.wordWrap===!1&&_<J){c6(U,N,J);continue}U.push("")}if(_+G[q]>J&&Y.wordWrap===!1){c6(U,N,J);continue}U[U.length-1]+=N}if(Y.trim!==!1)U=U.map((q)=>fQ(q));let z=U.join(`
|
|
124
|
-
`),K=[...z],O=0;for(let[q,N]of K.entries()){if(X+=N,D4.has(N)){let{groups:H}=new RegExp(`(?:\\${y3}(?<code>\\d+)m|\\${k4}(?<uri>.*)${u6})`).exec(z.slice(O))||{groups:{}};if(H.code!==void 0){let W=Number.parseFloat(H.code);Z=W===
|
|
123
|
+
`),T=V6.join(L,`${Q.name}.md`);await q3.promises.writeFile(T,k,"utf-8"),$()}catch(L){console.error("保存配置失败:",L)}}),A=s0(!1,J);if(N0((L,R)=>{if(R.escape)B();else if(R.ctrl&&L==="c"||R.meta&&L==="c")A()},{isActive:X!=="tools"}),X==="mode")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(y4,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(L)=>{if(L.value==="ai")H("ai"),Z("aiPrompt");else H("manual"),Z("name")}},void 0,!1,void 0,this),h(b0,{marginTop:1,children:h(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="aiPrompt")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"描述: "},void 0,!1,void 0,this),h(O8,{value:U,onChange:z,onSubmit:(L)=>{if(!L.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="aiGenerating"){if(q)return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{color:"red",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"yellow",children:[h(_Q,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:['根据你的描述:"',U,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(X==="name"){let L=_==="edit";return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:["Step 1/7: ",L?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:L?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"名称: "},void 0,!1,void 0,this),L?h(H0,{children:Q.name},void 0,!1,void 0,this):h(O8,{value:Q.name,onChange:(R)=>G({...Q,name:R}),onSubmit:(R)=>{if(WQ(R))return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:L?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L&&h(O8,{value:"",onChange:()=>{},onSubmit:w,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(X==="description")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"描述: "},void 0,!1,void 0,this),h(O8,{value:Q.description,onChange:(L)=>G({...Q,description:L}),onSubmit:(L)=>{if(!L.trim())return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="tools")return h(HQ,{config:Q,setConfig:G,onNext:w,onPrev:B},void 0,!1,void 0,this);if(X==="color")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(y4,{items:NQ,onSelect:(L)=>{let R=L.value==="none"?void 0:L.value;G({...Q,color:R}),w()}},void 0,!1,void 0,this),h(b0,{marginTop:1,children:h(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="location")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(y4,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(L)=>{G({...Q,location:L.value}),w()}},void 0,!1,void 0,this),h(b0,{marginTop:1,children:h(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="systemPrompt")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),h(O8,{value:Q.systemPrompt,onChange:(L)=>G({...Q,systemPrompt:L}),onSubmit:()=>w()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="confirm")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[h(H0,{children:[h(H0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),h(y4,{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 HQ({config:$,setConfig:J,onNext:Y,onPrev:X}){let{isFocused:Z}=zQ({id:"step-tools"});N0((G,U)=>{if(U.escape)X()},{isActive:Z});let Q=(G)=>{if(G.includes("all"))J({...$,tools:["all"]});else J({...$,tools:G});Y()};return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(KQ,{options:OQ,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import FQ from"node:fs";import{useMemoizedFn as K2}from"ahooks";import{Box as o0,Text as e0}from"ink";import j6 from"ink-select-input";import{useEffect as LQ,useMemo as O3,useState as I4}from"react";import{jsxDEV as _0}from"react/jsx-dev-runtime";var E6=10;function N3({workspaceRoot:$,initialMode:J="menu",onComplete:Y,onCancel:X}){let Z=H4($),[Q,G]=I4(J),[U,z]=I4(null),[K,O]=I4(0),[q,N]=I4(0),_=K2(()=>{Z.clear(),Z.loadFromStandardLocations(),O((T)=>T+1)}),H=O3(()=>{return Z.getAllSubagents()},[K]),W=Math.ceil(H.length/E6)||1,b=O3(()=>{let T=q*E6;return H.slice(T,T+E6)},[H,q]);LQ(()=>{let T=Math.max(0,W-1);if(q>T)N(T)},[W,q]);let M=K2(()=>{if(q<W-1)N((T)=>T+1)}),w=K2(()=>{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=K2((T)=>{if(T.value==="cancel"){X?.();return}G(T.value)}),F=K2((T)=>{if(z(T.value),Q==="edit")G("editWizard");else if(Q==="delete")G("deleteConfirm")}),A=K2(async()=>{if(!U?.configPath)return;try{await FQ.promises.unlink(U.configPath),_(),L()}catch(T){console.error("删除失败:",T)}}),L=K2(()=>{G("menu"),z(null)}),R=s0(!1,X);if(N0((T,I)=>{if(I.escape){if(Q==="menu")X?.();else if(Q==="list"||Q==="edit"||Q==="delete")N(0),L();else if(Q==="deleteConfirm")L()}else if(I.ctrl&&T==="c"||I.meta&&T==="c")R();else if(Q==="list"){if(I.leftArrow||T==="h")w();else if(I.rightArrow||T==="l")M()}},{isActive:Q!=="create"&&Q!=="editWizard"}),Q==="menu")return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j6,{items:B,onSelect:C},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0(e0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="list"){if(H.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0(e0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:[_0(e0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),_0(e0,{color:"gray",children:[" (共 ",H.length," 个)"]},void 0,!0,void 0,this),W>1&&_0(e0,{color:"yellow",children:[" ","第 ",q+1,"/",W," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b.map((T)=>_0(o0,{flexDirection:"column",paddingLeft:2,children:[_0(o0,{children:_0(e0,{children:[_0(e0,{bold:!0,color:T.color||"white",children:["• ",T.name]},void 0,!0,void 0,this),_0(e0,{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(e0,{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(e0,{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:W>1?_0(e0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let k=(T)=>{if(H.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0(e0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let I=H.map((P)=>({key:P.name,label:`${P.name} - ${P.description}`,value:P}));return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j6,{items:I,onSelect:F},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0(e0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(Q==="create")return _0(N8,{onComplete:()=>{_(),L()},onCancel:L},void 0,!1,void 0,this);if(Q==="edit")return k("编辑 Agent");if(Q==="editWizard"&&U){let T={name:U.name,description:U.description,tools:U.tools||[],color:U.color,location:U.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:U.systemPrompt||""};return _0(N8,{initialConfig:T,onComplete:()=>{_(),L()},onCancel:L},void 0,!1,void 0,this)}if(Q==="delete")return k("删除 Agent");if(Q==="deleteConfirm"&&U)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{children:["你确定要删除 Agent"," ",_0(e0,{bold:!0,color:"yellow",children:U.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:["文件路径: ",U.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j6,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(T)=>{if(T.value==="confirm")A();else L()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as x2,Text as M0}from"ink";import PQ,{useEffect as AQ,useState as bQ}from"react";import{useEffect as BQ,useState as W3}from"react";function L3($=K$(),J=5000){let[Y,X]=W3(null),[Z,Q]=W3(!0);return BQ(()=>{let G=!0,U=async()=>{try{let K=await H3($);if(!G)return;if(!K){X(null),Q(!1);return}let O=await F3($);if(!G)return;X(O)}catch{if(G)X(null)}finally{if(G)Q(!1)}};U();let z=null;if(J>0)z=setInterval(U,J);return()=>{if(G=!1,z)clearInterval(z)}},[$,J]),{branch:Y,loading:Z}}function z2($){let J=Math.max(0,Math.ceil($/1000)),Y=Math.floor(J/60),X=J%60;return Y>0?`${Y}m ${X}s`:`${X}s`}function wQ($,J=Date.now()){let Y=$.snapshot?.nextActionAt;return Y===void 0?void 0:Math.max(0,Y-J)}function S4($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let X=wQ($,J),Z=X===void 0?void 0:z2(X);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} · 已等待 ${z2(Q.waitMs)}`:"等待可用请求容量",compact:Q?`Provider 排队 · ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)}`:"Provider 排队"}}case"retry_wait":{let Q=Y.retry,G=Y.reason==="rate_limit"?`Provider 请求受限${Z?`,${Z} 后重试`:""}`:`Provider 暂时不可用${Z?`,${Z} 后重试`:""}`,U=Q?[`尝试 ${Q.attempt}/${Q.maxRetries}`,Q.recoveryRemainingMs!==void 0?`剩余预算 ${z2(Q.recoveryRemainingMs)}`:void 0].filter((z)=>z!==void 0):[];return{primary:G,secondary:U.join(" · "),compact:`${Y.reason==="rate_limit"?"Provider 限流":"Provider 恢复"}${Z?` · ${Z}`:""}${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 故障已隔离"},等待恢复探测${Z?`(${Z})`:""}`,secondary:Y.circuit?.recoveryRemainingMs!==void 0?`剩余预算 ${z2(Y.circuit.recoveryRemainingMs)}`:"",compact:`Provider ${Y.reason==="rate_limit"?"限流":"熔断"}${Z?` · ${Z}`:""}`};case"circuit_probe":return{primary:"Provider 正在执行恢复探测",secondary:"",compact:"Provider 恢复探测"};case"stream_stall":{let Q=Y.stall;return{primary:Q?.outputStarted?"Provider 流暂时停滞":"Provider 尚未返回流数据",secondary:Q?`已等待 ${z2(Q.durationMs)} · 超时上限 ${z2(Q.timeoutMs)}`:"",compact:Q?`Provider 等待 · ${z2(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 G0,Fragment as h$}from"react/jsx-dev-runtime";function MQ($){return $?`exec-host:${$.category}:${$.consecutiveCount}`:""}var w3=PQ.memo(()=>{let $=h8(),J=f2(),X=V8()==="shortcuts",Z=G9(),Q=q1(),{branch:G}=L3(Q),U=g8(),z=sJ(),K=aJ(),O=x8(),q=c8(),N=u8(),_=d8(),H=l8(),W=iJ(),b=oJ(),M=v8(),w=p8(),B=H9(),C=Q9(),F=j8(),A=D2(),[L,R]=bQ(null),k=S4(M);AQ(()=>{let u=!1;new h6(Q,A).get().then((J0)=>{if(!u)R(J0)}).catch(()=>{if(!u)R(null)});let z0=h6.subscribe((J0)=>{if(!u&&J0.sessionId===A&&J0.workspaceRoot===Q)R(J0.goal)});return()=>{u=!0,z0()}},[A,Q]);let T=U?w4(U):!1,P=(()=>{if(J==="default")return null;if(J==="autoEdit")return G0(M0,{color:"magenta",children:[">> ","auto edit on ",G0(M0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return G0(M0,{color:"cyan",children:["‖ plan mode on ",G0(M0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return G0(M0,{color:"red",children:["yolo mode on ",G0(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 G0(x2,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[X?G0(x2,{flexDirection:"column",gap:0,children:o.map((u,Z0)=>G0(x2,{flexDirection:"row",children:[u.map((z0,J0)=>{let[f,E]=z0.split(":");return G0(x2,{flexDirection:"row",width:20,children:[G0(M0,{color:"yellow",children:f},void 0,!1,void 0,this),G0(M0,{color:"gray",children:":"},void 0,!1,void 0,this),G0(M0,{color:"white",children:E},void 0,!1,void 0,this)]},J0,!0,void 0,this)}),Z0===o.length-1&&G0(M0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},Z0,!0,void 0,this))},void 0,!1,void 0,this):G0(x2,{flexDirection:"row",gap:1,children:[G&&G0(h$,{children:[G0(M0,{color:"gray",children:[" ",G]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P,j&&G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),L&&G0(h$,{children:[G0(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?` ${MQ(L.executionHostFailure)}`:""]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(x2,{flexDirection:"row",gap:1,children:!$?G0(M0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):G0(h$,{children:[T&&G0(h$,{children:[O?G0(M0,{color:"cyan",children:["Effort ",q]},void 0,!0,void 0,this):G0(M0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N!=="auto"&&G0(h$,{children:[G0(M0,{color:N==="fast"?"yellow":"gray",children:["Speed ",N]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&G0(h$,{children:[G0(M0,{color:"gray",children:["Output ",_]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H!=="auto"&&G0(h$,{children:[G0(M0,{color:"gray",children:["Style ",H]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&G0(M0,{color:"gray",children:U.model},void 0,!1,void 0,this),k&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"yellow",children:k.compact},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),K?G0(M0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):G0(M0,{color:z<20?"red":z<50?"yellow":"gray",children:[z,"%"]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:b===void 0?"gray":"cyan",children:["Cache ",B3(b)]},void 0,!0,void 0,this),W>0.001&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"green",children:["$",W<0.01?W.toFixed(4):W.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),(w?.pending??0)>0&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"yellow",children:["Queued ",w?.pending??0," · /queue"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B>0&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"cyan",children:["已恢复 ",B," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.length>0&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"cyan",children:["New tasks ",F.length," · /resume"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C==="error"&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"yellow",children:"Task sync unavailable"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(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 g6,Text as m6}from"ink";import TQ from"react";import{jsxDEV as c2}from"react/jsx-dev-runtime";var P3=TQ.memo(({suggestions:$,selectedIndex:J,visible:Y,maxDisplay:X=8})=>{if(!Y||$.length===0)return null;let Z=0,Q=Math.min(X,$.length),G=J>=$.length;if(J>=X&&!G)Z=J-X+1,Q=J+1;let U=$.slice(Z,Q),z=$.length>X;return c2(g6,{flexDirection:"column",paddingX:2,paddingY:0,children:[U.map((K,O)=>{let N=Z+O===J;return c2(g6,{flexDirection:"row",paddingX:1,gap:2,children:[c2(m6,{color:N?"cyan":"white",bold:N,children:K.command},void 0,!1,void 0,this),c2(m6,{color:N?"cyan":"gray",dimColor:!N,children:["- ",K.description]},void 0,!0,void 0,this)]},K.command,!0,void 0,this)}),z&&c2(g6,{paddingX:1,children:c2(m6,{color:G?"cyan":"gray",bold:G,dimColor:!G,children:["... and ",$.length-X," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as o$,Text as O1,useStdout as MG}from"ink";import TG from"ink-select-input";import KJ,{useMemo as e3}from"react";import{Box as I0,Text as u0}from"ink";import _2,{useEffect as GJ,useMemo as q2,useRef as n3}from"react";import{Box as n6,Text as v3}from"ink";import gQ from"react";import{Text as Z1}from"ink";import jQ from"react";import S3 from"string-width";import W8 from"string-width";function p6({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 RQ=p6();function x6($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(RQ,"")}var A3=($=0)=>(J)=>`\x1B[${J+$}m`,b3=($=0)=>(J)=>`\x1B[${38+$};5;${J}m`,M3=($=0)=>(J,Y,X)=>`\x1B[${38+$};2;${J};${Y};${X}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),CQ=Object.keys(Q$.color),yQ=Object.keys(Q$.bgColor),HN=[...CQ,...yQ];function IQ(){let $=new Map;for(let[J,Y]of Object.entries(Q$)){for(let[X,Z]of Object.entries(Y))Q$[X]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[X]=Q$[X],$.set(Z[0],Z[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=A3(),Q$.color.ansi256=b3(),Q$.color.ansi16m=M3(),Q$.bgColor.ansi=A3(10),Q$.bgColor.ansi256=b3(10),Q$.bgColor.ansi16m=M3(10),Object.defineProperties(Q$,{rgbToAnsi256:{value(J,Y,X){if(J===Y&&Y===X){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(X/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[X]=Y;if(X.length===3)X=[...X].map((Q)=>Q+Q).join("");let Z=Number.parseInt(X,16);return[Z>>16&255,Z>>8&255,Z&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,X,Z;if(J>=232)Y=((J-232)*10+8)/255,X=Y,Z=Y;else{J-=16;let U=J%36;Y=Math.floor(J/36)/5,X=Math.floor(U/6)/5,Z=U%6/5}let Q=Math.max(Y,X,Z)*2;if(Q===0)return 30;let G=30+(Math.round(Z)<<2|Math.round(X)<<1|Math.round(Y));if(Q===2)G+=60;return G},enumerable:!1},rgbToAnsi:{value:(J,Y,X)=>Q$.ansi256ToAnsi(Q$.rgbToAnsi256(J,Y,X)),enumerable:!1},hexToAnsi:{value:(J)=>Q$.ansi256ToAnsi(Q$.hexToAnsi256(J)),enumerable:!1}}),Q$}var SQ=IQ(),T3=SQ;var D4=new Set(["\x1B",""]),kQ=39,u6="\x07",y3="[",DQ="]",I3="m",k4=`${DQ}8;;`,R3=($)=>`${D4.values().next().value}${y3}${$}${I3}`,C3=($)=>`${D4.values().next().value}${k4}${$}${u6}`,fQ=($)=>$.split(" ").map((J)=>W8(J)),c6=($,J,Y)=>{let X=[...J],Z=!1,Q=!1,G=W8(x6($.at(-1)));for(let[U,z]of X.entries()){let K=W8(z);if(G+K<=Y)$[$.length-1]+=z;else $.push(z),G=0;if(D4.has(z))Z=!0,Q=X.slice(U+1,U+1+k4.length).join("")===k4;if(Z){if(Q){if(z===u6)Z=!1,Q=!1}else if(z===I3)Z=!1;continue}if(G+=K,G===Y&&U<X.length-1)$.push(""),G=0}if(!G&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},vQ=($)=>{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("")},VQ=($,J,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let X="",Z,Q,G=fQ($),U=[""];for(let[q,N]of $.split(" ").entries()){if(Y.trim!==!1)U[U.length-1]=U.at(-1).trimStart();let _=W8(U.at(-1));if(q!==0){if(_>=J&&(Y.wordWrap===!1||Y.trim===!1))U.push(""),_=0;if(_>0||Y.trim===!1)U[U.length-1]+=" ",_++}if(Y.hard&&G[q]>J){let H=J-_,W=1+Math.floor((G[q]-H-1)/J);if(Math.floor((G[q]-1)/J)<W)U.push("");c6(U,N,J);continue}if(_+G[q]>J&&_>0&&G[q]>0){if(Y.wordWrap===!1&&_<J){c6(U,N,J);continue}U.push("")}if(_+G[q]>J&&Y.wordWrap===!1){c6(U,N,J);continue}U[U.length-1]+=N}if(Y.trim!==!1)U=U.map((q)=>vQ(q));let z=U.join(`
|
|
124
|
+
`),K=[...z],O=0;for(let[q,N]of K.entries()){if(X+=N,D4.has(N)){let{groups:H}=new RegExp(`(?:\\${y3}(?<code>\\d+)m|\\${k4}(?<uri>.*)${u6})`).exec(z.slice(O))||{groups:{}};if(H.code!==void 0){let W=Number.parseFloat(H.code);Z=W===kQ?void 0:W}else if(H.uri!==void 0)Q=H.uri.length===0?void 0:H.uri}let _=T3.codes.get(Number(Z));if(K[q+1]===`
|
|
125
125
|
`){if(Q)X+=C3("");if(Z&&_)X+=R3(_)}else if(N===`
|
|
126
126
|
`){if(Z&&_)X+=R3(Z);if(Q)X+=C3(Q)}O+=N.length}return X};function d6($,J,Y){return String($).normalize().replaceAll(`\r
|
|
127
127
|
`,`
|
|
128
128
|
`).split(`
|
|
129
|
-
`).map((X)=>
|
|
129
|
+
`).map((X)=>VQ(X,J,Y)).join(`
|
|
130
130
|
`)}var H8=($)=>{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 S3(J)},k3=($,J,Y="...")=>{if(H8($)<=J)return $;if(J<=Y.length)return Y.substring(0,J);let Z=0,Q=$.length,G="";while(Z<=Q){let U=Math.floor((Z+Q)/2),z=$.substring(0,U);if(H8(z)<=J-Y.length)G=z,Z=U+1;else Q=U-1}return G+Y},D3=($)=>{return/[*_~`<[\]https?:]/.test($)},l6=($)=>{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((X)=>X.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((X)=>S3(X)))},u2=($,J,Y=!1)=>{if(J<=0)return[$];let X=$.trimEnd(),Q=d6(X,J,{hard:Y,trim:!1,wordWrap:!0}).split(`
|
|
131
|
-
`).filter((G)=>G.length>0);return Q.length>0?Q:[""]},f3=($,J,Y,X)=>{let Z=Math.max(0,Y-J);if(X==="center"){let Q=Math.floor(Z/2);return" ".repeat(Q)+$+" ".repeat(Z-Q)}if(X==="right")return" ".repeat(Z)+$;return $+" ".repeat(Z)};import{jsxDEV as i$,Fragment as
|
|
132
|
-
`);for(let W=0;W<H.length;W++){if(W>0)q.push(N),N=[];if(H[W])N.push({text:H[W],props:_.props})}}if(N.length>0)q.push(N);for(let _ of q)Y.push(_);return}let Q=J-Z;if(Q<1){
|
|
131
|
+
`).filter((G)=>G.length>0);return Q.length>0?Q:[""]},f3=($,J,Y,X)=>{let Z=Math.max(0,Y-J);if(X==="center"){let Q=Math.floor(Z/2);return" ".repeat(Q)+$+" ".repeat(Z-Q)}if(X==="right")return" ".repeat(Z)+$;return $+" ".repeat(Z)};import{jsxDEV as i$,Fragment as hQ}from"react/jsx-dev-runtime";var r6=2,a6=1,i6=2;function o6($,J){return`inline-${$}-${J}`}var EQ=({text:$})=>{let J=D0();if(!D3($))return i$(Z1,{children:$},void 0,!1,void 0,this);let Y=[],X=0,Z=0,Q=0,G=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,U;while((U=G.exec($))!==null){if(U.index>X){let q=$.slice(X,U.index);Y.push(i$(Z1,{children:q},o6("text",Z++),!1,void 0,this))}let z=U[0],K=null,O=o6("match",Q++);try{if(z.startsWith("**")&&z.endsWith("**")&&z.length>r6*2)K=i$(Z1,{bold:!0,children:z.slice(r6,-r6)},O,!1,void 0,this);else if(z.length>a6*2&&(z.startsWith("*")&&z.endsWith("*")||z.startsWith("_")&&z.endsWith("_"))){let q=$.substring(U.index-1,U.index),N=$.substring(G.lastIndex,G.lastIndex+1);if(!(/\w/.test(q)||/\w/.test(N)||/[./\\]/.test(q+N)))K=i$(Z1,{italic:!0,children:z.slice(a6,-a6)},O,!1,void 0,this)}else if(z.startsWith("~~")&&z.endsWith("~~")&&z.length>i6*2)K=i$(Z1,{strikethrough:!0,children:z.slice(i6,-i6)},O,!1,void 0,this);else if(z.startsWith("`")&&z.endsWith("`")){let q=z.match(/^(`+)([^`]+)\1$/);if(q&&q[2])K=i$(Z1,{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=i$(Z1,{children:[N,i$(Z1,{color:J.colors.info,children:[" (",_,")"]},void 0,!0,void 0,this)]},O,!0,void 0,this)}}else if(z.match(/^https?:\/\//))K=i$(Z1,{color:J.colors.info,children:z},O,!1,void 0,this)}catch(q){console.error("InlineRenderer 解析错误:",z,q),K=null}Y.push(K??i$(Z1,{children:z},O,!1,void 0,this)),X=G.lastIndex}if(X<$.length){let z=$.slice(X);Y.push(i$(Z1,{children:z},o6("text",Z++),!1,void 0,this))}return i$(hQ,{children:Y.filter((z)=>z!==null)},void 0,!1,void 0,this)},X1=jQ.memo(EQ);import{jsxDEV as d2}from"react/jsx-dev-runtime";var mQ="▎",V3=gQ.memo(({lines:$,level:J})=>{let Y=D0(),X=mQ.repeat(J);return d2(n6,{flexDirection:"column",children:$.map((Z,Q)=>{if(Z.trim()==="")return d2(n6,{height:1},Q,!1,void 0,this);return d2(n6,{flexDirection:"row",children:[d2(v3,{dimColor:!0,color:Y.colors.text.muted,children:[X," "]},void 0,!0,void 0,this),d2(v3,{italic:!0,wrap:"wrap",children:d2(X1,{text:Z},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 R1}from"ink";import{isPlainObject as $J}from"lodash-es";import{common as oQ,createLowlight as nQ}from"lowlight";import{LRUCache as tQ}from"lru-cache";import x3 from"react";import{Box as f4,Text as F8}from"ink";import T1,{Fragment as m3}from"react";import{LRUCache as g3}from"lru-cache";import pQ from"string-width";var xQ=1024,cQ=1048576,j3=1000,E3=new g3({max:xQ,maxSize:cQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+$.length*8)});function t6($){let J=!0;for(let X=0;X<$.length;X++)if($.charCodeAt(X)>127){J=!1;break}if(J)return $.split("");if($.length<=j3){let X=E3.get($);if(X)return X}let Y=Array.from($);if($.length<=j3)E3.set($,Y);return Y}var uQ=2048,dQ=524288,lQ=4096,h3=new g3({max:uQ,maxSize:dQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+8)});function M1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let J=h3.get($);if(J!==void 0)return J;let Y=pQ($);if($.length<=lQ)h3.set($,Y);return Y}import{jsxDEV as l2}from"react/jsx-dev-runtime";var s6=2,p3=T1.memo(({children:$,maxWidth:J,maxHeight:Y,overflowDirection:X="top",additionalHiddenLinesCount:Z=0})=>{let Q=D0(),G=[],U=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),s6);function z(W){if(!T1.isValidElement(W))return;if(W.type===m3){T1.Children.forEach(W.props.children,z);return}if(W.type===f4){aQ(W,J,G);return}}T1.Children.forEach($,z);let O=G.length>U||Z>0?U-1:U,q=O!==void 0?Math.max(0,G.length-O):0,N=q+Z,H=(q>0?X==="top"?G.slice(q):G.slice(0,O):G).map((W,b)=>l2(f4,{children:W.length>0?W.map((M,w)=>l2(F8,{...M.props,children:M.text},w,!1,void 0,this)):l2(F8,{children:" "},void 0,!1,void 0,this)},b,!1,void 0,this));return l2(f4,{flexDirection:"column",width:J,flexShrink:0,children:[N>0&&X==="top"&&l2(F8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),H,N>0&&X==="bottom"&&l2(F8,{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 rQ($){if(!T1.isValidElement($)||$.type!==f4)return{noWrapSegments:[],segments:[]};let J={noWrapSegments:[],segments:[]},Y=!1;function X(Z,Q){if(Z===null||Z===void 0)return;if(typeof Z==="string"||typeof Z==="number"){let K=String(Z);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(!T1.isValidElement(Z))return;if(Z.type===m3){T1.Children.forEach(Z.props.children,(K)=>X(K,Q));return}if(Z.type!==F8)return;let{children:G,...U}=Z.props,z=Q===void 0?U:{...Q,...U};T1.Children.forEach(G,(K)=>X(K,z))}return T1.Children.forEach($.props.children,(Z)=>X(Z,void 0)),J}function aQ($,J,Y){let X=rQ($);if(X.segments.length===0&&X.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let q of X.noWrapSegments)Z+=M1(q.text);if(X.segments.length===0){let q=[],N=[];for(let _ of X.noWrapSegments){let H=_.text.split(`
|
|
132
|
+
`);for(let W=0;W<H.length;W++){if(W>0)q.push(N),N=[];if(H[W])N.push({text:H[W],props:_.props})}}if(N.length>0)q.push(N);for(let _ of q)Y.push(_);return}let Q=J-Z;if(Q<1){iQ(X.noWrapSegments,J,Y);return}let G=[],U=[],z=0;function K(){if(G.length===0)G.push([...X.noWrapSegments,...U]);else if(Z>0)G.push([{text:" ".repeat(Z),props:{}},...U]);else G.push(U);U=[],z=0}function O(q,N){if(U.length>0&&U[U.length-1].props===N)U[U.length-1].text+=q;else U.push({text:q,props:N})}for(let q of X.segments){let N=q.text.split(`
|
|
133
133
|
`);for(let _=0;_<N.length;_++){if(_>0)K();let W=N[_].split(/(\s+)/);for(let b of W){if(!b)continue;let M=M1(b);if(z+M>Q&&z>0){if(K(),/^\s+$/.test(b))continue}if(M>Q){let B=t6(b);while(B.length>0){let C=0,F=0;for(let A of B){let L=M1(A);if(z+F+L>Q)break;F+=L,C++}if(C>0){let A=B.slice(0,C).join("");O(A,q.props),z+=M1(A),B=B.slice(C)}if(B.length>0)K()}}else O(b,q.props),z+=M}}if(q.text.endsWith(`
|
|
134
|
-
`))K()}if(U.length>0)K();for(let q of G)Y.push(q)}function
|
|
135
|
-
`);for(let z=0;z<U.length;z++){if(z>0)X.push(Z),Z=[],Q=0;let K=U[z];if(!K)continue;let O=M1(K),q=Math.max(0,J-M1("…"));if(O<=q&&Q===0)Z.push({text:K,props:G.props}),Q+=O;else{let N=t6(K),_=Q,H=0;for(let b of N){let M=M1(b);if(_+M>q)break;_+=M,H++}let W=N.slice(0,H).join("");if(W)Z.push({text:W,props:G.props});Z.push({text:"…",props:{}}),Q=_+M1("…")}}}if(Z.length>0)X.push(Z);if(X.length===0)X.push([{text:"…",props:{}}]);for(let G of X)Y.push(G)}import{jsxDEV as k$}from"react/jsx-dev-runtime";var e6=oQ
|
|
136
|
-
`),U=0;if(Z&&G.length>Z){let q=Math.max(Z,s6);if(G.length>q)U=G.length-q,G=G.slice(U)}let z=G.length+U,K=String(z).length+1,O=Math.max(20,X-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$(R1,{color:Q.colors.text.secondary,children:J},void 0,!1,void 0,this)},void 0,!1,void 0,this),U>0&&k$(v4,{marginBottom:0,children:k$(R1,{color:Q.colors.text.muted,dimColor:!0,children:["... ",U," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),k$(p3,{maxWidth:O,maxHeight:Z,children:G.map((q,N)=>{let _=N+U+1;return k$(v4,{flexDirection:"row",children:[Y&&k$(R1,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(_).padStart(K-1," ")," "]},void 0,!0,void 0,this),q.trim()===""?k$(R1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):
|
|
137
|
-
`),Y=[],X=0,Z=0;for(let Q of J){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let G=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(G)X=parseInt(G[1],10),Z=parseInt(G[3],10);Y.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Y.push({type:"remove",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith("+")){Y.push({type:"add",content:Q.substring(1),lineNumber:Z}),Z++;continue}if(Q.startsWith(" ")||Q===""){Y.push({type:"context",content:Q.substring(1),lineNumber:Z}),X++,Z++;continue}}return Y}var JJ=
|
|
134
|
+
`))K()}if(U.length>0)K();for(let q of G)Y.push(q)}function iQ($,J,Y){let X=[],Z=[],Q=0;for(let G of $){let U=G.text.split(`
|
|
135
|
+
`);for(let z=0;z<U.length;z++){if(z>0)X.push(Z),Z=[],Q=0;let K=U[z];if(!K)continue;let O=M1(K),q=Math.max(0,J-M1("…"));if(O<=q&&Q===0)Z.push({text:K,props:G.props}),Q+=O;else{let N=t6(K),_=Q,H=0;for(let b of N){let M=M1(b);if(_+M>q)break;_+=M,H++}let W=N.slice(0,H).join("");if(W)Z.push({text:W,props:G.props});Z.push({text:"…",props:{}}),Q=_+M1("…")}}}if(Z.length>0)X.push(Z);if(X.length===0)X.push([{text:"…",props:{}}]);for(let G of X)Y.push(G)}import{jsxDEV as k$}from"react/jsx-dev-runtime";var e6=nQ(oQ),sQ=200,eQ=524288,$G=4096,c3=new tQ({max:sQ,maxSize:eQ,sizeCalculation:($)=>$.retainedChars});function u3($,J){return`${J??"__auto__"}\x00${$}`}function JG($,J){return c3.get(u3($,J))?.root}function YG($,J,Y){if($.length>$G)return;let X=J?.length??0;c3.set(u3($,J),{root:Y,retainedChars:Math.max(1,$.length*2+X)})}function ZG($){return $J($)&&$.type==="text"&&typeof $.value==="string"}function XG($){return $J($)&&$.type==="element"}function QG($){return $J($)&&$.type==="root"&&Array.isArray($.children)}function V4($,J,Y=0){if(ZG($))return k$(R1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(XG($)){let X=$.properties?.className?.[0]||"",Z=J.default;if(X.includes("comment"))Z=J.comment;else if(X.includes("string"))Z=J.string;else if(X.includes("number"))Z=J.number;else if(X.includes("keyword"))Z=J.keyword;else if(X.includes("function"))Z=J.function;else if(X.includes("variable"))Z=J.variable;else if(X.includes("operator"))Z=J.operator;else if(X.includes("type"))Z=J.type;else if(X.includes("tag"))Z=J.tag;else if(X.includes("attr"))Z=J.attr;let Q=$.children?.map((G,U)=>V4(G,J,U));return k$(R1,{color:Z,wrap:"wrap",children:Q},Y,!1,void 0,this)}if(QG($))return k$(x3.Fragment,{children:$.children.map((X,Z)=>V4(X,J,Z))},Y,!1,void 0,this);return k$(R1,{},Y,!1,void 0,this)}function GG($,J,Y){let X=Y||F$.getTheme().colors.syntax;try{let Z=JG($,J);if(Z)return V4(Z,X);let Q;if(!J||!e6.registered(J))Q=e6.highlightAuto($);else Q=e6.highlight(J,$);let G=Q;if(!G.children||G.children.length===0)return k$(R1,{color:X.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return YG($,J,Q),V4(Q,X)}catch(Z){return k$(R1,{color:X.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var j4=x3.memo(({content:$,language:J,showLineNumbers:Y=!0,terminalWidth:X,availableHeight:Z})=>{let Q=D0(),G=$.split(`
|
|
136
|
+
`),U=0;if(Z&&G.length>Z){let q=Math.max(Z,s6);if(G.length>q)U=G.length-q,G=G.slice(U)}let z=G.length+U,K=String(z).length+1,O=Math.max(20,X-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$(R1,{color:Q.colors.text.secondary,children:J},void 0,!1,void 0,this)},void 0,!1,void 0,this),U>0&&k$(v4,{marginBottom:0,children:k$(R1,{color:Q.colors.text.muted,dimColor:!0,children:["... ",U," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),k$(p3,{maxWidth:O,maxHeight:Z,children:G.map((q,N)=>{let _=N+U+1;return k$(v4,{flexDirection:"row",children:[Y&&k$(R1,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(_).padStart(K-1," ")," "]},void 0,!0,void 0,this),q.trim()===""?k$(R1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):GG(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 d3,Text as p$}from"ink";import UG,{useState as KG}from"react";import{jsxDEV as D$}from"react/jsx-dev-runtime";var l3=400;function zG($){let J=$.split(`
|
|
137
|
+
`),Y=[],X=0,Z=0;for(let Q of J){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let G=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(G)X=parseInt(G[1],10),Z=parseInt(G[3],10);Y.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Y.push({type:"remove",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith("+")){Y.push({type:"add",content:Q.substring(1),lineNumber:Z}),Z++;continue}if(Q.startsWith(" ")||Q===""){Y.push({type:"context",content:Q.substring(1),lineNumber:Z}),X++,Z++;continue}}return Y}var JJ=UG.memo(({patch:$,startLine:J,matchLine:Y,terminalWidth:X,maxLines:Z=20,isFocused:Q=!1})=>{let G=D0(),U=zG($),[z,K]=KG(!1);N0((w)=>{if(w.toLowerCase()==="e")K((B)=>!B)},{isActive:Q&&U.length>Z});let q=Math.max(...U.map((w)=>w.lineNumber||0)).toString().length+1,N=U.filter((w)=>w.type==="add").length,_=U.filter((w)=>w.type==="remove").length,H=U.length,W=H>Z,b;if(!W)b=U;else if(z)b=U.slice(0,l3);else b=U.slice(0,Z);let M=H-b.length;return D$(d3,{flexDirection:"column",marginTop:1,marginBottom:1,children:[D$(p$,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,X)))},void 0,!1,void 0,this),W&&D$(p$,{color:G.colors.info,children:[z?`已展开 ${b.length}/${H} 行`:`显示前 ${Z} 行,共 ${H} 行`," · ",D$(p$,{color:G.colors.success,children:["+",N]},void 0,!0,void 0,this)," ",D$(p$,{color:G.colors.error,children:["-",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W&&D$(p$,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,X)))},void 0,!1,void 0,this),b.map((w,B)=>{if(w.type==="header")return D$(p$,{color:G.colors.muted,dimColor:!0,children:w.content},B,!1,void 0,this);let C=w.lineNumber?w.lineNumber.toString().padStart(q," "):" ".repeat(q),F=" ",A,L;if(w.type==="add")F="+",L=G.colors.success,A=void 0;else if(w.type==="remove")F="-",L=G.colors.error,A=void 0;else L=G.colors.text.primary;let R=Math.max(0,X-q-2),k=w.content;if(k.length>R)k=k.substring(0,R-3)+"...";return D$(p$,{color:L,backgroundColor:A,children:[D$(p$,{dimColor:!0,children:C},void 0,!1,void 0,this),D$(p$,{children:F},void 0,!1,void 0,this),D$(p$,{children:[" ",k]},void 0,!0,void 0,this)]},B,!0,void 0,this)}),W&&D$(d3,{marginTop:1,children:z?D$(p$,{color:G.colors.info,dimColor:!0,children:[M>0?`已达显示上限 ${l3} 行,仍有 ${M} 行未显示`:"已显示全部内容",Q?" · 按 E 折叠":""]},void 0,!0,void 0,this):D$(p$,{color:G.colors.info,dimColor:!0,children:["已隐藏剩余 ",M," 行",Q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D$(p$,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,X)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as YJ,Text as r3}from"ink";import qG from"react";import{jsxDEV as r2}from"react/jsx-dev-runtime";var _G=({itemText:$,type:J,marker:Y,leadingWhitespace:X=""})=>{let Z=J==="ol"?`${Y}. `:`${Y} `,Q=Z.length,G=X.length;return r2(YJ,{paddingLeft:G+1,flexDirection:"row",children:[r2(YJ,{width:Q,children:r2(r3,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),r2(YJ,{flexGrow:1,children:r2(r3,{wrap:"wrap",children:r2(X1,{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)},ZJ=qG.memo(_G);import{Text as XJ}from"ink";import OG,{useMemo as NG}from"react";import a3 from"string-width";import{jsxDEV as QJ}from"react/jsx-dev-runtime";var i3=4,a2=3,WG=4,o3=OG.memo(({headers:$,rows:J,terminalWidth:Y})=>{let X=D0(),Z=NG(()=>{if($.length===0||J.length===0)return null;let q=$.length,N=$.map((L,R)=>{let k=Math.max(l6(L),a2);for(let T of J)k=Math.max(k,l6(T[R]||""));return k}),_=$.map((L,R)=>{let k=Math.max(H8(L),a2);for(let T of J)k=Math.max(k,H8(T[R]||""));return k}),H=1+q*3,W=Math.max(Y-H-i3,q*a2),b=N.reduce((L,R)=>L+R,0),M=_.reduce((L,R)=>L+R,0),w=!1,B;if(M<=W)B=_;else if(b<=W){let L=W-b,R=_.map((T,I)=>T-N[I]),k=R.reduce((T,I)=>T+I,0);B=N.map((T,I)=>{if(k===0)return T;let P=Math.floor(R[I]/k*L);return T+P})}else{w=!0;let L=W/b;B=N.map((R)=>Math.max(Math.floor(R*L),a2))}function C(){let L=1;for(let R=0;R<$.length;R++){let k=u2($[R],B[R],w);L=Math.max(L,k.length)}for(let R of J)for(let k=0;k<R.length;k++){let T=u2(R[k]||"",B[k],w);L=Math.max(L,T.length)}return L}if(C()>WG)return{type:"vertical",columnWidths:B,needsHardWrap:w};return{type:"horizontal",columnWidths:B,needsHardWrap:w}},[$,J,Y]);if(!Z)return null;if(Z.type==="vertical"){let q=Math.min(Y-1,40),N="─".repeat(q);return QJ(XJ,{children:J.map((_,H)=>{let W=[];if(H>0)W.push(N);return _.forEach((b,M)=>{let w=$[M]||`Column ${M+1}`,B=(b||"").replace(/\n+/g," ").trim();W.push(`\x1B[1m${w}:\x1B[22m ${B}`)}),W.join(`
|
|
138
138
|
`)}).join(`
|
|
139
139
|
`)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:G}=Z;function U(q){let _={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[q],H=_.left;return Q.forEach((W,b)=>{H+=_.h.repeat(W+2),H+=b<Q.length-1?_.mid:_.right}),H}function z(q,N){let _=q.map((M,w)=>{let B=Q[w]||a2;return u2(M||"",B,G)}),H=Math.max(..._.map((M)=>M.length),1),W=_.map((M)=>Math.floor((H-M.length)/2)),b=[];for(let M=0;M<H;M++){let w="│";for(let B=0;B<q.length;B++){let C=_[B],F=W[B],A=M-F,L=A>=0&&A<C.length?C[A]:"",R=Q[B]||a2,k=a3(L),T=f3(N?`\x1B[1m${L}\x1B[22m`:L,k,R,N?"center":"left");w+=` ${T} │`}b.push(w)}return b}let K=[];if(K.push(U("top")),K.push(...z($,!0)),K.push(U("middle")),J.forEach((q,N)=>{if(K.push(...z(q,!1)),N<J.length-1)K.push(U("middle"))}),K.push(U("bottom")),Math.max(...K.map((q)=>a3(q)))>Y-i3){let q=Math.min(Y-1,40),N="─".repeat(q);return QJ(XJ,{children:J.map((_,H)=>{let W=[];if(H>0)W.push(N);return _.forEach((b,M)=>{let w=$[M]||`Column ${M+1}`,B=(b||"").replace(/\n+/g," ").trim();W.push(`\x1B[1m${w}:\x1B[22m ${B}`)}),W.join(`
|
|
140
140
|
`)}).join(`
|
|
141
141
|
`)},void 0,!1,void 0,this)}return QJ(XJ,{color:X.colors.text.primary,children:K.join(`
|
|
142
|
-
`)},void 0,!1,void 0,this)});import{jsxDEV as l}from"react/jsx-dev-runtime";var
|
|
142
|
+
`)},void 0,!1,void 0,this)});import{jsxDEV as l}from"react/jsx-dev-runtime";var HG=($,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 X=Y&&"phase"in Y?Y.phase:void 0;return{color:J.text.secondary,prefix:X==="start"?"• ":X==="complete"?" └ ":" "}}default:return{color:J.text.primary,prefix:" "}}},FG=_2.memo(({content:$,language:J,terminalWidth:Y,isPending:X=!1,availableHeight:Z})=>{let Q=D0();if(X&&Z!==void 0){let G=$.split(`
|
|
143
143
|
`),U=4,z=Math.max(1,Z-4);if(G.length>z){let K=G.slice(0,z).join(`
|
|
144
|
-
`);return l(I0,{flexDirection:"column",flexShrink:0,children:[l(j4,{content:K,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),l(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 l(j4,{content:$,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),
|
|
144
|
+
`);return l(I0,{flexDirection:"column",flexShrink:0,children:[l(j4,{content:K,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),l(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 l(j4,{content:$,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),LG=_2.memo(({content:$,level:J})=>{let Y=D0();switch(J){case 1:return l(u0,{bold:!0,color:Y.colors.primary,children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return l(u0,{bold:!0,color:Y.colors.primary,children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return l(u0,{bold:!0,color:Y.colors.text.primary,children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return l(u0,{italic:!0,color:Y.colors.text.muted,children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return l(u0,{children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),BG=_2.memo(({terminalWidth:$})=>{let J=D0(),Y=Math.max(0,Math.min($-4,80));return l(u0,{dimColor:!0,color:J.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),wG=_2.memo(({content:$})=>{return l(u0,{wrap:"wrap",children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),PG=_2.memo(({content:$})=>{let J=D0();return l(I0,{flexDirection:"row",gap:1,children:[l(u0,{color:J.colors.info,children:" "},void 0,!1,void 0,this),l(u0,{color:J.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),AG=_2.memo(({detail:$,terminalWidth:J})=>{let Y=D0(),X=50,Z=$.split(`
|
|
145
145
|
`);while(Z.length>0&&Z[0].trim()==="")Z.shift();while(Z.length>0&&Z[Z.length-1].trim()==="")Z.pop();let Q=Z.length>50,G=Q?Z.slice(0,50):Z,U=G.join(`
|
|
146
|
-
`),z=U.includes("<<<DIFF>>>"),K=U.includes("```");if(z){let O=U.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(O)try{let q=JSON.parse(O[1]);return l(I0,{flexDirection:"column",children:[l(JJ,{patch:q.patch,startLine:q.startLine,matchLine:q.matchLine,terminalWidth:J},void 0,!1,void 0,this),Q&&l(I0,{marginTop:1,children:l(u0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(K){let O=U.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(O){let q=O[1]||"text",N=O[2];return l(I0,{flexDirection:"column",children:[l(j4,{content:N,language:q,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&l(I0,{marginTop:1,children:l(u0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return l(I0,{flexDirection:"column",children:[G.map((O,q)=>l(u0,{color:Y.colors.text.primary,children:O},q,!1,void 0,this)),Q&&l(I0,{marginTop:1,children:l(u0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function
|
|
147
|
-
`,K);if(q!==-1&&q-K<G)O=q+1;let N=$.slice(O),H=($.slice(0,O).match(/\n/g)||[]).length+1;return{content:N,isTruncated:!0,hiddenLines:H}}var C1=_2.memo(({content:$,role:J,terminalWidth:Y,metadata:X,isPending:Z=!1,availableTerminalHeight:Q,hidePrefix:G=!1,noMargin:U=!1,renderPlainTextOnly:z=!1,streamingLines:K,streamingHiddenLines:O,messageId:q,blocksOverride:N,currentLineOverride:_,streamingMode:H="text",renderCodeBlocksAsPlainText:W=!1})=>{let b=D0(),M=N!==void 0,w=q2(()=>
|
|
148
|
-
`);if(E===-1)return{completedContent:"",currentLine:j};return{completedContent:j.slice(0,E+1),currentLine:j.slice(E+1)}},[j,Z,M,_]),J0=n3({content:"",blocks:[]}),f=q2(()=>{if(M)return N??[];if(I)return I;if(T.current&&T.current.messageId===q)return T.current.blocks;let E=J0.current;if(!Z||!Z0.startsWith(E.content)){let d=UJ(Z0);return J0.current={content:Z0,blocks:d},d}if(Z0===E.content)return E.blocks;let m=Z0.slice(E.content.length),Y0=UJ(m),c=[...E.blocks,...Y0];return J0.current={content:Z0,blocks:c},c},[Z0,Z,M,N]);return l(I0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:[o&&l(I0,{flexDirection:"row",flexShrink:0,children:[l(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),l(u0,{color:b.colors.text.muted,dimColor:!0,children:["^ ",u," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),f.map((E,m)=>{if(E.type==="empty")return l(I0,{height:1,flexShrink:0},m,!1,void 0,this);return l(I0,{flexDirection:"row",flexShrink:0,children:[m===0&&!G&&l(I0,{marginRight:1,flexShrink:0,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),(m>0||G)&&l(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexGrow:1,flexShrink:0,children:E.type==="code"?W?l(u0,{wrap:"wrap",children:E.content},void 0,!1,void 0,this):l(HG,{content:E.content,language:E.language,terminalWidth:Y-F,isPending:Z,availableHeight:Q},void 0,!1,void 0,this):E.type==="table"&&E.tableData?l(o3,{headers:E.tableData.headers,rows:E.tableData.rows,terminalWidth:Y-F},void 0,!1,void 0,this):E.type==="heading"?l(FG,{content:E.content,level:E.level||1},void 0,!1,void 0,this):E.type==="list"?l(ZJ,{type:E.listType||"ul",marker:E.marker||"-",itemText:E.content,leadingWhitespace:" ".repeat(E.indentation||0)},void 0,!1,void 0,this):E.type==="hr"?l(LG,{terminalWidth:Y-F},void 0,!1,void 0,this):E.type==="diff"&&E.diffData?l(JJ,{patch:E.diffData.patch,startLine:E.diffData.startLine,matchLine:E.diffData.matchLine,terminalWidth:Y-F},void 0,!1,void 0,this):E.type==="command-message"?l(wG,{content:E.content},void 0,!1,void 0,this):E.type==="blockquote"&&E.blockquoteLines?l(V3,{lines:E.blockquoteLines,level:E.blockquoteLevel||1},void 0,!1,void 0,this):l(BG,{content:E.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},m,!0,void 0,this)}),z0&&l(I0,{flexDirection:"row",flexShrink:0,children:[f.length===0&&!G?l(I0,{marginRight:1,flexShrink:0,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):l(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexGrow:1,flexShrink:0,children:l(u0,{wrap:"wrap",children:z0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A&&l(I0,{flexDirection:"row",flexShrink:0,children:[l(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[l(u0,{color:b.colors.text.muted,children:["Subtask"," ",typeof A.agentType==="string"?`@${A.agentType}`:"",typeof A.status==="string"?` · ${A.status}`:""]},void 0,!0,void 0,this),typeof A.summary==="string"&&A.summary.trim()!==""&&l(u0,{wrap:"wrap",children:A.summary},void 0,!1,void 0,this),typeof A.childSessionId==="string"&&l(u0,{color:b.colors.text.muted,children:["Session ",A.childSessionId]},void 0,!0,void 0,this),typeof A.resumedFrom==="string"&&l(u0,{color:b.colors.text.muted,children:["Resumed from ",A.resumedFrom,typeof A.resumeDepth==="number"?` · depth ${A.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 yG}from"react/jsx-dev-runtime";var TG=KJ.memo(({label:$,isSelected:J})=>n0(O1,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),RG=KJ.memo(({details:$,headerColor:J,isPlanModeExit:Y,isPlanModeEnter:X,terminalWidth:Z})=>n0(yG,{children:[n0(o$,{marginBottom:1,children:n0(O1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&n0(o$,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:J,padding:1,children:[n0(O1,{bold:!0,color:J,children:"实施方案"},void 0,!1,void 0,this),n0(o$,{marginTop:1,children:n0(C1,{content:$.planContent,role:"assistant",terminalWidth:Z-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&n0(o$,{flexDirection:"column",marginBottom:1,children:n0(C1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&n0(o$,{flexDirection:"column",marginBottom:1,children:[n0(O1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,G)=>n0(o$,{marginLeft:2,children:n0(O1,{color:"red",children:["• ",Q]},void 0,!0,void 0,this)},G,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&n0(o$,{flexDirection:"column",marginBottom:1,children:[n0(O1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,G)=>n0(o$,{marginLeft:2,children:n0(O1,{children:["• ",Q]},void 0,!0,void 0,this)},G,!1,void 0,this)),$.affectedFiles.length>3&&n0(o$,{marginLeft:2,children:n0(O1,{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 CG($,J,Y,X){return`使用 ↑↓ 选择,回车确认 · ${J||Y||X?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var $Z=KJ.memo(({details:$,onResponse:J})=>{let{stdout:Y}=bG(),X=Y.columns||80,Q=X$()==="confirmation-prompt",G=s0(!1),U=$.type==="exitPlanMode",z=$.type==="enterPlanMode",K=$.type==="maxTurnsExceeded",O=$.type==="mcpSampling";N0((_,H)=>{if(H.ctrl&&_==="c"||H.meta&&_==="c"){G();return}if(H.escape){J({approved:!1,reason:"用户取消"});return}let W=_.toLowerCase();if(U){if(W==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(W==="s"){J({approved:!0,targetMode:"default"});return}if(W==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(z){if(W==="y"){J({approved:!0});return}if(W==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(K){if(W==="y"){J({approved:!0});return}if(W==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(O){if(W==="y"){J({approved:!0,scope:"once"});return}if(W==="n"){J({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(W==="y"){J({approved:!0,scope:"once"});return}if(W==="s"){J({approved:!0,scope:"session"});return}if(W==="p"){J({approved:!0,scope:"project"});return}if(W==="n"){J({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let q=e3(()=>{if(U)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(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:"用户拒绝"}}]},[U,z,K,O]),N=e3(()=>{if(U)return{color:"cyan",title:"方案审核"};if(z)return{color:"magenta",title:"进入规划模式"};if(K)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[U,z,K,$.title]);return n0(o$,{flexDirection:"column",borderStyle:"round",borderColor:Q?N.color:"gray",padding:1,children:[n0(o$,{marginBottom:1,children:n0(O1,{bold:!0,color:N.color,children:N.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(RG,{details:$,headerColor:N.color,isPlanModeExit:U,isPlanModeEnter:z,terminalWidth:X},void 0,!1,void 0,this),n0(o$,{flexDirection:"column",children:[n0(O1,{color:"gray",children:CG(U,z,K,O)},void 0,!1,void 0,this),n0(MG,{items:q,isFocused:Q,itemComponent:TG,onSelect:(_)=>{J(_.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as zJ,Text as Q1}from"ink";import{useEffect as IG,useMemo as SG,useState as kG}from"react";import{jsxDEV as g$}from"react/jsx-dev-runtime";function DG($,J){let Y=J,X=J;while(Y>0&&$.items[Y-1]?.mutable)Y--;while(X<$.items.length-1&&$.items[X+1]?.mutable)X++;return{start:Y,end:X}}function JZ({queue:$,mutation:J,onMutate:Y,onRefresh:X,onClose:Z}){let{width:Q,height:G}=d1(),[U,z]=kG($?.items[0]?.id??null),K=Math.max(0,$?.items.findIndex((_)=>_.id===U)??0);IG(()=>{if(!$||$.items.length===0){z(null);return}if(!U||!$.items.some((_)=>_.id===U))z($.items[Math.min(K,$.items.length-1)].id)},[$,U,K]);let O=(_)=>{Promise.resolve(Y(_)).catch(()=>{return})};N0((_,H)=>{if(H.escape||_==="q")return Z(),!0;if(_==="r")return Promise.resolve(X()).catch(()=>{return}),!0;if(!$||$.items.length===0)return!0;if(H.downArrow||_==="j"){let w=Math.min($.items.length-1,K+1);return z($.items[w].id),!0}if(H.upArrow||_==="k"){let w=Math.max(0,K-1);return z($.items[w].id),!0}let W=$.items[K];if(!W?.mutable||J.pending)return!0;let b=DG($,K);if(_==="d")return O({type:"remove",messageId:W.id}),!0;let M=_==="K"?Math.max(b.start,K-1):_==="J"?Math.min(b.end,K+1):_==="g"?b.start:_==="G"?b.end:void 0;if(M!==void 0&&M!==K)O({type:"move",messageId:W.id,toPosition:M});return!0},{priority:120});let q=SG(()=>{if(!$)return[];let _=Math.max(1,G-9),H=Math.max(0,Math.min(K-Math.floor(_/2),$.items.length-_));return $.items.slice(H,H+_)},[G,$,K]),N=Math.max(8,Q-38);return g$(zJ,{flexDirection:"column",borderStyle:"double",borderColor:"yellow",paddingX:1,children:[g$(zJ,{justifyContent:"space-between",children:[g$(Q1,{bold:!0,color:"yellow",children:["Follow-up queue · ",$?.pending??0]},void 0,!0,void 0,this),g$(Q1,{dimColor:!0,children:"Esc/q close · r refresh"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g$(Q1,{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$(Q1,{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$(Q1,{dimColor:!0,children:"No queued follow-ups."},void 0,!1,void 0,this):q.map((_)=>{let H=_.id===U,W=_.kind==="internal"?"Internal runtime item":_.preview||"Attachment-only follow-up";return g$(zJ,{gap:1,children:[g$(Q1,{color:H?"cyan":void 0,children:H?"›":" "},void 0,!1,void 0,this),g$(Q1,{dimColor:!0,children:String(_.position+1).padStart(2," ")},void 0,!1,void 0,this),g$(Q1,{color:_.mutable?"white":"gray",children:k3(W.replace(/\s+/g," "),N,"…")},void 0,!1,void 0,this),_.attachmentCount>0&&g$(Q1,{color:"cyan",children:["[",_.attachmentCount," attachment]"]},void 0,!0,void 0,this),g$(Q1,{color:_.mutable?"green":"yellow",children:_.mutable?_.delivery.replace("_"," "):"locked"},void 0,!1,void 0,this),J.pending&&J.messageId===_.id&&g$(Q1,{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 C0}from"ink";import YZ from"ink-text-input";import{useState as y1}from"react";import{jsxDEV as t}from"react/jsx-dev-runtime";var L8=[{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"}],h4=[{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"}],fG=[`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"],ZZ=({workspaceRoot:$,sessionId:J,onClose:Y,onSave:X})=>{let Z=F$.getTheme(),[Q,G]=y1("action"),[U,z]=y1(0),[K,O]=y1(0),[q,N]=y1(0),[_,H]=y1(""),[W,b]=y1(""),[M,w]=y1(null),[B,C]=y1(!1),[F,A]=y1(null),L=L8[U],R=h4[K],k=E4[q],T=()=>{if(F){A(null);return}switch(Q){case"action":Y();break;case"event":G("action");break;case"matcher":G("event");break;case"command":G("matcher");break;case"location":G("command");break;case"confirm":G("location");break}};N0((f,E)=>{if(E.escape){T();return}if(Q==="action"){if(E.upArrow)z((m)=>m>0?m-1:L8.length-1);else if(E.downArrow)z((m)=>m<L8.length-1?m+1:0);else if(E.return)I()}else if(Q==="event"){if(E.upArrow)O((m)=>m>0?m-1:h4.length-1);else if(E.downArrow)O((m)=>m<h4.length-1?m+1:0);else if(E.return)G("matcher")}else if(Q==="location"){if(E.upArrow)N((m)=>m>0?m-1:E4.length-1);else if(E.downArrow)N((m)=>m<E4.length-1?m+1:0);else if(E.return)G("confirm")}else if(Q==="confirm"){if(E.return)J0()}});let I=()=>{let f=L8[U].action;if(f==="add")G("event");else if(f==="status")P();else if(f==="list")u();else if(f==="enable")E$.getInstance().enableSession(J,$),A("Hooks enabled for this session");else if(f==="disable")E$.getInstance().disableSession(J,$),A("Hooks disabled for this session");else if(f==="trust")j();else if(f==="revoke")o()},P=async()=>{let f=E$.getInstance(),E=f.isEnabled($,J),m=f.getConfig($),Y0=await f.getTrustStatus($),c={};for(let a of Object.values(qJ)){let W0=m[a];if(W0&&Array.isArray(W0)){let F0=W0.reduce((T0,y)=>T0+(y.hooks?.length||0),0);if(F0>0)c[a]=F0}}let d=[`Status: ${E?"Enabled":"Disabled"}`,`Trust: ${Y0.state}`,`Digest: ${Y0.currentDigest??"none"}`,""];if(Object.keys(c).length>0){d.push("Configured hooks:");for(let[a,W0]of Object.entries(c))d.push(` ${a}: ${W0} hook(s)`)}else d.push("No hooks configured");A(d.join(`
|
|
146
|
+
`),z=U.includes("<<<DIFF>>>"),K=U.includes("```");if(z){let O=U.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(O)try{let q=JSON.parse(O[1]);return l(I0,{flexDirection:"column",children:[l(JJ,{patch:q.patch,startLine:q.startLine,matchLine:q.matchLine,terminalWidth:J},void 0,!1,void 0,this),Q&&l(I0,{marginTop:1,children:l(u0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(K){let O=U.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(O){let q=O[1]||"text",N=O[2];return l(I0,{flexDirection:"column",children:[l(j4,{content:N,language:q,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&l(I0,{marginTop:1,children:l(u0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return l(I0,{flexDirection:"column",children:[G.map((O,q)=>l(u0,{color:Y.colors.text.primary,children:O},q,!1,void 0,this)),Q&&l(I0,{marginTop:1,children:l(u0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function bG($,J,Y,X=80){if(!Y||J===void 0||J<=0)return{content:$,isTruncated:!1,hiddenLines:0};let Q=Math.max(1,J-8),G=Math.max(40,X*0.8),U=Q*G;if($.length<=U)return{content:$,isTruncated:!1,hiddenLines:0};let z=Math.floor(U*0.9),K=$.length-z,O=K,q=$.indexOf(`
|
|
147
|
+
`,K);if(q!==-1&&q-K<G)O=q+1;let N=$.slice(O),H=($.slice(0,O).match(/\n/g)||[]).length+1;return{content:N,isTruncated:!0,hiddenLines:H}}var C1=_2.memo(({content:$,role:J,terminalWidth:Y,metadata:X,isPending:Z=!1,availableTerminalHeight:Q,hidePrefix:G=!1,noMargin:U=!1,renderPlainTextOnly:z=!1,streamingLines:K,streamingHiddenLines:O,messageId:q,blocksOverride:N,currentLineOverride:_,streamingMode:H="text",renderCodeBlocksAsPlainText:W=!1})=>{let b=D0(),M=N!==void 0,w=q2(()=>HG(J,b.colors,X),[J,b.colors,X]),{color:B,prefix:C}=w,F=C.length+1,A=q2(()=>{if(!X||typeof X!=="object")return null;if(!("subtaskRef"in X))return null;let E=X.subtaskRef;if(!E||typeof E!=="object")return null;return E},[X]),L=J==="tool"&&X?.phase==="start",R=!U&&!L,k=q2(()=>{if(!z)return[];return $.split(/\r?\n/)},[$,z]);if(!M&&Z){let E=K??$.split(/\r?\n/),m=O??0,Y0=!1,c=!1,d=!1;if(H!=="text")Y0=H==="code",c=H==="diff",d=H==="table";return l(I0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:[m>0&&l(I0,{flexDirection:"row",flexShrink:0,children:[l(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),l(u0,{color:b.colors.text.muted,dimColor:!0,children:["^ ",m," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),E.map((a,W0)=>{if(H==="text"){if(a.match(l1.codeBlock))Y0=!Y0;else if(a.match(l1.diffStart))c=!0;else if(a.match(l1.diffEnd))c=!1;else if(a.match(l1.table))d=!0;else if(d&&!a.match(l1.table))d=!1}let F0=H==="text"&&!Y0&&!c&&!d,T0=F0?a.match(l1.ulItem):null,y=F0?a.match(l1.olItem):null,D=T0??y;return l(I0,{flexDirection:"row",flexShrink:0,children:[W0===0&&!G?l(I0,{marginRight:1,flexShrink:0,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):l(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexGrow:1,flexShrink:0,children:D?l(ZJ,{type:T0?"ul":"ol",marker:D[2],itemText:D[3],leadingWhitespace:D[1]},void 0,!1,void 0,this):l(u0,{wrap:"wrap",children:a===""?" ":a},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},W0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!M&&z)return l(I0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:k.map((E,m)=>l(I0,{flexDirection:"row",flexShrink:0,children:[m===0&&!G?l(I0,{marginRight:1,flexShrink:0,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):l(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexGrow:1,flexShrink:0,children:l(u0,{wrap:"wrap",children:E===""?" ":E},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},m,!0,void 0,this))},void 0,!1,void 0,this);let T=n3(null);GJ(()=>{T.current=null},[q]);let I=q2(()=>{if(M)return null;if(!q)return null;return t3(q)},[q,M]);GJ(()=>{if(M)return;if(!I||!q)return;T.current={messageId:q,blocks:I}},[I,q,M]),GJ(()=>{if(M)return;if(!I||!q)return;s3(q)},[I,q,M]);let P=q2(()=>M?{content:$,isTruncated:!1,hiddenLines:0}:bG($,Q,Z,Y),[$,Q,Z,Y,M]),{content:j,isTruncated:o,hiddenLines:u}=P;if(!M&&J==="tool"&&X&&"detail"in X){let E=X;if(E.detail)return l(I0,{flexDirection:"column",marginBottom:U?0:1,children:[l(I0,{flexDirection:"row",children:[l(I0,{marginRight:1,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(u0,{color:B,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),l(I0,{marginLeft:C.length+1,children:l(AG,{detail:E.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:Z0,currentLine:z0}=q2(()=>{if(M)return{completedContent:"",currentLine:_??""};if(!Z)return{completedContent:j,currentLine:""};let E=j.lastIndexOf(`
|
|
148
|
+
`);if(E===-1)return{completedContent:"",currentLine:j};return{completedContent:j.slice(0,E+1),currentLine:j.slice(E+1)}},[j,Z,M,_]),J0=n3({content:"",blocks:[]}),f=q2(()=>{if(M)return N??[];if(I)return I;if(T.current&&T.current.messageId===q)return T.current.blocks;let E=J0.current;if(!Z||!Z0.startsWith(E.content)){let d=UJ(Z0);return J0.current={content:Z0,blocks:d},d}if(Z0===E.content)return E.blocks;let m=Z0.slice(E.content.length),Y0=UJ(m),c=[...E.blocks,...Y0];return J0.current={content:Z0,blocks:c},c},[Z0,Z,M,N]);return l(I0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:[o&&l(I0,{flexDirection:"row",flexShrink:0,children:[l(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),l(u0,{color:b.colors.text.muted,dimColor:!0,children:["^ ",u," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),f.map((E,m)=>{if(E.type==="empty")return l(I0,{height:1,flexShrink:0},m,!1,void 0,this);return l(I0,{flexDirection:"row",flexShrink:0,children:[m===0&&!G&&l(I0,{marginRight:1,flexShrink:0,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),(m>0||G)&&l(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexGrow:1,flexShrink:0,children:E.type==="code"?W?l(u0,{wrap:"wrap",children:E.content},void 0,!1,void 0,this):l(FG,{content:E.content,language:E.language,terminalWidth:Y-F,isPending:Z,availableHeight:Q},void 0,!1,void 0,this):E.type==="table"&&E.tableData?l(o3,{headers:E.tableData.headers,rows:E.tableData.rows,terminalWidth:Y-F},void 0,!1,void 0,this):E.type==="heading"?l(LG,{content:E.content,level:E.level||1},void 0,!1,void 0,this):E.type==="list"?l(ZJ,{type:E.listType||"ul",marker:E.marker||"-",itemText:E.content,leadingWhitespace:" ".repeat(E.indentation||0)},void 0,!1,void 0,this):E.type==="hr"?l(BG,{terminalWidth:Y-F},void 0,!1,void 0,this):E.type==="diff"&&E.diffData?l(JJ,{patch:E.diffData.patch,startLine:E.diffData.startLine,matchLine:E.diffData.matchLine,terminalWidth:Y-F},void 0,!1,void 0,this):E.type==="command-message"?l(PG,{content:E.content},void 0,!1,void 0,this):E.type==="blockquote"&&E.blockquoteLines?l(V3,{lines:E.blockquoteLines,level:E.blockquoteLevel||1},void 0,!1,void 0,this):l(wG,{content:E.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},m,!0,void 0,this)}),z0&&l(I0,{flexDirection:"row",flexShrink:0,children:[f.length===0&&!G?l(I0,{marginRight:1,flexShrink:0,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):l(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexGrow:1,flexShrink:0,children:l(u0,{wrap:"wrap",children:z0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A&&l(I0,{flexDirection:"row",flexShrink:0,children:[l(I0,{width:F,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[l(u0,{color:b.colors.text.muted,children:["Subtask"," ",typeof A.agentType==="string"?`@${A.agentType}`:"",typeof A.status==="string"?` · ${A.status}`:""]},void 0,!0,void 0,this),typeof A.summary==="string"&&A.summary.trim()!==""&&l(u0,{wrap:"wrap",children:A.summary},void 0,!1,void 0,this),typeof A.childSessionId==="string"&&l(u0,{color:b.colors.text.muted,children:["Session ",A.childSessionId]},void 0,!0,void 0,this),typeof A.resumedFrom==="string"&&l(u0,{color:b.colors.text.muted,children:["Resumed from ",A.resumedFrom,typeof A.resumeDepth==="number"?` · depth ${A.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 IG}from"react/jsx-dev-runtime";var RG=KJ.memo(({label:$,isSelected:J})=>n0(O1,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),CG=KJ.memo(({details:$,headerColor:J,isPlanModeExit:Y,isPlanModeEnter:X,terminalWidth:Z})=>n0(IG,{children:[n0(o$,{marginBottom:1,children:n0(O1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&n0(o$,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:J,padding:1,children:[n0(O1,{bold:!0,color:J,children:"实施方案"},void 0,!1,void 0,this),n0(o$,{marginTop:1,children:n0(C1,{content:$.planContent,role:"assistant",terminalWidth:Z-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&n0(o$,{flexDirection:"column",marginBottom:1,children:n0(C1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&n0(o$,{flexDirection:"column",marginBottom:1,children:[n0(O1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,G)=>n0(o$,{marginLeft:2,children:n0(O1,{color:"red",children:["• ",Q]},void 0,!0,void 0,this)},G,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&n0(o$,{flexDirection:"column",marginBottom:1,children:[n0(O1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,G)=>n0(o$,{marginLeft:2,children:n0(O1,{children:["• ",Q]},void 0,!0,void 0,this)},G,!1,void 0,this)),$.affectedFiles.length>3&&n0(o$,{marginLeft:2,children:n0(O1,{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 yG($,J,Y,X){return`使用 ↑↓ 选择,回车确认 · ${J||Y||X?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var $Z=KJ.memo(({details:$,onResponse:J})=>{let{stdout:Y}=MG(),X=Y.columns||80,Q=X$()==="confirmation-prompt",G=s0(!1),U=$.type==="exitPlanMode",z=$.type==="enterPlanMode",K=$.type==="maxTurnsExceeded",O=$.type==="mcpSampling";N0((_,H)=>{if(H.ctrl&&_==="c"||H.meta&&_==="c"){G();return}if(H.escape){J({approved:!1,reason:"用户取消"});return}let W=_.toLowerCase();if(U){if(W==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(W==="s"){J({approved:!0,targetMode:"default"});return}if(W==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(z){if(W==="y"){J({approved:!0});return}if(W==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(K){if(W==="y"){J({approved:!0});return}if(W==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(O){if(W==="y"){J({approved:!0,scope:"once"});return}if(W==="n"){J({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(W==="y"){J({approved:!0,scope:"once"});return}if(W==="s"){J({approved:!0,scope:"session"});return}if(W==="p"){J({approved:!0,scope:"project"});return}if(W==="n"){J({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let q=e3(()=>{if(U)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(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:"用户拒绝"}}]},[U,z,K,O]),N=e3(()=>{if(U)return{color:"cyan",title:"方案审核"};if(z)return{color:"magenta",title:"进入规划模式"};if(K)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[U,z,K,$.title]);return n0(o$,{flexDirection:"column",borderStyle:"round",borderColor:Q?N.color:"gray",padding:1,children:[n0(o$,{marginBottom:1,children:n0(O1,{bold:!0,color:N.color,children:N.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(CG,{details:$,headerColor:N.color,isPlanModeExit:U,isPlanModeEnter:z,terminalWidth:X},void 0,!1,void 0,this),n0(o$,{flexDirection:"column",children:[n0(O1,{color:"gray",children:yG(U,z,K,O)},void 0,!1,void 0,this),n0(TG,{items:q,isFocused:Q,itemComponent:RG,onSelect:(_)=>{J(_.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as zJ,Text as Q1}from"ink";import{useEffect as SG,useMemo as kG,useState as DG}from"react";import{jsxDEV as g$}from"react/jsx-dev-runtime";function fG($,J){let Y=J,X=J;while(Y>0&&$.items[Y-1]?.mutable)Y--;while(X<$.items.length-1&&$.items[X+1]?.mutable)X++;return{start:Y,end:X}}function JZ({queue:$,mutation:J,onMutate:Y,onRefresh:X,onClose:Z}){let{width:Q,height:G}=d1(),[U,z]=DG($?.items[0]?.id??null),K=Math.max(0,$?.items.findIndex((_)=>_.id===U)??0);SG(()=>{if(!$||$.items.length===0){z(null);return}if(!U||!$.items.some((_)=>_.id===U))z($.items[Math.min(K,$.items.length-1)].id)},[$,U,K]);let O=(_)=>{Promise.resolve(Y(_)).catch(()=>{return})};N0((_,H)=>{if(H.escape||_==="q")return Z(),!0;if(_==="r")return Promise.resolve(X()).catch(()=>{return}),!0;if(!$||$.items.length===0)return!0;if(H.downArrow||_==="j"){let w=Math.min($.items.length-1,K+1);return z($.items[w].id),!0}if(H.upArrow||_==="k"){let w=Math.max(0,K-1);return z($.items[w].id),!0}let W=$.items[K];if(!W?.mutable||J.pending)return!0;let b=fG($,K);if(_==="d")return O({type:"remove",messageId:W.id}),!0;let M=_==="K"?Math.max(b.start,K-1):_==="J"?Math.min(b.end,K+1):_==="g"?b.start:_==="G"?b.end:void 0;if(M!==void 0&&M!==K)O({type:"move",messageId:W.id,toPosition:M});return!0},{priority:120});let q=kG(()=>{if(!$)return[];let _=Math.max(1,G-9),H=Math.max(0,Math.min(K-Math.floor(_/2),$.items.length-_));return $.items.slice(H,H+_)},[G,$,K]),N=Math.max(8,Q-38);return g$(zJ,{flexDirection:"column",borderStyle:"double",borderColor:"yellow",paddingX:1,children:[g$(zJ,{justifyContent:"space-between",children:[g$(Q1,{bold:!0,color:"yellow",children:["Follow-up queue · ",$?.pending??0]},void 0,!0,void 0,this),g$(Q1,{dimColor:!0,children:"Esc/q close · r refresh"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g$(Q1,{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$(Q1,{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$(Q1,{dimColor:!0,children:"No queued follow-ups."},void 0,!1,void 0,this):q.map((_)=>{let H=_.id===U,W=_.kind==="internal"?"Internal runtime item":_.preview||"Attachment-only follow-up";return g$(zJ,{gap:1,children:[g$(Q1,{color:H?"cyan":void 0,children:H?"›":" "},void 0,!1,void 0,this),g$(Q1,{dimColor:!0,children:String(_.position+1).padStart(2," ")},void 0,!1,void 0,this),g$(Q1,{color:_.mutable?"white":"gray",children:k3(W.replace(/\s+/g," "),N,"…")},void 0,!1,void 0,this),_.attachmentCount>0&&g$(Q1,{color:"cyan",children:["[",_.attachmentCount," attachment]"]},void 0,!0,void 0,this),g$(Q1,{color:_.mutable?"green":"yellow",children:_.mutable?_.delivery.replace("_"," "):"locked"},void 0,!1,void 0,this),J.pending&&J.messageId===_.id&&g$(Q1,{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 C0}from"ink";import YZ from"ink-text-input";import{useState as y1}from"react";import{jsxDEV as t}from"react/jsx-dev-runtime";var L8=[{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"}],h4=[{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"}],vG=[`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"],ZZ=({workspaceRoot:$,sessionId:J,onClose:Y,onSave:X})=>{let Z=F$.getTheme(),[Q,G]=y1("action"),[U,z]=y1(0),[K,O]=y1(0),[q,N]=y1(0),[_,H]=y1(""),[W,b]=y1(""),[M,w]=y1(null),[B,C]=y1(!1),[F,A]=y1(null),L=L8[U],R=h4[K],k=E4[q],T=()=>{if(F){A(null);return}switch(Q){case"action":Y();break;case"event":G("action");break;case"matcher":G("event");break;case"command":G("matcher");break;case"location":G("command");break;case"confirm":G("location");break}};N0((f,E)=>{if(E.escape){T();return}if(Q==="action"){if(E.upArrow)z((m)=>m>0?m-1:L8.length-1);else if(E.downArrow)z((m)=>m<L8.length-1?m+1:0);else if(E.return)I()}else if(Q==="event"){if(E.upArrow)O((m)=>m>0?m-1:h4.length-1);else if(E.downArrow)O((m)=>m<h4.length-1?m+1:0);else if(E.return)G("matcher")}else if(Q==="location"){if(E.upArrow)N((m)=>m>0?m-1:E4.length-1);else if(E.downArrow)N((m)=>m<E4.length-1?m+1:0);else if(E.return)G("confirm")}else if(Q==="confirm"){if(E.return)J0()}});let I=()=>{let f=L8[U].action;if(f==="add")G("event");else if(f==="status")P();else if(f==="list")u();else if(f==="enable")E$.getInstance().enableSession(J,$),A("Hooks enabled for this session");else if(f==="disable")E$.getInstance().disableSession(J,$),A("Hooks disabled for this session");else if(f==="trust")j();else if(f==="revoke")o()},P=async()=>{let f=E$.getInstance(),E=f.isEnabled($,J),m=f.getConfig($),Y0=await f.getTrustStatus($),c={};for(let a of Object.values(qJ)){let W0=m[a];if(W0&&Array.isArray(W0)){let F0=W0.reduce((T0,y)=>T0+(y.hooks?.length||0),0);if(F0>0)c[a]=F0}}let d=[`Status: ${E?"Enabled":"Disabled"}`,`Trust: ${Y0.state}`,`Digest: ${Y0.currentDigest??"none"}`,""];if(Object.keys(c).length>0){d.push("Configured hooks:");for(let[a,W0]of Object.entries(c))d.push(` ${a}: ${W0} hook(s)`)}else d.push("No hooks configured");A(d.join(`
|
|
149
149
|
`))},j=async()=>{try{let f=await E$.getInstance().trustProject($);A(`Trust: ${f.state}
|
|
150
150
|
Digest: ${f.currentDigest??"none"}`)}catch(f){w(f instanceof Error?f.message:"Failed to trust hooks")}},o=async()=>{try{let f=await E$.getInstance().revokeProjectTrust($);A(`Trust: ${f.state}`)}catch(f){w(f instanceof Error?f.message:"Failed to revoke hook trust")}},u=()=>{let E=E$.getInstance().getConfig($),m=[],Y0=!1;for(let c of Object.values(qJ)){let d=E[c];if(!d||!Array.isArray(d)||d.length===0)continue;Y0=!0,m.push(`${c}:`);for(let a of d){let W0=a.matcher,F0="all";if(W0?.tools)F0=`tools: ${Array.isArray(W0.tools)?W0.tools.join(", "):W0.tools}`;m.push(` [${F0}]`);for(let T0 of a.hooks||[])if(T0.type==="command")m.push(` -> ${T0.command}`)}m.push("")}if(!Y0)m.push("No hooks configured"),m.push(""),m.push("Configure hooks in .blade/settings.local.json");A(m.join(`
|
|
151
|
-
`))},Z0=()=>{G("command")},z0=()=>{if(!W.trim()){w("Command cannot be empty");return}w(null),G("location")},J0=async()=>{C(!0),w(null);try{let f=E$.getInstance(),E=await import("node:fs/promises"),m=await import("node:path"),Y0=await import("node:os"),c={matcher:_.trim()?{tools:_.trim()}:{},hooks:[{type:"command",command:W.trim()}]},d;switch(k.location){case"local":d=m.join($,".blade","settings.local.json");break;case"project":d=m.join($,".blade","settings.json");break;case"user":d=m.join(Y0.homedir(),".blade","settings.json");break}await E.mkdir(m.dirname(d),{recursive:!0});let a={};try{let y=await E.readFile(d,"utf-8");a=JSON.parse(y)}catch{}let W0=a.hooks||{},F0=W0[R.event]||[],T0={...W0,enabled:!0,[R.event]:[...F0,c]};if(a.hooks=T0,await E.writeFile(d,JSON.stringify(a,null,2),"utf-8"),await f.reloadConfig($),X)X({event:R.event,matcher:_.trim(),command:W.trim()});Y()}catch(f){w(`Failed to save hook: ${f instanceof Error?f.message:"Unknown error"}`),C(!1)}};return t(j0,{flexDirection:"column",padding:1,children:[t(j0,{marginBottom:1,children:t(C0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginBottom:1,children:t(C0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),F&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(C0,{children:F},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="action"&&!F&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",marginTop:1,children:L8.map((f,E)=>t(j0,{children:[t(C0,{color:E===U?Z.colors.primary:void 0,bold:E===U,children:[E===U?"> ":" ",f.action]},void 0,!0,void 0,this),t(C0,{color:Z.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.action,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="event"&&t(j0,{flexDirection:"column",children:[t(C0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:h4.map((f,E)=>t(j0,{children:[t(C0,{color:E===K?Z.colors.primary:void 0,bold:E===K,children:[E===K?"> ":" ",f.event]},void 0,!0,void 0,this),t(C0,{color:Z.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.event,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q!=="event"&&t(j0,{marginBottom:1,children:t(C0,{children:["Event:"," ",t(C0,{bold:!0,color:Z.colors.primary,children:R.event},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:[" - ",R.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(Q==="matcher"||Q==="command"||Q==="confirm")&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(C0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="matcher"&&t(j0,{flexDirection:"column",children:[t(j0,{children:[t(C0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),t(YZ,{value:_,onChange:H,onSubmit:Z0,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(C0,{color:Z.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(Q==="command"||Q==="confirm")&&t(j0,{marginBottom:1,children:t(C0,{children:["Matcher: ",t(C0,{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(C0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:t(YZ,{value:W,onChange:b,onSubmit:z0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:[t(C0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),fG.map((f,E)=>t(C0,{color:Z.colors.muted,children:["• ",f]},E,!0,void 0,this))]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="location"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[t(C0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),t(C0,{children:" "},void 0,!1,void 0,this),t(C0,{children:[" ","Event: ",R.event," - ",R.description]},void 0,!0,void 0,this),t(C0,{children:[" Matcher: ",_||"(all)"]},void 0,!0,void 0,this),t(C0,{children:[" Command: ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(C0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:E4.map((f,E)=>t(j0,{children:[t(C0,{color:E===q?Z.colors.primary:void 0,bold:E===q,children:[E===q?"> ":" ",E+1,". ",f.name]},void 0,!0,void 0,this),t(C0,{color:Z.colors.muted,children:[" ",f.description]},void 0,!0,void 0,this)]},f.location,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="confirm"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[t(C0,{bold:!0,children:["Saving hook to ",k.description,"..."]},void 0,!0,void 0,this),t(C0,{children:" "},void 0,!1,void 0,this),t(C0,{children:["Event: ",R.event]},void 0,!0,void 0,this),t(C0,{children:["Matcher: ",_||"(all tools)"]},void 0,!0,void 0,this),t(C0,{children:["Command: ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.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),M&&t(j0,{marginTop:1,children:t(C0,{color:Z.colors.error,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as MZ}from"ahooks";import{Box as nG,Text as tG}from"ink";import sG from"react";import{useMemoizedFn as m4}from"ahooks";import N2 from"chalk";import{Text as rG}from"ink";import{useEffect as PZ,useRef as B8}from"react";var g4={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};function XZ($){return typeof $==="string"&&/^[0-9a-f]{32}$/.test($)}function vG($){if(!XZ($))throw Error("TUI composer ready nonce must be 32 lowercase hexadecimal chars");return`\x1B]99;blade-composer-ready=${$}\x07`}function VG($=process.env){let J=$.BLADE_TUI_COMPOSER_READY_NONCE;if(!XZ(J))return;return vG(J)}function QZ($=process.env,J=(Y)=>process.stdout.write(Y)){let Y=VG($);if(!Y)return!1;return J(Y),!0}var O2="\x1B",jG=`${O2}[200~`,EG=`${O2}[201~`,hG="[200~",gG="[201~",mG=[`${O2}[I`,`${O2}[O`,"[I","[O"],KZ=`${O2}[?2004h`,zZ=`${O2}[?2004l`,OJ=`${O2}[?1004l`,pG=[jG,hG],xG=[EG,gG];function qZ(){return{pasteBuffer:null,pasteOverflowed:!1}}function GZ($,J){let Y;for(let X of J){let Z=$.indexOf(X);if(Z===-1)continue;if(!Y||Z<Y.index||Z===Y.index&&X.length>Y.marker.length)Y={index:Z,marker:X}}return Y}function UZ($){return mG.some((J)=>$===J)}function _Z($,J){let Y=J,X=$.pasteBuffer,Z=$.pasteOverflowed,Q=X!==null,G=[];while(Y.length>0){if(X!==null){let K=GZ(Y,xG);if(!K){if(X.length+Y.length>_J)X="",Z=!0;else if(!Z)X+=Y;Y="";break}if(X.length+K.index>_J)Z=!0;else if(!Z)X+=Y.slice(0,K.index),G.push({kind:"paste",text:X});X=null,Z=!1,Q=!0,Y=Y.slice(K.index+K.marker.length);continue}let U=GZ(Y,pG);if(!U){if(UZ(Y))Q=!0;else G.push({kind:"text",text:Y});Y="";break}let z=Y.slice(0,U.index);if(z&&!UZ(z))G.push({kind:"text",text:z});X="",Z=!1,Q=!0,Y=Y.slice(U.index+U.marker.length)}if(J.length===0&&X!==null)Q=!0;return{handled:Q,state:{pasteBuffer:X,pasteOverflowed:Z},segments:G}}import{execSync as i2}from"node:child_process";import{existsSync as cG,readFileSync as NJ}from"node:fs";import{basename as OZ,isAbsolute as uG}from"node:path";function NZ($){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 WZ(){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:(X)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${X}" 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:(X)=>`rm -f "${X}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(X)=>`xclip -selection clipboard -t image/png -o > "${X}" || wl-paste --type image/png > "${X}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(X)=>`rm -f "${X}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(X)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${X.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(X)=>`del /f "${X}"`}};return{commands:Y[$]||Y.linux,screenshotPath:J[$]||J.linux}}function dG(){let{commands:$}=WZ();try{return i2($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function HZ($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function FZ($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function WJ($){let J=HZ($.trim()),Y=FZ(J);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function lG($){let J=HZ($.trim()),Y=FZ(J);if(WJ(Y))return Y;return null}async function LZ($){let J=lG($);if(!J)return null;let Y;try{if(uG(J))Y=NJ(J);else{let G=dG();if(G&&J===OZ(G))Y=NJ(G);else return null}}catch(G){return console.error("Failed to read image file:",G),null}let X=Y.toString("base64"),Z=NZ(X),Q=OZ(J);return{path:J,base64:X,mediaType:Z,filename:Q}}async function BZ(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=J[$]||J.linux;try{return i2(Y,{encoding:"utf-8"})||null}catch{return null}}async function wZ(){let{commands:$,screenshotPath:J}=WZ();try{if(i2($.checkImage,{stdio:"ignore"}),i2($.saveImage(J),{stdio:"ignore"}),!cG(J))return null;let X=NJ(J).toString("base64"),Z=NZ(X);return i2($.deleteFile(J),{stdio:"ignore"}),{base64:X,mediaType:Z}}catch(Y){try{i2($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as oG}from"react/jsx-dev-runtime";var aG=/\r\n/g,iG=/\r/g;function HJ($){if(!$.includes("\r"))return $;return $.replace(aG,`
|
|
152
|
-
`).replace(
|
|
151
|
+
`))},Z0=()=>{G("command")},z0=()=>{if(!W.trim()){w("Command cannot be empty");return}w(null),G("location")},J0=async()=>{C(!0),w(null);try{let f=E$.getInstance(),E=await import("node:fs/promises"),m=await import("node:path"),Y0=await import("node:os"),c={matcher:_.trim()?{tools:_.trim()}:{},hooks:[{type:"command",command:W.trim()}]},d;switch(k.location){case"local":d=m.join($,".blade","settings.local.json");break;case"project":d=m.join($,".blade","settings.json");break;case"user":d=m.join(Y0.homedir(),".blade","settings.json");break}await E.mkdir(m.dirname(d),{recursive:!0});let a={};try{let y=await E.readFile(d,"utf-8");a=JSON.parse(y)}catch{}let W0=a.hooks||{},F0=W0[R.event]||[],T0={...W0,enabled:!0,[R.event]:[...F0,c]};if(a.hooks=T0,await E.writeFile(d,JSON.stringify(a,null,2),"utf-8"),await f.reloadConfig($),X)X({event:R.event,matcher:_.trim(),command:W.trim()});Y()}catch(f){w(`Failed to save hook: ${f instanceof Error?f.message:"Unknown error"}`),C(!1)}};return t(j0,{flexDirection:"column",padding:1,children:[t(j0,{marginBottom:1,children:t(C0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginBottom:1,children:t(C0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),F&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(C0,{children:F},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="action"&&!F&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",marginTop:1,children:L8.map((f,E)=>t(j0,{children:[t(C0,{color:E===U?Z.colors.primary:void 0,bold:E===U,children:[E===U?"> ":" ",f.action]},void 0,!0,void 0,this),t(C0,{color:Z.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.action,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="event"&&t(j0,{flexDirection:"column",children:[t(C0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:h4.map((f,E)=>t(j0,{children:[t(C0,{color:E===K?Z.colors.primary:void 0,bold:E===K,children:[E===K?"> ":" ",f.event]},void 0,!0,void 0,this),t(C0,{color:Z.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.event,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q!=="event"&&t(j0,{marginBottom:1,children:t(C0,{children:["Event:"," ",t(C0,{bold:!0,color:Z.colors.primary,children:R.event},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:[" - ",R.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(Q==="matcher"||Q==="command"||Q==="confirm")&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(C0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="matcher"&&t(j0,{flexDirection:"column",children:[t(j0,{children:[t(C0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),t(YZ,{value:_,onChange:H,onSubmit:Z0,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(C0,{color:Z.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(Q==="command"||Q==="confirm")&&t(j0,{marginBottom:1,children:t(C0,{children:["Matcher: ",t(C0,{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(C0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:t(YZ,{value:W,onChange:b,onSubmit:z0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:[t(C0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),vG.map((f,E)=>t(C0,{color:Z.colors.muted,children:["• ",f]},E,!0,void 0,this))]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="location"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[t(C0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),t(C0,{children:" "},void 0,!1,void 0,this),t(C0,{children:[" ","Event: ",R.event," - ",R.description]},void 0,!0,void 0,this),t(C0,{children:[" Matcher: ",_||"(all)"]},void 0,!0,void 0,this),t(C0,{children:[" Command: ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(C0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:E4.map((f,E)=>t(j0,{children:[t(C0,{color:E===q?Z.colors.primary:void 0,bold:E===q,children:[E===q?"> ":" ",E+1,". ",f.name]},void 0,!0,void 0,this),t(C0,{color:Z.colors.muted,children:[" ",f.description]},void 0,!0,void 0,this)]},f.location,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="confirm"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[t(C0,{bold:!0,children:["Saving hook to ",k.description,"..."]},void 0,!0,void 0,this),t(C0,{children:" "},void 0,!1,void 0,this),t(C0,{children:["Event: ",R.event]},void 0,!0,void 0,this),t(C0,{children:["Matcher: ",_||"(all tools)"]},void 0,!0,void 0,this),t(C0,{children:["Command: ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.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),M&&t(j0,{marginTop:1,children:t(C0,{color:Z.colors.error,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as MZ}from"ahooks";import{Box as tG,Text as sG}from"ink";import eG from"react";import{useMemoizedFn as m4}from"ahooks";import N2 from"chalk";import{Text as aG}from"ink";import{useEffect as PZ,useRef as B8}from"react";var g4={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};function XZ($){return typeof $==="string"&&/^[0-9a-f]{32}$/.test($)}function VG($){if(!XZ($))throw Error("TUI composer ready nonce must be 32 lowercase hexadecimal chars");return`\x1B]99;blade-composer-ready=${$}\x07`}function jG($=process.env){let J=$.BLADE_TUI_COMPOSER_READY_NONCE;if(!XZ(J))return;return VG(J)}function QZ($=process.env,J=(Y)=>process.stdout.write(Y)){let Y=jG($);if(!Y)return!1;return J(Y),!0}var O2="\x1B",EG=`${O2}[200~`,hG=`${O2}[201~`,gG="[200~",mG="[201~",pG=[`${O2}[I`,`${O2}[O`,"[I","[O"],KZ=`${O2}[?2004h`,zZ=`${O2}[?2004l`,OJ=`${O2}[?1004l`,xG=[EG,gG],cG=[hG,mG];function qZ(){return{pasteBuffer:null,pasteOverflowed:!1}}function GZ($,J){let Y;for(let X of J){let Z=$.indexOf(X);if(Z===-1)continue;if(!Y||Z<Y.index||Z===Y.index&&X.length>Y.marker.length)Y={index:Z,marker:X}}return Y}function UZ($){return pG.some((J)=>$===J)}function _Z($,J){let Y=J,X=$.pasteBuffer,Z=$.pasteOverflowed,Q=X!==null,G=[];while(Y.length>0){if(X!==null){let K=GZ(Y,cG);if(!K){if(X.length+Y.length>_J)X="",Z=!0;else if(!Z)X+=Y;Y="";break}if(X.length+K.index>_J)Z=!0;else if(!Z)X+=Y.slice(0,K.index),G.push({kind:"paste",text:X});X=null,Z=!1,Q=!0,Y=Y.slice(K.index+K.marker.length);continue}let U=GZ(Y,xG);if(!U){if(UZ(Y))Q=!0;else G.push({kind:"text",text:Y});Y="";break}let z=Y.slice(0,U.index);if(z&&!UZ(z))G.push({kind:"text",text:z});X="",Z=!1,Q=!0,Y=Y.slice(U.index+U.marker.length)}if(J.length===0&&X!==null)Q=!0;return{handled:Q,state:{pasteBuffer:X,pasteOverflowed:Z},segments:G}}import{execSync as i2}from"node:child_process";import{existsSync as uG,readFileSync as NJ}from"node:fs";import{basename as OZ,isAbsolute as dG}from"node:path";function NZ($){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 WZ(){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:(X)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${X}" 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:(X)=>`rm -f "${X}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(X)=>`xclip -selection clipboard -t image/png -o > "${X}" || wl-paste --type image/png > "${X}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(X)=>`rm -f "${X}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(X)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${X.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(X)=>`del /f "${X}"`}};return{commands:Y[$]||Y.linux,screenshotPath:J[$]||J.linux}}function lG(){let{commands:$}=WZ();try{return i2($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function HZ($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function FZ($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function WJ($){let J=HZ($.trim()),Y=FZ(J);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function rG($){let J=HZ($.trim()),Y=FZ(J);if(WJ(Y))return Y;return null}async function LZ($){let J=rG($);if(!J)return null;let Y;try{if(dG(J))Y=NJ(J);else{let G=lG();if(G&&J===OZ(G))Y=NJ(G);else return null}}catch(G){return console.error("Failed to read image file:",G),null}let X=Y.toString("base64"),Z=NZ(X),Q=OZ(J);return{path:J,base64:X,mediaType:Z,filename:Q}}async function BZ(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=J[$]||J.linux;try{return i2(Y,{encoding:"utf-8"})||null}catch{return null}}async function wZ(){let{commands:$,screenshotPath:J}=WZ();try{if(i2($.checkImage,{stdio:"ignore"}),i2($.saveImage(J),{stdio:"ignore"}),!uG(J))return null;let X=NJ(J).toString("base64"),Z=NZ(X);return i2($.deleteFile(J),{stdio:"ignore"}),{base64:X,mediaType:Z}}catch(Y){try{i2($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as nG}from"react/jsx-dev-runtime";var iG=/\r\n/g,oG=/\r/g;function HJ($){if(!$.includes("\r"))return $;return $.replace(iG,`
|
|
152
|
+
`).replace(oG,`
|
|
153
153
|
`)}function AZ($,J,Y){let X=Math.max(0,Math.min(Y,J.length)),Z=J.slice(0,X),Q=J.slice(X);return{newValue:Z+$+Q,newCursorPosition:X+$.length}}function bZ({value:$,placeholder:J="",focus:Y=!0,onChange:X,cursorPosition:Z,onChangeCursorPosition:Q,onPaste:G,onImagePaste:U,disabledKeys:z=[]}){let K=B8(qZ()),O=B8($),q=B8(Z),N=B8(null),_=B8(!1);PZ(()=>{O.current=$,q.current=Z},[$,Z]),PZ(()=>{if(Z>$.length)Q($.length)},[$,Z,Q]);let H=m4((F,A)=>{let L=O.current,R=q.current;if(O.current=F,q.current=A,F!==L)X(F);if(A!==R)Q(A)}),W=m4((F)=>{if(!F)return;let{newValue:A,newCursorPosition:L}=AZ(HJ(F),O.current,q.current);H(A,L)}),b=m4(async(F)=>{let A=HJ(F);if(!A)return;if(U&&WJ(A))try{let R=await LZ(A);if(R){let k=await U(R.base64,R.mediaType,R.filename);if(k?.prompt)W(k.prompt);return}}catch(R){console.error("Failed to process image path:",R)}if((A.length>g4.LARGE_INPUT_THRESHOLD||A.includes(`
|
|
154
154
|
`))&&G){let R=await G(A);if(R?.prompt){W(R.prompt);return}}W(A)}),M=m4((F)=>{let A=N.current;if(!A){try{let R=F();if(!R)return;let k=R.catch(()=>{return});N.current=k,k.finally(()=>{if(N.current===k)N.current=null})}catch{}return}let L=A.then(F).then(()=>{return}).catch(()=>{return});N.current=L,L.finally(()=>{if(N.current===L)N.current=null})});N0((F,A)=>{return M(()=>{let L=HJ(F),R=_Z(K.current,L);if(K.current=R.state,R.handled)return(async()=>{for(let o of R.segments)if(o.kind==="paste")await b(o.text);else W(o.text)})();if(z.some((o)=>A[o])||A.ctrl&&F==="c"||A.ctrl&&F==="l"||A.ctrl&&F==="t"||A.ctrl&&F==="o"||A.meta&&F==="l"||A.meta&&F==="t"||A.meta&&F==="o"||A.shift&&A.tab||L==="?"&&O.current==="")return;let T=O.current,I=q.current,P=I,j=T;if(A.leftArrow)P--;else if(A.rightArrow)P++;else if(A.backspace||A.delete){if(F===""){if(I>0)j=T.slice(0,I-1)+T.slice(I,T.length),P--}else if(I<T.length)j=T.slice(0,I)+T.slice(I+1,T.length)}else if(A.ctrl&&L==="a")P=0;else if(A.ctrl&&L==="e")P=T.length;else if(A.ctrl&&L==="k")j=T.slice(0,I);else if(A.ctrl&&L==="u")j=T.slice(I),P=0;else if(A.ctrl&&L==="w"){let u=T.slice(0,I).match(/\s*\S+\s*$/);if(u){let Z0=u[0].length;j=T.slice(0,I-Z0)+T.slice(I),P-=Z0}}else if(A.ctrl&&L==="v"){let o=process.platform==="darwin";return(async()=>{if(U){let Z0=await wZ();if(Z0){let z0=await U(Z0.base64,Z0.mediaType,"clipboard.png");if(z0?.prompt)W(z0.prompt);return}}if(o)return;let u=await BZ();if(u)await b(u)})()}else if(A.pageUp)P=0;else if(A.pageDown)P=T.length;else if(L===`
|
|
155
155
|
`&&(A.shift||A.meta)){let{newValue:o,newCursorPosition:u}=AZ(L,T,I);H(o,u);return}else if(!A.ctrl&&!A.meta){if(G&&(L.length>g4.LARGE_INPUT_THRESHOLD||L.includes(`
|
|
156
|
-
`)))return b(L);j=T.slice(0,I)+L+T.slice(I,T.length),P+=L.length}if(P<0)P=0;if(P>j.length)P=j.length;H(j,P)}),!0},{isActive:Y,priority:0,onRegistered:()=>{if(_.current)return;_.current=QZ()}});let w=Y,B=$,C=J?N2.grey(J):void 0;if(w)if(C=J.length>0?N2.inverse(J[0])+N2.grey(J.slice(1)):N2.inverse(" "),$.length===0)B=N2.inverse(" ");else{B="";for(let F=0;F<$.length;F++)if(F===Z&&Z<$.length)B+=N2.inverse($[F]);else B+=$[F];if(Z>=$.length)B+=N2.inverse(" ")}return
|
|
157
|
-
`).length,H=N.length,W=500,b=10;if(H>500||_>10){let M=Z(N),w=N.slice(0,30).replace(/\n/g," "),B=`${H} chars, ${_} lines: ${w}...`;return{prompt:`${B4(M)}${B}${M6()}`}}return{}}),q=MZ(async(N,_,H)=>{try{let W=Q(N,_);return{prompt:`${B4(W)}[Image #${W}]${M6()}`}}catch(W){return console.error("[Image Paste] Failed to process image:",W),{prompt:`[Image paste failed: ${W instanceof Error?W.message:"Unknown error"}] `}}});return FJ(nG,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[FJ(tG,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),FJ(bZ,{value:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:X,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 o2,Text as f$}from"ink";import UU,{useEffect as fZ,useState as vZ}from"react";import{useEffect as ZU,useRef as XU,useState as QU}from"react";import{useEffect as eG,useRef as $U,useState as JU}from"react";var YU=15000,RZ="等待用户确认...",CZ=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],yZ=["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 IZ(){if(Math.random()<0.25){let Y=Math.floor(Math.random()*yZ.length);return yZ[Y]}let J=Math.floor(Math.random()*CZ.length);return CZ[J]}function SZ($,J,Y=!1){let[X,Z]=JU(""),Q=$U(Y);return Q.current=Y,eG(()=>{if(J){Z(RZ);return}if(!$){Z("");return}Z((U)=>U===""||U===RZ?IZ():U);let G=setInterval(()=>{if(!Q.current)Z(IZ())},YU);return()=>{clearInterval(G)}},[$,J]),X}function kZ($,J=!1,Y=!1){let[X,Z]=QU(0),Q=XU(null),G=SZ($,J,Y);return ZU(()=>{if(!$){Z(0),Q.current=null;return}if(Y)return;if(Q.current===null)Q.current=Date.now();let U=setInterval(()=>{if(Q.current!==null){let z=Math.floor((Date.now()-Q.current)/1000);Z(z)}},1000);return()=>{clearInterval(U)}},[$,Y]),{currentPhrase:G,elapsedTime:X}}function GU($){let J=Math.max(0,Math.floor($/1000));if(J<60)return`${J}s`;let Y=Math.floor(J/60),X=J%60;if(Y<60)return`${Y}m ${X}s`;return`${Math.floor(Y/60)}h ${Y%60}m ${X}s`}function DZ($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let X=Y.activeTools.length+Y.activeToolOverflow,Z=Y.phase==="starting"?"正在启动任务":Y.phase==="thinking"?"正在思考":Y.phase==="responding"?"正在生成回复":Y.phase==="compacting"?"正在压缩上下文":Y.phase==="continuing"?"正在推进下一步":`正在执行 ${X} 个工具`,Q=Y.activeTools.slice(0,2).map((K)=>K.progress!==void 0&&K.total!==void 0?`${K.name} ${K.progress}/${K.total}`:K.name),G=Math.max(0,Y.activeTools.length-Q.length+Y.activeToolOverflow);if(G>0)Q.push(`+${G}`);let U=[...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=GU(J-Y.startedAt);return{primary:Z,secondary:U.join(" · "),compact:Y.phase==="executing_tools"?`执行工具 · ${X} 个 · ${z}`:`${Z} · ${z}`,elapsed:z}}import{jsxDEV as q$,Fragment as zU}from"react/jsx-dev-runtime";var LJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],KU=80;function VZ($){if($<60)return`${$}s`;let J=Math.floor($/60),Y=$%60;return`${J}m ${Y}s`}var jZ=UU.memo(({message:$,paused:J=!1})=>{let Y=v2(),X=h8(),Z=v8(),Q=nJ(),G=tJ(),U=Y||!X,[z,K]=vZ(0),[O,q]=vZ(Date.now()),N=D0(),H=m2()>=KU,{currentPhrase:W,elapsedTime:b}=kZ(U,!1,J);if(fZ(()=>{if(!U||J){K(0);return}let F=setInterval(()=>{K((A)=>(A+1)%LJ.length)},150);return()=>clearInterval(F)},[U,J]),fZ(()=>{if(!Z?.snapshot?.nextActionAt&&!Q?.snapshot||J)return;q(Date.now());let F=setInterval(()=>q(Date.now()),1000);return()=>clearInterval(F)},[J,Z?.snapshot?.nextActionAt,Q?.snapshot]),!U)return null;let M=S4(Z,O),w=DZ(Q,O),C=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||M?.primary||w?.primary||$||W||"正在思考中...";if(H)return q$(o2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.warning,bold:!0,children:LJ[z]},void 0,!1,void 0,this),q$(f$,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this),M?.secondary&&q$(f$,{color:N.colors.info,children:M.secondary},void 0,!1,void 0,this),!M?.secondary&&w?.secondary&&q$(f$,{color:N.colors.info,children:w.secondary},void 0,!1,void 0,this),(w||b>0)&&q$(zU,{children:[q$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),q$(f$,{color:N.colors.info,children:["已用时:"," ",w?.elapsed??VZ(b)]},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$(o2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[q$(o2,{flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.warning,bold:!0,children:LJ[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),M?.secondary&&q$(o2,{marginLeft:2,children:q$(f$,{color:N.colors.info,children:M.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),!M?.secondary&&w?.secondary&&q$(o2,{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||b>0)&&q$(o2,{marginLeft:2,flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.info,children:["已用时: ",w?.elapsed??VZ(b)]},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 c4,Text as $$,useStdout as qU}from"ink";import _U from"ink-text-input";import OU,{useCallback as p4,useEffect as NU,useMemo as WU,useState as W2}from"react";import{jsxDEV as f0}from"react/jsx-dev-runtime";var mZ=OU.memo(({details:$,onComplete:J})=>{let{stdout:Y}=qU(),X=Y.columns||80,Z=X$()==="confirmation-prompt",Q=s0(!1),G=$.fields??[],[U,z]=W2("field"),[K,O]=W2(0),[q,N]=W2(()=>EZ($)),[_,H]=W2(""),[W,b]=W2(0),[M,w]=W2([]),[B,C]=W2(),F=G[K],A=WU(()=>HU(F),[F]);NU(()=>{if(!F)return;let I=q[F.name];H(typeof I==="string"||typeof I==="number"?String(I):""),w(Array.isArray(I)?[...I]:[]);let P=A.findIndex((j)=>j.value===String(I));b(P>=0?P:0),C(void 0)},[q,F,A]);let L=p4((I)=>{if(N(I),K<G.length-1){O((P)=>P+1);return}z("review")},[K,G.length]),R=p4((I)=>{if(!F)return;let P={...q};if(I===void 0)delete P[F.name];else P[F.name]=I;L(P)},[q,F,L]),k=p4((I)=>{if(!F)return;try{R(hZ(F,I))}catch(P){C(P instanceof Error?P.message:String(P))}},[F,R]),T=p4(()=>{try{let I=gZ($,{action:"accept",content:q});J({action:I.action,...I.content?{content:I.content}:{}})}catch(I){C(I instanceof Error?I.message:String(I))}},[q,$,J]);if(N0((I,P)=>{if(P.ctrl&&I==="c"||P.meta&&I==="c"){Q();return}if(P.escape){J({action:"cancel"});return}if($.mode==="url"){if(I.toLowerCase()==="y")J({action:"accept"},!0);else if(I.toLowerCase()==="n")J({action:"decline"});return}if(U==="review"){if(I.toLowerCase()==="y"||P.return)T();else if(I.toLowerCase()==="e")O(0),z("field");else if(I.toLowerCase()==="d")J({action:"decline"});return}if(!F){if(P.return)T();return}if(BJ(F))return;if(I.toLowerCase()==="d"){J({action:"decline"});return}if(P.upArrow){b((j)=>j>0?j-1:Math.max(A.length-1,0));return}if(P.downArrow||P.tab){b((j)=>j<A.length-1?j+1:0);return}if(I===" "&&F.type==="multi-select"){let j=A[W];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")R(M);else{let j=A[W];if(j)R(j.typedValue)}},{isActive:Z}),$.mode==="url")return f0(x4,{width:X,color:"yellow",children:[f0($$,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),f0($$,{children:$.message},void 0,!1,void 0,this),f0($$,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),f0($$,{children:["Domain: ",f0($$,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0($$,{wrap:"wrap",children:["URL: ",f0($$,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0($$,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(U==="review")return f0(x4,{width:X,color:"green",children:[f0($$,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),f0($$,{children:$.message},void 0,!1,void 0,this),G.map((I)=>f0($$,{children:[I.title,": ",LU(q[I.name])]},I.name,!0,void 0,this)),B&&f0($$,{color:"red",children:B},void 0,!1,void 0,this),f0($$,{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(x4,{width:X,color:"cyan",children:[f0($$,{children:$.message},void 0,!1,void 0,this),f0($$,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),f0($$,{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(x4,{width:X,color:"cyan",children:[f0($$,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),f0($$,{children:$.message},void 0,!1,void 0,this),f0(c4,{flexDirection:"column",marginTop:1,children:[f0($$,{bold:!0,children:[F.title,F.required?" *":""]},void 0,!0,void 0,this),F.description&&f0($$,{color:"gray",children:F.description},void 0,!1,void 0,this),f0($$,{color:"gray",children:FU(F)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),BJ(F)?f0(c4,{children:[f0($$,{color:"cyan",children:"> "},void 0,!1,void 0,this),f0(_U,{value:_,onChange:H,onSubmit:k,focus:Z,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(c4,{flexDirection:"column",children:A.map((I,P)=>{let j=F.type==="multi-select"&&M.includes(I.value);return f0($$,{color:W===P?"yellow":void 0,children:[W===P?"> ":" ",F.type==="multi-select"?j?"(*) ":"( ) ":"",I.label]},I.value,!0,void 0,this)})},void 0,!1,void 0,this),B&&f0($$,{color:"red",children:B},void 0,!1,void 0,this),f0($$,{color:"gray",children:[BJ(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($$,{color:"gray",children:["Field ",K+1," of ",G.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function x4({children:$,width:J,color:Y}){return f0(c4,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(J-4,88),children:$},void 0,!1,void 0,this)}function BJ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function HU($){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 FU($){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 LU($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import d4 from"ansi-escapes";import{Box as H2,Static as yU,useStdout as IU}from"ink";import SU,{useEffect as S1,useMemo as TJ,useRef as a1,useState as RJ}from"react";import{Box as BU,Text as pZ}from"ink";import wU from"react";import{jsxDEV as wJ}from"react/jsx-dev-runtime";var PJ=wU.memo(({collapsedCount:$})=>{let J=D0();if($<=0)return null;let Y=J.colors.text.muted;return wJ(BU,{flexDirection:"row",marginBottom:1,children:[wJ(pZ,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),wJ(pZ,{color:Y,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});PJ.displayName="CollapsedHistorySummary";import{Box as w8,Text as P8}from"ink";import PU from"ink-big-text";import AU from"ink-gradient";import bU from"react";import{jsxDEV as n$}from"react/jsx-dev-runtime";var cZ=bU.memo(()=>{return n$(w8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[n$(w8,{flexDirection:"column",children:n$(AU,{name:"pastel",children:n$(PU,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),n$(w8,{marginBottom:1,children:n$(P8,{color:"white",dimColor:!0,children:xZ()},void 0,!1,void 0,this)},void 0,!1,void 0,this),n$(w8,{flexDirection:"column",marginBottom:1,children:[n$(w8,{marginBottom:1,children:n$(P8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n$(P8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),n$(P8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),n$(P8,{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 u4,Text as AJ}from"ink";import uZ from"react";import{jsxDEV as r1}from"react/jsx-dev-runtime";var dZ=uZ.memo(({tasks:$,visible:J=!0,compact:Y=!1})=>{let{colors:X}=D0();if(!J||$.length===0)return null;let Z={total:$.length,completed:$.filter((Q)=>Q.status==="completed").length,inProgress:$.filter((Q)=>Q.status==="in_progress").length};return r1(u4,{flexDirection:"column",borderStyle:"single",borderColor:X.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[r1(u4,{marginBottom:Y?0:1,children:[r1(AJ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),r1(AJ,{color:X.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r1(u4,{flexDirection:"column",children:$.map((Q,G)=>r1(MU,{task:Q,compact:Y},Q.id||G,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),MU=uZ.memo(({task:$,compact:J})=>{let Y,X=!1,Z;switch($.status){case"completed":Y="[OK]",X=!0,Z=$.subject;break;case"in_progress":Y=">",X=!1,Z=$.activeForm||$.subject;break;case"pending":default:Y="-",X=!0,Z=$.subject;break}return r1(u4,{paddingY:J?0:0,children:r1(AJ,{dimColor:X,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as bJ,Text as n2}from"ink";import TU,{useMemo as lZ}from"react";import{jsxDEV as I1}from"react/jsx-dev-runtime";function RU($,J=60){if(!$)return"";let Y=$.split(`
|
|
158
|
-
`)[0]||"";if(Y.length<=J)return Y;return`${Y.slice(0,J)}...`}function
|
|
159
|
-
`).length}var MJ=TU.memo(({content:$,isStreaming:J=!1,isExpanded:Y})=>{let X=D0(),Z=lZ(()=>CU($),[$]),Q=lZ(()=>RU($),[$]),G=X.colors.info,U=X.colors.muted;return I1(bJ,{flexDirection:"column",marginBottom:1,children:[I1(bJ,{flexDirection:"row",children:[I1(n2,{color:G,children:Y?"v":">"},void 0,!1,void 0,this),I1(n2,{children:" "},void 0,!1,void 0,this),I1(n2,{color:U,children:["Thinking",J?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!J&&Q&&I1(n2,{color:U,children:[" - ",Q]},void 0,!0,void 0,this),I1(n2,{color:U,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&I1(bJ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:I1(n2,{color:U,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});MJ.displayName="ThinkingBlock";import{jsxDEV as v$}from"react/jsx-dev-runtime";var kU=({active:$=!0})=>{let J=f8(),Y=a8(),X=i8(),Z=L9(),Q=v2(),G=J9(),U=K9(),z=r8(),K=F9(),O=rJ(),q=w9(),N=B9(),{width:_,height:H}=d1(),{stdout:W}=IU(),b=p1(),[M,w]=RJ(null),[B,C]=RJ([]),[F,A]=RJ(new Set),L=a1(N),R=a1(null),k=a1(0),T=a1(0),I=a1(new Set),P=a1(new Set),j=a1([]),o=a1(null);S1(()=>{if(L.current!==N){if(L.current=N,!$)return;if(Y1())a$();if(W)W.write(d4.clearTerminal);b.incrementClearCount()}},[$,N,W,b]);let u=J,Z0=Z;S1(()=>{if(!Z||Q){o.current=null;return}if(o.current===Z)return;if(o.current=Z,Y1())a$();if($&&W)W.write(d4.eraseScreen+d4.cursorTo(0,0));I.current=new Set,P.current=new Set(u.filter((c)=>c.role==="tool").map((c)=>c.id)),R.current=null,k.current=0,T.current=0,j.current=[],C([]),A(new Set),b.incrementClearCount(),b.clearFinalizingStreamingMessageId()},[Z,Q,W,b,u,$]);let z0=Y??Z;S1(()=>{if($&&Y1())a$();R.current=null,k.current=0,T.current=0,I.current=new Set,P.current=new Set(u.filter((c)=>c.role==="tool").map((c)=>c.id)),j.current=[],C([]),A(new Set)},[O]),S1(()=>{if(!z0)return;if(R.current===z0)return;R.current=z0,k.current=0,T.current=0,P.current=new Set(u.filter((c)=>c.role==="tool").map((c)=>c.id)),j.current=[],C([])},[z0,O]),S1(()=>{if(!z0)return;let c=CJ(z0);if(!c||c.length<=k.current)return;let d=c.slice(k.current);k.current=c.length;let a=d,W0=j.current;if(W0.length>0)if(a.some((D)=>D.type!=="empty"))a=[...W0,...a],j.current=[];else{j.current=[...W0,...a];return}let F0=a.length;while(F0>0&&a[F0-1].type==="empty")F0-=1;if(F0!==a.length)j.current=a.slice(F0),a=a.slice(0,F0);if(a.length===0)return;let T0=T.current;T.current+=1;let y=T0>0;if(Y1())a$();A((D)=>{if(!z0||D.has(z0))return D;let p=new Set(D);return p.add(z0),p}),C((D)=>[...D,v$(H2,{flexDirection:"column",children:v$(C1,{content:"",role:"assistant",terminalWidth:_,isPending:!1,hidePrefix:y,noMargin:!0,blocksOverride:a,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${z0}-${T0}`,!1,void 0,this)])},[z0,X.version,_,O,$]),S1(()=>{if(!z0)return;let c=P.current,d=u.filter((a)=>a.role==="tool"&&!c.has(a.id)&&!I.current.has(a.id));if(d.length===0)return;if($&&Y1())a$();for(let a of d)I.current.add(a.id);C((a)=>[...a,...d.map((W0)=>v$(H2,{flexDirection:"column",children:v$(C1,{content:W0.content,role:W0.role,terminalWidth:_,metadata:W0.metadata,isPending:!1,messageId:W0.id},void 0,!1,void 0,this)},`streaming-tool-${W0.id}`,!1,void 0,this))])},[$,z0,u,_]),S1(()=>{if(!$){if(Y1())a$();return}if(!z0){if(Y1())a$();return}if(!Y1())U3(_,H);else K3(_,H);let c=rZ(z0);if(!c||c.lines.length===0)return;let a=Math.max(1,H-8),W0=Math.max(0,c.lines.length-a),F0=c.lines.slice(-a),T0=(CJ(z0)?.length??0)>0;z3(F0,W0,c.mode,T0)},[z0,X.version,H,_,$]),S1(()=>{if(!z0&&Y1())a$()},[z0]),S1(()=>{if(M===null&&u.length>q){if(w(u.length),$&&Y1())a$();if($&&W)W.write(d4.clearTerminal);b.incrementClearCount()}},[u.length,q,M,W,b,$]);let J0=TJ(()=>{return G.some((c)=>c.status==="pending"||c.status==="in_progress")},[G]),f=N?0:M??0,E=f,m=TJ(()=>{let c=[];if(c.push(v$(cZ,{},"header",!1,void 0,this)),E>0)c.push(v$(PJ,{collapsedCount:E},"collapsed-summary",!1,void 0,this));for(let d=f;d<u.length;d++){let a=u[d];if(Z0&&a.id===Z0)continue;if(a.role==="tool"&&I.current.has(a.id))continue;if(a.role==="assistant"&&F.has(a.id))continue;c.push(v$(H2,{flexDirection:"column",children:v$(C1,{content:a.content,role:a.role,terminalWidth:_,metadata:a.metadata,isPending:!1,messageId:a.id},void 0,!1,void 0,this)},a.id,!1,void 0,this))}return c},[u,f,E,_,Z0,F]),Y0=TJ(()=>B.length>0?[...m,...B]:m,[m,B]);return v$(H2,{flexDirection:"column",paddingX:2,children:v$(H2,{flexDirection:"column",children:[v$(yU,{items:Y0,children:(c)=>c},O,!1,void 0,this),z&&v$(H2,{marginBottom:1,children:v$(MJ,{content:z,isStreaming:Q,isExpanded:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&J0&&v$(H2,{marginTop:1,children:v$(dZ,{tasks:G,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)},aZ=SU.memo(kU);import{useMemoizedFn as l4,useMount as DU}from"ahooks";import{Box as t$,Text as v0,useFocus as fU,useFocusManager as vU}from"ink";import VU from"ink-select-input";import{memo as jU,useMemo as EU,useState as r4}from"react";import{jsxDEV as L0,Fragment as mU}from"react/jsx-dev-runtime";var hU=({isSelected:$})=>L0(t$,{marginRight:1,children:L0(v0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),gU=({isSelected:$,label:J})=>L0(v0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),iZ=jU(({onClose:$,onEdit:J})=>{let Y=z9(),X=m8()??"",{isFocused:Z}=fU({id:"model-selector"}),Q=vU(),[G,U]=r4(""),[z,K]=r4(!1),[O,q]=r4(null),N=s0(!1),[_]=r4(()=>{let L=process.stdout?.columns||80;return Math.max(20,L-8)});DU(()=>{if(Q?.focus("model-selector"),Y.length>0)U(Y[0].id)}),N0((L,R)=>{if(z)return;if(R.ctrl&&L==="c"||R.meta&&L==="c"){N();return}if(R.escape){$();return}if(!Z)return;if(L==="d"||L==="D"){W();return}if((L==="e"||L==="E")&&J)b()},{isActive:!0});let H=l4(async(L)=>{if(z)return;let R=L.value;if(R===X){$();return}K(!0),q(null);try{await z$().setCurrentModel(R),$()}catch(k){q(k.message),K(!1)}}),W=l4(async()=>{if(z||G===X)return;K(!0),q(null);try{if(await z$().removeModel(G),Y.length<=1)$()}catch(L){q(L.message)}finally{K(!1)}}),b=l4(()=>{if(z||!J)return;let L=Y.find((R)=>R.id===G);if(!L)return;J(L)}),M=l4((L)=>{U(L.value)}),w=EU(()=>{return Y.find((L)=>L.id===G)},[Y,G]),B=w?a4()?.modelProviders[w.provider]:void 0,C=Y.map((L)=>{let R=L.id===X?" (当前)":"";return{label:yJ(L)+R,value:L.id}}),F=G===X;return L0(t$,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[L0(t$,{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(t$,{flexDirection:"row",children:[L0(t$,{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(t$,{marginTop:1,children:L0(VU,{items:C,onSelect:H,onHighlight:M,indicatorComponent:hU,itemComponent:gU},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(t$,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[L0(v0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),L0(t$,{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(t$,{flexDirection:"column",children:[L0(v0,{children:[L0(v0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),L0(v0,{bold:!0,color:"cyan",children:yJ(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(mU,{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:b1().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(t$,{marginTop:1,children:L0(v0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(t$,{justifyContent:"center",marginTop:1,children:L0(v0,{dimColor:!0,children:"─".repeat(_)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(t$,{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 IJ}from"ahooks";import{Box as YK,Text as SJ}from"ink";import{useState as B2}from"react";import{Box as F2,Text as k1}from"ink";import pU from"ink-text-input";import{jsxDEV as w$}from"react/jsx-dev-runtime";var oZ=({provider:$,value:J,onChange:Y,onSubmit:X,onCancel:Z,error:Q})=>{return N0((G,U)=>{if(U.escape)Z()}),w$(F2,{flexDirection:"column",children:[w$(F2,{marginBottom:1,children:w$(k1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(F2,{marginBottom:1,children:w$(k1,{children:["Provider: ",w$(k1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),w$(F2,{marginBottom:1,children:w$(k1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(F2,{children:[w$(k1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),w$(pU,{value:J,onChange:Y,onSubmit:X,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&w$(F2,{marginTop:1,children:w$(k1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(F2,{marginTop:1,children:w$(k1,{dimColor:!0,children:["输入完成后按 ",w$(k1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",w$(k1,{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 i4,Text as i1}from"ink";import xU from"ink-text-input";import{useState as o4}from"react";import{jsxDEV as x$}from"react/jsx-dev-runtime";var n4=["id","name","baseUrl","model"];function nZ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function cU($,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 uU($,J){let Y=$.id.trim(),X={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:J},Z=sZ(Y,X);if(!$.model.trim())Z.push("Model ID must not be empty");if(Z.length>0)throw Error(Z[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:X}}var eZ=({wireApi:$,initialConfig:J,onSubmit:Y,onCancel:X})=>{let Z={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,G]=o4(J?3:0),[U,z]=o4(J?.model??""),[K,O]=o4(Z),[q,N]=o4(),_=n4[Q];N0((W,b)=>{if(!b.escape)return;if(N(void 0),Q===0){X();return}let M=Q-1,w=n4[M];G(M),z(K[w])});let H=(W)=>{let b=W.trim();if(_==="id"&&!tZ.test(b)){N("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(_==="baseUrl")try{let w=new URL(b);if(!["http:","https:"].includes(w.protocol))throw Error()}catch{N("Base URL 必须是绝对 HTTP(S) URL");return}if(_==="model"&&!b){N("Model ID 不能为空");return}let M={...K,[_]:_==="name"&&!b?K.id:b};if(O(M),N(void 0),Q===n4.length-1){try{Y(uU(M,$))}catch(w){N(w instanceof Error?w.message:"渠道配置无效")}return}G(Q+1),z("")};return x$(i4,{flexDirection:"column",children:[x$(i4,{marginBottom:1,children:x$(i1,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x$(i1,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),n4.slice(0,Q).map((W)=>x$(i1,{children:[nZ(W),": ",x$(i1,{color:"cyan",children:K[W]},void 0,!1,void 0,this)]},W,!0,void 0,this)),x$(i4,{marginTop:1,children:[x$(i1,{bold:!0,children:[nZ(_),": "]},void 0,!0,void 0,this),x$(xU,{value:U,onChange:(W)=>{z(W),N(void 0)},onSubmit:H,placeholder:cU(_,$,K.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_==="name"&&x$(i1,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),q&&x$(i1,{color:"red",children:q},void 0,!1,void 0,this),x$(i4,{marginTop:1,children:x$(i1,{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 Y5,useState as t2}from"react";var Z5=()=>{let[$,J]=t2([]),[Y,X]=t2(!0),[Z,Q]=t2(null);return Y5(()=>{let G=!1;return(async()=>{try{let z=await $5();if(!G)J(z)}catch(z){if(!G)Q(z instanceof Error?z.message:"加载 Provider 列表失败")}finally{if(!G)X(!1)}})(),()=>{G=!0}},[]),{providers:$,isLoading:Y,error:Z}},X5=($)=>{let[J,Y]=t2([]),[X,Z]=t2(!1),[Q,G]=t2(null);return Y5(()=>{if(!$){Y([]),Z(!1),G(null);return}let U=!1;return Y([]),Z(!0),G(null),(async()=>{try{let K=await J5($);if(!U)Y(K)}catch(K){if(!U)G(K instanceof Error?K.message:"加载模型列表失败")}finally{if(!U)Z(!1)}})(),()=>{U=!0}},[$]),{models:J,isLoading:X,error:Q}};import{Box as D1,Text as G1}from"ink";import dU from"ink-select-input";import lU from"ink-text-input";import{useMemo as Q5,useState as rU}from"react";import{jsxDEV as G$,Fragment as nU}from"react/jsx-dev-runtime";var aU=({isSelected:$})=>G$(D1,{marginRight:1,children:G$(G1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),iU=($)=>{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(" ")},oU=({isSelected:$,label:J})=>G$(G1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),G5=({provider:$,models:J,isLoading:Y,error:X,onSelect:Z,onCancel:Q})=>{let[G,U]=rU("");N0((O,q)=>{if(q.escape)if(G)U("");else Q()});let z=Q5(()=>{if(!G)return J;let O=G.toLowerCase();return J.filter((q)=>q.name.toLowerCase().includes(O)||q.id.toLowerCase().includes(O))},[J,G]),K=Q5(()=>z.map((O)=>({key:O.id,label:iU(O),value:O})),[z]);if(Y)return G$(D1,{flexDirection:"column",children:G$(G1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(X)return G$(D1,{flexDirection:"column",children:[G$(G1,{color:"red",children:X},void 0,!1,void 0,this),G$(G1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return G$(D1,{flexDirection:"column",children:[G$(D1,{marginBottom:1,children:G$(G1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G$(D1,{marginBottom:1,children:G$(G1,{children:["Provider: ",G$(G1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G$(nU,{children:[G$(D1,{marginBottom:1,children:[G$(G1,{color:"cyan",children:"> "},void 0,!1,void 0,this),G$(lU,{value:G,onChange:U,placeholder:`搜索 ${J.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G$(D1,{marginBottom:1,children:G$(G1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G$(D1,{flexDirection:"column",height:12,children:G$(dU,{items:K,onSelect:(O)=>Z(O.value),indicatorComponent:aU,itemComponent:oU,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.length===0&&G$(G1,{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 L2,Text as o1}from"ink";import tU from"ink-select-input";import sU from"ink-text-input";import{useMemo as U5,useState as eU}from"react";import{jsxDEV as P$}from"react/jsx-dev-runtime";var $K=({isSelected:$})=>P$(L2,{marginRight:1,children:P$(o1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),JK=({isSelected:$,label:J})=>P$(o1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),K5=({providers:$,isLoading:J,error:Y,onSelect:X,onCancel:Z})=>{let[Q,G]=eU("");N0((K,O)=>{if(O.escape)if(Q)G("");else Z()});let U=U5(()=>{if(!Q)return $;let K=Q.toLowerCase();return $.filter((O)=>O.name.toLowerCase().includes(K)||O.id.toLowerCase().includes(K))},[$,Q]),z=U5(()=>U.map((K)=>({key:K.id,label:`${K.name} - ${K.modelCount} models${K.configured?" [configured]":""}`,value:K})),[U]);if(J)return P$(L2,{flexDirection:"column",children:P$(o1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return P$(L2,{flexDirection:"column",children:[P$(o1,{color:"red",children:Y},void 0,!1,void 0,this),P$(o1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return P$(L2,{flexDirection:"column",children:[P$(L2,{marginBottom:1,children:P$(o1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(L2,{marginBottom:1,children:[P$(o1,{color:"cyan",children:"> "},void 0,!1,void 0,this),P$(sU,{value:Q,onChange:G,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P$(L2,{flexDirection:"column",height:12,children:P$(tU,{items:z,onSelect:(K)=>X(K.value),indicatorComponent:$K,itemComponent:JK,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.length===0&&P$(o1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function z5($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as n1}from"react/jsx-dev-runtime";var kJ=({mode:$,initialConfig:J,modelId:Y,onComplete:X,onCancel:Z})=>{let[Q,G]=B2("provider"),[U,z]=B2(),[K,O]=B2(),[q,N]=B2(),[_,H]=B2(""),[W,b]=B2(),[M,w]=B2(!1),B=Z5(),C=X5(U?.id),F=s0(!1);N0((k,T)=>{if(T.ctrl&&k==="c"||T.meta&&k==="c")$==="setup"?F():Z()});let A=IJ(async(k)=>{if(!U)return;let T=q??(K?{provider:U.id,model:K.id,displayName:J?.displayName}:void 0);if(!T)return;w(!0),b(void 0);try{if(T.modelProvider)b1().registerModelProvider(T.provider,T.modelProvider,[T.model]);if(k?.trim())await b1().setApiKey(T.provider,k.trim());let I={displayName:T.displayName,provider:T.provider,model:T.model,overrides:T.overrides};if($==="setup")await X(T);else if($==="add"){let P=T.modelProvider?await z$().addModelWithProvider(I,T.modelProvider):await z$().addModel(I);await z$().setCurrentModel(P.id),await X(T)}else if(Y){if(T.modelProvider)await z$().updateModelWithProvider(Y,I,T.modelProvider);else await z$().updateModel(Y,I);await X(T)}}catch(I){if(T.modelProvider){await b1().credentials.delete(T.provider);let P=a4();b1().configureModelProviders(P?.modelProviders??{},P?.models??[])}b(I instanceof Error?I.message:"保存配置失败"),w(!1)}}),L=IJ((k)=>{if(O(k),U?.configured)A();else if(U?.supportsApiKey)G("credential");else b(`${U?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),R=IJ(()=>{if(b(void 0),Q==="credential"&&q){G("custom");return}let k=z5(Q);if(k)G(k)});return n1(YK,{flexDirection:"column",padding:1,children:[n1(SJ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&n1(K5,{...B,onSelect:(k)=>{z(k),O(void 0),N(void 0),G(k.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),Q==="custom"&&U?.factoryWireApi&&n1(eZ,{wireApi:U.factoryWireApi,initialConfig:q,onSubmit:(k)=>{N(k),G("credential")},onCancel:R},void 0,!1,void 0,this),Q==="model"&&U&&n1(G5,{provider:U,...C,onSelect:L,onCancel:R},void 0,!1,void 0,this),Q==="credential"&&U&&n1(oZ,{provider:U,value:_,onChange:H,onSubmit:()=>void A(_),onCancel:R,error:W},void 0,!1,void 0,this),M&&n1(SJ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),W&&Q!=="credential"&&n1(SJ,{color:"red",children:W},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as A8}from"ahooks";import{promises as N5}from"fs";import{Box as c$,Text as Y$}from"ink";import q5 from"ink-select-input";import ZK from"ink-text-input";import XK from"os";import t4 from"path";import{useEffect as QK,useMemo as s4,useRef as GK,useState as t1}from"react";import{jsxDEV as y0}from"react/jsx-dev-runtime";var b8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],UK={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},KK={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},_5={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},zK=["project","global","local"],qK={allow:[],ask:[],deny:[]},_K={localExists:!1,projectExists:!1,globalExists:!1},O5={allow:[],ask:[],deny:[]};function OK($){let J=(X)=>Array.isArray(X)?X.filter((Z)=>typeof Z==="string"):[],Y=$?.permissions??{};return{allow:J(Y?.allow),ask:J(Y?.ask),deny:J(Y?.deny)}}async function NK($){try{let J=await N5.readFile($,"utf-8"),Y=JSON.parse(J);return{exists:!0,raw:Y,permissions:OK(Y)}}catch(J){if(J.code==="ENOENT")return{exists:!1,raw:{},permissions:{...O5}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,J),{exists:!0,raw:{},permissions:{...O5}}}}function WK($,J){let Y=$.padEnd(32," "),X=J==="local"?`${_5[J]} <- 可删除`:_5[J];return`${Y} ${X}`}var W5=({onClose:$})=>{let Y=X$()==="permissions-manager",X=s0(!1),[Z,Q]=t1(0),G=b8[Z].key,[U,z]=t1(qK),[K,O]=t1(_K),[q,N]=t1(!0),[_,H]=t1("list"),[W,b]=t1(""),[M,w]=t1(null),[B,C]=t1(null),F=GK(!1),A=s4(()=>t4.join(K$(),".blade","settings.local.json"),[]),L=s4(()=>t4.join(K$(),".blade","settings.json"),[]),R=s4(()=>t4.join(XK.homedir(),".blade","settings.json"),[]),k=A8(async()=>{N(!0);let c=await Promise.all([{source:"local",path:A},{source:"project",path:L},{source:"global",path:R}].map(async({source:F0,path:T0})=>{let y=await NK(T0);return{source:F0,path:T0,...y}})),d={localExists:c.find((F0)=>F0.source==="local")?.exists??!1,projectExists:c.find((F0)=>F0.source==="project")?.exists??!1,globalExists:c.find((F0)=>F0.source==="global")?.exists??!1};O(d);let a={allow:[],ask:[],deny:[]},W0=Object.fromEntries(c.map((F0)=>[F0.source,F0]));["allow","ask","deny"].forEach((F0)=>{zK.forEach((T0)=>{(W0[T0]?.permissions[F0]??[]).forEach((D,p)=>{let V={key:`${T0}:${p}:${D}`,rule:D,source:T0};a[F0].push(V)})})}),z(a),N(!1)});QK(()=>{k()},[k]);let T=A8(async(Y0,c)=>{try{let d=t4.join(K$(),".blade","settings.local.json"),a={allow:[],ask:[],deny:[]};try{let F0=await N5.readFile(d,"utf-8"),y=JSON.parse(F0).permissions||{};a={allow:Array.isArray(y.allow)?y.allow:[],ask:Array.isArray(y.ask)?y.ask:[],deny:Array.isArray(y.deny)?y.deny:[]}}catch(F0){}let W0=c(a);await z$().updateConfig({permissions:W0},{scope:"local",immediate:!0}),await k()}catch(d){throw console.error("[PermissionsManager] 修改权限规则失败:",d),d}});N0((Y0,c)=>{if(c.ctrl&&Y0==="c"||c.meta&&Y0==="c"){X();return}if(_==="locked"){if(F.current){F.current=!1;return}H("list"),w(null),C(null);return}if(c.escape){if(_==="list"||G==="info")$();else H("list"),b(""),w(null),C(null);return}if(_==="list"){if(c.tab&&c.shift)Q((d)=>(d-1+b8.length)%b8.length);else if(c.tab)Q((d)=>(d+1)%b8.length);else if(Y0?.toLowerCase()==="q")$()}},{isActive:Y});let I=A8((Y0)=>{let c=Y0.value;if(G==="info")return;if(c.type==="add"){H("add"),b(""),C(null);return}if(c.entry.source!=="local"){H("locked"),F.current=!0,w({tab:G,entry:c.entry}),C({type:"error",text:c.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}H("confirm-delete"),w({tab:G,entry:c.entry}),C(null)}),P=A8(async()=>{if(G==="info")return;let Y0=W.trim();if(!Y0){C({type:"error",text:"Permission rule 不能为空"});return}if(U[G].map((d)=>d.rule).includes(Y0)){C({type:"error",text:"该规则已存在"});return}try{await T(G,(d)=>{let a={allow:[...d.allow],ask:[...d.ask],deny:[...d.deny]};return a[G]=[...new Set([...d[G],Y0])],a}),H("list"),b(""),C({type:"success",text:"已添加本地权限规则"})}catch(d){C({type:"error",text:`保存失败: ${d instanceof Error?d.message:"未知错误"}`})}}),j=A8(async()=>{if(!M)return;let{tab:Y0,entry:c}=M;try{await T(Y0,(d)=>{let a={allow:[...d.allow],ask:[...d.ask],deny:[...d.deny]};return a[Y0]=d[Y0].filter((W0)=>W0!==c.rule),a}),H("list"),w(null),C({type:"success",text:"已删除本地权限规则"})}catch(d){C({type:"error",text:`删除失败: ${d instanceof Error?d.message:"未知错误"}`})}}),o=s4(()=>{if(G==="info")return[];let Y0=G;return[{key:"add-new-rule",label:`› ${UK[Y0]}`,value:{type:"add"}},...U[Y0].map((d)=>({key:d.key,label:WK(d.rule,d.source),value:{type:"rule",entry:d}}))]},[G,U]),u=()=>y0(c$,{marginBottom:1,children:b8.map((Y0,c)=>y0(c$,{marginRight:2,children:y0(Y$,{color:c===Z?"yellow":"gray",children:["[",Y0.label,"]"]},void 0,!0,void 0,this)},Y0.key,!1,void 0,this))},void 0,!1,void 0,this),Z0=()=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),y0(c$,{flexDirection:"column",marginLeft:2,children:[y0(Y$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",K.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(Y$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",K.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(Y$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",K.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y0(Y$,{children:"说明:"},void 0,!1,void 0,this),y0(c$,{flexDirection:"column",marginLeft:2,children:[y0(Y$,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),y0(Y$,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),y0(Y$,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z0=(Y0)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:KK[Y0]},void 0,!1,void 0,this),y0(Y$,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),y0(c$,{marginTop:1,children:y0(ZK,{value:W,onChange:b,onSubmit:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0=(Y0,c)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:["Delete ",Y0," permission rule?"]},void 0,!0,void 0,this),y0(Y$,{children:c.rule},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),y0(Y$,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),y0(q5,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(d)=>{if(d.value==="yes")j();else H("list"),w(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f=(Y0)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),y0(Y$,{children:Y0.rule},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:Y0.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(Y$,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E=(Y0)=>y0(q5,{items:o,isFocused:_==="list",onSelect:I},void 0,!1,void 0,this),m=()=>{if(q)return y0(Y$,{children:"加载中..."},void 0,!1,void 0,this);if(G==="info")return Z0();if(_==="add")return z0(G);if(_==="confirm-delete"&&M)return J0(M.tab,M.entry);if(_==="locked"&&M)return f(M.entry);return E(G)};return y0(c$,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[y0(Y$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),u(),y0(c$,{flexDirection:"column",gap:1,children:m()},void 0,!1,void 0,this),B&&y0(c$,{marginTop:1,children:y0(Y$,{color:B.type==="success"?"green":"red",children:B.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(c$,{marginTop:1,children:y0(Y$,{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 HK,useState as w2}from"react";import{jsxDEV as s}from"react/jsx-dev-runtime";var DJ=["local","project","global"];function A5({workspaceRoot:$,onCancel:J}){let Y=X$()==="plugins-manager",X=F5($),Z=X.getAll(),[Q,G]=w2(0),[U,z]=w2(!1),[K,O]=w2(""),[q,N]=w2(null),[_,H]=w2("local"),[W,b]=w2(null),[M,w]=w2(0),B=X.getBySource(),C=X.getStats(),F=X.getSourcePolicy(),A=s0(!1,J);HK(()=>{let P=!0;return H5.getInstance().loadWorkspacePluginSettingsResolution(X.getWorkspaceRoot()).then((j)=>{if(P)b(j.settings)}).catch((j)=>{if(P)O(j instanceof Error?j.message:"无法读取插件作用域配置")}),()=>{P=!1}},[X,M]);let L=()=>{H((P)=>{let j=DJ.indexOf(P);return DJ[(j+1)%DJ.length]}),N(null)},R=async()=>{let P=Z[Q];if(!P||U)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 L5(X.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)}},k=async()=>{if(U)return;z(!0),O("");try{await B5(X.getWorkspaceRoot()),G(0),O("插件列表已刷新"),w((P)=>P+1)}catch(P){O(P instanceof Error?P.message:String(P))}finally{z(!1)}},T=async()=>{let P=Z[Q];if(!P||U)return;if(!P.installation){O(`${P.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}z(!0),N(null),O("");try{let{result:j}=await w5(X.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)}},I=async()=>{let P=Z[Q];if(!P||U)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 P5(X.getWorkspaceRoot(),P.manifest.name,!0);if(!j.success)throw Error(j.error);N(null),G(0),O(`已卸载 ${P.manifest.name}`),w((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{z(!1)}};if(N0((P,j)=>{if(j.escape)J?.();else if(j.ctrl&&P==="c"||j.meta&&P==="c")A();else if((j.upArrow||P==="k")&&Z.length>0)N(null),G((o)=>(o-1+Z.length)%Z.length);else if((j.downArrow||P==="j")&&Z.length>0)N(null),G((o)=>(o+1)%Z.length);else if(P===" "||j.return)R();else if(P==="r")k();else if(P==="s")L();else if(P==="u")T();else if(P==="x")I()},{isActive:Y}),Z.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=Z.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=Z.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:["生效层级:"," ",W?.[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=Z.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:["生效层级:"," ",W?.[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),U&&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 FK}from"ink";import LK from"ink-text-input";import fJ,{useCallback as M8,useMemo as BK,useState as s1}from"react";import{jsxDEV as V0}from"react/jsx-dev-runtime";var wK=fJ.memo(({option:$,index:J,isSelected:Y,isMultiSelect:X,isHighlighted:Z})=>V0(M$,{flexDirection:"column",marginBottom:1,children:[V0(T$,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[X?Y?"(*) ":"( ) ":Z?"> ":" ",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)),PK=fJ.memo(({questions:$,answers:J})=>V0(M$,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let X=J[Y.header],Z=Array.isArray(X)?X.join(", "):X||"(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:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),b5=fJ.memo(({questions:$,onComplete:J,onCancel:Y})=>{let{stdout:X}=FK(),Z=X.columns||80,G=X$()==="confirmation-prompt",U=s0(!1),[z,K]=s1("answering"),[O,q]=s1(0),[N,_]=s1({}),[H,W]=s1(0),[b,M]=s1([]),[w,B]=s1(!1),[C,F]=s1(""),[A,L]=s1(0),R=$[O],k=BK(()=>{if(!R)return[];return[...R.options.map((u)=>({label:u.label,value:u.label,description:u.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[R]),T=M8((u)=>{let Z0={...N,[R.header]:u};if(_(Z0),O<$.length-1)q(O+1),W(0),M([]),B(!1),F("");else K("submit"),L(0)},[N,R?.header,O,$.length]),I=M8((u)=>{let Z0=k[u];if(!Z0)return;if(Z0.value==="__other__"){B(!0);return}if(R.multiSelect)M((z0)=>z0.includes(Z0.value)?z0.filter((J0)=>J0!==Z0.value):[...z0,Z0.value]);else T(Z0.value)},[k,R?.multiSelect,T]),P=M8((u)=>{if(u.trim())T(u.trim())},[T]),j=M8(()=>{K("answering"),q(0),W(0),M([]),B(!1)},[]),o=M8(()=>{J(N)},[N,J]);if(N0((u,Z0)=>{if(Z0.ctrl&&u==="c"||Z0.meta&&u==="c"){U();return}if(w){if(Z0.escape)B(!1),F("");return}if(Z0.escape){Y();return}let z0=parseInt(u);if(z0>=1&&z0<=k.length){I(z0-1);return}if(Z0.upArrow){W((J0)=>J0>0?J0-1:k.length-1);return}if(Z0.downArrow||Z0.tab){W((J0)=>J0<k.length-1?J0+1:0);return}if(Z0.return){if(R.multiSelect&&b.length>0)T(b);else I(H);return}if(u===" "&&R.multiSelect){let J0=k[H];if(J0&&J0.value!=="__other__")M((f)=>f.includes(J0.value)?f.filter((E)=>E!==J0.value):[...f,J0.value]);return}},{isActive:G&&z==="answering"&&!w}),N0((u,Z0)=>{if(Z0.ctrl&&u==="c"||Z0.meta&&u==="c"){U();return}if(Z0.escape){Y();return}if(Z0.upArrow||Z0.downArrow||Z0.tab){L((z0)=>z0===0?1:0);return}if(Z0.return){if(A===0)o();else j();return}if(u.toLowerCase()==="y"){o();return}if(u.toLowerCase()==="e"){j();return}},{isActive:G&&z==="submit"}),z==="submit")return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:G?"green":"gray",padding:1,width:Math.min(Z-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(PK,{questions:$,answers:N},void 0,!1,void 0,this),V0(M$,{flexDirection:"column",marginTop:1,children:[V0(T$,{color:A===0?"yellow":void 0,bold:A===0,children:[A===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),V0(T$,{color:A===1?"yellow":void 0,bold:A===1,children:[A===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(!R)return null;return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:G?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[V0(M$,{marginBottom:1,children:[V0(T$,{backgroundColor:"blue",color:"white",children:[" ",R.header," "]},void 0,!0,void 0,this),V0(T$,{children:[" ",R.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(LK,{value:C,onChange:F,onSubmit:P,focus:G},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:k.map((u,Z0)=>V0(wK,{option:u,index:Z0,isSelected:b.includes(u.value),isMultiSelect:R.multiSelect,isHighlighted:H===Z0},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:R.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),R.multiSelect&&b.length>0&&V0(T$,{color:"green",children:["Selected: ",b.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 jJ,Text as f1,useStdout as IK}from"ink";import{useEffect as EJ,useMemo as J6,useRef as P2,useState as A2}from"react";function AK($,J){return[...$,J].join(`
|
|
160
|
-
`).replace(/\n+$/,"")}function T8($){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 R5({messages:$,currentStreamingMessageId:J,streamingLines:Y,streamingTail:X,currentThinkingContent:Z}){let Q=
|
|
156
|
+
`)))return b(L);j=T.slice(0,I)+L+T.slice(I,T.length),P+=L.length}if(P<0)P=0;if(P>j.length)P=j.length;H(j,P)}),!0},{isActive:Y,priority:0,onRegistered:()=>{if(_.current)return;_.current=QZ()}});let w=Y,B=$,C=J?N2.grey(J):void 0;if(w)if(C=J.length>0?N2.inverse(J[0])+N2.grey(J.slice(1)):N2.inverse(" "),$.length===0)B=N2.inverse(" ");else{B="";for(let F=0;F<$.length;F++)if(F===Z&&Z<$.length)B+=N2.inverse($[F]);else B+=$[F];if(Z>=$.length)B+=N2.inverse(" ")}return nG(aG,{children:J?$.length>0?B:C:B},void 0,!1,void 0,this)}import{jsxDEV as FJ}from"react/jsx-dev-runtime";var TZ=eG.memo(({input:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:X,onAddPasteMapping:Z,onAddImagePasteMapping:Q,disabled:G=!1})=>{let z=X$()==="main-input"&&!G,K=$.trimStart().startsWith("!"),O=MZ((N)=>{let _=N.split(`
|
|
157
|
+
`).length,H=N.length,W=500,b=10;if(H>500||_>10){let M=Z(N),w=N.slice(0,30).replace(/\n/g," "),B=`${H} chars, ${_} lines: ${w}...`;return{prompt:`${B4(M)}${B}${M6()}`}}return{}}),q=MZ(async(N,_,H)=>{try{let W=Q(N,_);return{prompt:`${B4(W)}[Image #${W}]${M6()}`}}catch(W){return console.error("[Image Paste] Failed to process image:",W),{prompt:`[Image paste failed: ${W instanceof Error?W.message:"Unknown error"}] `}}});return FJ(tG,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[FJ(sG,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),FJ(bZ,{value:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:X,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 o2,Text as f$}from"ink";import KU,{useEffect as fZ,useState as vZ}from"react";import{useEffect as XU,useRef as QU,useState as GU}from"react";import{useEffect as $U,useRef as JU,useState as YU}from"react";var ZU=15000,RZ="等待用户确认...",CZ=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],yZ=["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 IZ(){if(Math.random()<0.25){let Y=Math.floor(Math.random()*yZ.length);return yZ[Y]}let J=Math.floor(Math.random()*CZ.length);return CZ[J]}function SZ($,J,Y=!1){let[X,Z]=YU(""),Q=JU(Y);return Q.current=Y,$U(()=>{if(J){Z(RZ);return}if(!$){Z("");return}Z((U)=>U===""||U===RZ?IZ():U);let G=setInterval(()=>{if(!Q.current)Z(IZ())},ZU);return()=>{clearInterval(G)}},[$,J]),X}function kZ($,J=!1,Y=!1){let[X,Z]=GU(0),Q=QU(null),G=SZ($,J,Y);return XU(()=>{if(!$){Z(0),Q.current=null;return}if(Y)return;if(Q.current===null)Q.current=Date.now();let U=setInterval(()=>{if(Q.current!==null){let z=Math.floor((Date.now()-Q.current)/1000);Z(z)}},1000);return()=>{clearInterval(U)}},[$,Y]),{currentPhrase:G,elapsedTime:X}}function UU($){let J=Math.max(0,Math.floor($/1000));if(J<60)return`${J}s`;let Y=Math.floor(J/60),X=J%60;if(Y<60)return`${Y}m ${X}s`;return`${Math.floor(Y/60)}h ${Y%60}m ${X}s`}function DZ($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let X=Y.activeTools.length+Y.activeToolOverflow,Z=Y.phase==="starting"?"正在启动任务":Y.phase==="thinking"?"正在思考":Y.phase==="responding"?"正在生成回复":Y.phase==="compacting"?"正在压缩上下文":Y.phase==="continuing"?"正在推进下一步":`正在执行 ${X} 个工具`,Q=Y.activeTools.slice(0,2).map((K)=>K.progress!==void 0&&K.total!==void 0?`${K.name} ${K.progress}/${K.total}`:K.name),G=Math.max(0,Y.activeTools.length-Q.length+Y.activeToolOverflow);if(G>0)Q.push(`+${G}`);let U=[...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=UU(J-Y.startedAt);return{primary:Z,secondary:U.join(" · "),compact:Y.phase==="executing_tools"?`执行工具 · ${X} 个 · ${z}`:`${Z} · ${z}`,elapsed:z}}import{jsxDEV as q$,Fragment as qU}from"react/jsx-dev-runtime";var LJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],zU=80;function VZ($){if($<60)return`${$}s`;let J=Math.floor($/60),Y=$%60;return`${J}m ${Y}s`}var jZ=KU.memo(({message:$,paused:J=!1})=>{let Y=v2(),X=h8(),Z=v8(),Q=nJ(),G=tJ(),U=Y||!X,[z,K]=vZ(0),[O,q]=vZ(Date.now()),N=D0(),H=m2()>=zU,{currentPhrase:W,elapsedTime:b}=kZ(U,!1,J);if(fZ(()=>{if(!U||J){K(0);return}let F=setInterval(()=>{K((A)=>(A+1)%LJ.length)},150);return()=>clearInterval(F)},[U,J]),fZ(()=>{if(!Z?.snapshot?.nextActionAt&&!Q?.snapshot||J)return;q(Date.now());let F=setInterval(()=>q(Date.now()),1000);return()=>clearInterval(F)},[J,Z?.snapshot?.nextActionAt,Q?.snapshot]),!U)return null;let M=S4(Z,O),w=DZ(Q,O),C=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||M?.primary||w?.primary||$||W||"正在思考中...";if(H)return q$(o2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.warning,bold:!0,children:LJ[z]},void 0,!1,void 0,this),q$(f$,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this),M?.secondary&&q$(f$,{color:N.colors.info,children:M.secondary},void 0,!1,void 0,this),!M?.secondary&&w?.secondary&&q$(f$,{color:N.colors.info,children:w.secondary},void 0,!1,void 0,this),(w||b>0)&&q$(qU,{children:[q$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),q$(f$,{color:N.colors.info,children:["已用时:"," ",w?.elapsed??VZ(b)]},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$(o2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[q$(o2,{flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.warning,bold:!0,children:LJ[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),M?.secondary&&q$(o2,{marginLeft:2,children:q$(f$,{color:N.colors.info,children:M.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),!M?.secondary&&w?.secondary&&q$(o2,{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||b>0)&&q$(o2,{marginLeft:2,flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.info,children:["已用时: ",w?.elapsed??VZ(b)]},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 c4,Text as $$,useStdout as _U}from"ink";import OU from"ink-text-input";import NU,{useCallback as p4,useEffect as WU,useMemo as HU,useState as W2}from"react";import{jsxDEV as f0}from"react/jsx-dev-runtime";var mZ=NU.memo(({details:$,onComplete:J})=>{let{stdout:Y}=_U(),X=Y.columns||80,Z=X$()==="confirmation-prompt",Q=s0(!1),G=$.fields??[],[U,z]=W2("field"),[K,O]=W2(0),[q,N]=W2(()=>EZ($)),[_,H]=W2(""),[W,b]=W2(0),[M,w]=W2([]),[B,C]=W2(),F=G[K],A=HU(()=>FU(F),[F]);WU(()=>{if(!F)return;let I=q[F.name];H(typeof I==="string"||typeof I==="number"?String(I):""),w(Array.isArray(I)?[...I]:[]);let P=A.findIndex((j)=>j.value===String(I));b(P>=0?P:0),C(void 0)},[q,F,A]);let L=p4((I)=>{if(N(I),K<G.length-1){O((P)=>P+1);return}z("review")},[K,G.length]),R=p4((I)=>{if(!F)return;let P={...q};if(I===void 0)delete P[F.name];else P[F.name]=I;L(P)},[q,F,L]),k=p4((I)=>{if(!F)return;try{R(hZ(F,I))}catch(P){C(P instanceof Error?P.message:String(P))}},[F,R]),T=p4(()=>{try{let I=gZ($,{action:"accept",content:q});J({action:I.action,...I.content?{content:I.content}:{}})}catch(I){C(I instanceof Error?I.message:String(I))}},[q,$,J]);if(N0((I,P)=>{if(P.ctrl&&I==="c"||P.meta&&I==="c"){Q();return}if(P.escape){J({action:"cancel"});return}if($.mode==="url"){if(I.toLowerCase()==="y")J({action:"accept"},!0);else if(I.toLowerCase()==="n")J({action:"decline"});return}if(U==="review"){if(I.toLowerCase()==="y"||P.return)T();else if(I.toLowerCase()==="e")O(0),z("field");else if(I.toLowerCase()==="d")J({action:"decline"});return}if(!F){if(P.return)T();return}if(BJ(F))return;if(I.toLowerCase()==="d"){J({action:"decline"});return}if(P.upArrow){b((j)=>j>0?j-1:Math.max(A.length-1,0));return}if(P.downArrow||P.tab){b((j)=>j<A.length-1?j+1:0);return}if(I===" "&&F.type==="multi-select"){let j=A[W];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")R(M);else{let j=A[W];if(j)R(j.typedValue)}},{isActive:Z}),$.mode==="url")return f0(x4,{width:X,color:"yellow",children:[f0($$,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),f0($$,{children:$.message},void 0,!1,void 0,this),f0($$,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),f0($$,{children:["Domain: ",f0($$,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0($$,{wrap:"wrap",children:["URL: ",f0($$,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0($$,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(U==="review")return f0(x4,{width:X,color:"green",children:[f0($$,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),f0($$,{children:$.message},void 0,!1,void 0,this),G.map((I)=>f0($$,{children:[I.title,": ",BU(q[I.name])]},I.name,!0,void 0,this)),B&&f0($$,{color:"red",children:B},void 0,!1,void 0,this),f0($$,{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(x4,{width:X,color:"cyan",children:[f0($$,{children:$.message},void 0,!1,void 0,this),f0($$,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),f0($$,{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(x4,{width:X,color:"cyan",children:[f0($$,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),f0($$,{children:$.message},void 0,!1,void 0,this),f0(c4,{flexDirection:"column",marginTop:1,children:[f0($$,{bold:!0,children:[F.title,F.required?" *":""]},void 0,!0,void 0,this),F.description&&f0($$,{color:"gray",children:F.description},void 0,!1,void 0,this),f0($$,{color:"gray",children:LU(F)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),BJ(F)?f0(c4,{children:[f0($$,{color:"cyan",children:"> "},void 0,!1,void 0,this),f0(OU,{value:_,onChange:H,onSubmit:k,focus:Z,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(c4,{flexDirection:"column",children:A.map((I,P)=>{let j=F.type==="multi-select"&&M.includes(I.value);return f0($$,{color:W===P?"yellow":void 0,children:[W===P?"> ":" ",F.type==="multi-select"?j?"(*) ":"( ) ":"",I.label]},I.value,!0,void 0,this)})},void 0,!1,void 0,this),B&&f0($$,{color:"red",children:B},void 0,!1,void 0,this),f0($$,{color:"gray",children:[BJ(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($$,{color:"gray",children:["Field ",K+1," of ",G.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function x4({children:$,width:J,color:Y}){return f0(c4,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(J-4,88),children:$},void 0,!1,void 0,this)}function BJ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function FU($){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 LU($){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 BU($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import d4 from"ansi-escapes";import{Box as H2,Static as IU,useStdout as SU}from"ink";import kU,{useEffect as S1,useMemo as TJ,useRef as a1,useState as RJ}from"react";import{Box as wU,Text as pZ}from"ink";import PU from"react";import{jsxDEV as wJ}from"react/jsx-dev-runtime";var PJ=PU.memo(({collapsedCount:$})=>{let J=D0();if($<=0)return null;let Y=J.colors.text.muted;return wJ(wU,{flexDirection:"row",marginBottom:1,children:[wJ(pZ,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),wJ(pZ,{color:Y,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});PJ.displayName="CollapsedHistorySummary";import{Box as w8,Text as P8}from"ink";import AU from"ink-big-text";import bU from"ink-gradient";import MU from"react";import{jsxDEV as n$}from"react/jsx-dev-runtime";var cZ=MU.memo(()=>{return n$(w8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[n$(w8,{flexDirection:"column",children:n$(bU,{name:"pastel",children:n$(AU,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),n$(w8,{marginBottom:1,children:n$(P8,{color:"white",dimColor:!0,children:xZ()},void 0,!1,void 0,this)},void 0,!1,void 0,this),n$(w8,{flexDirection:"column",marginBottom:1,children:[n$(w8,{marginBottom:1,children:n$(P8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n$(P8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),n$(P8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),n$(P8,{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 u4,Text as AJ}from"ink";import uZ from"react";import{jsxDEV as r1}from"react/jsx-dev-runtime";var dZ=uZ.memo(({tasks:$,visible:J=!0,compact:Y=!1})=>{let{colors:X}=D0();if(!J||$.length===0)return null;let Z={total:$.length,completed:$.filter((Q)=>Q.status==="completed").length,inProgress:$.filter((Q)=>Q.status==="in_progress").length};return r1(u4,{flexDirection:"column",borderStyle:"single",borderColor:X.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[r1(u4,{marginBottom:Y?0:1,children:[r1(AJ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),r1(AJ,{color:X.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r1(u4,{flexDirection:"column",children:$.map((Q,G)=>r1(TU,{task:Q,compact:Y},Q.id||G,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),TU=uZ.memo(({task:$,compact:J})=>{let Y,X=!1,Z;switch($.status){case"completed":Y="[OK]",X=!0,Z=$.subject;break;case"in_progress":Y=">",X=!1,Z=$.activeForm||$.subject;break;case"pending":default:Y="-",X=!0,Z=$.subject;break}return r1(u4,{paddingY:J?0:0,children:r1(AJ,{dimColor:X,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as bJ,Text as n2}from"ink";import RU,{useMemo as lZ}from"react";import{jsxDEV as I1}from"react/jsx-dev-runtime";function CU($,J=60){if(!$)return"";let Y=$.split(`
|
|
158
|
+
`)[0]||"";if(Y.length<=J)return Y;return`${Y.slice(0,J)}...`}function yU($){if(!$)return 0;return $.split(`
|
|
159
|
+
`).length}var MJ=RU.memo(({content:$,isStreaming:J=!1,isExpanded:Y})=>{let X=D0(),Z=lZ(()=>yU($),[$]),Q=lZ(()=>CU($),[$]),G=X.colors.info,U=X.colors.muted;return I1(bJ,{flexDirection:"column",marginBottom:1,children:[I1(bJ,{flexDirection:"row",children:[I1(n2,{color:G,children:Y?"v":">"},void 0,!1,void 0,this),I1(n2,{children:" "},void 0,!1,void 0,this),I1(n2,{color:U,children:["Thinking",J?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!J&&Q&&I1(n2,{color:U,children:[" - ",Q]},void 0,!0,void 0,this),I1(n2,{color:U,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&I1(bJ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:I1(n2,{color:U,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});MJ.displayName="ThinkingBlock";import{jsxDEV as v$}from"react/jsx-dev-runtime";var DU=({active:$=!0})=>{let J=f8(),Y=a8(),X=i8(),Z=L9(),Q=v2(),G=J9(),U=K9(),z=r8(),K=F9(),O=rJ(),q=w9(),N=B9(),{width:_,height:H}=d1(),{stdout:W}=SU(),b=p1(),[M,w]=RJ(null),[B,C]=RJ([]),[F,A]=RJ(new Set),L=a1(N),R=a1(null),k=a1(0),T=a1(0),I=a1(new Set),P=a1(new Set),j=a1([]),o=a1(null);S1(()=>{if(L.current!==N){if(L.current=N,!$)return;if(Y1())a$();if(W)W.write(d4.clearTerminal);b.incrementClearCount()}},[$,N,W,b]);let u=J,Z0=Z;S1(()=>{if(!Z||Q){o.current=null;return}if(o.current===Z)return;if(o.current=Z,Y1())a$();if($&&W)W.write(d4.eraseScreen+d4.cursorTo(0,0));I.current=new Set,P.current=new Set(u.filter((c)=>c.role==="tool").map((c)=>c.id)),R.current=null,k.current=0,T.current=0,j.current=[],C([]),A(new Set),b.incrementClearCount(),b.clearFinalizingStreamingMessageId()},[Z,Q,W,b,u,$]);let z0=Y??Z;S1(()=>{if($&&Y1())a$();R.current=null,k.current=0,T.current=0,I.current=new Set,P.current=new Set(u.filter((c)=>c.role==="tool").map((c)=>c.id)),j.current=[],C([]),A(new Set)},[O]),S1(()=>{if(!z0)return;if(R.current===z0)return;R.current=z0,k.current=0,T.current=0,P.current=new Set(u.filter((c)=>c.role==="tool").map((c)=>c.id)),j.current=[],C([])},[z0,O]),S1(()=>{if(!z0)return;let c=CJ(z0);if(!c||c.length<=k.current)return;let d=c.slice(k.current);k.current=c.length;let a=d,W0=j.current;if(W0.length>0)if(a.some((D)=>D.type!=="empty"))a=[...W0,...a],j.current=[];else{j.current=[...W0,...a];return}let F0=a.length;while(F0>0&&a[F0-1].type==="empty")F0-=1;if(F0!==a.length)j.current=a.slice(F0),a=a.slice(0,F0);if(a.length===0)return;let T0=T.current;T.current+=1;let y=T0>0;if(Y1())a$();A((D)=>{if(!z0||D.has(z0))return D;let p=new Set(D);return p.add(z0),p}),C((D)=>[...D,v$(H2,{flexDirection:"column",children:v$(C1,{content:"",role:"assistant",terminalWidth:_,isPending:!1,hidePrefix:y,noMargin:!0,blocksOverride:a,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${z0}-${T0}`,!1,void 0,this)])},[z0,X.version,_,O,$]),S1(()=>{if(!z0)return;let c=P.current,d=u.filter((a)=>a.role==="tool"&&!c.has(a.id)&&!I.current.has(a.id));if(d.length===0)return;if($&&Y1())a$();for(let a of d)I.current.add(a.id);C((a)=>[...a,...d.map((W0)=>v$(H2,{flexDirection:"column",children:v$(C1,{content:W0.content,role:W0.role,terminalWidth:_,metadata:W0.metadata,isPending:!1,messageId:W0.id},void 0,!1,void 0,this)},`streaming-tool-${W0.id}`,!1,void 0,this))])},[$,z0,u,_]),S1(()=>{if(!$){if(Y1())a$();return}if(!z0){if(Y1())a$();return}if(!Y1())U3(_,H);else K3(_,H);let c=rZ(z0);if(!c||c.lines.length===0)return;let a=Math.max(1,H-8),W0=Math.max(0,c.lines.length-a),F0=c.lines.slice(-a),T0=(CJ(z0)?.length??0)>0;z3(F0,W0,c.mode,T0)},[z0,X.version,H,_,$]),S1(()=>{if(!z0&&Y1())a$()},[z0]),S1(()=>{if(M===null&&u.length>q){if(w(u.length),$&&Y1())a$();if($&&W)W.write(d4.clearTerminal);b.incrementClearCount()}},[u.length,q,M,W,b,$]);let J0=TJ(()=>{return G.some((c)=>c.status==="pending"||c.status==="in_progress")},[G]),f=N?0:M??0,E=f,m=TJ(()=>{let c=[];if(c.push(v$(cZ,{},"header",!1,void 0,this)),E>0)c.push(v$(PJ,{collapsedCount:E},"collapsed-summary",!1,void 0,this));for(let d=f;d<u.length;d++){let a=u[d];if(Z0&&a.id===Z0)continue;if(a.role==="tool"&&I.current.has(a.id))continue;if(a.role==="assistant"&&F.has(a.id))continue;c.push(v$(H2,{flexDirection:"column",children:v$(C1,{content:a.content,role:a.role,terminalWidth:_,metadata:a.metadata,isPending:!1,messageId:a.id},void 0,!1,void 0,this)},a.id,!1,void 0,this))}return c},[u,f,E,_,Z0,F]),Y0=TJ(()=>B.length>0?[...m,...B]:m,[m,B]);return v$(H2,{flexDirection:"column",paddingX:2,children:v$(H2,{flexDirection:"column",children:[v$(IU,{items:Y0,children:(c)=>c},O,!1,void 0,this),z&&v$(H2,{marginBottom:1,children:v$(MJ,{content:z,isStreaming:Q,isExpanded:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&J0&&v$(H2,{marginTop:1,children:v$(dZ,{tasks:G,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)},aZ=kU.memo(DU);import{useMemoizedFn as l4,useMount as fU}from"ahooks";import{Box as t$,Text as v0,useFocus as vU,useFocusManager as VU}from"ink";import jU from"ink-select-input";import{memo as EU,useMemo as hU,useState as r4}from"react";import{jsxDEV as L0,Fragment as pU}from"react/jsx-dev-runtime";var gU=({isSelected:$})=>L0(t$,{marginRight:1,children:L0(v0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),mU=({isSelected:$,label:J})=>L0(v0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),iZ=EU(({onClose:$,onEdit:J})=>{let Y=z9(),X=m8()??"",{isFocused:Z}=vU({id:"model-selector"}),Q=VU(),[G,U]=r4(""),[z,K]=r4(!1),[O,q]=r4(null),N=s0(!1),[_]=r4(()=>{let L=process.stdout?.columns||80;return Math.max(20,L-8)});fU(()=>{if(Q?.focus("model-selector"),Y.length>0)U(Y[0].id)}),N0((L,R)=>{if(z)return;if(R.ctrl&&L==="c"||R.meta&&L==="c"){N();return}if(R.escape){$();return}if(!Z)return;if(L==="d"||L==="D"){W();return}if((L==="e"||L==="E")&&J)b()},{isActive:!0});let H=l4(async(L)=>{if(z)return;let R=L.value;if(R===X){$();return}K(!0),q(null);try{await z$().setCurrentModel(R),$()}catch(k){q(k.message),K(!1)}}),W=l4(async()=>{if(z||G===X)return;K(!0),q(null);try{if(await z$().removeModel(G),Y.length<=1)$()}catch(L){q(L.message)}finally{K(!1)}}),b=l4(()=>{if(z||!J)return;let L=Y.find((R)=>R.id===G);if(!L)return;J(L)}),M=l4((L)=>{U(L.value)}),w=hU(()=>{return Y.find((L)=>L.id===G)},[Y,G]),B=w?a4()?.modelProviders[w.provider]:void 0,C=Y.map((L)=>{let R=L.id===X?" (当前)":"";return{label:yJ(L)+R,value:L.id}}),F=G===X;return L0(t$,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[L0(t$,{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(t$,{flexDirection:"row",children:[L0(t$,{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(t$,{marginTop:1,children:L0(jU,{items:C,onSelect:H,onHighlight:M,indicatorComponent:gU,itemComponent:mU},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(t$,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[L0(v0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),L0(t$,{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(t$,{flexDirection:"column",children:[L0(v0,{children:[L0(v0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),L0(v0,{bold:!0,color:"cyan",children:yJ(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(pU,{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:b1().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(t$,{marginTop:1,children:L0(v0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(t$,{justifyContent:"center",marginTop:1,children:L0(v0,{dimColor:!0,children:"─".repeat(_)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(t$,{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 IJ}from"ahooks";import{Box as ZK,Text as SJ}from"ink";import{useState as B2}from"react";import{Box as F2,Text as k1}from"ink";import xU from"ink-text-input";import{jsxDEV as w$}from"react/jsx-dev-runtime";var oZ=({provider:$,value:J,onChange:Y,onSubmit:X,onCancel:Z,error:Q})=>{return N0((G,U)=>{if(U.escape)Z()}),w$(F2,{flexDirection:"column",children:[w$(F2,{marginBottom:1,children:w$(k1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(F2,{marginBottom:1,children:w$(k1,{children:["Provider: ",w$(k1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),w$(F2,{marginBottom:1,children:w$(k1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(F2,{children:[w$(k1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),w$(xU,{value:J,onChange:Y,onSubmit:X,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&w$(F2,{marginTop:1,children:w$(k1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(F2,{marginTop:1,children:w$(k1,{dimColor:!0,children:["输入完成后按 ",w$(k1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",w$(k1,{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 i4,Text as i1}from"ink";import cU from"ink-text-input";import{useState as o4}from"react";import{jsxDEV as x$}from"react/jsx-dev-runtime";var n4=["id","name","baseUrl","model"];function nZ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function uU($,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 dU($,J){let Y=$.id.trim(),X={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:J},Z=sZ(Y,X);if(!$.model.trim())Z.push("Model ID must not be empty");if(Z.length>0)throw Error(Z[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:X}}var eZ=({wireApi:$,initialConfig:J,onSubmit:Y,onCancel:X})=>{let Z={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,G]=o4(J?3:0),[U,z]=o4(J?.model??""),[K,O]=o4(Z),[q,N]=o4(),_=n4[Q];N0((W,b)=>{if(!b.escape)return;if(N(void 0),Q===0){X();return}let M=Q-1,w=n4[M];G(M),z(K[w])});let H=(W)=>{let b=W.trim();if(_==="id"&&!tZ.test(b)){N("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(_==="baseUrl")try{let w=new URL(b);if(!["http:","https:"].includes(w.protocol))throw Error()}catch{N("Base URL 必须是绝对 HTTP(S) URL");return}if(_==="model"&&!b){N("Model ID 不能为空");return}let M={...K,[_]:_==="name"&&!b?K.id:b};if(O(M),N(void 0),Q===n4.length-1){try{Y(dU(M,$))}catch(w){N(w instanceof Error?w.message:"渠道配置无效")}return}G(Q+1),z("")};return x$(i4,{flexDirection:"column",children:[x$(i4,{marginBottom:1,children:x$(i1,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x$(i1,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),n4.slice(0,Q).map((W)=>x$(i1,{children:[nZ(W),": ",x$(i1,{color:"cyan",children:K[W]},void 0,!1,void 0,this)]},W,!0,void 0,this)),x$(i4,{marginTop:1,children:[x$(i1,{bold:!0,children:[nZ(_),": "]},void 0,!0,void 0,this),x$(cU,{value:U,onChange:(W)=>{z(W),N(void 0)},onSubmit:H,placeholder:uU(_,$,K.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_==="name"&&x$(i1,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),q&&x$(i1,{color:"red",children:q},void 0,!1,void 0,this),x$(i4,{marginTop:1,children:x$(i1,{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 Y5,useState as t2}from"react";var Z5=()=>{let[$,J]=t2([]),[Y,X]=t2(!0),[Z,Q]=t2(null);return Y5(()=>{let G=!1;return(async()=>{try{let z=await $5();if(!G)J(z)}catch(z){if(!G)Q(z instanceof Error?z.message:"加载 Provider 列表失败")}finally{if(!G)X(!1)}})(),()=>{G=!0}},[]),{providers:$,isLoading:Y,error:Z}},X5=($)=>{let[J,Y]=t2([]),[X,Z]=t2(!1),[Q,G]=t2(null);return Y5(()=>{if(!$){Y([]),Z(!1),G(null);return}let U=!1;return Y([]),Z(!0),G(null),(async()=>{try{let K=await J5($);if(!U)Y(K)}catch(K){if(!U)G(K instanceof Error?K.message:"加载模型列表失败")}finally{if(!U)Z(!1)}})(),()=>{U=!0}},[$]),{models:J,isLoading:X,error:Q}};import{Box as D1,Text as G1}from"ink";import lU from"ink-select-input";import rU from"ink-text-input";import{useMemo as Q5,useState as aU}from"react";import{jsxDEV as G$,Fragment as tU}from"react/jsx-dev-runtime";var iU=({isSelected:$})=>G$(D1,{marginRight:1,children:G$(G1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),oU=($)=>{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(" ")},nU=({isSelected:$,label:J})=>G$(G1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),G5=({provider:$,models:J,isLoading:Y,error:X,onSelect:Z,onCancel:Q})=>{let[G,U]=aU("");N0((O,q)=>{if(q.escape)if(G)U("");else Q()});let z=Q5(()=>{if(!G)return J;let O=G.toLowerCase();return J.filter((q)=>q.name.toLowerCase().includes(O)||q.id.toLowerCase().includes(O))},[J,G]),K=Q5(()=>z.map((O)=>({key:O.id,label:oU(O),value:O})),[z]);if(Y)return G$(D1,{flexDirection:"column",children:G$(G1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(X)return G$(D1,{flexDirection:"column",children:[G$(G1,{color:"red",children:X},void 0,!1,void 0,this),G$(G1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return G$(D1,{flexDirection:"column",children:[G$(D1,{marginBottom:1,children:G$(G1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G$(D1,{marginBottom:1,children:G$(G1,{children:["Provider: ",G$(G1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G$(tU,{children:[G$(D1,{marginBottom:1,children:[G$(G1,{color:"cyan",children:"> "},void 0,!1,void 0,this),G$(rU,{value:G,onChange:U,placeholder:`搜索 ${J.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G$(D1,{marginBottom:1,children:G$(G1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G$(D1,{flexDirection:"column",height:12,children:G$(lU,{items:K,onSelect:(O)=>Z(O.value),indicatorComponent:iU,itemComponent:nU,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.length===0&&G$(G1,{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 L2,Text as o1}from"ink";import sU from"ink-select-input";import eU from"ink-text-input";import{useMemo as U5,useState as $K}from"react";import{jsxDEV as P$}from"react/jsx-dev-runtime";var JK=({isSelected:$})=>P$(L2,{marginRight:1,children:P$(o1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),YK=({isSelected:$,label:J})=>P$(o1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),K5=({providers:$,isLoading:J,error:Y,onSelect:X,onCancel:Z})=>{let[Q,G]=$K("");N0((K,O)=>{if(O.escape)if(Q)G("");else Z()});let U=U5(()=>{if(!Q)return $;let K=Q.toLowerCase();return $.filter((O)=>O.name.toLowerCase().includes(K)||O.id.toLowerCase().includes(K))},[$,Q]),z=U5(()=>U.map((K)=>({key:K.id,label:`${K.name} - ${K.modelCount} models${K.configured?" [configured]":""}`,value:K})),[U]);if(J)return P$(L2,{flexDirection:"column",children:P$(o1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return P$(L2,{flexDirection:"column",children:[P$(o1,{color:"red",children:Y},void 0,!1,void 0,this),P$(o1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return P$(L2,{flexDirection:"column",children:[P$(L2,{marginBottom:1,children:P$(o1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(L2,{marginBottom:1,children:[P$(o1,{color:"cyan",children:"> "},void 0,!1,void 0,this),P$(eU,{value:Q,onChange:G,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P$(L2,{flexDirection:"column",height:12,children:P$(sU,{items:z,onSelect:(K)=>X(K.value),indicatorComponent:JK,itemComponent:YK,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.length===0&&P$(o1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function z5($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as n1}from"react/jsx-dev-runtime";var kJ=({mode:$,initialConfig:J,modelId:Y,onComplete:X,onCancel:Z})=>{let[Q,G]=B2("provider"),[U,z]=B2(),[K,O]=B2(),[q,N]=B2(),[_,H]=B2(""),[W,b]=B2(),[M,w]=B2(!1),B=Z5(),C=X5(U?.id),F=s0(!1);N0((k,T)=>{if(T.ctrl&&k==="c"||T.meta&&k==="c")$==="setup"?F():Z()});let A=IJ(async(k)=>{if(!U)return;let T=q??(K?{provider:U.id,model:K.id,displayName:J?.displayName}:void 0);if(!T)return;w(!0),b(void 0);try{if(T.modelProvider)b1().registerModelProvider(T.provider,T.modelProvider,[T.model]);if(k?.trim())await b1().setApiKey(T.provider,k.trim());let I={displayName:T.displayName,provider:T.provider,model:T.model,overrides:T.overrides};if($==="setup")await X(T);else if($==="add"){let P=T.modelProvider?await z$().addModelWithProvider(I,T.modelProvider):await z$().addModel(I);await z$().setCurrentModel(P.id),await X(T)}else if(Y){if(T.modelProvider)await z$().updateModelWithProvider(Y,I,T.modelProvider);else await z$().updateModel(Y,I);await X(T)}}catch(I){if(T.modelProvider){await b1().credentials.delete(T.provider);let P=a4();b1().configureModelProviders(P?.modelProviders??{},P?.models??[])}b(I instanceof Error?I.message:"保存配置失败"),w(!1)}}),L=IJ((k)=>{if(O(k),U?.configured)A();else if(U?.supportsApiKey)G("credential");else b(`${U?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),R=IJ(()=>{if(b(void 0),Q==="credential"&&q){G("custom");return}let k=z5(Q);if(k)G(k)});return n1(ZK,{flexDirection:"column",padding:1,children:[n1(SJ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&n1(K5,{...B,onSelect:(k)=>{z(k),O(void 0),N(void 0),G(k.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),Q==="custom"&&U?.factoryWireApi&&n1(eZ,{wireApi:U.factoryWireApi,initialConfig:q,onSubmit:(k)=>{N(k),G("credential")},onCancel:R},void 0,!1,void 0,this),Q==="model"&&U&&n1(G5,{provider:U,...C,onSelect:L,onCancel:R},void 0,!1,void 0,this),Q==="credential"&&U&&n1(oZ,{provider:U,value:_,onChange:H,onSubmit:()=>void A(_),onCancel:R,error:W},void 0,!1,void 0,this),M&&n1(SJ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),W&&Q!=="credential"&&n1(SJ,{color:"red",children:W},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as A8}from"ahooks";import{promises as N5}from"fs";import{Box as c$,Text as Y$}from"ink";import q5 from"ink-select-input";import XK from"ink-text-input";import QK from"os";import t4 from"path";import{useEffect as GK,useMemo as s4,useRef as UK,useState as t1}from"react";import{jsxDEV as y0}from"react/jsx-dev-runtime";var b8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],KK={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},zK={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},_5={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},qK=["project","global","local"],_K={allow:[],ask:[],deny:[]},OK={localExists:!1,projectExists:!1,globalExists:!1},O5={allow:[],ask:[],deny:[]};function NK($){let J=(X)=>Array.isArray(X)?X.filter((Z)=>typeof Z==="string"):[],Y=$?.permissions??{};return{allow:J(Y?.allow),ask:J(Y?.ask),deny:J(Y?.deny)}}async function WK($){try{let J=await N5.readFile($,"utf-8"),Y=JSON.parse(J);return{exists:!0,raw:Y,permissions:NK(Y)}}catch(J){if(J.code==="ENOENT")return{exists:!1,raw:{},permissions:{...O5}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,J),{exists:!0,raw:{},permissions:{...O5}}}}function HK($,J){let Y=$.padEnd(32," "),X=J==="local"?`${_5[J]} <- 可删除`:_5[J];return`${Y} ${X}`}var W5=({onClose:$})=>{let Y=X$()==="permissions-manager",X=s0(!1),[Z,Q]=t1(0),G=b8[Z].key,[U,z]=t1(_K),[K,O]=t1(OK),[q,N]=t1(!0),[_,H]=t1("list"),[W,b]=t1(""),[M,w]=t1(null),[B,C]=t1(null),F=UK(!1),A=s4(()=>t4.join(K$(),".blade","settings.local.json"),[]),L=s4(()=>t4.join(K$(),".blade","settings.json"),[]),R=s4(()=>t4.join(QK.homedir(),".blade","settings.json"),[]),k=A8(async()=>{N(!0);let c=await Promise.all([{source:"local",path:A},{source:"project",path:L},{source:"global",path:R}].map(async({source:F0,path:T0})=>{let y=await WK(T0);return{source:F0,path:T0,...y}})),d={localExists:c.find((F0)=>F0.source==="local")?.exists??!1,projectExists:c.find((F0)=>F0.source==="project")?.exists??!1,globalExists:c.find((F0)=>F0.source==="global")?.exists??!1};O(d);let a={allow:[],ask:[],deny:[]},W0=Object.fromEntries(c.map((F0)=>[F0.source,F0]));["allow","ask","deny"].forEach((F0)=>{qK.forEach((T0)=>{(W0[T0]?.permissions[F0]??[]).forEach((D,p)=>{let V={key:`${T0}:${p}:${D}`,rule:D,source:T0};a[F0].push(V)})})}),z(a),N(!1)});GK(()=>{k()},[k]);let T=A8(async(Y0,c)=>{try{let d=t4.join(K$(),".blade","settings.local.json"),a={allow:[],ask:[],deny:[]};try{let F0=await N5.readFile(d,"utf-8"),y=JSON.parse(F0).permissions||{};a={allow:Array.isArray(y.allow)?y.allow:[],ask:Array.isArray(y.ask)?y.ask:[],deny:Array.isArray(y.deny)?y.deny:[]}}catch(F0){}let W0=c(a);await z$().updateConfig({permissions:W0},{scope:"local",immediate:!0}),await k()}catch(d){throw console.error("[PermissionsManager] 修改权限规则失败:",d),d}});N0((Y0,c)=>{if(c.ctrl&&Y0==="c"||c.meta&&Y0==="c"){X();return}if(_==="locked"){if(F.current){F.current=!1;return}H("list"),w(null),C(null);return}if(c.escape){if(_==="list"||G==="info")$();else H("list"),b(""),w(null),C(null);return}if(_==="list"){if(c.tab&&c.shift)Q((d)=>(d-1+b8.length)%b8.length);else if(c.tab)Q((d)=>(d+1)%b8.length);else if(Y0?.toLowerCase()==="q")$()}},{isActive:Y});let I=A8((Y0)=>{let c=Y0.value;if(G==="info")return;if(c.type==="add"){H("add"),b(""),C(null);return}if(c.entry.source!=="local"){H("locked"),F.current=!0,w({tab:G,entry:c.entry}),C({type:"error",text:c.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}H("confirm-delete"),w({tab:G,entry:c.entry}),C(null)}),P=A8(async()=>{if(G==="info")return;let Y0=W.trim();if(!Y0){C({type:"error",text:"Permission rule 不能为空"});return}if(U[G].map((d)=>d.rule).includes(Y0)){C({type:"error",text:"该规则已存在"});return}try{await T(G,(d)=>{let a={allow:[...d.allow],ask:[...d.ask],deny:[...d.deny]};return a[G]=[...new Set([...d[G],Y0])],a}),H("list"),b(""),C({type:"success",text:"已添加本地权限规则"})}catch(d){C({type:"error",text:`保存失败: ${d instanceof Error?d.message:"未知错误"}`})}}),j=A8(async()=>{if(!M)return;let{tab:Y0,entry:c}=M;try{await T(Y0,(d)=>{let a={allow:[...d.allow],ask:[...d.ask],deny:[...d.deny]};return a[Y0]=d[Y0].filter((W0)=>W0!==c.rule),a}),H("list"),w(null),C({type:"success",text:"已删除本地权限规则"})}catch(d){C({type:"error",text:`删除失败: ${d instanceof Error?d.message:"未知错误"}`})}}),o=s4(()=>{if(G==="info")return[];let Y0=G;return[{key:"add-new-rule",label:`› ${KK[Y0]}`,value:{type:"add"}},...U[Y0].map((d)=>({key:d.key,label:HK(d.rule,d.source),value:{type:"rule",entry:d}}))]},[G,U]),u=()=>y0(c$,{marginBottom:1,children:b8.map((Y0,c)=>y0(c$,{marginRight:2,children:y0(Y$,{color:c===Z?"yellow":"gray",children:["[",Y0.label,"]"]},void 0,!0,void 0,this)},Y0.key,!1,void 0,this))},void 0,!1,void 0,this),Z0=()=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),y0(c$,{flexDirection:"column",marginLeft:2,children:[y0(Y$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",K.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(Y$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",K.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(Y$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",K.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y0(Y$,{children:"说明:"},void 0,!1,void 0,this),y0(c$,{flexDirection:"column",marginLeft:2,children:[y0(Y$,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),y0(Y$,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),y0(Y$,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z0=(Y0)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:zK[Y0]},void 0,!1,void 0,this),y0(Y$,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),y0(c$,{marginTop:1,children:y0(XK,{value:W,onChange:b,onSubmit:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0=(Y0,c)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:["Delete ",Y0," permission rule?"]},void 0,!0,void 0,this),y0(Y$,{children:c.rule},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),y0(Y$,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),y0(q5,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(d)=>{if(d.value==="yes")j();else H("list"),w(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f=(Y0)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),y0(Y$,{children:Y0.rule},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:Y0.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(Y$,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E=(Y0)=>y0(q5,{items:o,isFocused:_==="list",onSelect:I},void 0,!1,void 0,this),m=()=>{if(q)return y0(Y$,{children:"加载中..."},void 0,!1,void 0,this);if(G==="info")return Z0();if(_==="add")return z0(G);if(_==="confirm-delete"&&M)return J0(M.tab,M.entry);if(_==="locked"&&M)return f(M.entry);return E(G)};return y0(c$,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[y0(Y$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),u(),y0(c$,{flexDirection:"column",gap:1,children:m()},void 0,!1,void 0,this),B&&y0(c$,{marginTop:1,children:y0(Y$,{color:B.type==="success"?"green":"red",children:B.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(c$,{marginTop:1,children:y0(Y$,{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 FK,useState as w2}from"react";import{jsxDEV as s}from"react/jsx-dev-runtime";var DJ=["local","project","global"];function A5({workspaceRoot:$,onCancel:J}){let Y=X$()==="plugins-manager",X=F5($),Z=X.getAll(),[Q,G]=w2(0),[U,z]=w2(!1),[K,O]=w2(""),[q,N]=w2(null),[_,H]=w2("local"),[W,b]=w2(null),[M,w]=w2(0),B=X.getBySource(),C=X.getStats(),F=X.getSourcePolicy(),A=s0(!1,J);FK(()=>{let P=!0;return H5.getInstance().loadWorkspacePluginSettingsResolution(X.getWorkspaceRoot()).then((j)=>{if(P)b(j.settings)}).catch((j)=>{if(P)O(j instanceof Error?j.message:"无法读取插件作用域配置")}),()=>{P=!1}},[X,M]);let L=()=>{H((P)=>{let j=DJ.indexOf(P);return DJ[(j+1)%DJ.length]}),N(null)},R=async()=>{let P=Z[Q];if(!P||U)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 L5(X.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)}},k=async()=>{if(U)return;z(!0),O("");try{await B5(X.getWorkspaceRoot()),G(0),O("插件列表已刷新"),w((P)=>P+1)}catch(P){O(P instanceof Error?P.message:String(P))}finally{z(!1)}},T=async()=>{let P=Z[Q];if(!P||U)return;if(!P.installation){O(`${P.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}z(!0),N(null),O("");try{let{result:j}=await w5(X.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)}},I=async()=>{let P=Z[Q];if(!P||U)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 P5(X.getWorkspaceRoot(),P.manifest.name,!0);if(!j.success)throw Error(j.error);N(null),G(0),O(`已卸载 ${P.manifest.name}`),w((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{z(!1)}};if(N0((P,j)=>{if(j.escape)J?.();else if(j.ctrl&&P==="c"||j.meta&&P==="c")A();else if((j.upArrow||P==="k")&&Z.length>0)N(null),G((o)=>(o-1+Z.length)%Z.length);else if((j.downArrow||P==="j")&&Z.length>0)N(null),G((o)=>(o+1)%Z.length);else if(P===" "||j.return)R();else if(P==="r")k();else if(P==="s")L();else if(P==="u")T();else if(P==="x")I()},{isActive:Y}),Z.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=Z.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=Z.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:["生效层级:"," ",W?.[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=Z.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:["生效层级:"," ",W?.[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),U&&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 LK}from"ink";import BK from"ink-text-input";import fJ,{useCallback as M8,useMemo as wK,useState as s1}from"react";import{jsxDEV as V0}from"react/jsx-dev-runtime";var PK=fJ.memo(({option:$,index:J,isSelected:Y,isMultiSelect:X,isHighlighted:Z})=>V0(M$,{flexDirection:"column",marginBottom:1,children:[V0(T$,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[X?Y?"(*) ":"( ) ":Z?"> ":" ",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)),AK=fJ.memo(({questions:$,answers:J})=>V0(M$,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let X=J[Y.header],Z=Array.isArray(X)?X.join(", "):X||"(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:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),b5=fJ.memo(({questions:$,onComplete:J,onCancel:Y})=>{let{stdout:X}=LK(),Z=X.columns||80,G=X$()==="confirmation-prompt",U=s0(!1),[z,K]=s1("answering"),[O,q]=s1(0),[N,_]=s1({}),[H,W]=s1(0),[b,M]=s1([]),[w,B]=s1(!1),[C,F]=s1(""),[A,L]=s1(0),R=$[O],k=wK(()=>{if(!R)return[];return[...R.options.map((u)=>({label:u.label,value:u.label,description:u.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[R]),T=M8((u)=>{let Z0={...N,[R.header]:u};if(_(Z0),O<$.length-1)q(O+1),W(0),M([]),B(!1),F("");else K("submit"),L(0)},[N,R?.header,O,$.length]),I=M8((u)=>{let Z0=k[u];if(!Z0)return;if(Z0.value==="__other__"){B(!0);return}if(R.multiSelect)M((z0)=>z0.includes(Z0.value)?z0.filter((J0)=>J0!==Z0.value):[...z0,Z0.value]);else T(Z0.value)},[k,R?.multiSelect,T]),P=M8((u)=>{if(u.trim())T(u.trim())},[T]),j=M8(()=>{K("answering"),q(0),W(0),M([]),B(!1)},[]),o=M8(()=>{J(N)},[N,J]);if(N0((u,Z0)=>{if(Z0.ctrl&&u==="c"||Z0.meta&&u==="c"){U();return}if(w){if(Z0.escape)B(!1),F("");return}if(Z0.escape){Y();return}let z0=parseInt(u);if(z0>=1&&z0<=k.length){I(z0-1);return}if(Z0.upArrow){W((J0)=>J0>0?J0-1:k.length-1);return}if(Z0.downArrow||Z0.tab){W((J0)=>J0<k.length-1?J0+1:0);return}if(Z0.return){if(R.multiSelect&&b.length>0)T(b);else I(H);return}if(u===" "&&R.multiSelect){let J0=k[H];if(J0&&J0.value!=="__other__")M((f)=>f.includes(J0.value)?f.filter((E)=>E!==J0.value):[...f,J0.value]);return}},{isActive:G&&z==="answering"&&!w}),N0((u,Z0)=>{if(Z0.ctrl&&u==="c"||Z0.meta&&u==="c"){U();return}if(Z0.escape){Y();return}if(Z0.upArrow||Z0.downArrow||Z0.tab){L((z0)=>z0===0?1:0);return}if(Z0.return){if(A===0)o();else j();return}if(u.toLowerCase()==="y"){o();return}if(u.toLowerCase()==="e"){j();return}},{isActive:G&&z==="submit"}),z==="submit")return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:G?"green":"gray",padding:1,width:Math.min(Z-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(AK,{questions:$,answers:N},void 0,!1,void 0,this),V0(M$,{flexDirection:"column",marginTop:1,children:[V0(T$,{color:A===0?"yellow":void 0,bold:A===0,children:[A===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),V0(T$,{color:A===1?"yellow":void 0,bold:A===1,children:[A===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(!R)return null;return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:G?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[V0(M$,{marginBottom:1,children:[V0(T$,{backgroundColor:"blue",color:"white",children:[" ",R.header," "]},void 0,!0,void 0,this),V0(T$,{children:[" ",R.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(BK,{value:C,onChange:F,onSubmit:P,focus:G},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:k.map((u,Z0)=>V0(PK,{option:u,index:Z0,isSelected:b.includes(u.value),isMultiSelect:R.multiSelect,isHighlighted:H===Z0},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:R.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),R.multiSelect&&b.length>0&&V0(T$,{color:"green",children:["Selected: ",b.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 jJ,Text as f1,useStdout as SK}from"ink";import{useEffect as EJ,useMemo as J6,useRef as P2,useState as A2}from"react";function bK($,J){return[...$,J].join(`
|
|
160
|
+
`).replace(/\n+$/,"")}function T8($){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 R5({messages:$,currentStreamingMessageId:J,streamingLines:Y,streamingTail:X,currentThinkingContent:Z}){let Q=bK(Y,X),G=[];for(let U of $){let z=U.id===J?Q:U.content,K=U.metadata&&"phase"in U.metadata?String(U.metadata.phase):"",O=U.id===J?Z??U.thinkingContent:U.thinkingContent;if(U.role==="assistant"&&O)G.push({id:`${U.id}:thinking`,messageId:U.id,role:"assistant",kind:"thinking",content:O,revision:`${U.timestamp}:thinking:${T8(O)}`,collapsible:!0});let q=U.role==="tool"&&U.metadata&&"detail"in U.metadata&&typeof U.metadata.detail==="string"&&U.metadata.detail.length>0?U.metadata.detail:void 0;G.push({id:U.id,messageId:U.id,role:U.role,kind:U.role==="tool"?"tool":"message",content:z,detail:q,revision:`${U.timestamp}:${T8(z)}:${T8(q??"")}:${K}`,collapsible:q!==void 0})}if(J&&!G.some((U)=>U.id===J)){if(Z)G.push({id:`${J}:thinking`,messageId:J,role:"assistant",kind:"thinking",content:Z,revision:`stream:thinking:${T8(Z)}`,collapsible:!0});G.push({id:J,messageId:J,role:"assistant",kind:"message",content:Q,revision:`stream:${T8(Q)}`,collapsible:!1})}return G}var M5={user:"> ",assistant:"• ",system:" ",tool:"└ "};function e4($,J,Y){let X=J.text.length>0?J.text.split(`
|
|
161
161
|
`):[""],Z=[];for(let[Q,G]of X.entries()){let U=Z.length===0?J.firstPrefix:J.nextPrefix,z=Math.max(1,Y-U.length),K=u2(G,z,!0),O=0;for(let q of K){let N=q.length>0?G.indexOf(q,O):O,_=N>=0?N:O,H=_+q.length,W=Z.length===0?J.firstPrefix:J.nextPrefix;Z.push({key:`${$.id}:${J.key}:${Q}:${Z.length}`,blockId:$.id,role:$.role,kind:$.kind,text:`${W}${q}`,copyText:q,pending:$.pending===!0,header:J.header&&Z.length===0,sourceLine:J.sourceLineOffset+Q,sourceStart:_,sourceEnd:H,sourceTextOffset:W.length}),O=H}}return Z}function T5($){return $.length===0?0:$.split(`
|
|
162
|
-
`).length}function
|
|
163
|
-
`)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function vJ($,J,Y=!1){if($.kind==="thinking"){let X=Y?"[-]":"[+]",Z=
|
|
162
|
+
`).length}function MK($){let J=$.split(`
|
|
163
|
+
`)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function vJ($,J,Y=!1){if($.kind==="thinking"){let X=Y?"[-]":"[+]",Z=MK($.content),Q=`${X} Thinking (${T5($.content)} lines)${!Y&&Z?` - ${Z}`:""}`,G={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[G];return[G,...e4($,{text:$.content,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:0,key:"thinking",header:!1},J)]}if($.kind==="tool"&&$.detail){let X=Y?"[-]":"[+]",Z=e4($,{text:$.content,firstPrefix:`${M5.tool}${X} `,nextPrefix:" ",sourceLineOffset:0,key:"summary",header:!0},J);if(!Y)return Z;return[...Z,...e4($,{text:$.detail,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:T5($.content),key:"detail",header:!1},J)]}return e4($,{text:$.content.length>0?$.content:"…",firstPrefix:M5[$.role],nextPrefix:" ",sourceLineOffset:0,key:"content",header:!0},J)}function C5($,J,Y=new Set){return $.flatMap((X,Z)=>{let Q=vJ(X,J,Y.has(X.id));if(Z===$.length-1)return Q;return[...Q,{key:`${X.id}:separator`,blockId:X.id,role:X.role,kind:X.kind,text:"",copyText:"",pending:X.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})}function TK($){if($.kind==="tool"&&$.detail)return[...$.content.split(`
|
|
164
164
|
`),...$.detail.split(`
|
|
165
165
|
`)];return $.content.split(`
|
|
166
|
-
`)}function
|
|
167
|
-
`}${z.copyText}`}return G}function S5($,J){let Y=new Map($.map((X)=>[X.id,X.revision]));return J.filter((X)=>Y.get(X.id)!==X.revision).map((X)=>X.id)}import{spawn as
|
|
166
|
+
`)}function RK($,J){let Y=[];for(let[X,Z]of TK($).entries())for(let Q of Z.matchAll(J)){let G=Q.index,U=Q[0];if(U.length===0)continue;Y.push({blockId:$.id,sourceLine:X,start:G,end:G+U.length})}return Y}class R8{cache=new Map;search($,J){if(J.length===0)return[];let Y=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),X=new RegExp(Y,"giu"),Z=new Set($.map((Q)=>Q.id));for(let Q of this.cache.keys())if(!Z.has(Q))this.cache.delete(Q);return $.flatMap((Q)=>{let G=this.cache.get(Q.id);if(G?.revision===Q.revision&&G.query===J)return G.matches;let U=RK(Q,X);return this.cache.set(Q.id,{revision:Q.revision,query:J,matches:U}),U})}}function VJ($,J){let Y=$.findIndex((X)=>X.blockId===J.blockId&&X.sourceLine===J.sourceLine&&J.start>=X.sourceStart&&J.start<Math.max(X.sourceEnd,X.sourceStart+1));if(Y>=0)return Y;return $.findIndex((X)=>X.blockId===J.blockId)}function y5($,J){if($.sourceLine===null||$.sourceEnd<=$.sourceStart)return[];let Y=[];for(let[X,Z]of J.entries()){if(Z.blockId!==$.blockId||Z.sourceLine!==$.sourceLine||Z.end<=$.sourceStart||Z.start>=$.sourceEnd)continue;Y.push({start:$.sourceTextOffset+Math.max($.sourceStart,Z.start)-$.sourceStart,end:$.sourceTextOffset+Math.min($.sourceEnd,Z.end)-$.sourceStart,matchIndex:X})}return Y}function I5($,J,Y){let X=Math.max(0,Math.min(J,Y)),Z=Math.min($.length-1,Math.max(J,Y));if(Z<X)return"";let Q=$.slice(X,Z+1),G="";for(let[U,z]of Q.entries()){if(U===0){G=z.copyText;continue}let K=Q[U-1],O=z.sourceLine!==null&&z.blockId===K.blockId&&z.sourceLine===K.sourceLine;G+=`${O?"":`
|
|
167
|
+
`}${z.copyText}`}return G}function S5($,J){let Y=new Map($.map((X)=>[X.id,X.revision]));return J.filter((X)=>Y.get(X.id)!==X.revision).map((X)=>X.id)}import{spawn as CK}from"node:child_process";function yK($){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 IK($,J,Y){return new Promise((X)=>{let Z=!1,Q=CK($,[...J],{stdio:["pipe","ignore","ignore"]}),G=setTimeout(()=>{if(Z)return;Z=!0,Q.kill("SIGKILL"),X(!1)},2000),U=(z)=>{if(Z)return;Z=!0,clearTimeout(G),X(z)};Q.once("error",()=>U(!1)),Q.once("close",(z)=>U(z===0)),Q.stdin.once("error",()=>U(!1)),Q.stdin.end(Y)})}function k5($,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 $6($,J={}){if($.length===0)return{success:!1};let Y=J.platform??process.platform,X=J.env??process.env,Z=J.runCommand??IK,Q=J.writeTerminal??((z)=>process.stdout.write(z)),G=Boolean(X.SSH_CONNECTION),U=async(z)=>{try{return await Z(z.command,z.args,$)}catch{return!1}};if(!G){for(let z of yK(Y))if(await U(z))return{success:!0,method:"native"}}if(X.TMUX){if(await U({command:"tmux",args:["load-buffer","-w","-"]})){try{Q(k5($,!0))}catch{}return{success:!0,method:"tmux"}}}try{return Q(k5($)),{success:!0,method:"osc52"}}catch{return{success:!1}}}import{jsxDEV as s$}from"react/jsx-dev-runtime";function kK($){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 DK($,J,Y){let X=Array.from($.value);if(Y.backspace||Y.delete){if($.cursor===0)return $;return X.splice($.cursor-1,1),{value:X.join(""),cursor:$.cursor-1}}if(Y.leftArrow)return{...$,cursor:Math.max(0,$.cursor-1)};if(Y.rightArrow)return{...$,cursor:Math.min(X.length,$.cursor+1)};if(!J||Y.ctrl||Y.meta)return $;return X.splice($.cursor,0,...Array.from(J)),{value:X.join(""),cursor:$.cursor+Array.from(J).length}}var D5=({state:$,onLoadOlder:J,onFork:Y,onClose:X})=>{let Z=X$(),{width:Q,height:G}=d1(),{stdout:U}=SK(),z=Math.max(20,Q-4),K=Math.max(1,G-8),O=J6(()=>kK($.messages),[$.messages]),q=J6(()=>C5(O,z),[O,z]),N=Math.max(0,q.length-K),[_,H]=A2(0),W=P2(0),[b,M]=A2(()=>Math.max(0,q.length-1)),w=P2(b),B=P2(q.at(-1)?.key??null),[C,F]=A2(!1),A=P2(!1),[L,R]=A2({value:"",cursor:0}),k=P2(L),[T,I]=A2(""),[P,j]=A2(0),o=P2(new R8),u=P2(null),[Z0,z0]=A2(null),J0=J6(()=>$.session?{viewGeneration:$.viewGeneration,locator:$.session.locator,snapshot:$.snapshot,olderCursor:$.olderCursor}:void 0,[$.olderCursor,$.session,$.snapshot,$.viewGeneration]);W.current=_,w.current=b,A.current=C,k.current=L;let f=J6(()=>o.current.search(O,T),[O,T]);EJ(()=>{u.current=null},[$.olderCursor]),EJ(()=>{if($.status==="error")u.current=null},[$.status]),EJ(()=>{let V=B.current?q.findIndex((Q0)=>Q0.key===B.current):-1,n=q.length===0?0:V>=0?V:q.length-1;w.current=n,B.current=q[n]?.key??null,M(n);let O0=Math.max(0,Math.min(W.current,N));W.current=O0,H(O0)},[q,N]);let E=()=>{let V=$.olderCursor;if(!V||!J0||!$.session?.capabilities.history.read||$.status!=="ready"&&$.status!=="error")return;if(u.current===V)return;u.current=V,J(J0)},m=(V,n=!0)=>{let O0=Math.max(0,Math.min(N,V));W.current=O0,H(O0);let Q0=Math.max(1,q.length-O0),R0=Math.max(0,Q0-K),U0=Math.max(R0,Math.min(Q0-1,w.current));if(w.current=U0,B.current=q[U0]?.key??null,M(U0),n&&O0===N)E()},Y0=(V)=>{if(f.length===0)return;let n=(V%f.length+f.length)%f.length,O0=f[n],Q0=q.findIndex((U0)=>U0.blockId===O0.blockId);if(j(n),Q0<0)return;w.current=Q0,B.current=q[Q0]?.key??null,M(Q0);let R0=Math.max(0,q.length-Math.min(q.length,Q0+1));m(R0,!1)},c=()=>{let V=q[w.current];if(!V)return;$6(V.copyText,{writeTerminal:(n)=>U.write(n)}).then((n)=>{z0(n.success?"Copied":"Copy failed")})};N0((V,n)=>{let O0=n;if(A.current){if(O0.escape)return A.current=!1,F(!1),!0;if(O0.return){let R0=k.current.value;I(R0),A.current=!1,F(!1);let U0=o.current.search(O,R0);if(U0.length>0){let S0=U0[0],X0=q.findIndex((h0)=>h0.blockId===S0.blockId);if(j(0),X0>=0)w.current=X0,B.current=q[X0]?.key??null,M(X0),m(Math.max(0,q.length-Math.min(q.length,X0+1)),!1)}return!0}let Q0=DK(k.current,V,O0);return k.current=Q0,R(Q0),!0}if(O0.escape||V==="q")return X(),!0;if(V==="/"){let Q0={value:T,cursor:Array.from(T).length};return k.current=Q0,R(Q0),A.current=!0,F(!0),!0}if(V==="n"&&f.length>0)return Y0(P+1),!0;if(V==="N"&&f.length>0)return Y0(P-1),!0;if(V==="y")return c(),!0;if(V==="f"){if(J0&&$.session?.capabilities.history.fork&&$.status==="ready")Y(J0);return!0}if(O0.home||V==="g")return w.current=0,B.current=q[0]?.key??null,M(0),m(N),!0;if(O0.end||V==="G")return w.current=Math.max(0,q.length-1),B.current=q[w.current]?.key??null,M(w.current),m(0),!0;if(O0.pageUp)return m(W.current+Math.max(1,K-1)),!0;if(O0.pageDown)return m(W.current-Math.max(1,K-1)),!0;if(O0.upArrow||V==="k")return w.current=Math.max(0,w.current-1),B.current=q[w.current]?.key??null,M(w.current),m(W.current+1),!0;if(O0.downArrow||V==="j")return w.current=Math.min(q.length-1,w.current+1),B.current=q[w.current]?.key??null,M(w.current),m(W.current-1),!0;return!0},{isActive:Z==="session-history-viewer",priority:200});let d=Math.max(0,q.length-_),a=Math.max(0,d-K),W0=q.slice(a,d),F0=T?`/${T} ${f.length>0?`${P+1}/${f.length}`:"0/0"} · loaded pages only`:null,T0=$.session,y=[T0&&!T0.capabilities.history.read?"Older history unavailable":null,T0&&!T0.capabilities.history.fork?"Fork unavailable":null].filter((V)=>V!==null).join(" · "),D=$.status==="loading"?"Loading Session history…":$.status==="forking"?"Forking Session history…":$.status==="loading-older"?"Loading older history…":null,p=$.error?.message??D??Z0??F0??(y||`${$.status==="loading-older"?"Loading older history… · ":""}/ search · y copy · f fork · Esc close`);return s$(jJ,{flexDirection:"column",width:"100%",height:G,paddingX:2,children:[s$(jJ,{justifyContent:"space-between",children:[s$(f1,{bold:!0,color:"cyan",children:T0?.title?.trim()||"Session history"},void 0,!1,void 0,this),s$(f1,{color:"yellow",children:["Remote · ",T0?.capabilities.connection??"offline"," · History only"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s$(f1,{dimColor:!0,children:T0?.displayCwd??""},void 0,!1,void 0,this),$.truncated?s$(f1,{color:"yellow",children:"History content was truncated."},void 0,!1,void 0,this):null,s$(jJ,{flexDirection:"column",height:K,children:W0.map((V,n)=>s$(f1,{color:a+n===b?"cyan":void 0,children:V.text},V.key,!1,void 0,this))},void 0,!1,void 0,this),C?s$(f1,{children:["/",L.value]},void 0,!0,void 0,this):null,s$(f1,{color:$.error?"red":"gray",children:p},void 0,!1,void 0,this),s$(f1,{dimColor:!0,children:"Open this Session from its ACP owner to continue."},void 0,!1,void 0,this),s$(f1,{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 y8,Text as U1}from"ink";import fK from"ink-select-input";import{useEffect as f5,useMemo as b2,useRef as v5,useState as V5}from"react";import{jsxDEV as A$}from"react/jsx-dev-runtime";function vK($){let J=new Date($),X=new Date().getTime()-J.getTime(),Z=Math.floor(X/86400000);if(Z===0)return`今天 ${J.getHours().toString().padStart(2,"0")}:${J.getMinutes().toString().padStart(2,"0")}`;if(Z===1)return"昨天";if(Z<7)return`${Z}天前`;return`${J.getMonth()+1}/${J.getDate()}`}var VK=({isSelected:$})=>A$(y8,{marginRight:1,children:A$(U1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),jK=({isSelected:$,label:J})=>A$(U1,{color:$?"cyan":"white",bold:$,children:J},void 0,!1,void 0,this),C8=20,j5=({intent:$,sessions:J,taskAttentionUnreadKeys:Y=[],onSelect:X,onCancel:Z})=>{let[Q,G]=V5(0),[U,z]=V5(!1),K=v5(!1),O=v5(!0);f5(()=>{return O.current=!0,()=>{O.current=!1}},[]);let N=X$()==="session-selector",_=s0(!1);N0((A,L)=>{if(L.ctrl&&A==="c"||L.meta&&A==="c"){_();return}if(K.current)return;if(L.escape&&Z){Z();return}if(L.leftArrow||A==="h"||A==="H"){if(Q>0)G((R)=>R-1);return}if(L.rightArrow||A==="l"||A==="L"){if(Q<M-1)G((R)=>R+1);return}},{isActive:N});let H=b2(()=>Q4(J,$),[$,J]),W=b2(()=>a9($),[$]),b=b2(()=>new Set(Y),[Y]),M=b2(()=>Math.max(1,Math.ceil(H.length/C8)),[H.length]),w=b2(()=>{let A=Q*C8;return H.slice(A,A+C8)},[Q,H]),B=b2(()=>{return w.map((A)=>{let L=vK(A.lastMessageTime);return{key:c1(A),label:r9(A,L,$==="resume"&&b.has(p9(A))),value:A}})},[$,w,b]),C=b2(()=>({start:Q*C8+1,end:Math.min((Q+1)*C8,H.length)}),[Q,H.length]);f5(()=>{G(0)},[H.length]);let F=(A)=>{if(K.current)return;K.current=!0,z(!0);let L=()=>{if(!O.current)return;K.current=!1,z(!1)};Promise.resolve().then(()=>X(A.value)).then(L,L)};if(H.length===0)return A$(y8,{flexDirection:"column",paddingX:2,paddingY:1,children:[A$(U1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),A$(U1,{dimColor:!0,children:[`
|
|
168
168
|
`,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return A$(y8,{flexDirection:"column",paddingX:2,paddingY:1,children:[A$(U1,{bold:!0,color:"cyan",children:W.title},void 0,!1,void 0,this),A$(U1,{dimColor:!0,children:[`
|
|
169
169
|
`,W.instructions,`
|
|
170
|
-
`]},void 0,!0,void 0,this),A$(DK,{items:B,onSelect:F,isFocused:N&&!U,indicatorComponent:vK,itemComponent:VK},void 0,!1,void 0,this),U&&A$(U1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),A$(y8,{marginTop:1,flexDirection:"column",children:[A$(U1,{dimColor:!0,children:["第 ",Q+1,"/",M," 页 · 共 ",H.length," 个会话 · 显示"," ",C.start,"-",C.end]},void 0,!0,void 0,this),M>1&&A$(y8,{marginTop:1,children:[A$(U1,{color:Q>0?"cyan":"gray",children:Q>0?"<< 上一页":" "},void 0,!1,void 0,this),A$(U1,{children:" "},void 0,!1,void 0,this),A$(U1,{color:Q<M-1?"cyan":"gray",children:Q<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 E5,Text as I8}from"ink";import jK,{useEffect as EK,useState as hK}from"react";import{jsxDEV as e1}from"react/jsx-dev-runtime";var h5=["|","/","-","\\"],hJ=jK.memo(()=>{let $=E8(),J=D0(),Y=m2(),[X,Z]=hK(0);if(EK(()=>{if($?.status!=="loading"){Z(0);return}let Q=setInterval(()=>{Z((G)=>(G+1)%h5.length)},100);return()=>clearInterval(Q)},[$?.status]),!$)return null;return e1(E5,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[e1(E5,{children:[e1(I8,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),e1(I8,{color:J.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&e1(I8,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&e1(I8,{color:J.colors.text.secondary,children:[h5[X]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&e1(I8,{color:J.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this),$.status==="completed"&&$.response&&e1(C1,{content:$.response,role:"assistant",terminalWidth:Math.max(20,Y-8),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});hJ.displayName="SideConversationPanel";import{Box as _$,Text as t0}from"ink";import{jsxDEV as B0}from"react/jsx-dev-runtime";function m5({onCancel:$}){let J=q1(),Y=X$()==="skills-manager",Z=g5({cwd:J}).getAll(),Q=Z.filter((K)=>K.source==="builtin"),G=Z.filter((K)=>K.source==="user"),U=Z.filter((K)=>K.source==="project"),z=s0(!1,$);if(N0((K,O)=>{if(O.escape)$?.();else if(O.ctrl&&K==="c"||O.meta&&K==="c")z()},{isActive:Y}),Z.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:[" (找到 ",Z.length," 个)"]},void 0,!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),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),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 p5,Text as K1}from"ink";import gK,{useEffect as mK,useMemo as pK,useState as x5}from"react";import{jsxDEV as R$,Fragment as gJ}from"react/jsx-dev-runtime";var c5=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function xK($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let Y=Math.floor(J/60),X=J%60;return`${Y}m ${X}s`}var u5=gK.memo(()=>{let $=q0((K)=>K.app.subagentProgresses),J=q0((K)=>K.app.subagentProgress),Y=D0(),[X,Z]=x5(0),[Q,G]=x5(()=>Date.now()),U=pK(()=>{let K=Object.values($);return K.length>0?K:J?[J]:[]},[J,$]),z=U.some((K)=>K.status==="running");if(mK(()=>{if(!z){Z(0);return}let K=setInterval(()=>{Z((q)=>(q+1)%c5.length)},80),O=setInterval(()=>{G(Date.now())},1000);return()=>{clearInterval(K),clearInterval(O)}},[z]),U.length===0)return null;return R$(p5,{paddingX:2,paddingY:0,flexDirection:"column",children:U.map((K)=>{let O=K.status==="running"?c5[X]: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 R$(p5,{flexDirection:"row",gap:1,children:[R$(K1,{color:q,bold:!0,children:O},void 0,!1,void 0,this),R$(K1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.text.primary,bold:!0,children:K.type},void 0,!1,void 0,this),R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.text.secondary,children:K.description},void 0,!1,void 0,this),K.currentTool&&R$(gJ,{children:[R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.warning,children:K.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="running"&&N>0&&R$(gJ,{children:[R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.info,children:xK(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="failed"&&K.terminalSummary&&R$(gJ,{children:[R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{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 s2,Text as v1}from"ink";import cK from"react";import{jsxDEV as V$}from"react/jsx-dev-runtime";var mJ={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},pJ=cK.memo(()=>{let $=U9().filter((Y)=>Y.status!=="deleted"),J=D0();if($.length===0)return null;return V$(s2,{flexDirection:"column",paddingX:2,children:$.map((Y)=>{let X=Y.tasks.filter((Z)=>Z.status==="completed").length;return V$(s2,{flexDirection:"column",marginBottom:1,children:[V$(s2,{gap:1,children:[V$(v1,{bold:!0,color:Y.status==="failed"?J.colors.error:Y.status==="completed"?J.colors.success:J.colors.info,children:[mJ[Y.status]," Team"]},void 0,!0,void 0,this),V$(v1,{bold:!0,color:J.colors.text.primary,children:Y.name},void 0,!1,void 0,this),V$(v1,{color:J.colors.muted,children:["| ",Y.members.length-1," members | ",X,"/",Y.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V$(s2,{flexDirection:"column",paddingLeft:2,children:[Y.members.filter((Z)=>Z.status!=="leader").map((Z)=>V$(s2,{gap:1,children:[V$(v1,{color:J.colors.muted,children:mJ[Z.status]},void 0,!1,void 0,this),V$(v1,{color:J.colors.text.secondary,children:Z.name},void 0,!1,void 0,this),V$(v1,{color:J.colors.muted,children:["(",Z.subagentType,", ",Z.status,Z.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this)),Y.tasks.map((Z)=>V$(s2,{gap:1,children:[V$(v1,{color:J.colors.muted,children:mJ[Z.status]},void 0,!1,void 0,this),V$(v1,{color:J.colors.text.secondary,children:["#",Z.id," ",Z.subject]},void 0,!0,void 0,this),V$(v1,{color:J.colors.muted,children:["(",Z.status,Z.owner?`, ${Z.owner}`:"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this))]},void 0,!0,void 0,this)]},Y.name,!0,void 0,this)})},void 0,!1,void 0,this)});pJ.displayName="TeamProgress";import{useMemoizedFn as uK}from"ahooks";import{Box as N1,Text as K0}from"ink";import dK from"ink-select-input";import{useState as d5}from"react";import{jsxDEV as $0}from"react/jsx-dev-runtime";var l5=M2.map(($)=>({label:$.label,value:$.id})),lK=({theme:$})=>{let{colors:J}=$;return $0(N1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(K0,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),$0(K0,{children:[$0(K0,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(K0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(K0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{color:J.error,children:["- print(",$0(K0,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),$0(K0,{color:J.success,children:["+ print(",$0(K0,{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)},rK=({theme:$})=>{let{colors:J}=$;return $0(N1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),$0(K0,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),$0(K0,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),$0(K0,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),$0(K0,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),$0(K0,{color:J.info,children:J.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},r5=()=>{let $=x1(),J=F$.getCurrentThemeName(),Y=M2.findIndex((H)=>H.label===J),X=Y>=0?M2[Y].theme:M2[0].theme,[Z,Q]=d5(X),[G,U]=d5(!1),z=uK(async(H)=>{if(G)return;U(!0);try{await z$().setTheme(H.value),$.closeModal()}catch(W){console.error("主题切换失败:",W instanceof Error?W.message:W)}finally{U(!1)}}),K=(H)=>{let W=M2.find((b)=>b.id===H.value);if(W)Q(W.theme)},q=X$()==="theme-selector",N=s0(!1);N0((H,W)=>{if(W.ctrl&&H==="c"||W.meta&&H==="c"){N();return}if(W.escape&&!G)$.closeModal()},{isActive:q});let _=(H)=>{let{isSelected:W,label:b}=H,w=b===J?"[OK]":" ";return $0(K0,{color:W?Z.colors.primary:Z.colors.text.primary,children:[w," ",b]},void 0,!0,void 0,this)};return $0(N1,{flexDirection:"column",height:"100%",children:[$0(N1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:$0(K0,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(N1,{flexDirection:"row",flexGrow:1,children:[$0(N1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:$0(N1,{flexDirection:"column",children:[$0(N1,{paddingTop:1,paddingBottom:1,children:$0(K0,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",l5.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(dK,{items:l5,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(N1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[$0(lK,{theme:Z},void 0,!1,void 0,this),$0(rK,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(N1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:$0(K0,{color:Z.colors.text.muted,children:G?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as Y6,Text as H1,useStdout as aK}from"ink";import iK,{useCallback as V1,useEffect as T2,useMemo as xJ,useRef as m$,useState as W1}from"react";import{jsxDEV as C$}from"react/jsx-dev-runtime";function a5($,J){let Y=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(Y.length,$.cursor+J))}}function oK($,J,Y){let X=Array.from($.value);if(Y.leftArrow)return a5($,-1);if(Y.rightArrow)return a5($,1);if(Y.home)return{...$,cursor:0};if(Y.end)return{...$,cursor:X.length};if(Y.backspace&&$.cursor>0)return X.splice($.cursor-1,1),{value:X.join(""),cursor:$.cursor-1};if(Y.delete&&$.cursor<X.length)return X.splice($.cursor,1),{value:X.join(""),cursor:$.cursor};if(Y.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(Y.ctrl||Y.meta||J.length===0)return $;let Z=J.replace(/[\r\n\t]+/g," ");if(Z.length===0)return $;let Q=Array.from(Z);return X.splice($.cursor,0,...Q),{value:X.join(""),cursor:$.cursor+Q.length}}function nK({editor:$}){let J=Array.from($.value),Y=J.slice(0,$.cursor).join(""),X=J[$.cursor]??" ",Z=J.slice($.cursor+1).join("");return C$(H1,{wrap:"truncate-end",children:["/",Y,C$(H1,{inverse:!0,children:X},void 0,!1,void 0,this),Z,C$(H1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function tK({line:$,matches:J,currentMatchIndex:Y,selected:X,selectedBlock:Z,color:Q,highlightColor:G}){let U=y5($,J);if(X||U.length===0)return C$(H1,{wrap:"truncate-end",color:Q,inverse:X,bold:Z,underline:Z,children:$.text||" "},void 0,!1,void 0,this);let z=[],K=0;for(let O of U){if(O.start>K)z.push($.text.slice(K,O.start));z.push(C$(H1,{color:G,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 C$(H1,{wrap:"truncate-end",color:Q,bold:Z,underline:Z,children:z},void 0,!1,void 0,this)}var i5=iK.memo(({isOpen:$,onClose:J,compact:Y=!1})=>{let X=f8(),Z=a8(),Q=r8(),G=i8(),U=X$(),z=D0(),{stdout:K}=aK(),{width:O,height:q}=d1(),N=Y?Math.max(6,Math.floor(q*0.4)):q,_=Math.max(1,N-3),H=Math.max(12,O-4),W=m$(new Map),b=m$(new R8),[M,w]=W1(new Set),B=m$(M);B.current=M;let C=xJ(()=>R5({messages:X,currentStreamingMessageId:Z,streamingLines:G.lines,streamingTail:G.tail,currentThinkingContent:Q}),[X,Z,G.lines,G.tail,Q]),F=xJ(()=>{let e=new Set(C.map((S)=>S.id));for(let S of W.current.keys())if(!e.has(S))W.current.delete(S);return C.flatMap((S,v)=>{let g=M.has(S.id),x=W.current.get(S.id),r=x?.revision===S.revision&&x.width===H&&x.expanded===g?x.lines:vJ(S,H,g);if(r!==x?.lines)W.current.set(S.id,{revision:S.revision,width:H,expanded:g,lines:r});if(v===C.length-1)return r;return[...r,{key:`${S.id}:separator`,blockId:S.id,role:S.role,kind:S.kind,text:"",copyText:"",pending:S.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})},[C,H,M]),[A,L]=W1(0),[R,k]=W1(new Set),[T,I]=W1(null),P=m$(null),[j,o]=W1(!1),u=m$(!1),[Z0,z0]=W1({value:"",cursor:0}),J0=m$(Z0),[f,E]=W1(""),[m,Y0]=W1(0),c=m$(0),[d,a]=W1(null),W0=m$(null),[F0,T0]=W1(null),y=m$(0),D=m$(null),p=m$(0),V=m$(C),n=m$(F.length),O0=m$(H);p.current=A,P.current=T,u.current=j,J0.current=Z0,c.current=m,W0.current=d;let Q0=xJ(()=>b.current.search(C,f),[C,f]),R0=Math.max(0,F.length-_),U0=Math.max(0,F.length-A),S0=Math.max(0,U0-_),X0=V1((e)=>{let S=Math.max(0,Math.min(R0,e));if(p.current=S,L(S),S===0)k(new Set)},[R0]),h0=V1((e)=>{if(F.length===0)return;let S=Math.max(0,Math.min(F.length-1,e)),v=Math.max(0,Math.min(F.length-_,S-Math.floor(_/2))),g=Math.min(F.length,v+_);X0(F.length-g)},[F.length,X0,_]),H$=V1((e,S,v)=>{let g=new Set(B.current);if(S)g.add(e);else g.delete(e);B.current=g,D.current=v,w(g)},[]),g0=V1((e)=>{let S=C.find((g)=>g.id===e.blockId);if(S?.collapsible&&!B.current.has(S.id)){H$(S.id,!0,{blockId:S.id,match:e});return}let v=VJ(F,e);if(v>=0)h0(v)},[C,F,h0,H$]),N$=V1((e,S=Q0)=>{if(S.length===0){c.current=0,Y0(0);return}let v=(e%S.length+S.length)%S.length;c.current=v,Y0(v);let g=S[v];P.current=g.blockId,I(g.blockId),g0(g)},[Q0,g0]),u$=V1((e)=>{let S=C.filter((P0)=>P0.collapsible);if(S.length===0)return;let v=S.findIndex((P0)=>P0.id===P.current),g=v<0?e>0?0:S.length-1:(v+e+S.length)%S.length,x=S[g].id;P.current=x,I(x);let r=F.findIndex((P0)=>P0.blockId===x&&P0.header);if(r>=0)h0(r)},[C,F,h0]),r0=V1(()=>{let e=P.current;if(!e)e=F.slice(S0,U0).find((v)=>C.some((g)=>g.id===v.blockId&&g.collapsible))?.blockId??null;if(!e)return;if(!C.find((v)=>v.id===e)?.collapsible)return;P.current=e,I(e),H$(e,!B.current.has(e),{blockId:e})},[C,U0,F,H$,S0]),U$=V1((e,S)=>{let v=W0.current;if(!v||F.length===0)return;let g=S==="top"?0:S==="bottom"?F.length-1:Math.max(0,Math.min(F.length-1,v.head+e)),x={...v,head:g};W0.current=x,a(x),h0(g)},[F.length,h0]),d0=V1(()=>{let e=W0.current;if(!e)return;let S=I5(F,e.anchor,e.head);if(!S.trim()){T0("Nothing selected");return}let v=++y.current;T0("Copying..."),$6(S,{writeTerminal:(g)=>K.write(g)}).then((g)=>{if(y.current!==v)return;T0(g.success?g.method==="osc52"?"Copy sent via OSC 52":`Copied ${S.split(`
|
|
171
|
-
`).length} lines`:"Copy failed"),W0.current=null,a(null)})},[F,K]);T2(()=>{if(!F0)return;let e=setTimeout(()=>T0(null),2500);return()=>clearTimeout(e)},[F0]),T2(()=>{if(!$){y.current++,V.current=C,n.current=F.length;return}B.current=new Set,w(new Set),P.current=null,I(null),u.current=!1,o(!1),J0.current={value:"",cursor:0},z0({value:"",cursor:0}),E(""),c.current=0,Y0(0),W0.current=null,a(null),T0(null),p.current=0,L(0),k(new Set),V.current=C,n.current=F.length,O0.current=H},[$]),T2(()=>{let e=new Set(C.map((S)=>S.id));if(w((S)=>{let v=new Set([...S].filter((x)=>e.has(x)));return B.current=v,v.size===S.size&&[...v].every((x)=>S.has(x))?S:v}),P.current&&!e.has(P.current))P.current=null,I(null)},[C]),T2(()=>{let e=n.current;if(n.current=F.length,!$)return;let S=D.current;if(S){D.current=null;let g=S.match?VJ(F,S.match):F.findIndex((x)=>x.blockId===S.blockId&&x.header);if(g>=0)h0(g);return}if(p.current===0){k(new Set);return}let v=Math.max(0,F.length-e);if(v>0)L((g)=>{let x=Math.min(R0,g+v);return p.current=x,x});else if(p.current>R0)p.current=R0,L(R0)},[H,M,$,F.length,R0,h0]),T2(()=>{let e=V.current;if(V.current=C,!$||p.current===0)return;let S=S5(e,C);if(S.length===0)return;k((v)=>{let g=new Set(v);for(let x of S)g.add(x);return g})},[C,$]),T2(()=>{if(Q0.length===0)c.current=0,Y0(0);else if(c.current>=Q0.length)c.current=Q0.length-1,Y0(Q0.length-1)},[Q0.length]),T2(()=>{if(O0.current===H)return;O0.current=H,W0.current=null,a(null);let e=Q0[c.current];if(e)g0(e)},[H,Q0,g0]),N0((e,S)=>{if(!$)return;let v=S,g=U==="transcript-pager";if((v.ctrl||v.meta)&&e.toLowerCase()==="o")return J(),!0;if(!g){if(v.pageUp)return X0(p.current+Math.max(1,_-1)),!0;if(v.pageDown)return X0(p.current-Math.max(1,_-1)),!0;return!1}if(u.current){if(v.escape)return u.current=!1,o(!1),J0.current={value:f,cursor:Array.from(f).length},z0(J0.current),!0;if(v.return){let r=J0.current.value,P0=b.current.search(C,r);return E(r),u.current=!1,o(!1),N$(0,P0),!0}let x=oK(J0.current,e,v);return J0.current=x,z0(x),!0}if(e==="q")return J(),!0;if(W0.current){if(v.escape)return W0.current=null,a(null),!0;if(e==="y"||v.ctrl&&!v.meta&&e.toLowerCase()==="c")return d0(),!0;if(v.upArrow||e==="k")return U$(-1),!0;if(v.downArrow||e==="j")return U$(1),!0;if(v.pageUp)return U$(-Math.max(1,_-1)),!0;if(v.pageDown)return U$(Math.max(1,_-1)),!0;if(v.home||e==="g")return U$(0,"top"),!0;if(v.end||e==="G")return U$(0,"bottom"),!0;return!0}if(v.escape)return J(),!0;if(e==="/"){let x={value:f,cursor:Array.from(f).length};return J0.current=x,z0(x),u.current=!0,o(!0),!0}if(e==="n"&&Q0.length>0)return N$(c.current+1),!0;if(e==="N"&&Q0.length>0)return N$(c.current-1),!0;if(v.tab)return u$(v.shift?-1:1),!0;if(v.return||e==="e")return r0(),!0;if(e==="v"){if(F.length===0)return!0;let x=Math.max(0,F.length-p.current),r=Math.max(0,x-_),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 W0.current=c0,a(c0),h0(l0),!0}if(v.upArrow||e==="k")return X0(p.current+1),!0;if(v.downArrow||e==="j")return X0(p.current-1),!0;if(v.pageUp)return X0(p.current+Math.max(1,_-1)),!0;if(v.pageDown)return X0(p.current-Math.max(1,_-1)),!0;if(v.home||e==="g")return X0(R0),!0;if(v.end||e==="G")return X0(0),!0;return!0},{isActive:$,priority:100});let L1=F.slice(S0,U0),B1=R.size,$8=F.length===0?"0/0":`${Math.min(U0,F.length)}/${F.length}`,g1=d?Math.min(d.anchor,d.head):-1,y2=d?Math.max(d.anchor,d.head):-1,Y2=f.length>0?`/${f} ${Q0.length>0?`${m+1}/${Q0.length}`:"0/0"}`:null,I$=F0?F0:d?`${y2-g1+1} lines selected · y copy · Esc cancel`:Y2?`${Y2} · n/N`:B1>0?`${B1} new · G latest`:"Ctrl+O / Esc / q close";return C$(Y6,{flexDirection:"column",width:"100%",height:N,paddingX:2,children:[C$(Y6,{justifyContent:"space-between",flexShrink:0,children:[C$(H1,{bold:!0,color:z.colors.primary,children:"Transcript"},void 0,!1,void 0,this),C$(H1,{color:z.colors.text.muted,children:$8},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C$(Y6,{flexDirection:"column",height:_,flexShrink:0,overflow:"hidden",children:L1.length===0?C$(H1,{color:z.colors.text.muted,children:"No transcript yet"},void 0,!1,void 0,this):L1.map((e,S)=>{let v=S0+S,g=g1>=0&&v>=g1&&v<=y2,x=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 C$(tK,{line:e,matches:Q0,currentMatchIndex:m,selected:g,selectedBlock:x,color:r,highlightColor:z.colors.warning},e.key,!1,void 0,this)})},void 0,!1,void 0,this),C$(Y6,{flexShrink:0,children:j?C$(nK,{editor:Z0},void 0,!1,void 0,this):C$(H1,{color:F0||B1>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 J$=_1("UI"),e5=({debug:$,continue:J,...Y})=>{if($)J$.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:J});let X=R2(!1),Z=R2(!1),Q=R2(!1),G=R2(null),U=R2(!1),z=R2(null);if(!z.current)z.current=new k6;let K=z.current,O=R2(null);if(!O.current)O.current=new f6;let q=O.current,[N,_]=n5(K.getState()),[H,W]=n5(!1),b=eJ(),M=$9(),w=V8(),B=Z9(),C=X9(),F=j8(),A=p8(),L=W9(),R=Y9(),k=x1(),T=p1(),I=D2(),P=q1(),{stdout:j}=sK(),o=O9(),u=f2(),Z0=_9();e$(()=>{if(F$.getCurrentThemeName()!==Z0)try{F$.setTheme(Z0)}catch{}},[Z0]);let z0=b==="ready",J0=b==="needsSetup",f=b==="idle",E=eK(()=>Y.agents?s5(Y.agents):void 0,[Y.agents]),{confirmationState:m,confirmationHandler:Y0,handleResponse:c,dismissAll:d}=CY(),{executeCommand:a,handleAbort:W0,isProcessing:F0,cleanupAgent:T0,refreshFollowUpQueue:y,controlFollowUpQueue:D}=MY(Y.systemPrompt,Y.appendSystemPrompt,Y0,Y.maxTurns,d,E,{list:()=>q.listAll(),acknowledge:(i)=>q.acknowledge(i),setVisibleLocator:(i)=>i?q.proveLocal(i):q.setVisibleLocator()}),p=i0(async(i)=>{await x9(i.controller,i.visibility,{continueSession:J===!0,resume:Y.resume,forkSession:Y.forkSession===!0,requestedSessionId:Y.sessionId,locator:{version:2,sessionId:I,workspace:{kind:"local",projectPath:P}}})}),V=i0((i)=>{k.projectTaskAttentionState(i.status,i.unreadKeys)}),n=i0((i)=>{J$.warn(`[BladeInterface] Task attention ${i} unavailable`)});X3({ready:z0,lifecycle:q,initialize:p,project:V,report:n});let O0=i0(_),Q0=i0(()=>{J$.warn("[BladeInterface] Session history shutdown unavailable")});$3({lifecycle:K,project:O0,report:Q0});let{getPreviousCommand:R0,getNextCommand:U0,addToHistory:S0}=TY();iY();let X0=IY("",0),h0=i0(()=>{a$(),j.write(o5.eraseScreen+o5.cursorTo(0,0)),T.incrementClearCount()}),H$=i0(()=>{if(H)return;W(!0)}),g0=i0(()=>{if(!H)return;W(!1)}),N$=i0(()=>{if(H)g0();else H$()});N0((i,w0)=>{if(z0&&!J0&&(w0.ctrl||w0.meta)&&i.toLowerCase()==="o")return N$(),!0;return!1},{priority:90}),e$(()=>{if(!U.current){U.current=!0;return}h0()},[h0,H]);let u$=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(I,P,w0),await z$().setPermissionMode(w0)}catch(W$){J$.error("权限模式切换失败:",W$ instanceof Error?W$.message:W$)}}),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);k.setInitializationStatus("ready")}catch(w0){throw J$.error("初始化配置保存失败:",w0 instanceof Error?w0.message:w0),w0}}),U$=i0(()=>{if(w==="shortcuts")k.closeModal();else k.setActiveModal("shortcuts")}),d0=i0(async()=>{try{await u9(q.visibility(),{version:2,sessionId:I,workspace:{kind:"local",projectPath:P}})}catch{J$.warn("[BladeInterface] Task attention fallback visibility unavailable")}}),L1=i0(async(i,w0,W$)=>{return z4({intent:w0,session:i,newSessionId:W$?.newSessionId,announceFork:W$?.announceFork,permissionModeOverride:Y.permissionMode},P,T,T0)}),B1=i0(async(i,w0,W$)=>{await $Y(i,w0,{openHistory:(S2,m1)=>{k.showSessionHistoryViewer(S2,m1)},activateLocal:async(S2,m1)=>{await K.closeView();let U6=await L1(S2,m1,W$);try{await c9(m1,i,U6,q.visibility())}catch{J$.warn("[BladeInterface] Task attention local activation unavailable")}k.closeModal()}},W$)}),$8=i0(async(i,w0)=>{let m1=(await K4(w0,P,q)).filter((U6)=>U6.locator.sessionId===i);if(m1.length===0)throw Error(`Session not found: ${i}`);if(m1.length>1)throw Error(`Multiple workspaces contain session ${i}; use the session selector`);return m1[0]}),{showSuggestions:g1,suggestions:y2,selectedSuggestionIndex:Y2}=dY(X0,a,R0,U0,S0,W0,F0,u$,U$,w==="shortcuts",w==="sessionHistoryViewer");e$(()=>{if(X0.value&&w==="shortcuts")k.closeModal()},[X0.value,w,k]),e$(()=>{if(w==="followUpQueue")y()},[w,y]);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){J$.error("没有可供 fork 的历史会话"),$1(1);return}T.addAssistantMessage("没有找到历史会话,开始新对话。"),await d0();return}let W$=l9(w0);if(!W$){if(Y.forkSession){J$.error("没有可供 fork 的本地历史会话"),$1(1);return}T.addAssistantMessage("没有找到本地历史会话,开始新对话。"),await d0();return}await B1(W$,i,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(i){if(J$.error("[BladeInterface] 继续会话失败:",i),Y.forkSession){$1(1);return}T.addAssistantMessage("继续会话失败,开始新对话。"),await d0()}}),e=i0(async()=>{Q.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let W$=Y.forkSession?"fork":"resume",S2=await $8(Y.resume,W$);await B1(S2,W$,{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)J$.error("没有找到历史会话"),$1(1);k.showSessionSelector(w0,i)}catch(i){J$.error("[BladeInterface] 加载会话失败:",i),$1(1)}});e$(()=>{if(X.current)return;if(J){X.current=!0,I$();return}if(Y.resume)X.current=!0,e()},[J,Y.resume,I$,e]);let S=i0(async(i)=>{let w0=m.details?.type;if(w0==="enterPlanMode"&&i.approved)try{await a0.setSessionPermissionMode(I,P,"plan"),await z$().setPermissionMode("plan"),J$.debug("[BladeInterface] Entered Plan mode")}catch(W$){J$.error("[BladeInterface] Failed to enter Plan mode:",W$)}if(w0==="exitPlanMode"&&i.approved)J$.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");c(i)}),v=i0(()=>{T.addAssistantMessage("设置已取消"),T.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),T.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),$1(0)}),g=i0(()=>{K.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")}),k.closeModal()}),x=i0(async(i)=>{try{let w0=B?.intent??"resume";await B1(i,w0,{newSessionId:w0==="fork"&&Y.forkSession?Y.sessionId:void 0})}catch(w0){J$.error("[BladeInterface] Failed to restore session:",w0),T.addAssistantMessage(`会话操作失败: ${w0 instanceof Error?w0.message:"未知错误"}`),k.closeModal()}}),r=i0(()=>{if(K.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")}),Y.resume)$1(0);else k.closeModal()});e$(()=>{if(w==="sessionHistoryViewer"&&C){eY(K,q,C).catch(()=>{J$.warn("[BladeInterface] Session history activation unavailable")});return}if(K.cancelRemoteRequest(),q.endRemote().catch(()=>{J$.warn("[BladeInterface] Task attention visibility unavailable")}),K.getState().status!=="idle")K.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")})},[w,K,C,q]),e$(()=>{if(!C)return;q.updateRemote(C,N).catch(()=>{J$.warn("[BladeInterface] Task attention acknowledgement unavailable")})},[N,C,q]);let P0=i0((i)=>{k.showModelEditWizard(i)}),l0=i0((i)=>{T.addAssistantMessage(`已添加模型配置: ${i.displayName??i.model},并已切换到该模型`),g()}),c0=i0((i)=>{T.addAssistantMessage(`已更新模型配置: ${i.displayName??i.model}`),g()});e$(()=>{if(J0){o.setFocus("model-config-wizard");return}if(m.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(H)o.setFocus("transcript-pager");else if(w==="shortcuts")o.setFocus("main-input");else o.setFocus("main-input")},[J0,m.isVisible,w,H,o.setFocus]),e$(()=>{if(!z0||Q.current)return;if(t5().length>0){Q.current=!0;return}Q.current=!0,T.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[z0]),e$(()=>{if(!M)return;if(G.current===M)return;if(G.current=M,b==="error")T.addAssistantMessage(`初始化失败: ${M}`);else T.addAssistantMessage(`${M}`),T.addAssistantMessage("请重新尝试设置,或检查文件权限")},[M,b,T.addAssistantMessage]);let b$=i0(async(i)=>{try{await a({displayText:i,text:i,images:[],parts:[{type:"text",text:i}]})}catch(w0){let W$=w0 instanceof Error?w0.message:"无法发送初始消息";T.addAssistantMessage(`初始消息发送失败:${W$}`)}});e$(()=>{let i=Y.initialMessage?.trim();if(!i||Z.current||!z0||J0)return;Z.current=!0,S0(i),b$(i)},[Y.initialMessage,z0,J0,a,S0]);let z1=i0(async(i)=>{try{await z$().setPermissionMode(i)}catch(w0){J$.error("权限模式初始化失败:",w0 instanceof Error?w0.message:w0)}});if(e$(()=>{let i=Y.permissionMode;if($)J$.debug("[Debug] permissionMode from CLI:",i),J$.debug("[Debug] current permissionMode:",u);if(!i||i===u)return;z1(i)},[Y.permissionMode,u]),f)return null;if(J0)return E0(kJ,{mode:"setup",onComplete:r0,onCancel:v},void 0,!1,void 0,this);if($)J$.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:m.isVisible,activeModal:w});let Z2=w==="modelSelector",B$=R,d$=w==="modelAddWizard"?"add":w==="modelEditWizard"&&B$?"edit":null,O$=Z2||Boolean(d$),w1=w==="agentsManager",P1=w==="agentCreationWizard",Z$=w==="skillsManager",I2=w==="pluginsManager",LX=B$?{displayName:B$.displayName,provider:B$.provider,model:B$.model,overrides:B$.overrides}:void 0,dJ=m.isVisible&&m.details?m.details.type==="mcpElicitation"&&m.details.mcpElicitation?E0(mZ,{details:m.details.mcpElicitation,onComplete:(i,w0)=>S({approved:i.action==="accept",elicitation:i,...w0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):m.details.type==="askUserQuestion"&&m.details.questions?E0(b5,{questions:m.details.questions,onComplete:(i)=>S({approved:!0,answers:i}),onCancel:()=>S({approved:!1})},void 0,!1,void 0,this):E0($Z,{details:m.details,onResponse:S},void 0,!1,void 0,this):w==="themeSelector"?E0(r5,{},void 0,!1,void 0,this):w==="permissionsManager"?E0(W5,{onClose:g},void 0,!1,void 0,this):w==="sessionSelector"?E0(j5,{intent:B?.intent??"resume",sessions:B?.sessions??[],taskAttentionUnreadKeys:F,onSelect:x,onCancel:r},void 0,!1,void 0,this):w==="sessionHistoryViewer"?E0(D5,{state:N,onLoadOlder:(i)=>K.loadOlder(i),onFork:(i)=>K.fork(i),onClose:g},void 0,!1,void 0,this):w==="followUpQueue"?E0(JZ,{queue:A,mutation:L,onMutate:D,onRefresh:y,onClose:g},void 0,!1,void 0,this):w==="hooksManager"?E0(ZZ,{workspaceRoot:P,sessionId:I,onClose:g},void 0,!1,void 0,this):null,k8=Boolean(dJ);return E0(j1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[dJ,E0(j1,{flexDirection:"column",display:k8||H?"none":"flex",children:[E0(aZ,{active:!k8&&!H},void 0,!1,void 0,this),E0(u5,{},void 0,!1,void 0,this),E0(pJ,{},void 0,!1,void 0,this),E0(hJ,{},void 0,!1,void 0,this),E0(jZ,{paused:k8||H},void 0,!1,void 0,this),E0(TZ,{input:X0.value,cursorPosition:X0.cursorPosition,onChange:X0.setValue,onChangeCursorPosition:X0.setCursorPosition,onAddPasteMapping:X0.addPasteMapping,onAddImagePasteMapping:X0.addImagePasteMapping,disabled:w==="sessionHistoryViewer"},void 0,!1,void 0,this),Z2&&E0(j1,{marginTop:1,paddingX:2,children:E0(iZ,{onClose:g,onEdit:P0},void 0,!1,void 0,this)},void 0,!1,void 0,this),d$&&E0(j1,{marginTop:1,paddingX:2,children:E0(kJ,{mode:d$,modelId:B$?.id,initialConfig:d$==="edit"?LX:void 0,onComplete:d$==="edit"?c0:l0,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),w1&&E0(j1,{marginTop:1,paddingX:2,children:E0(N3,{workspaceRoot:P,onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),P1&&E0(j1,{marginTop:1,paddingX:2,children:E0(N8,{onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z$&&E0(j1,{marginTop:1,paddingX:2,children:E0(m5,{onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),I2&&E0(j1,{marginTop:1,paddingX:2,children:E0(A5,{workspaceRoot:P,onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(P3,{suggestions:y2,selectedIndex:Y2,visible:g1&&!O$},void 0,!1,void 0,this),E0(w3,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(j1,{flexDirection:"column",display:H?"flex":"none",children:E0(i5,{isOpen:H,compact:k8,onClose:g0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as $z,Text as $2}from"ink";import Jz from"react";import{jsxDEV as E1}from"react/jsx-dev-runtime";class S8 extends Jz.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 E1($z,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[E1($2,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),E1($2,{children:" "},void 0,!1,void 0,this),E1($2,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),E1($2,{children:" "},void 0,!1,void 0,this),E1($2,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),E1($2,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),E1($2,{children:" "},void 0,!1,void 0,this),E1($2,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as C2,Text as h1}from"ink";import{useState as cJ}from"react";import{jsxDEV as y$}from"react/jsx-dev-runtime";var Z6=[{key:"update",label:"Update now",description:`runs \`${JX()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],ZX=({versionInfo:$,onComplete:J})=>{let[Y,X]=cJ(0),[Z,Q]=cJ(!1),[G,U]=cJ(null);N0((K,O)=>{if(O.ctrl&&K==="c"){q8().shutdown("SIGINT",0);return}if(Z||G)return;if(O.upArrow||K==="k")X((q)=>q>0?q-1:Z6.length-1);else if(O.downArrow||K==="j")X((q)=>q<Z6.length-1?q+1:0);else if(O.return)z(Z6[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 YX();U(O.message),setTimeout(()=>{q8().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await $X($.latestVersion);J();break}};if(G)return y$(C2,{flexDirection:"column",marginY:1,children:y$(h1,{children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return y$(C2,{flexDirection:"column",marginY:1,children:y$(h1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return y$(C2,{flexDirection:"column",marginY:1,children:[y$(h1,{color:"yellow",bold:!0,children:["Update available! ",y$(h1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y$(C2,{marginTop:1,children:y$(h1,{color:"gray",children:["Release notes:"," ",y$(h1,{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$(C2,{flexDirection:"column",marginTop:1,children:Z6.map((K,O)=>{let q=O===Y,N=q?"› ":" ",_=`${O+1}. `;return y$(C2,{children:y$(h1,{color:q?"cyan":void 0,children:[N,_,K.label,K.description&&y$(h1,{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$(C2,{marginTop:1,children:y$(h1,{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 X6,Text as e2}from"ink";import{useState as XX}from"react";import{jsxDEV as F1}from"react/jsx-dev-runtime";var QX=({status:$,onTrust:J,onContinueSafely:Y})=>{let X=F$.getTheme(),[Z,Q]=XX(!1),[G,U]=XX(null);return N0((z,K)=>{if(Z)return;if(K.return||z.toLowerCase()==="t"){Q(!0),U(null),J().catch((O)=>{U(O instanceof Error?O.message:"Failed to trust workspace"),Q(!1)});return}if(z.toLowerCase()==="s"||K.escape)Q(!0),U(null),Y().catch((O)=>{U(O instanceof Error?O.message:"Failed to continue safely"),Q(!1)})}),F1(X6,{flexDirection:"column",paddingX:1,children:[F1(e2,{bold:!0,color:X.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),F1(e2,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),F1(X6,{marginTop:1,flexDirection:"column",children:[F1(e2,{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)=>F1(e2,{children:[" ",z.path," · ",z.effects.length," effect(s)"]},`${z.kind}:${z.path}`,!0,void 0,this))]},void 0,!0,void 0,this),G&&F1(X6,{marginTop:1,children:F1(e2,{color:X.colors.error,children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),F1(X6,{marginTop:1,children:F1(e2,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as Yz}from"ink";import{useEffect as Zz}from"react";function GX(){let{stdout:$}=Yz();Zz(()=>{if(!$.isTTY)return;return $.write(KZ),$.write(OJ),()=>{$.write(zZ),$.write(OJ)}},[$])}function UX($){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 Xz($){return $.forkSession?void 0:$.resumeSessionId}function KX($,J){let Y=Xz($);if(Y)J(Y)}import{jsxDEV as J2}from"react/jsx-dev-runtime";function Gz($){if(m0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");L$().setInitializationStatus("ready")}var Uz=($)=>{GX();let[J,Y]=G6(!1),[X,Z]=G6(null),[Q,G]=G6(!1),[U,z]=G6(null),K=Q6((_,H)=>{let W=_ instanceof Error?_.message:String(_);if(L$().setInitializationError(W),L$().setInitializationStatus("error"),Y(!0),H)console.error("[FAIL] 应用初始化失败:",W)}),O=Q6(async()=>{try{let _=m0().config.config??qX,H=_X(_,$);if(Gz(H),KX(H,(b)=>{OX().restoreSession(b,[])}),H.debug)console.error("[Debug] 运行时配置:",H);let W=H.codeTheme;if(W&&F$.hasTheme(W)){if(F$.setTheme(W),$.debug)console.log(`[OK] 已加载主题: ${W}`)}try{E$.getInstance().loadConfig(H.hooks||{},K$());let M=await NX(K$());if($.debug&&H.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${M.subagents.getAllNames().length} agents, ${M.skills.size} skills, ${M.commands.getCommandCount()+M.commands.getPluginCommandCount()} commands, ${M.plugins.getAll().length} plugins`);let B=m0().session.sessionId;zX(B)}catch(b){if($.debug)console.warn("Hooks 初始化失败:",UX(b))}_4(async()=>{await HX.getInstance().killAll(),await WX.getInstance().disconnectAll(),E$.getInstance().cleanup()}),Y(!0)}catch(_){K(_,!!$.debug)}}),q=Q6(async()=>{let _=await uJ.getInstance().getStatus(K$());if(_.state==="untrusted"||_.state==="error"){z(_);return}await O()}),N=Q6(async()=>{if($.versionCheckPromise){let _=await $.versionCheckPromise;if(_){Z(_),G(!0);return}}await q()});if(Qz(()=>{N()},[]),Q&&X)return J2(S8,{children:J2(ZX,{versionInfo:X,onComplete:()=>{G(!1),q()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(U)return J2(S8,{children:J2(QX,{status:U,onTrust:async()=>{await uJ.getInstance().trust(K$()),await FX(),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 J2(S8,{children:J2(e5,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},nA=($)=>J2(DY,{children:J2(Uz,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{nA as AppWrapper};
|
|
170
|
+
`]},void 0,!0,void 0,this),A$(fK,{items:B,onSelect:F,isFocused:N&&!U,indicatorComponent:VK,itemComponent:jK},void 0,!1,void 0,this),U&&A$(U1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),A$(y8,{marginTop:1,flexDirection:"column",children:[A$(U1,{dimColor:!0,children:["第 ",Q+1,"/",M," 页 · 共 ",H.length," 个会话 · 显示"," ",C.start,"-",C.end]},void 0,!0,void 0,this),M>1&&A$(y8,{marginTop:1,children:[A$(U1,{color:Q>0?"cyan":"gray",children:Q>0?"<< 上一页":" "},void 0,!1,void 0,this),A$(U1,{children:" "},void 0,!1,void 0,this),A$(U1,{color:Q<M-1?"cyan":"gray",children:Q<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 E5,Text as I8}from"ink";import EK,{useEffect as hK,useState as gK}from"react";import{jsxDEV as e1}from"react/jsx-dev-runtime";var h5=["|","/","-","\\"],hJ=EK.memo(()=>{let $=E8(),J=D0(),Y=m2(),[X,Z]=gK(0);if(hK(()=>{if($?.status!=="loading"){Z(0);return}let Q=setInterval(()=>{Z((G)=>(G+1)%h5.length)},100);return()=>clearInterval(Q)},[$?.status]),!$)return null;return e1(E5,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[e1(E5,{children:[e1(I8,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),e1(I8,{color:J.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&e1(I8,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&e1(I8,{color:J.colors.text.secondary,children:[h5[X]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&e1(I8,{color:J.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this),$.status==="completed"&&$.response&&e1(C1,{content:$.response,role:"assistant",terminalWidth:Math.max(20,Y-8),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});hJ.displayName="SideConversationPanel";import{Box as _$,Text as t0}from"ink";import{jsxDEV as B0}from"react/jsx-dev-runtime";function m5({onCancel:$}){let J=q1(),Y=X$()==="skills-manager",Z=g5({cwd:J}).getAll(),Q=Z.filter((K)=>K.source==="builtin"),G=Z.filter((K)=>K.source==="user"),U=Z.filter((K)=>K.source==="project"),z=s0(!1,$);if(N0((K,O)=>{if(O.escape)$?.();else if(O.ctrl&&K==="c"||O.meta&&K==="c")z()},{isActive:Y}),Z.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:[" (找到 ",Z.length," 个)"]},void 0,!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),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),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 p5,Text as K1}from"ink";import mK,{useEffect as pK,useMemo as xK,useState as x5}from"react";import{jsxDEV as R$,Fragment as gJ}from"react/jsx-dev-runtime";var c5=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function cK($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let Y=Math.floor(J/60),X=J%60;return`${Y}m ${X}s`}var u5=mK.memo(()=>{let $=q0((K)=>K.app.subagentProgresses),J=q0((K)=>K.app.subagentProgress),Y=D0(),[X,Z]=x5(0),[Q,G]=x5(()=>Date.now()),U=xK(()=>{let K=Object.values($);return K.length>0?K:J?[J]:[]},[J,$]),z=U.some((K)=>K.status==="running");if(pK(()=>{if(!z){Z(0);return}let K=setInterval(()=>{Z((q)=>(q+1)%c5.length)},80),O=setInterval(()=>{G(Date.now())},1000);return()=>{clearInterval(K),clearInterval(O)}},[z]),U.length===0)return null;return R$(p5,{paddingX:2,paddingY:0,flexDirection:"column",children:U.map((K)=>{let O=K.status==="running"?c5[X]: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 R$(p5,{flexDirection:"row",gap:1,children:[R$(K1,{color:q,bold:!0,children:O},void 0,!1,void 0,this),R$(K1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.text.primary,bold:!0,children:K.type},void 0,!1,void 0,this),R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.text.secondary,children:K.description},void 0,!1,void 0,this),K.currentTool&&R$(gJ,{children:[R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.warning,children:K.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="running"&&N>0&&R$(gJ,{children:[R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.info,children:cK(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="failed"&&K.terminalSummary&&R$(gJ,{children:[R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{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 s2,Text as v1}from"ink";import uK from"react";import{jsxDEV as V$}from"react/jsx-dev-runtime";var mJ={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},pJ=uK.memo(()=>{let $=U9().filter((Y)=>Y.status!=="deleted"),J=D0();if($.length===0)return null;return V$(s2,{flexDirection:"column",paddingX:2,children:$.map((Y)=>{let X=Y.tasks.filter((Z)=>Z.status==="completed").length;return V$(s2,{flexDirection:"column",marginBottom:1,children:[V$(s2,{gap:1,children:[V$(v1,{bold:!0,color:Y.status==="failed"?J.colors.error:Y.status==="completed"?J.colors.success:J.colors.info,children:[mJ[Y.status]," Team"]},void 0,!0,void 0,this),V$(v1,{bold:!0,color:J.colors.text.primary,children:Y.name},void 0,!1,void 0,this),V$(v1,{color:J.colors.muted,children:["| ",Y.members.length-1," members | ",X,"/",Y.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V$(s2,{flexDirection:"column",paddingLeft:2,children:[Y.members.filter((Z)=>Z.status!=="leader").map((Z)=>V$(s2,{gap:1,children:[V$(v1,{color:J.colors.muted,children:mJ[Z.status]},void 0,!1,void 0,this),V$(v1,{color:J.colors.text.secondary,children:Z.name},void 0,!1,void 0,this),V$(v1,{color:J.colors.muted,children:["(",Z.subagentType,", ",Z.status,Z.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this)),Y.tasks.map((Z)=>V$(s2,{gap:1,children:[V$(v1,{color:J.colors.muted,children:mJ[Z.status]},void 0,!1,void 0,this),V$(v1,{color:J.colors.text.secondary,children:["#",Z.id," ",Z.subject]},void 0,!0,void 0,this),V$(v1,{color:J.colors.muted,children:["(",Z.status,Z.owner?`, ${Z.owner}`:"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this))]},void 0,!0,void 0,this)]},Y.name,!0,void 0,this)})},void 0,!1,void 0,this)});pJ.displayName="TeamProgress";import{useMemoizedFn as dK}from"ahooks";import{Box as N1,Text as K0}from"ink";import lK from"ink-select-input";import{useState as d5}from"react";import{jsxDEV as $0}from"react/jsx-dev-runtime";var l5=M2.map(($)=>({label:$.label,value:$.id})),rK=({theme:$})=>{let{colors:J}=$;return $0(N1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(K0,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),$0(K0,{children:[$0(K0,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(K0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(K0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{color:J.error,children:["- print(",$0(K0,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),$0(K0,{color:J.success,children:["+ print(",$0(K0,{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)},aK=({theme:$})=>{let{colors:J}=$;return $0(N1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),$0(K0,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),$0(K0,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),$0(K0,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),$0(K0,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),$0(K0,{color:J.info,children:J.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},r5=()=>{let $=x1(),J=F$.getCurrentThemeName(),Y=M2.findIndex((H)=>H.label===J),X=Y>=0?M2[Y].theme:M2[0].theme,[Z,Q]=d5(X),[G,U]=d5(!1),z=dK(async(H)=>{if(G)return;U(!0);try{await z$().setTheme(H.value),$.closeModal()}catch(W){console.error("主题切换失败:",W instanceof Error?W.message:W)}finally{U(!1)}}),K=(H)=>{let W=M2.find((b)=>b.id===H.value);if(W)Q(W.theme)},q=X$()==="theme-selector",N=s0(!1);N0((H,W)=>{if(W.ctrl&&H==="c"||W.meta&&H==="c"){N();return}if(W.escape&&!G)$.closeModal()},{isActive:q});let _=(H)=>{let{isSelected:W,label:b}=H,w=b===J?"[OK]":" ";return $0(K0,{color:W?Z.colors.primary:Z.colors.text.primary,children:[w," ",b]},void 0,!0,void 0,this)};return $0(N1,{flexDirection:"column",height:"100%",children:[$0(N1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:$0(K0,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(N1,{flexDirection:"row",flexGrow:1,children:[$0(N1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:$0(N1,{flexDirection:"column",children:[$0(N1,{paddingTop:1,paddingBottom:1,children:$0(K0,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",l5.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(lK,{items:l5,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(N1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[$0(rK,{theme:Z},void 0,!1,void 0,this),$0(aK,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(N1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:$0(K0,{color:Z.colors.text.muted,children:G?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as Y6,Text as H1,useStdout as iK}from"ink";import oK,{useCallback as V1,useEffect as T2,useMemo as xJ,useRef as m$,useState as W1}from"react";import{jsxDEV as C$}from"react/jsx-dev-runtime";function a5($,J){let Y=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(Y.length,$.cursor+J))}}function nK($,J,Y){let X=Array.from($.value);if(Y.leftArrow)return a5($,-1);if(Y.rightArrow)return a5($,1);if(Y.home)return{...$,cursor:0};if(Y.end)return{...$,cursor:X.length};if(Y.backspace&&$.cursor>0)return X.splice($.cursor-1,1),{value:X.join(""),cursor:$.cursor-1};if(Y.delete&&$.cursor<X.length)return X.splice($.cursor,1),{value:X.join(""),cursor:$.cursor};if(Y.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(Y.ctrl||Y.meta||J.length===0)return $;let Z=J.replace(/[\r\n\t]+/g," ");if(Z.length===0)return $;let Q=Array.from(Z);return X.splice($.cursor,0,...Q),{value:X.join(""),cursor:$.cursor+Q.length}}function tK({editor:$}){let J=Array.from($.value),Y=J.slice(0,$.cursor).join(""),X=J[$.cursor]??" ",Z=J.slice($.cursor+1).join("");return C$(H1,{wrap:"truncate-end",children:["/",Y,C$(H1,{inverse:!0,children:X},void 0,!1,void 0,this),Z,C$(H1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function sK({line:$,matches:J,currentMatchIndex:Y,selected:X,selectedBlock:Z,color:Q,highlightColor:G}){let U=y5($,J);if(X||U.length===0)return C$(H1,{wrap:"truncate-end",color:Q,inverse:X,bold:Z,underline:Z,children:$.text||" "},void 0,!1,void 0,this);let z=[],K=0;for(let O of U){if(O.start>K)z.push($.text.slice(K,O.start));z.push(C$(H1,{color:G,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 C$(H1,{wrap:"truncate-end",color:Q,bold:Z,underline:Z,children:z},void 0,!1,void 0,this)}var i5=oK.memo(({isOpen:$,onClose:J,compact:Y=!1})=>{let X=f8(),Z=a8(),Q=r8(),G=i8(),U=X$(),z=D0(),{stdout:K}=iK(),{width:O,height:q}=d1(),N=Y?Math.max(6,Math.floor(q*0.4)):q,_=Math.max(1,N-3),H=Math.max(12,O-4),W=m$(new Map),b=m$(new R8),[M,w]=W1(new Set),B=m$(M);B.current=M;let C=xJ(()=>R5({messages:X,currentStreamingMessageId:Z,streamingLines:G.lines,streamingTail:G.tail,currentThinkingContent:Q}),[X,Z,G.lines,G.tail,Q]),F=xJ(()=>{let e=new Set(C.map((S)=>S.id));for(let S of W.current.keys())if(!e.has(S))W.current.delete(S);return C.flatMap((S,v)=>{let g=M.has(S.id),x=W.current.get(S.id),r=x?.revision===S.revision&&x.width===H&&x.expanded===g?x.lines:vJ(S,H,g);if(r!==x?.lines)W.current.set(S.id,{revision:S.revision,width:H,expanded:g,lines:r});if(v===C.length-1)return r;return[...r,{key:`${S.id}:separator`,blockId:S.id,role:S.role,kind:S.kind,text:"",copyText:"",pending:S.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})},[C,H,M]),[A,L]=W1(0),[R,k]=W1(new Set),[T,I]=W1(null),P=m$(null),[j,o]=W1(!1),u=m$(!1),[Z0,z0]=W1({value:"",cursor:0}),J0=m$(Z0),[f,E]=W1(""),[m,Y0]=W1(0),c=m$(0),[d,a]=W1(null),W0=m$(null),[F0,T0]=W1(null),y=m$(0),D=m$(null),p=m$(0),V=m$(C),n=m$(F.length),O0=m$(H);p.current=A,P.current=T,u.current=j,J0.current=Z0,c.current=m,W0.current=d;let Q0=xJ(()=>b.current.search(C,f),[C,f]),R0=Math.max(0,F.length-_),U0=Math.max(0,F.length-A),S0=Math.max(0,U0-_),X0=V1((e)=>{let S=Math.max(0,Math.min(R0,e));if(p.current=S,L(S),S===0)k(new Set)},[R0]),h0=V1((e)=>{if(F.length===0)return;let S=Math.max(0,Math.min(F.length-1,e)),v=Math.max(0,Math.min(F.length-_,S-Math.floor(_/2))),g=Math.min(F.length,v+_);X0(F.length-g)},[F.length,X0,_]),H$=V1((e,S,v)=>{let g=new Set(B.current);if(S)g.add(e);else g.delete(e);B.current=g,D.current=v,w(g)},[]),g0=V1((e)=>{let S=C.find((g)=>g.id===e.blockId);if(S?.collapsible&&!B.current.has(S.id)){H$(S.id,!0,{blockId:S.id,match:e});return}let v=VJ(F,e);if(v>=0)h0(v)},[C,F,h0,H$]),N$=V1((e,S=Q0)=>{if(S.length===0){c.current=0,Y0(0);return}let v=(e%S.length+S.length)%S.length;c.current=v,Y0(v);let g=S[v];P.current=g.blockId,I(g.blockId),g0(g)},[Q0,g0]),u$=V1((e)=>{let S=C.filter((P0)=>P0.collapsible);if(S.length===0)return;let v=S.findIndex((P0)=>P0.id===P.current),g=v<0?e>0?0:S.length-1:(v+e+S.length)%S.length,x=S[g].id;P.current=x,I(x);let r=F.findIndex((P0)=>P0.blockId===x&&P0.header);if(r>=0)h0(r)},[C,F,h0]),r0=V1(()=>{let e=P.current;if(!e)e=F.slice(S0,U0).find((v)=>C.some((g)=>g.id===v.blockId&&g.collapsible))?.blockId??null;if(!e)return;if(!C.find((v)=>v.id===e)?.collapsible)return;P.current=e,I(e),H$(e,!B.current.has(e),{blockId:e})},[C,U0,F,H$,S0]),U$=V1((e,S)=>{let v=W0.current;if(!v||F.length===0)return;let g=S==="top"?0:S==="bottom"?F.length-1:Math.max(0,Math.min(F.length-1,v.head+e)),x={...v,head:g};W0.current=x,a(x),h0(g)},[F.length,h0]),d0=V1(()=>{let e=W0.current;if(!e)return;let S=I5(F,e.anchor,e.head);if(!S.trim()){T0("Nothing selected");return}let v=++y.current;T0("Copying..."),$6(S,{writeTerminal:(g)=>K.write(g)}).then((g)=>{if(y.current!==v)return;T0(g.success?g.method==="osc52"?"Copy sent via OSC 52":`Copied ${S.split(`
|
|
171
|
+
`).length} lines`:"Copy failed"),W0.current=null,a(null)})},[F,K]);T2(()=>{if(!F0)return;let e=setTimeout(()=>T0(null),2500);return()=>clearTimeout(e)},[F0]),T2(()=>{if(!$){y.current++,V.current=C,n.current=F.length;return}B.current=new Set,w(new Set),P.current=null,I(null),u.current=!1,o(!1),J0.current={value:"",cursor:0},z0({value:"",cursor:0}),E(""),c.current=0,Y0(0),W0.current=null,a(null),T0(null),p.current=0,L(0),k(new Set),V.current=C,n.current=F.length,O0.current=H},[$]),T2(()=>{let e=new Set(C.map((S)=>S.id));if(w((S)=>{let v=new Set([...S].filter((x)=>e.has(x)));return B.current=v,v.size===S.size&&[...v].every((x)=>S.has(x))?S:v}),P.current&&!e.has(P.current))P.current=null,I(null)},[C]),T2(()=>{let e=n.current;if(n.current=F.length,!$)return;let S=D.current;if(S){D.current=null;let g=S.match?VJ(F,S.match):F.findIndex((x)=>x.blockId===S.blockId&&x.header);if(g>=0)h0(g);return}if(p.current===0){k(new Set);return}let v=Math.max(0,F.length-e);if(v>0)L((g)=>{let x=Math.min(R0,g+v);return p.current=x,x});else if(p.current>R0)p.current=R0,L(R0)},[H,M,$,F.length,R0,h0]),T2(()=>{let e=V.current;if(V.current=C,!$||p.current===0)return;let S=S5(e,C);if(S.length===0)return;k((v)=>{let g=new Set(v);for(let x of S)g.add(x);return g})},[C,$]),T2(()=>{if(Q0.length===0)c.current=0,Y0(0);else if(c.current>=Q0.length)c.current=Q0.length-1,Y0(Q0.length-1)},[Q0.length]),T2(()=>{if(O0.current===H)return;O0.current=H,W0.current=null,a(null);let e=Q0[c.current];if(e)g0(e)},[H,Q0,g0]),N0((e,S)=>{if(!$)return;let v=S,g=U==="transcript-pager";if((v.ctrl||v.meta)&&e.toLowerCase()==="o")return J(),!0;if(!g){if(v.pageUp)return X0(p.current+Math.max(1,_-1)),!0;if(v.pageDown)return X0(p.current-Math.max(1,_-1)),!0;return!1}if(u.current){if(v.escape)return u.current=!1,o(!1),J0.current={value:f,cursor:Array.from(f).length},z0(J0.current),!0;if(v.return){let r=J0.current.value,P0=b.current.search(C,r);return E(r),u.current=!1,o(!1),N$(0,P0),!0}let x=nK(J0.current,e,v);return J0.current=x,z0(x),!0}if(e==="q")return J(),!0;if(W0.current){if(v.escape)return W0.current=null,a(null),!0;if(e==="y"||v.ctrl&&!v.meta&&e.toLowerCase()==="c")return d0(),!0;if(v.upArrow||e==="k")return U$(-1),!0;if(v.downArrow||e==="j")return U$(1),!0;if(v.pageUp)return U$(-Math.max(1,_-1)),!0;if(v.pageDown)return U$(Math.max(1,_-1)),!0;if(v.home||e==="g")return U$(0,"top"),!0;if(v.end||e==="G")return U$(0,"bottom"),!0;return!0}if(v.escape)return J(),!0;if(e==="/"){let x={value:f,cursor:Array.from(f).length};return J0.current=x,z0(x),u.current=!0,o(!0),!0}if(e==="n"&&Q0.length>0)return N$(c.current+1),!0;if(e==="N"&&Q0.length>0)return N$(c.current-1),!0;if(v.tab)return u$(v.shift?-1:1),!0;if(v.return||e==="e")return r0(),!0;if(e==="v"){if(F.length===0)return!0;let x=Math.max(0,F.length-p.current),r=Math.max(0,x-_),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 W0.current=c0,a(c0),h0(l0),!0}if(v.upArrow||e==="k")return X0(p.current+1),!0;if(v.downArrow||e==="j")return X0(p.current-1),!0;if(v.pageUp)return X0(p.current+Math.max(1,_-1)),!0;if(v.pageDown)return X0(p.current-Math.max(1,_-1)),!0;if(v.home||e==="g")return X0(R0),!0;if(v.end||e==="G")return X0(0),!0;return!0},{isActive:$,priority:100});let L1=F.slice(S0,U0),B1=R.size,$8=F.length===0?"0/0":`${Math.min(U0,F.length)}/${F.length}`,g1=d?Math.min(d.anchor,d.head):-1,y2=d?Math.max(d.anchor,d.head):-1,Y2=f.length>0?`/${f} ${Q0.length>0?`${m+1}/${Q0.length}`:"0/0"}`:null,I$=F0?F0:d?`${y2-g1+1} lines selected · y copy · Esc cancel`:Y2?`${Y2} · n/N`:B1>0?`${B1} new · G latest`:"Ctrl+O / Esc / q close";return C$(Y6,{flexDirection:"column",width:"100%",height:N,paddingX:2,children:[C$(Y6,{justifyContent:"space-between",flexShrink:0,children:[C$(H1,{bold:!0,color:z.colors.primary,children:"Transcript"},void 0,!1,void 0,this),C$(H1,{color:z.colors.text.muted,children:$8},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C$(Y6,{flexDirection:"column",height:_,flexShrink:0,overflow:"hidden",children:L1.length===0?C$(H1,{color:z.colors.text.muted,children:"No transcript yet"},void 0,!1,void 0,this):L1.map((e,S)=>{let v=S0+S,g=g1>=0&&v>=g1&&v<=y2,x=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 C$(sK,{line:e,matches:Q0,currentMatchIndex:m,selected:g,selectedBlock:x,color:r,highlightColor:z.colors.warning},e.key,!1,void 0,this)})},void 0,!1,void 0,this),C$(Y6,{flexShrink:0,children:j?C$(tK,{editor:Z0},void 0,!1,void 0,this):C$(H1,{color:F0||B1>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 J$=_1("UI"),e5=({debug:$,continue:J,...Y})=>{if($)J$.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:J});let X=R2(!1),Z=R2(!1),Q=R2(!1),G=R2(null),U=R2(!1),z=R2(null);if(!z.current)z.current=new k6;let K=z.current,O=R2(null);if(!O.current)O.current=new f6;let q=O.current,[N,_]=n5(K.getState()),[H,W]=n5(!1),b=eJ(),M=$9(),w=V8(),B=Z9(),C=X9(),F=j8(),A=p8(),L=W9(),R=Y9(),k=x1(),T=p1(),I=D2(),P=q1(),{stdout:j}=eK(),o=O9(),u=f2(),Z0=_9();e$(()=>{if(F$.getCurrentThemeName()!==Z0)try{F$.setTheme(Z0)}catch{}},[Z0]);let z0=b==="ready",J0=b==="needsSetup",f=b==="idle",E=$z(()=>Y.agents?s5(Y.agents):void 0,[Y.agents]),{confirmationState:m,confirmationHandler:Y0,handleResponse:c,dismissAll:d}=CY(),{executeCommand:a,handleAbort:W0,isProcessing:F0,cleanupAgent:T0,refreshFollowUpQueue:y,controlFollowUpQueue:D}=MY(Y.systemPrompt,Y.appendSystemPrompt,Y0,Y.maxTurns,d,E,{list:()=>q.listAll(),acknowledge:(i)=>q.acknowledge(i),setVisibleLocator:(i)=>i?q.proveLocal(i):q.setVisibleLocator()}),p=i0(async(i)=>{await x9(i.controller,i.visibility,{continueSession:J===!0,resume:Y.resume,forkSession:Y.forkSession===!0,requestedSessionId:Y.sessionId,locator:{version:2,sessionId:I,workspace:{kind:"local",projectPath:P}}})}),V=i0((i)=>{k.projectTaskAttentionState(i.status,i.unreadKeys)}),n=i0((i)=>{J$.warn(`[BladeInterface] Task attention ${i} unavailable`)});X3({ready:z0,lifecycle:q,initialize:p,project:V,report:n});let O0=i0(_),Q0=i0(()=>{J$.warn("[BladeInterface] Session history shutdown unavailable")});$3({lifecycle:K,project:O0,report:Q0});let{getPreviousCommand:R0,getNextCommand:U0,addToHistory:S0}=TY();iY();let X0=IY("",0),h0=i0(()=>{a$(),j.write(o5.eraseScreen+o5.cursorTo(0,0)),T.incrementClearCount()}),H$=i0(()=>{if(H)return;W(!0)}),g0=i0(()=>{if(!H)return;W(!1)}),N$=i0(()=>{if(H)g0();else H$()});N0((i,w0)=>{if(z0&&!J0&&(w0.ctrl||w0.meta)&&i.toLowerCase()==="o")return N$(),!0;return!1},{priority:90}),e$(()=>{if(!U.current){U.current=!0;return}h0()},[h0,H]);let u$=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(I,P,w0),await z$().setPermissionMode(w0)}catch(W$){J$.error("权限模式切换失败:",W$ instanceof Error?W$.message:W$)}}),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);k.setInitializationStatus("ready")}catch(w0){throw J$.error("初始化配置保存失败:",w0 instanceof Error?w0.message:w0),w0}}),U$=i0(()=>{if(w==="shortcuts")k.closeModal();else k.setActiveModal("shortcuts")}),d0=i0(async()=>{try{await u9(q.visibility(),{version:2,sessionId:I,workspace:{kind:"local",projectPath:P}})}catch{J$.warn("[BladeInterface] Task attention fallback visibility unavailable")}}),L1=i0(async(i,w0,W$)=>{return z4({intent:w0,session:i,newSessionId:W$?.newSessionId,announceFork:W$?.announceFork,permissionModeOverride:Y.permissionMode},P,T,T0)}),B1=i0(async(i,w0,W$)=>{await $Y(i,w0,{openHistory:(S2,m1)=>{k.showSessionHistoryViewer(S2,m1)},activateLocal:async(S2,m1)=>{await K.closeView();let U6=await L1(S2,m1,W$);try{await c9(m1,i,U6,q.visibility())}catch{J$.warn("[BladeInterface] Task attention local activation unavailable")}k.closeModal()}},W$)}),$8=i0(async(i,w0)=>{let m1=(await K4(w0,P,q)).filter((U6)=>U6.locator.sessionId===i);if(m1.length===0)throw Error(`Session not found: ${i}`);if(m1.length>1)throw Error(`Multiple workspaces contain session ${i}; use the session selector`);return m1[0]}),{showSuggestions:g1,suggestions:y2,selectedSuggestionIndex:Y2}=dY(X0,a,R0,U0,S0,W0,F0,u$,U$,w==="shortcuts",w==="sessionHistoryViewer");e$(()=>{if(X0.value&&w==="shortcuts")k.closeModal()},[X0.value,w,k]),e$(()=>{if(w==="followUpQueue")y()},[w,y]);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){J$.error("没有可供 fork 的历史会话"),$1(1);return}T.addAssistantMessage("没有找到历史会话,开始新对话。"),await d0();return}let W$=l9(w0);if(!W$){if(Y.forkSession){J$.error("没有可供 fork 的本地历史会话"),$1(1);return}T.addAssistantMessage("没有找到本地历史会话,开始新对话。"),await d0();return}await B1(W$,i,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(i){if(J$.error("[BladeInterface] 继续会话失败:",i),Y.forkSession){$1(1);return}T.addAssistantMessage("继续会话失败,开始新对话。"),await d0()}}),e=i0(async()=>{Q.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let W$=Y.forkSession?"fork":"resume",S2=await $8(Y.resume,W$);await B1(S2,W$,{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)J$.error("没有找到历史会话"),$1(1);k.showSessionSelector(w0,i)}catch(i){J$.error("[BladeInterface] 加载会话失败:",i),$1(1)}});e$(()=>{if(X.current)return;if(J){X.current=!0,I$();return}if(Y.resume)X.current=!0,e()},[J,Y.resume,I$,e]);let S=i0(async(i)=>{let w0=m.details?.type;if(w0==="enterPlanMode"&&i.approved)try{await a0.setSessionPermissionMode(I,P,"plan"),await z$().setPermissionMode("plan"),J$.debug("[BladeInterface] Entered Plan mode")}catch(W$){J$.error("[BladeInterface] Failed to enter Plan mode:",W$)}if(w0==="exitPlanMode"&&i.approved)J$.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");c(i)}),v=i0(()=>{T.addAssistantMessage("设置已取消"),T.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),T.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),$1(0)}),g=i0(()=>{K.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")}),k.closeModal()}),x=i0(async(i)=>{try{let w0=B?.intent??"resume";await B1(i,w0,{newSessionId:w0==="fork"&&Y.forkSession?Y.sessionId:void 0})}catch(w0){J$.error("[BladeInterface] Failed to restore session:",w0),T.addAssistantMessage(`会话操作失败: ${w0 instanceof Error?w0.message:"未知错误"}`),k.closeModal()}}),r=i0(()=>{if(K.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")}),Y.resume)$1(0);else k.closeModal()});e$(()=>{if(w==="sessionHistoryViewer"&&C){eY(K,q,C).catch(()=>{J$.warn("[BladeInterface] Session history activation unavailable")});return}if(K.cancelRemoteRequest(),q.endRemote().catch(()=>{J$.warn("[BladeInterface] Task attention visibility unavailable")}),K.getState().status!=="idle")K.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")})},[w,K,C,q]),e$(()=>{if(!C)return;q.updateRemote(C,N).catch(()=>{J$.warn("[BladeInterface] Task attention acknowledgement unavailable")})},[N,C,q]);let P0=i0((i)=>{k.showModelEditWizard(i)}),l0=i0((i)=>{T.addAssistantMessage(`已添加模型配置: ${i.displayName??i.model},并已切换到该模型`),g()}),c0=i0((i)=>{T.addAssistantMessage(`已更新模型配置: ${i.displayName??i.model}`),g()});e$(()=>{if(J0){o.setFocus("model-config-wizard");return}if(m.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(H)o.setFocus("transcript-pager");else if(w==="shortcuts")o.setFocus("main-input");else o.setFocus("main-input")},[J0,m.isVisible,w,H,o.setFocus]),e$(()=>{if(!z0||Q.current)return;if(t5().length>0){Q.current=!0;return}Q.current=!0,T.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[z0]),e$(()=>{if(!M)return;if(G.current===M)return;if(G.current=M,b==="error")T.addAssistantMessage(`初始化失败: ${M}`);else T.addAssistantMessage(`${M}`),T.addAssistantMessage("请重新尝试设置,或检查文件权限")},[M,b,T.addAssistantMessage]);let b$=i0(async(i)=>{try{await a({displayText:i,text:i,images:[],parts:[{type:"text",text:i}]})}catch(w0){let W$=w0 instanceof Error?w0.message:"无法发送初始消息";T.addAssistantMessage(`初始消息发送失败:${W$}`)}});e$(()=>{let i=Y.initialMessage?.trim();if(!i||Z.current||!z0||J0)return;Z.current=!0,S0(i),b$(i)},[Y.initialMessage,z0,J0,a,S0]);let z1=i0(async(i)=>{try{await z$().setPermissionMode(i)}catch(w0){J$.error("权限模式初始化失败:",w0 instanceof Error?w0.message:w0)}});if(e$(()=>{let i=Y.permissionMode;if($)J$.debug("[Debug] permissionMode from CLI:",i),J$.debug("[Debug] current permissionMode:",u);if(!i||i===u)return;z1(i)},[Y.permissionMode,u]),f)return null;if(J0)return E0(kJ,{mode:"setup",onComplete:r0,onCancel:v},void 0,!1,void 0,this);if($)J$.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:m.isVisible,activeModal:w});let Z2=w==="modelSelector",B$=R,d$=w==="modelAddWizard"?"add":w==="modelEditWizard"&&B$?"edit":null,O$=Z2||Boolean(d$),w1=w==="agentsManager",P1=w==="agentCreationWizard",Z$=w==="skillsManager",I2=w==="pluginsManager",LX=B$?{displayName:B$.displayName,provider:B$.provider,model:B$.model,overrides:B$.overrides}:void 0,dJ=m.isVisible&&m.details?m.details.type==="mcpElicitation"&&m.details.mcpElicitation?E0(mZ,{details:m.details.mcpElicitation,onComplete:(i,w0)=>S({approved:i.action==="accept",elicitation:i,...w0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):m.details.type==="askUserQuestion"&&m.details.questions?E0(b5,{questions:m.details.questions,onComplete:(i)=>S({approved:!0,answers:i}),onCancel:()=>S({approved:!1})},void 0,!1,void 0,this):E0($Z,{details:m.details,onResponse:S},void 0,!1,void 0,this):w==="themeSelector"?E0(r5,{},void 0,!1,void 0,this):w==="permissionsManager"?E0(W5,{onClose:g},void 0,!1,void 0,this):w==="sessionSelector"?E0(j5,{intent:B?.intent??"resume",sessions:B?.sessions??[],taskAttentionUnreadKeys:F,onSelect:x,onCancel:r},void 0,!1,void 0,this):w==="sessionHistoryViewer"?E0(D5,{state:N,onLoadOlder:(i)=>K.loadOlder(i),onFork:(i)=>K.fork(i),onClose:g},void 0,!1,void 0,this):w==="followUpQueue"?E0(JZ,{queue:A,mutation:L,onMutate:D,onRefresh:y,onClose:g},void 0,!1,void 0,this):w==="hooksManager"?E0(ZZ,{workspaceRoot:P,sessionId:I,onClose:g},void 0,!1,void 0,this):null,k8=Boolean(dJ);return E0(j1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[dJ,E0(j1,{flexDirection:"column",display:k8||H?"none":"flex",children:[E0(aZ,{active:!k8&&!H},void 0,!1,void 0,this),E0(u5,{},void 0,!1,void 0,this),E0(pJ,{},void 0,!1,void 0,this),E0(hJ,{},void 0,!1,void 0,this),E0(jZ,{paused:k8||H},void 0,!1,void 0,this),E0(TZ,{input:X0.value,cursorPosition:X0.cursorPosition,onChange:X0.setValue,onChangeCursorPosition:X0.setCursorPosition,onAddPasteMapping:X0.addPasteMapping,onAddImagePasteMapping:X0.addImagePasteMapping,disabled:w==="sessionHistoryViewer"},void 0,!1,void 0,this),Z2&&E0(j1,{marginTop:1,paddingX:2,children:E0(iZ,{onClose:g,onEdit:P0},void 0,!1,void 0,this)},void 0,!1,void 0,this),d$&&E0(j1,{marginTop:1,paddingX:2,children:E0(kJ,{mode:d$,modelId:B$?.id,initialConfig:d$==="edit"?LX:void 0,onComplete:d$==="edit"?c0:l0,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),w1&&E0(j1,{marginTop:1,paddingX:2,children:E0(N3,{workspaceRoot:P,onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),P1&&E0(j1,{marginTop:1,paddingX:2,children:E0(N8,{onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z$&&E0(j1,{marginTop:1,paddingX:2,children:E0(m5,{onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),I2&&E0(j1,{marginTop:1,paddingX:2,children:E0(A5,{workspaceRoot:P,onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(P3,{suggestions:y2,selectedIndex:Y2,visible:g1&&!O$},void 0,!1,void 0,this),E0(w3,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(j1,{flexDirection:"column",display:H?"flex":"none",children:E0(i5,{isOpen:H,compact:k8,onClose:g0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as Jz,Text as $2}from"ink";import Yz from"react";import{jsxDEV as E1}from"react/jsx-dev-runtime";class S8 extends Yz.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 E1(Jz,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[E1($2,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),E1($2,{children:" "},void 0,!1,void 0,this),E1($2,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),E1($2,{children:" "},void 0,!1,void 0,this),E1($2,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),E1($2,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),E1($2,{children:" "},void 0,!1,void 0,this),E1($2,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as C2,Text as h1}from"ink";import{useState as cJ}from"react";import{jsxDEV as y$}from"react/jsx-dev-runtime";var Z6=[{key:"update",label:"Update now",description:`runs \`${JX()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],ZX=({versionInfo:$,onComplete:J})=>{let[Y,X]=cJ(0),[Z,Q]=cJ(!1),[G,U]=cJ(null);N0((K,O)=>{if(O.ctrl&&K==="c"){q8().shutdown("SIGINT",0);return}if(Z||G)return;if(O.upArrow||K==="k")X((q)=>q>0?q-1:Z6.length-1);else if(O.downArrow||K==="j")X((q)=>q<Z6.length-1?q+1:0);else if(O.return)z(Z6[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 YX();U(O.message),setTimeout(()=>{q8().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await $X($.latestVersion);J();break}};if(G)return y$(C2,{flexDirection:"column",marginY:1,children:y$(h1,{children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return y$(C2,{flexDirection:"column",marginY:1,children:y$(h1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return y$(C2,{flexDirection:"column",marginY:1,children:[y$(h1,{color:"yellow",bold:!0,children:["Update available! ",y$(h1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y$(C2,{marginTop:1,children:y$(h1,{color:"gray",children:["Release notes:"," ",y$(h1,{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$(C2,{flexDirection:"column",marginTop:1,children:Z6.map((K,O)=>{let q=O===Y,N=q?"› ":" ",_=`${O+1}. `;return y$(C2,{children:y$(h1,{color:q?"cyan":void 0,children:[N,_,K.label,K.description&&y$(h1,{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$(C2,{marginTop:1,children:y$(h1,{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 X6,Text as e2}from"ink";import{useState as XX}from"react";import{jsxDEV as F1}from"react/jsx-dev-runtime";var QX=({status:$,onTrust:J,onContinueSafely:Y})=>{let X=F$.getTheme(),[Z,Q]=XX(!1),[G,U]=XX(null);return N0((z,K)=>{if(Z)return;if(K.return||z.toLowerCase()==="t"){Q(!0),U(null),J().catch((O)=>{U(O instanceof Error?O.message:"Failed to trust workspace"),Q(!1)});return}if(z.toLowerCase()==="s"||K.escape)Q(!0),U(null),Y().catch((O)=>{U(O instanceof Error?O.message:"Failed to continue safely"),Q(!1)})}),F1(X6,{flexDirection:"column",paddingX:1,children:[F1(e2,{bold:!0,color:X.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),F1(e2,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),F1(X6,{marginTop:1,flexDirection:"column",children:[F1(e2,{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)=>F1(e2,{children:[" ",z.path," · ",z.effects.length," effect(s)"]},`${z.kind}:${z.path}`,!0,void 0,this))]},void 0,!0,void 0,this),G&&F1(X6,{marginTop:1,children:F1(e2,{color:X.colors.error,children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),F1(X6,{marginTop:1,children:F1(e2,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as Zz}from"ink";import{useEffect as Xz}from"react";function GX(){let{stdout:$}=Zz();Xz(()=>{if(!$.isTTY)return;return $.write(KZ),$.write(OJ),()=>{$.write(zZ),$.write(OJ)}},[$])}function UX($){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 KX($,J){let Y=Qz($);if(Y)J(Y)}import{jsxDEV as J2}from"react/jsx-dev-runtime";function Uz($){if(m0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");L$().setInitializationStatus("ready")}var Kz=($)=>{GX();let[J,Y]=G6(!1),[X,Z]=G6(null),[Q,G]=G6(!1),[U,z]=G6(null),K=Q6((_,H)=>{let W=_ instanceof Error?_.message:String(_);if(L$().setInitializationError(W),L$().setInitializationStatus("error"),Y(!0),H)console.error("[FAIL] 应用初始化失败:",W)}),O=Q6(async()=>{try{let _=m0().config.config??qX,H=_X(_,$);if(Uz(H),KX(H,(b)=>{OX().restoreSession(b,[])}),H.debug)console.error("[Debug] 运行时配置:",H);let W=H.codeTheme;if(W&&F$.hasTheme(W)){if(F$.setTheme(W),$.debug)console.log(`[OK] 已加载主题: ${W}`)}try{E$.getInstance().loadConfig(H.hooks||{},K$());let M=await NX(K$());if($.debug&&H.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${M.subagents.getAllNames().length} agents, ${M.skills.size} skills, ${M.commands.getCommandCount()+M.commands.getPluginCommandCount()} commands, ${M.plugins.getAll().length} plugins`);let B=m0().session.sessionId;zX(B)}catch(b){if($.debug)console.warn("Hooks 初始化失败:",UX(b))}_4(async()=>{await HX.getInstance().killAll(),await WX.getInstance().disconnectAll(),E$.getInstance().cleanup()}),Y(!0)}catch(_){K(_,!!$.debug)}}),q=Q6(async()=>{let _=await uJ.getInstance().getStatus(K$());if(_.state==="untrusted"||_.state==="error"){z(_);return}await O()}),N=Q6(async()=>{if($.versionCheckPromise){let _=await $.versionCheckPromise;if(_){Z(_),G(!0);return}}await q()});if(Gz(()=>{N()},[]),Q&&X)return J2(S8,{children:J2(ZX,{versionInfo:X,onComplete:()=>{G(!1),q()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(U)return J2(S8,{children:J2(QX,{status:U,onTrust:async()=>{await uJ.getInstance().trust(K$()),await FX(),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 J2(S8,{children:J2(e5,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},tA=($)=>J2(DY,{children:J2(Kz,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{tA as AppWrapper};
|