blade-code 0.10.131 → 0.10.133
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-7n268v68.js → chunk-00zazdct.js} +2 -2
- package/dist/chunk-04yas0t8.js +1 -0
- package/dist/{chunk-a7gyy1wb.js → chunk-0ap8b3sw.js} +1 -1
- package/dist/{chunk-tkydv9k8.js → chunk-0d440hhe.js} +1 -1
- package/dist/{chunk-hrjjhm84.js → chunk-0xph7bhe.js} +2 -2
- package/dist/{chunk-aaxc81jc.js → chunk-1tfjaazq.js} +1 -1
- package/dist/{chunk-v52wc8yg.js → chunk-2242dshn.js} +1 -1
- package/dist/{chunk-p00f53yq.js → chunk-2nv0kg12.js} +1 -1
- package/dist/chunk-2nxev7f2.js +1 -0
- package/dist/{chunk-6p6ts4kv.js → chunk-2qyh6qhb.js} +1 -1
- package/dist/{chunk-jkfkyedn.js → chunk-3csj18f1.js} +1 -1
- package/dist/{chunk-z03dtyh6.js → chunk-3ndwbb7h.js} +1 -1
- package/dist/chunk-43a0n5rw.js +1 -0
- package/dist/{chunk-853cgxwv.js → chunk-4xhawy0e.js} +1 -1
- package/dist/{chunk-c1w7e6c2.js → chunk-555ffyze.js} +1 -1
- package/dist/{chunk-sfe4810k.js → chunk-5x3h9ak8.js} +1 -1
- package/dist/{chunk-sj1dzeta.js → chunk-679b7s58.js} +1 -1
- package/dist/chunk-78wwep9f.js +1 -0
- package/dist/{chunk-7wbah1y5.js → chunk-7hxyxv4x.js} +2 -2
- package/dist/{chunk-edtxcqxa.js → chunk-7j628q12.js} +1 -1
- package/dist/chunk-7zvwfz85.js +2 -0
- package/dist/{chunk-mvm1rzc4.js → chunk-87ycd3f8.js} +2 -2
- package/dist/{chunk-9ph0t3h8.js → chunk-88jmtcv7.js} +2 -2
- package/dist/{chunk-2y1qngw7.js → chunk-8xem2mzy.js} +1 -1
- package/dist/{chunk-zwjrensv.js → chunk-961nemng.js} +1 -1
- package/dist/{chunk-ar5np5h5.js → chunk-ar3sdj0w.js} +2 -2
- package/dist/chunk-avf9spct.js +1 -0
- package/dist/chunk-azv25dg2.js +10 -0
- package/dist/chunk-b8c1vj8c.js +1 -0
- package/dist/chunk-bbw6s542.js +1 -0
- package/dist/{chunk-44jtpg8y.js → chunk-be2csw9m.js} +1 -1
- package/dist/{chunk-tndrbmk1.js → chunk-bj8cgfbr.js} +1 -1
- package/dist/{chunk-c3qmbrjj.js → chunk-bzp08nf6.js} +1 -1
- package/dist/{chunk-a60cmnmz.js → chunk-cfamqqgv.js} +2 -2
- package/dist/{chunk-637yvyry.js → chunk-cz9mqkn2.js} +1 -1
- package/dist/{chunk-gmqpfm52.js → chunk-d881py5y.js} +2 -2
- package/dist/chunk-dnt4c3gy.js +2 -0
- package/dist/{chunk-g59kv3v3.js → chunk-e1q1hvty.js} +1 -1
- package/dist/chunk-eetva9y8.js +1 -0
- package/dist/{chunk-dnsb80qt.js → chunk-f1wnva76.js} +3 -3
- package/dist/{chunk-g0ra6hge.js → chunk-f4pn5tmr.js} +1 -1
- package/dist/{chunk-pj69j4zp.js → chunk-fjvt9mwv.js} +1 -1
- package/dist/{chunk-dw22ns89.js → chunk-gv24cgpb.js} +3 -3
- package/dist/{chunk-gfbkrk60.js → chunk-h123tjsg.js} +35 -35
- package/dist/{chunk-grhsv55v.js → chunk-h6tr3zz7.js} +1 -1
- package/dist/{chunk-rwnfvbdh.js → chunk-jy61b0v8.js} +2 -2
- package/dist/chunk-kjjpn49y.js +1 -0
- package/dist/{chunk-h9wzvtmy.js → chunk-ks67gd2j.js} +1 -1
- package/dist/chunk-kx61g7xw.js +1 -0
- package/dist/chunk-m30sbsnw.js +1 -0
- package/dist/{chunk-wj44fpe7.js → chunk-mkvqtawj.js} +2 -2
- package/dist/{chunk-5nssnxbd.js → chunk-ms360ds6.js} +2 -2
- package/dist/chunk-n589jxsm.js +1 -0
- package/dist/{chunk-dbddc52r.js → chunk-n7pydthh.js} +2 -2
- package/dist/{chunk-9gs4eqt8.js → chunk-ndgdf5jx.js} +1 -1
- package/dist/{chunk-93x9xbew.js → chunk-nfdfthhb.js} +1 -1
- package/dist/chunk-nry7d26k.js +2 -0
- package/dist/{chunk-25wwj0qb.js → chunk-nyk5q71k.js} +1 -1
- package/dist/{chunk-580dwa0h.js → chunk-p8y5kk56.js} +1 -1
- package/dist/{chunk-xdf4m44y.js → chunk-py92cy57.js} +1 -1
- package/dist/{chunk-mdew58v9.js → chunk-r4bgsfj6.js} +1 -1
- package/dist/{chunk-dfjmvj3d.js → chunk-rcthrb7h.js} +2 -2
- package/dist/{chunk-ajsw4te2.js → chunk-rkjrft19.js} +2 -2
- package/dist/{chunk-qcvxff27.js → chunk-rmm7n9n3.js} +2 -2
- package/dist/chunk-sr9gqacp.js +1 -0
- package/dist/{chunk-2bnpn8be.js → chunk-sxqydew5.js} +1 -1
- package/dist/{chunk-39d95twk.js → chunk-t52v91dy.js} +1 -1
- package/dist/chunk-v7zt3pft.js +171 -0
- package/dist/{chunk-zkzhm39s.js → chunk-w3y69e4e.js} +1 -1
- package/dist/{chunk-j15db2db.js → chunk-x1w3fvhr.js} +2 -2
- package/dist/{chunk-k2e4yjsk.js → chunk-xgz1yanb.js} +1 -1
- package/dist/{chunk-g4xny949.js → chunk-yvk8w63g.js} +1 -1
- package/dist/{chunk-sx77dpxw.js → chunk-z5mm9g1y.js} +1 -1
- package/dist/web/assets/{ChatView-CkmlibKO.js → ChatView-hYd9mmJ6.js} +4 -4
- package/dist/web/assets/{CodeBlockHighlighter-DR5RLA1_.js → CodeBlockHighlighter-D0yM8QTf.js} +1 -1
- package/dist/web/assets/{FilePreview-C4tqzUOM.js → FilePreview-CaTCjV5i.js} +1 -1
- package/dist/web/assets/{KanbanBoard-D7HJQXE2.js → KanbanBoard-BY0SXCol.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-Ct8vtONO.js → MarkdownRenderer-zKto-Pty.js} +3 -3
- package/dist/web/assets/{ScrollArea-CMSE6nO4.js → ScrollArea-1qPJ8lcT.js} +1 -1
- package/dist/web/assets/{SessionHistorySurface-BPwnF9ND.js → SessionHistorySurface-Ce9xX62q.js} +1 -1
- package/dist/web/assets/{SettingsModal-KW5WYAov.js → SettingsModal-BxKOMuIm.js} +1 -1
- package/dist/web/assets/{Sidebar-8BUNEHHQ.js → Sidebar-CEF6lGps.js} +1 -1
- package/dist/web/assets/{TaskSwitcher-CZfkp2L_.js → TaskSwitcher-C-EY0nVG.js} +1 -1
- package/dist/web/assets/{TerminalPanel-DBBMaU_6.js → TerminalPanel-C3PVDyAr.js} +1 -1
- package/dist/web/assets/{archive-tBd5snSF.js → archive-D5Nuw__Q.js} +1 -1
- package/dist/web/assets/{arrow-left-Cs_sFMp-.js → arrow-left-DaOpfgEz.js} +1 -1
- package/dist/web/assets/{calendar-clock-C0ue6XTy.js → calendar-clock-DA_D4ppV.js} +1 -1
- package/dist/web/assets/{chevron-right-DZHCUfAH.js → chevron-right-COQAoZf3.js} +1 -1
- package/dist/web/assets/{chevrons-up-down-BSa16Scz.js → chevrons-up-down-B_WSFixv.js} +1 -1
- package/dist/web/assets/{clock-3-DstAM2AR.js → clock-3-DJ-pSj3t.js} +1 -1
- package/dist/web/assets/{copy-BfnFXTgG.js → copy-5c0ESKoo.js} +1 -1
- package/dist/web/assets/{download-XKyNtMnj.js → download-VkaTciEH.js} +1 -1
- package/dist/web/assets/{external-link-3bcWFMya.js → external-link-BypdqupZ.js} +1 -1
- package/dist/web/assets/{folder-D7hQLvy7.js → folder-B8znObPL.js} +1 -1
- package/dist/web/assets/{index-CCdnLriX.js → index-DorkRCqS.js} +12 -12
- package/dist/web/assets/{pause-CBR55GXy.js → pause-BWbHHYG6.js} +1 -1
- package/dist/web/assets/{pencil-8yqeFHC4.js → pencil-BPyvvR59.js} +1 -1
- package/dist/web/assets/{play-F_Spkp4p.js → play-CLJgUH4S.js} +1 -1
- package/dist/web/assets/{plus-CJCqq3rG.js → plus-D1VVvu-z.js} +1 -1
- package/dist/web/assets/{settings-G6riyt4S.js → settings-CGCgC_NX.js} +1 -1
- package/dist/web/assets/{teamService-Cixkq48S.js → teamService-DsYRmp6u.js} +1 -1
- package/dist/web/assets/{terminal-_Nebc2yj.js → terminal-pA96HZrI.js} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +2 -2
- package/dist/chunk-0z9nqbd0.js +0 -2
- package/dist/chunk-5nv95djf.js +0 -10
- package/dist/chunk-92fmzgzv.js +0 -1
- package/dist/chunk-9s8saznq.js +0 -1
- package/dist/chunk-af3qm97y.js +0 -1
- package/dist/chunk-cz0n951t.js +0 -1
- package/dist/chunk-f8gb685p.js +0 -2
- package/dist/chunk-kd3k1q9z.js +0 -1
- package/dist/chunk-m9mw8ppy.js +0 -1
- package/dist/chunk-ntdwkenx.js +0 -170
- package/dist/chunk-p9fs659w.js +0 -1
- package/dist/chunk-rd7b9tye.js +0 -1
- package/dist/chunk-rspcywmd.js +0 -2
- package/dist/chunk-s3f85gtm.js +0 -1
- package/dist/chunk-svkdrxk9.js +0 -1
- package/dist/chunk-v9qf59dy.js +0 -1
- package/dist/chunk-xrheg6xr.js +0 -1
- package/dist/chunk-ybwfm7yp.js +0 -1
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import{e as hZ,f as gZ,h as D$,i as _4}from"./chunk-ks67gd2j.js";import{l as h5,m as g5,n as m5}from"./chunk-bj8cgfbr.js";import{A as $4,y as _Y,z as NY}from"./chunk-xgz1yanb.js";import{Ba as V6,I as D6,M as s5,O as RJ,P as WJ,Q as b6,W as K6,X as z6,aa as c$,ca as BY,da as wY,fa as O6,ha as e2,ia as $5,ja as J5,ma as Y5,na as Z5,ra as v9,sa as G3,ua as X3,va as Q3,wa as e5,xa as iY,za as oY}from"./chunk-f1wnva76.js";import"./chunk-2qyh6qhb.js";import{Ja as wZ,Ka as AZ,La as PZ,Oa as t5}from"./chunk-e1q1hvty.js";import{Qa as q6}from"./chunk-2242dshn.js";import{Kb as G6,Tb as KJ,xb as U6,yb as Q4}from"./chunk-88jmtcv7.js";import{cc as Z8}from"./chunk-77efqpdc.js";import{Bd as FY,Gd as LY,Id as x8,Qd as s2,Td as l0,md as $6,wd as OY,xd as y2}from"./chunk-555ffyze.js";import"./chunk-53h87fmt.js";import{ve as bY,we as qJ,xe as MY}from"./chunk-h123tjsg.js";import{Ue as dY,Ve as n8}from"./chunk-7zvwfz85.js";import{gf as j5}from"./chunk-d881py5y.js";import{hf as X8,if as J4,kf as t$}from"./chunk-7hxyxv4x.js";import"./chunk-cfamqqgv.js";import{Af as o5,Bf as w$,Cf as v5,Df as E4,Ef as J8,Hf as cY,Of as O$,of as H2,pf as B$,qf as m1,rf as tJ,sf as m8,tf as WY,uf as m3,vf as H9,wf as SZ,xf as p3,yf as b2,zf as q$}from"./chunk-00zazdct.js";import"./chunk-v508x7cg.js";import"./chunk-r4bgsfj6.js";import"./chunk-rkjrft19.js";import{cg as F9}from"./chunk-87ycd3f8.js";import"./chunk-7j628q12.js";import"./chunk-ms360ds6.js";import{Gg as n5,pg as X4,sg as P5,xg as eZ}from"./chunk-x1w3fvhr.js";import"./chunk-z5mm9g1y.js";import"./chunk-1tfjaazq.js";import"./chunk-nfdfthhb.js";import{dh as eJ,fh as E$}from"./chunk-gv24cgpb.js";import"./chunk-yvk8w63g.js";import{si as a5,xi as sZ,yi as i5}from"./chunk-jy61b0v8.js";import{Ai as IY}from"./chunk-3csj18f1.js";import{Bi as I2,Ci as c8,Ei as $9}from"./chunk-nry7d26k.js";import{Ji as z$}from"./chunk-be2csw9m.js";import"./chunk-679b7s58.js";import"./chunk-8xem2mzy.js";import{mj as r5,pj as q1}from"./chunk-ar3sdj0w.js";import{rj as vZ,sj as jZ,vj as B1}from"./chunk-rcthrb7h.js";import"./chunk-0d440hhe.js";import{Hj as TZ}from"./chunk-dnt4c3gy.js";import{Kj as V9}from"./chunk-rmm7n9n3.js";import"./chunk-961nemng.js";import{Nj as t2,fk as uY}from"./chunk-fjvt9mwv.js";import{sk as r8}from"./chunk-w3y69e4e.js";import{useMemoizedFn as i4}from"ahooks";import{useEffect as mq,useState as o4}from"react";import{useMemoizedFn as r0}from"ahooks";import V5 from"ansi-escapes";import{Box as k1,useStdout as Vq}from"ink";import{useEffect as Q1,useMemo as fq,useRef as L2,useState as f5}from"react";import{useShallow as ZX}from"zustand/react/shallow";import{useStore as YX}from"zustand";function z0($){return YX(b2,$)}var XX=[],M2=()=>z0(($)=>$.session.sessionId),G1=()=>z0(($)=>$.session.workspaceRoot),T8=()=>z0(($)=>$.session.messages),j9=()=>z0(($)=>$.session.clearCount),E9=()=>z0(($)=>$.session.isCompacting),h9=()=>z0(($)=>$.session.tokenUsage.estimatedCostUsd),g9=()=>z0(($)=>{let{totalInputTokens:J,cacheReadTokens:Z,cacheWriteTokens:Y}=$.session.tokenUsage;return v9({totalInputTokens:J,cacheReadTokens:Z,cacheWriteTokens:Y}).hitRate}),m9=()=>z0(($)=>$.session.providerCircuit),p9=()=>z0(($)=>$.session.providerAdmission),x9=()=>z0(($)=>$.session.providerRetry),u9=()=>z0(($)=>$.session.providerStall),c9=()=>z0(($)=>$.session.actionStationarity),E1=()=>z0(($)=>$.session.actions),d9=()=>z0(($)=>{let{totalTokens:J,maxContextTokens:Z}=$.session.tokenUsage;if(Z<=0)return 100;let Y=Math.max(0,100-J/Z*100);return Math.round(Y)}),l9=()=>z0(($)=>$.app.initializationStatus),r9=()=>z0(($)=>$.app.initializationError),C8=()=>z0(($)=>$.app.activeModal),a9=()=>z0(($)=>$.app.tasks),i9=()=>z0(($)=>$.app.modelEditorTarget),o9=()=>z0(($)=>$.app.sessionSelectorData),n9=()=>z0(($)=>$.app.sessionHistoryViewerData),t9=()=>z0(($)=>$.app.taskAttentionStatus),R8=()=>z0(($)=>$.app.taskAttentionUnreadKeys),s9=()=>z0(($)=>$.app.awaitingSecondCtrlC),h1=()=>z0(($)=>$.app.actions),y8=()=>z0(($)=>$.app.sideConversation),e9=()=>z0(($)=>$.app.teams),I8=()=>z0(($)=>$.app.initializationStatus==="ready"),$Y=()=>z0(($)=>$.app.tasks.length>0),T2=()=>z0(($)=>$.config.config?.permissionMode||"default"),JY=()=>z0(($)=>$.config.config?.models??XX),S8=()=>z0(($)=>{let J=$.config.config;if(!J)return;let Z=J.currentModelId;return J.models.find((X)=>X.id===Z)??J.models[0]}),k8=()=>z0(($)=>$.config.config?.currentModelId),YY=()=>z0(($)=>$.config.config?.agentTeamsEnabled===!0),V0=()=>z0(($)=>{return B$.getTheme()}),ZY=()=>z0(($)=>$.config.config?.codeTheme??"default"),U$=()=>z0(($)=>$.focus.currentFocus),XY=()=>z0(($)=>$.focus.actions),C2=()=>z0(($)=>$.command.isProcessing),QY=()=>z0(($)=>$.command.actions),R2=()=>z0(($)=>$.command.pendingCommands),UY=()=>z0(($)=>$.command.recoveredSteeringCount),D8=()=>z0(($)=>$.app.reasoningEffort!=="off"),V8=()=>z0(($)=>$.app.reasoningEffort),f8=()=>z0(($)=>$.app.serviceTier),v8=()=>z0(($)=>$.app.responseVerbosity),j8=()=>z0(($)=>$.app.communicationStyle),E8=()=>z0(($)=>$.session.currentThinkingContent),GY=()=>z0(($)=>$.session.thinkingExpanded),h8=()=>z0(($)=>$.session.currentStreamingMessageId),g8=()=>z0(ZX(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),qY=()=>z0(($)=>$.session.finalizingStreamingMessageId),KY=()=>z0(($)=>$.session.historyExpanded),zY=()=>z0(($)=>$.session.expandedMessageCount);import{useMemoizedFn as L1}from"ahooks";import{useEffect as s1,useMemo as nX,useRef as Z4}from"react";function QX($,J){try{return $.code===J.code&&$.message===J.message&&$.retryable===J.retryable&&$.resource===J.resource}catch{return!1}}class t4{options;requested=!1;waitingForIdle=!1;disposed=!1;generation=0;wakeEpoch=0;idleEpoch=0;attempt=0;recoveryStartedAt=null;scheduledToken=null;activeAttemptToken=null;activeRunController=null;retryTimer=null;deadlineTimer=null;now;scheduleCallback;setTimerCallback;clearTimerCallback;constructor($){this.options=$;this.now=$.now??Date.now,this.scheduleCallback=$.scheduleMicrotask??queueMicrotask,this.setTimerCallback=$.setTimer??setTimeout,this.clearTimerCallback=$.clearTimer??clearTimeout}request(){if(this.disposed)return;if(this.wakeEpoch++,this.requested=!0,this.waitingForIdle||this.retryTimer)return;this.scheduleIfRunnable()}notifyIdle(){if(this.disposed)return;if(this.idleEpoch++,this.retryTimer)return;this.waitingForIdle=!1,this.scheduleIfRunnable()}dispose(){if(this.disposed)return;this.disposed=!0,this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.activeAttemptToken=null;let $=this.activeRunController;this.activeRunController=null,$?.abort("pending-resume-coordinator-disposed"),this.resetEpisodeBudget()}scheduleIfRunnable(){if(this.disposed||!this.requested||this.scheduledToken||this.activeAttemptToken||this.retryTimer||this.waitingForIdle)return;if(!this.options.canRun()){this.waitingForIdle=!0;return}let $=this.generation,J={};this.scheduledToken=J;try{this.scheduleCallback(()=>{if(this.disposed||$!==this.generation||this.scheduledToken!==J)return;this.scheduledToken=null,this.flush($).catch((Z)=>{this.handleUnexpectedFailure(Z,$)})})}catch(Z){this.handleUnexpectedFailure(Z,$)}}async flush($){if(this.disposed||$!==this.generation||this.activeAttemptToken||!this.requested||this.retryTimer||this.waitingForIdle)return;if(!this.options.canRun()){this.waitingForIdle=!0;return}let J={},Z=new AbortController,Y=this.wakeEpoch,X=this.idleEpoch;if(this.attempt++,this.recoveryStartedAt===null)this.recoveryStartedAt=this.now(),this.installDeadlineTimer($);this.activeAttemptToken=J,this.activeRunController=Z;let Q=await this.options.run(Z.signal);if(this.disposed||$!==this.generation||this.activeAttemptToken!==J)return;if(this.activeAttemptToken=null,this.activeRunController=null,Q.status==="completed"){let U=this.wakeEpoch!==Y;if(this.clearEpisode(),U)this.requested=!0,this.scheduleIfRunnable();return}if(Q.status==="deferred"){if(this.attempt--,this.attempt===0)this.clearOwnedTimer("deadline"),this.resetEpisodeBudget();if(this.requested=!0,this.idleEpoch!==X)this.waitingForIdle=!1,this.scheduleIfRunnable();else this.waitingForIdle=!0;return}this.handleFailure(Q,$)}handleFailure($,J){let Z=y2($.taskFailure),Y=this.options.sessionIdentity;if($.workKind!=="pending_input"||!$.evidence||!Y||!QX($.taskFailure,$.evidence.taskFailure)){this.terminate("failed",this.attempt,Z);return}let X=NY({sessionIdentity:Y,failedAttempt:this.attempt,recoveryStartedAt:this.recoveryStartedAt??this.now(),now:this.now(),workStillPending:$.workStillPending,evidence:$.evidence});if(X.phase!=="retry_scheduled"){this.terminate(X.phase,this.attempt,Z);return}this.requested=!0,this.waitingForIdle=!1;let Q={},U=this.setTimerCallback(()=>{if(this.disposed||J!==this.generation||this.retryTimer?.token!==Q)return;this.retryTimer=null,this.scheduleIfRunnable()},X.delayMs);this.retryTimer={handle:U,token:Q},U.unref?.()}handleUnexpectedFailure($,J){if(this.disposed||J!==this.generation)return;this.terminate("failed",Math.max(1,this.attempt),y2($),"pending-resume-coordinator-failed")}installDeadlineTimer($){let J={},Z=this.setTimerCallback(()=>{if(this.disposed||$!==this.generation||this.deadlineTimer?.token!==J)return;this.deadlineTimer=null,this.terminate("exhausted",Math.max(1,this.attempt),OY("timeout"),"pending-resume-recovery-deadline-exceeded")},_Y);this.deadlineTimer={handle:Z,token:J},Z.unref?.()}terminate($,J,Z,Y){let X=this.activeRunController;if(this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.activeAttemptToken=null,this.activeRunController=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget(),Y)X?.abort(Y);try{this.options.onTerminalFailure?.({phase:$,attempt:J,taskFailure:Z})}catch{}}clearEpisode(){this.requested=!1,this.waitingForIdle=!1,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget()}resetEpisodeBudget(){this.attempt=0,this.recoveryStartedAt=null}clearOwnedTimer($){let J=$==="retry"?this.retryTimer:this.deadlineTimer;if(!J)return;if($==="retry")this.retryTimer=null;else this.deadlineTimer=null;this.clearTimerCallback(J.handle)}}class o2{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)m8(J,$.extraContent);WY(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function UX($){if(!($ instanceof Error))return"未知错误";let Y=$.lastError??$;if(Y.responseBody)try{let U=JSON.parse(Y.responseBody)?.error?.message;if(U){let q=Y.statusCode?` (HTTP ${Y.statusCode})`:"";return`${U}${q}`}}catch{}let X=$.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return $.message}function GX($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function qX($){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 p8($){let J=GX($),Z=qX($),Y;if(Z)Y="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Y=UX($);return{displayMessage:Y,isAbort:J,isVisionNotSupported:Z}}import{appendFileSync as KX,mkdirSync as zX,writeFileSync as OX}from"node:fs";import _X from"node:os";import s4 from"node:path";var HY=null;function NX(){let $=process.env.BLADE_STORAGE_ROOT||s4.join(_X.homedir(),".blade");return s4.join($,"logs","stream-debug.log")}function WX($){if(HY===$)return;let J=s4.dirname($);zX(J,{recursive:!0,mode:493}),OX($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
|
|
2
|
+
`),HY=$}function e4($,J,Z){try{let Y=NX();WX(Y);let X=new Date().toISOString(),Q=Z?` | ${JSON.stringify(Z)}`:"",U=`[${X}] [${$}] ${J}${Q}
|
|
3
|
+
`;KX(Y,U)}catch{}}var n2=q1("UI");function $J($,J){if(J.state==="requires_attention"){let Z=J.reason==="interrupted_tool_call";$.addToolMessage("Turn recovery requires attention",{toolName:"Runtime Recovery",phase:"complete",summary:Z?"An interrupted tool may have partially completed":"A completed tool may already have changed external state",detail:`${J.turnId} · inspect workspace, processes, and external state before retrying`});return}$.addToolMessage(J.state==="completed"?"Recovered completed turn":"Resuming interrupted turn",{toolName:"Runtime Recovery",phase:"complete",summary:J.state==="completed"?"The durable final response was recovered":"No tool execution was recorded before interruption",detail:J.turnId})}function AY($,J){let Z=$.streamSession??new o2({signal:$.signal,streamingBuffer:$.streamingBuffer,getStreamingMessageId:$.getStreamingMessageId,finalizeStreamingMessage:$.sessionActions.finalizeStreamingMessage,discardStreamingMessage:$.sessionActions.discardStreamingMessage,clearThinking:()=>$.sessionActions.setCurrentThinkingContent(null)});return(Y)=>{switch(Y.kind){case"content_delta":if(Y.delta.length>0)J.outputStarted=!0;if(!Z.acceptsDeltas())break;J.contentDeltaCount++,J.contentDeltaTotalLen+=Y.delta.length,e4("loopEventHandler","onContentDelta",{callCount:J.contentDeltaCount,deltaLen:Y.delta.length,totalLen:J.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(Y.delta);break;case"thinking_delta":if(Y.delta.length>0)J.outputStarted=!0;if(!Z.acceptsDeltas())break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(Y.delta);break;case"stream_end":{$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),n2.debug("[loopEventHandler] stream_end",{contentDeltaCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Z.isFinalized,signalAborted:$.signal.aborted}),e4("loopEventHandler","onStreamEnd",{contentDeltaCallCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Z.isFinalized,signalAborted:$.signal.aborted}),Z.finalize();break}case"model_fallback":$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Z.discard();break;case"provider_admission":{let{kind:X,...Q}=Y;$.sessionActions.setProviderAdmission(Y.phase==="queued"?Q:null);break}case"provider_circuit":{let{kind:X,...Q}=Y;$.sessionActions.setProviderCircuit(Y.phase==="closed"?null:Q);break}case"provider_retry":{let{kind:X,...Q}=Y;$.sessionActions.setProviderRetry(Y.phase==="recovered"?null:Q);break}case"provider_stall":{let{kind:X,...Q}=Y;$.sessionActions.setProviderStall(Y.phase==="detected"?Q:null);break}case"action_stationarity":{let{kind:X,...Q}=Y;$.sessionActions.setActionStationarity(Y.phase==="recovered"?null:Q);break}case"turn_recovery":{$J($.sessionActions,Y.assessment);break}case"tool_start":{J.toolExecutionStarted=!0;let X=Y.toolCall;if(!("function"in X))break;if(X.function.name===x8)break;if(n2.debug("[loopEventHandler] tool_start",{toolName:X.function.name,toolKind:Y.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(X.function.name))break;try{let Q=JSON.parse(X.function.arguments),U=BY(X.function.name,Q);$.sessionActions.addToolMessage(U,{toolCallId:X.id,toolName:X.function.name,phase:"start",summary:U,params:Q})}catch(Q){n2.error("[loopEventHandler] onToolStart error:",Q)}break}case"tool_progress":{J.toolExecutionStarted=!0;let X=Y.toolCall;if(!("function"in X))break;if(X.function.name===x8)break;let Q=Y.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((Y.update.progress??0)/Y.update.total*100)))}%`:"",U=`${X.function.name}${Q}: ${Y.update.message}`;$.sessionActions.addToolMessage(U,{toolCallId:X.id,toolName:X.function.name,phase:"progress",summary:U,...Y.update.admission?{admission:Y.update.admission}:{}});break}case"tool_result":{J.toolExecutionStarted=!0;let X=Y.toolCall;if(!("function"in X))break;if(X.function.name===x8)break;n2.debug("[loopEventHandler] tool_result",{toolName:X.function.name,success:Y.result.success});let Q=LY(wY(X.function.name,Y.result),FY);$.sessionActions.addToolMessage(Q.summary,{toolCallId:X.id,toolName:X.function.name,phase:"complete",summary:Q.summary,detail:Q.detail});break}case"structured_output":J.outputStarted=!0,$.sessionActions.replaceLastAssistantMessage(JSON.stringify(Y.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(Y.usage);break;case"compaction":if($.sessionActions.setCompacting(Y.phase==="start"),Y.phase==="end"){if($.sessionActions.resetContextUsage(),Y.outcome!=="failed")J.compactionCount=(J.compactionCount??0)+1}break;case"turn_start":n2.debug("[loopEventHandler] turn_start",{turn:Y.turn,maxTurns:Y.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:Y.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Z.startTurn();break;case"task_update":$.appActions.setTasks(Y.tasks);break;case"goal_frontier_updated":$.appActions.setTasks(Y.tasks);break;case"mcp_catalog_changed":{let X=`MCP catalog r${Y.revision}: +${Y.added.length} -${Y.removed.length} ~${Y.updated.length}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Catalog",phase:"complete",summary:X,detail:[Y.added.length>0?`Added: ${Y.added.join(", ")}`:"",Y.removed.length>0?`Removed: ${Y.removed.join(", ")}`:"",Y.updated.length>0?`Updated: ${Y.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
4
|
+
`)});break}case"mcp_content_changed":{let X=`MCP ${Y.contentKind} r${Y.revision}: +${Y.added.length} -${Y.removed.length} ~${Y.updated.length}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Content",phase:"complete",summary:X,detail:[Y.added.length>0?`Added: ${Y.added.join(", ")}`:"",Y.removed.length>0?`Removed: ${Y.removed.join(", ")}`:"",Y.updated.length>0?`Updated: ${Y.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
5
|
+
`)});break}case"mcp_resource_updated":{let X=`MCP resource updated: ${Y.uri}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Resource",phase:"progress",summary:X,detail:`${Y.serverName} · revision ${Y.revision}`});break}case"mcp_connection_changed":{let X=Y.phase==="reconnecting"?"recovering":Y.phase==="recovered"?"recovered":"recovery failed",Q=`MCP ${Y.serverName} ${X}`+(Y.phase==="reconnecting"?` (${Y.attempt}/${Y.maxAttempts})`:"");$.sessionActions.addToolMessage(Q,{toolName:"MCP Connection",phase:"complete",summary:Q,detail:[`reason: ${Y.reason}`,`revision: ${Y.revision}`,Y.error?`error: ${Y.error}`:""].filter(Boolean).join(`
|
|
6
|
+
`)});break}case"mcp_log":{let X=Y.logger?`${Y.serverName} · ${Y.logger}`:Y.serverName,Q=`MCP ${Y.level} · ${X}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Log",phase:"complete",summary:Q,detail:[Y.message,`revision: ${Y.revision}`,`sha256: ${Y.dataSha256}`,Y.truncated?"truncated: true":"",Y.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
7
|
+
`)});break}case"mcp_instructions_changed":{let X=`MCP instructions ${Y.action}: ${Y.serverName}`+(Y.truncated?" (truncated)":"");$.sessionActions.addToolMessage(X,{toolName:"MCP Instructions",phase:"complete",summary:X,detail:[Y.text??"",Y.sha256?`sha256: ${Y.sha256}`:"",Y.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
8
|
+
`)});break}case"mcp_task_changed":{let X=`MCP task ${Y.status}: ${Y.taskId} (${Y.serverName}/${Y.toolName})`;$.sessionActions.addToolMessage(X,{toolName:"MCP Task",phase:"complete",summary:X,detail:[Y.statusMessage??"",`revision: ${Y.revision}`,Y.hasResult?"result available via TaskOutput":"",Y.error?`error: ${Y.error}`:""].filter(Boolean).join(`
|
|
9
|
+
`)});break}case"project_rules_loaded":{let X=`Project rules loaded: ${Y.files.length}`+(Y.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(X,{toolName:"Project Rules",phase:"complete",summary:X,detail:Y.files.map((Q)=>`${Q.relativePath} ${Q.source} sha256=${Q.contentSha256}`).join(`
|
|
10
|
+
`)});break}case"steering_applied":for(let X=0;X<Y.count;X++)$.commandActions.dequeueCommand();if(Y.recovered>0)$.commandActions.setRecoveredSteeringCount(Y.recovered);break;case"follow_up_started":for(let X of Y.messages){if(!X.recovered||X.persisted)continue;let Q=typeof X.content==="string"?X.content:X.content.map((U)=>U.type==="text"?U.text:"[Image]").join(`
|
|
11
|
+
`);$.sessionActions.addUserMessage(Q)}if(Y.recovered>0)$.commandActions.setRecoveredSteeringCount(Y.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let X=Y}}}}function JJ($){let{text:J,parts:Z}=$,Y=Z.filter((U)=>U.type==="image");if(Y.length===0)return J;if(Y.length>I2)throw Error(`最多只能发送 ${I2} 张图片`);if(Y.reduce((U,q)=>U+`data:${q.mimeType};base64,`.length+q.base64.length,0)>c8)throw Error("图片编码后总大小不能超过 5 MiB");let Q=[];for(let U of Z)if(U.type==="text")Q.push({type:"text",text:U.text});else Q.push({type:"image_url",image_url:{url:`data:${U.mimeType};base64,${U.base64}`}});return Q}function PY($){let J=MY($.metadata);return{role:$.role,content:J?bY(J):$.content,...$.metadata?{metadata:$.metadata}:{}}}function d8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(PY);let J=$.messages.slice($.restoredVisibleMessageCount).map(PY);return[...$.restoredContextMessages,...J]}import EX from"node:path";import{basename as DX}from"node:path";import{createHash as HX}from"node:crypto";import*as t1 from"node:fs/promises";import*as a8 from"node:path";import FX from"write-file-atomic";var YJ=1,LX="tui-task-attention-v1.json",BX=/^[a-f0-9]{64}$/,wX=4194304,AX=20000,SY=1024,TY=256,PX=/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d\.\d{3}Z$/,bX={realpath:!1,retries:{retries:150,factor:1.2,minTimeout:10,maxTimeout:100,randomize:!0}},CY;class i8{static operations=new IY;filePath;writeFile;openFile;lockFile;chmodFile;reportDiagnostic;entries=[];pending=[];journalOverflowed=!1;constructor($={}){this.filePath=$.filePath??a8.join(t2(),LX),this.writeFile=$.writeFile??FX,this.openFile=$.openFile??t1.open,this.lockFile=$.lockFile??kX,this.chmodFile=$.chmodFile??t1.chmod,this.reportDiagnostic=$.reportDiagnostic??(()=>{return})}reconcile($,J){return this.mutate({kind:"reconcile",sessions:$,visibleLocator:J})}acknowledge($){return this.mutate({kind:"acknowledge",summary:$})}snapshot(){return l8(this.entries)}async mutate($){return i8.operations.runExclusive(this.filePath,async()=>{if(this.journalOverflowed||this.pending.length>=TY)return this.journalOverflowed=!0,this.entries=ZJ(this.entries,$),this.reportDiagnostic("TUI task attention persistence unavailable"),l8(this.entries);let J,Z,Y=!1,X=!1;try{await IX(this.filePath),J=await this.lockFile(this.filePath,{...bX,onCompromised:()=>{Y=!0}});let Q=await yX(this.filePath,this.openFile);if(Z=MX(Q,[...this.pending,$]),this.entries=Z,Y)throw Error("attention file lock compromised");let U=JSON.stringify({version:YJ,entries:Z},null,2);if(await this.writeFile(this.filePath,U+`
|
|
12
|
+
`,{mode:384}),Y)throw Error("attention file lock compromised");X=!0,this.pending=[],await this.chmodFile(this.filePath,384)}catch{if(X)return this.reportDiagnostic("TUI task attention persistence unavailable"),l8(this.entries);if(Z===void 0)Z=ZJ(this.entries,$),this.entries=Z;this.enqueue($),this.reportDiagnostic("TUI task attention persistence unavailable")}finally{if(J)try{await J()}catch{this.reportDiagnostic("TUI task attention persistence unavailable")}}return l8(this.entries)})}enqueue($){if(this.journalOverflowed)return;if(this.pending.length>=TY){this.journalOverflowed=!0;return}this.pending.push($)}}function MX($,J){return J.reduce((Z,Y)=>{return ZJ(Z,Y)},[...$])}function ZJ($,J){if(J.kind==="reconcile")return RY(TX($,J.sessions,J.visibleLocator));let Z=S2(J.summary.locator);return RY(kY($,{key:Z,signature:XJ(J.summary),unread:!1}))}function TX($,J,Z){let Y=new Map($.map((O)=>[O.key,O])),X=new Set,Q=Z?S2(Z):void 0,U,q=[],K=[];for(let O of J){let z=S2(O.locator);if(X.has(z))continue;X.add(z);let _=XJ(O);if(Q===z){U=O;continue}let F=Y.get(z);if(!F){let H={key:z,signature:_,unread:!1};if(_===null)q.push(H);else K.push(H);continue}if(_===null){q.push({key:z,signature:null,unread:F.unread});continue}if(F.signature!==_){q.push({...F,unread:!0});continue}if(F.unread)q.push(F);else K.push(F)}let G=[...K.slice(0,SY).reverse(),...q.reverse()];if(U)G=kY(G,{key:S2(U.locator),signature:XJ(U),unread:!1});return G}function RY($){let J=$.map((Y,X)=>({entry:Y,index:X})).filter(({entry:Y})=>Y.signature!==null&&!Y.unread).map(({index:Y})=>Y),Z=new Set(J.slice(0,Math.max(0,J.length-SY)));return $.filter((Y,X)=>!Z.has(X))}function kY($,J){return[...$.filter((Z)=>Z.key!==J.key),J]}function l8($){return Object.freeze({unreadKeys:Object.freeze($.filter((J)=>J.unread).map((J)=>J.key))})}function S2($){let J=$.workspace.kind==="local"?[2,"local",$.workspace.projectPath,$.sessionId]:[2,"acp-remote",$.workspace.workspaceRef,$.sessionId];return HX("sha256").update("blade-tui-task-attention-locator-v1\x00").update(JSON.stringify(J)).digest("hex")}function XJ($){if($.taskStatus!=="completed"&&$.taskStatus!=="failed"&&$.taskStatus!=="interrupted")return null;return JSON.stringify([$.taskStatus,$.taskCompletedAt??null])}function CX($){try{let J=JSON.parse($);if(!Array.isArray(J)||J.length!==2||J[0]!=="completed"&&J[0]!=="failed"&&J[0]!=="interrupted")return!1;if(J[1]!==null&&(typeof J[1]!=="string"||!PX.test(J[1])||new Date(J[1]).toISOString()!==J[1]))return!1;return JSON.stringify(J)===$}catch{return!1}}function yY($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function RX($){if(!yY($)||Object.keys($).some((Y)=>Y!=="version"&&Y!=="entries")||$.version!==YJ||!Array.isArray($.entries)||$.entries.length>AX)return;let J=new Set,Z=[];for(let Y of $.entries){if(!yY(Y)||Object.keys(Y).some((X)=>X!=="key"&&X!=="signature"&&X!=="unread")||typeof Y.key!=="string"||!BX.test(Y.key)||J.has(Y.key)||Y.signature!==null&&(typeof Y.signature!=="string"||!CX(Y.signature))||typeof Y.unread!=="boolean")return;J.add(Y.key),Z.push({key:Y.key,signature:Y.signature,unread:Y.unread})}return{version:YJ,entries:Z}}async function yX($,J){let Z;try{Z=await J($,"r");let Y=await Z.readFile();if(Y.byteLength>wX)return[];let X=JSON.parse(Y.toString("utf8"));return RX(X)?.entries??[]}catch(Y){if(Y instanceof SyntaxError||Y instanceof Error&&"code"in Y&&Y.code==="ENOENT")return[];throw Y}finally{await Z?.close()}}async function IX($){let J=a8.dirname($);await t1.mkdir(J,{recursive:!0,mode:448}),await t1.chmod(J,448)}async function SX(){return CY??=await import("proper-lockfile"),CY}async function kX($,J){return(await SX()).lock($,J)}function g1($){let{locator:J}=$;if(J.workspace.kind==="acp-remote")return[J.version,J.workspace.kind,J.workspace.workspaceRef,J.sessionId].join("\x00");return[J.version,J.workspace.kind,J.workspace.projectPath,J.sessionId].join("\x00")}function DY($){return S2($.locator)}async function VY($,J,Z){if(await $.start(),Z.continueSession||Z.resume!==void 0||Z.forkSession)return;if(Z.requestedSessionId!==void 0&&$.getState().status!=="ready")return;if(Z.requestedSessionId!==void 0&&$.getState().sessions.some((Y)=>VX(Y.locator,Z.locator)))return;await J.proveLocal(Z.locator)}function VX($,J){if($.sessionId!==J.sessionId||$.workspace.kind!==J.workspace.kind)return!1;return $.workspace.kind==="local"&&J.workspace.kind==="local"?$.workspace.projectPath===J.workspace.projectPath:$.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}async function fX($,J,Z,Y){if($==="resume"){await Z.acknowledge(J),await Z.setVisibleLocator(J.locator);return}if(Y)await Z.setVisibleLocator(Y)}function fY($,J,Z,Y){let X={version:2,sessionId:Z.sessionId,workspace:{kind:"local",projectPath:Z.projectPath}};return fX($,J,{acknowledge:(Q)=>Y.acknowledge(Q),setVisibleLocator:(Q)=>Q?Y.proveLocal(Q):Promise.resolve()},X)}function vY($,J){return $.proveLocal(J)}class QJ{attention;remote;remoteEpoch=0;provenLocalLocator;remoteActive=!1;constructor($){this.attention=$;this.remote=new jY((J)=>$.acknowledge(J))}acknowledge($){return this.attention.acknowledge($)}async proveLocal($){if(this.provenLocalLocator=$,this.remoteActive)return;this.remoteEpoch+=1,this.remote.reset(),await this.attention.setVisibleLocator($)}async beginRemote($,J){this.remoteActive=!0,this.remoteEpoch+=1,this.remote.begin($,J)}beginRemoteOpening(){this.remoteActive=!0;let $=++this.remoteEpoch;return this.remote.reset(),{epoch:$,cleared:this.attention.setVisibleLocator(void 0)}}isRemoteOpeningCurrent($){return this.remoteActive&&this.remoteEpoch===$}bindRemoteOpening($,J,Z){if(!this.isRemoteOpeningCurrent($))return!1;return this.remote.begin(J,Z),!0}async endRemote(){if(!this.remoteActive)return;this.remoteActive=!1,this.remoteEpoch+=1,this.remote.reset(),await this.attention.setVisibleLocator(this.provenLocalLocator)}async updateRemote($,J){let Z=this.remoteEpoch;if(!await this.remote.update($,J)||Z!==this.remoteEpoch)return;await this.attention.setVisibleLocator(J.session?.locator)}}class jY{acknowledge;acknowledgedView;pendingView;expectedView;constructor($){this.acknowledge=$}begin($,J){this.expectedView=$.intent==="resume"?{key:g1($.session),generation:J}:void 0}reset(){this.expectedView=void 0}async update($,J){if($.intent!=="resume"||J.status!=="ready"||!J.session||!this.expectedView||J.viewGeneration!==this.expectedView.generation||g1($.session)!==this.expectedView.key||g1($.session)!==g1(J.session))return!1;let Z=`${J.viewGeneration}\x00${g1(J.session)}`;if(Z===this.acknowledgedView||Z===this.pendingView)return!1;this.pendingView=Z;try{if(await this.acknowledge(J.session),this.expectedView?.generation!==J.viewGeneration||this.expectedView.key!==g1(J.session))return!1;return this.acknowledgedView=Z,!0}finally{if(this.pendingView===Z)this.pendingView=void 0}}}function vX($){return $.title?.trim()||`Session ${$.locator.sessionId.slice(0,8)}`}function o8($,J){let Z=$.filter((Y)=>Y.relationType!=="subagent");if(J!=="fork")return Z;return Z.filter((Y)=>Y.archivedAt===void 0&&Y.capabilities.history.fork)}function EY($){return $.find((J)=>J.relationType!=="subagent"&&J.locator.workspace.kind==="local")}function hY($,J,Z=!1){let Y=vX($),X=Z?"[NEW] ":"";if($.locator.workspace.kind==="acp-remote"){let q=$.archivedAt?" · archived":"";return`${X}[remote · ${$.capabilities.connection} · history${q}] ${Y}
|
|
13
|
+
${$.displayCwd} · ${$.messageCount} messages · ${J}${$.hasErrors?" [!]":""}`}let Q=jX($.taskStatus),U=$.relationType==="subagent"?" ↳ subagent":$.relationType==="fork"?" ↳ fork":"";return`${X}[${Q}] ${Y} · ${J} | ${DX($.displayCwd)} | ${$.messageCount} 条消息${$.hasErrors?" [!]":""}${U}`}function gY($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}function jX($){switch($){case"queued":return"QUEUED";case"running":return"RUNNING";case"failed":return"FAILED";case"cancelled":return"CANCELLED";case"interrupted":return"INTERRUPTED";case"completed":return"DONE"}}async function lY($,J,Z,Y={}){if($.locator.workspace.kind==="acp-remote"){if(J==="fork"&&Y.newSessionId)throw Error("Custom Session IDs are unavailable for remote history forks");return await Z.openHistory($,J),"history-only"}let X=await UJ($);return await Z.activateLocal(X,J),"interactive"}function t8($){if($.remoteWorkspace)throw Error("Remote history cannot enter the local compatibility path");let J=$.archivedAt!==void 0,Z=dY($.taskCompletedAt);return n8.parse({locator:{version:2,sessionId:$.sessionId,workspace:{kind:"local",projectPath:$.projectPath}},displayCwd:$.projectPath,title:$.title,rootId:$.rootId,parentId:$.parentId,relationType:$.relationType,taskStatus:$.taskStatus,...Z!==void 0?{taskCompletedAt:Z}:{},messageCount:$.messageCount,firstMessageTime:$.firstMessageTime,lastMessageTime:$.lastMessageTime,hasErrors:$.hasErrors,archivedAt:$.archivedAt,selectedModelId:$.selectedModelId,capabilities:{connection:"local",history:{read:!0,fork:!J},turn:J?{start:!1,reason:"archived"}:{start:!0},files:J?{readText:!1,writeText:!1,browse:"none",reason:"archived"}:{readText:!0,writeText:!0,browse:"tree"},terminal:J?{mode:"none",owner:"none",reason:"archived"}:{mode:"interactive",owner:"local"}}})}async function UJ($){if($.locator.workspace.kind!=="local")throw Error("Remote history cannot enter the local activation path");let J=uY($.locator.workspace.projectPath),Z=await l0.findSessionMetadata($.locator.sessionId,J);if(!Z)throw Error("Session history is no longer available");if(Z.remoteWorkspace)throw Error("Remote history cannot enter the local activation path");return Z}function mY($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function hX($){return EX.resolve($)}function pY($){if(!$||!cY($))return;q$().config.actions.updateConfig({currentModelId:$})}function xY($){if(!$)return;q$().config.actions.updateConfig({permissionMode:$})}async function s8($,J,Z){let Y=Z?await Z.listAll():(await l0.listSessions({includeSubagents:!1})).map(t8);return o8(Y,$)}async function e8($,J,Z,Y){let{intent:X,session:Q,newSessionId:U,announceFork:q,permissionModeOverride:K}=$,G=hX(Q.projectPath);if(X==="fork"){let F=await l0.forkSession(Q.sessionId,{...U?{newSessionId:U}:{},sourceProjectPath:G,targetProjectPath:G}),H=await l0.loadSessionModelContext(F.sessionId,F.metadata.projectPath),N=[...l0.toUISafeMessages(F.messages)];if(q!==!1){let b=Date.parse(F.metadata.lastMessageTime);N.push({id:"fork-announcement-"+F.sessionId,role:"assistant",content:"Forked "+mY(Q.sessionId)+" → "+mY(F.sessionId),timestamp:Number.isNaN(b)?0:b})}return await Y(),xY(K??F.metadata.permissionMode),pY(F.metadata.selectedModelId),Z.restoreSession(F.sessionId,N,H,F.metadata.projectPath),{sessionId:F.sessionId,messages:H,projectPath:F.metadata.projectPath}}await l0.assertSessionWritable(Q.sessionId,Q.projectPath);let[O,z]=await Promise.all([l0.loadSession(Q.sessionId,Q.projectPath),l0.loadSessionModelContext(Q.sessionId,Q.projectPath)]),_=l0.toUISafeMessages(O);return await Y(),xY(K??Q.permissionMode),pY(Q.selectedModelId),Z.restoreSession(Q.sessionId,_,z,Q.projectPath),{sessionId:Q.sessionId,messages:z,projectPath:Q.projectPath}}var gX=q1("UI");function nY($){return typeof $==="object"&&$!==null&&typeof $.sessionId==="string"&&typeof $.projectPath==="string"&&typeof $.rootId==="string"&&typeof $.messageCount==="number"&&typeof $.firstMessageTime==="string"&&typeof $.lastMessageTime==="string"&&typeof $.hasErrors==="boolean"}function tY($){return n8.safeParse($).success}function rY($){if(typeof $!=="object"||$===null)return!1;return Object.hasOwn($,"locator")?tY($):nY($)}function aY($){return tY($)?$:t8($)}function mX($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function pX($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function xX($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function uX($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function cX($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function dX($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function lX($){if(typeof $!=="object"||$===null)return!1;let J=$.intent;if(J!=="resume"&&J!=="fork")return!1;let Z=$.action;if(Z==="select_session"){let Y=$.sessions;return Array.isArray(Y)&&Y.every(rY)}if(Z==="activate_session"){let Y=$.session;return rY(Y)}return!1}function rX($,J,Z,Y){switch($){case"show_theme_selector":return Z.setActiveModal("themeSelector"),!0;case"show_model_selector":return Z.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Z.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Z.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Z.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Z.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Z.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Z.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Z.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let X=J?.sessions;return Z.showSessionSelector((X??[]).map(t8),"resume"),!0}case"session_forked":{let X=J;if(X?.action!=="restore_forked_session"||!X.sessionId||!Array.isArray(X.messages)||!Array.isArray(X.visibleMessages))return!1;return Y.restoreSession(X.sessionId,X.visibleMessages,X.messages),!0}case"session_archived":{let X=J?.session;return Y.addAssistantMessage(X?`会话 ${X.sessionId} 已归档。`:"当前会话已归档。"),t$(0),!0}case"clear_screen":return Y.clearMessages(),Y.setError(null),Y.resetTokenUsage(),Z.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let X=J,Q=X?.compactedMessages;if(Q)Y.setCompactedContext(Q);if(X?.usage)Y.updateTokenUsage({inputTokens:X.usage.promptTokens,outputTokens:X.usage.completionTokens,totalTokens:X.usage.totalTokens,maxContextTokens:X.maxContextTokens,cacheReadTokens:X.usage.cacheReadInputTokens??0,cacheWriteTokens:X.usage.cacheCreationInputTokens??0,costUsd:X.usage.costUsd});return Y.resetContextUsage(),!0}case"exit_application":return t$(0),!0;default:return!1}}async function GJ($,J,Z,Y,X,Q,U,q,K,G,O,z,_,F,H=z$(),N,b){let{text:R}=$;if(!iY(R))return{type:"not_slash"};let w=await oY(R,{cwd:H,surface:"tui",workspaceRoot:H,sessionId:Q,messages:U,rewind:q,lifecycle:Q===void 0?void 0:{archiveCurrent:async()=>{return await X(),l0.archiveSession(Q,H)}},subagents:K,mcp:G,reasoning:O,serviceTier:z,responseVerbosity:_,communicationStyle:F,codeReview:N,sessionSurfaces:b,signal:Y});if(w.success&&lX(w.data)){if(w.data.action==="select_session")return J.showSessionSelector(w.data.sessions.map(aY),w.data.intent),{type:"handled",commandResult:{success:!0}};let B=aY(w.data.session);if(B.locator.workspace.kind==="acp-remote")return J.showSessionHistoryViewer(B,w.data.intent),{type:"handled",commandResult:{success:!0}};let W=nY(w.data.session)?w.data.session:await UJ(B),L=await e8({...w.data,session:W},H,Z,X);try{if(w.data.intent==="resume")await b?.acknowledge?.(B),await b?.setVisibleLocator?.(B.locator);else await b?.setVisibleLocator?.({version:2,sessionId:L.sessionId,workspace:{kind:"local",projectPath:L.projectPath}})}catch{gX.warn("[slashCommandRouter] Task attention activation unavailable")}return{type:"handled",commandResult:{success:!0}}}if(w.success&&dX(w.data))return Z.restoreSession(w.data.sessionId,w.data.visibleMessages,w.data.messages),J.setTasks([]),{type:"handled",commandResult:{success:!0}};if(w.message){if(rX(w.message,w.data,J,Z))return{type:"handled",commandResult:{success:!0}}}if(mX(w.data)){let{skillName:B,skillArgs:W}=w.data,L=W?`Please use the "${B}" skill to help me with: ${W}`:`Please use the "${B}" skill.`;return Z.addUserMessage(L),{type:"continue_as_agent",result:{userDisplayMessage:L,agentInput:{displayText:L,text:L,images:[],parts:[{type:"text",text:L}]},userMessageAlreadyAdded:!0}}}if(pX(w.data)){let{commandName:B,processedContent:W}=w.data;Z.addUserMessage(R);let L=`# Custom Command: /${B}
|
|
14
|
+
|
|
15
|
+
The user has invoked the custom command "/${B}". Follow the instructions below to complete the task.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
${W}
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:R,agentInput:{displayText:R,text:L,images:[],parts:[{type:"text",text:L}]},userMessageAlreadyAdded:!0}}}if(xX(w.data)){let{commandName:B,pluginName:W,processedContent:L}=w.data;Z.addUserMessage(R);let M=`# Plugin Command: /${B}
|
|
24
|
+
|
|
25
|
+
The user has invoked the plugin command "/${B}" from plugin "${W}". Follow the instructions below to complete the task.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
${L}
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:R,agentInput:{displayText:R,text:M,images:[],parts:[{type:"text",text:M}]},userMessageAlreadyAdded:!0}}}if(uX(w.data)){let{modelId:B,prompt:W}=w.data;return Z.addUserMessage(W),{type:"continue_as_agent",result:{userDisplayMessage:W,agentInput:{displayText:W,text:W,images:[],parts:[{type:"text",text:W}]},userMessageAlreadyAdded:!0,onceModelId:B}}}if(cX(w.data)){let B=w.data.goal.objective;return Z.addUserMessage(R),{type:"continue_as_agent",result:{userDisplayMessage:R,agentInput:{displayText:R,text:B,images:[],parts:[{type:"text",text:B}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!w.success&&w.error)return Z.addAssistantMessage(`${w.error}`),{type:"handled",commandResult:{success:w.success,output:w.message,error:w.error,metadata:w.data}};let D=w.message;if(w.success&&typeof D==="string"&&D.trim()!=="")Z.addAssistantMessage(D);return{type:"handled",commandResult:{success:w.success,output:w.message,error:w.error,metadata:w.data}}}import{useMemoizedFn as p0}from"ahooks";import{useEffect as aX,useRef as F1}from"react";function iX($,J){return $.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot}function sY($,J){return $.factory===J.factory&&$.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot&&$.runtime===J.runtime&&$.systemPrompt===J.systemPrompt&&$.appendSystemPrompt===J.appendSystemPrompt&&$.maxTurns===J.maxTurns&&$.modelId===J.modelId&&$.permissionMode===J.permissionMode&&$.reasoningEffort===J.reasoningEffort&&$.serviceTier===J.serviceTier&&$.responseVerbosity===J.responseVerbosity&&$.communicationStyle===J.communicationStyle&&$.agents===J.agents}var J6=new WeakSet;function j$(){let $=new DOMException("TUI Agent lifecycle was invalidated","AbortError");return J6.add($),$}function eY($){return typeof $==="object"&&$!==null&&J6.has($)}function Y6($){let J=F1(void 0),Z=F1(void 0),Y=F1(void 0),X=F1(void 0),Q=F1(0),U=F1(!1),q=F1(void 0),K=F1(void 0),G=F1(void 0),O=(T)=>{let y=G.current;if(y?.agent===T)return y.promise;let j={agent:T,promise:Promise.resolve()};return j.promise=Promise.resolve().then(()=>T.destroy()).finally(()=>{if(G.current===j)G.current=void 0}),G.current=j,j.promise},z=p0(()=>{Q.current++;let T=q.current;if(T)T.invalidated=!0;let y=K.current;if(y)y.invalidated=!0;if(X.current)return X.current.promise;let j=J.current,x=Z.current;J.current=void 0,Z.current=void 0,Y.current=void 0;let s=K.current,l=q.current,_0=G.current?.promise,N0,a=(async()=>{let q0,u0=async(Z$)=>{if(!Z$)return;try{await Z$}catch(g0){if(!eY(g0))q0??=g0}};if(await u0(s?.promise),s?.cleanupError!==void 0)q0??=s.cleanupError;if(await u0(_0),j)await u0(O(j));if(await u0(l?.promise),l?.cleanupError!==void 0)q0??=l.cleanupError;if(x)await u0(x.dispose());if(q0!==void 0)throw q0})();N0={promise:a},X.current=N0;let L0=()=>{if(X.current===N0)X.current=void 0};return a.then(L0,L0),a}),_=p0(async(T)=>{let y=X.current;if(y){if(await y.promise,!U.current)throw j$();return _(T)}let j=$.workspaceRoot??Z.current?.workspaceRoot??z$(),x={sessionId:T,workspaceRoot:j};if(!U.current)throw j$();let s=q.current;if(s&&!s.invalidated&&s.generation===Q.current&&iX(s.target,x))return s.promise;if(s){let a=z(),L0=Q.current;if(await a,!U.current||Q.current!==L0)throw j$();return _(T)}if(Z.current&&(Z.current.sessionId!==T||Z.current.workspaceRoot!==j)){let a=z(),L0=Q.current;if(await a,!U.current||Q.current!==L0)throw j$();return _(T)}if(!U.current)throw j$();if(Z.current)return Z.current;let l=Q.current,_0,N0=Promise.resolve().then(async()=>{let a,L0=()=>{if(!U.current||_0.invalidated||Q.current!==l||q.current!==_0)throw j$()};try{L0();let q0=await l0.findSessionMetadata(T,j);L0();let u0=q0!==void 0&&(await l0.loadSession(T,j)).length>0;L0(),a=await c$.create({sessionId:T,workspaceRoot:j,modelId:$.modelId,permissionMode:$.permissionMode??q0?.permissionMode,reasoningEffort:q0?.reasoningEffort??$.reasoningEffort,serviceTier:q0?.serviceTier??$.serviceTier,responseVerbosity:q0?.responseVerbosity??$.responseVerbosity,communicationStyle:q0?.communicationStyle??$.communicationStyle,communicationStyleDigest:q0?.communicationStyleDigest,agents:$.agents,...u0?{sessionStart:{isResume:!0,resumeSessionId:T}}:{}}),L0();let Z$={sessionId:T,modelId:q0?.selectedModelId,permissionMode:q0?.permissionMode,reasoningEffort:q0?.reasoningEffort,serviceTier:q0?.serviceTier,responseVerbosity:q0?.responseVerbosity,communicationStyle:q0?.communicationStyle,communicationStyleDigest:q0?.communicationStyleDigest},g0=a.getReasoningConfiguration().selection,a0=a.getServiceTierConfiguration().selection,H$=a.getResponseVerbosityConfiguration().selection,c0=a.getCommunicationStyleConfiguration().selection;return L0(),w$().setReasoningEffort(g0),w$().setServiceTier(a0),w$().setResponseVerbosity(H$),w$().setCommunicationStyle(c0),L0(),Z.current=a,Y.current=Z$,a}catch(q0){if(a&&Z.current!==a)await a.dispose().catch((u0)=>{_0.cleanupError??=u0});if(_0.invalidated||Q.current!==l||!U.current)throw j$();throw q0}finally{if(q.current===_0)q.current=void 0}});return _0={generation:l,target:x,invalidated:!1,promise:N0},q.current=_0,N0}),F=async(T,y,j,x,s)=>{let l;if(j&&y){let _0=T?.modelId??$.modelId,N0=T?.reasoningEffort??(x?$.reasoningEffort:j.getReasoningConfiguration().selection),a=T?.serviceTier??(x?$.serviceTier:j.getServiceTierConfiguration().selection),L0=T?.responseVerbosity??(x?$.responseVerbosity:j.getResponseVerbosityConfiguration().selection),q0=T?.communicationStyle??(x?$.communicationStyle:j.getCommunicationStyleConfiguration().selection),u0=j.getCurrentModelId(),Z$=j.getReasoningConfiguration(),g0=j.getServiceTierConfiguration(),a0=j.getResponseVerbosityConfiguration(),H$=j.getCommunicationStyleConfiguration();if($.permissionMode&&(Y.current?.sessionId!==y||Y.current.permissionMode!==$.permissionMode)){let t0=await l0.setSessionPermissionMode(y,j.workspaceRoot,$.permissionMode);s(),Y.current={...Y.current,sessionId:y,permissionMode:t0.permissionMode}}await j.refresh({modelId:_0,...N0?{reasoningEffort:N0}:{},...a?{serviceTier:a}:{},...L0?{responseVerbosity:L0}:{},...q0?{communicationStyle:q0}:{}}),s();let c0=j.getCommunicationStyleConfiguration();if(c0.source!=="built-in"&&!c0.contentSha256)throw Error("Custom communication style has no provenance");let F$={..._0&&_0!=="inherit"&&(Y.current?.sessionId!==y||Y.current.modelId!==_0)?{selectedModelId:_0}:{},...N0&&(Y.current?.sessionId!==y||Y.current.reasoningEffort!==N0)?{reasoningEffort:N0}:{},...a&&(Y.current?.sessionId!==y||Y.current.serviceTier!==a)?{serviceTier:a}:{},...L0&&(Y.current?.sessionId!==y||Y.current.responseVerbosity!==L0)?{responseVerbosity:L0}:{},...q0&&(Y.current?.sessionId!==y||Y.current.communicationStyle!==q0||Y.current.communicationStyleDigest!==c0.contentSha256)?{communicationStyle:q0,communicationStyleDigest:c0.source==="built-in"?null:c0.contentSha256}:{}};if(Object.keys(F$).length>0)try{let t0=await l0.updateSessionMetadata(y,j.workspaceRoot,F$);s(),Y.current={sessionId:y,modelId:t0.selectedModelId,permissionMode:t0.permissionMode,reasoningEffort:t0.reasoningEffort,serviceTier:t0.serviceTier,responseVerbosity:t0.responseVerbosity,communicationStyle:t0.communicationStyle,communicationStyleDigest:t0.communicationStyleDigest}}catch(t0){if(eY(t0))throw t0;throw await j.refresh({...u0?{modelId:u0}:{},reasoningEffort:Z$.selection,serviceTier:g0.selection,responseVerbosity:a0.selection,communicationStyle:H$.selection}).catch(()=>{return}),t0}l=await e2.createWithRuntime(j,{sessionId:y,systemPrompt:T?.systemPrompt??$.systemPrompt,appendSystemPrompt:T?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:T?.maxTurns??$.maxTurns,modelId:T?.modelId??$.modelId,permissionMode:T?.permissionMode??$.permissionMode,agents:$.agents})}else l=await e2.create({systemPrompt:T?.systemPrompt??$.systemPrompt,appendSystemPrompt:T?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:T?.maxTurns??$.maxTurns,modelId:T?.modelId??$.modelId,permissionMode:T?.permissionMode??$.permissionMode,agents:$.agents});return l},H=p0(async(T)=>{let y=X.current;if(y){if(await y.promise,!U.current)throw j$();return H(T)}if(!U.current)throw j$();let j=T?.sessionId??$.sessionId,x=!!T?.modelId&&T.modelId!==$.modelId,s=Z.current,l={factory:!x&&j?"session":"standalone",sessionId:j,workspaceRoot:!x&&j?$.workspaceRoot??s?.workspaceRoot??z$():$.workspaceRoot??z$(),runtime:!x&&j&&s&&s.sessionId===j&&s.workspaceRoot===($.workspaceRoot??s.workspaceRoot)?s:void 0,systemPrompt:T?.systemPrompt??$.systemPrompt,appendSystemPrompt:T?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:T?.maxTurns??$.maxTurns,modelId:T?.modelId??$.modelId,permissionMode:T?.permissionMode??$.permissionMode,reasoningEffort:T?.reasoningEffort??$.reasoningEffort,serviceTier:T?.serviceTier??$.serviceTier,responseVerbosity:T?.responseVerbosity??$.responseVerbosity,communicationStyle:T?.communicationStyle??$.communicationStyle,agents:$.agents},_0=K.current;if(_0){if(!_0.invalidated&&_0.generation===Q.current&&sY(_0.target,l))return _0.promise;_0.invalidated=!0,Q.current++;let F$=Q.current;if(await _0.promise.catch(()=>{return}),_0.cleanupError!==void 0)throw _0.cleanupError;if(!U.current||Q.current!==F$)throw j$();return H(T)}let N0=Z.current!==void 0,a=!x&&j?await _(j):void 0;if(!U.current||a!==void 0&&Z.current!==a)throw j$();let L0={factory:a?"session":"standalone",sessionId:j,workspaceRoot:a?.workspaceRoot??$.workspaceRoot??z$(),runtime:a,systemPrompt:T?.systemPrompt??$.systemPrompt,appendSystemPrompt:T?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:T?.maxTurns??$.maxTurns,modelId:T?.modelId??$.modelId,permissionMode:T?.permissionMode??$.permissionMode,reasoningEffort:T?.reasoningEffort??$.reasoningEffort,serviceTier:T?.serviceTier??$.serviceTier,responseVerbosity:T?.responseVerbosity??$.responseVerbosity,communicationStyle:T?.communicationStyle??$.communicationStyle,agents:$.agents},q0=K.current;if(q0&&!q0.invalidated&&q0.generation===Q.current&&sY(q0.target,L0))return q0.promise;if(q0){q0.invalidated=!0,Q.current++;let c0=Q.current;if(await q0.promise.catch(()=>{return}),q0.cleanupError!==void 0)throw q0.cleanupError;if(!U.current||Q.current!==c0)throw j$();return H(T)}let u0=Q.current,Z$=J.current,g0;if(Z$)J.current=void 0,g0=O(Z$);let a0,H$=Promise.resolve().then(async()=>{let c0,F$=()=>{if(!U.current||a0.invalidated||Q.current!==u0||K.current!==a0||a!==void 0&&Z.current!==a)throw j$()};try{if(F$(),g0){try{await g0}catch(t0){throw a0.cleanupError??=t0,F$(),t0}F$()}return c0=await F(T,j,a,N0,F$),F$(),J.current=c0,c0}catch(t0){if(c0&&J.current!==c0)await O(c0).catch((f1)=>{a0.cleanupError??=f1});if(a0.invalidated||Q.current!==u0||!U.current)throw j$();throw t0}finally{if(K.current===a0)K.current=void 0}});return a0={generation:u0,target:L0,invalidated:!1,promise:H$},K.current=a0,H$}),N=p0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await _($.sessionId)).listRewindCheckpoints()}),b=p0(async(T)=>{if(!$.sessionId)throw Error("No active session to rewind");let j=await(await _($.sessionId)).rewindSession(T);return await z(),j}),R=p0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await _($.sessionId)).listSubagents()}),P=p0(async(T,y)=>{if(!$.sessionId)throw Error("No active session for subagent control");let j=await _($.sessionId),x=!1,s,l=T,_0=(a)=>{let L0=a.status==="completed"?a.result?.message:a.result?.error||a.result?.message;b2.getState().app.actions.completeSubagentProgress(l,a.status==="completed",L0)},N0=j.resumeSubagent({agentId:T,prompt:y,onEvent:(a)=>{if(a.kind==="tool_start"&&"function"in a.toolCall)b2.getState().app.actions.updateSubagentTool(l,a.toolCall.function.name)},onCompleted:(a)=>{if(x)_0(a);else s=a}});if(l=N0.session.id,b2.getState().app.actions.startSubagentProgress(N0.session.id,N0.session.subagentType,`Resumed from ${N0.source.id}: ${N0.session.description}`),x=!0,s)_0(s);return N0}),w=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await _($.sessionId)).getMcpContentCatalog()}),D=p0(async(T)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await _($.sessionId)).refreshMcpContentCatalogs(T)}),B=p0(async(T,y,j)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await _($.sessionId)).getMcpPrompt(T,y,j)}),W=p0(async(T,y,j)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await _($.sessionId)).completeMcpArgument(T,y,j)}),L=p0(async(T,y={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await _($.sessionId)).getMcpLogs(T,y)}),M=p0(async(T)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await _($.sessionId)).listMcpTasks(T)}),V=p0(async(T)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await _($.sessionId)).getMcpTask(T)}),C=p0(async(T,y)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await _($.sessionId)).cancelMcpTask(T,y)}),I=p0(async(T,y)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await _($.sessionId)).setMcpLoggingLevel(T,y)}),A=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await _($.sessionId)).getMcpInstructions()}),k=p0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await _($.sessionId)).getReasoningConfiguration()}),Y0=p0(async(T)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let y=await _($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let j=y.getReasoningConfiguration();if(y.resolveReasoningConfiguration(T),j.selection===T)return j;await y.refresh({reasoningEffort:T});try{let x;try{x=await l0.updateSessionMetadata($.sessionId,y.workspaceRoot,{reasoningEffort:T})}catch(s){if(!(s instanceof s2)&&s.code!=="ENOENT")throw s;x=await l0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:T,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:x.selectedModelId,permissionMode:x.permissionMode,reasoningEffort:x.reasoningEffort,serviceTier:x.serviceTier,responseVerbosity:x.responseVerbosity,communicationStyle:x.communicationStyle,communicationStyleDigest:x.communicationStyleDigest},w$().setReasoningEffort(T),y.getReasoningConfiguration()}catch(x){throw await y.refresh({reasoningEffort:j.selection}),x}}),r=p0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await _($.sessionId)).getServiceTierConfiguration()}),p=p0(async(T)=>{if(!$.sessionId)throw Error("No active session for service tier");let y=await _($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let j=y.getServiceTierConfiguration();if(y.resolveServiceTierConfiguration(T),j.selection===T)return j;await y.refresh({serviceTier:T});try{let x;try{x=await l0.updateSessionMetadata($.sessionId,y.workspaceRoot,{serviceTier:T})}catch(s){if(!(s instanceof s2)&&s.code!=="ENOENT")throw s;x=await l0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:T,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:x.selectedModelId,permissionMode:x.permissionMode,reasoningEffort:x.reasoningEffort,serviceTier:x.serviceTier,responseVerbosity:x.responseVerbosity,communicationStyle:x.communicationStyle,communicationStyleDigest:x.communicationStyleDigest},w$().setServiceTier(T),y.getServiceTierConfiguration()}catch(x){throw await y.refresh({serviceTier:j.selection}),x}}),I0=p0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await _($.sessionId)).getResponseVerbosityConfiguration()}),n=p0(async(T)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let y=await _($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let j=y.getResponseVerbosityConfiguration();if(y.resolveResponseVerbosityConfiguration(T),j.selection===T)return j;await y.refresh({responseVerbosity:T});try{let x;try{x=await l0.updateSessionMetadata($.sessionId,y.workspaceRoot,{responseVerbosity:T})}catch(s){if(!(s instanceof s2)&&s.code!=="ENOENT")throw s;x=await l0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:T,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:x.selectedModelId,permissionMode:x.permissionMode,reasoningEffort:x.reasoningEffort,serviceTier:x.serviceTier,responseVerbosity:x.responseVerbosity,communicationStyle:x.communicationStyle,communicationStyleDigest:x.communicationStyleDigest},w$().setResponseVerbosity(T),y.getResponseVerbosityConfiguration()}catch(x){throw await y.refresh({responseVerbosity:j.selection}),x}}),S=p0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await _($.sessionId)).getCommunicationStyleConfiguration()}),v=p0(async(T)=>{if(!$.sessionId)throw Error("No active session for communication style");let y=await _($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let j=y.getCommunicationStyleConfiguration(),x=y.resolveCommunicationStyleConfiguration(T);if(x.source!=="built-in"&&!x.contentSha256)throw Error("Custom communication style has no provenance");if(j.selection===T)return j;await y.refresh({communicationStyle:T});try{let s;try{s=await l0.updateSessionMetadata($.sessionId,y.workspaceRoot,{communicationStyle:T,communicationStyleDigest:x.source==="built-in"?null:x.contentSha256})}catch(l){if(!(l instanceof s2)&&l.code!=="ENOENT")throw l;s=await l0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:T,...x.source!=="built-in"&&x.contentSha256?{communicationStyleDigest:x.contentSha256}:{}})}return Y.current={sessionId:$.sessionId,modelId:s.selectedModelId,permissionMode:s.permissionMode,reasoningEffort:s.reasoningEffort,serviceTier:s.serviceTier,responseVerbosity:s.responseVerbosity,communicationStyle:s.communicationStyle,communicationStyleDigest:s.communicationStyleDigest},w$().setCommunicationStyle(T),y.getCommunicationStyleConfiguration()}catch(s){throw await y.refresh({communicationStyle:j.selection}),s}}),g=p0(async(T)=>{if(!Z.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Z.current.enqueueSteering(T,{allowBeforeTurn:!0})}),e=p0(async(T,y)=>{let j=$.sessionId;if(!j)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await _(j)).enqueueSteering(T,{allowBeforeTurn:!0,...y})}),U0=p0(async(T,y)=>{let j=$.sessionId;if(!j)throw Error("Side conversation requires a Session");return(await _(j)).askSideQuestion(T,{signal:y,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),f=p0(async(T,y)=>{let j=$.sessionId;if(!j)throw Error("User shell command requires a Session");return(await _(j)).executeUserShellCommand(T,y)}),X0=p0(()=>Z.current?.getTurnRecoveryAssessment()??{state:"none"}),$0=p0(async(T,y)=>{let j=$.sessionId;if(!j)throw Error("Code review requires a Session");let x=await _(j);await $4.recoverInterrupted(x.workspaceRoot,j,x);let s=await $4.start({sessionId:j,projectPath:x.workspaceRoot,runtime:x,request:T,signal:y}),l=await s.completion,_0=(await $4.list(x.workspaceRoot,j)).find((N0)=>N0.start.reviewId===s.reviewId);if(!_0)throw Error(`Review not found after completion: ${s.reviewId}`);return{reviewId:s.reviewId,status:l.status,findings:l.findings.length,content:$6(_0.start,l)}});return aX(()=>{U.current=!0;let y=J4(async()=>{U.current=!1,await z()});return()=>{y(),U.current=!1,z().catch(()=>{return})}},[z]),{agentRef:J,createAgent:H,cleanupAgent:z,steerActiveTurn:g,enqueueSessionInput:e,askSideQuestion:U0,runCodeReview:$0,executeUserShellCommand:f,getTurnRecoveryAssessment:X0,listRewindCheckpoints:N,rewindSession:b,listSubagents:R,resumeSubagent:P,getMcpContentCatalog:w,refreshMcpContentCatalogs:D,getMcpPrompt:B,completeMcpArgument:W,listMcpTasks:M,getMcpTask:V,cancelMcpTask:C,getMcpLogs:L,setMcpLoggingLevel:I,getMcpInstructions:A,getReasoningConfiguration:k,setReasoningEffort:Y0,getServiceTierConfiguration:r,setServiceTier:p,getResponseVerbosityConfiguration:I0,setResponseVerbosity:n,getCommunicationStyleConfiguration:S,setCommunicationStyle:v}}import{useMemoizedFn as k2}from"ahooks";import{useEffect as oX,useRef as Y4}from"react";function Z6($){let J=0;for(let Z of $)if(Z===`
|
|
34
|
+
`)J++;return J}function X6($,J){let Z=J?.flushTimeout??300,Y=J?.minLinesToFlush??5,X=J?.minCharsToFlush??400,Q=Y4(""),U=Y4(null),q=Y4(""),K=Y4(null),G=k2(()=>{if(Q.current){let N=Q.current,b=$.appendAssistantContent(N);m8(b,N),Q.current=""}if(U.current)clearTimeout(U.current),U.current=null}),O=k2(()=>{if(q.current)$.appendThinkingContent(q.current),q.current="";if(K.current)clearTimeout(K.current),K.current=null}),z=k2((N)=>{Q.current+=N;let b=Q.current;if(Z6(b)>=Y||b.length>=X){G();return}if(!U.current)U.current=setTimeout(G,Z)}),_=k2((N)=>{q.current+=N;let b=q.current;if(Z6(b)>=Y||b.length>=X){O();return}if(!K.current)K.current=setTimeout(O,Z)}),F=k2(()=>{if(Q.current="",U.current)clearTimeout(U.current),U.current=null;if(q.current="",K.current)clearTimeout(K.current),K.current=null}),H=k2(()=>{if(U.current)clearTimeout(U.current),U.current=null;if(K.current)clearTimeout(K.current),K.current=null;let N=Q.current,b=q.current;return Q.current="",q.current="",{extraContent:N,extraThinking:b}});return oX(()=>{return()=>{F()}},[F]),{batchAppendContent:z,batchAppendThinking:_,flushContentBuffer:G,flushThinkingBuffer:O,resetStreamingBuffers:F,drainPendingBuffers:H}}var $8=q1("UI");function Q6($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var _6=($,J,Z,Y,X,Q,U)=>{let q=C2(),K=M2(),G=G1(),O=k8(),z=T2(),_=D8(),F=V8(),H=f8(),N=v8(),b=j8(),R=y8(),P=YY(),w=E1(),D=h1(),B=QY(),W=Z4(!1),L=Z4(null),M=Z4(null),V=Z4(null),{createAgent:C,cleanupAgent:I,steerActiveTurn:A,enqueueSessionInput:k,listRewindCheckpoints:Y0,rewindSession:r,listSubagents:p,resumeSubagent:I0,getMcpContentCatalog:n,refreshMcpContentCatalogs:S,getMcpPrompt:v,completeMcpArgument:g,listMcpTasks:e,getMcpTask:U0,cancelMcpTask:f,getMcpLogs:X0,setMcpLoggingLevel:$0,getMcpInstructions:T,getReasoningConfiguration:y,setReasoningEffort:j,getServiceTierConfiguration:x,setServiceTier:s,getResponseVerbosityConfiguration:l,setResponseVerbosity:_0,getCommunicationStyleConfiguration:N0,setCommunicationStyle:a,runCodeReview:L0,askSideQuestion:q0,executeUserShellCommand:u0,getTurnRecoveryAssessment:Z$}=Y6({sessionId:K,workspaceRoot:G,systemPrompt:$,appendSystemPrompt:J,maxTurns:Y,modelId:O,permissionMode:z,reasoningEffort:F,serviceTier:H,responseVerbosity:N,communicationStyle:b,agents:Q}),g0=X6(w),a0=L1((K0)=>new o2({signal:K0,streamingBuffer:g0,getStreamingMessageId:()=>q$().session.currentStreamingMessageId,finalizeStreamingMessage:w.finalizeStreamingMessage,discardStreamingMessage:w.discardStreamingMessage,clearThinking:()=>w.setCurrentThinkingContent(null)})),H$=L1(async()=>{if(!P||!K){D.setTeams([]);return}try{let P0=await new O6({configDir:t2(),subagentRegistry:X4(G)}).list({sessionId:K,projectPath:G});if(q$().session.sessionId===K&&q$().session.workspaceRoot===G)D.setTeams(P0)}catch(K0){$8.warn("[useCommandHandler] Failed to refresh Agent Teams",K0)}}),c0=L1(async(K0,P0)=>{if(K0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let k0=K0.text.trimStart().slice(1).trim();if(!k0)return{success:!1,error:"User shell command cannot be empty"};w.setCommand(`! ${k0}`);try{let J0=await u0(k0,{signal:P0});if(w.addMessage({id:`user-shell-${J0.executionId}`,role:"user",content:qJ(J0.record),timestamp:Date.now(),metadata:{userShellCommand:J0.record}}),J0.delivery==="next_turn"){let Z0=q$().session;if(Z0.sessionId===K&&Z0.workspaceRoot===G)M.current?.request()}return{success:J0.record.status!=="spawn_error",output:qJ(J0.record),...J0.record.status==="spawn_error"?{error:J0.record.stderr||"User shell command failed"}:{}}}finally{w.setCommand(null)}});s1(()=>{return()=>{L.current=null,g0.resetStreamingBuffers()}},[g0.resetStreamingBuffers]),s1(()=>{return()=>{V.current?.abort("side-conversation-session-change"),V.current=null,D.dismissSideConversation()}},[D,K,G]),s1(()=>{D.setTeams([]),H$()},[P,D,H$,K,G]),s1(()=>{if(!_)w.setCurrentThinkingContent(null)},[_,w]);let F$=L1(()=>{if(V.current){V.current.abort("user-cancel"),V.current=null,D.dismissSideConversation();return}if(!q)return;X?.();let K0=B.getAbortController()?.signal??new AbortController().signal;if((L.current??a0(K0)).abortAndFinalize(()=>{B.abort("user-cancel"),D.setTasks([])}),!W.current)w.addAssistantMessage("任务已停止"),W.current=!0}),t0=L1(async(K0,P0)=>{let k0=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(D.startSideConversation(k0,P0),K0.images.length>0){D.failSideConversation(k0,"Side conversations do not accept image attachments");return}if(!P0){D.failSideConversation(k0,"Usage: /btw <question>");return}V.current?.abort("side-conversation-replaced");let J0=new AbortController;V.current=J0;try{let Z0=await q0(P0,J0.signal);if(J0.signal.aborted||V.current!==J0)return;if(D.completeSideConversation(k0,Z0),Z0.usage)w.updateTokenUsage({inputTokens:Z0.usage.promptTokens,outputTokens:Z0.usage.completionTokens,totalTokens:Z0.usage.totalTokens,cacheReadTokens:Z0.usage.cacheReadInputTokens??0,cacheWriteTokens:Z0.usage.cacheCreationInputTokens??0,costUsd:Z0.usage.costUsd})}catch(Z0){if(J0.signal.aborted||V.current!==J0)return;D.failSideConversation(k0,Z0 instanceof Error?Z0.message:String(Z0))}finally{if(V.current===J0)V.current=null}}),f1=L1(async(K0,P0)=>{let k0={contentDeltaCount:0,contentDeltaTotalLen:0,outputStarted:!1,toolExecutionStarted:!1,compactionCount:0},J0=a0(P0.signal);L.current=J0;let Z0=AY({sessionActions:w,appActions:D,commandActions:B,streamingBuffer:g0,thinkingModeEnabled:_,getStreamingMessageId:()=>q$().session.currentStreamingMessageId,signal:P0.signal,streamSession:J0},k0);try{return{loopResult:await G6(K0,Z0),stats:k0}}finally{if(L.current===J0)L.current=null}}),U1=L1(async(K0)=>{let P0=!1,k0,J0=!1,Z0=K0;try{if(K0.text.trimStart().startsWith("!")){let Q$=B.getAbortController()??B.createAbortController();return await c0(K0,Q$.signal)}await J8();let h=B.getAbortController()??B.createAbortController(),u=d8(q$().session),m=await GJ(K0,D,w,h.signal,I,K,d8(q$().session),{listCheckpoints:Y0,execute:r},{list:p,resume:I0},{getCatalog:n,refresh:S,getPrompt:v,complete:g,listTasks:e,getTask:U0,cancelTask:f,getLogs:X0,setLoggingLevel:$0,getInstructions:T},{get:y,set:j},{get:x,set:s},{get:l,set:_0},{get:N0,set:a},G,{run:L0},U);if(m.type==="handled")return m.commandResult;if(m.type==="continue_as_agent")P0=m.result.userMessageAlreadyAdded,k0=m.result.onceModelId,J0=m.result.goalContinuationOnly===!0,Z0=m.result.agentInput;let W0=E$.getInstance(),C0;if(!J0){let Q$=await W0.executeUserPromptSubmitHooks(Z0.text,{projectDir:G,sessionId:K,permissionMode:z,hasImages:Z0.images.length>0,imageCount:Z0.images.length});if(!Q$.proceed){if(Q$.warning)w.addAssistantMessage(`${Q$.warning}`);return{success:!1,error:"blocked by hook"}}if(Q$.updatedPrompt)Z0={...Z0,text:Q$.updatedPrompt,displayText:Q$.updatedPrompt,parts:[{type:"text",text:Q$.updatedPrompt},...Z0.parts.filter((A2)=>A2.type==="image")]};if(Q$.contextInjection)C0=Q$.contextInjection}if(!P0)w.addUserMessage(Z0.displayText);let N$=JJ(Z0),X$=await C(k0?{modelId:k0}:void 0);if(h.signal.aborted)return $8.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(C0)u.push({role:"system",content:`<user-prompt-submit-hook>
|
|
35
|
+
${C0}
|
|
36
|
+
</user-prompt-submit-hook>`});let L$={messages:u,userId:"cli-user",sessionId:K,workspaceRoot:G,signal:h.signal,confirmationHandler:Z,permissionMode:z,onPermissionModeChange:async(Q$)=>{await O$().setPermissionMode(Q$)}},{loopResult:d0,stats:u$}=await f1(X$.chatStream(N$,L$,{stream:!0,goalContinuationOnly:J0,onTurnLimitReached:Z?async(Q$)=>{let A2=await Z.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${Q$.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:A2.approved,reason:A2.reason}}:void 0}),h);if(u$.compactionCount>0)w.setCompactedContext(L$.messages);if(d0.success&&d0.metadata?.outputTruncated)w.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let H1=d0.finalMessage||"";if($8.debug("[handleCommandSubmit] final reply",{success:d0.success,outputLength:H1.length,turnsCount:d0.metadata?.turnsCount,toolCallsCount:d0.metadata?.toolCallsCount}),!d0.success&&!Q6(d0)){let Q$=d0.error?.message||"任务执行失败";return w.addAssistantMessage(Q$),{success:!1,error:Q$}}if(!H1||H1.trim()===""){let Q$=d0.metadata?.abortReason;if(!W.current&&u$.contentDeltaCount===0&&Q$!=="interrupt")return w.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:H1??""}}return{success:!0,output:H1}}catch(h){if(W.current)return{success:!1,error:"aborted"};let u=p8(h),m=typeof h==="object"&&h!==null&&"name"in h&&h.name==="AbortError";if(u.isAbort||m)return{success:!1,error:"aborted"};return w.addAssistantMessage(`${u.displayMessage}`),{success:!1,error:u.displayMessage}}}),w2=L1(async(K0)=>{if(K0.aborted)return{status:"completed"};if(q$().command.isProcessing)return{status:"deferred"};let P0=await c$.hasPendingInbox(G,K),k0=!P0&&await c$.hasActiveGoal(G,K),J0=!P0&&!k0&&await c$.hasRecoverableTurn(G,K);if(K0.aborted)return{status:"completed"};if(!P0&&!k0&&!J0)return{status:"completed"};if(q$().command.isProcessing)return{status:"deferred"};if(await J8(),K0.aborted)return{status:"completed"};if(q$().command.isProcessing)return{status:"deferred"};let Z0=B.createAbortController(),h="preflight",u=()=>{if(!Z0.signal.aborted)Z0.abort("pending-resume-coordinator-disposed")};if(K0.addEventListener("abort",u,{once:!0}),K0.aborted)u();g0.resetStreamingBuffers(),w.clearFinalizingStreamingMessageId(),B.setProcessing(!0);try{let m=await C();if(Z0.signal.aborted)return Z0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};let W0=await c$.hasPendingInbox(G,K),C0=!W0&&await c$.hasActiveGoal(G,K);if(Z0.signal.aborted)return Z0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(!W0&&!C0){let d0=Z$();if(d0.state!=="none")$J(w,d0);return{status:"completed"}}h=W0?"pending_input":"goal";let N$={messages:d8(q$().session),userId:"cli-user",sessionId:K,workspaceRoot:G,signal:Z0.signal,confirmationHandler:Z,permissionMode:z,onPermissionModeChange:async(d0)=>{await O$().setPermissionMode(d0)}},{loopResult:X$,stats:L$}=await f1(m.chatStream("",N$,{stream:!0,pendingInputOnly:W0,goalContinuationOnly:C0}),Z0);if(L$.compactionCount>0)w.setCompactedContext(N$.messages);if(Z0.signal.aborted)return Z0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(X$.success&&X$.metadata?.outputTruncated)w.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!X$.success&&!Q6(X$)){let d0=y2(X$.error?.details??X$.error?.message??"恢复排队指令失败");if(h==="pending_input"){let u$=X$.metadata?.toolCallsCount,H1=typeof u$==="number"&&Number.isInteger(u$)&&u$>=0?u$:-1,Q$=await c$.hasPendingInbox(G,K);if(Z0.signal.aborted)return Z0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};return{status:"failed",workKind:h,workStillPending:Q$,taskFailure:d0,evidence:{taskFailure:d0,outputStarted:L$.outputStarted,toolExecutionStarted:L$.toolExecutionStarted,toolCallsCount:H1}}}return{status:"failed",workKind:h,workStillPending:!1,taskFailure:d0}}return{status:"completed"}}catch(m){let W0=p8(m);if(Z0.signal.reason==="interrupted-by-new-command")return{status:"deferred"};if(W0.isAbort||K0.aborted)return{status:"completed"};return{status:"failed",workKind:h,workStillPending:!1,taskFailure:y2(m)}}finally{if(K0.removeEventListener("abort",u),B.getAbortController()===Z0)B.setProcessing(!1),B.clearAbortController(Z0),w.setCurrentThinkingContent(null)}}),k$=nX(()=>{let K0="preflight";return new t4({canRun:()=>!q$().command.isProcessing,run:async(P0)=>{K0="preflight";let k0=await w2(P0);if(k0.status==="failed")K0=k0.workKind;return k0},sessionIdentity:JSON.stringify([G,K]),onTerminalFailure:({taskFailure:P0})=>{if(K0==="preflight")w.setError(`恢复排队指令失败: ${P0.message}`);else w.addAssistantMessage(P0.message)}})},[w2,w,K,G]);s1(()=>{return M.current=k$,()=>{if(k$.dispose(),M.current===k$)M.current=null}},[k$]);let v1=L1(async(K0)=>{if(q$().app.activeModal==="sessionHistoryViewer")return;if(!K0.text.trim()&&K0.images.length===0)return;let P0=q6(K0.text);if(P0){await t0(K0,P0.question);return}if(V.current?.abort("main-conversation-submitted"),V.current=null,D.dismissSideConversation(),K0.text.trimStart().startsWith("!")&&q){let J0=B.getAbortController();if(!J0){w.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let Z0=await c0(K0,J0.signal);if(!Z0.success&&Z0.error&&Z0.error!=="aborted")w.setError(Z0.error);return}if(q){if(K0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(K0.text.trim())){await J8();let m=B.getAbortController()??B.createAbortController();await GJ(K0,D,w,m.signal,I,K,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,G);return}w.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await J8();let J0=await E$.getInstance().executeUserPromptSubmitHooks(K0.text,{projectDir:G,sessionId:K,permissionMode:z,hasImages:K0.images.length>0,imageCount:K0.images.length});if(!J0.proceed){if(J0.warning)w.addAssistantMessage(J0.warning);return}let Z0=K0;if(J0.updatedPrompt)Z0={...K0,text:J0.updatedPrompt,parts:[{type:"text",text:J0.updatedPrompt},...K0.parts.filter((m)=>m.type==="image")]};if(J0.contextInjection){let m=`<user-prompt-submit-hook>
|
|
37
|
+
${J0.contextInjection}
|
|
38
|
+
</user-prompt-submit-hook>`;Z0={...Z0,text:`${Z0.text}
|
|
39
|
+
|
|
40
|
+
${m}`,parts:[...Z0.parts,{type:"text",text:`
|
|
41
|
+
|
|
42
|
+
${m}`}]}}let h=JJ(Z0),u=await A(h);if(!u.accepted){let m=u.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";w.addAssistantMessage(m);return}if(B.enqueueCommand(K0),w.addUserMessage(K0.displayText),u.delivery==="next_turn")k$.request();return}D.setTasks([]),B.setRecoveredSteeringCount(0),W.current=!1;let k0=B.createAbortController();g0.resetStreamingBuffers(),w.clearFinalizingStreamingMessageId(),B.setProcessing(!0);try{let J0=await U1(K0);if(!J0.success&&J0.error&&J0.error!=="aborted")w.setError(J0.error)}catch(J0){let Z0=p8(J0);if(Z0.isAbort);else w.setError(`执行失败: ${Z0.displayMessage}`)}finally{if(B.getAbortController()===k0)B.setProcessing(!1),B.clearAbortController(k0),w.setCurrentThinkingContent(null),M.current?.notifyIdle()}});return s1(()=>{let K0=Q4.subscribe((P0)=>{if(!U6(P0,{sessionId:K,projectPath:G}))return;if(P0.type.startsWith("team.")){let{teamName:k0,messageId:J0,content:Z0}=P0.properties,h=P0.properties.metadata;if(P0.type==="team.message.received"&&typeof k0==="string"&&typeof J0==="string"&&typeof Z0==="string"&&z6(h,{messageId:J0,teamName:k0}))(async()=>{let u=await k(Z0,{messageId:J0,origin:"team_message",metadata:h});if(!u.accepted)return;if(await new K6(k0,t2()).markDelivered([J0]),u.delivery==="next_turn")k$.request()})().catch((u)=>{$8.warn("[useCommandHandler] Failed to deliver teammate message",u)});queueMicrotask(()=>{H$()});return}if(P0.type!=="subagent.completion.queued")return;k$.request()});return()=>{K0()}},[k,k$,H$,K,G]),s1(()=>{let K0=!1;return(async()=>{if(Z)await KJ.resolvePendingWithHandler(G,K,Z);else await KJ.cancelPendingNonInteractive(G,K);if(K0)return;let[P0,k0]=await Promise.all([c$.hasPendingInbox(G,K),c$.hasActiveGoal(G,K)]),J0=!P0&&!k0&&await c$.hasRecoverableTurn(G,K);if(P0||k0||J0)k$.request()})().catch((P0)=>{if(!K0)$8.warn("[useCommandHandler] Failed to recover pending interaction or inbox",P0)}),()=>{K0=!0}},[Z,k$,K,G]),{executeCommand:v1,handleAbort:F$,isProcessing:q||R?.status==="loading",cleanupAgent:I}};import{useMemoizedFn as U4}from"ahooks";import{useRef as tX,useState as sX}from"react";var N6=()=>{let[$,J]=sX([]),Z=tX(-1),Y=U4((q,K)=>{let G={display:q,pasteMappings:K?new Map(K):new Map};J((O)=>[...O,G]),Z.current=-1}),X=U4(()=>{if($.length===0)return null;let q=Z.current===-1?$.length-1:Math.max(0,Z.current-1);return Z.current=q,$[q]||null}),Q=U4(()=>{if(Z.current===-1)return null;let q=Z.current+1;if(q>=$.length)return Z.current=-1,null;else return Z.current=q,$[q]||null}),U=U4(()=>{Z.current=-1});return{commandHistory:$,historyIndex:Z.current,addToHistory:Y,getPreviousCommand:X,getNextCommand:Q,resetHistoryIndex:U}};import{useMemoizedFn as Y8}from"ahooks";import{useMemo as eX,useRef as W6,useState as $7}from"react";var H6=()=>{let[$,J]=$7({isVisible:!1,details:null,resolver:null}),Z=W6(null),Y=W6([]),X=Y8((O)=>{Z.current=O,J({isVisible:Boolean(O),details:O?.details??null,resolver:O?.resolve??null})}),Q=Y8((O,z)=>{if(O.settled)return;if(O.settled=!0,O.signal&&O.abortListener)O.signal.removeEventListener("abort",O.abortListener);O.resolve(z)}),U=Y8((O,z)=>{return new Promise((_)=>{let F={details:O,resolve:_,signal:z,settled:!1},H=()=>{if(Z.current===F){Q(F,{approved:!1,reason:Z8}),X(Y.current.shift()??null);return}let N=Y.current.indexOf(F);if(N>=0)Y.current.splice(N,1);Q(F,{approved:!1,reason:Z8})};if(F.abortListener=H,z?.aborted){H();return}if(z?.addEventListener("abort",H,{once:!0}),!Z.current){X(F);return}Y.current.push(F)})}),q=Y8((O)=>{let z=Z.current;if(z)Q(z,O);let _=Y.current.shift()??null;X(_)}),K=Y8(()=>{if(Z.current)Q(Z.current,{approved:!1,reason:Z8});for(let O of Y.current)Q(O,{approved:!1,reason:Z8});Y.current=[],X(null)}),G=eX(()=>({requestConfirmation:U}),[U]);return{confirmationState:$,confirmationHandler:G,handleResponse:q,dismissAll:K}};import{useMemoizedFn as e1}from"ahooks";import{useRef as F6,useState as J7}from"react";var zJ="␞",OJ="␟";function G4($){return`${zJ}PASTE:${$}:`}function _J(){return OJ}var Y7=`${zJ}PASTE:(\\d+):[\\s\\S]*?${OJ}`;function Z7($){return $.includes(zJ)&&$.includes(OJ)}function X7($,J,Z){let Y=[...$.values()].filter((U)=>U.type==="image");if(Y.length>=I2)throw Error(`最多只能粘贴 ${I2} 张图片`);let X=Y.reduce((U,q)=>U+`data:${q.mimeType};base64,`.length+q.data.length,0),Q=`data:${Z};base64,`.length+J.length;if(X+Q>c8)throw Error("图片编码后总大小不能超过 5 MiB")}function Q7($,J){let Z=[],Y=[];if(!Z7($)){let z=$.trim();if(z)Y.push({type:"text",text:z});return{displayText:$,text:$,images:Z,parts:Y}}let X=Array.from($.matchAll(new RegExp(Y7,"g"))),Q=0,U="",q="";for(let z of X){let _=z.index,F=_+z[0].length,H=parseInt(z[1],10),N=J.get(H);if(_>Q){let b=$.slice(Q,_);Y.push({type:"text",text:b}),U+=b,q+=b}if(!N)U+=z[0],q+=z[0],Y.push({type:"text",text:z[0]});else if(N.type==="text")U+=N.data,q+=N.data,Y.push({type:"text",text:N.data});else{let b={id:H,base64:N.data,mimeType:N.mimeType};Z.push(b),Y.push({type:"image",...b}),q+=`[Image #${H}]`}Q=F}if(Q<$.length){let z=$.slice(Q);Y.push({type:"text",text:z}),U+=z,q+=z}let K=[];for(let z of Y){let _=K[K.length-1];if(z.type==="text"&&_?.type==="text")_.text+=z.text;else K.push(z)}let G=0,O=K.length;while(G<K.length){let z=K[G];if(z.type!=="text"||z.text.trim()!=="")break;G++}while(O>G){let z=K[O-1];if(z.type!=="text"||z.text.trim()!=="")break;O--}return{displayText:q.trim(),text:U.trim(),images:Z,parts:K.slice(G,O)}}function L6($="",J=0){let[Z,Y]=J7({value:$,cursorPosition:J}),X=F6(0),Q=F6(new Map),U=e1((F)=>{Y((H)=>({value:F,cursorPosition:H.cursorPosition}));for(let H of Q.current.keys()){let N=G4(H);if(!F.includes(N))Q.current.delete(H)}}),q=e1((F)=>{Y((H)=>({...H,cursorPosition:Math.max(0,Math.min(F,H.value.length))}))}),K=e1(()=>{Y({value:"",cursorPosition:0}),Q.current.clear()}),G=e1((F)=>{X.current+=1;let H=X.current;return Q.current.set(H,{type:"text",data:F}),H}),O=e1((F,H)=>{X7(Q.current,F,H),X.current+=1;let N=X.current;return Q.current.set(N,{type:"image",data:F,mimeType:H}),N}),z=e1((F)=>{for(let[H,N]of F)if(Q.current.set(H,N),H>=X.current)X.current=H}),_=e1((F)=>Q7(F,Q.current));return{value:Z.value,cursorPosition:Z.cursorPosition,setValue:U,setCursorPosition:q,clear:K,pasteMap:Q.current,addPasteMapping:G,addImagePasteMapping:O,restorePasteMappings:z,resolveInput:_}}import{useMemoizedFn as I6}from"ahooks";import{useEffect as S6,useRef as k6,useState as HJ}from"react";function U7($){return{supportsThinking:B1().resolveConfig($).reasoning}}function q4($){return U7($).supportsThinking}import{useInput as B6}from"ink";import{createContext as G7,useCallback as q7,useContext as K7,useEffect as z7,useMemo as O7,useRef as K4}from"react";import{jsxDEV as _7}from"react/jsx-dev-runtime";var w6=G7(null);function A6({children:$}){let J=K4(new Map),Z=K4(0),Y=q7((Q,U,q)=>{let K=Z.current++;return J.current.set(K,{id:K,priority:U,handler:Q}),q?.(),()=>{J.current.delete(K)}},[]),X=O7(()=>({register:Y}),[Y]);return B6((Q,U)=>{let q=[...J.current.values()].sort((K,G)=>G.priority-K.priority||K.id-G.id);for(let K of q)if(K.handler(Q,U)===!0)break}),_7(w6.Provider,{value:X,children:$},void 0,!1,void 0,this)}function F0($,J={}){let Z=K7(w6),Y=K4($);Y.current=$;let X=J.isActive??!0,Q=J.priority??0,U=K4(J.onRegistered);U.current=J.onRegistered,B6((q,K)=>{if(!Z&&X)Y.current(q,K)},{isActive:!Z&&X}),z7(()=>{if(!Z||!X)return;return Z.register((q,K)=>Y.current(q,K),Q,()=>U.current?.())},[X,Q,Z])}import N7 from"fast-glob";import W7 from"fuse.js";import{useEffect as P6,useMemo as z4,useRef as H7,useState as NJ}from"react";var D2=null,F7=5000;function L7($,J){let Z=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let Y of Z){let X=Y[1],Q=Y.index+(Y[0].length-X.length),U=Q+X.length;if(J>=Q&&J<=U){let q=X.slice(1),K=!1;if(q.startsWith('"')){if(K=!0,q=q.slice(1),q.endsWith('"'))q=q.slice(0,-1)}return{hasQuery:!0,query:q,startIndex:Q,endIndex:U,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var B7=[...WJ.map(($)=>`${$}/**`),...WJ,...b6.map(($)=>`**/${$}`)];function M6($,J,Z={}){let{cwd:Y=z$(),maxSuggestions:X=15,ignorePatterns:Q=B7,debounceDelay:U=300,fuzzyMatch:q=!0,disabled:K=!1,canRequest:G}=Z,O=H7(G);O.current=G;let[z,_]=NJ([]),[F,H]=NJ(!1),[N,b]=NJ(0),R=z4(()=>JSON.stringify(Q),[Q]),P=!K&&$.includes("@"),w=z4(()=>{if(J===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return L7($,J)},[$,J]);P6(()=>{if(!P){_([]),H(!1);return}let W=Date.now();if(D2&&D2.cwd===Y&&D2.ignoreKey===R&&W-D2.timestamp<F7){_(D2.files),H(!1);return}let L=!1,V=setTimeout(async()=>{if(K||O.current?.()===!1){_([]),H(!1);return}H(!0);try{let I=(await N7("**/*",{cwd:Y,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Q})).map((A)=>A.replace(/\\/g,"/"));if(!L)_(I),D2={cwd:Y,ignoreKey:R,files:I,timestamp:W}}catch(C){if(console.error("Failed to load files for @ completion:",C),!L)_([])}finally{if(!L)H(!1)}},U);return()=>{L=!0,clearTimeout(V)}},[P,Y,U,R,K]);let D=z4(()=>q&&z.length>0?new W7(z,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}):null,[z,q]),B=z4(()=>{if(!w.hasQuery||z.length===0)return[];let W=w.query.toLowerCase();if(W==="")return z.slice(0,X);if(D)return D.search(W).slice(0,X).map((M)=>M.item);return z.filter((L)=>L.toLowerCase().includes(W)).slice(0,X)},[w,z,D,X]);return P6(()=>{b(0)},[B]),{...w,suggestions:B,selectedIndex:N,loading:F}}function w7($,J=!1){if($.includes(" ")||J)return`@"${$}"`;return`@${$}`}function T6($,J,Z){if(!J.hasQuery)return{newInput:$,newCursorPos:$.length};let Y=w7(Z,J.quoted),X=$.slice(0,J.startIndex),Q=$.slice(J.endIndex),U=X+Y+" "+Q,q=J.startIndex+Y.length+1;return{newInput:U,newCursorPos:q}}import{useMemoizedFn as C6}from"ahooks";import{useEffect as R6,useRef as y6}from"react";var s0=($,J)=>{let Z=y6(!1),Y=y6(null),X=C6(()=>{if(Y.current)clearTimeout(Y.current);Y.current=setTimeout(()=>{w$().setAwaitingSecondCtrlC(!1),Z.current=!1,Y.current=null},3000)}),Q=()=>{X8().shutdown("SIGINT",0)},U=C6(()=>{if(!Z.current){if(Z.current=!0,$&&J)J();w$().setAwaitingSecondCtrlC(!0),X()}else{if(Y.current)clearTimeout(Y.current),Y.current=null;w$().setAwaitingSecondCtrlC(!1),Q()}});return R6(()=>{if($){if(w$().setAwaitingSecondCtrlC(!1),Z.current=!1,Y.current)clearTimeout(Y.current),Y.current=null}},[$]),R6(()=>{return()=>{if(Y.current)clearTimeout(Y.current)}},[]),U};var O4=q1("UI"),f6=($,J,Z,Y,X,Q,U,q,K,G,O=!1)=>{let _=U$()==="main-input",F=$.value,H=$.setValue,N=$.cursorPosition,b=E1(),R=G1(),P=h1(),w=S8(),D=w?q4(w):!1,[B,W]=HJ(!1),[L,M]=HJ([]),[V,C]=HJ(0),I=M6(F,N,{cwd:R,maxSuggestions:10,disabled:O,canRequest:()=>q$().app.activeModal!=="sessionHistoryViewer"}),A=s0(U||!1,Q),k=k6(0),Y0=500,r=k6(!1);S6(()=>{if(U)r.current=!1},[U]),S6(()=>{if(O){W(!1),M([]);return}if(I.hasQuery&&I.suggestions.length>0){let n=I.suggestions.map((S)=>({command:S,description:D6(S)?`Directory: ${S}`:`File: ${S}`,matchScore:1}));M(n),W(!0),C(0)}else if(F.startsWith("/"))if(F.includes(" "))W(!1),M([]);else{let S=V6(F,R);M(S),W(S.length>0),C(0)}else W(!1),M([])},[F,I.hasQuery,I.suggestions,R,O]);let p=I6(()=>{b.clearMessages(),b.setError(null)}),I0=I6(()=>{if(O)return;O4.debug("[DIAG] handleSubmit called:",{input:F,showSuggestions:B});let n=F.trim();if(n){let S=$.resolveInput(n);O4.debug("[DIAG] Submitting command:",{displayText:n,textLength:S.text.length,imageCount:S.images.length}),W(!1),M([]);let v=$.pasteMap.size>0?new Map($.pasteMap):new Map;X(n,v),$.clear(),J(S),O4.debug("[DIAG] Command submitted to onSubmit callback")}else O4.debug("[DIAG] Empty command, not submitting")});return F0((n,S)=>{if(n==="?"&&!F)return K?.(),setTimeout(()=>$.clear(),0),!0;if(S.backspace||S.delete||S.leftArrow||S.rightArrow||S.pageUp||S.pageDown||!S.ctrl&&!S.meta&&!S.escape&&!S.tab&&!S.upArrow&&!S.downArrow&&!S.return&&!(n==="?"&&!F))return!1;if(S.ctrl&&n==="c"||S.meta&&n==="c"||S.ctrl&&n==="d"||S.meta&&n==="d")return A(),!0;if(S.ctrl&&n==="l"||S.meta&&n==="l")return p(),!0;if(S.ctrl&&n==="t"||S.meta&&n==="t")return b.toggleThinkingExpanded(),!0;if(S.escape){if(G)K?.();else if(U&&Q){if(r.current)return!0;r.current=!0,Q()}else if(B)W(!1),M([]);else if(F){let g=Date.now();if(g-k.current<500)$.clear(),k.current=0;else k.current=g}return!0}if(S.tab&&S.shift)return q?.(),!0;if(S.tab){if(B&&L.length>0){let g=L[V].command;if(I.hasQuery&&I.suggestions.includes(g)){let{newInput:e,newCursorPos:U0}=T6(F,I,g);H(e),$.setCursorPosition(U0)}else{let e=g+" ";H(e),$.setCursorPosition(e.length)}W(!1),M([])}else if(D)P.toggleThinkingMode();return!0}if(S.return)return I0(),!0;if(S.upArrow){if(B&&L.length>0){let g=L.length-1;C((e)=>e>0?e-1:g)}else{let g=Z();if(g){if(g.pasteMappings.size>0)$.restorePasteMappings(g.pasteMappings);H(g.display),$.setCursorPosition(g.display.length)}}return!0}if(S.downArrow){if(B&&L.length>0){let g=L.length-1;C((e)=>e<g?e+1:0)}else{let g=Y();if(g){if(g.pasteMappings.size>0)$.restorePasteMappings(g.pasteMappings);H(g.display),$.setCursorPosition(g.display.length)}}return!0}return!1},{isActive:_&&!O,priority:20}),{handleSubmit:I0,showSuggestions:B,suggestions:L,selectedSuggestionIndex:V}};import I7 from"ansi-escapes";import{useStdout as S7}from"ink";import{useCallback as k7,useEffect as D7,useRef as V7}from"react";import{useStdout as A7}from"ink";import{debounce as P7}from"lodash-es";import{useEffect as b7,useState as M7}from"react";var v6={columns:80,rows:24};function T7($){return{width:$.columns||80,height:$.rows||24}}function C7($,J){return $.width===J.width&&$.height===J.height}function j6($,J,Z){let{stdout:Y}=A7(),[X,Q]=M7(()=>$(Y));return b7(()=>{let U=()=>{let K=$(Y);Q((G)=>J(G,K)?G:K)},q=P7(U,Z);return U(),Y.on("resize",q),()=>{Y.off("resize",q),q.cancel()}},[Y,Z,J,$]),X}function R7($){return $.columns||v6.columns}function y7($){return $.rows||v6.rows}function E6($,J=200){return j6($==="columns"?R7:y7,Object.is,J)}function V2($=200){return j6(T7,C7,$)}function f2($=200){return E6("columns",$)}function h6(){let{stdout:$}=S7(),J=f2(),Z=V7(!0),Y=z0((Q)=>Q.session.actions.incrementClearCount),X=k7(()=>{if($)$.write(I7.clearTerminal);Y()},[$,Y]);return D7(()=>{if(Z.current){Z.current=!1;return}X()},[J,X]),{refreshStatic:X}}import{useEffect as h7}from"react";var f7=50,x6=500,v7=new Set(["session_surface_cursor_invalid","session_surface_snapshot_changed"]);function g6($=0){return{viewGeneration:$,status:"idle",messages:[],truncated:!1}}function FJ($,J){if($.version!==J.version||$.sessionId!==J.sessionId)return!1;if($.workspace.kind!==J.workspace.kind)return!1;if($.workspace.kind==="local"&&J.workspace.kind==="local")return $.workspace.projectPath===J.workspace.projectPath;return $.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}function m6($,J){if($.workspace.kind!==J.workspace.kind)return!1;if($.workspace.kind==="local"&&J.workspace.kind==="local")return $.workspace.projectPath===J.workspace.projectPath;return $.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}function LJ($){switch($){case"session_surface_not_found":return"Session history is no longer available.";case"session_surface_cursor_invalid":case"session_surface_snapshot_changed":return"Session history changed. Reopen it to continue.";case"session_surface_capability_unavailable":case"session_surface_read_only":return"This action is unavailable in history-only mode.";case"session_surface_capacity":return"Session history is busy. Try again.";default:return"Session history is unavailable."}}function Q8($){let J=$ instanceof D$?$.code:null;return{code:J,message:LJ(J)}}function j7($){return $.slice(-x6).map((Z)=>({...Z}))}function E7($,J){let Z=new Set(J.map((Y)=>Y.id));return[...$.filter((Y)=>!Z.has(Y.id)),...J].slice(0,x6).map((Y)=>({...Y}))}class BJ{serviceFactory;pageLimit;listeners=new Set;service=null;pendingServiceClose=null;ownerClosePromise=null;activeController=null;generation=0;pageRequest=null;activeActivation=null;disposed=!1;state=g6();constructor($={}){this.serviceFactory=$.serviceFactory??(()=>new _4),this.pageLimit=$.pageLimit??f7}getState(){return this.state}subscribe($){return this.listeners.add($),()=>this.listeners.delete($)}async listPage($={}){let J=this.generation;if(await this.waitForPendingServiceClose(),this.assertOpen(),!this.isCurrent(J))throw new D$("session_surface_unavailable");let Z=this.service??this.createService(),Y=await Z.listPage($);if(!this.isCurrent(J,Z))throw new D$("session_surface_unavailable");return Y}async listAll(){let $=this.generation,J=[],Z=new Set,Y;do{if(!this.isCurrent($))throw new D$("session_surface_unavailable");let X=await this.listPage({cursor:Y,limit:this.pageLimit});if(!this.isCurrent($))throw new D$("session_surface_unavailable");for(let Q of X.sessions){let U=p6(Q.locator);if(Z.has(U))continue;Z.add(U),J.push(Q)}Y=X.nextCursor}while(Y);return J}async open($){if(this.assertOpen(),$.locator.workspace.kind!=="acp-remote")throw new D$("invalid_session_locator");let J=++this.generation;this.abortActiveRequest("history-view-replaced");let Z=this.service;if(this.service=null,!$.capabilities.history.read){this.setState({status:"error",session:$,messages:[],truncated:!1,error:{code:"session_surface_capability_unavailable",message:LJ("session_surface_capability_unavailable")}}),await this.closeService(Z,"history-view-replaced");return}if(this.setState({status:"loading",session:$,messages:[],truncated:!1}),await this.closeService(Z,"history-view-replaced"),!this.isCurrent(J))return;let Y=this.createService(),X=this.beginRequest();try{let Q=await Y.open($.locator,{limit:this.pageLimit});if(!this.isCurrent(J,Y,X))return;if(!FJ($.locator,Q.session.locator))throw new D$("workspace_binding_mismatch");this.commitResult(Q,"ready")}catch(Q){if(!this.isCurrent(J,Y,X))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:Q8(Q)})}finally{if(this.activeController===X)this.activeController=null}}activate($,J){let Z=`${J}\x00${p6($.locator)}`;if(this.activeActivation?.key===Z)return this.activeActivation.promise;let Y=this.activateUnshared($,J).finally(()=>{if(this.activeActivation?.promise===Y)this.activeActivation=null});return this.activeActivation={key:Z,promise:Y},Y}async activateUnshared($,J){if(J==="resume")return this.open($);if(this.assertOpen(),$.locator.workspace.kind!=="acp-remote"||!$.capabilities.history.fork)throw new D$("session_surface_capability_unavailable");let Z=++this.generation;this.abortActiveRequest("history-view-replaced"),this.setState({status:"forking",session:$,messages:[],truncated:!1});let Y=this.service;if(this.service=null,await this.closeService(Y,"history-view-replaced"),!this.isCurrent(Z))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork($.locator);if(!this.isCurrent(Z,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!m6($.locator,U.session.locator))throw new D$("workspace_binding_mismatch");this.commitResult(U,"ready")}catch(U){if(!this.isCurrent(Z,X,Q))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:Q8(U)})}finally{if(this.activeController===Q)this.activeController=null}}loadOlder($){if(this.pageRequest)return this.pageRequest;if(this.state.status!=="ready"&&this.state.status!=="error")return Promise.resolve();let{session:J,olderCursor:Z,snapshot:Y}=this.state,X=this.service;if(!X||!J||!Z||!Y||!J.capabilities.history.read||!this.matchesActionTarget($)||$.olderCursor!==Z)return Promise.resolve();let Q=this.generation,U=this.beginRequest();this.setState({...this.state,status:"loading-older",error:void 0});let q=X.historyPage(J.locator,{cursor:Z,expectedSnapshot:Y,limit:this.pageLimit}).then((K)=>{if(!this.isCurrent(Q,X,U))return;if(K.snapshot!==Y)throw new D$("session_surface_snapshot_changed");this.setState({...this.state,status:"ready",messages:E7(K.messages,this.state.messages),olderCursor:K.olderCursor,snapshot:K.snapshot,truncated:this.state.truncated||K.truncated,error:void 0})}).catch(async(K)=>{if(!this.isCurrent(Q,X,U))return;if(K instanceof D$&&v7.has(K.code)){this.setState({status:"loading",session:J,messages:[],truncated:!1});try{let G=await X.open(J.locator,{limit:this.pageLimit});if(!this.isCurrent(Q,X,U))return;if(!FJ(J.locator,G.session.locator))throw new D$("workspace_binding_mismatch");this.commitResult(G,"ready")}catch(G){if(!this.isCurrent(Q,X,U))return;this.setState({status:"error",session:J,messages:[],truncated:!1,error:Q8(G)})}return}this.setState({...this.state,status:"error",error:Q8(K)})}).finally(()=>{if(this.activeController===U)this.activeController=null;if(this.pageRequest===q)this.pageRequest=null});return this.pageRequest=q,q}async fork($){if(this.state.status!=="ready")return;let J=this.state.session,Z=this.service;if(!J||!Z||!this.matchesActionTarget($))return;if(!J.capabilities.history.fork){this.setState({...this.state,status:"error",error:{code:"session_surface_capability_unavailable",message:LJ("session_surface_capability_unavailable")}});return}let Y=++this.generation;if(this.abortActiveRequest("history-fork"),this.setState({...this.state,status:"forking",error:void 0}),this.service=null,await this.closeService(Z,"history-fork"),!this.isCurrent(Y))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork(J.locator);if(!this.isCurrent(Y,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!m6(J.locator,U.session.locator))throw new D$("workspace_binding_mismatch");this.commitResult(U,"ready")}catch(U){if(!this.isCurrent(Y,X,Q))return;this.setState({...this.state,status:"error",error:Q8(U)})}finally{if(this.activeController===Q)this.activeController=null}}async closeView(){this.generation+=1,this.activeActivation=null,this.abortActiveRequest("history-view-closed"),this.pageRequest=null;let $=this.service;this.service=null,this.setState(g6(this.generation)),await this.closeService($,"history-view-closed")}close(){if(this.ownerClosePromise)return this.ownerClosePromise;return this.disposed=!0,this.listeners.clear(),this.ownerClosePromise=this.closeView(),this.ownerClosePromise}createService(){let $=this.serviceFactory();return this.service=$,$}closeService($,J){if(!$)return this.waitForPendingServiceClose();let Z=this.pendingServiceClose,Y=(async()=>{if(Z)await Z;await $.close(J)})();this.pendingServiceClose=Y;let X=()=>{if(this.pendingServiceClose===Y)this.pendingServiceClose=null};return Y.then(X,X),Y}waitForPendingServiceClose(){return this.pendingServiceClose??Promise.resolve()}matchesActionTarget($){let J=this.state.session;return J!==void 0&&$.viewGeneration===this.state.viewGeneration&&FJ($.locator,J.locator)&&$.snapshot===this.state.snapshot}beginRequest(){this.abortActiveRequest("history-request-replaced");let $=new AbortController;return this.activeController=$,$}abortActiveRequest($){this.activeController?.abort($),this.activeController=null}isCurrent($,J,Z){return!this.disposed&&$===this.generation&&(J===void 0||J===this.service)&&(Z===void 0||!Z.signal.aborted)}commitResult($,J){this.setState({status:J,session:$.session,messages:j7($.history.messages),olderCursor:$.history.olderCursor,snapshot:$.history.snapshot,truncated:$.history.truncated})}setState($){this.state={...$,viewGeneration:$.viewGeneration??this.generation};for(let J of this.listeners)J(this.state)}assertOpen(){if(this.disposed)throw new D$("session_surface_unavailable")}}function p6($){return $.workspace.kind==="local"?`${$.version}\x00local\x00${$.workspace.projectPath}\x00${$.sessionId}`:`${$.version}\x00acp-remote\x00${$.workspace.workspaceRef}\x00${$.sessionId}`}class wJ{factory;active;generation=0;remoteRequestEpoch=0;constructor($=()=>new BJ){this.factory=$}acquire($){let J=++this.generation;this.active??=this.factory();let Z=this.active,Y=Z.subscribe($);return async()=>{if(Y(),await Promise.resolve(),this.generation!==J)return;if(this.active===Z)this.active=void 0;await Z.close()}}getState(){return this.active?.getState()??{viewGeneration:0,status:"idle",messages:[],truncated:!1}}activate($,J){return this.active?.activate($,J)??Promise.resolve()}closeView(){return this.cancelRemoteRequest(),this.active?.closeView()??Promise.resolve()}loadOlder($){return this.active?.loadOlder($)??Promise.resolve()}fork($){return this.active?.fork($)??Promise.resolve()}beginRemoteRequest(){return++this.remoteRequestEpoch}cancelRemoteRequest(){this.remoteRequestEpoch+=1}isCurrentRemoteRequest($){return this.active!==void 0&&this.remoteRequestEpoch===$}}async function u6($,J,Z){let Y=$.beginRemoteRequest(),X=J.beginRemoteOpening();if(await X.cleared.catch(()=>{return}),!$.isCurrentRemoteRequest(Y)||!J.isRemoteOpeningCurrent(X.epoch))return;let Q=$.activate(Z.session,Z.intent);if(!$.isCurrentRemoteRequest(Y)||!J.bindRemoteOpening(X.epoch,Z,$.getState().viewGeneration)){await Q;return}await Q}function c6({lifecycle:$,project:J,report:Z}){h7(()=>{let Y=$.acquire(J);return()=>{Y().catch(Z)}},[$,J,Z])}import{useEffect as c7}from"react";var g7=100,m7=30000,p7=new Set(["task.status","session.deleted","session.archived"]);class l6{timers=new WeakMap;setInterval($,J){let Z=setInterval($,J),Y={unref:()=>Z.unref()};return this.timers.set(Y,Z),Y}clearInterval($){let J=this.timers.get($);if(!J)return;clearInterval(J),this.timers.delete($)}}var x7=new l6;class AJ{service;store;bus;timerApi;listeners=new Set;ownedOperations=new Set;mutationTail=Promise.resolve();state;visibleLocator;hasCompleteCatalog=!1;activeRefresh=null;dirty=!1;disposed=!1;started=!1;unsubscribeBus;pollTimer;closePromise;constructor($={}){this.service=$.service??new _4,this.store=$.store??new i8,this.bus=$.bus??Q4,this.timerApi=$.timerApi??x7,this.state=d6("idle",[],this.store.snapshot().unreadKeys)}getState(){return this.state}subscribe($){if(this.disposed)return()=>{return};return this.listeners.add($),()=>this.listeners.delete($)}async start(){if(this.disposed)return;if(!this.started)this.started=!0,this.unsubscribeBus=this.bus.subscribe(($)=>{if(p7.has($.type))this.consume(this.requestRefresh(!0))}),this.pollTimer=this.timerApi.setInterval(()=>{this.consume(this.requestRefresh(!0))},m7),this.pollTimer.unref();await this.requestRefresh(!1)}listAll(){return this.requestRefresh(!1)}requestRefresh($){if(this.disposed)return Promise.resolve($2(this.state.sessions));if(this.activeRefresh){if($)this.dirty=!0;return this.activeRefresh}let J,Z,Y=new Promise((X,Q)=>{J=X,Z=Q});return this.activeRefresh=Y,this.trackOperation(Y),this.consume(this.drainRefresh(Y,J,Z)),Y}acknowledge($){return this.trackOperation(this.acknowledgeInternal($))}async acknowledgeInternal($){if(this.disposed)return;return this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.acknowledge($);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async drainRefresh($,J,Z){try{let Y=$2(this.state.sessions);do this.dirty=!1,Y=await this.refreshOnce();while(!this.disposed&&this.dirty);if(this.activeRefresh===$)this.activeRefresh=null;J(Y)}catch(Y){if(this.activeRefresh===$)this.activeRefresh=null;Z(Y)}}setVisibleLocator($){return this.trackOperation(this.setVisibleLocatorInternal($))}async setVisibleLocatorInternal($){if(this.disposed)return;if(this.visibleLocator=$?r6($):void 0,await this.waitForActiveRefresh(),this.disposed)return;if(!this.hasCompleteCatalog)return;await this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.reconcile(this.state.sessions,this.visibleLocator);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async waitForActiveRefresh(){let $=this.activeRefresh;while($){if(await $,this.disposed)return;$=this.activeRefresh}}close(){if(this.closePromise)return this.closePromise;if(this.disposed=!0,this.dirty=!1,this.unsubscribeBus?.(),this.unsubscribeBus=void 0,this.pollTimer)this.timerApi.clearInterval(this.pollTimer),this.pollTimer=void 0;this.listeners.clear();let $=this.service.close("tui-task-attention-controller-closed");return this.closePromise=this.drainOwnedOperations($),this.closePromise}async drainOwnedOperations($){let J=Promise.allSettled([$]);while(this.ownedOperations.size>0)await Promise.allSettled([...this.ownedOperations]);let[Z]=await J;if(Z?.status==="rejected")throw Z.reason}enqueueMutation($){let J=this.mutationTail.then($,$);return this.mutationTail=J.then(()=>{return},()=>{return}),J}trackOperation($){return this.ownedOperations.add($),$.then(()=>this.ownedOperations.delete($),()=>this.ownedOperations.delete($)),$}consume($){$.catch(()=>{return})}async refreshOnce(){this.publish("loading",this.state.sessions,this.state.unreadKeys);try{let $=await this.readCompleteCatalog();if(this.disposed)return $2(this.state.sessions);return await this.enqueueMutation(async()=>{if(this.disposed)return!1;let Z=await this.store.reconcile($,this.visibleLocator);if(this.disposed)return!1;return this.hasCompleteCatalog=!0,this.publish("ready",$,Z.unreadKeys),!0})?$2($):$2(this.state.sessions)}catch{if(!this.disposed)this.publish("error",this.state.sessions,this.state.unreadKeys);return $2(this.state.sessions)}}async readCompleteCatalog(){let $=[],J;do{let Z=await this.service.listPage({...J?{cursor:J}:{},limit:g7});if(this.disposed)return[];$.push(...Z.sessions),J=Z.nextCursor}while(J);return $}publish($,J,Z){if(this.disposed)return;this.state=d6($,J,Z);for(let Y of this.listeners)try{let X=Y(this.state);if(X)this.consume(X)}catch{}}}function d6($,J,Z){return Object.freeze({status:$,sessions:Object.freeze($2(J).map(u7)),unreadKeys:Object.freeze([...Z])})}function u7($){return Object.freeze($.locator.workspace),Object.freeze($.locator),Object.freeze($.capabilities.history),Object.freeze($.capabilities.turn),Object.freeze($.capabilities.files),Object.freeze($.capabilities.terminal),Object.freeze($.capabilities),Object.freeze($)}function $2($){return $.map((J)=>({...J,locator:r6(J.locator),capabilities:{...J.capabilities,history:{...J.capabilities.history},turn:{...J.capabilities.turn},files:{...J.capabilities.files},terminal:{...J.capabilities.terminal}}}))}function r6($){return $.workspace.kind==="local"?{...$,workspace:{...$.workspace}}:{...$,workspace:{...$.workspace}}}class PJ{factory;active;generation=0;constructor($=()=>new AJ){this.factory=$}acquire($){let J=++this.generation;if(!this.active){let U=this.factory();this.active={controller:U,visibility:new QJ(U)}}let Z=this.active,{controller:Y,visibility:X}=Z,Q=Y.subscribe($);return{controller:Y,visibility:X,release:async()=>{if(Q(),await Promise.resolve(),this.generation!==J)return;if(this.active===Z)this.active=void 0;await Y.close()}}}listAll(){let $=this.active?.controller;return $?$.listAll():Promise.reject(Error("TUI task attention lifecycle is not active"))}acknowledge($){return this.active?.controller.acknowledge($)??Promise.resolve()}setVisibleLocator($){return this.active?.controller.setVisibleLocator($)??Promise.resolve()}proveLocal($){return this.active?.visibility.proveLocal($)??Promise.resolve()}beginRemote($,J){return this.active?.visibility.beginRemote($,J)??Promise.resolve()}beginRemoteOpening(){return this.active?.visibility.beginRemoteOpening()??{epoch:0,cleared:Promise.resolve()}}isRemoteOpeningCurrent($){return this.active?.visibility.isRemoteOpeningCurrent($)??!1}bindRemoteOpening($,J,Z){return this.active?.visibility.bindRemoteOpening($,J,Z)??!1}endRemote(){return this.active?.visibility.endRemote()??Promise.resolve()}updateRemote($,J){return this.active?.visibility.updateRemote($,J)??Promise.resolve()}controller(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.controller}visibility(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.visibility}}function a6({ready:$,lifecycle:J,initialize:Z,project:Y,report:X}){c7(()=>{if(!$)return;let Q=J.acquire(Y);return Z(Q).catch(()=>X("startup")),()=>{Q.release().catch(()=>X("shutdown"))}},[Z,J,Y,$,X])}import J2 from"chalk";import d7 from"string-width";var D0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},W4="\x1B",bJ=`${W4}[2K`,N4=($)=>$>0?`${W4}[${$}A`:"",i6=`${W4}[?25l`,o6=`${W4}[?25h`;function n6($,J){D0.active=!0,D0.renderedLineCount=0,D0.lastRenderedLines=[],D0.terminalWidth=$,D0.terminalHeight=J,D0.isFirstRender=!0}function t6($,J){D0.terminalWidth=$,D0.terminalHeight=J}function s6($,J,Z,Y){if(!D0.active)return;let X=8,Q=Math.max(1,D0.terminalHeight-X),U=[],q=B$.getTheme(),K=" ".repeat(D0.prefixIndent),G=J2.dim.hex(q.colors.border.light);if(J>0)U.push(`${K}${J2.dim.hex(q.colors.text.muted)(`^ ${J} lines above (streaming...)`)}`);let O=Z==="code",z=Z==="diff",_="",F=$;if(O&&$.length>0)_=$[0].match(/^```(\w+)?/)?.[1]||"",F=$.slice(1);else if(z&&$.length>0&&$[0]==="<<<DIFF>>>")F=$.slice(1);let H=F.slice(-Q);if(O&&J===0){let b=_?` ${J2.hex(q.colors.text.secondary)(_)}`:"";U.push(`${K}${G("╭─")}${b}`)}for(let b=0;b<H.length;b++){let R=H[b],P=K;if(b===0&&!Y&&D0.isFirstRender&&!O&&!z)P=J2.bold.hex(q.colors.success)("• ")+" ",D0.isFirstRender=!1;let w=O?4:0,D=D0.terminalWidth-D0.prefixIndent-2-w,B=R;if(d7(R)>D)B=R.slice(0,D);if(O)U.push(`${K}${G("│")} ${B}`);else if(z){let W=B;if(W.startsWith("+"))U.push(`${P}${J2.green(B)}`);else if(W.startsWith("-"))U.push(`${P}${J2.red(B)}`);else if(W.startsWith("@@"))U.push(`${P}${J2.dim(B)}`);else U.push(`${P}${B}`)}else U.push(`${P}${B}`);if(b===0&&!Y&&D0.isFirstRender)D0.isFirstRender=!1}let N=[];if(N.push(i6),D0.renderedLineCount>0)N.push(N4(D0.renderedLineCount)),N.push("\r");for(let b=0;b<U.length;b++){let R=U[b],P=D0.lastRenderedLines[b];if(R!==P)N.push(bJ),N.push(R);if(b<U.length-1)N.push(`
|
|
43
|
+
`)}if(U.length<D0.renderedLineCount){for(let R=U.length;R<D0.renderedLineCount;R++)N.push(`
|
|
44
|
+
`),N.push(bJ);let b=D0.renderedLineCount-U.length;N.push(N4(b))}N.push(o6),process.stdout.write(N.join("")),D0.renderedLineCount=U.length,D0.lastRenderedLines=U}function l$(){if(!D0.active)return;if(D0.renderedLineCount>0){let $=[];$.push(i6),$.push(N4(D0.renderedLineCount)),$.push("\r");for(let J=0;J<D0.renderedLineCount;J++)if($.push(bJ),J<D0.renderedLineCount-1)$.push(`
|
|
45
|
+
`);if(D0.renderedLineCount>1)$.push(N4(D0.renderedLineCount-1)),$.push("\r");$.push(o6),process.stdout.write($.join(""))}D0.active=!1,D0.renderedLineCount=0,D0.lastRenderedLines=[],D0.isFirstRender=!0}function s$(){return D0.active}import e6 from"node:fs";import l7 from"node:os";import MJ from"node:path";import{MultiSelect as r7}from"@inkjs/ui";import{useMemoizedFn as H4}from"ahooks";import{Box as M0,Text as H0,useFocus as a7,useFocusManager as i7}from"ink";import F4 from"ink-select-input";import o7 from"ink-spinner";import U8 from"ink-text-input";import{useEffect as $3,useState as v2}from"react";import{jsxDEV as E}from"react/jsx-dev-runtime";var n7=[{label:"Glob - 文件搜索",value:"Glob"},{label:"Grep - 内容搜索",value:"Grep"},{label:"Read - 读取文件",value:"Read"},{label:"Write - 写入文件",value:"Write"},{label:"Edit - 编辑文件",value:"Edit"},{label:"ApplyPatch - 原子多文件补丁",value:"ApplyPatch"},{label:"Bash - 执行命令",value:"Bash"},{label:"所有工具 (不限制)",value:"all"}],t7=[{label:"红色 (red)",value:"red"},{label:"蓝色 (blue)",value:"blue"},{label:"绿色 (green)",value:"green"},{label:"黄色 (yellow)",value:"yellow"},{label:"紫色 (purple)",value:"purple"},{label:"橙色 (orange)",value:"orange"},{label:"粉色 (pink)",value:"pink"},{label:"青色 (cyan)",value:"cyan"},{label:"不设置颜色",value:"none"}];function s7($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function G8({onComplete:$,onCancel:J,initialConfig:Z}){let[Y,X]=v2(Z?"name":"mode"),[Q,U]=v2({name:Z?.name||"",description:Z?.description||"",tools:Z?.tools||[],color:Z?.color,location:Z?.location||"project",systemPrompt:Z?.systemPrompt||""}),[q,K]=v2(""),[G,O]=v2(!1),[z,_]=v2(""),[F,H]=v2(Z?"edit":"manual"),{focus:N}=i7(),R={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[F];$3(()=>{if(Y==="name"||Y==="description"||Y==="systemPrompt"||Y==="aiPrompt")return;N(`step-${Y}`)},[Y,N]);let P=H4(()=>{let L=R.indexOf(Y);if(L<R.length-1)X(R[L+1])}),w=H4(()=>{if(z)_("");if(Y==="confirm"&&F==="ai"){X("aiPrompt");return}let L=R.indexOf(Y);if(L>0)X(R[L-1]);else J()}),D=H4(async()=>{O(!0),_("");try{let L=await e2.create(),M=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
46
|
+
|
|
47
|
+
## 可用工具列表
|
|
48
|
+
|
|
49
|
+
- **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
|
|
50
|
+
- **Grep**: 代码内容搜索(例如:搜索特定函数调用)
|
|
51
|
+
- **Read**: 读取文件内容
|
|
52
|
+
- **Write**: 写入/创建文件
|
|
53
|
+
- **Edit**: 编辑文件(字符串替换)
|
|
54
|
+
- **ApplyPatch**: 原子应用多文件文本补丁
|
|
55
|
+
- **Bash**: 执行命令行命令
|
|
56
|
+
|
|
57
|
+
## 可用颜色
|
|
58
|
+
|
|
59
|
+
- red, blue, green, yellow, purple, orange, pink, cyan
|
|
60
|
+
|
|
61
|
+
## 输出格式
|
|
62
|
+
|
|
63
|
+
你必须以 JSON 格式返回配置,格式如下:
|
|
64
|
+
|
|
65
|
+
\`\`\`json
|
|
66
|
+
{
|
|
67
|
+
"name": "agent-name",
|
|
68
|
+
"description": "简洁的一句话描述(英文)",
|
|
69
|
+
"tools": ["Glob", "Grep", "Read"],
|
|
70
|
+
"color": "blue",
|
|
71
|
+
"systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
|
|
72
|
+
}
|
|
73
|
+
\`\`\`
|
|
74
|
+
|
|
75
|
+
## 注意事项
|
|
76
|
+
|
|
77
|
+
1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
|
|
78
|
+
2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
|
|
79
|
+
3. **tools**: 根据任务选择必要的工具,不要选择太多
|
|
80
|
+
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
81
|
+
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
82
|
+
|
|
83
|
+
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,C=(await L.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
84
|
+
|
|
85
|
+
## 可用工具列表
|
|
86
|
+
|
|
87
|
+
- **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
|
|
88
|
+
- **Grep**: 代码内容搜索(例如:搜索特定函数调用)
|
|
89
|
+
- **Read**: 读取文件内容
|
|
90
|
+
- **Write**: 写入/创建文件
|
|
91
|
+
- **Edit**: 编辑文件(字符串替换)
|
|
92
|
+
- **ApplyPatch**: 原子应用多文件文本补丁
|
|
93
|
+
- **Bash**: 执行命令行命令
|
|
94
|
+
|
|
95
|
+
## 可用颜色
|
|
96
|
+
|
|
97
|
+
- red, blue, green, yellow, purple, orange, pink, cyan
|
|
98
|
+
|
|
99
|
+
## 输出格式
|
|
100
|
+
|
|
101
|
+
你必须以 JSON 格式返回配置,格式如下:
|
|
102
|
+
|
|
103
|
+
\`\`\`json
|
|
104
|
+
{
|
|
105
|
+
"name": "agent-name",
|
|
106
|
+
"description": "简洁的一句话描述(英文)",
|
|
107
|
+
"tools": ["Glob", "Grep", "Read"],
|
|
108
|
+
"color": "blue",
|
|
109
|
+
"systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
|
|
110
|
+
}
|
|
111
|
+
\`\`\`
|
|
112
|
+
|
|
113
|
+
## 注意事项
|
|
114
|
+
|
|
115
|
+
1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
|
|
116
|
+
2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
|
|
117
|
+
3. **tools**: 根据任务选择必要的工具,不要选择太多
|
|
118
|
+
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
119
|
+
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
120
|
+
|
|
121
|
+
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,q)).trim(),I=C.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(I)C=I[1];let A=JSON.parse(C);if(!A.name||!A.description||!A.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(A.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");U({name:A.name,description:A.description,tools:Array.isArray(A.tools)?A.tools:[],color:A.color||"blue",location:"project",systemPrompt:A.systemPrompt}),X("confirm")}catch(L){_(L instanceof Error?L.message:String(L))}finally{O(!1)}});$3(()=>{if(Y==="aiGenerating"&&!G&&!z)D()},[Y,G,z,D]);let B=H4(async()=>{try{let L=Q.location==="project"?MJ.join(z$(),".blade","agents"):MJ.join(l7.homedir(),".blade","agents");await e6.promises.mkdir(L,{recursive:!0});let M=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){M.push("tools:");for(let I of Q.tools)M.push(` - ${I}`)}if(Q.color)M.push(`color: ${Q.color}`);M.push("---");let V=[M.join(`
|
|
122
|
+
`),"",`# ${Q.name} Subagent`,"",Q.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
|
|
123
|
+
`),C=MJ.join(L,`${Q.name}.md`);await e6.promises.writeFile(C,V,"utf-8"),$()}catch(L){console.error("保存配置失败:",L)}}),W=s0(!1,J);if(F0((L,M)=>{if(M.escape)w();else if(M.ctrl&&L==="c"||M.meta&&L==="c")W()},{isActive:Y!=="tools"}),Y==="mode")return E(M0,{flexDirection:"column",paddingY:1,children:[E(M0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(F4,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(L)=>{if(L.value==="ai")H("ai"),X("aiPrompt");else H("manual"),X("name")}},void 0,!1,void 0,this),E(M0,{marginTop:1,children:E(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="aiPrompt")return E(M0,{flexDirection:"column",paddingY:1,children:[E(M0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:[E(H0,{color:"green",children:"描述: "},void 0,!1,void 0,this),E(U8,{value:q,onChange:K,onSubmit:(L)=>{if(!L.trim())return;X("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(M0,{children:E(H0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="aiGenerating"){if(z)return E(M0,{flexDirection:"column",paddingY:1,children:[E(M0,{marginBottom:1,children:E(H0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{color:"red",children:z},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E(M0,{flexDirection:"column",paddingY:1,children:[E(M0,{marginBottom:1,children:E(H0,{bold:!0,color:"yellow",children:[E(o7,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{dimColor:!0,children:['根据你的描述:"',q,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(Y==="name"){let L=F==="edit";return E(M0,{flexDirection:"column",paddingY:1,children:[E(M0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:["Step 1/7: ",L?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{dimColor:!0,children:L?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:[E(H0,{color:"green",children:"名称: "},void 0,!1,void 0,this),L?E(H0,{children:Q.name},void 0,!1,void 0,this):E(U8,{value:Q.name,onChange:(M)=>U({...Q,name:M}),onSubmit:(M)=>{if(s7(M))return;P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(M0,{children:E(H0,{dimColor:!0,children:L?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L&&E(U8,{value:"",onChange:()=>{},onSubmit:P,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(Y==="description")return E(M0,{flexDirection:"column",paddingY:1,children:[E(M0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:[E(H0,{color:"green",children:"描述: "},void 0,!1,void 0,this),E(U8,{value:Q.description,onChange:(L)=>U({...Q,description:L}),onSubmit:(L)=>{if(!L.trim())return;P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(M0,{children:E(H0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="tools")return E(e7,{config:Q,setConfig:U,onNext:P,onPrev:w},void 0,!1,void 0,this);if(Y==="color")return E(M0,{flexDirection:"column",paddingY:1,children:[E(M0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(F4,{items:t7,onSelect:(L)=>{let M=L.value==="none"?void 0:L.value;U({...Q,color:M}),P()}},void 0,!1,void 0,this),E(M0,{marginTop:1,children:E(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="location")return E(M0,{flexDirection:"column",paddingY:1,children:[E(M0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(F4,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(L)=>{U({...Q,location:L.value}),P()}},void 0,!1,void 0,this),E(M0,{marginTop:1,children:E(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="systemPrompt")return E(M0,{flexDirection:"column",paddingY:1,children:[E(M0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:[E(H0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),E(U8,{value:Q.systemPrompt,onChange:(L)=>U({...Q,systemPrompt:L}),onSubmit:()=>P()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(M0,{children:E(H0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="confirm")return E(M0,{flexDirection:"column",paddingY:1,children:[E(M0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[E(H0,{children:[E(H0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(H0,{children:[E(H0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(H0,{children:[E(H0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(H0,{children:[E(H0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(H0,{children:[E(H0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(H0,{children:[E(H0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),E(H0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),E(F4,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(L)=>{if(L.value==="save")B();else if(L.value==="back")w();else J()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function e7({config:$,setConfig:J,onNext:Z,onPrev:Y}){let{isFocused:X}=a7({id:"step-tools"});F0((U,q)=>{if(q.escape)Y()},{isActive:X});let Q=(U)=>{if(U.includes("all"))J({...$,tools:["all"]});else J({...$,tools:U});Z()};return E(M0,{flexDirection:"column",paddingY:1,children:[E(M0,{marginBottom:1,children:E(H0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(M0,{marginBottom:1,children:E(H0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(r7,{options:n7,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import $Q from"node:fs";import{useMemoizedFn as Y2}from"ahooks";import{Box as i0,Text as e0}from"ink";import TJ from"ink-select-input";import{useEffect as JQ,useMemo as J3,useState as L4}from"react";import{jsxDEV as O0}from"react/jsx-dev-runtime";var CJ=10;function Y3({workspaceRoot:$,initialMode:J="menu",onComplete:Z,onCancel:Y}){let X=X4($),[Q,U]=L4(J),[q,K]=L4(null),[G,O]=L4(0),[z,_]=L4(0),F=Y2(()=>{X.clear(),X.loadFromStandardLocations(),O((C)=>C+1)}),H=J3(()=>{return X.getAllSubagents()},[G]),N=Math.ceil(H.length/CJ)||1,b=J3(()=>{let C=z*CJ;return H.slice(C,C+CJ)},[H,z]);JQ(()=>{let C=Math.max(0,N-1);if(z>C)_(C)},[N,z]);let R=Y2(()=>{if(z<N-1)_((C)=>C+1)}),P=Y2(()=>{if(z>0)_((C)=>C-1)}),w=[{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"}],D=Y2((C)=>{if(C.value==="cancel"){Y?.();return}U(C.value)}),B=Y2((C)=>{if(K(C.value),Q==="edit")U("editWizard");else if(Q==="delete")U("deleteConfirm")}),W=Y2(async()=>{if(!q?.configPath)return;try{await $Q.promises.unlink(q.configPath),F(),L()}catch(C){console.error("删除失败:",C)}}),L=Y2(()=>{U("menu"),K(null)}),M=s0(!1,Y);if(F0((C,I)=>{if(I.escape){if(Q==="menu")Y?.();else if(Q==="list"||Q==="edit"||Q==="delete")_(0),L();else if(Q==="deleteConfirm")L()}else if(I.ctrl&&C==="c"||I.meta&&C==="c")M();else if(Q==="list"){if(I.leftArrow||C==="h")P();else if(I.rightArrow||C==="l")R()}},{isActive:Q!=="create"&&Q!=="editWizard"}),Q==="menu")return O0(i0,{flexDirection:"column",paddingY:1,children:[O0(i0,{marginBottom:1,children:O0(e0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(TJ,{items:w,onSelect:D},void 0,!1,void 0,this),O0(i0,{marginTop:1,children:O0(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 O0(i0,{flexDirection:"column",paddingY:1,children:[O0(i0,{marginBottom:1,children:O0(e0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(i0,{paddingLeft:2,children:O0(e0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(i0,{marginTop:1,paddingLeft:2,children:O0(e0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(i0,{marginTop:1,paddingLeft:2,children:O0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return O0(i0,{flexDirection:"column",paddingY:1,children:[O0(i0,{marginBottom:1,children:[O0(e0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),O0(e0,{color:"gray",children:[" (共 ",H.length," 个)"]},void 0,!0,void 0,this),N>1&&O0(e0,{color:"yellow",children:[" ","第 ",z+1,"/",N," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b.map((C)=>O0(i0,{flexDirection:"column",paddingLeft:2,children:[O0(i0,{children:O0(e0,{children:[O0(e0,{bold:!0,color:C.color||"white",children:["• ",C.name]},void 0,!0,void 0,this),O0(e0,{color:"gray",children:[" - ",C.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),C.tools&&C.tools.length>0&&O0(i0,{paddingLeft:2,children:O0(e0,{color:"gray",children:["工具: ",C.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),C.configPath&&O0(i0,{paddingLeft:2,children:O0(e0,{color:"gray",dimColor:!0,children:C.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},C.name,!0,void 0,this)),O0(i0,{marginTop:1,paddingLeft:2,children:N>1?O0(e0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):O0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let V=(C)=>{if(H.length===0)return O0(i0,{flexDirection:"column",paddingY:1,children:[O0(i0,{marginBottom:1,children:O0(e0,{bold:!0,color:"cyan",children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(i0,{paddingLeft:2,children:O0(e0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(i0,{marginTop:1,paddingLeft:2,children:O0(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((A)=>({key:A.name,label:`${A.name} - ${A.description}`,value:A}));return O0(i0,{flexDirection:"column",paddingY:1,children:[O0(i0,{marginBottom:1,children:O0(e0,{bold:!0,color:"cyan",children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(TJ,{items:I,onSelect:B},void 0,!1,void 0,this),O0(i0,{marginTop:1,children:O0(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 O0(G8,{onComplete:()=>{F(),L()},onCancel:L},void 0,!1,void 0,this);if(Q==="edit")return V("编辑 Agent");if(Q==="editWizard"&&q){let C={name:q.name,description:q.description,tools:q.tools||[],color:q.color,location:q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:q.systemPrompt||""};return O0(G8,{initialConfig:C,onComplete:()=>{F(),L()},onCancel:L},void 0,!1,void 0,this)}if(Q==="delete")return V("删除 Agent");if(Q==="deleteConfirm"&&q)return O0(i0,{flexDirection:"column",paddingY:1,children:[O0(i0,{marginBottom:1,children:O0(e0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(i0,{marginBottom:1,paddingLeft:2,children:O0(e0,{children:["你确定要删除 Agent"," ",O0(e0,{bold:!0,color:"yellow",children:q.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),O0(i0,{marginBottom:1,paddingLeft:2,children:O0(e0,{dimColor:!0,children:["文件路径: ",q.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),O0(i0,{marginBottom:1,paddingLeft:2,children:O0(e0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(TJ,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(C)=>{if(C.value==="confirm")W();else L()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as j2,Text as T0}from"ink";import ZQ,{useEffect as XQ,useState as QQ}from"react";import{useEffect as YQ,useState as Z3}from"react";function U3($=z$(),J=5000){let[Z,Y]=Z3(null),[X,Q]=Z3(!0);return YQ(()=>{let U=!0,q=async()=>{try{let G=await X3($);if(!U)return;if(!G){Y(null),Q(!1);return}let O=await Q3($);if(!U)return;Y(O)}catch{if(U)Y(null)}finally{if(U)Q(!1)}};q();let K=null;if(J>0)K=setInterval(q,J);return()=>{if(U=!1,K)clearInterval(K)}},[$,J]),{branch:Z,loading:X}}import{jsxDEV as G0,Fragment as g$}from"react/jsx-dev-runtime";var q3=ZQ.memo(()=>{let $=I8(),J=T2(),Y=C8()==="shortcuts",X=s9(),Q=G1(),{branch:U}=U3(Q),q=S8(),K=d9(),G=E9(),O=D8(),z=V8(),_=f8(),F=v8(),H=j8(),N=h9(),b=g9(),R=R2(),P=UY(),w=t9(),D=R8(),B=M2(),[W,L]=QQ(null);XQ(()=>{let k=!1;new RJ(Q,B).get().then((p)=>{if(!k)L(p)}).catch(()=>{if(!k)L(null)});let r=RJ.subscribe((p)=>{if(!k&&p.sessionId===B&&p.workspaceRoot===Q)L(p.goal)});return()=>{k=!0,r()}},[B,Q]);let M=q?q4(q):!1,C=(()=>{if(J==="default")return null;if(J==="autoEdit")return G0(T0,{color:"magenta",children:[">> ","auto edit on ",G0(T0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return G0(T0,{color:"cyan",children:["‖ plan mode on ",G0(T0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return G0(T0,{color:"red",children:["yolo mode on ",G0(T0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),I=C!==null,A=[["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(j2,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[Y?G0(j2,{flexDirection:"column",gap:0,children:A.map((k,Y0)=>G0(j2,{flexDirection:"row",children:[k.map((r,p)=>{let[I0,n]=r.split(":");return G0(j2,{flexDirection:"row",width:20,children:[G0(T0,{color:"yellow",children:I0},void 0,!1,void 0,this),G0(T0,{color:"gray",children:":"},void 0,!1,void 0,this),G0(T0,{color:"white",children:n},void 0,!1,void 0,this)]},p,!0,void 0,this)}),Y0===A.length-1&&G0(T0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},Y0,!0,void 0,this))},void 0,!1,void 0,this):G0(j2,{flexDirection:"row",gap:1,children:[U&&G0(g$,{children:[G0(T0,{color:"gray",children:[" ",U]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C,I&&G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),W&&G0(g$,{children:[G0(T0,{color:W.status==="active"?"green":W.status==="verifying"?"cyan":W.status==="blocked"||W.status==="budget_limited"?"yellow":"gray",children:["goal:",W.status," ",W.objective.slice(0,32),W.prematureStop?` recovery:${W.prematureStop.consecutiveCount}`:"",W.verificationStall?` verify-gap:${W.verificationStall.consecutiveCount}`:"",W.frontierStall?` frontier:${W.frontierStall.category}:${W.frontierStall.consecutiveCount}`:""]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(j2,{flexDirection:"row",gap:1,children:!$?G0(T0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):G0(g$,{children:[M&&G0(g$,{children:[O?G0(T0,{color:"cyan",children:["Effort ",z]},void 0,!0,void 0,this):G0(T0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&G0(g$,{children:[G0(T0,{color:_==="fast"?"yellow":"gray",children:["Speed ",_]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F!=="auto"&&G0(g$,{children:[G0(T0,{color:"gray",children:["Output ",F]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H!=="auto"&&G0(g$,{children:[G0(T0,{color:"gray",children:["Style ",H]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q&&G0(T0,{color:"gray",children:q.model},void 0,!1,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G?G0(T0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):G0(T0,{color:K<20?"red":K<50?"yellow":"gray",children:[K,"%"]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{color:b===void 0?"gray":"cyan",children:["Cache ",G3(b)]},void 0,!0,void 0,this),N>0.001&&G0(g$,{children:[G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{color:"green",children:["$",N<0.01?N.toFixed(4):N.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),R.length>0&&G0(g$,{children:[G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{color:"yellow",children:["已排队 ",R.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),P>0&&G0(g$,{children:[G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{color:"cyan",children:["已恢复 ",P," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D.length>0&&G0(g$,{children:[G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{color:"cyan",children:["New tasks ",D.length," · /resume"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w==="error"&&G0(g$,{children:[G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{color:"yellow",children:"Task sync unavailable"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&G0(g$,{children:[G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{color:"yellow",children:"再按一次 Ctrl+C 退出"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as yJ,Text as IJ}from"ink";import UQ from"react";import{jsxDEV as E2}from"react/jsx-dev-runtime";var K3=UQ.memo(({suggestions:$,selectedIndex:J,visible:Z,maxDisplay:Y=8})=>{if(!Z||$.length===0)return null;let X=0,Q=Math.min(Y,$.length),U=J>=$.length;if(J>=Y&&!U)X=J-Y+1,Q=J+1;let q=$.slice(X,Q),K=$.length>Y;return E2(yJ,{flexDirection:"column",paddingX:2,paddingY:0,children:[q.map((G,O)=>{let _=X+O===J;return E2(yJ,{flexDirection:"row",paddingX:1,gap:2,children:[E2(IJ,{color:_?"cyan":"white",bold:_,children:G.command},void 0,!1,void 0,this),E2(IJ,{color:_?"cyan":"gray",dimColor:!_,children:["- ",G.description]},void 0,!0,void 0,this)]},G.command,!0,void 0,this)}),K&&E2(yJ,{paddingX:1,children:E2(IJ,{color:U?"cyan":"gray",bold:U,dimColor:!U,children:["... and ",$.length-Y," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as a$,Text as z1,useStdout as QU}from"ink";import UU from"ink-select-input";import sJ,{useMemo as x3}from"react";import{Box as S0,Text as x0}from"ink";import X2,{useEffect as nJ,useMemo as Z2,useRef as g3}from"react";import{Box as pJ,Text as P3}from"ink";import AQ from"react";import{Text as e$}from"ink";import LQ from"react";import B3 from"string-width";import q8 from"string-width";function SJ({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 GQ=SJ();function kJ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(GQ,"")}var z3=($=0)=>(J)=>`\x1B[${J+$}m`,O3=($=0)=>(J)=>`\x1B[${38+$};5;${J}m`,_3=($=0)=>(J,Z,Y)=>`\x1B[${38+$};2;${J};${Z};${Y}m`,G$={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]}},c_=Object.keys(G$.modifier),qQ=Object.keys(G$.color),KQ=Object.keys(G$.bgColor),d_=[...qQ,...KQ];function zQ(){let $=new Map;for(let[J,Z]of Object.entries(G$)){for(let[Y,X]of Object.entries(Z))G$[Y]={open:`\x1B[${X[0]}m`,close:`\x1B[${X[1]}m`},Z[Y]=G$[Y],$.set(X[0],X[1]);Object.defineProperty(G$,J,{value:Z,enumerable:!1})}return Object.defineProperty(G$,"codes",{value:$,enumerable:!1}),G$.color.close="\x1B[39m",G$.bgColor.close="\x1B[49m",G$.color.ansi=z3(),G$.color.ansi256=O3(),G$.color.ansi16m=_3(),G$.bgColor.ansi=z3(10),G$.bgColor.ansi256=O3(10),G$.bgColor.ansi16m=_3(10),Object.defineProperties(G$,{rgbToAnsi256:{value(J,Z,Y){if(J===Z&&Z===Y){if(J<8)return 16;if(J>248)return 231;return Math.round((J-8)/247*24)+232}return 16+36*Math.round(J/255*5)+6*Math.round(Z/255*5)+Math.round(Y/255*5)},enumerable:!1},hexToRgb:{value(J){let Z=/[a-f\d]{6}|[a-f\d]{3}/i.exec(J.toString(16));if(!Z)return[0,0,0];let[Y]=Z;if(Y.length===3)Y=[...Y].map((Q)=>Q+Q).join("");let X=Number.parseInt(Y,16);return[X>>16&255,X>>8&255,X&255]},enumerable:!1},hexToAnsi256:{value:(J)=>G$.rgbToAnsi256(...G$.hexToRgb(J)),enumerable:!1},ansi256ToAnsi:{value(J){if(J<8)return 30+J;if(J<16)return 90+(J-8);let Z,Y,X;if(J>=232)Z=((J-232)*10+8)/255,Y=Z,X=Z;else{J-=16;let q=J%36;Z=Math.floor(J/36)/5,Y=Math.floor(q/6)/5,X=q%6/5}let Q=Math.max(Z,Y,X)*2;if(Q===0)return 30;let U=30+(Math.round(X)<<2|Math.round(Y)<<1|Math.round(Z));if(Q===2)U+=60;return U},enumerable:!1},rgbToAnsi:{value:(J,Z,Y)=>G$.ansi256ToAnsi(G$.rgbToAnsi256(J,Z,Y)),enumerable:!1},hexToAnsi:{value:(J)=>G$.ansi256ToAnsi(G$.hexToAnsi256(J)),enumerable:!1}}),G$}var OQ=zQ(),N3=OQ;var w4=new Set(["\x1B",""]),_Q=39,VJ="\x07",F3="[",NQ="]",L3="m",B4=`${NQ}8;;`,W3=($)=>`${w4.values().next().value}${F3}${$}${L3}`,H3=($)=>`${w4.values().next().value}${B4}${$}${VJ}`,WQ=($)=>$.split(" ").map((J)=>q8(J)),DJ=($,J,Z)=>{let Y=[...J],X=!1,Q=!1,U=q8(kJ($.at(-1)));for(let[q,K]of Y.entries()){let G=q8(K);if(U+G<=Z)$[$.length-1]+=K;else $.push(K),U=0;if(w4.has(K))X=!0,Q=Y.slice(q+1,q+1+B4.length).join("")===B4;if(X){if(Q){if(K===VJ)X=!1,Q=!1}else if(K===L3)X=!1;continue}if(U+=G,U===Z&&q<Y.length-1)$.push(""),U=0}if(!U&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},HQ=($)=>{let J=$.split(" "),Z=J.length;while(Z>0){if(q8(J[Z-1])>0)break;Z--}if(Z===J.length)return $;return J.slice(0,Z).join(" ")+J.slice(Z).join("")},FQ=($,J,Z={})=>{if(Z.trim!==!1&&$.trim()==="")return"";let Y="",X,Q,U=WQ($),q=[""];for(let[z,_]of $.split(" ").entries()){if(Z.trim!==!1)q[q.length-1]=q.at(-1).trimStart();let F=q8(q.at(-1));if(z!==0){if(F>=J&&(Z.wordWrap===!1||Z.trim===!1))q.push(""),F=0;if(F>0||Z.trim===!1)q[q.length-1]+=" ",F++}if(Z.hard&&U[z]>J){let H=J-F,N=1+Math.floor((U[z]-H-1)/J);if(Math.floor((U[z]-1)/J)<N)q.push("");DJ(q,_,J);continue}if(F+U[z]>J&&F>0&&U[z]>0){if(Z.wordWrap===!1&&F<J){DJ(q,_,J);continue}q.push("")}if(F+U[z]>J&&Z.wordWrap===!1){DJ(q,_,J);continue}q[q.length-1]+=_}if(Z.trim!==!1)q=q.map((z)=>HQ(z));let K=q.join(`
|
|
124
|
+
`),G=[...K],O=0;for(let[z,_]of G.entries()){if(Y+=_,w4.has(_)){let{groups:H}=new RegExp(`(?:\\${F3}(?<code>\\d+)m|\\${B4}(?<uri>.*)${VJ})`).exec(K.slice(O))||{groups:{}};if(H.code!==void 0){let N=Number.parseFloat(H.code);X=N===_Q?void 0:N}else if(H.uri!==void 0)Q=H.uri.length===0?void 0:H.uri}let F=N3.codes.get(Number(X));if(G[z+1]===`
|
|
125
|
+
`){if(Q)Y+=H3("");if(X&&F)Y+=W3(F)}else if(_===`
|
|
126
|
+
`){if(X&&F)Y+=W3(X);if(Q)Y+=H3(Q)}O+=_.length}return Y};function fJ($,J,Z){return String($).normalize().replaceAll(`\r
|
|
127
|
+
`,`
|
|
128
|
+
`).split(`
|
|
129
|
+
`).map((Y)=>FQ(Y,J,Z)).join(`
|
|
130
|
+
`)}var vJ=($)=>{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 B3(J)};var w3=($)=>{return/[*_~`<[\]https?:]/.test($)},jJ=($)=>{let Z=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((Y)=>Y.length>0);if(Z.length===0)return 0;return Math.max(...Z.map((Y)=>B3(Y)))},h2=($,J,Z=!1)=>{if(J<=0)return[$];let Y=$.trimEnd(),Q=fJ(Y,J,{hard:Z,trim:!1,wordWrap:!0}).split(`
|
|
131
|
+
`).filter((U)=>U.length>0);return Q.length>0?Q:[""]},A3=($,J,Z,Y)=>{let X=Math.max(0,Z-J);if(Y==="center"){let Q=Math.floor(X/2);return" ".repeat(Q)+$+" ".repeat(X-Q)}if(Y==="right")return" ".repeat(X)+$;return $+" ".repeat(X)};import{jsxDEV as r$,Fragment as wQ}from"react/jsx-dev-runtime";var EJ=2,hJ=1,gJ=2;function mJ($,J){return`inline-${$}-${J}`}var BQ=({text:$})=>{let J=V0();if(!w3($))return r$(e$,{children:$},void 0,!1,void 0,this);let Z=[],Y=0,X=0,Q=0,U=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,q;while((q=U.exec($))!==null){if(q.index>Y){let z=$.slice(Y,q.index);Z.push(r$(e$,{children:z},mJ("text",X++),!1,void 0,this))}let K=q[0],G=null,O=mJ("match",Q++);try{if(K.startsWith("**")&&K.endsWith("**")&&K.length>EJ*2)G=r$(e$,{bold:!0,children:K.slice(EJ,-EJ)},O,!1,void 0,this);else if(K.length>hJ*2&&(K.startsWith("*")&&K.endsWith("*")||K.startsWith("_")&&K.endsWith("_"))){let z=$.substring(q.index-1,q.index),_=$.substring(U.lastIndex,U.lastIndex+1);if(!(/\w/.test(z)||/\w/.test(_)||/[./\\]/.test(z+_)))G=r$(e$,{italic:!0,children:K.slice(hJ,-hJ)},O,!1,void 0,this)}else if(K.startsWith("~~")&&K.endsWith("~~")&&K.length>gJ*2)G=r$(e$,{strikethrough:!0,children:K.slice(gJ,-gJ)},O,!1,void 0,this);else if(K.startsWith("`")&&K.endsWith("`")){let z=K.match(/^(`+)([^`]+)\1$/);if(z&&z[2])G=r$(e$,{color:J.colors.syntax.keyword,backgroundColor:J.colors.background.secondary,bold:!0,children:` ${z[2]} `},O,!1,void 0,this)}else if(K.startsWith("[")&&K.includes("](")&&K.endsWith(")")){let z=K.match(/\[(.*?)\]\((.*?)\)/);if(z){let _=z[1],F=z[2];G=r$(e$,{children:[_,r$(e$,{color:J.colors.info,children:[" (",F,")"]},void 0,!0,void 0,this)]},O,!0,void 0,this)}}else if(K.match(/^https?:\/\//))G=r$(e$,{color:J.colors.info,children:K},O,!1,void 0,this)}catch(z){console.error("InlineRenderer 解析错误:",K,z),G=null}Z.push(G??r$(e$,{children:K},O,!1,void 0,this)),Y=U.lastIndex}if(Y<$.length){let K=$.slice(Y);Z.push(r$(e$,{children:K},mJ("text",X++),!1,void 0,this))}return r$(wQ,{children:Z.filter((K)=>K!==null)},void 0,!1,void 0,this)},$1=LQ.memo(BQ);import{jsxDEV as g2}from"react/jsx-dev-runtime";var PQ="▎",b3=AQ.memo(({lines:$,level:J})=>{let Z=V0(),Y=PQ.repeat(J);return g2(pJ,{flexDirection:"column",children:$.map((X,Q)=>{if(X.trim()==="")return g2(pJ,{height:1},Q,!1,void 0,this);return g2(pJ,{flexDirection:"row",children:[g2(P3,{dimColor:!0,color:Z.colors.text.muted,children:[Y," "]},void 0,!0,void 0,this),g2(P3,{italic:!0,wrap:"wrap",children:g2($1,{text:X},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},Q,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as P4,Text as P1}from"ink";import{isPlainObject as dJ}from"lodash-es";import{common as DQ,createLowlight as VQ}from"lowlight";import{LRUCache as fQ}from"lru-cache";import S3 from"react";import{Box as A4,Text as K8}from"ink";import A1,{Fragment as y3}from"react";import{LRUCache as R3}from"lru-cache";import bQ from"string-width";var MQ=1024,TQ=1048576,M3=1000,T3=new R3({max:MQ,maxSize:TQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+$.length*8)});function xJ($){let J=!0;for(let Y=0;Y<$.length;Y++)if($.charCodeAt(Y)>127){J=!1;break}if(J)return $.split("");if($.length<=M3){let Y=T3.get($);if(Y)return Y}let Z=Array.from($);if($.length<=M3)T3.set($,Z);return Z}var CQ=2048,RQ=524288,yQ=4096,C3=new R3({max:CQ,maxSize:RQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+8)});function w1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let J=C3.get($);if(J!==void 0)return J;let Z=bQ($);if($.length<=yQ)C3.set($,Z);return Z}import{jsxDEV as m2}from"react/jsx-dev-runtime";var uJ=2,I3=A1.memo(({children:$,maxWidth:J,maxHeight:Z,overflowDirection:Y="top",additionalHiddenLinesCount:X=0})=>{let Q=V0(),U=[],q=Math.max(Math.round(Z??Number.MAX_SAFE_INTEGER),uJ);function K(N){if(!A1.isValidElement(N))return;if(N.type===y3){A1.Children.forEach(N.props.children,K);return}if(N.type===A4){SQ(N,J,U);return}}A1.Children.forEach($,K);let O=U.length>q||X>0?q-1:q,z=O!==void 0?Math.max(0,U.length-O):0,_=z+X,H=(z>0?Y==="top"?U.slice(z):U.slice(0,O):U).map((N,b)=>m2(A4,{children:N.length>0?N.map((R,P)=>m2(K8,{...R.props,children:R.text},P,!1,void 0,this)):m2(K8,{children:" "},void 0,!1,void 0,this)},b,!1,void 0,this));return m2(A4,{flexDirection:"column",width:J,flexShrink:0,children:[_>0&&Y==="top"&&m2(K8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",_," line",_===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),H,_>0&&Y==="bottom"&&m2(K8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",_," line",_===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function IQ($){if(!A1.isValidElement($)||$.type!==A4)return{noWrapSegments:[],segments:[]};let J={noWrapSegments:[],segments:[]},Z=!1;function Y(X,Q){if(X===null||X===void 0)return;if(typeof X==="string"||typeof X==="number"){let G=String(X);if(!G)return;let O={text:G,props:Q??{}};if(Q===void 0||Q.wrap==="wrap")Z=!0,J.segments.push(O);else if(!Z)J.noWrapSegments.push(O);else J.segments.push(O);return}if(!A1.isValidElement(X))return;if(X.type===y3){A1.Children.forEach(X.props.children,(G)=>Y(G,Q));return}if(X.type!==K8)return;let{children:U,...q}=X.props,K=Q===void 0?q:{...Q,...q};A1.Children.forEach(U,(G)=>Y(G,K))}return A1.Children.forEach($.props.children,(X)=>Y(X,void 0)),J}function SQ($,J,Z){let Y=IQ($);if(Y.segments.length===0&&Y.noWrapSegments.length===0){Z.push([]);return}let X=0;for(let z of Y.noWrapSegments)X+=w1(z.text);if(Y.segments.length===0){let z=[],_=[];for(let F of Y.noWrapSegments){let H=F.text.split(`
|
|
132
|
+
`);for(let N=0;N<H.length;N++){if(N>0)z.push(_),_=[];if(H[N])_.push({text:H[N],props:F.props})}}if(_.length>0)z.push(_);for(let F of z)Z.push(F);return}let Q=J-X;if(Q<1){kQ(Y.noWrapSegments,J,Z);return}let U=[],q=[],K=0;function G(){if(U.length===0)U.push([...Y.noWrapSegments,...q]);else if(X>0)U.push([{text:" ".repeat(X),props:{}},...q]);else U.push(q);q=[],K=0}function O(z,_){if(q.length>0&&q[q.length-1].props===_)q[q.length-1].text+=z;else q.push({text:z,props:_})}for(let z of Y.segments){let _=z.text.split(`
|
|
133
|
+
`);for(let F=0;F<_.length;F++){if(F>0)G();let N=_[F].split(/(\s+)/);for(let b of N){if(!b)continue;let R=w1(b);if(K+R>Q&&K>0){if(G(),/^\s+$/.test(b))continue}if(R>Q){let w=xJ(b);while(w.length>0){let D=0,B=0;for(let W of w){let L=w1(W);if(K+B+L>Q)break;B+=L,D++}if(D>0){let W=w.slice(0,D).join("");O(W,z.props),K+=w1(W),w=w.slice(D)}if(w.length>0)G()}}else O(b,z.props),K+=R}}if(z.text.endsWith(`
|
|
134
|
+
`))G()}if(q.length>0)G();for(let z of U)Z.push(z)}function kQ($,J,Z){let Y=[],X=[],Q=0;for(let U of $){let q=U.text.split(`
|
|
135
|
+
`);for(let K=0;K<q.length;K++){if(K>0)Y.push(X),X=[],Q=0;let G=q[K];if(!G)continue;let O=w1(G),z=Math.max(0,J-w1("…"));if(O<=z&&Q===0)X.push({text:G,props:U.props}),Q+=O;else{let _=xJ(G),F=Q,H=0;for(let b of _){let R=w1(b);if(F+R>z)break;F+=R,H++}let N=_.slice(0,H).join("");if(N)X.push({text:N,props:U.props});X.push({text:"…",props:{}}),Q=F+w1("…")}}}if(X.length>0)Y.push(X);if(Y.length===0)Y.push([{text:"…",props:{}}]);for(let U of Y)Z.push(U)}import{jsxDEV as V$}from"react/jsx-dev-runtime";var cJ=VQ(DQ),vQ=200,jQ=524288,EQ=4096,k3=new fQ({max:vQ,maxSize:jQ,sizeCalculation:($)=>$.retainedChars});function D3($,J){return`${J??"__auto__"}\x00${$}`}function hQ($,J){return k3.get(D3($,J))?.root}function gQ($,J,Z){if($.length>EQ)return;let Y=J?.length??0;k3.set(D3($,J),{root:Z,retainedChars:Math.max(1,$.length*2+Y)})}function mQ($){return dJ($)&&$.type==="text"&&typeof $.value==="string"}function pQ($){return dJ($)&&$.type==="element"}function xQ($){return dJ($)&&$.type==="root"&&Array.isArray($.children)}function b4($,J,Z=0){if(mQ($))return V$(P1,{wrap:"wrap",children:$.value},Z,!1,void 0,this);if(pQ($)){let Y=$.properties?.className?.[0]||"",X=J.default;if(Y.includes("comment"))X=J.comment;else if(Y.includes("string"))X=J.string;else if(Y.includes("number"))X=J.number;else if(Y.includes("keyword"))X=J.keyword;else if(Y.includes("function"))X=J.function;else if(Y.includes("variable"))X=J.variable;else if(Y.includes("operator"))X=J.operator;else if(Y.includes("type"))X=J.type;else if(Y.includes("tag"))X=J.tag;else if(Y.includes("attr"))X=J.attr;let Q=$.children?.map((U,q)=>b4(U,J,q));return V$(P1,{color:X,wrap:"wrap",children:Q},Z,!1,void 0,this)}if(xQ($))return V$(S3.Fragment,{children:$.children.map((Y,X)=>b4(Y,J,X))},Z,!1,void 0,this);return V$(P1,{},Z,!1,void 0,this)}function uQ($,J,Z){let Y=Z||B$.getTheme().colors.syntax;try{let X=hQ($,J);if(X)return b4(X,Y);let Q;if(!J||!cJ.registered(J))Q=cJ.highlightAuto($);else Q=cJ.highlight(J,$);let U=Q;if(!U.children||U.children.length===0)return V$(P1,{color:Y.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return gQ($,J,Q),b4(Q,Y)}catch(X){return V$(P1,{color:Y.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var M4=S3.memo(({content:$,language:J,showLineNumbers:Z=!0,terminalWidth:Y,availableHeight:X})=>{let Q=V0(),U=$.split(`
|
|
136
|
+
`),q=0;if(X&&U.length>X){let z=Math.max(X,uJ);if(U.length>z)q=U.length-z,U=U.slice(q)}let K=U.length+q,G=String(K).length+1,O=Math.max(20,Y-4);return V$(P4,{borderStyle:"round",borderColor:Q.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[J&&V$(P4,{marginBottom:0,children:V$(P1,{color:Q.colors.text.secondary,children:J},void 0,!1,void 0,this)},void 0,!1,void 0,this),q>0&&V$(P4,{marginBottom:0,children:V$(P1,{color:Q.colors.text.muted,dimColor:!0,children:["... ",q," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),V$(I3,{maxWidth:O,maxHeight:X,children:U.map((z,_)=>{let F=_+q+1;return V$(P4,{flexDirection:"row",children:[Z&&V$(P1,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(F).padStart(G-1," ")," "]},void 0,!0,void 0,this),z.trim()===""?V$(P1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):uQ(z,J,Q.colors.syntax)]},_,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as V3,Text as m$}from"ink";import cQ,{useState as dQ}from"react";import{jsxDEV as f$}from"react/jsx-dev-runtime";var f3=400;function lQ($){let J=$.split(`
|
|
137
|
+
`),Z=[],Y=0,X=0;for(let Q of J){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let U=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(U)Y=parseInt(U[1],10),X=parseInt(U[3],10);Z.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Z.push({type:"remove",content:Q.substring(1),lineNumber:Y}),Y++;continue}if(Q.startsWith("+")){Z.push({type:"add",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith(" ")||Q===""){Z.push({type:"context",content:Q.substring(1),lineNumber:X}),Y++,X++;continue}}return Z}var lJ=cQ.memo(({patch:$,startLine:J,matchLine:Z,terminalWidth:Y,maxLines:X=20,isFocused:Q=!1})=>{let U=V0(),q=lQ($),[K,G]=dQ(!1);F0((P)=>{if(P.toLowerCase()==="e")G((w)=>!w)},{isActive:Q&&q.length>X});let z=Math.max(...q.map((P)=>P.lineNumber||0)).toString().length+1,_=q.filter((P)=>P.type==="add").length,F=q.filter((P)=>P.type==="remove").length,H=q.length,N=H>X,b;if(!N)b=q;else if(K)b=q.slice(0,f3);else b=q.slice(0,X);let R=H-b.length;return f$(V3,{flexDirection:"column",marginTop:1,marginBottom:1,children:[f$(m$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this),N&&f$(m$,{color:U.colors.info,children:[K?`已展开 ${b.length}/${H} 行`:`显示前 ${X} 行,共 ${H} 行`," · ",f$(m$,{color:U.colors.success,children:["+",_]},void 0,!0,void 0,this)," ",f$(m$,{color:U.colors.error,children:["-",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N&&f$(m$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this),b.map((P,w)=>{if(P.type==="header")return f$(m$,{color:U.colors.muted,dimColor:!0,children:P.content},w,!1,void 0,this);let D=P.lineNumber?P.lineNumber.toString().padStart(z," "):" ".repeat(z),B=" ",W,L;if(P.type==="add")B="+",L=U.colors.success,W=void 0;else if(P.type==="remove")B="-",L=U.colors.error,W=void 0;else L=U.colors.text.primary;let M=Math.max(0,Y-z-2),V=P.content;if(V.length>M)V=V.substring(0,M-3)+"...";return f$(m$,{color:L,backgroundColor:W,children:[f$(m$,{dimColor:!0,children:D},void 0,!1,void 0,this),f$(m$,{children:B},void 0,!1,void 0,this),f$(m$,{children:[" ",V]},void 0,!0,void 0,this)]},w,!0,void 0,this)}),N&&f$(V3,{marginTop:1,children:K?f$(m$,{color:U.colors.info,dimColor:!0,children:[R>0?`已达显示上限 ${f3} 行,仍有 ${R} 行未显示`:"已显示全部内容",Q?" · 按 E 折叠":""]},void 0,!0,void 0,this):f$(m$,{color:U.colors.info,dimColor:!0,children:["已隐藏剩余 ",R," 行",Q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),f$(m$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as rJ,Text as v3}from"ink";import rQ from"react";import{jsxDEV as p2}from"react/jsx-dev-runtime";var aQ=({itemText:$,type:J,marker:Z,leadingWhitespace:Y=""})=>{let X=J==="ol"?`${Z}. `:`${Z} `,Q=X.length,U=Y.length;return p2(rJ,{paddingLeft:U+1,flexDirection:"row",children:[p2(rJ,{width:Q,children:p2(v3,{children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),p2(rJ,{flexGrow:1,children:p2(v3,{wrap:"wrap",children:p2($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},aJ=rQ.memo(aQ);import{Text as iJ}from"ink";import iQ,{useMemo as oQ}from"react";import j3 from"string-width";import{jsxDEV as oJ}from"react/jsx-dev-runtime";var E3=4,x2=3,nQ=4,h3=iQ.memo(({headers:$,rows:J,terminalWidth:Z})=>{let Y=V0(),X=oQ(()=>{if($.length===0||J.length===0)return null;let z=$.length,_=$.map((L,M)=>{let V=Math.max(jJ(L),x2);for(let C of J)V=Math.max(V,jJ(C[M]||""));return V}),F=$.map((L,M)=>{let V=Math.max(vJ(L),x2);for(let C of J)V=Math.max(V,vJ(C[M]||""));return V}),H=1+z*3,N=Math.max(Z-H-E3,z*x2),b=_.reduce((L,M)=>L+M,0),R=F.reduce((L,M)=>L+M,0),P=!1,w;if(R<=N)w=F;else if(b<=N){let L=N-b,M=F.map((C,I)=>C-_[I]),V=M.reduce((C,I)=>C+I,0);w=_.map((C,I)=>{if(V===0)return C;let A=Math.floor(M[I]/V*L);return C+A})}else{P=!0;let L=N/b;w=_.map((M)=>Math.max(Math.floor(M*L),x2))}function D(){let L=1;for(let M=0;M<$.length;M++){let V=h2($[M],w[M],P);L=Math.max(L,V.length)}for(let M of J)for(let V=0;V<M.length;V++){let C=h2(M[V]||"",w[V],P);L=Math.max(L,C.length)}return L}if(D()>nQ)return{type:"vertical",columnWidths:w,needsHardWrap:P};return{type:"horizontal",columnWidths:w,needsHardWrap:P}},[$,J,Z]);if(!X)return null;if(X.type==="vertical"){let z=Math.min(Z-1,40),_="─".repeat(z);return oJ(iJ,{children:J.map((F,H)=>{let N=[];if(H>0)N.push(_);return F.forEach((b,R)=>{let P=$[R]||`Column ${R+1}`,w=(b||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${P}:\x1B[22m ${w}`)}),N.join(`
|
|
138
|
+
`)}).join(`
|
|
139
|
+
`)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:U}=X;function q(z){let F={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[z],H=F.left;return Q.forEach((N,b)=>{H+=F.h.repeat(N+2),H+=b<Q.length-1?F.mid:F.right}),H}function K(z,_){let F=z.map((R,P)=>{let w=Q[P]||x2;return h2(R||"",w,U)}),H=Math.max(...F.map((R)=>R.length),1),N=F.map((R)=>Math.floor((H-R.length)/2)),b=[];for(let R=0;R<H;R++){let P="│";for(let w=0;w<z.length;w++){let D=F[w],B=N[w],W=R-B,L=W>=0&&W<D.length?D[W]:"",M=Q[w]||x2,V=j3(L),C=A3(_?`\x1B[1m${L}\x1B[22m`:L,V,M,_?"center":"left");P+=` ${C} │`}b.push(P)}return b}let G=[];if(G.push(q("top")),G.push(...K($,!0)),G.push(q("middle")),J.forEach((z,_)=>{if(G.push(...K(z,!1)),_<J.length-1)G.push(q("middle"))}),G.push(q("bottom")),Math.max(...G.map((z)=>j3(z)))>Z-E3){let z=Math.min(Z-1,40),_="─".repeat(z);return oJ(iJ,{children:J.map((F,H)=>{let N=[];if(H>0)N.push(_);return F.forEach((b,R)=>{let P=$[R]||`Column ${R+1}`,w=(b||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${P}:\x1B[22m ${w}`)}),N.join(`
|
|
140
|
+
`)}).join(`
|
|
141
|
+
`)},void 0,!1,void 0,this)}return oJ(iJ,{color:Y.colors.text.primary,children:G.join(`
|
|
142
|
+
`)},void 0,!1,void 0,this)});import{jsxDEV as c}from"react/jsx-dev-runtime";var tQ=($,J,Z)=>{switch($){case"user":return{color:J.info,prefix:"> "};case"assistant":return{color:J.success,prefix:"• "};case"system":return{color:J.warning,prefix:" "};case"tool":{let Y=Z&&"phase"in Z?Z.phase:void 0;return{color:J.text.secondary,prefix:Y==="start"?"• ":Y==="complete"?" └ ":" "}}default:return{color:J.text.primary,prefix:" "}}},sQ=X2.memo(({content:$,language:J,terminalWidth:Z,isPending:Y=!1,availableHeight:X})=>{let Q=V0();if(Y&&X!==void 0){let U=$.split(`
|
|
143
|
+
`),q=4,K=Math.max(1,X-4);if(U.length>K){let G=U.slice(0,K).join(`
|
|
144
|
+
`);return c(S0,{flexDirection:"column",flexShrink:0,children:[c(M4,{content:G,language:J,showLineNumbers:!0,terminalWidth:Z},void 0,!1,void 0,this),c(x0,{color:Q.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return c(M4,{content:$,language:J,showLineNumbers:!0,terminalWidth:Z},void 0,!1,void 0,this)}),eQ=X2.memo(({content:$,level:J})=>{let Z=V0();switch(J){case 1:return c(x0,{bold:!0,color:Z.colors.primary,children:c($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return c(x0,{bold:!0,color:Z.colors.primary,children:c($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return c(x0,{bold:!0,color:Z.colors.text.primary,children:c($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return c(x0,{italic:!0,color:Z.colors.text.muted,children:c($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return c(x0,{children:c($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),$U=X2.memo(({terminalWidth:$})=>{let J=V0(),Z=Math.max(0,Math.min($-4,80));return c(x0,{dimColor:!0,color:J.colors.text.muted,children:"─".repeat(Z)},void 0,!1,void 0,this)}),JU=X2.memo(({content:$})=>{return c(x0,{wrap:"wrap",children:c($1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),YU=X2.memo(({content:$})=>{let J=V0();return c(S0,{flexDirection:"row",gap:1,children:[c(x0,{color:J.colors.info,children:" "},void 0,!1,void 0,this),c(x0,{color:J.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),ZU=X2.memo(({detail:$,terminalWidth:J})=>{let Z=V0(),Y=50,X=$.split(`
|
|
145
|
+
`);while(X.length>0&&X[0].trim()==="")X.shift();while(X.length>0&&X[X.length-1].trim()==="")X.pop();let Q=X.length>50,U=Q?X.slice(0,50):X,q=U.join(`
|
|
146
|
+
`),K=q.includes("<<<DIFF>>>"),G=q.includes("```");if(K){let O=q.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(O)try{let z=JSON.parse(O[1]);return c(S0,{flexDirection:"column",children:[c(lJ,{patch:z.patch,startLine:z.startLine,matchLine:z.matchLine,terminalWidth:J},void 0,!1,void 0,this),Q&&c(S0,{marginTop:1,children:c(x0,{dimColor:!0,color:Z.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(G){let O=q.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(O){let z=O[1]||"text",_=O[2];return c(S0,{flexDirection:"column",children:[c(M4,{content:_,language:z,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&c(S0,{marginTop:1,children:c(x0,{dimColor:!0,color:Z.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return c(S0,{flexDirection:"column",children:[U.map((O,z)=>c(x0,{color:Z.colors.text.primary,children:O},z,!1,void 0,this)),Q&&c(S0,{marginTop:1,children:c(x0,{dimColor:!0,color:Z.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function XU($,J,Z,Y=80){if(!Z||J===void 0||J<=0)return{content:$,isTruncated:!1,hiddenLines:0};let Q=Math.max(1,J-8),U=Math.max(40,Y*0.8),q=Q*U;if($.length<=q)return{content:$,isTruncated:!1,hiddenLines:0};let K=Math.floor(q*0.9),G=$.length-K,O=G,z=$.indexOf(`
|
|
147
|
+
`,G);if(z!==-1&&z-G<U)O=z+1;let _=$.slice(O),H=($.slice(0,O).match(/\n/g)||[]).length+1;return{content:_,isTruncated:!0,hiddenLines:H}}var K1=X2.memo(({content:$,role:J,terminalWidth:Z,metadata:Y,isPending:X=!1,availableTerminalHeight:Q,hidePrefix:U=!1,noMargin:q=!1,renderPlainTextOnly:K=!1,streamingLines:G,streamingHiddenLines:O,messageId:z,blocksOverride:_,currentLineOverride:F,streamingMode:H="text",renderCodeBlocksAsPlainText:N=!1})=>{let b=V0(),R=_!==void 0,P=Z2(()=>tQ(J,b.colors,Y),[J,b.colors,Y]),{color:w,prefix:D}=P,B=D.length+1,W=Z2(()=>{if(!Y||typeof Y!=="object")return null;if(!("subtaskRef"in Y))return null;let v=Y.subtaskRef;if(!v||typeof v!=="object")return null;return v},[Y]),L=J==="tool"&&Y?.phase==="start",M=!q&&!L,V=Z2(()=>{if(!K)return[];return $.split(/\r?\n/)},[$,K]);if(!R&&X){let v=G??$.split(/\r?\n/),g=O??0,e=!1,U0=!1,f=!1;if(H!=="text")e=H==="code",U0=H==="diff",f=H==="table";return c(S0,{flexDirection:"column",marginBottom:M?1:0,flexShrink:0,children:[g>0&&c(S0,{flexDirection:"row",flexShrink:0,children:[c(S0,{width:B,flexShrink:0},void 0,!1,void 0,this),c(x0,{color:b.colors.text.muted,dimColor:!0,children:["^ ",g," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),v.map((X0,$0)=>{if(H==="text"){if(X0.match(m1.codeBlock))e=!e;else if(X0.match(m1.diffStart))U0=!0;else if(X0.match(m1.diffEnd))U0=!1;else if(X0.match(m1.table))f=!0;else if(f&&!X0.match(m1.table))f=!1}let T=H==="text"&&!e&&!U0&&!f,y=T?X0.match(m1.ulItem):null,j=T?X0.match(m1.olItem):null,x=y??j;return c(S0,{flexDirection:"row",flexShrink:0,children:[$0===0&&!U?c(S0,{marginRight:1,flexShrink:0,children:c(x0,{color:w,bold:!0,children:D},void 0,!1,void 0,this)},void 0,!1,void 0,this):c(S0,{width:B,flexShrink:0},void 0,!1,void 0,this),c(S0,{flexGrow:1,flexShrink:0,children:x?c(aJ,{type:y?"ul":"ol",marker:x[2],itemText:x[3],leadingWhitespace:x[1]},void 0,!1,void 0,this):c(x0,{wrap:"wrap",children:X0===""?" ":X0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},$0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!R&&K)return c(S0,{flexDirection:"column",marginBottom:M?1:0,flexShrink:0,children:V.map((v,g)=>c(S0,{flexDirection:"row",flexShrink:0,children:[g===0&&!U?c(S0,{marginRight:1,flexShrink:0,children:c(x0,{color:w,bold:!0,children:D},void 0,!1,void 0,this)},void 0,!1,void 0,this):c(S0,{width:B,flexShrink:0},void 0,!1,void 0,this),c(S0,{flexGrow:1,flexShrink:0,children:c(x0,{wrap:"wrap",children:v===""?" ":v},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},g,!0,void 0,this))},void 0,!1,void 0,this);let C=g3(null);nJ(()=>{C.current=null},[z]);let I=Z2(()=>{if(R)return null;if(!z)return null;return m3(z)},[z,R]);nJ(()=>{if(R)return;if(!I||!z)return;C.current={messageId:z,blocks:I}},[I,z,R]),nJ(()=>{if(R)return;if(!I||!z)return;p3(z)},[I,z,R]);let A=Z2(()=>R?{content:$,isTruncated:!1,hiddenLines:0}:XU($,Q,X,Z),[$,Q,X,Z,R]),{content:k,isTruncated:Y0,hiddenLines:r}=A;if(!R&&J==="tool"&&Y&&"detail"in Y){let v=Y;if(v.detail)return c(S0,{flexDirection:"column",marginBottom:q?0:1,children:[c(S0,{flexDirection:"row",children:[c(S0,{marginRight:1,children:c(x0,{color:w,bold:!0,children:D},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(x0,{color:w,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(S0,{marginLeft:D.length+1,children:c(ZU,{detail:v.detail,terminalWidth:Z-(D.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:p,currentLine:I0}=Z2(()=>{if(R)return{completedContent:"",currentLine:F??""};if(!X)return{completedContent:k,currentLine:""};let v=k.lastIndexOf(`
|
|
148
|
+
`);if(v===-1)return{completedContent:"",currentLine:k};return{completedContent:k.slice(0,v+1),currentLine:k.slice(v+1)}},[k,X,R,F]),n=g3({content:"",blocks:[]}),S=Z2(()=>{if(R)return _??[];if(I)return I;if(C.current&&C.current.messageId===z)return C.current.blocks;let v=n.current;if(!X||!p.startsWith(v.content)){let f=tJ(p);return n.current={content:p,blocks:f},f}if(p===v.content)return v.blocks;let g=p.slice(v.content.length),e=tJ(g),U0=[...v.blocks,...e];return n.current={content:p,blocks:U0},U0},[p,X,R,_]);return c(S0,{flexDirection:"column",marginBottom:M?1:0,flexShrink:0,children:[Y0&&c(S0,{flexDirection:"row",flexShrink:0,children:[c(S0,{width:B,flexShrink:0},void 0,!1,void 0,this),c(x0,{color:b.colors.text.muted,dimColor:!0,children:["^ ",r," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),S.map((v,g)=>{if(v.type==="empty")return c(S0,{height:1,flexShrink:0},g,!1,void 0,this);return c(S0,{flexDirection:"row",flexShrink:0,children:[g===0&&!U&&c(S0,{marginRight:1,flexShrink:0,children:c(x0,{color:w,bold:!0,children:D},void 0,!1,void 0,this)},void 0,!1,void 0,this),(g>0||U)&&c(S0,{width:B,flexShrink:0},void 0,!1,void 0,this),c(S0,{flexGrow:1,flexShrink:0,children:v.type==="code"?N?c(x0,{wrap:"wrap",children:v.content},void 0,!1,void 0,this):c(sQ,{content:v.content,language:v.language,terminalWidth:Z-B,isPending:X,availableHeight:Q},void 0,!1,void 0,this):v.type==="table"&&v.tableData?c(h3,{headers:v.tableData.headers,rows:v.tableData.rows,terminalWidth:Z-B},void 0,!1,void 0,this):v.type==="heading"?c(eQ,{content:v.content,level:v.level||1},void 0,!1,void 0,this):v.type==="list"?c(aJ,{type:v.listType||"ul",marker:v.marker||"-",itemText:v.content,leadingWhitespace:" ".repeat(v.indentation||0)},void 0,!1,void 0,this):v.type==="hr"?c($U,{terminalWidth:Z-B},void 0,!1,void 0,this):v.type==="diff"&&v.diffData?c(lJ,{patch:v.diffData.patch,startLine:v.diffData.startLine,matchLine:v.diffData.matchLine,terminalWidth:Z-B},void 0,!1,void 0,this):v.type==="command-message"?c(YU,{content:v.content},void 0,!1,void 0,this):v.type==="blockquote"&&v.blockquoteLines?c(b3,{lines:v.blockquoteLines,level:v.blockquoteLevel||1},void 0,!1,void 0,this):c(JU,{content:v.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},g,!0,void 0,this)}),I0&&c(S0,{flexDirection:"row",flexShrink:0,children:[S.length===0&&!U?c(S0,{marginRight:1,flexShrink:0,children:c(x0,{color:w,bold:!0,children:D},void 0,!1,void 0,this)},void 0,!1,void 0,this):c(S0,{width:B,flexShrink:0},void 0,!1,void 0,this),c(S0,{flexGrow:1,flexShrink:0,children:c(x0,{wrap:"wrap",children:I0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W&&c(S0,{flexDirection:"row",flexShrink:0,children:[c(S0,{width:B,flexShrink:0},void 0,!1,void 0,this),c(S0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[c(x0,{color:b.colors.text.muted,children:["Subtask"," ",typeof W.agentType==="string"?`@${W.agentType}`:"",typeof W.status==="string"?` · ${W.status}`:""]},void 0,!0,void 0,this),typeof W.summary==="string"&&W.summary.trim()!==""&&c(x0,{wrap:"wrap",children:W.summary},void 0,!1,void 0,this),typeof W.childSessionId==="string"&&c(x0,{color:b.colors.text.muted,children:["Session ",W.childSessionId]},void 0,!0,void 0,this),typeof W.resumedFrom==="string"&&c(x0,{color:b.colors.text.muted,children:["Resumed from ",W.resumedFrom,typeof W.resumeDepth==="number"?` · depth ${W.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 o0,Fragment as zU}from"react/jsx-dev-runtime";var GU=sJ.memo(({label:$,isSelected:J})=>o0(z1,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),qU=sJ.memo(({details:$,headerColor:J,isPlanModeExit:Z,isPlanModeEnter:Y,terminalWidth:X})=>o0(zU,{children:[o0(a$,{marginBottom:1,children:o0(z1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&o0(a$,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:J,padding:1,children:[o0(z1,{bold:!0,color:J,children:"实施方案"},void 0,!1,void 0,this),o0(a$,{marginTop:1,children:o0(K1,{content:$.planContent,role:"assistant",terminalWidth:X-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&o0(a$,{flexDirection:"column",marginBottom:1,children:o0(K1,{content:$.details,role:"assistant",terminalWidth:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&o0(a$,{flexDirection:"column",marginBottom:1,children:[o0(z1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,U)=>o0(a$,{marginLeft:2,children:o0(z1,{color:"red",children:["• ",Q]},void 0,!0,void 0,this)},U,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&o0(a$,{flexDirection:"column",marginBottom:1,children:[o0(z1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,U)=>o0(a$,{marginLeft:2,children:o0(z1,{children:["• ",Q]},void 0,!0,void 0,this)},U,!1,void 0,this)),$.affectedFiles.length>3&&o0(a$,{marginLeft:2,children:o0(z1,{color:"gray",children:["...还有 ",$.affectedFiles.length-3," 个文件"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this));function KU($,J,Z,Y){return`使用 ↑↓ 选择,回车确认 · ${J||Z||Y?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var u3=sJ.memo(({details:$,onResponse:J})=>{let{stdout:Z}=QU(),Y=Z.columns||80,Q=U$()==="confirmation-prompt",U=s0(!1),q=$.type==="exitPlanMode",K=$.type==="enterPlanMode",G=$.type==="maxTurnsExceeded",O=$.type==="mcpSampling";F0((F,H)=>{if(H.ctrl&&F==="c"||H.meta&&F==="c"){U();return}if(H.escape){J({approved:!1,reason:"用户取消"});return}let N=F.toLowerCase();if(q){if(N==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(N==="s"){J({approved:!0,targetMode:"default"});return}if(N==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(K){if(N==="y"){J({approved:!0});return}if(N==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(G){if(N==="y"){J({approved:!0});return}if(N==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(O){if(N==="y"){J({approved:!0,scope:"once"});return}if(N==="n"){J({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(N==="y"){J({approved:!0,scope:"once"});return}if(N==="s"){J({approved:!0,scope:"session"});return}if(N==="p"){J({approved:!0,scope:"project"});return}if(N==="n"){J({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let z=x3(()=>{if(q)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(K)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(G)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(O)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(本次会话)",value:{approved:!0,scope:"session"}},{key:"approve-project",label:"[P] 允许并记住(本项目)",value:{approved:!0,scope:"project"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[q,K,G,O]),_=x3(()=>{if(q)return{color:"cyan",title:"方案审核"};if(K)return{color:"magenta",title:"进入规划模式"};if(G)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[q,K,G,$.title]);return o0(a$,{flexDirection:"column",borderStyle:"round",borderColor:Q?_.color:"gray",padding:1,children:[o0(a$,{marginBottom:1,children:o0(z1,{bold:!0,color:_.color,children:_.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(qU,{details:$,headerColor:_.color,isPlanModeExit:q,isPlanModeEnter:K,terminalWidth:Y},void 0,!1,void 0,this),o0(a$,{flexDirection:"column",children:[o0(z1,{color:"gray",children:KU(q,K,G,O)},void 0,!1,void 0,this),o0(UU,{items:z,isFocused:Q,itemComponent:GU,onSelect:(F)=>{J(F.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as E0,Text as R0}from"ink";import c3 from"ink-text-input";import{useState as b1}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var z8=[{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"}],T4=[{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"}],C4=[{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"}],OU=[`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"],d3=({workspaceRoot:$,sessionId:J,onClose:Z,onSave:Y})=>{let X=B$.getTheme(),[Q,U]=b1("action"),[q,K]=b1(0),[G,O]=b1(0),[z,_]=b1(0),[F,H]=b1(""),[N,b]=b1(""),[R,P]=b1(null),[w,D]=b1(!1),[B,W]=b1(null),L=z8[q],M=C4[G],V=T4[z],C=()=>{if(B){W(null);return}switch(Q){case"action":Z();break;case"event":U("action");break;case"matcher":U("event");break;case"command":U("matcher");break;case"location":U("command");break;case"confirm":U("location");break}};F0((S,v)=>{if(v.escape){C();return}if(Q==="action"){if(v.upArrow)K((g)=>g>0?g-1:z8.length-1);else if(v.downArrow)K((g)=>g<z8.length-1?g+1:0);else if(v.return)I()}else if(Q==="event"){if(v.upArrow)O((g)=>g>0?g-1:C4.length-1);else if(v.downArrow)O((g)=>g<C4.length-1?g+1:0);else if(v.return)U("matcher")}else if(Q==="location"){if(v.upArrow)_((g)=>g>0?g-1:T4.length-1);else if(v.downArrow)_((g)=>g<T4.length-1?g+1:0);else if(v.return)U("confirm")}else if(Q==="confirm"){if(v.return)n()}});let I=()=>{let S=z8[q].action;if(S==="add")U("event");else if(S==="status")A();else if(S==="list")r();else if(S==="enable")E$.getInstance().enableSession(J,$),W("Hooks enabled for this session");else if(S==="disable")E$.getInstance().disableSession(J,$),W("Hooks disabled for this session");else if(S==="trust")k();else if(S==="revoke")Y0()},A=async()=>{let S=E$.getInstance(),v=S.isEnabled($,J),g=S.getConfig($),e=await S.getTrustStatus($),U0={};for(let X0 of Object.values(eJ)){let $0=g[X0];if($0&&Array.isArray($0)){let T=$0.reduce((y,j)=>y+(j.hooks?.length||0),0);if(T>0)U0[X0]=T}}let f=[`Status: ${v?"Enabled":"Disabled"}`,`Trust: ${e.state}`,`Digest: ${e.currentDigest??"none"}`,""];if(Object.keys(U0).length>0){f.push("Configured hooks:");for(let[X0,$0]of Object.entries(U0))f.push(` ${X0}: ${$0} hook(s)`)}else f.push("No hooks configured");W(f.join(`
|
|
149
|
+
`))},k=async()=>{try{let S=await E$.getInstance().trustProject($);W(`Trust: ${S.state}
|
|
150
|
+
Digest: ${S.currentDigest??"none"}`)}catch(S){P(S instanceof Error?S.message:"Failed to trust hooks")}},Y0=async()=>{try{let S=await E$.getInstance().revokeProjectTrust($);W(`Trust: ${S.state}`)}catch(S){P(S instanceof Error?S.message:"Failed to revoke hook trust")}},r=()=>{let v=E$.getInstance().getConfig($),g=[],e=!1;for(let U0 of Object.values(eJ)){let f=v[U0];if(!f||!Array.isArray(f)||f.length===0)continue;e=!0,g.push(`${U0}:`);for(let X0 of f){let $0=X0.matcher,T="all";if($0?.tools)T=`tools: ${Array.isArray($0.tools)?$0.tools.join(", "):$0.tools}`;g.push(` [${T}]`);for(let y of X0.hooks||[])if(y.type==="command")g.push(` -> ${y.command}`)}g.push("")}if(!e)g.push("No hooks configured"),g.push(""),g.push("Configure hooks in .blade/settings.local.json");W(g.join(`
|
|
151
|
+
`))},p=()=>{U("command")},I0=()=>{if(!N.trim()){P("Command cannot be empty");return}P(null),U("location")},n=async()=>{D(!0),P(null);try{let S=E$.getInstance(),v=await import("node:fs/promises"),g=await import("node:path"),e=await import("node:os"),U0={matcher:F.trim()?{tools:F.trim()}:{},hooks:[{type:"command",command:N.trim()}]},f;switch(V.location){case"local":f=g.join($,".blade","settings.local.json");break;case"project":f=g.join($,".blade","settings.json");break;case"user":f=g.join(e.homedir(),".blade","settings.json");break}await v.mkdir(g.dirname(f),{recursive:!0});let X0={};try{let j=await v.readFile(f,"utf-8");X0=JSON.parse(j)}catch{}let $0=X0.hooks||{},T=$0[M.event]||[],y={...$0,enabled:!0,[M.event]:[...T,U0]};if(X0.hooks=y,await v.writeFile(f,JSON.stringify(X0,null,2),"utf-8"),await S.reloadConfig($),Y)Y({event:M.event,matcher:F.trim(),command:N.trim()});Z()}catch(S){P(`Failed to save hook: ${S instanceof Error?S.message:"Unknown error"}`),D(!1)}};return i(E0,{flexDirection:"column",padding:1,children:[i(E0,{marginBottom:1,children:i(R0,{bold:!0,color:X.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(E0,{marginBottom:1,children:i(R0,{color:X.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),B&&i(E0,{flexDirection:"column",marginBottom:1,children:[i(R0,{children:B},void 0,!1,void 0,this),i(E0,{marginTop:1,children:i(R0,{color:X.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="action"&&!B&&i(E0,{flexDirection:"column",children:[i(E0,{flexDirection:"column",marginTop:1,children:z8.map((S,v)=>i(E0,{children:[i(R0,{color:v===q?X.colors.primary:void 0,bold:v===q,children:[v===q?"> ":" ",S.action]},void 0,!0,void 0,this),i(R0,{color:X.colors.muted,children:[" - ",S.description]},void 0,!0,void 0,this)]},S.action,!0,void 0,this))},void 0,!1,void 0,this),i(E0,{marginTop:1,children:i(R0,{color:X.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="event"&&i(E0,{flexDirection:"column",children:[i(R0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),i(E0,{flexDirection:"column",marginTop:1,children:C4.map((S,v)=>i(E0,{children:[i(R0,{color:v===G?X.colors.primary:void 0,bold:v===G,children:[v===G?"> ":" ",S.event]},void 0,!0,void 0,this),i(R0,{color:X.colors.muted,children:[" - ",S.description]},void 0,!0,void 0,this)]},S.event,!0,void 0,this))},void 0,!1,void 0,this),i(E0,{marginTop:1,children:i(R0,{color:X.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q!=="event"&&i(E0,{marginBottom:1,children:i(R0,{children:["Event:"," ",i(R0,{bold:!0,color:X.colors.primary,children:M.event},void 0,!1,void 0,this),i(R0,{color:X.colors.muted,children:[" - ",M.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")&&i(E0,{flexDirection:"column",marginBottom:1,children:[i(R0,{color:X.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),i(R0,{color:X.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),i(R0,{color:X.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),i(R0,{color:X.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="matcher"&&i(E0,{flexDirection:"column",children:[i(E0,{children:[i(R0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),i(c3,{value:F,onChange:H,onSubmit:p,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(E0,{marginTop:1,children:i(R0,{color:X.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(E0,{marginTop:1,children:i(R0,{color:X.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(Q==="command"||Q==="confirm")&&i(E0,{marginBottom:1,children:i(R0,{children:["Matcher: ",i(R0,{bold:!0,children:F||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q==="command"&&i(E0,{flexDirection:"column",children:[i(E0,{children:i(R0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(E0,{borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,marginTop:1,children:i(c3,{value:N,onChange:b,onSubmit:I0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(E0,{flexDirection:"column",marginTop:1,children:[i(R0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),OU.map((S,v)=>i(R0,{color:X.colors.muted,children:["• ",S]},v,!0,void 0,this))]},void 0,!0,void 0,this),i(E0,{marginTop:1,children:i(R0,{color:X.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="location"&&i(E0,{flexDirection:"column",children:[i(E0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[i(R0,{bold:!0,color:X.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),i(R0,{children:" "},void 0,!1,void 0,this),i(R0,{children:[" ","Event: ",M.event," - ",M.description]},void 0,!0,void 0,this),i(R0,{children:[" Matcher: ",F||"(all)"]},void 0,!0,void 0,this),i(R0,{children:[" Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),i(R0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),i(E0,{flexDirection:"column",marginTop:1,children:T4.map((S,v)=>i(E0,{children:[i(R0,{color:v===z?X.colors.primary:void 0,bold:v===z,children:[v===z?"> ":" ",v+1,". ",S.name]},void 0,!0,void 0,this),i(R0,{color:X.colors.muted,children:[" ",S.description]},void 0,!0,void 0,this)]},S.location,!0,void 0,this))},void 0,!1,void 0,this),i(E0,{marginTop:1,children:i(R0,{color:X.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="confirm"&&i(E0,{flexDirection:"column",children:[i(E0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.success,paddingX:2,paddingY:1,children:[i(R0,{bold:!0,children:["Saving hook to ",V.description,"..."]},void 0,!0,void 0,this),i(R0,{children:" "},void 0,!1,void 0,this),i(R0,{children:["Event: ",M.event]},void 0,!0,void 0,this),i(R0,{children:["Matcher: ",F||"(all tools)"]},void 0,!0,void 0,this),i(R0,{children:["Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),i(E0,{marginTop:1,children:i(R0,{color:X.colors.muted,children:w?"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),R&&i(E0,{marginTop:1,children:i(R0,{color:X.colors.error,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as zZ}from"ahooks";import{Box as SU,Text as kU}from"ink";import DU from"react";import{useMemoizedFn as y4}from"ahooks";import U2 from"chalk";import{Text as CU}from"ink";import{useEffect as GZ,useRef as O8}from"react";var R4={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};function l3($){return typeof $==="string"&&/^[0-9a-f]{32}$/.test($)}function _U($){if(!l3($))throw Error("TUI composer ready nonce must be 32 lowercase hexadecimal chars");return`\x1B]99;blade-composer-ready=${$}\x07`}function NU($=process.env){let J=$.BLADE_TUI_COMPOSER_READY_NONCE;if(!l3(J))return;return _U(J)}function r3($=process.env,J=(Z)=>process.stdout.write(Z)){let Z=NU($);if(!Z)return!1;return J(Z),!0}var Q2="\x1B",WU=`${Q2}[200~`,HU=`${Q2}[201~`,FU="[200~",LU="[201~",BU=[`${Q2}[I`,`${Q2}[O`,"[I","[O"],o3=`${Q2}[?2004h`,n3=`${Q2}[?2004l`,J9=`${Q2}[?1004l`,wU=[WU,FU],AU=[HU,LU];function t3(){return{pasteBuffer:null,pasteOverflowed:!1}}function a3($,J){let Z;for(let Y of J){let X=$.indexOf(Y);if(X===-1)continue;if(!Z||X<Z.index||X===Z.index&&Y.length>Z.marker.length)Z={index:X,marker:Y}}return Z}function i3($){return BU.some((J)=>$===J)}function s3($,J){let Z=J,Y=$.pasteBuffer,X=$.pasteOverflowed,Q=Y!==null,U=[];while(Z.length>0){if(Y!==null){let G=a3(Z,AU);if(!G){if(Y.length+Z.length>$9)Y="",X=!0;else if(!X)Y+=Z;Z="";break}if(Y.length+G.index>$9)X=!0;else if(!X)Y+=Z.slice(0,G.index),U.push({kind:"paste",text:Y});Y=null,X=!1,Q=!0,Z=Z.slice(G.index+G.marker.length);continue}let q=a3(Z,wU);if(!q){if(i3(Z))Q=!0;else U.push({kind:"text",text:Z});Z="";break}let K=Z.slice(0,q.index);if(K&&!i3(K))U.push({kind:"text",text:K});Y="",X=!1,Q=!0,Z=Z.slice(q.index+q.marker.length)}if(J.length===0&&Y!==null)Q=!0;return{handled:Q,state:{pasteBuffer:Y,pasteOverflowed:X},segments:U}}import{execSync as u2}from"node:child_process";import{existsSync as PU,readFileSync as Y9}from"node:fs";import{basename as e3,isAbsolute as bU}from"node:path";function $Z($){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 JZ(){let $=process.platform,J={darwin:"/tmp/blade_cli_latest_screenshot.png",linux:"/tmp/blade_cli_latest_screenshot.png",win32:process.env.TEMP?`${process.env.TEMP}\\blade_cli_latest_screenshot.png`:"C:\\Temp\\blade_cli_latest_screenshot.png"},Z={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(Y)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${Y}" with write permission' -e 'write png_data to fp' -e 'close access fp'`,getPath:"osascript -e 'get POSIX path of (the clipboard as «class furl»)'",deleteFile:(Y)=>`rm -f "${Y}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(Y)=>`xclip -selection clipboard -t image/png -o > "${Y}" || wl-paste --type image/png > "${Y}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(Y)=>`rm -f "${Y}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(Y)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${Y.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(Y)=>`del /f "${Y}"`}};return{commands:Z[$]||Z.linux,screenshotPath:J[$]||J.linux}}function MU(){let{commands:$}=JZ();try{return u2($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function YZ($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function ZZ($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function Z9($){let J=YZ($.trim()),Z=ZZ(J);return/\.(png|jpe?g|gif|webp)$/i.test(Z)}function TU($){let J=YZ($.trim()),Z=ZZ(J);if(Z9(Z))return Z;return null}async function XZ($){let J=TU($);if(!J)return null;let Z;try{if(bU(J))Z=Y9(J);else{let U=MU();if(U&&J===e3(U))Z=Y9(U);else return null}}catch(U){return console.error("Failed to read image file:",U),null}let Y=Z.toString("base64"),X=$Z(Y),Q=e3(J);return{path:J,base64:Y,mediaType:X,filename:Q}}async function QZ(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Z=J[$]||J.linux;try{return u2(Z,{encoding:"utf-8"})||null}catch{return null}}async function UZ(){let{commands:$,screenshotPath:J}=JZ();try{if(u2($.checkImage,{stdio:"ignore"}),u2($.saveImage(J),{stdio:"ignore"}),!PU(J))return null;let Y=Y9(J).toString("base64"),X=$Z(Y);return u2($.deleteFile(J),{stdio:"ignore"}),{base64:Y,mediaType:X}}catch(Z){try{u2($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as IU}from"react/jsx-dev-runtime";var RU=/\r\n/g,yU=/\r/g;function X9($){if(!$.includes("\r"))return $;return $.replace(RU,`
|
|
152
|
+
`).replace(yU,`
|
|
153
|
+
`)}function qZ($,J,Z){let Y=Math.max(0,Math.min(Z,J.length)),X=J.slice(0,Y),Q=J.slice(Y);return{newValue:X+$+Q,newCursorPosition:Y+$.length}}function KZ({value:$,placeholder:J="",focus:Z=!0,onChange:Y,cursorPosition:X,onChangeCursorPosition:Q,onPaste:U,onImagePaste:q,disabledKeys:K=[]}){let G=O8(t3()),O=O8($),z=O8(X),_=O8(null),F=O8(!1);GZ(()=>{O.current=$,z.current=X},[$,X]),GZ(()=>{if(X>$.length)Q($.length)},[$,X,Q]);let H=y4((B,W)=>{let L=O.current,M=z.current;if(O.current=B,z.current=W,B!==L)Y(B);if(W!==M)Q(W)}),N=y4((B)=>{if(!B)return;let{newValue:W,newCursorPosition:L}=qZ(X9(B),O.current,z.current);H(W,L)}),b=y4(async(B)=>{let W=X9(B);if(!W)return;if(q&&Z9(W))try{let M=await XZ(W);if(M){let V=await q(M.base64,M.mediaType,M.filename);if(V?.prompt)N(V.prompt);return}}catch(M){console.error("Failed to process image path:",M)}if((W.length>R4.LARGE_INPUT_THRESHOLD||W.includes(`
|
|
154
|
+
`))&&U){let M=await U(W);if(M?.prompt){N(M.prompt);return}}N(W)}),R=y4((B)=>{let W=_.current;if(!W){try{let M=B();if(!M)return;let V=M.catch(()=>{return});_.current=V,V.finally(()=>{if(_.current===V)_.current=null})}catch{}return}let L=W.then(B).then(()=>{return}).catch(()=>{return});_.current=L,L.finally(()=>{if(_.current===L)_.current=null})});F0((B,W)=>{return R(()=>{let L=X9(B),M=s3(G.current,L);if(G.current=M.state,M.handled)return(async()=>{for(let Y0 of M.segments)if(Y0.kind==="paste")await b(Y0.text);else N(Y0.text)})();if(K.some((Y0)=>W[Y0])||W.ctrl&&B==="c"||W.ctrl&&B==="l"||W.ctrl&&B==="t"||W.ctrl&&B==="o"||W.meta&&B==="l"||W.meta&&B==="t"||W.meta&&B==="o"||W.shift&&W.tab||L==="?"&&O.current==="")return;let C=O.current,I=z.current,A=I,k=C;if(W.leftArrow)A--;else if(W.rightArrow)A++;else if(W.backspace||W.delete){if(B===""){if(I>0)k=C.slice(0,I-1)+C.slice(I,C.length),A--}else if(I<C.length)k=C.slice(0,I)+C.slice(I+1,C.length)}else if(W.ctrl&&L==="a")A=0;else if(W.ctrl&&L==="e")A=C.length;else if(W.ctrl&&L==="k")k=C.slice(0,I);else if(W.ctrl&&L==="u")k=C.slice(I),A=0;else if(W.ctrl&&L==="w"){let r=C.slice(0,I).match(/\s*\S+\s*$/);if(r){let p=r[0].length;k=C.slice(0,I-p)+C.slice(I),A-=p}}else if(W.ctrl&&L==="v"){let Y0=process.platform==="darwin";return(async()=>{if(q){let p=await UZ();if(p){let I0=await q(p.base64,p.mediaType,"clipboard.png");if(I0?.prompt)N(I0.prompt);return}}if(Y0)return;let r=await QZ();if(r)await b(r)})()}else if(W.pageUp)A=0;else if(W.pageDown)A=C.length;else if(L===`
|
|
155
|
+
`&&(W.shift||W.meta)){let{newValue:Y0,newCursorPosition:r}=qZ(L,C,I);H(Y0,r);return}else if(!W.ctrl&&!W.meta){if(U&&(L.length>R4.LARGE_INPUT_THRESHOLD||L.includes(`
|
|
156
|
+
`)))return b(L);k=C.slice(0,I)+L+C.slice(I,C.length),A+=L.length}if(A<0)A=0;if(A>k.length)A=k.length;H(k,A)}),!0},{isActive:Z,priority:0,onRegistered:()=>{if(F.current)return;F.current=r3()}});let P=Z,w=$,D=J?U2.grey(J):void 0;if(P)if(D=J.length>0?U2.inverse(J[0])+U2.grey(J.slice(1)):U2.inverse(" "),$.length===0)w=U2.inverse(" ");else{w="";for(let B=0;B<$.length;B++)if(B===X&&X<$.length)w+=U2.inverse($[B]);else w+=$[B];if(X>=$.length)w+=U2.inverse(" ")}return IU(CU,{children:J?$.length>0?w:D:w},void 0,!1,void 0,this)}import{jsxDEV as Q9}from"react/jsx-dev-runtime";var OZ=DU.memo(({input:$,cursorPosition:J,onChange:Z,onChangeCursorPosition:Y,onAddPasteMapping:X,onAddImagePasteMapping:Q,disabled:U=!1})=>{let K=U$()==="main-input"&&!U,G=$.trimStart().startsWith("!"),O=zZ((_)=>{let F=_.split(`
|
|
157
|
+
`).length,H=_.length,N=500,b=10;if(H>500||F>10){let R=X(_),P=_.slice(0,30).replace(/\n/g," "),w=`${H} chars, ${F} lines: ${P}...`;return{prompt:`${G4(R)}${w}${_J()}`}}return{}}),z=zZ(async(_,F,H)=>{try{let N=Q(_,F);return{prompt:`${G4(N)}[Image #${N}]${_J()}`}}catch(N){return console.error("[Image Paste] Failed to process image:",N),{prompt:`[Image paste failed: ${N instanceof Error?N.message:"Unknown error"}] `}}});return Q9(SU,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[Q9(kU,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),Q9(KZ,{value:$,cursorPosition:J,onChange:Z,onChangeCursorPosition:Y,onPaste:O,onImagePaste:z,placeholder:" 输入命令...",focus:K,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as I4,Text as J1}from"ink";import mU,{useEffect as pU,useState as xU}from"react";import{useEffect as EU,useRef as hU,useState as gU}from"react";import{useEffect as VU,useRef as fU,useState as vU}from"react";var jU=15000,_Z="等待用户确认...",NZ=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],WZ=["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 HZ(){if(Math.random()<0.25){let Z=Math.floor(Math.random()*WZ.length);return WZ[Z]}let J=Math.floor(Math.random()*NZ.length);return NZ[J]}function FZ($,J,Z=!1){let[Y,X]=vU(""),Q=fU(Z);return Q.current=Z,VU(()=>{if(J){X(_Z);return}if(!$){X("");return}X((q)=>q===""||q===_Z?HZ():q);let U=setInterval(()=>{if(!Q.current)X(HZ())},jU);return()=>{clearInterval(U)}},[$,J]),Y}function LZ($,J=!1,Z=!1){let[Y,X]=gU(0),Q=hU(null),U=FZ($,J,Z);return EU(()=>{if(!$){X(0),Q.current=null;return}if(Z)return;if(Q.current===null)Q.current=Date.now();let q=setInterval(()=>{if(Q.current!==null){let K=Math.floor((Date.now()-Q.current)/1000);X(K)}},1000);return()=>{clearInterval(q)}},[$,Z]),{currentPhrase:U,elapsedTime:Y}}import{jsxDEV as T$,Fragment as cU}from"react/jsx-dev-runtime";var U9=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],uU=80;function c2($){if($<60)return`${$}s`;let J=Math.floor($/60),Z=$%60;return`${J}m ${Z}s`}var BZ=mU.memo(({message:$,paused:J=!1})=>{let Z=C2(),Y=I8(),X=p9(),Q=m9(),U=x9(),q=u9(),K=c9(),G=Z||!Y,[O,z]=xU(0),_=V0(),H=f2()>=uU,{currentPhrase:N,elapsedTime:b}=LZ(G,!1,J);if(pU(()=>{if(!G||J){z(0);return}let L=setInterval(()=>{z((M)=>(M+1)%U9.length)},150);return()=>clearInterval(L)},[G,J]),!G)return null;let R=U?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${U.attempt}/${U.maxRetries}),剩余约 ${c2(Math.max(0,Math.ceil((U.recoveryRemainingMs??0)/1000)))}`:U?.phase==="scheduled"?`Provider 暂时不可用,${U.attempt}/${U.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((U.delayMs??0)/1000))}s 后开始`:U?.phase==="attempt"?`正在重试 Provider (${U.attempt}/${U.maxRetries})`:null,P=Q?Q.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${Q.retryAfterMs!==void 0?` (${c2(Math.max(0,Math.ceil(Q.retryAfterMs/1000)))})`:""}${Q.recoveryRemainingMs!==void 0?`,剩余预算 ${c2(Math.max(0,Math.ceil(Q.recoveryRemainingMs/1000)))}`:""}`:null,w=X?`等待 Provider 容量(${X.scope},队列 ${X.queuePosition}/${Math.max(X.queueDepth,X.queuePosition)},已等待 ${c2(Math.max(0,Math.ceil(X.waitMs/1000)))})`:null,D=q?q.outputStarted?`Provider 流已暂停 ${Math.ceil(q.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(q.durationMs/1000)}s(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:null,W=(K?.phase==="detected"?`检测到 ${K.toolName} 连续 ${K.runLength} 次无进展,正在要求 Agent 切换策略`:K?.phase==="halted"?`已停止 ${K.toolName} 空转循环`:null)||P||w||R||D||$||N||"正在思考中...";if(H)return T$(I4,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[T$(J1,{color:_.colors.warning,bold:!0,children:U9[O]},void 0,!1,void 0,this),T$(J1,{color:_.colors.text.primary,children:W},void 0,!1,void 0,this),b>0&&T$(cU,{children:[T$(J1,{color:_.colors.muted,children:"|"},void 0,!1,void 0,this),T$(J1,{color:_.colors.info,children:["已用时: ",c2(b)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T$(J1,{color:_.colors.muted,children:"|"},void 0,!1,void 0,this),T$(J1,{color:_.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return T$(I4,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[T$(I4,{flexDirection:"row",gap:1,children:[T$(J1,{color:_.colors.warning,bold:!0,children:U9[O]},void 0,!1,void 0,this),T$(J1,{color:_.colors.text.primary,children:W},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b>0&&T$(I4,{marginLeft:2,flexDirection:"row",gap:1,children:[T$(J1,{color:_.colors.info,children:["已用时: ",c2(b)]},void 0,!0,void 0,this),T$(J1,{color:_.colors.muted,children:"|"},void 0,!1,void 0,this),T$(J1,{color:_.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as D4,Text as $$,useStdout as dU}from"ink";import lU from"ink-text-input";import rU,{useCallback as S4,useEffect as aU,useMemo as iU,useState as G2}from"react";import{jsxDEV as f0}from"react/jsx-dev-runtime";var bZ=rU.memo(({details:$,onComplete:J})=>{let{stdout:Z}=dU(),Y=Z.columns||80,X=U$()==="confirmation-prompt",Q=s0(!1),U=$.fields??[],[q,K]=G2("field"),[G,O]=G2(0),[z,_]=G2(()=>wZ($)),[F,H]=G2(""),[N,b]=G2(0),[R,P]=G2([]),[w,D]=G2(),B=U[G],W=iU(()=>oU(B),[B]);aU(()=>{if(!B)return;let I=z[B.name];H(typeof I==="string"||typeof I==="number"?String(I):""),P(Array.isArray(I)?[...I]:[]);let A=W.findIndex((k)=>k.value===String(I));b(A>=0?A:0),D(void 0)},[z,B,W]);let L=S4((I)=>{if(_(I),G<U.length-1){O((A)=>A+1);return}K("review")},[G,U.length]),M=S4((I)=>{if(!B)return;let A={...z};if(I===void 0)delete A[B.name];else A[B.name]=I;L(A)},[z,B,L]),V=S4((I)=>{if(!B)return;try{M(AZ(B,I))}catch(A){D(A instanceof Error?A.message:String(A))}},[B,M]),C=S4(()=>{try{let I=PZ($,{action:"accept",content:z});J({action:I.action,...I.content?{content:I.content}:{}})}catch(I){D(I instanceof Error?I.message:String(I))}},[z,$,J]);if(F0((I,A)=>{if(A.ctrl&&I==="c"||A.meta&&I==="c"){Q();return}if(A.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(q==="review"){if(I.toLowerCase()==="y"||A.return)C();else if(I.toLowerCase()==="e")O(0),K("field");else if(I.toLowerCase()==="d")J({action:"decline"});return}if(!B){if(A.return)C();return}if(G9(B))return;if(I.toLowerCase()==="d"){J({action:"decline"});return}if(A.upArrow){b((k)=>k>0?k-1:Math.max(W.length-1,0));return}if(A.downArrow||A.tab){b((k)=>k<W.length-1?k+1:0);return}if(I===" "&&B.type==="multi-select"){let k=W[N];if(k)P((Y0)=>Y0.includes(k.value)?Y0.filter((r)=>r!==k.value):[...Y0,k.value]);return}if(A.return)if(B.type==="multi-select")M(R);else{let k=W[N];if(k)M(k.typedValue)}},{isActive:X}),$.mode==="url")return f0(k4,{width:Y,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(q==="review")return f0(k4,{width:Y,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),U.map((I)=>f0($$,{children:[I.title,": ",tU(z[I.name])]},I.name,!0,void 0,this)),w&&f0($$,{color:"red",children:w},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(!B)return f0(k4,{width:Y,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(k4,{width:Y,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(D4,{flexDirection:"column",marginTop:1,children:[f0($$,{bold:!0,children:[B.title,B.required?" *":""]},void 0,!0,void 0,this),B.description&&f0($$,{color:"gray",children:B.description},void 0,!1,void 0,this),f0($$,{color:"gray",children:nU(B)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G9(B)?f0(D4,{children:[f0($$,{color:"cyan",children:"> "},void 0,!1,void 0,this),f0(lU,{value:F,onChange:H,onSubmit:V,focus:X,placeholder:B.defaultValue===void 0?B.required?"Required":"Optional":String(B.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):f0(D4,{flexDirection:"column",children:W.map((I,A)=>{let k=B.type==="multi-select"&&R.includes(I.value);return f0($$,{color:N===A?"yellow":void 0,children:[N===A?"> ":" ",B.type==="multi-select"?k?"(*) ":"( ) ":"",I.label]},I.value,!0,void 0,this)})},void 0,!1,void 0,this),w&&f0($$,{color:"red",children:w},void 0,!1,void 0,this),f0($$,{color:"gray",children:[G9(B)?"Enter to continue":B.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 ",G+1," of ",U.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function k4({children:$,width:J,color:Z}){return f0(D4,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Z,padding:1,width:Math.min(J-4,88),children:$},void 0,!1,void 0,this)}function G9($){return $.type==="string"||$.type==="number"||$.type==="integer"}function oU($){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 nU($){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 tU($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import f4 from"ansi-escapes";import{Box as x1,Static as GG,useStdout as qG}from"ink";import KG,{useEffect as T1,useMemo as N9,useRef as u1,useState as W9}from"react";import{Box as sU,Text as MZ}from"ink";import eU from"react";import{jsxDEV as q9}from"react/jsx-dev-runtime";var K9=eU.memo(({collapsedCount:$})=>{let J=V0();if($<=0)return null;let Z=J.colors.text.muted;return q9(sU,{flexDirection:"row",marginBottom:1,children:[q9(MZ,{color:Z,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),q9(MZ,{color:Z,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});K9.displayName="CollapsedHistorySummary";import{Box as _8,Text as N8}from"ink";import $G from"ink-big-text";import JG from"ink-gradient";import YG from"react";import{jsxDEV as i$}from"react/jsx-dev-runtime";var CZ=YG.memo(()=>{return i$(_8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[i$(_8,{flexDirection:"column",children:i$(JG,{name:"pastel",children:i$($G,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),i$(_8,{marginBottom:1,children:i$(N8,{color:"white",dimColor:!0,children:TZ()},void 0,!1,void 0,this)},void 0,!1,void 0,this),i$(_8,{flexDirection:"column",marginBottom:1,children:[i$(_8,{marginBottom:1,children:i$(N8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i$(N8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),i$(N8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),i$(N8,{color:"white",children:"3. 输入 /help 查看所有 slash 命令"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as V4,Text as z9}from"ink";import RZ from"react";import{jsxDEV as p1}from"react/jsx-dev-runtime";var yZ=RZ.memo(({tasks:$,visible:J=!0,compact:Z=!1})=>{let{colors:Y}=V0();if(!J||$.length===0)return null;let X={total:$.length,completed:$.filter((Q)=>Q.status==="completed").length,inProgress:$.filter((Q)=>Q.status==="in_progress").length};return p1(V4,{flexDirection:"column",borderStyle:"single",borderColor:Y.border.light,paddingX:1,paddingY:Z?0:1,marginBottom:1,children:[p1(V4,{marginBottom:Z?0:1,children:[p1(z9,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),p1(z9,{color:Y.text.muted,children:[X.completed,"/",X.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p1(V4,{flexDirection:"column",children:$.map((Q,U)=>p1(ZG,{task:Q,compact:Z},Q.id||U,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),ZG=RZ.memo(({task:$,compact:J})=>{let Z,Y=!1,X;switch($.status){case"completed":Z="[OK]",Y=!0,X=$.subject;break;case"in_progress":Z=">",Y=!1,X=$.activeForm||$.subject;break;case"pending":default:Z="-",Y=!0,X=$.subject;break}return p1(V4,{paddingY:J?0:0,children:p1(z9,{dimColor:Y,children:[Z," ",X]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as O9,Text as d2}from"ink";import XG,{useMemo as IZ}from"react";import{jsxDEV as M1}from"react/jsx-dev-runtime";function QG($,J=60){if(!$)return"";let Z=$.split(`
|
|
158
|
+
`)[0]||"";if(Z.length<=J)return Z;return`${Z.slice(0,J)}...`}function UG($){if(!$)return 0;return $.split(`
|
|
159
|
+
`).length}var _9=XG.memo(({content:$,isStreaming:J=!1,isExpanded:Z})=>{let Y=V0(),X=IZ(()=>UG($),[$]),Q=IZ(()=>QG($),[$]),U=Y.colors.info,q=Y.colors.muted;return M1(O9,{flexDirection:"column",marginBottom:1,children:[M1(O9,{flexDirection:"row",children:[M1(d2,{color:U,children:Z?"v":">"},void 0,!1,void 0,this),M1(d2,{children:" "},void 0,!1,void 0,this),M1(d2,{color:q,children:["Thinking",J?"...":` (${X} lines)`]},void 0,!0,void 0,this),!Z&&!J&&Q&&M1(d2,{color:q,children:[" - ",Q]},void 0,!0,void 0,this),M1(d2,{color:q,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&$&&M1(O9,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:M1(d2,{color:q,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});_9.displayName="ThinkingBlock";import{jsxDEV as A$}from"react/jsx-dev-runtime";var zG=({active:$=!0})=>{let J=T8(),Z=h8(),Y=g8(),X=qY(),Q=C2(),U=a9(),q=$Y(),K=R2(),G=E8(),O=GY(),z=j9(),_=zY(),F=KY(),{width:H,height:N}=V2(),{stdout:b}=qG(),R=E1(),[P,w]=W9(null),[D,B]=W9([]),[W,L]=W9(new Set),M=u1(F),V=u1(null),C=u1(0),I=u1(0),A=u1(new Set),k=u1(new Set),Y0=u1([]),r=u1(null);T1(()=>{if(M.current!==F){if(M.current=F,!$)return;if(s$())l$();if(b)b.write(f4.clearTerminal);R.incrementClearCount()}},[$,F,b,R]);let p=J,I0=X;T1(()=>{if(!X||Q){r.current=null;return}if(r.current===X)return;if(r.current=X,s$())l$();if($&&b)b.write(f4.eraseScreen+f4.cursorTo(0,0));A.current=new Set,k.current=new Set(p.filter((f)=>f.role==="tool").map((f)=>f.id)),V.current=null,C.current=0,I.current=0,Y0.current=[],B([]),L(new Set),R.incrementClearCount(),R.clearFinalizingStreamingMessageId()},[X,Q,b,R,p,$]);let n=Z??X;T1(()=>{if($&&s$())l$();V.current=null,C.current=0,I.current=0,A.current=new Set,k.current=new Set(p.filter((f)=>f.role==="tool").map((f)=>f.id)),Y0.current=[],B([]),L(new Set)},[z]),T1(()=>{if(!n)return;if(V.current===n)return;V.current=n,C.current=0,I.current=0,k.current=new Set(p.filter((f)=>f.role==="tool").map((f)=>f.id)),Y0.current=[],B([])},[n,p]),T1(()=>{if(!n)return;let f=H9(n);if(!f||f.length<=C.current)return;let X0=f.slice(C.current);C.current=f.length;let $0=X0,T=Y0.current;if(T.length>0)if($0.some((s)=>s.type!=="empty"))$0=[...T,...$0],Y0.current=[];else{Y0.current=[...T,...$0];return}let y=$0.length;while(y>0&&$0[y-1].type==="empty")y-=1;if(y!==$0.length)Y0.current=$0.slice(y),$0=$0.slice(0,y);if($0.length===0)return;let j=I.current;I.current+=1;let x=j>0;if(s$())l$();L((s)=>{if(!n||s.has(n))return s;let l=new Set(s);return l.add(n),l}),B((s)=>[...s,A$(x1,{flexDirection:"column",children:A$(K1,{content:"",role:"assistant",terminalWidth:H,isPending:!1,hidePrefix:x,noMargin:!0,blocksOverride:$0,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${n}-${j}`,!1,void 0,this)])},[n,Y.version,H,z,$]),T1(()=>{if(!n)return;let f=k.current,X0=p.filter(($0)=>$0.role==="tool"&&!f.has($0.id)&&!A.current.has($0.id));if(X0.length===0)return;if($&&s$())l$();for(let $0 of X0)A.current.add($0.id);B(($0)=>[...$0,...X0.map((T)=>A$(x1,{flexDirection:"column",children:A$(K1,{content:T.content,role:T.role,terminalWidth:H,metadata:T.metadata,isPending:!1,messageId:T.id},void 0,!1,void 0,this)},`streaming-tool-${T.id}`,!1,void 0,this))])},[$,n,p,H]),T1(()=>{if(!$){if(s$())l$();return}if(!n){if(s$())l$();return}if(!s$())n6(H,N);else t6(H,N);let f=SZ(n);if(!f||f.lines.length===0)return;let $0=Math.max(1,N-8),T=Math.max(0,f.lines.length-$0),y=f.lines.slice(-$0),j=(H9(n)?.length??0)>0;s6(y,T,f.mode,j)},[n,Y.version,N,H,$]),T1(()=>{if(!n&&s$())l$()},[n]),T1(()=>{if(P===null&&p.length>_){if(w(p.length),$&&s$())l$();if($&&b)b.write(f4.clearTerminal);R.incrementClearCount()}},[p.length,_,P,b,R,$]);let S=N9(()=>{return U.some((f)=>f.status==="pending"||f.status==="in_progress")},[U]),v=F?0:P??0,g=v,e=N9(()=>{let f=[];if(f.push(A$(CZ,{},"header",!1,void 0,this)),g>0)f.push(A$(K9,{collapsedCount:g},"collapsed-summary",!1,void 0,this));for(let X0=v;X0<p.length;X0++){let $0=p[X0];if(I0&&$0.id===I0)continue;if($0.role==="tool"&&A.current.has($0.id))continue;if($0.role==="assistant"&&W.has($0.id))continue;f.push(A$(x1,{flexDirection:"column",children:A$(K1,{content:$0.content,role:$0.role,terminalWidth:H,metadata:$0.metadata,isPending:!1,messageId:$0.id},void 0,!1,void 0,this)},$0.id,!1,void 0,this))}return f},[p,v,g,H,I0,W]),U0=N9(()=>D.length>0?[...e,...D]:e,[e,D]);return A$(x1,{flexDirection:"column",paddingX:2,children:A$(x1,{flexDirection:"column",children:[A$(GG,{items:U0,children:(f)=>f},z,!1,void 0,this),G&&A$(x1,{marginBottom:1,children:A$(_9,{content:G,isStreaming:Q,isExpanded:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),q&&S&&A$(x1,{marginTop:1,children:A$(yZ,{tasks:U,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.map((f,X0)=>A$(x1,{flexDirection:"column",children:A$(K1,{content:f.displayText,role:"user",terminalWidth:H},void 0,!1,void 0,this)},`pending-${X0}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},kZ=KG.memo(zG);import{useMemoizedFn as v4,useMount as OG}from"ahooks";import{Box as o$,Text as v0,useFocus as _G,useFocusManager as NG}from"ink";import WG from"ink-select-input";import{memo as HG,useMemo as FG,useState as j4}from"react";import{jsxDEV as B0,Fragment as wG}from"react/jsx-dev-runtime";var LG=({isSelected:$})=>B0(o$,{marginRight:1,children:B0(v0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),BG=({isSelected:$,label:J})=>B0(v0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),DZ=HG(({onClose:$,onEdit:J})=>{let Z=JY(),Y=k8()??"",{isFocused:X}=_G({id:"model-selector"}),Q=NG(),[U,q]=j4(""),[K,G]=j4(!1),[O,z]=j4(null),_=s0(!1),[F]=j4(()=>{let L=process.stdout?.columns||80;return Math.max(20,L-8)});OG(()=>{if(Q?.focus("model-selector"),Z.length>0)q(Z[0].id)}),F0((L,M)=>{if(K)return;if(M.ctrl&&L==="c"||M.meta&&L==="c"){_();return}if(M.escape){$();return}if(!X)return;if(L==="d"||L==="D"){N();return}if((L==="e"||L==="E")&&J)b()},{isActive:!0});let H=v4(async(L)=>{if(K)return;let M=L.value;if(M===Y){$();return}G(!0),z(null);try{await O$().setCurrentModel(M),$()}catch(V){z(V.message),G(!1)}}),N=v4(async()=>{if(K||U===Y)return;G(!0),z(null);try{if(await O$().removeModel(U),Z.length<=1)$()}catch(L){z(L.message)}finally{G(!1)}}),b=v4(()=>{if(K||!J)return;let L=Z.find((M)=>M.id===U);if(!L)return;J(L)}),R=v4((L)=>{q(L.value)}),P=FG(()=>{return Z.find((L)=>L.id===U)},[Z,U]),w=P?E4()?.modelProviders[P.provider]:void 0,D=Z.map((L)=>{let M=L.id===Y?" (当前)":"";return{label:F9(L)+M,value:L.id}}),B=U===Y;return B0(o$,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[B0(o$,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[B0(v0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),B0(v0,{dimColor:!0,children:[K?"处理中...":B?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B0(o$,{flexDirection:"row",children:[B0(o$,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[B0(v0,{dimColor:!0,children:["已配置模型 (",Z.length,")"]},void 0,!0,void 0,this),B0(o$,{marginTop:1,children:B0(WG,{items:D,onSelect:H,onHighlight:R,indicatorComponent:LG,itemComponent:BG},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(o$,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[B0(v0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),B0(o$,{marginY:1,children:B0(v0,{color:B?"green":"yellow",children:B?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P?B0(o$,{flexDirection:"column",children:[B0(v0,{children:[B0(v0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),B0(v0,{bold:!0,color:"cyan",children:F9(P)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(v0,{children:[B0(v0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),B0(v0,{bold:!0,children:w?.name??P.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w&&B0(wG,{children:[B0(v0,{children:[B0(v0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),B0(v0,{children:P.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(v0,{children:[B0(v0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),B0(v0,{children:w.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(v0,{children:[B0(v0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),B0(v0,{color:"blueBright",children:w.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B0(v0,{children:[B0(v0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),B0(v0,{bold:!0,children:P.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P.overrides?.baseUrl&&B0(v0,{children:[B0(v0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),B0(v0,{color:"blueBright",children:P.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(v0,{children:[B0(v0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),B0(v0,{children:B1().resolveConfig(P).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):B0(v0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),O&&B0(o$,{marginTop:1,children:B0(v0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(o$,{justifyContent:"center",marginTop:1,children:B0(v0,{dimColor:!0,children:"─".repeat(F)},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(o$,{justifyContent:"center",children:B0(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 L9}from"ahooks";import{Box as EG,Text as B9}from"ink";import{useState as z2}from"react";import{Box as q2,Text as C1}from"ink";import AG from"ink-text-input";import{jsxDEV as P$}from"react/jsx-dev-runtime";var VZ=({provider:$,value:J,onChange:Z,onSubmit:Y,onCancel:X,error:Q})=>{return F0((U,q)=>{if(q.escape)X()}),P$(q2,{flexDirection:"column",children:[P$(q2,{marginBottom:1,children:P$(C1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(q2,{marginBottom:1,children:P$(C1,{children:["Provider: ",P$(C1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P$(q2,{marginBottom:1,children:P$(C1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(q2,{children:[P$(C1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),P$(AG,{value:J,onChange:Z,onSubmit:Y,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&P$(q2,{marginTop:1,children:P$(C1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(q2,{marginTop:1,children:P$(C1,{dimColor:!0,children:["输入完成后按 ",P$(C1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",P$(C1,{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 h4,Text as c1}from"ink";import PG from"ink-text-input";import{useState as g4}from"react";import{jsxDEV as p$}from"react/jsx-dev-runtime";var m4=["id","name","baseUrl","model"];function fZ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function bG($,J,Z){switch($){case"id":return"team-gateway";case"name":return Z||"Team Gateway";case"baseUrl":return J==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return J==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function MG($,J){let Z=$.id.trim(),Y={name:$.name.trim()||Z,baseUrl:$.baseUrl.trim(),wireApi:J},X=jZ(Z,Y);if(!$.model.trim())X.push("Model ID must not be empty");if(X.length>0)throw Error(X[0]);return{provider:Z,model:$.model.trim(),displayName:$.model.trim(),modelProvider:Y}}var EZ=({wireApi:$,initialConfig:J,onSubmit:Z,onCancel:Y})=>{let X={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,U]=g4(J?3:0),[q,K]=g4(J?.model??""),[G,O]=g4(X),[z,_]=g4(),F=m4[Q];F0((N,b)=>{if(!b.escape)return;if(_(void 0),Q===0){Y();return}let R=Q-1,P=m4[R];U(R),K(G[P])});let H=(N)=>{let b=N.trim();if(F==="id"&&!vZ.test(b)){_("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(F==="baseUrl")try{let P=new URL(b);if(!["http:","https:"].includes(P.protocol))throw Error()}catch{_("Base URL 必须是绝对 HTTP(S) URL");return}if(F==="model"&&!b){_("Model ID 不能为空");return}let R={...G,[F]:F==="name"&&!b?G.id:b};if(O(R),_(void 0),Q===m4.length-1){try{Z(MG(R,$))}catch(P){_(P instanceof Error?P.message:"渠道配置无效")}return}U(Q+1),K("")};return p$(h4,{flexDirection:"column",children:[p$(h4,{marginBottom:1,children:p$(c1,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p$(c1,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),m4.slice(0,Q).map((N)=>p$(c1,{children:[fZ(N),": ",p$(c1,{color:"cyan",children:G[N]},void 0,!1,void 0,this)]},N,!0,void 0,this)),p$(h4,{marginTop:1,children:[p$(c1,{bold:!0,children:[fZ(F),": "]},void 0,!0,void 0,this),p$(PG,{value:q,onChange:(N)=>{K(N),_(void 0)},onSubmit:H,placeholder:bG(F,$,G.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F==="name"&&p$(c1,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),z&&p$(c1,{color:"red",children:z},void 0,!1,void 0,this),p$(h4,{marginTop:1,children:p$(c1,{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 mZ,useState as l2}from"react";var pZ=()=>{let[$,J]=l2([]),[Z,Y]=l2(!0),[X,Q]=l2(null);return mZ(()=>{let U=!1;return(async()=>{try{let K=await hZ();if(!U)J(K)}catch(K){if(!U)Q(K instanceof Error?K.message:"加载 Provider 列表失败")}finally{if(!U)Y(!1)}})(),()=>{U=!0}},[]),{providers:$,isLoading:Z,error:X}},xZ=($)=>{let[J,Z]=l2([]),[Y,X]=l2(!1),[Q,U]=l2(null);return mZ(()=>{if(!$){Z([]),X(!1),U(null);return}let q=!1;return Z([]),X(!0),U(null),(async()=>{try{let G=await gZ($);if(!q)Z(G)}catch(G){if(!q)U(G instanceof Error?G.message:"加载模型列表失败")}finally{if(!q)X(!1)}})(),()=>{q=!0}},[$]),{models:J,isLoading:Y,error:Q}};import{Box as R1,Text as Y1}from"ink";import TG from"ink-select-input";import CG from"ink-text-input";import{useMemo as uZ,useState as RG}from"react";import{jsxDEV as K$,Fragment as kG}from"react/jsx-dev-runtime";var yG=({isSelected:$})=>K$(R1,{marginRight:1,children:K$(Y1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),IG=($)=>{let J=[$.name];if($.contextWindow){let Z=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;J.push(`[${Z} ctx]`)}if($.reasoning)J.push("[reasoning]");if($.input.includes("image"))J.push("[vision]");if($.cost.input||$.cost.output)J.push(`[$${$.cost.input}/$${$.cost.output}]`);return J.join(" ")},SG=({isSelected:$,label:J})=>K$(Y1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),cZ=({provider:$,models:J,isLoading:Z,error:Y,onSelect:X,onCancel:Q})=>{let[U,q]=RG("");F0((O,z)=>{if(z.escape)if(U)q("");else Q()});let K=uZ(()=>{if(!U)return J;let O=U.toLowerCase();return J.filter((z)=>z.name.toLowerCase().includes(O)||z.id.toLowerCase().includes(O))},[J,U]),G=uZ(()=>K.map((O)=>({key:O.id,label:IG(O),value:O})),[K]);if(Z)return K$(R1,{flexDirection:"column",children:K$(Y1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(Y)return K$(R1,{flexDirection:"column",children:[K$(Y1,{color:"red",children:Y},void 0,!1,void 0,this),K$(Y1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return K$(R1,{flexDirection:"column",children:[K$(R1,{marginBottom:1,children:K$(Y1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K$(R1,{marginBottom:1,children:K$(Y1,{children:["Provider: ",K$(Y1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),K$(kG,{children:[K$(R1,{marginBottom:1,children:[K$(Y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),K$(CG,{value:U,onChange:q,placeholder:`搜索 ${J.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K$(R1,{marginBottom:1,children:K$(Y1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K$(R1,{flexDirection:"column",height:12,children:K$(TG,{items:G,onSelect:(O)=>X(O.value),indicatorComponent:yG,itemComponent:SG,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&K$(Y1,{color:"yellow",children:"内置 catalog 中没有匹配模型"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as K2,Text as d1}from"ink";import DG from"ink-select-input";import VG from"ink-text-input";import{useMemo as dZ,useState as fG}from"react";import{jsxDEV as b$}from"react/jsx-dev-runtime";var vG=({isSelected:$})=>b$(K2,{marginRight:1,children:b$(d1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),jG=({isSelected:$,label:J})=>b$(d1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),lZ=({providers:$,isLoading:J,error:Z,onSelect:Y,onCancel:X})=>{let[Q,U]=fG("");F0((G,O)=>{if(O.escape)if(Q)U("");else X()});let q=dZ(()=>{if(!Q)return $;let G=Q.toLowerCase();return $.filter((O)=>O.name.toLowerCase().includes(G)||O.id.toLowerCase().includes(G))},[$,Q]),K=dZ(()=>q.map((G)=>({key:G.id,label:`${G.name} - ${G.modelCount} models${G.configured?" [configured]":""}`,value:G})),[q]);if(J)return b$(K2,{flexDirection:"column",children:b$(d1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return b$(K2,{flexDirection:"column",children:[b$(d1,{color:"red",children:Z},void 0,!1,void 0,this),b$(d1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return b$(K2,{flexDirection:"column",children:[b$(K2,{marginBottom:1,children:b$(d1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),b$(K2,{marginBottom:1,children:[b$(d1,{color:"cyan",children:"> "},void 0,!1,void 0,this),b$(VG,{value:Q,onChange:U,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b$(K2,{flexDirection:"column",height:12,children:b$(DG,{items:K,onSelect:(G)=>Y(G.value),indicatorComponent:vG,itemComponent:jG,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.length===0&&b$(d1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function rZ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as l1}from"react/jsx-dev-runtime";var w9=({mode:$,initialConfig:J,modelId:Z,onComplete:Y,onCancel:X})=>{let[Q,U]=z2("provider"),[q,K]=z2(),[G,O]=z2(),[z,_]=z2(),[F,H]=z2(""),[N,b]=z2(),[R,P]=z2(!1),w=pZ(),D=xZ(q?.id),B=s0(!1);F0((V,C)=>{if(C.ctrl&&V==="c"||C.meta&&V==="c")$==="setup"?B():X()});let W=L9(async(V)=>{if(!q)return;let C=z??(G?{provider:q.id,model:G.id,displayName:J?.displayName}:void 0);if(!C)return;P(!0),b(void 0);try{if(C.modelProvider)B1().registerModelProvider(C.provider,C.modelProvider,[C.model]);if(V?.trim())await B1().setApiKey(C.provider,V.trim());let I={displayName:C.displayName,provider:C.provider,model:C.model,overrides:C.overrides};if($==="setup")await Y(C);else if($==="add"){let A=C.modelProvider?await O$().addModelWithProvider(I,C.modelProvider):await O$().addModel(I);await O$().setCurrentModel(A.id),await Y(C)}else if(Z){if(C.modelProvider)await O$().updateModelWithProvider(Z,I,C.modelProvider);else await O$().updateModel(Z,I);await Y(C)}}catch(I){if(C.modelProvider){await B1().credentials.delete(C.provider);let A=E4();B1().configureModelProviders(A?.modelProviders??{},A?.models??[])}b(I instanceof Error?I.message:"保存配置失败"),P(!1)}}),L=L9((V)=>{if(O(V),q?.configured)W();else if(q?.supportsApiKey)U("credential");else b(`${q?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),M=L9(()=>{if(b(void 0),Q==="credential"&&z){U("custom");return}let V=rZ(Q);if(V)U(V)});return l1(EG,{flexDirection:"column",padding:1,children:[l1(B9,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&l1(lZ,{...w,onSelect:(V)=>{K(V),O(void 0),_(void 0),U(V.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:X},void 0,!1,void 0,this),Q==="custom"&&q?.factoryWireApi&&l1(EZ,{wireApi:q.factoryWireApi,initialConfig:z,onSubmit:(V)=>{_(V),U("credential")},onCancel:M},void 0,!1,void 0,this),Q==="model"&&q&&l1(cZ,{provider:q,...D,onSelect:L,onCancel:M},void 0,!1,void 0,this),Q==="credential"&&q&&l1(VZ,{provider:q,value:F,onChange:H,onSubmit:()=>void W(F),onCancel:M,error:N},void 0,!1,void 0,this),R&&l1(B9,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),N&&Q!=="credential"&&l1(B9,{color:"red",children:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as W8}from"ahooks";import{promises as nZ}from"fs";import{Box as x$,Text as Y$}from"ink";import aZ from"ink-select-input";import hG from"ink-text-input";import gG from"os";import p4 from"path";import{useEffect as mG,useMemo as x4,useRef as pG,useState as r1}from"react";import{jsxDEV as y0}from"react/jsx-dev-runtime";var H8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],xG={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},uG={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},iZ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},cG=["project","global","local"],dG={allow:[],ask:[],deny:[]},lG={localExists:!1,projectExists:!1,globalExists:!1},oZ={allow:[],ask:[],deny:[]};function rG($){let J=(Y)=>Array.isArray(Y)?Y.filter((X)=>typeof X==="string"):[],Z=$?.permissions??{};return{allow:J(Z?.allow),ask:J(Z?.ask),deny:J(Z?.deny)}}async function aG($){try{let J=await nZ.readFile($,"utf-8"),Z=JSON.parse(J);return{exists:!0,raw:Z,permissions:rG(Z)}}catch(J){if(J.code==="ENOENT")return{exists:!1,raw:{},permissions:{...oZ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,J),{exists:!0,raw:{},permissions:{...oZ}}}}function iG($,J){let Z=$.padEnd(32," "),Y=J==="local"?`${iZ[J]} <- 可删除`:iZ[J];return`${Z} ${Y}`}var tZ=({onClose:$})=>{let Z=U$()==="permissions-manager",Y=s0(!1),[X,Q]=r1(0),U=H8[X].key,[q,K]=r1(dG),[G,O]=r1(lG),[z,_]=r1(!0),[F,H]=r1("list"),[N,b]=r1(""),[R,P]=r1(null),[w,D]=r1(null),B=pG(!1),W=x4(()=>p4.join(z$(),".blade","settings.local.json"),[]),L=x4(()=>p4.join(z$(),".blade","settings.json"),[]),M=x4(()=>p4.join(gG.homedir(),".blade","settings.json"),[]),V=W8(async()=>{_(!0);let U0=await Promise.all([{source:"local",path:W},{source:"project",path:L},{source:"global",path:M}].map(async({source:T,path:y})=>{let j=await aG(y);return{source:T,path:y,...j}})),f={localExists:U0.find((T)=>T.source==="local")?.exists??!1,projectExists:U0.find((T)=>T.source==="project")?.exists??!1,globalExists:U0.find((T)=>T.source==="global")?.exists??!1};O(f);let X0={allow:[],ask:[],deny:[]},$0=Object.fromEntries(U0.map((T)=>[T.source,T]));["allow","ask","deny"].forEach((T)=>{cG.forEach((y)=>{($0[y]?.permissions[T]??[]).forEach((x,s)=>{let l={key:`${y}:${s}:${x}`,rule:x,source:y};X0[T].push(l)})})}),K(X0),_(!1)});mG(()=>{V()},[V]);let C=W8(async(e,U0)=>{try{let f=p4.join(z$(),".blade","settings.local.json"),X0={allow:[],ask:[],deny:[]};try{let T=await nZ.readFile(f,"utf-8"),j=JSON.parse(T).permissions||{};X0={allow:Array.isArray(j.allow)?j.allow:[],ask:Array.isArray(j.ask)?j.ask:[],deny:Array.isArray(j.deny)?j.deny:[]}}catch(T){}let $0=U0(X0);await O$().updateConfig({permissions:$0},{scope:"local",immediate:!0}),await V()}catch(f){throw console.error("[PermissionsManager] 修改权限规则失败:",f),f}});F0((e,U0)=>{if(U0.ctrl&&e==="c"||U0.meta&&e==="c"){Y();return}if(F==="locked"){if(B.current){B.current=!1;return}H("list"),P(null),D(null);return}if(U0.escape){if(F==="list"||U==="info")$();else H("list"),b(""),P(null),D(null);return}if(F==="list"){if(U0.tab&&U0.shift)Q((f)=>(f-1+H8.length)%H8.length);else if(U0.tab)Q((f)=>(f+1)%H8.length);else if(e?.toLowerCase()==="q")$()}},{isActive:Z});let I=W8((e)=>{let U0=e.value;if(U==="info")return;if(U0.type==="add"){H("add"),b(""),D(null);return}if(U0.entry.source!=="local"){H("locked"),B.current=!0,P({tab:U,entry:U0.entry}),D({type:"error",text:U0.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}H("confirm-delete"),P({tab:U,entry:U0.entry}),D(null)}),A=W8(async()=>{if(U==="info")return;let e=N.trim();if(!e){D({type:"error",text:"Permission rule 不能为空"});return}if(q[U].map((f)=>f.rule).includes(e)){D({type:"error",text:"该规则已存在"});return}try{await C(U,(f)=>{let X0={allow:[...f.allow],ask:[...f.ask],deny:[...f.deny]};return X0[U]=[...new Set([...f[U],e])],X0}),H("list"),b(""),D({type:"success",text:"已添加本地权限规则"})}catch(f){D({type:"error",text:`保存失败: ${f instanceof Error?f.message:"未知错误"}`})}}),k=W8(async()=>{if(!R)return;let{tab:e,entry:U0}=R;try{await C(e,(f)=>{let X0={allow:[...f.allow],ask:[...f.ask],deny:[...f.deny]};return X0[e]=f[e].filter(($0)=>$0!==U0.rule),X0}),H("list"),P(null),D({type:"success",text:"已删除本地权限规则"})}catch(f){D({type:"error",text:`删除失败: ${f instanceof Error?f.message:"未知错误"}`})}}),Y0=x4(()=>{if(U==="info")return[];let e=U;return[{key:"add-new-rule",label:`› ${xG[e]}`,value:{type:"add"}},...q[e].map((f)=>({key:f.key,label:iG(f.rule,f.source),value:{type:"rule",entry:f}}))]},[U,q]),r=()=>y0(x$,{marginBottom:1,children:H8.map((e,U0)=>y0(x$,{marginRight:2,children:y0(Y$,{color:U0===X?"yellow":"gray",children:["[",e.label,"]"]},void 0,!0,void 0,this)},e.key,!1,void 0,this))},void 0,!1,void 0,this),p=()=>y0(x$,{flexDirection:"column",gap:1,children:[y0(Y$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),y0(x$,{flexDirection:"column",marginLeft:2,children:[y0(Y$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",G.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(Y$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",G.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(Y$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",G.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(x$,{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),I0=(e)=>y0(x$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:uG[e]},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(x$,{marginTop:1,children:y0(hG,{value:N,onChange:b,onSubmit:A},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),n=(e,U0)=>y0(x$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:["Delete ",e," permission rule?"]},void 0,!0,void 0,this),y0(Y$,{children:U0.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(aZ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(f)=>{if(f.value==="yes")k();else H("list"),P(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S=(e)=>y0(x$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),y0(Y$,{children:e.rule},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:e.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),v=(e)=>y0(aZ,{items:Y0,isFocused:F==="list",onSelect:I},void 0,!1,void 0,this),g=()=>{if(z)return y0(Y$,{children:"加载中..."},void 0,!1,void 0,this);if(U==="info")return p();if(F==="add")return I0(U);if(F==="confirm-delete"&&R)return n(R.tab,R.entry);if(F==="locked"&&R)return S(R.entry);return v(U)};return y0(x$,{flexDirection:"column",borderStyle:"round",borderColor:Z?"cyan":"gray",padding:1,width:80,children:[y0(Y$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),r(),y0(x$,{flexDirection:"column",gap:1,children:g()},void 0,!1,void 0,this),w&&y0(x$,{marginTop:1,children:y0(Y$,{color:w.type==="success"?"green":"red",children:w.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(x$,{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 m0,Text as b0}from"ink";import{useEffect as oG,useState as O2}from"react";import{jsxDEV as o}from"react/jsx-dev-runtime";var A9=["local","project","global"];function X5({workspaceRoot:$,onCancel:J}){let Z=U$()==="plugins-manager",Y=eZ($),X=Y.getAll(),[Q,U]=O2(0),[q,K]=O2(!1),[G,O]=O2(""),[z,_]=O2(null),[F,H]=O2("local"),[N,b]=O2(null),[R,P]=O2(0),w=Y.getBySource(),D=Y.getStats(),B=Y.getSourcePolicy(),W=s0(!1,J);oG(()=>{let A=!0;return sZ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((k)=>{if(A)b(k.settings)}).catch((k)=>{if(A)O(k instanceof Error?k.message:"无法读取插件作用域配置")}),()=>{A=!1}},[Y,R]);let L=()=>{H((A)=>{let k=A9.indexOf(A);return A9[(k+1)%A9.length]}),_(null)},M=async()=>{let A=X[Q];if(!A||q)return;if(A.source==="cli"){O(`${A.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(A.status==="error"){O(A.error??`${A.manifest.name} 当前不可用`);return}K(!0),O("");try{let k=await $5(Y.getWorkspaceRoot(),A.manifest.name,A.status!=="active",F);O(k.effectiveEnabled?`已启用 ${A.manifest.name} · 生效层级 ${k.effectiveScope}`:`已禁用 ${A.manifest.name} · 生效层级 ${k.effectiveScope}`),P((Y0)=>Y0+1)}catch(k){O(k instanceof Error?k.message:String(k))}finally{K(!1)}},V=async()=>{if(q)return;K(!0),O("");try{await J5(Y.getWorkspaceRoot()),U(0),O("插件列表已刷新"),P((A)=>A+1)}catch(A){O(A instanceof Error?A.message:String(A))}finally{K(!1)}},C=async()=>{let A=X[Q];if(!A||q)return;if(!A.installation){O(`${A.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}K(!0),_(null),O("");try{let{result:k}=await Y5(Y.getWorkspaceRoot(),A.manifest.name,{trusted:!0});if(!k.success)throw Error(k.error);O(k.changed?`已更新 ${A.manifest.name} 到 ${k.installation?.revision}`:`${A.manifest.name} 已是最新版本`),P((Y0)=>Y0+1)}catch(k){O(k instanceof Error?k.message:String(k))}finally{K(!1)}},I=async()=>{let A=X[Q];if(!A||q)return;if(!A.installation){O(`${A.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(z!==A.manifest.name){_(A.manifest.name),O(`再次按 x 确认卸载 ${A.manifest.name}`);return}K(!0),O("");try{let{result:k}=await Z5(Y.getWorkspaceRoot(),A.manifest.name,!0);if(!k.success)throw Error(k.error);_(null),U(0),O(`已卸载 ${A.manifest.name}`),P((Y0)=>Y0+1)}catch(k){O(k instanceof Error?k.message:String(k))}finally{K(!1)}};if(F0((A,k)=>{if(k.escape)J?.();else if(k.ctrl&&A==="c"||k.meta&&A==="c")W();else if((k.upArrow||A==="k")&&X.length>0)_(null),U((Y0)=>(Y0-1+X.length)%X.length);else if((k.downArrow||A==="j")&&X.length>0)_(null),U((Y0)=>(Y0+1)%X.length);else if(A===" "||k.return)M();else if(A==="r")V();else if(A==="s")L();else if(A==="u")C();else if(A==="x")I()},{isActive:Z}),X.length===0)return o(m0,{flexDirection:"column",paddingY:1,children:[o(m0,{marginBottom:1,children:o(b0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(m0,{paddingLeft:2,children:o(b0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(m0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[o(b0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),o(b0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),o(b0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),o(b0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),o(m0,{marginTop:1,paddingLeft:2,children:o(b0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(m0,{marginTop:1,children:o(b0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return o(m0,{flexDirection:"column",paddingY:1,children:[o(m0,{marginBottom:1,children:[o(b0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),o(b0,{color:"gray",children:[" (共 ",D.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),o(m0,{paddingLeft:2,marginBottom:1,children:o(b0,{color:"gray",children:["启用: ",D.active," | 禁用: ",D.inactive," | 命令: ",D.commands," | 技能:"," ",D.skills," | 代理: ",D.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o(m0,{paddingLeft:2,marginBottom:1,children:o(b0,{color:"gray",children:["来源策略: ",B.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",B.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o(m0,{paddingLeft:2,marginBottom:1,children:o(b0,{color:"gray",children:["写入层级: ",o(b0,{color:"cyan",children:F},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),w.cli.length>0&&o(m0,{flexDirection:"column",marginBottom:1,children:[o(m0,{paddingLeft:1,children:[o(b0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),o(b0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w.cli.map((A)=>{let k=A.status==="active"?"[on]":"[off]",Y0=X.indexOf(A)===Q;return o(m0,{flexDirection:"column",paddingLeft:2,children:[o(b0,{children:[o(b0,{bold:!0,color:Y0?"cyan":"green",children:[Y0?"› ":" ",k," ",A.manifest.name]},void 0,!0,void 0,this),o(b0,{color:"gray",children:[" v",A.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),o(m0,{paddingLeft:2,children:o(b0,{color:"gray",children:A.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(m0,{paddingLeft:2,children:o(b0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A.commands.length>0&&o(m0,{paddingLeft:2,children:o(b0,{color:"blue",children:["命令:"," ",A.commands.map((r)=>`/${r.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},A.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),w.project.length>0&&o(m0,{flexDirection:"column",marginBottom:1,children:[o(m0,{paddingLeft:1,children:[o(b0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),o(b0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w.project.map((A)=>{let k=A.status==="active"?"[on]":"[off]",Y0=X.indexOf(A)===Q;return o(m0,{flexDirection:"column",paddingLeft:2,children:[o(b0,{children:[o(b0,{bold:!0,color:Y0?"cyan":"green",children:[Y0?"› ":" ",k," ",A.manifest.name]},void 0,!0,void 0,this),o(b0,{color:"gray",children:[" v",A.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),o(m0,{paddingLeft:2,children:o(b0,{color:"gray",children:A.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(m0,{paddingLeft:2,children:o(b0,{color:"gray",dimColor:!0,children:["生效层级:"," ",N?.[A.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),A.commands.length>0&&o(m0,{paddingLeft:2,children:o(b0,{color:"blue",children:["命令:"," ",A.commands.map((r)=>`/${r.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},A.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),w.user.length>0&&o(m0,{flexDirection:"column",marginBottom:1,children:[o(m0,{paddingLeft:1,children:[o(b0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),o(b0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w.user.map((A)=>{let k=A.status==="active"?"[on]":"[off]",Y0=X.indexOf(A)===Q;return o(m0,{flexDirection:"column",paddingLeft:2,children:[o(b0,{children:[o(b0,{bold:!0,color:Y0?"cyan":"green",children:[Y0?"› ":" ",k," ",A.manifest.name]},void 0,!0,void 0,this),o(b0,{color:"gray",children:[" v",A.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),o(m0,{paddingLeft:2,children:o(b0,{color:"gray",children:A.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(m0,{paddingLeft:2,children:o(b0,{color:"gray",dimColor:!0,children:["生效层级:"," ",N?.[A.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),A.commands.length>0&&o(m0,{paddingLeft:2,children:o(b0,{color:"blue",children:["命令:"," ",A.commands.map((r)=>`/${r.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},A.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),o(m0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[o(b0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),o(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),o(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),o(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),o(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),o(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),o(m0,{marginTop:1,children:o(b0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&o(m0,{marginTop:1,children:o(b0,{color:G.includes("失败")?"red":"cyan",children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),q&&o(b0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as C$,Text as R$,useStdout as nG}from"ink";import tG from"ink-text-input";import P9,{useCallback as F8,useMemo as sG,useState as a1}from"react";import{jsxDEV as j0}from"react/jsx-dev-runtime";var eG=P9.memo(({option:$,index:J,isSelected:Z,isMultiSelect:Y,isHighlighted:X})=>j0(C$,{flexDirection:"column",marginBottom:1,children:[j0(R$,{color:X?"yellow":Z?"green":void 0,bold:X,children:[Y?Z?"(*) ":"( ) ":X?"> ":" ",J+1,". ",$.label]},void 0,!0,void 0,this),j0(C$,{marginLeft:4,children:j0(R$,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),$q=P9.memo(({questions:$,answers:J})=>j0(C$,{flexDirection:"column",marginBottom:1,children:$.map((Z)=>{let Y=J[Z.header],X=Array.isArray(Y)?Y.join(", "):Y||"(no answer)";return j0(C$,{marginBottom:1,children:[j0(R$,{backgroundColor:"blue",color:"white",children:[" ",Z.header," "]},void 0,!0,void 0,this),j0(R$,{color:"green",children:[" ",X]},void 0,!0,void 0,this)]},Z.header,!0,void 0,this)})},void 0,!1,void 0,this)),Q5=P9.memo(({questions:$,onComplete:J,onCancel:Z})=>{let{stdout:Y}=nG(),X=Y.columns||80,U=U$()==="confirmation-prompt",q=s0(!1),[K,G]=a1("answering"),[O,z]=a1(0),[_,F]=a1({}),[H,N]=a1(0),[b,R]=a1([]),[P,w]=a1(!1),[D,B]=a1(""),[W,L]=a1(0),M=$[O],V=sG(()=>{if(!M)return[];return[...M.options.map((r)=>({label:r.label,value:r.label,description:r.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[M]),C=F8((r)=>{let p={..._,[M.header]:r};if(F(p),O<$.length-1)z(O+1),N(0),R([]),w(!1),B("");else G("submit"),L(0)},[_,M?.header,O,$.length]),I=F8((r)=>{let p=V[r];if(!p)return;if(p.value==="__other__"){w(!0);return}if(M.multiSelect)R((I0)=>I0.includes(p.value)?I0.filter((n)=>n!==p.value):[...I0,p.value]);else C(p.value)},[V,M?.multiSelect,C]),A=F8((r)=>{if(r.trim())C(r.trim())},[C]),k=F8(()=>{G("answering"),z(0),N(0),R([]),w(!1)},[]),Y0=F8(()=>{J(_)},[_,J]);if(F0((r,p)=>{if(p.ctrl&&r==="c"||p.meta&&r==="c"){q();return}if(P){if(p.escape)w(!1),B("");return}if(p.escape){Z();return}let I0=parseInt(r);if(I0>=1&&I0<=V.length){I(I0-1);return}if(p.upArrow){N((n)=>n>0?n-1:V.length-1);return}if(p.downArrow||p.tab){N((n)=>n<V.length-1?n+1:0);return}if(p.return){if(M.multiSelect&&b.length>0)C(b);else I(H);return}if(r===" "&&M.multiSelect){let n=V[H];if(n&&n.value!=="__other__")R((S)=>S.includes(n.value)?S.filter((v)=>v!==n.value):[...S,n.value]);return}},{isActive:U&&K==="answering"&&!P}),F0((r,p)=>{if(p.ctrl&&r==="c"||p.meta&&r==="c"){q();return}if(p.escape){Z();return}if(p.upArrow||p.downArrow||p.tab){L((I0)=>I0===0?1:0);return}if(p.return){if(W===0)Y0();else k();return}if(r.toLowerCase()==="y"){Y0();return}if(r.toLowerCase()==="e"){k();return}},{isActive:U&&K==="submit"}),K==="submit")return j0(C$,{flexDirection:"column",borderStyle:"round",borderColor:U?"green":"gray",padding:1,width:Math.min(X-4,80),children:[j0(C$,{marginBottom:1,children:j0(R$,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j0($q,{questions:$,answers:_},void 0,!1,void 0,this),j0(C$,{flexDirection:"column",marginTop:1,children:[j0(R$,{color:W===0?"yellow":void 0,bold:W===0,children:[W===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),j0(R$,{color:W===1?"yellow":void 0,bold:W===1,children:[W===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j0(C$,{marginTop:1,children:j0(R$,{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(!M)return null;return j0(C$,{flexDirection:"column",borderStyle:"round",borderColor:U?"cyan":"gray",padding:1,width:Math.min(X-4,80),children:[j0(C$,{marginBottom:1,children:[j0(R$,{backgroundColor:"blue",color:"white",children:[" ",M.header," "]},void 0,!0,void 0,this),j0(R$,{children:[" ",M.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),P?j0(C$,{flexDirection:"column",marginTop:1,children:[j0(R$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),j0(C$,{marginTop:1,children:[j0(R$,{color:"cyan",children:"> "},void 0,!1,void 0,this),j0(tG,{value:D,onChange:B,onSubmit:A,focus:U},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j0(C$,{marginTop:1,children:j0(R$,{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):j0(C$,{flexDirection:"column",children:V.map((r,p)=>j0(eG,{option:r,index:p,isSelected:b.includes(r.value),isMultiSelect:M.multiSelect,isHighlighted:H===p},r.value,!1,void 0,this))},void 0,!1,void 0,this),!P&&j0(C$,{marginTop:1,flexDirection:"column",children:[j0(R$,{color:"gray",children:M.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),M.multiSelect&&b.length>0&&j0(R$,{color:"green",children:["Selected: ",b.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&j0(C$,{marginTop:1,children:j0(R$,{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 T9,Text as y1,useStdout as qq}from"ink";import{useEffect as C9,useMemo as d4,useRef as _2,useState as N2}from"react";function Jq($,J){return[...$,J].join(`
|
|
160
|
+
`).replace(/\n+$/,"")}function r2($){let J=2166136261;for(let Z=0;Z<$.length;Z++)J^=$.charCodeAt(Z),J=Math.imul(J,16777619);return`${$.length}:${(J>>>0).toString(16)}`}function q5({messages:$,currentStreamingMessageId:J,streamingLines:Z,streamingTail:Y,currentThinkingContent:X,pendingCommands:Q}){let U=Jq(Z,Y),q=[];for(let K of $){let G=K.id===J?U:K.content,O=K.metadata&&"phase"in K.metadata?String(K.metadata.phase):"",z=K.id===J?X??K.thinkingContent:K.thinkingContent;if(K.role==="assistant"&&z)q.push({id:`${K.id}:thinking`,messageId:K.id,role:"assistant",kind:"thinking",content:z,revision:`${K.timestamp}:thinking:${r2(z)}`,collapsible:!0});let _=K.role==="tool"&&K.metadata&&"detail"in K.metadata&&typeof K.metadata.detail==="string"&&K.metadata.detail.length>0?K.metadata.detail:void 0;q.push({id:K.id,messageId:K.id,role:K.role,kind:K.role==="tool"?"tool":"message",content:G,detail:_,revision:`${K.timestamp}:${r2(G)}:${r2(_??"")}:${O}`,collapsible:_!==void 0})}if(J&&!q.some((K)=>K.id===J)){if(X)q.push({id:`${J}:thinking`,messageId:J,role:"assistant",kind:"thinking",content:X,revision:`stream:thinking:${r2(X)}`,collapsible:!0});q.push({id:J,messageId:J,role:"assistant",kind:"message",content:U,revision:`stream:${r2(U)}`,collapsible:!1})}for(let[K,G]of Q.entries())q.push({id:`pending:${K}:${G.displayText}`,messageId:`pending:${K}`,role:"user",kind:"message",content:G.displayText,revision:`pending:${r2(G.displayText)}`,pending:!0,collapsible:!1});return q}var U5={user:"> ",assistant:"• ",system:" ",tool:"└ "};function u4($,J,Z){let Y=J.text.length>0?J.text.split(`
|
|
161
|
+
`):[""],X=[];for(let[Q,U]of Y.entries()){let q=X.length===0?J.firstPrefix:J.nextPrefix,K=Math.max(1,Z-q.length),G=h2(U,K,!0),O=0;for(let z of G){let _=z.length>0?U.indexOf(z,O):O,F=_>=0?_:O,H=F+z.length,N=X.length===0?J.firstPrefix:J.nextPrefix;X.push({key:`${$.id}:${J.key}:${Q}:${X.length}`,blockId:$.id,role:$.role,kind:$.kind,text:`${N}${z}`,copyText:z,pending:$.pending===!0,header:J.header&&X.length===0,sourceLine:J.sourceLineOffset+Q,sourceStart:F,sourceEnd:H,sourceTextOffset:N.length}),O=H}}return X}function G5($){return $.length===0?0:$.split(`
|
|
162
|
+
`).length}function Yq($){let J=$.split(`
|
|
163
|
+
`)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function b9($,J,Z=!1){if($.kind==="thinking"){let Y=Z?"[-]":"[+]",X=Yq($.content),Q=`${Y} Thinking (${G5($.content)} lines)${!Z&&X?` - ${X}`:""}`,U={key:`${$.id}:header`,blockId:$.id,role:$.role,kind:$.kind,text:`? ${Q}`,copyText:Q,pending:$.pending===!0,header:!0,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:2};if(!Z)return[U];return[U,...u4($,{text:$.content,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:0,key:"thinking",header:!1},J)]}if($.kind==="tool"&&$.detail){let Y=Z?"[-]":"[+]",X=u4($,{text:$.content,firstPrefix:`${U5.tool}${Y} `,nextPrefix:" ",sourceLineOffset:0,key:"summary",header:!0},J);if(!Z)return X;return[...X,...u4($,{text:$.detail,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:G5($.content),key:"detail",header:!1},J)]}return u4($,{text:$.content.length>0?$.content:"…",firstPrefix:U5[$.role],nextPrefix:" ",sourceLineOffset:0,key:"content",header:!0},J)}function K5($,J,Z=new Set){return $.flatMap((Y,X)=>{let Q=b9(Y,J,Z.has(Y.id));if(X===$.length-1)return Q;return[...Q,{key:`${Y.id}:separator`,blockId:Y.id,role:Y.role,kind:Y.kind,text:"",copyText:"",pending:Y.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})}function Zq($){if($.kind==="tool"&&$.detail)return[...$.content.split(`
|
|
164
|
+
`),...$.detail.split(`
|
|
165
|
+
`)];return $.content.split(`
|
|
166
|
+
`)}function Xq($,J){let Z=[];for(let[Y,X]of Zq($).entries())for(let Q of X.matchAll(J)){let U=Q.index,q=Q[0];if(q.length===0)continue;Z.push({blockId:$.id,sourceLine:Y,start:U,end:U+q.length})}return Z}class L8{cache=new Map;search($,J){if(J.length===0)return[];let Z=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Y=new RegExp(Z,"giu"),X=new Set($.map((Q)=>Q.id));for(let Q of this.cache.keys())if(!X.has(Q))this.cache.delete(Q);return $.flatMap((Q)=>{let U=this.cache.get(Q.id);if(U?.revision===Q.revision&&U.query===J)return U.matches;let q=Xq(Q,Y);return this.cache.set(Q.id,{revision:Q.revision,query:J,matches:q}),q})}}function M9($,J){let Z=$.findIndex((Y)=>Y.blockId===J.blockId&&Y.sourceLine===J.sourceLine&&J.start>=Y.sourceStart&&J.start<Math.max(Y.sourceEnd,Y.sourceStart+1));if(Z>=0)return Z;return $.findIndex((Y)=>Y.blockId===J.blockId)}function z5($,J){if($.sourceLine===null||$.sourceEnd<=$.sourceStart)return[];let Z=[];for(let[Y,X]of J.entries()){if(X.blockId!==$.blockId||X.sourceLine!==$.sourceLine||X.end<=$.sourceStart||X.start>=$.sourceEnd)continue;Z.push({start:$.sourceTextOffset+Math.max($.sourceStart,X.start)-$.sourceStart,end:$.sourceTextOffset+Math.min($.sourceEnd,X.end)-$.sourceStart,matchIndex:Y})}return Z}function O5($,J,Z){let Y=Math.max(0,Math.min(J,Z)),X=Math.min($.length-1,Math.max(J,Z));if(X<Y)return"";let Q=$.slice(Y,X+1),U="";for(let[q,K]of Q.entries()){if(q===0){U=K.copyText;continue}let G=Q[q-1],O=K.sourceLine!==null&&K.blockId===G.blockId&&K.sourceLine===G.sourceLine;U+=`${O?"":`
|
|
167
|
+
`}${K.copyText}`}return U}function _5($,J){let Z=new Map($.map((Y)=>[Y.id,Y.revision]));return J.filter((Y)=>Z.get(Y.id)!==Y.revision).map((Y)=>Y.id)}import{spawn as Qq}from"node:child_process";function Uq($){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 Gq($,J,Z){return new Promise((Y)=>{let X=!1,Q=Qq($,[...J],{stdio:["pipe","ignore","ignore"]}),U=setTimeout(()=>{if(X)return;X=!0,Q.kill("SIGKILL"),Y(!1)},2000),q=(K)=>{if(X)return;X=!0,clearTimeout(U),Y(K)};Q.once("error",()=>q(!1)),Q.once("close",(K)=>q(K===0)),Q.stdin.once("error",()=>q(!1)),Q.stdin.end(Z)})}function N5($,J=!1){let Z=`\x1B]52;c;${Buffer.from($,"utf8").toString("base64")}\x07`;if(!J)return Z;return`\x1BPtmux;${Z.replaceAll("\x1B","\x1B\x1B")}\x1B\\`}async function c4($,J={}){if($.length===0)return{success:!1};let Z=J.platform??process.platform,Y=J.env??process.env,X=J.runCommand??Gq,Q=J.writeTerminal??((K)=>process.stdout.write(K)),U=Boolean(Y.SSH_CONNECTION),q=async(K)=>{try{return await X(K.command,K.args,$)}catch{return!1}};if(!U){for(let K of Uq(Z))if(await q(K))return{success:!0,method:"native"}}if(Y.TMUX){if(await q({command:"tmux",args:["load-buffer","-w","-"]})){try{Q(N5($,!0))}catch{}return{success:!0,method:"tmux"}}}try{return Q(N5($)),{success:!0,method:"osc52"}}catch{return{success:!1}}}import{jsxDEV as n$}from"react/jsx-dev-runtime";function Kq($){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 zq($,J,Z){let Y=Array.from($.value);if(Z.backspace||Z.delete){if($.cursor===0)return $;return Y.splice($.cursor-1,1),{value:Y.join(""),cursor:$.cursor-1}}if(Z.leftArrow)return{...$,cursor:Math.max(0,$.cursor-1)};if(Z.rightArrow)return{...$,cursor:Math.min(Y.length,$.cursor+1)};if(!J||Z.ctrl||Z.meta)return $;return Y.splice($.cursor,0,...Array.from(J)),{value:Y.join(""),cursor:$.cursor+Array.from(J).length}}var W5=({state:$,onLoadOlder:J,onFork:Z,onClose:Y})=>{let X=U$(),{width:Q,height:U}=V2(),{stdout:q}=qq(),K=Math.max(20,Q-4),G=Math.max(1,U-8),O=d4(()=>Kq($.messages),[$.messages]),z=d4(()=>K5(O,K),[O,K]),_=Math.max(0,z.length-G),[F,H]=N2(0),N=_2(0),[b,R]=N2(()=>Math.max(0,z.length-1)),P=_2(b),w=_2(z.at(-1)?.key??null),[D,B]=N2(!1),W=_2(!1),[L,M]=N2({value:"",cursor:0}),V=_2(L),[C,I]=N2(""),[A,k]=N2(0),Y0=_2(new L8),r=_2(null),[p,I0]=N2(null),n=d4(()=>$.session?{viewGeneration:$.viewGeneration,locator:$.session.locator,snapshot:$.snapshot,olderCursor:$.olderCursor}:void 0,[$.olderCursor,$.session,$.snapshot,$.viewGeneration]);N.current=F,P.current=b,W.current=D,V.current=L;let S=d4(()=>Y0.current.search(O,C),[O,C]);C9(()=>{r.current=null},[$.olderCursor]),C9(()=>{if($.status==="error")r.current=null},[$.status]),C9(()=>{let l=w.current?z.findIndex((a)=>a.key===w.current):-1,_0=z.length===0?0:l>=0?l:z.length-1;P.current=_0,w.current=z[_0]?.key??null,R(_0);let N0=Math.max(0,Math.min(N.current,_));N.current=N0,H(N0)},[z,_]);let v=()=>{let l=$.olderCursor;if(!l||!n||!$.session?.capabilities.history.read||$.status!=="ready"&&$.status!=="error")return;if(r.current===l)return;r.current=l,J(n)},g=(l,_0=!0)=>{let N0=Math.max(0,Math.min(_,l));N.current=N0,H(N0);let a=Math.max(1,z.length-N0),L0=Math.max(0,a-G),q0=Math.max(L0,Math.min(a-1,P.current));if(P.current=q0,w.current=z[q0]?.key??null,R(q0),_0&&N0===_)v()},e=(l)=>{if(S.length===0)return;let _0=(l%S.length+S.length)%S.length,N0=S[_0],a=z.findIndex((q0)=>q0.blockId===N0.blockId);if(k(_0),a<0)return;P.current=a,w.current=z[a]?.key??null,R(a);let L0=Math.max(0,z.length-Math.min(z.length,a+1));g(L0,!1)},U0=()=>{let l=z[P.current];if(!l)return;c4(l.copyText,{writeTerminal:(_0)=>q.write(_0)}).then((_0)=>{I0(_0.success?"Copied":"Copy failed")})};F0((l,_0)=>{let N0=_0;if(W.current){if(N0.escape)return W.current=!1,B(!1),!0;if(N0.return){let L0=V.current.value;I(L0),W.current=!1,B(!1);let q0=Y0.current.search(O,L0);if(q0.length>0){let u0=q0[0],Z$=z.findIndex((g0)=>g0.blockId===u0.blockId);if(k(0),Z$>=0)P.current=Z$,w.current=z[Z$]?.key??null,R(Z$),g(Math.max(0,z.length-Math.min(z.length,Z$+1)),!1)}return!0}let a=zq(V.current,l,N0);return V.current=a,M(a),!0}if(N0.escape||l==="q")return Y(),!0;if(l==="/"){let a={value:C,cursor:Array.from(C).length};return V.current=a,M(a),W.current=!0,B(!0),!0}if(l==="n"&&S.length>0)return e(A+1),!0;if(l==="N"&&S.length>0)return e(A-1),!0;if(l==="y")return U0(),!0;if(l==="f"){if(n&&$.session?.capabilities.history.fork&&$.status==="ready")Z(n);return!0}if(N0.home||l==="g")return P.current=0,w.current=z[0]?.key??null,R(0),g(_),!0;if(N0.end||l==="G")return P.current=Math.max(0,z.length-1),w.current=z[P.current]?.key??null,R(P.current),g(0),!0;if(N0.pageUp)return g(N.current+Math.max(1,G-1)),!0;if(N0.pageDown)return g(N.current-Math.max(1,G-1)),!0;if(N0.upArrow||l==="k")return P.current=Math.max(0,P.current-1),w.current=z[P.current]?.key??null,R(P.current),g(N.current+1),!0;if(N0.downArrow||l==="j")return P.current=Math.min(z.length-1,P.current+1),w.current=z[P.current]?.key??null,R(P.current),g(N.current-1),!0;return!0},{isActive:X==="session-history-viewer",priority:200});let f=Math.max(0,z.length-F),X0=Math.max(0,f-G),$0=z.slice(X0,f),T=C?`/${C} ${S.length>0?`${A+1}/${S.length}`:"0/0"} · loaded pages only`:null,y=$.session,j=[y&&!y.capabilities.history.read?"Older history unavailable":null,y&&!y.capabilities.history.fork?"Fork unavailable":null].filter((l)=>l!==null).join(" · "),x=$.status==="loading"?"Loading Session history…":$.status==="forking"?"Forking Session history…":$.status==="loading-older"?"Loading older history…":null,s=$.error?.message??x??p??T??(j||`${$.status==="loading-older"?"Loading older history… · ":""}/ search · y copy · f fork · Esc close`);return n$(T9,{flexDirection:"column",width:"100%",height:U,paddingX:2,children:[n$(T9,{justifyContent:"space-between",children:[n$(y1,{bold:!0,color:"cyan",children:y?.title?.trim()||"Session history"},void 0,!1,void 0,this),n$(y1,{color:"yellow",children:["Remote · ",y?.capabilities.connection??"offline"," · History only"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),n$(y1,{dimColor:!0,children:y?.displayCwd??""},void 0,!1,void 0,this),$.truncated?n$(y1,{color:"yellow",children:"History content was truncated."},void 0,!1,void 0,this):null,n$(T9,{flexDirection:"column",height:G,children:$0.map((l,_0)=>n$(y1,{color:X0+_0===b?"cyan":void 0,children:l.text},l.key,!1,void 0,this))},void 0,!1,void 0,this),D?n$(y1,{children:["/",L.value]},void 0,!0,void 0,this):null,n$(y1,{color:$.error?"red":"gray",children:s},void 0,!1,void 0,this),n$(y1,{dimColor:!0,children:"Open this Session from its ACP owner to continue."},void 0,!1,void 0,this),n$(y1,{dimColor:!0,children:"Files and terminal are unavailable in history-only mode."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as w8,Text as Z1}from"ink";import Oq from"ink-select-input";import{useEffect as H5,useMemo as W2,useRef as F5,useState as L5}from"react";import{jsxDEV as M$}from"react/jsx-dev-runtime";function _q($){let J=new Date($),Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/86400000);if(X===0)return`今天 ${J.getHours().toString().padStart(2,"0")}:${J.getMinutes().toString().padStart(2,"0")}`;if(X===1)return"昨天";if(X<7)return`${X}天前`;return`${J.getMonth()+1}/${J.getDate()}`}var Nq=({isSelected:$})=>M$(w8,{marginRight:1,children:M$(Z1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),Wq=({isSelected:$,label:J})=>M$(Z1,{color:$?"cyan":"white",bold:$,children:J},void 0,!1,void 0,this),B8=20,B5=({intent:$,sessions:J,taskAttentionUnreadKeys:Z=[],onSelect:Y,onCancel:X})=>{let[Q,U]=L5(0),[q,K]=L5(!1),G=F5(!1),O=F5(!0);H5(()=>{return O.current=!0,()=>{O.current=!1}},[]);let _=U$()==="session-selector",F=s0(!1);F0((W,L)=>{if(L.ctrl&&W==="c"||L.meta&&W==="c"){F();return}if(G.current)return;if(L.escape&&X){X();return}if(L.leftArrow||W==="h"||W==="H"){if(Q>0)U((M)=>M-1);return}if(L.rightArrow||W==="l"||W==="L"){if(Q<R-1)U((M)=>M+1);return}},{isActive:_});let H=W2(()=>o8(J,$),[$,J]),N=W2(()=>gY($),[$]),b=W2(()=>new Set(Z),[Z]),R=W2(()=>Math.max(1,Math.ceil(H.length/B8)),[H.length]),P=W2(()=>{let W=Q*B8;return H.slice(W,W+B8)},[Q,H]),w=W2(()=>{return P.map((W)=>{let L=_q(W.lastMessageTime);return{key:g1(W),label:hY(W,L,$==="resume"&&b.has(DY(W))),value:W}})},[$,P,b]),D=W2(()=>({start:Q*B8+1,end:Math.min((Q+1)*B8,H.length)}),[Q,H.length]);H5(()=>{U(0)},[H.length]);let B=(W)=>{if(G.current)return;G.current=!0,K(!0);let L=()=>{if(!O.current)return;G.current=!1,K(!1)};Promise.resolve().then(()=>Y(W.value)).then(L,L)};if(H.length===0)return M$(w8,{flexDirection:"column",paddingX:2,paddingY:1,children:[M$(Z1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),M$(Z1,{dimColor:!0,children:[`
|
|
168
|
+
`,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return M$(w8,{flexDirection:"column",paddingX:2,paddingY:1,children:[M$(Z1,{bold:!0,color:"cyan",children:N.title},void 0,!1,void 0,this),M$(Z1,{dimColor:!0,children:[`
|
|
169
|
+
`,N.instructions,`
|
|
170
|
+
`]},void 0,!0,void 0,this),M$(Oq,{items:w,onSelect:B,isFocused:_&&!q,indicatorComponent:Nq,itemComponent:Wq},void 0,!1,void 0,this),q&&M$(Z1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),M$(w8,{marginTop:1,flexDirection:"column",children:[M$(Z1,{dimColor:!0,children:["第 ",Q+1,"/",R," 页 · 共 ",H.length," 个会话 · 显示"," ",D.start,"-",D.end]},void 0,!0,void 0,this),R>1&&M$(w8,{marginTop:1,children:[M$(Z1,{color:Q>0?"cyan":"gray",children:Q>0?"<< 上一页":" "},void 0,!1,void 0,this),M$(Z1,{children:" "},void 0,!1,void 0,this),M$(Z1,{color:Q<R-1?"cyan":"gray",children:Q<R-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 w5,Text as A8}from"ink";import Hq,{useEffect as Fq,useState as Lq}from"react";import{jsxDEV as i1}from"react/jsx-dev-runtime";var A5=["|","/","-","\\"],R9=Hq.memo(()=>{let $=y8(),J=V0(),Z=f2(),[Y,X]=Lq(0);if(Fq(()=>{if($?.status!=="loading"){X(0);return}let Q=setInterval(()=>{X((U)=>(U+1)%A5.length)},100);return()=>clearInterval(Q)},[$?.status]),!$)return null;return i1(w5,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[i1(w5,{children:[i1(A8,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),i1(A8,{color:J.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&i1(A8,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&i1(A8,{color:J.colors.text.secondary,children:[A5[Y]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&i1(A8,{color:J.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this),$.status==="completed"&&$.response&&i1(K1,{content:$.response,role:"assistant",terminalWidth:Math.max(20,Z-8),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});R9.displayName="SideConversationPanel";import{Box as _$,Text as n0}from"ink";import{jsxDEV as w0}from"react/jsx-dev-runtime";function b5({onCancel:$}){let J=G1(),Z=U$()==="skills-manager",X=P5({cwd:J}).getAll(),Q=X.filter((G)=>G.source==="builtin"),U=X.filter((G)=>G.source==="user"),q=X.filter((G)=>G.source==="project"),K=s0(!1,$);if(F0((G,O)=>{if(O.escape)$?.();else if(O.ctrl&&G==="c"||O.meta&&G==="c")K()},{isActive:Z}),X.length===0)return w0(_$,{flexDirection:"column",paddingY:1,children:[w0(_$,{marginBottom:1,children:w0(n0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w0(_$,{paddingLeft:2,children:w0(n0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w0(_$,{marginTop:1,paddingLeft:2,children:w0(n0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w0(_$,{marginTop:1,children:w0(n0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return w0(_$,{flexDirection:"column",paddingY:1,children:[w0(_$,{marginBottom:1,children:[w0(n0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),w0(n0,{color:"gray",children:[" (找到 ",X.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.length>0&&w0(_$,{flexDirection:"column",marginBottom:1,children:[w0(_$,{paddingLeft:1,children:[w0(n0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),w0(n0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.map((G)=>{let z=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return w0(_$,{flexDirection:"column",paddingLeft:2,children:[w0(n0,{children:[w0(n0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),w0(n0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&w0(_$,{paddingLeft:2,children:w0(n0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),w0(_$,{paddingLeft:2,children:w0(n0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),U.length>0&&w0(_$,{flexDirection:"column",marginBottom:1,children:[w0(_$,{paddingLeft:1,children:[w0(n0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),w0(n0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((G)=>{let z=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return w0(_$,{flexDirection:"column",paddingLeft:2,children:[w0(n0,{children:[w0(n0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),w0(n0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&w0(_$,{paddingLeft:2,children:w0(n0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),w0(_$,{paddingLeft:2,children:w0(n0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q.length>0&&w0(_$,{flexDirection:"column",marginBottom:1,children:[w0(_$,{paddingLeft:1,children:[w0(n0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),w0(n0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q.map((G)=>{let z=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return w0(_$,{flexDirection:"column",paddingLeft:2,children:[w0(n0,{children:[w0(n0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),w0(n0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.userInvocable&&w0(_$,{paddingLeft:2,children:w0(n0,{color:"blue",children:["命令: /",G.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),w0(_$,{marginTop:1,children:w0(n0,{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 M5,Text as X1}from"ink";import Bq,{useEffect as wq,useMemo as Aq,useState as T5}from"react";import{jsxDEV as y$,Fragment as y9}from"react/jsx-dev-runtime";var C5=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function Pq($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let Z=Math.floor(J/60),Y=J%60;return`${Z}m ${Y}s`}var R5=Bq.memo(()=>{let $=z0((G)=>G.app.subagentProgresses),J=z0((G)=>G.app.subagentProgress),Z=V0(),[Y,X]=T5(0),[Q,U]=T5(()=>Date.now()),q=Aq(()=>{let G=Object.values($);return G.length>0?G:J?[J]:[]},[J,$]),K=q.some((G)=>G.status==="running");if(wq(()=>{if(!K){X(0);return}let G=setInterval(()=>{X((z)=>(z+1)%C5.length)},80),O=setInterval(()=>{U(Date.now())},1000);return()=>{clearInterval(G),clearInterval(O)}},[K]),q.length===0)return null;return y$(M5,{paddingX:2,paddingY:0,flexDirection:"column",children:q.map((G)=>{let O=G.status==="running"?C5[Y]:G.status==="completed"?"[OK]":"[X]",z=G.status==="running"?Z.colors.info:G.status==="completed"?Z.colors.success:Z.colors.error,_=Math.max(0,Q-G.startTime);return y$(M5,{flexDirection:"row",gap:1,children:[y$(X1,{color:z,bold:!0,children:O},void 0,!1,void 0,this),y$(X1,{color:Z.colors.muted,children:"Subagent"},void 0,!1,void 0,this),y$(X1,{color:Z.colors.text.primary,bold:!0,children:G.type},void 0,!1,void 0,this),y$(X1,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),y$(X1,{color:Z.colors.text.secondary,children:G.description},void 0,!1,void 0,this),G.currentTool&&y$(y9,{children:[y$(X1,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),y$(X1,{color:Z.colors.warning,children:G.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.status==="running"&&_>0&&y$(y9,{children:[y$(X1,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),y$(X1,{color:Z.colors.info,children:Pq(_)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.status==="failed"&&G.terminalSummary&&y$(y9,{children:[y$(X1,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),y$(X1,{color:Z.colors.error,children:G.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},G.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as a2,Text as I1}from"ink";import bq from"react";import{jsxDEV as v$}from"react/jsx-dev-runtime";var I9={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},S9=bq.memo(()=>{let $=e9().filter((Z)=>Z.status!=="deleted"),J=V0();if($.length===0)return null;return v$(a2,{flexDirection:"column",paddingX:2,children:$.map((Z)=>{let Y=Z.tasks.filter((X)=>X.status==="completed").length;return v$(a2,{flexDirection:"column",marginBottom:1,children:[v$(a2,{gap:1,children:[v$(I1,{bold:!0,color:Z.status==="failed"?J.colors.error:Z.status==="completed"?J.colors.success:J.colors.info,children:[I9[Z.status]," Team"]},void 0,!0,void 0,this),v$(I1,{bold:!0,color:J.colors.text.primary,children:Z.name},void 0,!1,void 0,this),v$(I1,{color:J.colors.muted,children:["| ",Z.members.length-1," members | ",Y,"/",Z.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),v$(a2,{flexDirection:"column",paddingLeft:2,children:[Z.members.filter((X)=>X.status!=="leader").map((X)=>v$(a2,{gap:1,children:[v$(I1,{color:J.colors.muted,children:I9[X.status]},void 0,!1,void 0,this),v$(I1,{color:J.colors.text.secondary,children:X.name},void 0,!1,void 0,this),v$(I1,{color:J.colors.muted,children:["(",X.subagentType,", ",X.status,X.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},X.id,!0,void 0,this)),Z.tasks.map((X)=>v$(a2,{gap:1,children:[v$(I1,{color:J.colors.muted,children:I9[X.status]},void 0,!1,void 0,this),v$(I1,{color:J.colors.text.secondary,children:["#",X.id," ",X.subject]},void 0,!0,void 0,this),v$(I1,{color:J.colors.muted,children:["(",X.status,X.owner?`, ${X.owner}`:"",")"]},void 0,!0,void 0,this)]},X.id,!0,void 0,this))]},void 0,!0,void 0,this)]},Z.name,!0,void 0,this)})},void 0,!1,void 0,this)});S9.displayName="TeamProgress";import{useMemoizedFn as Mq}from"ahooks";import{Box as O1,Text as Q0}from"ink";import Tq from"ink-select-input";import{useState as y5}from"react";import{jsxDEV as t}from"react/jsx-dev-runtime";var I5=H2.map(($)=>({label:$.label,value:$.id})),Cq=({theme:$})=>{let{colors:J}=$;return t(O1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[t(Q0,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),t(Q0,{children:" "},void 0,!1,void 0,this),t(Q0,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),t(Q0,{children:[t(Q0,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),t(Q0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),t(Q0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),t(Q0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(Q0,{children:[" ",t(Q0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),t(Q0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),t(Q0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(Q0,{children:[" ",t(Q0,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),t(Q0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),t(Q0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),t(Q0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(Q0,{children:[" ",t(Q0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),t(Q0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),t(Q0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(Q0,{children:[" ",t(Q0,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",t(Q0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(Q0,{children:" "},void 0,!1,void 0,this),t(Q0,{color:J.error,children:["- print(",t(Q0,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),t(Q0,{color:J.success,children:["+ print(",t(Q0,{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)},Rq=({theme:$})=>{let{colors:J}=$;return t(O1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[t(Q0,{children:" "},void 0,!1,void 0,this),t(Q0,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),t(Q0,{children:" "},void 0,!1,void 0,this),t(Q0,{children:[t(Q0,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),t(Q0,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(Q0,{children:[t(Q0,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),t(Q0,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(Q0,{children:[t(Q0,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),t(Q0,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(Q0,{children:[t(Q0,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),t(Q0,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(Q0,{children:[t(Q0,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),t(Q0,{color:J.info,children:J.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},S5=()=>{let $=h1(),J=B$.getCurrentThemeName(),Z=H2.findIndex((H)=>H.label===J),Y=Z>=0?H2[Z].theme:H2[0].theme,[X,Q]=y5(Y),[U,q]=y5(!1),K=Mq(async(H)=>{if(U)return;q(!0);try{await O$().setTheme(H.value),$.closeModal()}catch(N){console.error("主题切换失败:",N instanceof Error?N.message:N)}finally{q(!1)}}),G=(H)=>{let N=H2.find((b)=>b.id===H.value);if(N)Q(N.theme)},z=U$()==="theme-selector",_=s0(!1);F0((H,N)=>{if(N.ctrl&&H==="c"||N.meta&&H==="c"){_();return}if(N.escape&&!U)$.closeModal()},{isActive:z});let F=(H)=>{let{isSelected:N,label:b}=H,P=b===J?"[OK]":" ";return t(Q0,{color:N?X.colors.primary:X.colors.text.primary,children:[P," ",b]},void 0,!0,void 0,this)};return t(O1,{flexDirection:"column",height:"100%",children:[t(O1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:t(Q0,{bold:!0,color:X.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(O1,{flexDirection:"row",flexGrow:1,children:[t(O1,{width:"40%",borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,children:t(O1,{flexDirection:"column",children:[t(O1,{paddingTop:1,paddingBottom:1,children:t(Q0,{bold:!0,color:X.colors.text.primary,children:["可用主题 (",I5.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),t(Tq,{items:I5,initialIndex:Z>=0?Z:0,onSelect:K,onHighlight:G,itemComponent:F},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),t(O1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:X.colors.border.light,children:[t(Cq,{theme:X},void 0,!1,void 0,this),t(Rq,{theme:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(O1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:t(Q0,{color:X.colors.text.muted,children:U?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as l4,Text as N1,useStdout as yq}from"ink";import Iq,{useCallback as S1,useEffect as F2,useMemo as k9,useRef as h$,useState as _1}from"react";import{jsxDEV as I$}from"react/jsx-dev-runtime";function k5($,J){let Z=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(Z.length,$.cursor+J))}}function Sq($,J,Z){let Y=Array.from($.value);if(Z.leftArrow)return k5($,-1);if(Z.rightArrow)return k5($,1);if(Z.home)return{...$,cursor:0};if(Z.end)return{...$,cursor:Y.length};if(Z.backspace&&$.cursor>0)return Y.splice($.cursor-1,1),{value:Y.join(""),cursor:$.cursor-1};if(Z.delete&&$.cursor<Y.length)return Y.splice($.cursor,1),{value:Y.join(""),cursor:$.cursor};if(Z.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(Z.ctrl||Z.meta||J.length===0)return $;let X=J.replace(/[\r\n\t]+/g," ");if(X.length===0)return $;let Q=Array.from(X);return Y.splice($.cursor,0,...Q),{value:Y.join(""),cursor:$.cursor+Q.length}}function kq({editor:$}){let J=Array.from($.value),Z=J.slice(0,$.cursor).join(""),Y=J[$.cursor]??" ",X=J.slice($.cursor+1).join("");return I$(N1,{wrap:"truncate-end",children:["/",Z,I$(N1,{inverse:!0,children:Y},void 0,!1,void 0,this),X,I$(N1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Dq({line:$,matches:J,currentMatchIndex:Z,selected:Y,selectedBlock:X,color:Q,highlightColor:U}){let q=z5($,J);if(Y||q.length===0)return I$(N1,{wrap:"truncate-end",color:Q,inverse:Y,bold:X,underline:X,children:$.text||" "},void 0,!1,void 0,this);let K=[],G=0;for(let O of q){if(O.start>G)K.push($.text.slice(G,O.start));K.push(I$(N1,{color:U,bold:!0,inverse:O.matchIndex===Z,children:$.text.slice(O.start,O.end)},`${$.key}:match:${O.matchIndex}`,!1,void 0,this)),G=O.end}if(G<$.text.length)K.push($.text.slice(G));return I$(N1,{wrap:"truncate-end",color:Q,bold:X,underline:X,children:K},void 0,!1,void 0,this)}var D5=Iq.memo(({isOpen:$,onClose:J,compact:Z=!1})=>{let Y=T8(),X=h8(),Q=E8(),U=g8(),q=R2(),K=U$(),G=V0(),{stdout:O}=yq(),{width:z,height:_}=V2(),F=Z?Math.max(6,Math.floor(_*0.4)):_,H=Math.max(1,F-3),N=Math.max(12,z-4),b=h$(new Map),R=h$(new L8),[P,w]=_1(new Set),D=h$(P);D.current=P;let B=k9(()=>q5({messages:Y,currentStreamingMessageId:X,streamingLines:U.lines,streamingTail:U.tail,currentThinkingContent:Q,pendingCommands:q}),[Y,X,U.lines,U.tail,Q,q]),W=k9(()=>{let h=new Set(B.map((u)=>u.id));for(let u of b.current.keys())if(!h.has(u))b.current.delete(u);return B.flatMap((u,m)=>{let W0=P.has(u.id),C0=b.current.get(u.id),N$=C0?.revision===u.revision&&C0.width===N&&C0.expanded===W0?C0.lines:b9(u,N,W0);if(N$!==C0?.lines)b.current.set(u.id,{revision:u.revision,width:N,expanded:W0,lines:N$});if(m===B.length-1)return N$;return[...N$,{key:`${u.id}:separator`,blockId:u.id,role:u.role,kind:u.kind,text:"",copyText:"",pending:u.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})},[B,N,P]),[L,M]=_1(0),[V,C]=_1(new Set),[I,A]=_1(null),k=h$(null),[Y0,r]=_1(!1),p=h$(!1),[I0,n]=_1({value:"",cursor:0}),S=h$(I0),[v,g]=_1(""),[e,U0]=_1(0),f=h$(0),[X0,$0]=_1(null),T=h$(null),[y,j]=_1(null),x=h$(0),s=h$(null),l=h$(0),_0=h$(B),N0=h$(W.length),a=h$(N);l.current=L,k.current=I,p.current=Y0,S.current=I0,f.current=e,T.current=X0;let L0=k9(()=>R.current.search(B,v),[B,v]),q0=Math.max(0,W.length-H),u0=Math.max(0,W.length-L),Z$=Math.max(0,u0-H),g0=S1((h)=>{let u=Math.max(0,Math.min(q0,h));if(l.current=u,M(u),u===0)C(new Set)},[q0]),a0=S1((h)=>{if(W.length===0)return;let u=Math.max(0,Math.min(W.length-1,h)),m=Math.max(0,Math.min(W.length-H,u-Math.floor(H/2))),W0=Math.min(W.length,m+H);g0(W.length-W0)},[W.length,g0,H]),H$=S1((h,u,m)=>{let W0=new Set(D.current);if(u)W0.add(h);else W0.delete(h);D.current=W0,s.current=m,w(W0)},[]),c0=S1((h)=>{let u=B.find((W0)=>W0.id===h.blockId);if(u?.collapsible&&!D.current.has(u.id)){H$(u.id,!0,{blockId:u.id,match:h});return}let m=M9(W,h);if(m>=0)a0(m)},[B,W,a0,H$]),F$=S1((h,u=L0)=>{if(u.length===0){f.current=0,U0(0);return}let m=(h%u.length+u.length)%u.length;f.current=m,U0(m);let W0=u[m];k.current=W0.blockId,A(W0.blockId),c0(W0)},[L0,c0]),t0=S1((h)=>{let u=B.filter((X$)=>X$.collapsible);if(u.length===0)return;let m=u.findIndex((X$)=>X$.id===k.current),W0=m<0?h>0?0:u.length-1:(m+h+u.length)%u.length,C0=u[W0].id;k.current=C0,A(C0);let N$=W.findIndex((X$)=>X$.blockId===C0&&X$.header);if(N$>=0)a0(N$)},[B,W,a0]),f1=S1(()=>{let h=k.current;if(!h)h=W.slice(Z$,u0).find((m)=>B.some((W0)=>W0.id===m.blockId&&W0.collapsible))?.blockId??null;if(!h)return;if(!B.find((m)=>m.id===h)?.collapsible)return;k.current=h,A(h),H$(h,!D.current.has(h),{blockId:h})},[B,u0,W,H$,Z$]),U1=S1((h,u)=>{let m=T.current;if(!m||W.length===0)return;let W0=u==="top"?0:u==="bottom"?W.length-1:Math.max(0,Math.min(W.length-1,m.head+h)),C0={...m,head:W0};T.current=C0,$0(C0),a0(W0)},[W.length,a0]),w2=S1(()=>{let h=T.current;if(!h)return;let u=O5(W,h.anchor,h.head);if(!u.trim()){j("Nothing selected");return}let m=++x.current;j("Copying..."),c4(u,{writeTerminal:(W0)=>O.write(W0)}).then((W0)=>{if(x.current!==m)return;j(W0.success?W0.method==="osc52"?"Copy sent via OSC 52":`Copied ${u.split(`
|
|
171
|
+
`).length} lines`:"Copy failed"),T.current=null,$0(null)})},[W,O]);F2(()=>{if(!y)return;let h=setTimeout(()=>j(null),2500);return()=>clearTimeout(h)},[y]),F2(()=>{if(!$){x.current++,_0.current=B,N0.current=W.length;return}D.current=new Set,w(new Set),k.current=null,A(null),p.current=!1,r(!1),S.current={value:"",cursor:0},n({value:"",cursor:0}),g(""),f.current=0,U0(0),T.current=null,$0(null),j(null),l.current=0,M(0),C(new Set),_0.current=B,N0.current=W.length,a.current=N},[$]),F2(()=>{let h=new Set(B.map((u)=>u.id));if(w((u)=>{let m=new Set([...u].filter((C0)=>h.has(C0)));return D.current=m,m.size===u.size&&[...m].every((C0)=>u.has(C0))?u:m}),k.current&&!h.has(k.current))k.current=null,A(null)},[B]),F2(()=>{let h=N0.current;if(N0.current=W.length,!$)return;let u=s.current;if(u){s.current=null;let W0=u.match?M9(W,u.match):W.findIndex((C0)=>C0.blockId===u.blockId&&C0.header);if(W0>=0)a0(W0);return}if(l.current===0){C(new Set);return}let m=Math.max(0,W.length-h);if(m>0)M((W0)=>{let C0=Math.min(q0,W0+m);return l.current=C0,C0});else if(l.current>q0)l.current=q0,M(q0)},[N,P,$,W.length,q0,a0]),F2(()=>{let h=_0.current;if(_0.current=B,!$||l.current===0)return;let u=_5(h,B);if(u.length===0)return;C((m)=>{let W0=new Set(m);for(let C0 of u)W0.add(C0);return W0})},[B,$]),F2(()=>{if(L0.length===0)f.current=0,U0(0);else if(f.current>=L0.length)f.current=L0.length-1,U0(L0.length-1)},[L0.length]),F2(()=>{if(a.current===N)return;a.current=N,T.current=null,$0(null);let h=L0[f.current];if(h)c0(h)},[N,L0,c0]),F0((h,u)=>{if(!$)return;let m=u,W0=K==="transcript-pager";if((m.ctrl||m.meta)&&h.toLowerCase()==="o")return J(),!0;if(!W0){if(m.pageUp)return g0(l.current+Math.max(1,H-1)),!0;if(m.pageDown)return g0(l.current-Math.max(1,H-1)),!0;return!1}if(p.current){if(m.escape)return p.current=!1,r(!1),S.current={value:v,cursor:Array.from(v).length},n(S.current),!0;if(m.return){let N$=S.current.value,X$=R.current.search(B,N$);return g(N$),p.current=!1,r(!1),F$(0,X$),!0}let C0=Sq(S.current,h,m);return S.current=C0,n(C0),!0}if(h==="q")return J(),!0;if(T.current){if(m.escape)return T.current=null,$0(null),!0;if(h==="y"||m.ctrl&&!m.meta&&h.toLowerCase()==="c")return w2(),!0;if(m.upArrow||h==="k")return U1(-1),!0;if(m.downArrow||h==="j")return U1(1),!0;if(m.pageUp)return U1(-Math.max(1,H-1)),!0;if(m.pageDown)return U1(Math.max(1,H-1)),!0;if(m.home||h==="g")return U1(0,"top"),!0;if(m.end||h==="G")return U1(0,"bottom"),!0;return!0}if(m.escape)return J(),!0;if(h==="/"){let C0={value:v,cursor:Array.from(v).length};return S.current=C0,n(C0),p.current=!0,r(!0),!0}if(h==="n"&&L0.length>0)return F$(f.current+1),!0;if(h==="N"&&L0.length>0)return F$(f.current-1),!0;if(m.tab)return t0(m.shift?-1:1),!0;if(m.return||h==="e")return f1(),!0;if(h==="v"){if(W.length===0)return!0;let C0=Math.max(0,W.length-l.current),N$=Math.max(0,C0-H),X$=k.current?W.findIndex((u$)=>u$.blockId===k.current&&u$.header):-1,L$=X$>=0?X$:Math.max(0,Math.min(W.length-1,N$)),d0={anchor:L$,head:L$};return T.current=d0,$0(d0),a0(L$),!0}if(m.upArrow||h==="k")return g0(l.current+1),!0;if(m.downArrow||h==="j")return g0(l.current-1),!0;if(m.pageUp)return g0(l.current+Math.max(1,H-1)),!0;if(m.pageDown)return g0(l.current-Math.max(1,H-1)),!0;if(m.home||h==="g")return g0(q0),!0;if(m.end||h==="G")return g0(0),!0;return!0},{isActive:$,priority:100});let k$=W.slice(Z$,u0),v1=V.size,K0=W.length===0?"0/0":`${Math.min(u0,W.length)}/${W.length}`,P0=X0?Math.min(X0.anchor,X0.head):-1,k0=X0?Math.max(X0.anchor,X0.head):-1,J0=v.length>0?`/${v} ${L0.length>0?`${e+1}/${L0.length}`:"0/0"}`:null,Z0=y?y:X0?`${k0-P0+1} lines selected · y copy · Esc cancel`:J0?`${J0} · n/N`:v1>0?`${v1} new · G latest`:"Ctrl+O / Esc / q close";return I$(l4,{flexDirection:"column",width:"100%",height:F,paddingX:2,children:[I$(l4,{justifyContent:"space-between",flexShrink:0,children:[I$(N1,{bold:!0,color:G.colors.primary,children:"Transcript"},void 0,!1,void 0,this),I$(N1,{color:G.colors.text.muted,children:K0},void 0,!1,void 0,this)]},void 0,!0,void 0,this),I$(l4,{flexDirection:"column",height:H,flexShrink:0,overflow:"hidden",children:k$.length===0?I$(N1,{color:G.colors.text.muted,children:"No transcript yet"},void 0,!1,void 0,this):k$.map((h,u)=>{let m=Z$+u,W0=P0>=0&&m>=P0&&m<=k0,C0=h.header&&h.blockId===I,N$=h.pending?G.colors.warning:h.kind==="thinking"?G.colors.info:h.role==="user"?G.colors.info:h.role==="assistant"?G.colors.success:G.colors.text.secondary;return I$(Dq,{line:h,matches:L0,currentMatchIndex:e,selected:W0,selectedBlock:C0,color:N$,highlightColor:G.colors.warning},h.key,!1,void 0,this)})},void 0,!1,void 0,this),I$(l4,{flexShrink:0,children:Y0?I$(kq,{editor:I0},void 0,!1,void 0,this):I$(N1,{color:y||v1>0?G.colors.warning:G.colors.text.muted,wrap:"truncate-end",children:[Z0," · / search · Tab/Enter expand · v/y copy · j/k PgUp/PgDn g/G"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{jsxDEV as h0}from"react/jsx-dev-runtime";var J$=q1("UI"),E5=({debug:$,continue:J,...Z})=>{if($)J$.debug("[Debug] BladeInterface props:",{permissionMode:Z.permissionMode,yolo:Z.yolo,maxTurns:Z.maxTurns,continue:J});let Y=L2(!1),X=L2(!1),Q=L2(!1),U=L2(null),q=L2(!1),K=L2(null);if(!K.current)K.current=new wJ;let G=K.current,O=L2(null);if(!O.current)O.current=new PJ;let z=O.current,[_,F]=f5(G.getState()),[H,N]=f5(!1),b=l9(),R=r9(),P=C8(),w=o9(),D=n9(),B=R8(),W=i9(),L=h1(),M=E1(),V=M2(),C=G1(),{stdout:I}=Vq(),A=XY(),k=T2(),Y0=ZY();Q1(()=>{if(B$.getCurrentThemeName()!==Y0)try{B$.setTheme(Y0)}catch{}},[Y0]);let r=b==="ready",p=b==="needsSetup",I0=b==="idle",n=fq(()=>Z.agents?j5(Z.agents):void 0,[Z.agents]),{confirmationState:S,confirmationHandler:v,handleResponse:g,dismissAll:e}=H6(),{executeCommand:U0,handleAbort:f,isProcessing:X0,cleanupAgent:$0}=_6(Z.systemPrompt,Z.appendSystemPrompt,v,Z.maxTurns,e,n,{list:()=>z.listAll(),acknowledge:(d)=>z.acknowledge(d),setVisibleLocator:(d)=>d?z.proveLocal(d):z.setVisibleLocator()}),T=r0(async(d)=>{await VY(d.controller,d.visibility,{continueSession:J===!0,resume:Z.resume,forkSession:Z.forkSession===!0,requestedSessionId:Z.sessionId,locator:{version:2,sessionId:V,workspace:{kind:"local",projectPath:C}}})}),y=r0((d)=>{L.projectTaskAttentionState(d.status,d.unreadKeys)}),j=r0((d)=>{J$.warn(`[BladeInterface] Task attention ${d} unavailable`)});a6({ready:r,lifecycle:z,initialize:T,project:y,report:j});let x=r0(F),s=r0(()=>{J$.warn("[BladeInterface] Session history shutdown unavailable")});c6({lifecycle:G,project:x,report:s});let{getPreviousCommand:l,getNextCommand:_0,addToHistory:N0}=N6();h6();let a=L6("",0),L0=r0(()=>{l$(),I.write(V5.eraseScreen+V5.cursorTo(0,0)),M.incrementClearCount()}),q0=r0(()=>{if(H)return;N(!0)}),u0=r0(()=>{if(!H)return;N(!1)}),Z$=r0(()=>{if(H)u0();else q0()});F0((d,A0)=>{if(r&&!p&&(A0.ctrl||A0.meta)&&d.toLowerCase()==="o")return Z$(),!0;return!1},{priority:90}),Q1(()=>{if(!q.current){q.current=!0;return}L0()},[L0,H]);let g0=r0(async()=>{let d=k,A0;if(d==="default")A0="autoEdit";else if(d==="autoEdit")A0="plan";else if(d==="plan")A0="default";else A0="default";try{await l0.setSessionPermissionMode(V,C,A0),await O$().setPermissionMode(A0)}catch(W$){J$.error("权限模式切换失败:",W$ instanceof Error?W$.message:W$)}}),a0=r0(async(d)=>{try{let A0={displayName:d.displayName,provider:d.provider,model:d.model,overrides:d.overrides};if(d.modelProvider)await O$().addModelWithProvider(A0,d.modelProvider);else await O$().addModel(A0);L.setInitializationStatus("ready")}catch(A0){throw J$.error("初始化配置保存失败:",A0 instanceof Error?A0.message:A0),A0}}),H$=r0(()=>{if(P==="shortcuts")L.closeModal();else L.setActiveModal("shortcuts")}),c0=r0(async()=>{try{await vY(z.visibility(),{version:2,sessionId:V,workspace:{kind:"local",projectPath:C}})}catch{J$.warn("[BladeInterface] Task attention fallback visibility unavailable")}}),F$=r0(async(d,A0,W$)=>{return e8({intent:A0,session:d,newSessionId:W$?.newSessionId,announceFork:W$?.announceFork,permissionModeOverride:Z.permissionMode},C,M,$0)}),t0=r0(async(d,A0,W$)=>{await lY(d,A0,{openHistory:(P2,j1)=>{L.showSessionHistoryViewer(P2,j1)},activateLocal:async(P2,j1)=>{await G.closeView();let n4=await F$(P2,j1,W$);try{await fY(j1,d,n4,z.visibility())}catch{J$.warn("[BladeInterface] Task attention local activation unavailable")}L.closeModal()}},W$)}),f1=r0(async(d,A0)=>{let j1=(await s8(A0,C,z)).filter((n4)=>n4.locator.sessionId===d);if(j1.length===0)throw Error(`Session not found: ${d}`);if(j1.length>1)throw Error(`Multiple workspaces contain session ${d}; use the session selector`);return j1[0]}),{showSuggestions:U1,suggestions:w2,selectedSuggestionIndex:k$}=f6(a,U0,l,_0,N0,f,X0,g0,H$,P==="shortcuts",P==="sessionHistoryViewer");Q1(()=>{if(a.value&&P==="shortcuts")L.closeModal()},[a.value,P,L]);let v1=r0(async()=>{Q.current=!0;try{let d=Z.forkSession?"fork":"resume",A0=await s8(d,C,z);if(A0.length===0){if(Z.forkSession){J$.error("没有可供 fork 的历史会话"),t$(1);return}M.addAssistantMessage("没有找到历史会话,开始新对话。"),await c0();return}let W$=EY(A0);if(!W$){if(Z.forkSession){J$.error("没有可供 fork 的本地历史会话"),t$(1);return}M.addAssistantMessage("没有找到本地历史会话,开始新对话。"),await c0();return}await t0(W$,d,{newSessionId:Z.forkSession?Z.sessionId:void 0,announceFork:Z.forkSession?!1:void 0})}catch(d){if(J$.error("[BladeInterface] 继续会话失败:",d),Z.forkSession){t$(1);return}M.addAssistantMessage("继续会话失败,开始新对话。"),await c0()}}),K0=r0(async()=>{Q.current=!0;try{if(typeof Z.resume==="string"&&Z.resume!=="true"){let W$=Z.forkSession?"fork":"resume",P2=await f1(Z.resume,W$);await t0(P2,W$,{newSessionId:Z.forkSession?Z.sessionId:void 0,announceFork:Z.forkSession?!1:void 0});return}let d=Z.forkSession?"fork":"resume",A0=await s8(d,C,z);if(A0.length===0)J$.error("没有找到历史会话"),t$(1);L.showSessionSelector(A0,d)}catch(d){J$.error("[BladeInterface] 加载会话失败:",d),t$(1)}});Q1(()=>{if(Y.current)return;if(J){Y.current=!0,v1();return}if(Z.resume)Y.current=!0,K0()},[J,Z.resume,v1,K0]);let P0=r0(async(d)=>{let A0=S.details?.type;if(A0==="enterPlanMode"&&d.approved)try{await l0.setSessionPermissionMode(V,C,"plan"),await O$().setPermissionMode("plan"),J$.debug("[BladeInterface] Entered Plan mode")}catch(W$){J$.error("[BladeInterface] Failed to enter Plan mode:",W$)}if(A0==="exitPlanMode"&&d.approved)J$.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");g(d)}),k0=r0(()=>{M.addAssistantMessage("设置已取消"),M.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),M.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),t$(0)}),J0=r0(()=>{G.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")}),L.closeModal()}),Z0=r0(async(d)=>{try{let A0=w?.intent??"resume";await t0(d,A0,{newSessionId:A0==="fork"&&Z.forkSession?Z.sessionId:void 0})}catch(A0){J$.error("[BladeInterface] Failed to restore session:",A0),M.addAssistantMessage(`会话操作失败: ${A0 instanceof Error?A0.message:"未知错误"}`),L.closeModal()}}),h=r0(()=>{if(G.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")}),Z.resume)t$(0);else L.closeModal()});Q1(()=>{if(P==="sessionHistoryViewer"&&D){u6(G,z,D).catch(()=>{J$.warn("[BladeInterface] Session history activation unavailable")});return}if(G.cancelRemoteRequest(),z.endRemote().catch(()=>{J$.warn("[BladeInterface] Task attention visibility unavailable")}),G.getState().status!=="idle")G.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")})},[P,G,D,z]),Q1(()=>{if(!D)return;z.updateRemote(D,_).catch(()=>{J$.warn("[BladeInterface] Task attention acknowledgement unavailable")})},[_,D,z]);let u=r0((d)=>{L.showModelEditWizard(d)}),m=r0((d)=>{M.addAssistantMessage(`已添加模型配置: ${d.displayName??d.model},并已切换到该模型`),J0()}),W0=r0((d)=>{M.addAssistantMessage(`已更新模型配置: ${d.displayName??d.model}`),J0()});Q1(()=>{if(p){A.setFocus("model-config-wizard");return}if(S.isVisible)A.setFocus("confirmation-prompt");else if(P==="sessionSelector")A.setFocus("session-selector");else if(P==="sessionHistoryViewer")A.setFocus("session-history-viewer");else if(P==="themeSelector")A.setFocus("theme-selector");else if(P==="modelSelector")A.setFocus("model-selector");else if(P==="modelAddWizard"||P==="modelEditWizard")A.setFocus("model-config-wizard");else if(P==="permissionsManager")A.setFocus("permissions-manager");else if(P==="agentsManager")A.setFocus("agents-manager");else if(P==="agentCreationWizard")A.setFocus("agent-creation-wizard");else if(P==="skillsManager")A.setFocus("skills-manager");else if(P==="pluginsManager")A.setFocus("plugins-manager");else if(P==="hooksManager")A.setFocus("hooks-manager");else if(H)A.setFocus("transcript-pager");else if(P==="shortcuts")A.setFocus("main-input");else A.setFocus("main-input")},[p,S.isVisible,P,H,A.setFocus]),Q1(()=>{if(!r||Q.current)return;if(v5().length>0){Q.current=!0;return}Q.current=!0,M.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[r]),Q1(()=>{if(!R)return;if(U.current===R)return;if(U.current=R,b==="error")M.addAssistantMessage(`初始化失败: ${R}`);else M.addAssistantMessage(`${R}`),M.addAssistantMessage("请重新尝试设置,或检查文件权限")},[R,b,M.addAssistantMessage]);let C0=r0(async(d)=>{try{await U0({displayText:d,text:d,images:[],parts:[{type:"text",text:d}]})}catch(A0){let W$=A0 instanceof Error?A0.message:"无法发送初始消息";M.addAssistantMessage(`初始消息发送失败:${W$}`)}});Q1(()=>{let d=Z.initialMessage?.trim();if(!d||X.current||!r||p)return;X.current=!0,N0(d),C0(d)},[Z.initialMessage,r,p,U0,N0]);let N$=r0(async(d)=>{try{await O$().setPermissionMode(d)}catch(A0){J$.error("权限模式初始化失败:",A0 instanceof Error?A0.message:A0)}});if(Q1(()=>{let d=Z.permissionMode;if($)J$.debug("[Debug] permissionMode from CLI:",d),J$.debug("[Debug] current permissionMode:",k);if(!d||d===k)return;N$(d)},[Z.permissionMode,k]),I0)return null;if(p)return h0(w9,{mode:"setup",onComplete:a0,onCancel:k0},void 0,!1,void 0,this);if($)J$.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:S.isVisible,activeModal:P});let X$=P==="modelSelector",L$=W,d0=P==="modelAddWizard"?"add":P==="modelEditWizard"&&L$?"edit":null,u$=X$||Boolean(d0),H1=P==="agentsManager",Q$=P==="agentCreationWizard",A2=P==="skillsManager",$X=P==="pluginsManager",JX=L$?{displayName:L$.displayName,provider:L$.provider,model:L$.model,overrides:L$.overrides}:void 0,f9=S.isVisible&&S.details?S.details.type==="mcpElicitation"&&S.details.mcpElicitation?h0(bZ,{details:S.details.mcpElicitation,onComplete:(d,A0)=>P0({approved:d.action==="accept",elicitation:d,...A0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):S.details.type==="askUserQuestion"&&S.details.questions?h0(Q5,{questions:S.details.questions,onComplete:(d)=>P0({approved:!0,answers:d}),onCancel:()=>P0({approved:!1})},void 0,!1,void 0,this):h0(u3,{details:S.details,onResponse:P0},void 0,!1,void 0,this):P==="themeSelector"?h0(S5,{},void 0,!1,void 0,this):P==="permissionsManager"?h0(tZ,{onClose:J0},void 0,!1,void 0,this):P==="sessionSelector"?h0(B5,{intent:w?.intent??"resume",sessions:w?.sessions??[],taskAttentionUnreadKeys:B,onSelect:Z0,onCancel:h},void 0,!1,void 0,this):P==="sessionHistoryViewer"?h0(W5,{state:_,onLoadOlder:(d)=>G.loadOlder(d),onFork:(d)=>G.fork(d),onClose:J0},void 0,!1,void 0,this):P==="hooksManager"?h0(d3,{workspaceRoot:C,sessionId:V,onClose:J0},void 0,!1,void 0,this):null,b8=Boolean(f9);return h0(k1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[f9,h0(k1,{flexDirection:"column",display:b8||H?"none":"flex",children:[h0(kZ,{active:!b8&&!H},void 0,!1,void 0,this),h0(R5,{},void 0,!1,void 0,this),h0(S9,{},void 0,!1,void 0,this),h0(R9,{},void 0,!1,void 0,this),h0(BZ,{paused:b8||H},void 0,!1,void 0,this),h0(OZ,{input:a.value,cursorPosition:a.cursorPosition,onChange:a.setValue,onChangeCursorPosition:a.setCursorPosition,onAddPasteMapping:a.addPasteMapping,onAddImagePasteMapping:a.addImagePasteMapping,disabled:P==="sessionHistoryViewer"},void 0,!1,void 0,this),X$&&h0(k1,{marginTop:1,paddingX:2,children:h0(DZ,{onClose:J0,onEdit:u},void 0,!1,void 0,this)},void 0,!1,void 0,this),d0&&h0(k1,{marginTop:1,paddingX:2,children:h0(w9,{mode:d0,modelId:L$?.id,initialConfig:d0==="edit"?JX:void 0,onComplete:d0==="edit"?W0:m,onCancel:J0},void 0,!1,void 0,this)},void 0,!1,void 0,this),H1&&h0(k1,{marginTop:1,paddingX:2,children:h0(Y3,{workspaceRoot:C,onComplete:J0,onCancel:J0},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q$&&h0(k1,{marginTop:1,paddingX:2,children:h0(G8,{onComplete:J0,onCancel:J0},void 0,!1,void 0,this)},void 0,!1,void 0,this),A2&&h0(k1,{marginTop:1,paddingX:2,children:h0(b5,{onComplete:J0,onCancel:J0},void 0,!1,void 0,this)},void 0,!1,void 0,this),$X&&h0(k1,{marginTop:1,paddingX:2,children:h0(X5,{workspaceRoot:C,onComplete:J0,onCancel:J0},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(K3,{suggestions:w2,selectedIndex:k$,visible:U1&&!u$},void 0,!1,void 0,this),h0(q3,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h0(k1,{flexDirection:"column",display:H?"flex":"none",children:h0(D5,{isOpen:H,compact:b8,onClose:u0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as vq,Text as o1}from"ink";import jq from"react";import{jsxDEV as D1}from"react/jsx-dev-runtime";class P8 extends jq.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 D1(vq,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[D1(o1,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),D1(o1,{children:" "},void 0,!1,void 0,this),D1(o1,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),D1(o1,{children:" "},void 0,!1,void 0,this),D1(o1,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),D1(o1,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),D1(o1,{children:" "},void 0,!1,void 0,this),D1(o1,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as B2,Text as V1}from"ink";import{useState as D9}from"react";import{jsxDEV as S$}from"react/jsx-dev-runtime";var r4=[{key:"update",label:"Update now",description:`runs \`${g5()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],p5=({versionInfo:$,onComplete:J})=>{let[Z,Y]=D9(0),[X,Q]=D9(!1),[U,q]=D9(null);F0((G,O)=>{if(O.ctrl&&G==="c"){X8().shutdown("SIGINT",0);return}if(X||U)return;if(O.upArrow||G==="k")Y((z)=>z>0?z-1:r4.length-1);else if(O.downArrow||G==="j")Y((z)=>z<r4.length-1?z+1:0);else if(O.return)K(r4[Z].key);else if(G==="1")K("update");else if(G==="2")K("skip");else if(G==="3")K("skip_until_next")});let K=async(G)=>{switch(G){case"update":{Q(!0);let O=await m5();q(O.message),setTimeout(()=>{X8().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await h5($.latestVersion);J();break}};if(U)return S$(B2,{flexDirection:"column",marginY:1,children:S$(V1,{children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(X)return S$(B2,{flexDirection:"column",marginY:1,children:S$(V1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return S$(B2,{flexDirection:"column",marginY:1,children:[S$(V1,{color:"yellow",bold:!0,children:["Update available! ",S$(V1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),S$(B2,{marginTop:1,children:S$(V1,{color:"gray",children:["Release notes:"," ",S$(V1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),S$(B2,{flexDirection:"column",marginTop:1,children:r4.map((G,O)=>{let z=O===Z,_=z?"› ":" ",F=`${O+1}. `;return S$(B2,{children:S$(V1,{color:z?"cyan":void 0,children:[_,F,G.label,G.description&&S$(V1,{color:"gray",children:[" (",G.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},G.key,!1,void 0,this)})},void 0,!1,void 0,this),S$(B2,{marginTop:1,children:S$(V1,{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 a4,Text as i2}from"ink";import{useState as x5}from"react";import{jsxDEV as W1}from"react/jsx-dev-runtime";var u5=({status:$,onTrust:J,onContinueSafely:Z})=>{let Y=B$.getTheme(),[X,Q]=x5(!1),[U,q]=x5(null);return F0((K,G)=>{if(X)return;if(G.return||K.toLowerCase()==="t"){Q(!0),q(null),J().catch((O)=>{q(O instanceof Error?O.message:"Failed to trust workspace"),Q(!1)});return}if(K.toLowerCase()==="s"||G.escape)Q(!0),q(null),Z().catch((O)=>{q(O instanceof Error?O.message:"Failed to continue safely"),Q(!1)})}),W1(a4,{flexDirection:"column",paddingX:1,children:[W1(i2,{bold:!0,color:Y.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),W1(i2,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),W1(a4,{marginTop:1,flexDirection:"column",children:[W1(i2,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((K)=>W1(i2,{children:[" ",K.path," · ",K.effects.length," effect(s)"]},`${K.kind}:${K.path}`,!0,void 0,this))]},void 0,!0,void 0,this),U&&W1(a4,{marginTop:1,children:W1(i2,{color:Y.colors.error,children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),W1(a4,{marginTop:1,children:W1(i2,{bold:!0,children:X?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as Eq}from"ink";import{useEffect as hq}from"react";function c5(){let{stdout:$}=Eq();hq(()=>{if(!$.isTTY)return;return $.write(o3),$.write(J9),()=>{$.write(n3),$.write(J9)}},[$])}function d5($){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 gq($){return $.forkSession?void 0:$.resumeSessionId}function l5($,J){let Z=gq($);if(Z)J(Z)}import{jsxDEV as n1}from"react/jsx-dev-runtime";function pq($){if(q$().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");w$().setInitializationStatus("ready")}var xq=($)=>{c5();let[J,Z]=o4(!1),[Y,X]=o4(null),[Q,U]=o4(!1),[q,K]=o4(null),G=i4((F,H)=>{let N=F instanceof Error?F.message:String(F);if(w$().setInitializationError(N),w$().setInitializationStatus("error"),Z(!0),H)console.error("[FAIL] 应用初始化失败:",N)}),O=i4(async()=>{try{let F=q$().config.config??a5,H=i5(F,$);if(pq(H),l5(H,(b)=>{o5().restoreSession(b,[])}),H.debug)console.error("[Debug] 运行时配置:",H);let N=H.codeTheme;if(N&&B$.hasTheme(N)){if(B$.setTheme(N),$.debug)console.log(`[OK] 已加载主题: ${N}`)}try{E$.getInstance().loadConfig(H.hooks||{},z$());let R=await n5(z$());if($.debug&&H.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${R.subagents.getAllNames().length} agents, ${R.skills.size} skills, ${R.commands.getCommandCount()+R.commands.getPluginCommandCount()} commands, ${R.plugins.getAll().length} plugins`);let w=q$().session.sessionId;r5(w)}catch(b){if($.debug)console.warn("Hooks 初始化失败:",d5(b))}J4(async()=>{await s5.getInstance().killAll(),await t5.getInstance().disconnectAll(),E$.getInstance().cleanup()}),Z(!0)}catch(F){G(F,!!$.debug)}}),z=i4(async()=>{let F=await V9.getInstance().getStatus(z$());if(F.state==="untrusted"||F.state==="error"){K(F);return}await O()}),_=i4(async()=>{if($.versionCheckPromise){let F=await $.versionCheckPromise;if(F){X(F),U(!0);return}}await z()});if(mq(()=>{_()},[]),Q&&Y)return n1(P8,{children:n1(p5,{versionInfo:Y,onComplete:()=>{U(!1),z()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(q)return n1(P8,{children:n1(u5,{status:q,onTrust:async()=>{await V9.getInstance().trust(z$()),await e5(),K(null),await O()},onContinueSafely:async()=>{K(null),await O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!J)return null;return n1(P8,{children:n1(E5,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},WP=($)=>n1(A6,{children:n1(xq,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{WP as AppWrapper};
|