blade-code 0.10.5 → 0.10.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-rh7v814a.js → chunk-0rp2ck29.js} +2 -2
  3. package/dist/chunk-10k6egwk.js +1 -0
  4. package/dist/chunk-17xtw88g.js +1 -0
  5. package/dist/chunk-1cvr3qtd.js +1482 -0
  6. package/dist/chunk-1kg9r8xp.js +2 -0
  7. package/dist/{chunk-51wtvmzn.js → chunk-383vbwmt.js} +1 -1
  8. package/dist/chunk-3kk3bk11.js +1 -0
  9. package/dist/{chunk-6tx8k249.js → chunk-45dcfkwe.js} +2 -2
  10. package/dist/chunk-47dsd91k.js +99 -0
  11. package/dist/chunk-4kaygjqv.js +10 -0
  12. package/dist/{chunk-35yktzm1.js → chunk-4y28hykg.js} +1 -1
  13. package/dist/chunk-50fq7r0h.js +22 -0
  14. package/dist/chunk-59eje513.js +1 -0
  15. package/dist/{chunk-qda309d9.js → chunk-6cv4gddv.js} +2 -2
  16. package/dist/{chunk-hh85pk77.js → chunk-710bvht9.js} +47 -47
  17. package/dist/{chunk-xv0maezy.js → chunk-76d7p64v.js} +1 -1
  18. package/dist/{chunk-bexgcc2d.js → chunk-7xm3vjkz.js} +1 -1
  19. package/dist/{chunk-19kg7yvw.js → chunk-9sfmrb1j.js} +2 -2
  20. package/dist/chunk-a9pbpgkg.js +9 -0
  21. package/dist/{chunk-gxmrakrk.js → chunk-b4n34hrn.js} +1 -1
  22. package/dist/{chunk-v93hcxe7.js → chunk-bn0ge244.js} +1 -1
  23. package/dist/{chunk-fvhc1yj8.js → chunk-bnrce0hg.js} +1 -1
  24. package/dist/{chunk-9ffr01c3.js → chunk-c2rhwxyn.js} +1 -1
  25. package/dist/chunk-c8rky275.js +6 -0
  26. package/dist/{chunk-epj56s0n.js → chunk-c9tzf9r5.js} +1 -1
  27. package/dist/{chunk-njyvrtje.js → chunk-dcvvxsa1.js} +2 -2
  28. package/dist/{chunk-5twefby5.js → chunk-evaht3v4.js} +1 -1
  29. package/dist/{chunk-0n97186m.js → chunk-frcg8gea.js} +2 -2
  30. package/dist/{chunk-drrdzmaa.js → chunk-g4q26d9a.js} +2 -2
  31. package/dist/{chunk-s645azsm.js → chunk-g9n211y4.js} +2 -2
  32. package/dist/{chunk-vntzy7bc.js → chunk-gb4n3hwj.js} +2 -2
  33. package/dist/{chunk-ea7wsges.js → chunk-hjsm6ejs.js} +2 -2
  34. package/dist/chunk-j1sd03h7.js +1 -0
  35. package/dist/chunk-jqyvnmfr.js +187 -0
  36. package/dist/chunk-jrh5tzc4.js +1 -0
  37. package/dist/{chunk-an96c54z.js → chunk-k0p9ecgc.js} +7 -7
  38. package/dist/{chunk-z906d5tb.js → chunk-kcs3xa8f.js} +2 -2
  39. package/dist/{chunk-63ysxybd.js → chunk-kcwq1e7h.js} +1 -1
  40. package/dist/chunk-kj1ah6kn.js +1 -0
  41. package/dist/{chunk-am8dtvff.js → chunk-m4htdpr9.js} +2 -2
  42. package/dist/chunk-n34z4c47.js +1 -0
  43. package/dist/{chunk-6eragc74.js → chunk-n5m2p0bq.js} +2 -2
  44. package/dist/{chunk-gxzbv67r.js → chunk-n9khyme2.js} +2 -2
  45. package/dist/{chunk-1vx4sf1y.js → chunk-nfmsn652.js} +2 -2
  46. package/dist/{chunk-ydtcvxsm.js → chunk-p196e4rq.js} +1 -1
  47. package/dist/{chunk-qm11hjd3.js → chunk-p4j4aawd.js} +1 -1
  48. package/dist/chunk-qvabd0vg.js +1 -0
  49. package/dist/{chunk-sanhjqpd.js → chunk-r083b7vn.js} +2 -2
  50. package/dist/{chunk-gb54hc78.js → chunk-rag8zchg.js} +1 -1
  51. package/dist/{chunk-ygx03mdh.js → chunk-rw6gv740.js} +1 -1
  52. package/dist/{chunk-jza1rsan.js → chunk-sf9pe2n6.js} +1 -1
  53. package/dist/chunk-t75wspk3.js +1 -0
  54. package/dist/{chunk-vpj0sv73.js → chunk-thvwt4kc.js} +3 -3
  55. package/dist/{chunk-yc53wz4r.js → chunk-v1p80wvh.js} +2 -2
  56. package/dist/chunk-vddqv6fv.js +1 -0
  57. package/dist/{chunk-948qe2pp.js → chunk-vvbd9fb5.js} +1 -1
  58. package/dist/{chunk-15d49qty.js → chunk-w154jyby.js} +1 -1
  59. package/dist/{chunk-dqvcgwhe.js → chunk-w4zvftrw.js} +2 -2
  60. package/dist/chunk-wa7v7akz.js +3 -0
  61. package/dist/chunk-wxwqz67n.js +1 -0
  62. package/dist/chunk-x9hm3p3a.js +1 -0
  63. package/dist/chunk-xd2g4zjx.js +1 -0
  64. package/dist/{chunk-tq52pbde.js → chunk-xkp4ph6v.js} +1 -1
  65. package/dist/{chunk-fz1vyc15.js → chunk-xsmtpkjm.js} +1 -1
  66. package/dist/{chunk-g6h6h8xr.js → chunk-yt39kfc6.js} +1 -1
  67. package/package.json +1 -1
  68. package/dist/chunk-069zpw09.js +0 -6
  69. package/dist/chunk-1m5r6mp2.js +0 -180
  70. package/dist/chunk-1q21sxhx.js +0 -1
  71. package/dist/chunk-1r6szcrj.js +0 -1
  72. package/dist/chunk-1x4fpe47.js +0 -1
  73. package/dist/chunk-2nkd1kjx.js +0 -1
  74. package/dist/chunk-417wefq7.js +0 -99
  75. package/dist/chunk-4ncbd4k0.js +0 -1
  76. package/dist/chunk-62881c2s.js +0 -1484
  77. package/dist/chunk-7443b95r.js +0 -1
  78. package/dist/chunk-79s052sw.js +0 -2
  79. package/dist/chunk-7jy60gnx.js +0 -1
  80. package/dist/chunk-c5tds5v0.js +0 -9
  81. package/dist/chunk-ccwskwb3.js +0 -1
  82. package/dist/chunk-f6mszdsd.js +0 -1
  83. package/dist/chunk-nz78b5c5.js +0 -10
  84. package/dist/chunk-r1764q6f.js +0 -1
  85. package/dist/chunk-r6mwyg3h.js +0 -3
  86. package/dist/chunk-rzzt21ef.js +0 -22
  87. package/dist/chunk-t8x2qpe2.js +0 -1
  88. package/dist/chunk-tjnfhm9v.js +0 -1
  89. package/dist/chunk-v0ygsjry.js +0 -1
  90. package/dist/chunk-zyz82mcd.js +0 -1
@@ -1,6 +1,6 @@
1
- import{e as r9,f as a9}from"./chunk-ygx03mdh.js";import{i as hJ,j as EJ,k as gJ}from"./chunk-ydtcvxsm.js";import{$ as J6,E as O$,F as b4,G as A4,J as Q8,K as qJ,L as OJ,O as zJ,P as _J,U as _6,V as N6,W as tJ,X as S4,Z as k4,r as Q6,u as i2,v as x2,w as r4,x as nJ}from"./chunk-62881c2s.js";import{da as b9,ea as A9,fa as P9,ia as oJ}from"./chunk-s645azsm.js";import{Aa as E4}from"./chunk-1m5r6mp2.js";import{Va as Z8}from"./chunk-jza1rsan.js";import{hb as y4,ib as m2,jb as M4,nb as $8,qb as y0}from"./chunk-417wefq7.js";import"./chunk-an96c54z.js";import{Ob as VJ}from"./chunk-6tx8k249.js";import{Pb as X8,Qb as E8,Sb as C1}from"./chunk-vntzy7bc.js";import"./chunk-drrdzmaa.js";import{$b as S8,Wb as y$,Xb as d0,Yb as n1,Zb as bQ,_b as S$,ac as u6,bc as mQ,cc as g9,dc as x6,ec as T$,fc as Q1,gc as aJ,hc as r0,ic as DJ,jc as W2,kc as J8,nc as v4,uc as g0}from"./chunk-sanhjqpd.js";import"./chunk-g6h6h8xr.js";import"./chunk-fvhc1yj8.js";import"./chunk-dqvcgwhe.js";import{Ec as pQ}from"./chunk-ea7wsges.js";import"./chunk-gxmrakrk.js";import"./chunk-yc53wz4r.js";import{Kc as q6,Nc as RJ,Tc as GJ,Zc as iJ}from"./chunk-am8dtvff.js";import"./chunk-35yktzm1.js";import"./chunk-63ysxybd.js";import{gd as RQ,id as q1}from"./chunk-vpj0sv73.js";import"./chunk-qm11hjd3.js";import{kd as lJ,nd as i1}from"./chunk-qda309d9.js";import{$d as KJ,Rd as dJ,ae as rJ}from"./chunk-rh7v814a.js";import"./chunk-tq52pbde.js";import{le as k$,me as k8,ne as yQ}from"./chunk-79s052sw.js";import{re as u0}from"./chunk-epj56s0n.js";import{se as x9,te as l9,we as S1}from"./chunk-gxzbv67r.js";import"./chunk-bexgcc2d.js";import{Ie as S9}from"./chunk-1vx4sf1y.js";import{Je as iQ}from"./chunk-z906d5tb.js";import"./chunk-948qe2pp.js";import"./chunk-0n97186m.js";import{Ve as PQ}from"./chunk-9ffr01c3.js";import{useMemoizedFn as C2}from"ahooks";import{useEffect as TX,useState as I2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as U$}from"ink";import{useEffect as K$,useMemo as AX,useRef as R2}from"react";import{useShallow as eJ}from"zustand/react/shallow";import{useStore as sJ}from"zustand";function J0($){return sJ(T$,$)}var $Y=[],v$=()=>J0(($)=>$.session.sessionId),M1=()=>J0(($)=>$.session.workspaceRoot),oQ=()=>J0(($)=>$.session.messages),nQ=()=>J0(($)=>$.session.clearCount),tQ=()=>J0(($)=>$.session.isCompacting),sQ=()=>J0(($)=>$.session.tokenUsage.estimatedCostUsd),d1=()=>J0(($)=>$.session.actions),eQ=()=>J0(($)=>{let{inputTokens:Q,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Q/Y*100);return Math.round(J)}),$4=()=>J0(($)=>$.app.initializationStatus),Q4=()=>J0(($)=>$.app.initializationError),b8=()=>J0(($)=>$.app.activeModal),J4=()=>J0(($)=>$.app.tasks),Y4=()=>J0(($)=>$.app.modelEditorTarget),Z4=()=>J0(($)=>$.app.sessionSelectorData),X4=()=>J0(($)=>$.app.awaitingSecondCtrlC),r1=()=>J0(($)=>$.app.actions),A8=()=>J0(($)=>$.app.initializationStatus==="ready"),U4=()=>J0(($)=>$.app.tasks.length>0),f$=()=>J0(($)=>$.config.config?.permissionMode||"default"),K4=()=>J0(($)=>$.config.config?.models??$Y),P8=()=>J0(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),R8=()=>J0(($)=>$.config.config?.currentModelId),A0=()=>J0(($)=>{return d0.getTheme()}),G4=()=>J0(($)=>$.config.config?.theme??"default"),$1=()=>J0(($)=>$.focus.currentFocus),q4=()=>J0(($)=>$.focus.actions),a1=()=>J0(($)=>$.command.isProcessing),O4=()=>J0(($)=>$.command.actions),y8=()=>J0(($)=>$.command.pendingCommands),z4=()=>J0(($)=>$.command.recoveredSteeringCount),M8=()=>J0(($)=>$.app.thinkingModeEnabled),C8=()=>J0(($)=>$.app.reasoningEffort),I8=()=>J0(($)=>$.app.serviceTier),T8=()=>J0(($)=>$.app.responseVerbosity),v8=()=>J0(($)=>$.app.communicationStyle),_4=()=>J0(($)=>$.session.currentThinkingContent),N4=()=>J0(($)=>$.session.thinkingExpanded),F4=()=>J0(($)=>$.session.currentStreamingMessageId),H4=()=>J0(eJ(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),W4=()=>J0(($)=>$.session.finalizingStreamingMessageId),L4=()=>J0(($)=>$.session.historyExpanded),B4=()=>J0(($)=>$.session.expandedMessageCount);import{useMemoizedFn as V$}from"ahooks";import{useEffect as E2,useRef as h4}from"react";function QY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let U=JSON.parse(J.responseBody)?.error?.message;if(U){let K=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${U}${K}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function JY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function YY($){if(!($ instanceof Error))return!1;let Q=$.message;return Q.includes("can only concatenate str")||Q.includes("image_url")||Q.includes("multimodal")||Q.includes("vision")||Q.includes("does not support images")}function f8($){let Q=JY($),Y=YY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=QY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as ZY,mkdirSync as XY,writeFileSync as UY}from"node:fs";import KY from"node:os";import k2 from"node:path";var w4=null;function GY(){let $=process.env.BLADE_STORAGE_ROOT||k2.join(KY.homedir(),".blade");return k2.join($,"logs","stream-debug.log")}function qY($){if(w4===$)return;let Q=k2.dirname($);XY(Q,{recursive:!0,mode:493}),UY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
- `),w4=$}function D2($,Q,Y){try{let J=GY();qY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",U=`[${Z}] [${$}] ${Q}${X}
3
- `;ZY(J,U)}catch{}}var e$=i1("UI");function P4($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,D2("loopEventHandler","onContentDelta",{callCount:Q.contentDeltaCount,deltaLen:J.delta.length,totalLen:Q.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(J.delta);break;case"thinking_delta":if(Y||$.signal.aborted)break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(J.delta);break;case"stream_end":{if(e$.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),D2("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),Y||$.signal.aborted){Y=!0;break}let{extraContent:Z,extraThinking:X}=$.streamingBuffer.drainPendingBuffers(),U=$.getStreamingMessageId();if(U){if(Z)S$(U,Z);S8(U)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(e$.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:J.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let X=JSON.parse(Z.function.arguments),U=b4(Z.function.name,X);$.sessionActions.addToolMessage(U,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:U,params:X})}catch(X){e$.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",U=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(U,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:U});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;e$.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=A4(Z.function.name,J.result);$.sessionActions.addToolMessage(X.summary,{toolCallId:Z.id,toolName:Z.function.name,phase:"complete",summary:X.summary,detail:X.detail});break}case"token_usage":$.sessionActions.updateTokenUsage(J.usage);break;case"compaction":if($.sessionActions.setCompacting(J.phase==="start"),J.phase==="end")$.sessionActions.resetContextUsage();break;case"turn_start":e$.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
1
+ import{e as a9,f as i9}from"./chunk-rw6gv740.js";import{i as EJ,j as gJ,k as mJ}from"./chunk-p196e4rq.js";import{D as O$,E as A4,F as P4,I as Q8,J as OJ,K as zJ,N as _J,O as NJ,T as N6,U as F6,V as sJ,W as k4,Y as D4,_ as Y6,r as J6,u as o2,v as l2,w as a4,x as tJ}from"./chunk-1cvr3qtd.js";import{ca as A9,da as P9,ea as R9,ha as nJ}from"./chunk-g9n211y4.js";import{Na as p2,za as g4}from"./chunk-jqyvnmfr.js";import{Ya as Z8}from"./chunk-sf9pe2n6.js";import{mb as M4,nb as m2,ob as C4,sb as $8,vb as y0}from"./chunk-47dsd91k.js";import"./chunk-k0p9ecgc.js";import{Tb as jJ}from"./chunk-45dcfkwe.js";import{Ub as X8,Vb as E8,Xb as C1}from"./chunk-gb4n3hwj.js";import"./chunk-g4q26d9a.js";import{$b as y$,ac as d0,bc as n1,cc as AQ,dc as S$,ec as S8,fc as x6,gc as pQ,hc as m9,ic as l6,jc as T$,kc as Q1,lc as iJ,mc as r0,nc as VJ,oc as W2,pc as J8,sc as f4,zc as g0}from"./chunk-r083b7vn.js";import"./chunk-yt39kfc6.js";import"./chunk-bnrce0hg.js";import"./chunk-w4zvftrw.js";import{Jc as cQ}from"./chunk-hjsm6ejs.js";import"./chunk-b4n34hrn.js";import"./chunk-v1p80wvh.js";import{Pc as O6,Sc as yJ,Yc as qJ,cd as oJ}from"./chunk-m4htdpr9.js";import"./chunk-4y28hykg.js";import"./chunk-kcwq1e7h.js";import{ld as yQ,nd as q1}from"./chunk-thvwt4kc.js";import"./chunk-p4j4aawd.js";import{pd as dJ,sd as i1}from"./chunk-6cv4gddv.js";import{Wd as rJ,ee as KJ,fe as aJ}from"./chunk-0rp2ck29.js";import"./chunk-xkp4ph6v.js";import{qe as k$,re as k8,se as MQ}from"./chunk-1kg9r8xp.js";import{we as u0}from"./chunk-c9tzf9r5.js";import{Be as S1,xe as l9,ye as d9}from"./chunk-n9khyme2.js";import"./chunk-7xm3vjkz.js";import{Ne as k9}from"./chunk-nfmsn652.js";import{Oe as oQ}from"./chunk-kcs3xa8f.js";import"./chunk-vvbd9fb5.js";import"./chunk-frcg8gea.js";import{_e as RQ}from"./chunk-c2rhwxyn.js";import{useMemoizedFn as C2}from"ahooks";import{useEffect as vX,useState as I2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as U$}from"ink";import{useEffect as G$,useMemo as PX,useRef as R2}from"react";import{useShallow as $Y}from"zustand/react/shallow";import{useStore as eJ}from"zustand";function J0($){return eJ(T$,$)}var QY=[],v$=()=>J0(($)=>$.session.sessionId),M1=()=>J0(($)=>$.session.workspaceRoot),nQ=()=>J0(($)=>$.session.messages),tQ=()=>J0(($)=>$.session.clearCount),sQ=()=>J0(($)=>$.session.isCompacting),eQ=()=>J0(($)=>$.session.tokenUsage.estimatedCostUsd),d1=()=>J0(($)=>$.session.actions),$4=()=>J0(($)=>{let{inputTokens:Q,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Q/Y*100);return Math.round(J)}),Q4=()=>J0(($)=>$.app.initializationStatus),J4=()=>J0(($)=>$.app.initializationError),b8=()=>J0(($)=>$.app.activeModal),Y4=()=>J0(($)=>$.app.tasks),Z4=()=>J0(($)=>$.app.modelEditorTarget),X4=()=>J0(($)=>$.app.sessionSelectorData),U4=()=>J0(($)=>$.app.awaitingSecondCtrlC),r1=()=>J0(($)=>$.app.actions),A8=()=>J0(($)=>$.app.initializationStatus==="ready"),G4=()=>J0(($)=>$.app.tasks.length>0),f$=()=>J0(($)=>$.config.config?.permissionMode||"default"),K4=()=>J0(($)=>$.config.config?.models??QY),P8=()=>J0(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),R8=()=>J0(($)=>$.config.config?.currentModelId),A0=()=>J0(($)=>{return d0.getTheme()}),q4=()=>J0(($)=>$.config.config?.theme??"default"),$1=()=>J0(($)=>$.focus.currentFocus),O4=()=>J0(($)=>$.focus.actions),a1=()=>J0(($)=>$.command.isProcessing),z4=()=>J0(($)=>$.command.actions),y8=()=>J0(($)=>$.command.pendingCommands),_4=()=>J0(($)=>$.command.recoveredSteeringCount),M8=()=>J0(($)=>$.app.thinkingModeEnabled),C8=()=>J0(($)=>$.app.reasoningEffort),I8=()=>J0(($)=>$.app.serviceTier),T8=()=>J0(($)=>$.app.responseVerbosity),v8=()=>J0(($)=>$.app.communicationStyle),N4=()=>J0(($)=>$.session.currentThinkingContent),F4=()=>J0(($)=>$.session.thinkingExpanded),H4=()=>J0(($)=>$.session.currentStreamingMessageId),W4=()=>J0($Y(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),L4=()=>J0(($)=>$.session.finalizingStreamingMessageId),B4=()=>J0(($)=>$.session.historyExpanded),w4=()=>J0(($)=>$.session.expandedMessageCount);import{useMemoizedFn as V$}from"ahooks";import{useEffect as E2,useRef as E4}from"react";function JY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let U=JSON.parse(J.responseBody)?.error?.message;if(U){let G=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${U}${G}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function YY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function ZY($){if(!($ instanceof Error))return!1;let Q=$.message;return Q.includes("can only concatenate str")||Q.includes("image_url")||Q.includes("multimodal")||Q.includes("vision")||Q.includes("does not support images")}function f8($){let Q=YY($),Y=ZY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=JY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as XY,mkdirSync as UY,writeFileSync as GY}from"node:fs";import KY from"node:os";import k2 from"node:path";var b4=null;function qY(){let $=process.env.BLADE_STORAGE_ROOT||k2.join(KY.homedir(),".blade");return k2.join($,"logs","stream-debug.log")}function OY($){if(b4===$)return;let Q=k2.dirname($);UY(Q,{recursive:!0,mode:493}),GY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
+ `),b4=$}function D2($,Q,Y){try{let J=qY();OY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",U=`[${Z}] [${$}] ${Q}${X}
3
+ `;XY(J,U)}catch{}}var e$=i1("UI");function R4($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,D2("loopEventHandler","onContentDelta",{callCount:Q.contentDeltaCount,deltaLen:J.delta.length,totalLen:Q.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(J.delta);break;case"thinking_delta":if(Y||$.signal.aborted)break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(J.delta);break;case"stream_end":{if(e$.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),D2("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),Y||$.signal.aborted){Y=!0;break}let{extraContent:Z,extraThinking:X}=$.streamingBuffer.drainPendingBuffers(),U=$.getStreamingMessageId();if(U){if(Z)S$(U,Z);S8(U)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(e$.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:J.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let X=JSON.parse(Z.function.arguments),U=A4(Z.function.name,X);$.sessionActions.addToolMessage(U,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:U,params:X})}catch(X){e$.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",U=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(U,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:U});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;e$.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=P4(Z.function.name,J.result);$.sessionActions.addToolMessage(X.summary,{toolCallId:Z.id,toolName:Z.function.name,phase:"complete",summary:X.summary,detail:X.detail});break}case"token_usage":$.sessionActions.updateTokenUsage(J.usage);break;case"compaction":if($.sessionActions.setCompacting(J.phase==="start"),J.phase==="end")$.sessionActions.resetContextUsage();break;case"turn_start":e$.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
4
4
  `)});break}case"mcp_content_changed":{let Z=`MCP ${J.contentKind} r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Content",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
5
5
  `)});break}case"mcp_resource_updated":{let Z=`MCP resource updated: ${J.uri}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Resource",phase:"progress",summary:Z,detail:`${J.serverName} · revision ${J.revision}`});break}case"mcp_connection_changed":{let Z=J.phase==="reconnecting"?"recovering":J.phase==="recovered"?"recovered":"recovery failed",X=`MCP ${J.serverName} ${Z}`+(J.phase==="reconnecting"?` (${J.attempt}/${J.maxAttempts})`:"");$.sessionActions.addToolMessage(X,{toolName:"MCP Connection",phase:"complete",summary:X,detail:[`reason: ${J.reason}`,`revision: ${J.revision}`,J.error?`error: ${J.error}`:""].filter(Boolean).join(`
6
6
  `)});break}case"mcp_log":{let Z=J.logger?`${J.serverName} · ${J.logger}`:J.serverName,X=`MCP ${J.level} · ${Z}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Log",phase:"complete",summary:X,detail:[J.message,`revision: ${J.revision}`,`sha256: ${J.dataSha256}`,J.truncated?"truncated: true":"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
@@ -8,7 +8,7 @@ import{e as r9,f as a9}from"./chunk-ygx03mdh.js";import{i as hJ,j as EJ,k as gJ}
8
8
  `)});break}case"mcp_task_changed":{let Z=`MCP task ${J.status}: ${J.taskId} (${J.serverName}/${J.toolName})`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Task",phase:"complete",summary:Z,detail:[J.statusMessage??"",`revision: ${J.revision}`,J.hasResult?"result available via TaskOutput":"",J.error?`error: ${J.error}`:""].filter(Boolean).join(`
9
9
  `)});break}case"project_rules_loaded":{let Z=`Project rules loaded: ${J.files.length}`+(J.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Z,{toolName:"Project Rules",phase:"complete",summary:Z,detail:J.files.map((X)=>`${X.relativePath} ${X.source} sha256=${X.contentSha256}`).join(`
10
10
  `)});break}case"steering_applied":for(let Z=0;Z<J.count;Z++)$.commandActions.dequeueCommand();if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"follow_up_started":for(let Z of J.messages){if(!Z.recovered||Z.persisted)continue;let X=typeof Z.content==="string"?Z.content:Z.content.map((U)=>U.type==="text"?U.text:"[Image]").join(`
11
- `);$.sessionActions.addUserMessage(X)}if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=J}}}}function j2($){let{text:Q,parts:Y}=$,J=Y.filter((U)=>U.type==="image");if(J.length===0)return Q;if(J.length>k$)throw Error(`最多只能发送 ${k$} 张图片`);if(J.reduce((U,K)=>U+`data:${K.mimeType};base64,`.length+K.base64.length,0)>k8)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let U of Y)if(U.type==="text")X.push({type:"text",text:U.text});else X.push({type:"image_url",image_url:{url:`data:${U.mimeType};base64,${U.base64}`}});return X}function R4($){let Q=M4($.metadata);return{role:$.role,content:Q?y4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function D8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(R4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(R4);return[...$.restoredContextMessages,...Q]}import OY from"node:path";function C4($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function zY($){return OY.resolve($)}function I4($){if(!$||!v4($))return;Q1().config.actions.updateConfig({currentModelId:$})}function T4($){if(!$)return;Q1().config.actions.updateConfig({permissionMode:$})}async function V8($,Q){return y0.listSessions({includeSubagents:!1})}async function j8($,Q,Y,J){let{intent:Z,session:X,newSessionId:U,announceFork:K,permissionModeOverride:G}=$,q=zY(X.projectPath);if(Z==="fork"){let N=await y0.forkSession(X.sessionId,{...U?{newSessionId:U}:{},sourceProjectPath:q,targetProjectPath:q}),_=[...y0.toUISafeMessages(N.messages)];if(K!==!1){let B=Date.parse(N.metadata.lastMessageTime);_.push({id:"fork-announcement-"+N.sessionId,role:"assistant",content:"Forked "+C4(X.sessionId)+" → "+C4(N.sessionId),timestamp:Number.isNaN(B)?0:B})}return await J(),T4(G??N.metadata.permissionMode),I4(N.metadata.selectedModelId),Y.restoreSession(N.sessionId,_,N.messages,N.metadata.projectPath),{sessionId:N.sessionId,messages:N.messages}}await y0.assertSessionWritable(X.sessionId,X.projectPath);let F=await y0.loadSession(X.sessionId,X.projectPath),O=y0.toUISafeMessages(F);return await J(),T4(G??X.permissionMode),I4(X.selectedModelId),Y.restoreSession(X.sessionId,O,F,X.projectPath),{sessionId:X.sessionId,messages:F}}function f4($){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 _Y($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function NY($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function FY($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function HY($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function WY($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function LY($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function BY($){if(typeof $!=="object"||$===null)return!1;let Q=$.intent;if(Q!=="resume"&&Q!=="fork")return!1;let Y=$.action;if(Y==="select_session"){let J=$.sessions;return Array.isArray(J)&&J.every((Z)=>f4(Z))}if(Y==="activate_session")return f4($.session);return!1}function wY($,Q,Y,J){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=Q?.sessions;return Y.showSessionSelector(Z??[],"resume"),!0}case"session_forked":{let Z=Q;if(Z?.action!=="restore_forked_session"||!Z.sessionId||!Array.isArray(Z.messages)||!Array.isArray(Z.visibleMessages))return!1;return J.restoreSession(Z.sessionId,Z.visibleMessages,Z.messages),!0}case"session_archived":{let Z=Q?.session;return J.addAssistantMessage(Z?`会话 ${Z.sessionId} 已归档。`:"当前会话已归档。"),C1(0),!0}case"clear_screen":return J.clearMessages(),J.setError(null),J.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let Z=Q,X=Z?.compactedMessages;if(X)J.setCompactedContext(X);if(Z?.usage)J.updateTokenUsage({inputTokens:Z.usage.promptTokens,outputTokens:Z.usage.completionTokens,totalTokens:Z.usage.totalTokens,maxContextTokens:Z.maxContextTokens,cacheReadTokens:Z.usage.cacheReadInputTokens??0,cacheWriteTokens:Z.usage.cacheCreationInputTokens??0,costUsd:Z.usage.costUsd});return J.resetContextUsage(),!0}case"exit_application":return C1(0),!0;default:return!1}}async function h2($,Q,Y,J,Z,X,U,K,G,q,F,O,N,_,B=u0()){let{text:z}=$;if(!S4(z))return{type:"not_slash"};let W=await k4(z,{cwd:B,surface:"tui",workspaceRoot:B,sessionId:X,messages:U,rewind:K,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),y0.archiveSession(X,B)}},subagents:G,mcp:q,reasoning:F,serviceTier:O,responseVerbosity:N,communicationStyle:_,signal:J});if(W.success&&BY(W.data)){if(W.data.action==="select_session")return Q.showSessionSelector(W.data.sessions,W.data.intent),{type:"handled",commandResult:{success:!0}};return await j8(W.data,B,Y,Z),{type:"handled",commandResult:{success:!0}}}if(W.success&&LY(W.data))return Y.restoreSession(W.data.sessionId,W.data.visibleMessages,W.data.messages),Q.setTasks([]),{type:"handled",commandResult:{success:!0}};if(W.message){if(wY(W.message,W.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(_Y(W.data)){let{skillName:T,skillArgs:C}=W.data,w=C?`Please use the "${T}" skill to help me with: ${C}`:`Please use the "${T}" skill.`;return Y.addUserMessage(w),{type:"continue_as_agent",result:{userDisplayMessage:w,agentInput:{displayText:w,text:w,images:[],parts:[{type:"text",text:w}]},userMessageAlreadyAdded:!0}}}if(NY(W.data)){let{commandName:T,processedContent:C}=W.data;Y.addUserMessage(z);let w=`# Custom Command: /${T}
11
+ `);$.sessionActions.addUserMessage(X)}if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=J}}}}function j2($){let{text:Q,parts:Y}=$,J=Y.filter((U)=>U.type==="image");if(J.length===0)return Q;if(J.length>k$)throw Error(`最多只能发送 ${k$} 张图片`);if(J.reduce((U,G)=>U+`data:${G.mimeType};base64,`.length+G.base64.length,0)>k8)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let U of Y)if(U.type==="text")X.push({type:"text",text:U.text});else X.push({type:"image_url",image_url:{url:`data:${U.mimeType};base64,${U.base64}`}});return X}function y4($){let Q=C4($.metadata);return{role:$.role,content:Q?M4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function D8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(y4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(y4);return[...$.restoredContextMessages,...Q]}import zY from"node:path";function I4($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function _Y($){return zY.resolve($)}function T4($){if(!$||!f4($))return;Q1().config.actions.updateConfig({currentModelId:$})}function v4($){if(!$)return;Q1().config.actions.updateConfig({permissionMode:$})}async function V8($,Q){return y0.listSessions({includeSubagents:!1})}async function j8($,Q,Y,J){let{intent:Z,session:X,newSessionId:U,announceFork:G,permissionModeOverride:K}=$,q=_Y(X.projectPath);if(Z==="fork"){let N=await y0.forkSession(X.sessionId,{...U?{newSessionId:U}:{},sourceProjectPath:q,targetProjectPath:q}),_=[...y0.toUISafeMessages(N.messages)];if(G!==!1){let B=Date.parse(N.metadata.lastMessageTime);_.push({id:"fork-announcement-"+N.sessionId,role:"assistant",content:"Forked "+I4(X.sessionId)+" → "+I4(N.sessionId),timestamp:Number.isNaN(B)?0:B})}return await J(),v4(K??N.metadata.permissionMode),T4(N.metadata.selectedModelId),Y.restoreSession(N.sessionId,_,N.messages,N.metadata.projectPath),{sessionId:N.sessionId,messages:N.messages}}await y0.assertSessionWritable(X.sessionId,X.projectPath);let F=await y0.loadSession(X.sessionId,X.projectPath),O=y0.toUISafeMessages(F);return await J(),v4(K??X.permissionMode),T4(X.selectedModelId),Y.restoreSession(X.sessionId,O,F,X.projectPath),{sessionId:X.sessionId,messages:F}}function S4($){return typeof $==="object"&&$!==null&&typeof $.sessionId==="string"&&typeof $.projectPath==="string"&&typeof $.rootId==="string"&&typeof $.messageCount==="number"&&typeof $.firstMessageTime==="string"&&typeof $.lastMessageTime==="string"&&typeof $.hasErrors==="boolean"}function NY($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function FY($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function HY($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function WY($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function LY($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function BY($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function wY($){if(typeof $!=="object"||$===null)return!1;let Q=$.intent;if(Q!=="resume"&&Q!=="fork")return!1;let Y=$.action;if(Y==="select_session"){let J=$.sessions;return Array.isArray(J)&&J.every((Z)=>S4(Z))}if(Y==="activate_session")return S4($.session);return!1}function bY($,Q,Y,J){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=Q?.sessions;return Y.showSessionSelector(Z??[],"resume"),!0}case"session_forked":{let Z=Q;if(Z?.action!=="restore_forked_session"||!Z.sessionId||!Array.isArray(Z.messages)||!Array.isArray(Z.visibleMessages))return!1;return J.restoreSession(Z.sessionId,Z.visibleMessages,Z.messages),!0}case"session_archived":{let Z=Q?.session;return J.addAssistantMessage(Z?`会话 ${Z.sessionId} 已归档。`:"当前会话已归档。"),C1(0),!0}case"clear_screen":return J.clearMessages(),J.setError(null),J.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let Z=Q,X=Z?.compactedMessages;if(X)J.setCompactedContext(X);if(Z?.usage)J.updateTokenUsage({inputTokens:Z.usage.promptTokens,outputTokens:Z.usage.completionTokens,totalTokens:Z.usage.totalTokens,maxContextTokens:Z.maxContextTokens,cacheReadTokens:Z.usage.cacheReadInputTokens??0,cacheWriteTokens:Z.usage.cacheCreationInputTokens??0,costUsd:Z.usage.costUsd});return J.resetContextUsage(),!0}case"exit_application":return C1(0),!0;default:return!1}}async function h2($,Q,Y,J,Z,X,U,G,K,q,F,O,N,_,B=u0()){let{text:z}=$;if(!k4(z))return{type:"not_slash"};let W=await D4(z,{cwd:B,surface:"tui",workspaceRoot:B,sessionId:X,messages:U,rewind:G,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),y0.archiveSession(X,B)}},subagents:K,mcp:q,reasoning:F,serviceTier:O,responseVerbosity:N,communicationStyle:_,signal:J});if(W.success&&wY(W.data)){if(W.data.action==="select_session")return Q.showSessionSelector(W.data.sessions,W.data.intent),{type:"handled",commandResult:{success:!0}};return await j8(W.data,B,Y,Z),{type:"handled",commandResult:{success:!0}}}if(W.success&&BY(W.data))return Y.restoreSession(W.data.sessionId,W.data.visibleMessages,W.data.messages),Q.setTasks([]),{type:"handled",commandResult:{success:!0}};if(W.message){if(bY(W.message,W.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(NY(W.data)){let{skillName:T,skillArgs:C}=W.data,w=C?`Please use the "${T}" skill to help me with: ${C}`:`Please use the "${T}" skill.`;return Y.addUserMessage(w),{type:"continue_as_agent",result:{userDisplayMessage:w,agentInput:{displayText:w,text:w,images:[],parts:[{type:"text",text:w}]},userMessageAlreadyAdded:!0}}}if(FY(W.data)){let{commandName:T,processedContent:C}=W.data;Y.addUserMessage(z);let w=`# Custom Command: /${T}
12
12
 
13
13
  The user has invoked the custom command "/${T}". Follow the instructions below to complete the task.
14
14
 
@@ -18,7 +18,7 @@ ${C}
18
18
 
19
19
  ---
20
20
 
21
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:z,agentInput:{displayText:z,text:w,images:[],parts:[{type:"text",text:w}]},userMessageAlreadyAdded:!0}}}if(FY(W.data)){let{commandName:T,pluginName:C,processedContent:w}=W.data;Y.addUserMessage(z);let S=`# Plugin Command: /${T}
21
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:z,agentInput:{displayText:z,text:w,images:[],parts:[{type:"text",text:w}]},userMessageAlreadyAdded:!0}}}if(HY(W.data)){let{commandName:T,pluginName:C,processedContent:w}=W.data;Y.addUserMessage(z);let S=`# Plugin Command: /${T}
22
22
 
23
23
  The user has invoked the plugin command "/${T}" from plugin "${C}". Follow the instructions below to complete the task.
24
24
 
@@ -28,16 +28,16 @@ ${w}
28
28
 
29
29
  ---
30
30
 
31
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:z,agentInput:{displayText:z,text:S,images:[],parts:[{type:"text",text:S}]},userMessageAlreadyAdded:!0}}}if(HY(W.data)){let{modelId:T,prompt:C}=W.data;return Y.addUserMessage(C),{type:"continue_as_agent",result:{userDisplayMessage:C,agentInput:{displayText:C,text:C,images:[],parts:[{type:"text",text:C}]},userMessageAlreadyAdded:!0,onceModelId:T}}}if(WY(W.data)){let T=W.data.goal.objective;return Y.addUserMessage(z),{type:"continue_as_agent",result:{userDisplayMessage:z,agentInput:{displayText:z,text:T,images:[],parts:[{type:"text",text:T}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!W.success&&W.error)return Y.addAssistantMessage(`${W.error}`),{type:"handled",commandResult:{success:W.success,output:W.message,error:W.error,metadata:W.data}};let A=W.message;if(W.success&&typeof A==="string"&&A.trim()!=="")Y.addAssistantMessage(A);return{type:"handled",commandResult:{success:W.success,output:W.message,error:W.error,metadata:W.data}}}import{useMemoizedFn as M0}from"ahooks";import{useEffect as bY,useRef as h8}from"react";function D4($){let Q=h8(void 0),Y=h8(void 0),J=h8(void 0),Z=h8(void 0),X=M0(async()=>{if(Z.current)return Z.current;let v=Q.current,M=Y.current;if(!v&&!M)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let k=(async()=>{try{await v?.destroy()}finally{await M?.dispose()}})();Z.current=k;try{await k}finally{if(Z.current===k)Z.current=void 0}}),U=M0(async(v)=>{let M=$.workspaceRoot??Y.current?.workspaceRoot??u0();if(Y.current&&(Y.current.sessionId!==v||Y.current.workspaceRoot!==M))await X();if(!Y.current){let k=await y0.findSessionMetadata(v,M),D=k!==void 0&&(await y0.loadSession(v,M)).length>0;Y.current=await O$.create({sessionId:v,workspaceRoot:M,modelId:$.modelId,permissionMode:$.permissionMode??k?.permissionMode,reasoningEffort:k?.reasoningEffort??$.reasoningEffort,serviceTier:k?.serviceTier??$.serviceTier,responseVerbosity:k?.responseVerbosity??$.responseVerbosity,communicationStyle:k?.communicationStyle??$.communicationStyle,communicationStyleDigest:k?.communicationStyleDigest,agents:$.agents,...D?{sessionStart:{isResume:!0,resumeSessionId:v}}:{}});try{J.current={sessionId:v,modelId:k?.selectedModelId,permissionMode:k?.permissionMode,reasoningEffort:k?.reasoningEffort,serviceTier:k?.serviceTier,responseVerbosity:k?.responseVerbosity,communicationStyle:k?.communicationStyle,communicationStyleDigest:k?.communicationStyleDigest},r0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),r0().setServiceTier(Y.current.getServiceTierConfiguration().selection),r0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),r0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(y){let g=Y.current;throw Y.current=void 0,await g.dispose().catch(()=>{return}),y}}return Y.current}),K=M0(async(v)=>{let M=v?.sessionId??$.sessionId,k=!!v?.modelId&&v.modelId!==$.modelId,D;if(!k&&M){let y=Y.current!==void 0,g=await U(M),h=v?.modelId??$.modelId,x=v?.reasoningEffort??(y?$.reasoningEffort:g.getReasoningConfiguration().selection),V=v?.serviceTier??(y?$.serviceTier:g.getServiceTierConfiguration().selection),i=v?.responseVerbosity??(y?$.responseVerbosity:g.getResponseVerbosityConfiguration().selection),U0=v?.communicationStyle??(y?$.communicationStyle:g.getCommunicationStyleConfiguration().selection),q0=g.getCurrentModelId(),R0=g.getReasoningConfiguration(),B0=g.getServiceTierConfiguration(),s0=g.getResponseVerbosityConfiguration(),k0=g.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==M||J.current.permissionMode!==$.permissionMode)){let e0=await y0.setSessionPermissionMode(M,g.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:M,permissionMode:e0.permissionMode}}await g.refresh({modelId:h,...x?{reasoningEffort:x}:{},...V?{serviceTier:V}:{},...i?{responseVerbosity:i}:{},...U0?{communicationStyle:U0}:{}});let F1=g.getCommunicationStyleConfiguration();if(F1.source!=="built-in"&&!F1.contentSha256)throw Error("Custom communication style has no provenance");let C$={...h&&h!=="inherit"&&(J.current?.sessionId!==M||J.current.modelId!==h)?{selectedModelId:h}:{},...x&&(J.current?.sessionId!==M||J.current.reasoningEffort!==x)?{reasoningEffort:x}:{},...V&&(J.current?.sessionId!==M||J.current.serviceTier!==V)?{serviceTier:V}:{},...i&&(J.current?.sessionId!==M||J.current.responseVerbosity!==i)?{responseVerbosity:i}:{},...U0&&(J.current?.sessionId!==M||J.current.communicationStyle!==U0||J.current.communicationStyleDigest!==F1.contentSha256)?{communicationStyle:U0,communicationStyleDigest:F1.source==="built-in"?null:F1.contentSha256}:{}};if(Object.keys(C$).length>0)try{let e0=await y0.updateSessionMetadata(M,g.workspaceRoot,C$);J.current={sessionId:M,modelId:e0.selectedModelId,permissionMode:e0.permissionMode,reasoningEffort:e0.reasoningEffort,serviceTier:e0.serviceTier,responseVerbosity:e0.responseVerbosity,communicationStyle:e0.communicationStyle,communicationStyleDigest:e0.communicationStyleDigest}}catch(e0){throw await g.refresh({...q0?{modelId:q0}:{},reasoningEffort:R0.selection,serviceTier:B0.selection,responseVerbosity:s0.selection,communicationStyle:k0.selection}).catch(()=>{return}),e0}D=await Q8.createWithRuntime(g,{sessionId:M,systemPrompt:v?.systemPrompt??$.systemPrompt,appendSystemPrompt:v?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:v?.maxTurns??$.maxTurns,modelId:v?.modelId??$.modelId,permissionMode:v?.permissionMode??$.permissionMode,agents:$.agents})}else D=await Q8.create({systemPrompt:v?.systemPrompt??$.systemPrompt,appendSystemPrompt:v?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:v?.maxTurns??$.maxTurns,modelId:v?.modelId??$.modelId,permissionMode:v?.permissionMode??$.permissionMode,agents:$.agents});return Q.current=D,D}),G=M0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await U($.sessionId)).listRewindCheckpoints()}),q=M0(async(v)=>{if(!$.sessionId)throw Error("No active session to rewind");let k=await(await U($.sessionId)).rewindSession(v);return await X(),k}),F=M0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await U($.sessionId)).listSubagents()}),O=M0(async(v,M)=>{if(!$.sessionId)throw Error("No active session for subagent control");let k=await U($.sessionId),D=!1,y,g=v,h=(V)=>{T$.getState().app.actions.completeSubagentProgress(g,V.status==="completed")},x=k.resumeSubagent({agentId:v,prompt:M,onEvent:(V)=>{if(V.kind==="tool_start"&&"function"in V.toolCall)T$.getState().app.actions.updateSubagentTool(g,V.toolCall.function.name)},onCompleted:(V)=>{if(D)h(V);else y=V}});if(g=x.session.id,T$.getState().app.actions.startSubagentProgress(x.session.id,x.session.subagentType,`Resumed from ${x.source.id}: ${x.session.description}`),D=!0,y)h(y);return x}),N=M0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await U($.sessionId)).getMcpContentCatalog()}),_=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await U($.sessionId)).refreshMcpContentCatalogs(v)}),B=M0(async(v,M,k)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await U($.sessionId)).getMcpPrompt(v,M,k)}),z=M0(async(v,M,k)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await U($.sessionId)).completeMcpArgument(v,M,k)}),L=M0(async(v,M={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await U($.sessionId)).getMcpLogs(v,M)}),W=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).listMcpTasks(v)}),A=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).getMcpTask(v)}),T=M0(async(v,M)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).cancelMcpTask(v,M)}),C=M0(async(v,M)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await U($.sessionId)).setMcpLoggingLevel(v,M)}),w=M0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await U($.sessionId)).getMcpInstructions()}),S=M0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await U($.sessionId)).getReasoningConfiguration()}),P=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let M=await U($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let k=M.getReasoningConfiguration();if(M.resolveReasoningConfiguration(v),k.selection===v)return k;await M.refresh({reasoningEffort:v});try{let D;try{D=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{reasoningEffort:v})}catch(y){if(!(y instanceof $8)&&y.code!=="ENOENT")throw y;D=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:v,serviceTier:M.getServiceTierConfiguration().selection,responseVerbosity:M.getResponseVerbosityConfiguration().selection,communicationStyle:M.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},r0().setReasoningEffort(v),M.getReasoningConfiguration()}catch(D){throw await M.refresh({reasoningEffort:k.selection}),D}}),b=M0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await U($.sessionId)).getServiceTierConfiguration()}),I=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for service tier");let M=await U($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let k=M.getServiceTierConfiguration();if(M.resolveServiceTierConfiguration(v),k.selection===v)return k;await M.refresh({serviceTier:v});try{let D;try{D=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{serviceTier:v})}catch(y){if(!(y instanceof $8)&&y.code!=="ENOENT")throw y;D=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:M.getReasoningConfiguration().selection,serviceTier:v,responseVerbosity:M.getResponseVerbosityConfiguration().selection,communicationStyle:M.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},r0().setServiceTier(v),M.getServiceTierConfiguration()}catch(D){throw await M.refresh({serviceTier:k.selection}),D}}),R=M0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await U($.sessionId)).getResponseVerbosityConfiguration()}),H=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let M=await U($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let k=M.getResponseVerbosityConfiguration();if(M.resolveResponseVerbosityConfiguration(v),k.selection===v)return k;await M.refresh({responseVerbosity:v});try{let D;try{D=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{responseVerbosity:v})}catch(y){if(!(y instanceof $8)&&y.code!=="ENOENT")throw y;D=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:M.getReasoningConfiguration().selection,serviceTier:M.getServiceTierConfiguration().selection,responseVerbosity:v,communicationStyle:M.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},r0().setResponseVerbosity(v),M.getResponseVerbosityConfiguration()}catch(D){throw await M.refresh({responseVerbosity:k.selection}),D}}),f=M0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await U($.sessionId)).getCommunicationStyleConfiguration()}),E=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for communication style");let M=await U($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let k=M.getCommunicationStyleConfiguration(),D=M.resolveCommunicationStyleConfiguration(v);if(D.source!=="built-in"&&!D.contentSha256)throw Error("Custom communication style has no provenance");if(k.selection===v)return k;await M.refresh({communicationStyle:v});try{let y;try{y=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{communicationStyle:v,communicationStyleDigest:D.source==="built-in"?null:D.contentSha256})}catch(g){if(!(g instanceof $8)&&g.code!=="ENOENT")throw g;y=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:M.getReasoningConfiguration().selection,serviceTier:M.getServiceTierConfiguration().selection,responseVerbosity:M.getResponseVerbosityConfiguration().selection,communicationStyle:v,...D.source!=="built-in"&&D.contentSha256?{communicationStyleDigest:D.contentSha256}:{}})}return J.current={sessionId:$.sessionId,modelId:y.selectedModelId,permissionMode:y.permissionMode,reasoningEffort:y.reasoningEffort,serviceTier:y.serviceTier,responseVerbosity:y.responseVerbosity,communicationStyle:y.communicationStyle,communicationStyleDigest:y.communicationStyleDigest},r0().setCommunicationStyle(v),M.getCommunicationStyleConfiguration()}catch(y){throw await M.refresh({communicationStyle:k.selection}),y}}),t=M0(async(v)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(v,{allowBeforeTurn:!0})}),l=M0(async(v,M)=>{let k=$.sessionId;if(!k)throw Error("User shell command requires a Session");return(await U(k)).executeUserShellCommand(v,M)});return bY(()=>{let v=E8(X);return()=>{v(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:K,cleanupAgent:X,steerActiveTurn:t,executeUserShellCommand:l,listRewindCheckpoints:G,rewindSession:q,listSubagents:F,resumeSubagent:O,getMcpContentCatalog:N,refreshMcpContentCatalogs:_,getMcpPrompt:B,completeMcpArgument:z,listMcpTasks:W,getMcpTask:A,cancelMcpTask:T,getMcpLogs:L,setMcpLoggingLevel:C,getMcpInstructions:w,getReasoningConfiguration:S,setReasoningEffort:P,getServiceTierConfiguration:b,setServiceTier:I,getResponseVerbosityConfiguration:R,setResponseVerbosity:H,getCommunicationStyleConfiguration:f,setCommunicationStyle:E}}import{useMemoizedFn as D$}from"ahooks";import{useEffect as AY,useRef as g8}from"react";function V4($){let Q=0;for(let Y of $)if(Y===`
32
- `)Q++;return Q}function j4($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=g8(""),U=g8(null),K=g8(""),G=g8(null),q=D$(()=>{if(X.current){let z=X.current,L=$.appendAssistantContent(z);S$(L,z),X.current=""}if(U.current)clearTimeout(U.current),U.current=null}),F=D$(()=>{if(K.current)$.appendThinkingContent(K.current),K.current="";if(G.current)clearTimeout(G.current),G.current=null}),O=D$((z)=>{X.current+=z;let L=X.current;if(V4(L)>=J||L.length>=Z){q();return}if(!U.current)U.current=setTimeout(q,Y)}),N=D$((z)=>{K.current+=z;let L=K.current;if(V4(L)>=J||L.length>=Z){F();return}if(!G.current)G.current=setTimeout(F,Y)}),_=D$(()=>{if(X.current="",U.current)clearTimeout(U.current),U.current=null;if(K.current="",G.current)clearTimeout(G.current),G.current=null}),B=D$(()=>{if(U.current)clearTimeout(U.current),U.current=null;if(G.current)clearTimeout(G.current),G.current=null;let z=X.current,L=K.current;return X.current="",K.current="",{extraContent:z,extraThinking:L}});return AY(()=>{return()=>{_()}},[_]),{batchAppendContent:O,batchAppendThinking:N,flushContentBuffer:q,flushThinkingBuffer:F,resetStreamingBuffers:_,drainPendingBuffers:B}}var g2=i1("UI"),g4=($,Q,Y,J,Z,X)=>{let U=a1(),K=v$(),G=M1(),q=R8(),F=f$(),O=M8(),N=C8(),_=I8(),B=T8(),z=v8(),L=d1(),W=r1(),A=O4(),T=h4(!1),C=h4(!1),{createAgent:w,cleanupAgent:S,steerActiveTurn:P,listRewindCheckpoints:b,rewindSession:I,listSubagents:R,resumeSubagent:H,getMcpContentCatalog:f,refreshMcpContentCatalogs:E,getMcpPrompt:t,completeMcpArgument:l,listMcpTasks:v,getMcpTask:M,cancelMcpTask:k,getMcpLogs:D,setMcpLoggingLevel:y,getMcpInstructions:g,getReasoningConfiguration:h,setReasoningEffort:x,getServiceTierConfiguration:V,setServiceTier:i,getResponseVerbosityConfiguration:U0,setResponseVerbosity:q0,getCommunicationStyleConfiguration:R0,setCommunicationStyle:B0,executeUserShellCommand:s0}=D4({sessionId:K,workspaceRoot:G,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:q,permissionMode:F,reasoningEffort:N,serviceTier:_,responseVerbosity:B,communicationStyle:z,agents:X}),k0=j4(L),F1=V$(async(O0,p0)=>{if(O0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let s=O0.text.trimStart().slice(1).trim();if(!s)return{success:!1,error:"User shell command cannot be empty"};L.setCommand(`! ${s}`);try{let K0=await s0(s,{signal:p0});if(L.addMessage({id:`user-shell-${K0.executionId}`,role:"user",content:m2(K0.record),timestamp:Date.now(),metadata:{userShellCommand:K0.record}}),K0.delivery==="next_turn")C.current=!0;return{success:K0.record.status!=="spawn_error",output:m2(K0.record),...K0.record.status==="spawn_error"?{error:K0.record.stderr||"User shell command failed"}:{}}}finally{L.setCommand(null)}});E2(()=>{return()=>{k0.resetStreamingBuffers()}},[k0.resetStreamingBuffers]),E2(()=>{if(!O)L.setCurrentThinkingContent(null)},[O,L]);let C$=V$(()=>{if(!U)return;Z?.();let{extraContent:O0,extraThinking:p0}=k0.drainPendingBuffers();A.abort("user-cancel"),W.setTasks([]);let s=Q1().session.currentStreamingMessageId;if(s){if(O0)S$(s,O0);S8(s)}if(L.finalizeStreamingMessage(O0,p0),!T.current)L.addAssistantMessage("任务已停止"),T.current=!0}),e0=V$(async(O0,p0)=>{let s={contentDeltaCount:0,contentDeltaTotalLen:0},K0=P4({sessionActions:L,appActions:W,commandActions:A,streamingBuffer:k0,thinkingModeEnabled:O,getStreamingMessageId:()=>Q1().session.currentStreamingMessageId,signal:p0.signal},s);return{loopResult:await E4(O0,K0),stats:s}}),T2=V$(async(O0)=>{let p0=!1,s,K0=!1,c0=O0;try{if(O0.text.trimStart().startsWith("!")){let V0=A.getAbortController()??A.createAbortController();return await F1(O0,V0.signal)}await J8();let i0=A.getAbortController()??A.createAbortController(),h0=await h2(O0,W,L,i0.signal,S,K,D8(Q1().session),{listCheckpoints:b,execute:I},{list:R,resume:H},{getCatalog:f,refresh:E,getPrompt:t,complete:l,listTasks:v,getTask:M,cancelTask:k,getLogs:D,setLoggingLevel:y,getInstructions:g},{get:h,set:x},{get:V,set:i},{get:U0,set:q0},{get:R0,set:B0},G);if(h0.type==="handled")return h0.commandResult;if(h0.type==="continue_as_agent")p0=h0.result.userMessageAlreadyAdded,s=h0.result.onceModelId,K0=h0.result.goalContinuationOnly===!0,c0=h0.result.agentInput;let f2=q1.getInstance(),t$;if(!K0){let V0=await f2.executeUserPromptSubmitHooks(c0.text,{projectDir:G,sessionId:K,permissionMode:F,hasImages:c0.images.length>0,imageCount:c0.images.length});if(!V0.proceed){if(V0.warning)L.addAssistantMessage(`${V0.warning}`);return{success:!1,error:"blocked by hook"}}if(V0.updatedPrompt)c0={...c0,text:V0.updatedPrompt,displayText:V0.updatedPrompt,parts:[{type:"text",text:V0.updatedPrompt},...c0.parts.filter((I$)=>I$.type==="image")]};if(V0.contextInjection)t$=V0.contextInjection}if(!p0)L.addUserMessage(c0.displayText);let S2=j2(c0),B8=await w(s?{modelId:s}:void 0);if(i0.signal.aborted)return g2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};let s$=D8(Q1().session);if(t$)s$.push({role:"system",content:`<user-prompt-submit-hook>
31
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:z,agentInput:{displayText:z,text:S,images:[],parts:[{type:"text",text:S}]},userMessageAlreadyAdded:!0}}}if(WY(W.data)){let{modelId:T,prompt:C}=W.data;return Y.addUserMessage(C),{type:"continue_as_agent",result:{userDisplayMessage:C,agentInput:{displayText:C,text:C,images:[],parts:[{type:"text",text:C}]},userMessageAlreadyAdded:!0,onceModelId:T}}}if(LY(W.data)){let T=W.data.goal.objective;return Y.addUserMessage(z),{type:"continue_as_agent",result:{userDisplayMessage:z,agentInput:{displayText:z,text:T,images:[],parts:[{type:"text",text:T}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!W.success&&W.error)return Y.addAssistantMessage(`${W.error}`),{type:"handled",commandResult:{success:W.success,output:W.message,error:W.error,metadata:W.data}};let A=W.message;if(W.success&&typeof A==="string"&&A.trim()!=="")Y.addAssistantMessage(A);return{type:"handled",commandResult:{success:W.success,output:W.message,error:W.error,metadata:W.data}}}import{useMemoizedFn as M0}from"ahooks";import{useEffect as AY,useRef as h8}from"react";function V4($){let Q=h8(void 0),Y=h8(void 0),J=h8(void 0),Z=h8(void 0),X=M0(async()=>{if(Z.current)return Z.current;let v=Q.current,M=Y.current;if(!v&&!M)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let k=(async()=>{try{await v?.destroy()}finally{await M?.dispose()}})();Z.current=k;try{await k}finally{if(Z.current===k)Z.current=void 0}}),U=M0(async(v)=>{let M=$.workspaceRoot??Y.current?.workspaceRoot??u0();if(Y.current&&(Y.current.sessionId!==v||Y.current.workspaceRoot!==M))await X();if(!Y.current){let k=await y0.findSessionMetadata(v,M),D=k!==void 0&&(await y0.loadSession(v,M)).length>0;Y.current=await O$.create({sessionId:v,workspaceRoot:M,modelId:$.modelId,permissionMode:$.permissionMode??k?.permissionMode,reasoningEffort:k?.reasoningEffort??$.reasoningEffort,serviceTier:k?.serviceTier??$.serviceTier,responseVerbosity:k?.responseVerbosity??$.responseVerbosity,communicationStyle:k?.communicationStyle??$.communicationStyle,communicationStyleDigest:k?.communicationStyleDigest,agents:$.agents,...D?{sessionStart:{isResume:!0,resumeSessionId:v}}:{}});try{J.current={sessionId:v,modelId:k?.selectedModelId,permissionMode:k?.permissionMode,reasoningEffort:k?.reasoningEffort,serviceTier:k?.serviceTier,responseVerbosity:k?.responseVerbosity,communicationStyle:k?.communicationStyle,communicationStyleDigest:k?.communicationStyleDigest},r0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),r0().setServiceTier(Y.current.getServiceTierConfiguration().selection),r0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),r0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(y){let g=Y.current;throw Y.current=void 0,await g.dispose().catch(()=>{return}),y}}return Y.current}),G=M0(async(v)=>{let M=v?.sessionId??$.sessionId,k=!!v?.modelId&&v.modelId!==$.modelId,D;if(!k&&M){let y=Y.current!==void 0,g=await U(M),h=v?.modelId??$.modelId,x=v?.reasoningEffort??(y?$.reasoningEffort:g.getReasoningConfiguration().selection),V=v?.serviceTier??(y?$.serviceTier:g.getServiceTierConfiguration().selection),i=v?.responseVerbosity??(y?$.responseVerbosity:g.getResponseVerbosityConfiguration().selection),U0=v?.communicationStyle??(y?$.communicationStyle:g.getCommunicationStyleConfiguration().selection),q0=g.getCurrentModelId(),R0=g.getReasoningConfiguration(),B0=g.getServiceTierConfiguration(),s0=g.getResponseVerbosityConfiguration(),k0=g.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==M||J.current.permissionMode!==$.permissionMode)){let e0=await y0.setSessionPermissionMode(M,g.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:M,permissionMode:e0.permissionMode}}await g.refresh({modelId:h,...x?{reasoningEffort:x}:{},...V?{serviceTier:V}:{},...i?{responseVerbosity:i}:{},...U0?{communicationStyle:U0}:{}});let F1=g.getCommunicationStyleConfiguration();if(F1.source!=="built-in"&&!F1.contentSha256)throw Error("Custom communication style has no provenance");let C$={...h&&h!=="inherit"&&(J.current?.sessionId!==M||J.current.modelId!==h)?{selectedModelId:h}:{},...x&&(J.current?.sessionId!==M||J.current.reasoningEffort!==x)?{reasoningEffort:x}:{},...V&&(J.current?.sessionId!==M||J.current.serviceTier!==V)?{serviceTier:V}:{},...i&&(J.current?.sessionId!==M||J.current.responseVerbosity!==i)?{responseVerbosity:i}:{},...U0&&(J.current?.sessionId!==M||J.current.communicationStyle!==U0||J.current.communicationStyleDigest!==F1.contentSha256)?{communicationStyle:U0,communicationStyleDigest:F1.source==="built-in"?null:F1.contentSha256}:{}};if(Object.keys(C$).length>0)try{let e0=await y0.updateSessionMetadata(M,g.workspaceRoot,C$);J.current={sessionId:M,modelId:e0.selectedModelId,permissionMode:e0.permissionMode,reasoningEffort:e0.reasoningEffort,serviceTier:e0.serviceTier,responseVerbosity:e0.responseVerbosity,communicationStyle:e0.communicationStyle,communicationStyleDigest:e0.communicationStyleDigest}}catch(e0){throw await g.refresh({...q0?{modelId:q0}:{},reasoningEffort:R0.selection,serviceTier:B0.selection,responseVerbosity:s0.selection,communicationStyle:k0.selection}).catch(()=>{return}),e0}D=await Q8.createWithRuntime(g,{sessionId:M,systemPrompt:v?.systemPrompt??$.systemPrompt,appendSystemPrompt:v?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:v?.maxTurns??$.maxTurns,modelId:v?.modelId??$.modelId,permissionMode:v?.permissionMode??$.permissionMode,agents:$.agents})}else D=await Q8.create({systemPrompt:v?.systemPrompt??$.systemPrompt,appendSystemPrompt:v?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:v?.maxTurns??$.maxTurns,modelId:v?.modelId??$.modelId,permissionMode:v?.permissionMode??$.permissionMode,agents:$.agents});return Q.current=D,D}),K=M0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await U($.sessionId)).listRewindCheckpoints()}),q=M0(async(v)=>{if(!$.sessionId)throw Error("No active session to rewind");let k=await(await U($.sessionId)).rewindSession(v);return await X(),k}),F=M0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await U($.sessionId)).listSubagents()}),O=M0(async(v,M)=>{if(!$.sessionId)throw Error("No active session for subagent control");let k=await U($.sessionId),D=!1,y,g=v,h=(V)=>{T$.getState().app.actions.completeSubagentProgress(g,V.status==="completed")},x=k.resumeSubagent({agentId:v,prompt:M,onEvent:(V)=>{if(V.kind==="tool_start"&&"function"in V.toolCall)T$.getState().app.actions.updateSubagentTool(g,V.toolCall.function.name)},onCompleted:(V)=>{if(D)h(V);else y=V}});if(g=x.session.id,T$.getState().app.actions.startSubagentProgress(x.session.id,x.session.subagentType,`Resumed from ${x.source.id}: ${x.session.description}`),D=!0,y)h(y);return x}),N=M0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await U($.sessionId)).getMcpContentCatalog()}),_=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await U($.sessionId)).refreshMcpContentCatalogs(v)}),B=M0(async(v,M,k)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await U($.sessionId)).getMcpPrompt(v,M,k)}),z=M0(async(v,M,k)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await U($.sessionId)).completeMcpArgument(v,M,k)}),L=M0(async(v,M={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await U($.sessionId)).getMcpLogs(v,M)}),W=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).listMcpTasks(v)}),A=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).getMcpTask(v)}),T=M0(async(v,M)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).cancelMcpTask(v,M)}),C=M0(async(v,M)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await U($.sessionId)).setMcpLoggingLevel(v,M)}),w=M0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await U($.sessionId)).getMcpInstructions()}),S=M0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await U($.sessionId)).getReasoningConfiguration()}),P=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let M=await U($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let k=M.getReasoningConfiguration();if(M.resolveReasoningConfiguration(v),k.selection===v)return k;await M.refresh({reasoningEffort:v});try{let D;try{D=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{reasoningEffort:v})}catch(y){if(!(y instanceof $8)&&y.code!=="ENOENT")throw y;D=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:v,serviceTier:M.getServiceTierConfiguration().selection,responseVerbosity:M.getResponseVerbosityConfiguration().selection,communicationStyle:M.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},r0().setReasoningEffort(v),M.getReasoningConfiguration()}catch(D){throw await M.refresh({reasoningEffort:k.selection}),D}}),b=M0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await U($.sessionId)).getServiceTierConfiguration()}),I=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for service tier");let M=await U($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let k=M.getServiceTierConfiguration();if(M.resolveServiceTierConfiguration(v),k.selection===v)return k;await M.refresh({serviceTier:v});try{let D;try{D=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{serviceTier:v})}catch(y){if(!(y instanceof $8)&&y.code!=="ENOENT")throw y;D=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:M.getReasoningConfiguration().selection,serviceTier:v,responseVerbosity:M.getResponseVerbosityConfiguration().selection,communicationStyle:M.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},r0().setServiceTier(v),M.getServiceTierConfiguration()}catch(D){throw await M.refresh({serviceTier:k.selection}),D}}),R=M0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await U($.sessionId)).getResponseVerbosityConfiguration()}),H=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let M=await U($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let k=M.getResponseVerbosityConfiguration();if(M.resolveResponseVerbosityConfiguration(v),k.selection===v)return k;await M.refresh({responseVerbosity:v});try{let D;try{D=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{responseVerbosity:v})}catch(y){if(!(y instanceof $8)&&y.code!=="ENOENT")throw y;D=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:M.getReasoningConfiguration().selection,serviceTier:M.getServiceTierConfiguration().selection,responseVerbosity:v,communicationStyle:M.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},r0().setResponseVerbosity(v),M.getResponseVerbosityConfiguration()}catch(D){throw await M.refresh({responseVerbosity:k.selection}),D}}),f=M0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await U($.sessionId)).getCommunicationStyleConfiguration()}),E=M0(async(v)=>{if(!$.sessionId)throw Error("No active session for communication style");let M=await U($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let k=M.getCommunicationStyleConfiguration(),D=M.resolveCommunicationStyleConfiguration(v);if(D.source!=="built-in"&&!D.contentSha256)throw Error("Custom communication style has no provenance");if(k.selection===v)return k;await M.refresh({communicationStyle:v});try{let y;try{y=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{communicationStyle:v,communicationStyleDigest:D.source==="built-in"?null:D.contentSha256})}catch(g){if(!(g instanceof $8)&&g.code!=="ENOENT")throw g;y=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:M.getReasoningConfiguration().selection,serviceTier:M.getServiceTierConfiguration().selection,responseVerbosity:M.getResponseVerbosityConfiguration().selection,communicationStyle:v,...D.source!=="built-in"&&D.contentSha256?{communicationStyleDigest:D.contentSha256}:{}})}return J.current={sessionId:$.sessionId,modelId:y.selectedModelId,permissionMode:y.permissionMode,reasoningEffort:y.reasoningEffort,serviceTier:y.serviceTier,responseVerbosity:y.responseVerbosity,communicationStyle:y.communicationStyle,communicationStyleDigest:y.communicationStyleDigest},r0().setCommunicationStyle(v),M.getCommunicationStyleConfiguration()}catch(y){throw await M.refresh({communicationStyle:k.selection}),y}}),t=M0(async(v)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(v,{allowBeforeTurn:!0})}),l=M0(async(v,M)=>{let k=$.sessionId;if(!k)throw Error("User shell command requires a Session");return(await U(k)).executeUserShellCommand(v,M)});return AY(()=>{let v=E8(X);return()=>{v(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:G,cleanupAgent:X,steerActiveTurn:t,executeUserShellCommand:l,listRewindCheckpoints:K,rewindSession:q,listSubagents:F,resumeSubagent:O,getMcpContentCatalog:N,refreshMcpContentCatalogs:_,getMcpPrompt:B,completeMcpArgument:z,listMcpTasks:W,getMcpTask:A,cancelMcpTask:T,getMcpLogs:L,setMcpLoggingLevel:C,getMcpInstructions:w,getReasoningConfiguration:S,setReasoningEffort:P,getServiceTierConfiguration:b,setServiceTier:I,getResponseVerbosityConfiguration:R,setResponseVerbosity:H,getCommunicationStyleConfiguration:f,setCommunicationStyle:E}}import{useMemoizedFn as D$}from"ahooks";import{useEffect as PY,useRef as g8}from"react";function j4($){let Q=0;for(let Y of $)if(Y===`
32
+ `)Q++;return Q}function h4($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=g8(""),U=g8(null),G=g8(""),K=g8(null),q=D$(()=>{if(X.current){let z=X.current,L=$.appendAssistantContent(z);S$(L,z),X.current=""}if(U.current)clearTimeout(U.current),U.current=null}),F=D$(()=>{if(G.current)$.appendThinkingContent(G.current),G.current="";if(K.current)clearTimeout(K.current),K.current=null}),O=D$((z)=>{X.current+=z;let L=X.current;if(j4(L)>=J||L.length>=Z){q();return}if(!U.current)U.current=setTimeout(q,Y)}),N=D$((z)=>{G.current+=z;let L=G.current;if(j4(L)>=J||L.length>=Z){F();return}if(!K.current)K.current=setTimeout(F,Y)}),_=D$(()=>{if(X.current="",U.current)clearTimeout(U.current),U.current=null;if(G.current="",K.current)clearTimeout(K.current),K.current=null}),B=D$(()=>{if(U.current)clearTimeout(U.current),U.current=null;if(K.current)clearTimeout(K.current),K.current=null;let z=X.current,L=G.current;return X.current="",G.current="",{extraContent:z,extraThinking:L}});return PY(()=>{return()=>{_()}},[_]),{batchAppendContent:O,batchAppendThinking:N,flushContentBuffer:q,flushThinkingBuffer:F,resetStreamingBuffers:_,drainPendingBuffers:B}}var g2=i1("UI"),m4=($,Q,Y,J,Z,X)=>{let U=a1(),G=v$(),K=M1(),q=R8(),F=f$(),O=M8(),N=C8(),_=I8(),B=T8(),z=v8(),L=d1(),W=r1(),A=z4(),T=E4(!1),C=E4(!1),{createAgent:w,cleanupAgent:S,steerActiveTurn:P,listRewindCheckpoints:b,rewindSession:I,listSubagents:R,resumeSubagent:H,getMcpContentCatalog:f,refreshMcpContentCatalogs:E,getMcpPrompt:t,completeMcpArgument:l,listMcpTasks:v,getMcpTask:M,cancelMcpTask:k,getMcpLogs:D,setMcpLoggingLevel:y,getMcpInstructions:g,getReasoningConfiguration:h,setReasoningEffort:x,getServiceTierConfiguration:V,setServiceTier:i,getResponseVerbosityConfiguration:U0,setResponseVerbosity:q0,getCommunicationStyleConfiguration:R0,setCommunicationStyle:B0,executeUserShellCommand:s0}=V4({sessionId:G,workspaceRoot:K,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:q,permissionMode:F,reasoningEffort:N,serviceTier:_,responseVerbosity:B,communicationStyle:z,agents:X}),k0=h4(L),F1=V$(async(O0,p0)=>{if(O0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let s=O0.text.trimStart().slice(1).trim();if(!s)return{success:!1,error:"User shell command cannot be empty"};L.setCommand(`! ${s}`);try{let G0=await s0(s,{signal:p0});if(L.addMessage({id:`user-shell-${G0.executionId}`,role:"user",content:m2(G0.record),timestamp:Date.now(),metadata:{userShellCommand:G0.record}}),G0.delivery==="next_turn")C.current=!0;return{success:G0.record.status!=="spawn_error",output:m2(G0.record),...G0.record.status==="spawn_error"?{error:G0.record.stderr||"User shell command failed"}:{}}}finally{L.setCommand(null)}});E2(()=>{return()=>{k0.resetStreamingBuffers()}},[k0.resetStreamingBuffers]),E2(()=>{if(!O)L.setCurrentThinkingContent(null)},[O,L]);let C$=V$(()=>{if(!U)return;Z?.();let{extraContent:O0,extraThinking:p0}=k0.drainPendingBuffers();A.abort("user-cancel"),W.setTasks([]);let s=Q1().session.currentStreamingMessageId;if(s){if(O0)S$(s,O0);S8(s)}if(L.finalizeStreamingMessage(O0,p0),!T.current)L.addAssistantMessage("任务已停止"),T.current=!0}),e0=V$(async(O0,p0)=>{let s={contentDeltaCount:0,contentDeltaTotalLen:0},G0=R4({sessionActions:L,appActions:W,commandActions:A,streamingBuffer:k0,thinkingModeEnabled:O,getStreamingMessageId:()=>Q1().session.currentStreamingMessageId,signal:p0.signal},s);return{loopResult:await g4(O0,G0),stats:s}}),T2=V$(async(O0)=>{let p0=!1,s,G0=!1,c0=O0;try{if(O0.text.trimStart().startsWith("!")){let V0=A.getAbortController()??A.createAbortController();return await F1(O0,V0.signal)}await J8();let i0=A.getAbortController()??A.createAbortController(),h0=await h2(O0,W,L,i0.signal,S,G,D8(Q1().session),{listCheckpoints:b,execute:I},{list:R,resume:H},{getCatalog:f,refresh:E,getPrompt:t,complete:l,listTasks:v,getTask:M,cancelTask:k,getLogs:D,setLoggingLevel:y,getInstructions:g},{get:h,set:x},{get:V,set:i},{get:U0,set:q0},{get:R0,set:B0},K);if(h0.type==="handled")return h0.commandResult;if(h0.type==="continue_as_agent")p0=h0.result.userMessageAlreadyAdded,s=h0.result.onceModelId,G0=h0.result.goalContinuationOnly===!0,c0=h0.result.agentInput;let f2=q1.getInstance(),t$;if(!G0){let V0=await f2.executeUserPromptSubmitHooks(c0.text,{projectDir:K,sessionId:G,permissionMode:F,hasImages:c0.images.length>0,imageCount:c0.images.length});if(!V0.proceed){if(V0.warning)L.addAssistantMessage(`${V0.warning}`);return{success:!1,error:"blocked by hook"}}if(V0.updatedPrompt)c0={...c0,text:V0.updatedPrompt,displayText:V0.updatedPrompt,parts:[{type:"text",text:V0.updatedPrompt},...c0.parts.filter((I$)=>I$.type==="image")]};if(V0.contextInjection)t$=V0.contextInjection}if(!p0)L.addUserMessage(c0.displayText);let S2=j2(c0),B8=await w(s?{modelId:s}:void 0);if(i0.signal.aborted)return g2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};let s$=D8(Q1().session);if(t$)s$.push({role:"system",content:`<user-prompt-submit-hook>
33
33
  ${t$}
34
- </user-prompt-submit-hook>`});let r={messages:s$,userId:"cli-user",sessionId:K,workspaceRoot:G,signal:i0.signal,confirmationHandler:Y,permissionMode:F,onPermissionModeChange:async(V0)=>{await g0().setPermissionMode(V0)}},{loopResult:e,stats:l0}=await e0(B8.chatStream(S2,r,{stream:!0,goalContinuationOnly:K0,onTurnLimitReached:Y?async(V0)=>{let I$=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${V0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:I$.approved,reason:I$.reason}}:void 0}),i0);if(e.metadata?.outputTruncated)L.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let l1=e.finalMessage||"";if(g2.debug("[handleCommandSubmit] final reply",{success:e.success,outputLength:l1.length,turnsCount:e.metadata?.turnsCount,toolCallsCount:e.metadata?.toolCallsCount}),!e.success&&e.error?.type==="api_error"){let V0=e.error.message||"请求失败,请检查网络连接和 API 配置";return L.addAssistantMessage(V0),{success:!1,error:V0}}if(!l1||l1.trim()===""){let V0=e.metadata?.abortReason;if(!T.current&&l0.contentDeltaCount===0&&V0!=="interrupt")return L.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:l1??""}}return{success:!0,output:l1}}catch(i0){if(T.current)return{success:!1,error:"aborted"};let h0=f8(i0);return L.addAssistantMessage(`${h0.displayMessage}`),{success:!1,error:h0.displayMessage}}}),q$=V$(async()=>{if(Q1().command.isProcessing){C.current=!0;return}let O0=await O$.hasPendingInbox(G,K),p0=!O0&&await O$.hasActiveGoal(G,K);if(!O0&&!p0){C.current=!1;return}if(Q1().command.isProcessing){C.current=!0;return}C.current=!1,await J8();let s=A.createAbortController();k0.resetStreamingBuffers(),L.clearFinalizingStreamingMessageId(),A.setProcessing(!0);try{let K0=await w();if(s.signal.aborted)return;let c0={messages:D8(Q1().session),userId:"cli-user",sessionId:K,workspaceRoot:G,signal:s.signal,confirmationHandler:Y,permissionMode:F,onPermissionModeChange:async(h0)=>{await g0().setPermissionMode(h0)}},{loopResult:i0}=await e0(K0.chatStream("",c0,{stream:!0,pendingInputOnly:O0,goalContinuationOnly:p0}),s);if(i0.metadata?.outputTruncated)L.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!i0.success&&i0.error?.type==="api_error")L.addAssistantMessage(i0.error.message||"恢复排队指令失败,请检查网络和 API 配置")}catch(K0){let c0=f8(K0);if(!c0.isAbort)L.setError(`恢复排队指令失败: ${c0.displayMessage}`)}finally{if(A.getAbortController()===s)A.setProcessing(!1),A.clearAbortController(s),L.setCurrentThinkingContent(null);if(C.current)queueMicrotask(()=>{q$()})}}),v2=V$(async(O0)=>{if(!O0.text.trim()&&O0.images.length===0)return;if(O0.text.trimStart().startsWith("!")&&U){let s=A.getAbortController();if(!s){L.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let K0=await F1(O0,s.signal);if(!K0.success&&K0.error&&K0.error!=="aborted")L.setError(K0.error);return}if(U){if(O0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(O0.text.trim())){await J8();let h0=A.getAbortController()??A.createAbortController();await h2(O0,W,L,h0.signal,S,K,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,G);return}L.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await J8();let s=await q1.getInstance().executeUserPromptSubmitHooks(O0.text,{projectDir:G,sessionId:K,permissionMode:F,hasImages:O0.images.length>0,imageCount:O0.images.length});if(!s.proceed){if(s.warning)L.addAssistantMessage(s.warning);return}let K0=O0;if(s.updatedPrompt)K0={...O0,text:s.updatedPrompt,parts:[{type:"text",text:s.updatedPrompt},...O0.parts.filter((h0)=>h0.type==="image")]};if(s.contextInjection){let h0=`<user-prompt-submit-hook>
34
+ </user-prompt-submit-hook>`});let r={messages:s$,userId:"cli-user",sessionId:G,workspaceRoot:K,signal:i0.signal,confirmationHandler:Y,permissionMode:F,onPermissionModeChange:async(V0)=>{await g0().setPermissionMode(V0)}},{loopResult:e,stats:l0}=await e0(B8.chatStream(S2,r,{stream:!0,goalContinuationOnly:G0,onTurnLimitReached:Y?async(V0)=>{let I$=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${V0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:I$.approved,reason:I$.reason}}:void 0}),i0);if(e.metadata?.outputTruncated)L.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let l1=e.finalMessage||"";if(g2.debug("[handleCommandSubmit] final reply",{success:e.success,outputLength:l1.length,turnsCount:e.metadata?.turnsCount,toolCallsCount:e.metadata?.toolCallsCount}),!e.success&&e.error?.type==="api_error"){let V0=e.error.message||"请求失败,请检查网络连接和 API 配置";return L.addAssistantMessage(V0),{success:!1,error:V0}}if(!l1||l1.trim()===""){let V0=e.metadata?.abortReason;if(!T.current&&l0.contentDeltaCount===0&&V0!=="interrupt")return L.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:l1??""}}return{success:!0,output:l1}}catch(i0){if(T.current)return{success:!1,error:"aborted"};let h0=f8(i0);return L.addAssistantMessage(`${h0.displayMessage}`),{success:!1,error:h0.displayMessage}}}),q$=V$(async()=>{if(Q1().command.isProcessing){C.current=!0;return}let O0=await O$.hasPendingInbox(K,G),p0=!O0&&await O$.hasActiveGoal(K,G);if(!O0&&!p0){C.current=!1;return}if(Q1().command.isProcessing){C.current=!0;return}C.current=!1,await J8();let s=A.createAbortController();k0.resetStreamingBuffers(),L.clearFinalizingStreamingMessageId(),A.setProcessing(!0);try{let G0=await w();if(s.signal.aborted)return;let c0={messages:D8(Q1().session),userId:"cli-user",sessionId:G,workspaceRoot:K,signal:s.signal,confirmationHandler:Y,permissionMode:F,onPermissionModeChange:async(h0)=>{await g0().setPermissionMode(h0)}},{loopResult:i0}=await e0(G0.chatStream("",c0,{stream:!0,pendingInputOnly:O0,goalContinuationOnly:p0}),s);if(i0.metadata?.outputTruncated)L.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!i0.success&&i0.error?.type==="api_error")L.addAssistantMessage(i0.error.message||"恢复排队指令失败,请检查网络和 API 配置")}catch(G0){let c0=f8(G0);if(!c0.isAbort)L.setError(`恢复排队指令失败: ${c0.displayMessage}`)}finally{if(A.getAbortController()===s)A.setProcessing(!1),A.clearAbortController(s),L.setCurrentThinkingContent(null);if(C.current)queueMicrotask(()=>{q$()})}}),v2=V$(async(O0)=>{if(!O0.text.trim()&&O0.images.length===0)return;if(O0.text.trimStart().startsWith("!")&&U){let s=A.getAbortController();if(!s){L.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let G0=await F1(O0,s.signal);if(!G0.success&&G0.error&&G0.error!=="aborted")L.setError(G0.error);return}if(U){if(O0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(O0.text.trim())){await J8();let h0=A.getAbortController()??A.createAbortController();await h2(O0,W,L,h0.signal,S,G,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,K);return}L.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await J8();let s=await q1.getInstance().executeUserPromptSubmitHooks(O0.text,{projectDir:K,sessionId:G,permissionMode:F,hasImages:O0.images.length>0,imageCount:O0.images.length});if(!s.proceed){if(s.warning)L.addAssistantMessage(s.warning);return}let G0=O0;if(s.updatedPrompt)G0={...O0,text:s.updatedPrompt,parts:[{type:"text",text:s.updatedPrompt},...O0.parts.filter((h0)=>h0.type==="image")]};if(s.contextInjection){let h0=`<user-prompt-submit-hook>
35
35
  ${s.contextInjection}
36
- </user-prompt-submit-hook>`;K0={...K0,text:`${K0.text}
36
+ </user-prompt-submit-hook>`;G0={...G0,text:`${G0.text}
37
37
 
38
- ${h0}`,parts:[...K0.parts,{type:"text",text:`
38
+ ${h0}`,parts:[...G0.parts,{type:"text",text:`
39
39
 
40
- ${h0}`}]}}let c0=j2(K0),i0=await P(c0);if(!i0.accepted){let h0=i0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";L.addAssistantMessage(h0);return}if(A.enqueueCommand(O0),L.addUserMessage(O0.displayText),i0.delivery==="next_turn"){if(C.current=!0,!Q1().command.isProcessing)queueMicrotask(()=>{q$()})}return}W.setTasks([]),A.setRecoveredSteeringCount(0),T.current=!1;let p0=A.createAbortController();k0.resetStreamingBuffers(),L.clearFinalizingStreamingMessageId(),A.setProcessing(!0);try{let s=await T2(O0);if(!s.success&&s.error&&s.error!=="aborted")L.setError(s.error)}catch(s){let K0=f8(s);if(K0.isAbort);else L.setError(`执行失败: ${K0.displayMessage}`)}finally{if(A.getAbortController()===p0){if(A.setProcessing(!1),A.clearAbortController(p0),L.setCurrentThinkingContent(null),C.current)queueMicrotask(()=>{q$()})}}});return E2(()=>{let O0=!1;return Promise.all([O$.hasPendingInbox(G,K),O$.hasActiveGoal(G,K)]).then(([p0,s])=>{if(!O0&&(p0||s))return q$()}).catch((p0)=>{if(!O0)g2.warn("[useCommandHandler] Failed to inspect pending inbox",p0)}),()=>{O0=!0}},[q$,K,G]),{executeCommand:v2,handleAbort:C$,isProcessing:U,cleanupAgent:S}};import{useMemoizedFn as m8}from"ahooks";import{useState as m4}from"react";var p4=()=>{let[$,Q]=m4([]),[Y,J]=m4(-1),Z=m8((G,q)=>{let F={display:G,pasteMappings:q?new Map(q):new Map};Q((O)=>[...O,F]),J(-1)}),X=m8(()=>{if($.length===0)return null;let G=Y===-1?$.length-1:Math.max(0,Y-1);return J(G),$[G]||null}),U=m8(()=>{if(Y===-1)return null;let G=Y+1;if(G>=$.length)return J(-1),null;else return J(G),$[G]||null}),K=m8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:U,resetHistoryIndex:K}};import{useMemoizedFn as Y8}from"ahooks";import{useMemo as PY,useRef as c4,useState as RY}from"react";var u4=()=>{let[$,Q]=RY({isVisible:!1,details:null,resolver:null}),Y=c4(null),J=c4([]),Z=Y8((F)=>{Y.current=F,Q({isVisible:Boolean(F),details:F?.details??null,resolver:F?.resolve??null})}),X=Y8((F,O)=>{if(F.settled)return;if(F.settled=!0,F.signal&&F.abortListener)F.signal.removeEventListener("abort",F.abortListener);F.resolve(O)}),U=Y8((F,O)=>{return new Promise((N)=>{let _={details:F,resolve:N,signal:O,settled:!1},B=()=>{if(Y.current===_){X(_,{approved:!1,reason:Z8}),Z(J.current.shift()??null);return}let z=J.current.indexOf(_);if(z>=0)J.current.splice(z,1);X(_,{approved:!1,reason:Z8})};if(_.abortListener=B,O?.aborted){B();return}if(O?.addEventListener("abort",B,{once:!0}),!Y.current){Z(_);return}J.current.push(_)})}),K=Y8((F)=>{let O=Y.current;if(O)X(O,F);let N=J.current.shift()??null;Z(N)}),G=Y8(()=>{if(Y.current)X(Y.current,{approved:!1,reason:Z8});for(let F of J.current)X(F,{approved:!1,reason:Z8});J.current=[],Z(null)}),q=PY(()=>({requestConfirmation:U}),[U]);return{confirmationState:$,confirmationHandler:q,handleResponse:K,dismissAll:G}};import{useMemoizedFn as z$}from"ahooks";import{useRef as x4,useState as yY}from"react";var p8="␞",c8="␟";function u8($){return`${p8}PASTE:${$}:`}function p2(){return c8}var s7=new RegExp(`${p8}PASTE:(\\d+):[\\s\\S]*?${c8}`,"g");function MY($){return $.includes(p8)&&$.includes(c8)}function l4($="",Q=0){let[Y,J]=yY({value:$,cursorPosition:Q}),Z=x4(0),X=x4(new Map),U=z$((_)=>{J((B)=>({value:_,cursorPosition:B.cursorPosition}));for(let B of X.current.keys()){let z=u8(B);if(!_.includes(z))X.current.delete(B)}}),K=z$((_)=>{J((B)=>({...B,cursorPosition:Math.max(0,Math.min(_,B.value.length))}))}),G=z$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),q=z$((_)=>{Z.current+=1;let B=Z.current;return X.current.set(B,{type:"text",data:_}),B}),F=z$((_,B)=>{let z=[...X.current.values()].filter((T)=>T.type==="image");if(z.length>=k$)throw Error(`最多只能粘贴 ${k$} 张图片`);let L=z.reduce((T,C)=>T+`data:${C.mimeType};base64,`.length+C.data.length,0),W=`data:${B};base64,`.length+_.length;if(L+W>k8)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let A=Z.current;return X.current.set(A,{type:"image",data:_,mimeType:B}),A}),O=z$((_)=>{for(let[B,z]of _)if(X.current.set(B,z),B>=Z.current)Z.current=B}),N=z$((_)=>{let B=[],z=[];if(!MY(_)){let I=_.trim();if(I)z.push({type:"text",text:I});return{displayText:_,text:_,images:B,parts:z}}let L=new RegExp(`${p8}PASTE:(\\d+):[\\s\\S]*?${c8}`,"g"),W=Array.from(_.matchAll(L)),A=0,T="",C="";for(let I of W){let R=I.index,H=R+I[0].length,f=parseInt(I[1],10),E=X.current.get(f);if(R>A){let t=_.slice(A,R);z.push({type:"text",text:t}),T+=t,C+=t}if(!E)T+=I[0],C+=I[0],z.push({type:"text",text:I[0]});else if(E.type==="text")T+=E.data,C+=E.data,z.push({type:"text",text:E.data});else{let t={id:f,base64:E.data,mimeType:E.mimeType};B.push(t),z.push({type:"image",...t}),C+=`[Image #${f}]`}A=H}if(A<_.length){let I=_.slice(A);z.push({type:"text",text:I}),T+=I,C+=I}let w=[];for(let I of z)if(I.type==="text"&&w.length>0&&w[w.length-1].type==="text")w[w.length-1].text+=I.text;else w.push(I);let S=0,P=w.length;while(S<w.length&&w[S].type==="text"&&w[S].text.trim()==="")S++;while(P>S&&w[P-1].type==="text"&&w[P-1].text.trim()==="")P--;let b=w.slice(S,P);return{displayText:C.trim(),text:T.trim(),images:B,parts:b}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:U,setCursorPosition:K,clear:G,pasteMap:X.current,addPasteMapping:q,addImagePasteMapping:F,restorePasteMappings:O,resolveInput:N}}import{useMemoizedFn as s4}from"ahooks";import{useInput as DY}from"ink";import{useEffect as e4,useRef as $6,useState as l2}from"react";function CY($){return{supportsThinking:S1().resolveConfig($).reasoning}}function x8($){return CY($).supportsThinking}import IY from"fast-glob";import TY from"fuse.js";import{useEffect as d4,useMemo as c2,useState as u2}from"react";var j$=null,vY=5000;function fY($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),U=X+Z.length;if(Q>=X&&Q<=U){let K=Z.slice(1),G=!1;if(K.startsWith('"')){if(G=!0,K=K.slice(1),K.endsWith('"'))K=K.slice(0,-1)}return{hasQuery:!0,query:K,startIndex:X,endIndex:U,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var SY=[...x2.map(($)=>`${$}/**`),...x2,...r4.map(($)=>`**/${$}`)];function a4($,Q,Y={}){let{cwd:J=u0(),maxSuggestions:Z=15,ignorePatterns:X=SY,debounceDelay:U=300,fuzzyMatch:K=!0}=Y,[G,q]=u2([]),[F,O]=u2(!1),[N,_]=u2(0),B=c2(()=>JSON.stringify(X),[X]),z=c2(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return fY($,Q)},[$,Q]);d4(()=>{if(!$.includes("@")){q([]),O(!1);return}let W=Date.now();if(j$&&j$.cwd===J&&j$.ignoreKey===B&&W-j$.timestamp<vY){q(j$.files),O(!1);return}let A=!1,C=setTimeout(async()=>{O(!0);try{let S=(await IY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((P)=>P.replace(/\\/g,"/"));if(!A)q(S),j$={cwd:J,ignoreKey:B,files:S,timestamp:W}}catch(w){if(console.error("Failed to load files for @ completion:",w),!A)q([])}finally{if(!A)O(!1)}},U);return()=>{A=!0,clearTimeout(C)}},[$,J,U,B]);let L=c2(()=>{if(!z.hasQuery||G.length===0)return[];let W=z.query.toLowerCase();if(W==="")return G.slice(0,Z);if(K)return new TY(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(W).slice(0,Z).map((C)=>C.item);return G.filter((A)=>A.toLowerCase().includes(W)).slice(0,Z)},[z,G,Z,K]);return d4(()=>{_(0)},[L]),{...z,suggestions:L,selectedIndex:N,loading:F}}function kY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function i4($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=kY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),U=Z+J+" "+X,K=Q.startIndex+J.length+1;return{newInput:U,newCursorPos:K}}import{useMemoizedFn as o4}from"ahooks";import{useEffect as n4,useRef as t4}from"react";var v0=($,Q)=>{let Y=t4(!1),J=t4(null),Z=o4(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{X8().shutdown("SIGINT",0)},U=o4(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();r0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;r0().setAwaitingSecondCtrlC(!1),X()}});return n4(()=>{if($){if(r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),n4(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),U};var l8=i1("UI"),Y6=($,Q,Y,J,Z,X,U,K,G,q)=>{let O=$1()==="main-input",N=$.value,_=$.setValue,B=$.cursorPosition,z=d1(),L=M1(),W=r1(),A=P8(),T=A?x8(A):!1,[C,w]=l2(!1),[S,P]=l2([]),[b,I]=l2(0),R=a4(N,B,{cwd:L,maxSuggestions:10}),H=v0(U||!1,X),f=$6(0),E=500,t=$6(!1);e4(()=>{if(U)t.current=!1},[U]),e4(()=>{if(R.hasQuery&&R.suggestions.length>0){let M=R.suggestions.map((k)=>({command:k,description:Q6(k)?`Directory: ${k}`:`File: ${k}`,matchScore:1}));P(M),w(!0),I(0)}else if(N.startsWith("/"))if(N.includes(" "))w(!1),P([]);else{let k=J6(N,L);P(k),w(k.length>0),I(0)}else w(!1),P([])},[N,R.hasQuery,R.suggestions,L]);let l=s4(()=>{z.clearMessages(),z.setError(null)}),v=s4(()=>{l8.debug("[DIAG] handleSubmit called:",{input:N,showSuggestions:C});let M=N.trim();if(M){let k=$.resolveInput(M);l8.debug("[DIAG] Submitting command:",{displayText:M,textLength:k.text.length,imageCount:k.images.length}),w(!1),P([]);let D=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(M,D),$.clear(),Q(k),l8.debug("[DIAG] Command submitted to onSubmit callback")}else l8.debug("[DIAG] Empty command, not submitting")});return DY((M,k)=>{if(M==="?"&&!N){G?.(),setTimeout(()=>$.clear(),0);return}if(k.backspace||k.delete||k.leftArrow||k.rightArrow||k.pageUp||k.pageDown||!k.ctrl&&!k.meta&&!k.escape&&!k.tab&&!k.upArrow&&!k.downArrow&&!k.return&&!(M==="?"&&!N))return;if(k.ctrl&&M==="c"||k.meta&&M==="c"||k.ctrl&&M==="d"||k.meta&&M==="d"){H();return}if(k.ctrl&&M==="l"||k.meta&&M==="l"){l();return}if(k.ctrl&&M==="t"||k.meta&&M==="t"){z.toggleThinkingExpanded();return}if(k.ctrl&&M==="o"||k.meta&&M==="o"){z.toggleHistoryExpanded();return}if(k.escape){if(q)G?.();else if(U&&X){if(t.current)return;t.current=!0,X()}else if(C)w(!1),P([]);else if(N){let y=Date.now();if(y-f.current<500)$.clear(),f.current=0;else f.current=y}return}if(k.tab&&k.shift){K?.();return}if(k.tab){if(C&&S.length>0){let y=S[b].command;if(R.hasQuery&&R.suggestions.includes(y)){let{newInput:g,newCursorPos:h}=i4(N,R,y);_(g),$.setCursorPosition(h)}else{let g=y+" ";_(g),$.setCursorPosition(g.length)}w(!1),P([])}else if(T)W.toggleThinkingMode();return}if(k.return){v();return}if(k.upArrow){if(C&&S.length>0){let y=S.length-1;I((g)=>g>0?g-1:y)}else{let y=Y();if(y){if(y.pasteMappings.size>0)$.restorePasteMappings(y.pasteMappings);_(y.display),$.setCursorPosition(y.display.length)}}return}if(k.downArrow){if(C&&S.length>0){let y=S.length-1;I((g)=>g<y?g+1:0)}else{let y=J();if(y){if(y.pasteMappings.size>0)$.restorePasteMappings(y.pasteMappings);_(y.display),$.setCursorPosition(y.display.length)}}return}},{isActive:O}),{handleSubmit:v,showSuggestions:C,suggestions:S,selectedSuggestionIndex:b}};import gY from"ansi-escapes";import{useStdout as mY}from"ink";import{useCallback as pY,useEffect as cY,useRef as uY}from"react";import{useStdout as VY}from"ink";import{debounce as jY}from"lodash-es";import{useEffect as hY,useState as EY}from"react";function h$($=200){let{stdout:Q}=VY(),[Y,J]=EY(Q.columns||80);return hY(()=>{let Z=jY(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function Z6(){let{stdout:$}=mY(),Q=h$(),Y=uY(!0),J=J0((X)=>X.session.actions.incrementClearCount),Z=pY(()=>{if($)$.write(gY.clearTerminal);J()},[$,J]);return cY(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import X6 from"node:fs";import xY from"node:os";import d2 from"node:path";import{MultiSelect as lY}from"@inkjs/ui";import{useMemoizedFn as d8}from"ahooks";import{Box as Z0,Text as n,useFocus as dY,useFocusManager as rY,useInput as K6}from"ink";import r8 from"ink-select-input";import aY from"ink-spinner";import U8 from"ink-text-input";import{useEffect as U6,useState as E$}from"react";import{jsxDEV as j}from"react/jsx-dev-runtime";var iY=[{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"}],oY=[{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 nY($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function K8({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=E$(Y?"name":"mode"),[X,U]=E$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[K,G]=E$(""),[q,F]=E$(!1),[O,N]=E$(""),[_,B]=E$(Y?"edit":"manual"),{focus:z}=rY(),W={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[_];U6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;z(`step-${J}`)},[J,z]);let A=d8(()=>{let P=W.indexOf(J);if(P<W.length-1)Z(W[P+1])}),T=d8(()=>{if(O)N("");if(J==="confirm"&&_==="ai"){Z("aiPrompt");return}let P=W.indexOf(J);if(P>0)Z(W[P-1]);else Q()}),C=d8(async()=>{F(!0),N("");try{let P=await Q8.create(),b=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
40
+ ${h0}`}]}}let c0=j2(G0),i0=await P(c0);if(!i0.accepted){let h0=i0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";L.addAssistantMessage(h0);return}if(A.enqueueCommand(O0),L.addUserMessage(O0.displayText),i0.delivery==="next_turn"){if(C.current=!0,!Q1().command.isProcessing)queueMicrotask(()=>{q$()})}return}W.setTasks([]),A.setRecoveredSteeringCount(0),T.current=!1;let p0=A.createAbortController();k0.resetStreamingBuffers(),L.clearFinalizingStreamingMessageId(),A.setProcessing(!0);try{let s=await T2(O0);if(!s.success&&s.error&&s.error!=="aborted")L.setError(s.error)}catch(s){let G0=f8(s);if(G0.isAbort);else L.setError(`执行失败: ${G0.displayMessage}`)}finally{if(A.getAbortController()===p0){if(A.setProcessing(!1),A.clearAbortController(p0),L.setCurrentThinkingContent(null),C.current)queueMicrotask(()=>{q$()})}}});return E2(()=>{let O0=!1;return(async()=>{if(Y)await p2.resolvePendingWithHandler(K,G,Y);else await p2.cancelPendingNonInteractive(K,G);if(O0)return;let[p0,s]=await Promise.all([O$.hasPendingInbox(K,G),O$.hasActiveGoal(K,G)]);if(p0||s)await q$()})().catch((p0)=>{if(!O0)g2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",p0)}),()=>{O0=!0}},[Y,q$,G,K]),{executeCommand:v2,handleAbort:C$,isProcessing:U,cleanupAgent:S}};import{useMemoizedFn as m8}from"ahooks";import{useState as p4}from"react";var c4=()=>{let[$,Q]=p4([]),[Y,J]=p4(-1),Z=m8((K,q)=>{let F={display:K,pasteMappings:q?new Map(q):new Map};Q((O)=>[...O,F]),J(-1)}),X=m8(()=>{if($.length===0)return null;let K=Y===-1?$.length-1:Math.max(0,Y-1);return J(K),$[K]||null}),U=m8(()=>{if(Y===-1)return null;let K=Y+1;if(K>=$.length)return J(-1),null;else return J(K),$[K]||null}),G=m8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:U,resetHistoryIndex:G}};import{useMemoizedFn as Y8}from"ahooks";import{useMemo as RY,useRef as u4,useState as yY}from"react";var x4=()=>{let[$,Q]=yY({isVisible:!1,details:null,resolver:null}),Y=u4(null),J=u4([]),Z=Y8((F)=>{Y.current=F,Q({isVisible:Boolean(F),details:F?.details??null,resolver:F?.resolve??null})}),X=Y8((F,O)=>{if(F.settled)return;if(F.settled=!0,F.signal&&F.abortListener)F.signal.removeEventListener("abort",F.abortListener);F.resolve(O)}),U=Y8((F,O)=>{return new Promise((N)=>{let _={details:F,resolve:N,signal:O,settled:!1},B=()=>{if(Y.current===_){X(_,{approved:!1,reason:Z8}),Z(J.current.shift()??null);return}let z=J.current.indexOf(_);if(z>=0)J.current.splice(z,1);X(_,{approved:!1,reason:Z8})};if(_.abortListener=B,O?.aborted){B();return}if(O?.addEventListener("abort",B,{once:!0}),!Y.current){Z(_);return}J.current.push(_)})}),G=Y8((F)=>{let O=Y.current;if(O)X(O,F);let N=J.current.shift()??null;Z(N)}),K=Y8(()=>{if(Y.current)X(Y.current,{approved:!1,reason:Z8});for(let F of J.current)X(F,{approved:!1,reason:Z8});J.current=[],Z(null)}),q=RY(()=>({requestConfirmation:U}),[U]);return{confirmationState:$,confirmationHandler:q,handleResponse:G,dismissAll:K}};import{useMemoizedFn as z$}from"ahooks";import{useRef as l4,useState as MY}from"react";var p8="␞",c8="␟";function u8($){return`${p8}PASTE:${$}:`}function c2(){return c8}var $U=new RegExp(`${p8}PASTE:(\\d+):[\\s\\S]*?${c8}`,"g");function CY($){return $.includes(p8)&&$.includes(c8)}function d4($="",Q=0){let[Y,J]=MY({value:$,cursorPosition:Q}),Z=l4(0),X=l4(new Map),U=z$((_)=>{J((B)=>({value:_,cursorPosition:B.cursorPosition}));for(let B of X.current.keys()){let z=u8(B);if(!_.includes(z))X.current.delete(B)}}),G=z$((_)=>{J((B)=>({...B,cursorPosition:Math.max(0,Math.min(_,B.value.length))}))}),K=z$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),q=z$((_)=>{Z.current+=1;let B=Z.current;return X.current.set(B,{type:"text",data:_}),B}),F=z$((_,B)=>{let z=[...X.current.values()].filter((T)=>T.type==="image");if(z.length>=k$)throw Error(`最多只能粘贴 ${k$} 张图片`);let L=z.reduce((T,C)=>T+`data:${C.mimeType};base64,`.length+C.data.length,0),W=`data:${B};base64,`.length+_.length;if(L+W>k8)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let A=Z.current;return X.current.set(A,{type:"image",data:_,mimeType:B}),A}),O=z$((_)=>{for(let[B,z]of _)if(X.current.set(B,z),B>=Z.current)Z.current=B}),N=z$((_)=>{let B=[],z=[];if(!CY(_)){let I=_.trim();if(I)z.push({type:"text",text:I});return{displayText:_,text:_,images:B,parts:z}}let L=new RegExp(`${p8}PASTE:(\\d+):[\\s\\S]*?${c8}`,"g"),W=Array.from(_.matchAll(L)),A=0,T="",C="";for(let I of W){let R=I.index,H=R+I[0].length,f=parseInt(I[1],10),E=X.current.get(f);if(R>A){let t=_.slice(A,R);z.push({type:"text",text:t}),T+=t,C+=t}if(!E)T+=I[0],C+=I[0],z.push({type:"text",text:I[0]});else if(E.type==="text")T+=E.data,C+=E.data,z.push({type:"text",text:E.data});else{let t={id:f,base64:E.data,mimeType:E.mimeType};B.push(t),z.push({type:"image",...t}),C+=`[Image #${f}]`}A=H}if(A<_.length){let I=_.slice(A);z.push({type:"text",text:I}),T+=I,C+=I}let w=[];for(let I of z)if(I.type==="text"&&w.length>0&&w[w.length-1].type==="text")w[w.length-1].text+=I.text;else w.push(I);let S=0,P=w.length;while(S<w.length&&w[S].type==="text"&&w[S].text.trim()==="")S++;while(P>S&&w[P-1].type==="text"&&w[P-1].text.trim()==="")P--;let b=w.slice(S,P);return{displayText:C.trim(),text:T.trim(),images:B,parts:b}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:U,setCursorPosition:G,clear:K,pasteMap:X.current,addPasteMapping:q,addImagePasteMapping:F,restorePasteMappings:O,resolveInput:N}}import{useMemoizedFn as e4}from"ahooks";import{useInput as VY}from"ink";import{useEffect as $6,useRef as Q6,useState as d2}from"react";function IY($){return{supportsThinking:S1().resolveConfig($).reasoning}}function x8($){return IY($).supportsThinking}import TY from"fast-glob";import vY from"fuse.js";import{useEffect as r4,useMemo as u2,useState as x2}from"react";var j$=null,fY=5000;function SY($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),U=X+Z.length;if(Q>=X&&Q<=U){let G=Z.slice(1),K=!1;if(G.startsWith('"')){if(K=!0,G=G.slice(1),G.endsWith('"'))G=G.slice(0,-1)}return{hasQuery:!0,query:G,startIndex:X,endIndex:U,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var kY=[...l2.map(($)=>`${$}/**`),...l2,...a4.map(($)=>`**/${$}`)];function i4($,Q,Y={}){let{cwd:J=u0(),maxSuggestions:Z=15,ignorePatterns:X=kY,debounceDelay:U=300,fuzzyMatch:G=!0}=Y,[K,q]=x2([]),[F,O]=x2(!1),[N,_]=x2(0),B=u2(()=>JSON.stringify(X),[X]),z=u2(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return SY($,Q)},[$,Q]);r4(()=>{if(!$.includes("@")){q([]),O(!1);return}let W=Date.now();if(j$&&j$.cwd===J&&j$.ignoreKey===B&&W-j$.timestamp<fY){q(j$.files),O(!1);return}let A=!1,C=setTimeout(async()=>{O(!0);try{let S=(await TY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((P)=>P.replace(/\\/g,"/"));if(!A)q(S),j$={cwd:J,ignoreKey:B,files:S,timestamp:W}}catch(w){if(console.error("Failed to load files for @ completion:",w),!A)q([])}finally{if(!A)O(!1)}},U);return()=>{A=!0,clearTimeout(C)}},[$,J,U,B]);let L=u2(()=>{if(!z.hasQuery||K.length===0)return[];let W=z.query.toLowerCase();if(W==="")return K.slice(0,Z);if(G)return new vY(K,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(W).slice(0,Z).map((C)=>C.item);return K.filter((A)=>A.toLowerCase().includes(W)).slice(0,Z)},[z,K,Z,G]);return r4(()=>{_(0)},[L]),{...z,suggestions:L,selectedIndex:N,loading:F}}function DY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function o4($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=DY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),U=Z+J+" "+X,G=Q.startIndex+J.length+1;return{newInput:U,newCursorPos:G}}import{useMemoizedFn as n4}from"ahooks";import{useEffect as t4,useRef as s4}from"react";var v0=($,Q)=>{let Y=s4(!1),J=s4(null),Z=n4(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{X8().shutdown("SIGINT",0)},U=n4(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();r0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;r0().setAwaitingSecondCtrlC(!1),X()}});return t4(()=>{if($){if(r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),t4(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),U};var l8=i1("UI"),Z6=($,Q,Y,J,Z,X,U,G,K,q)=>{let O=$1()==="main-input",N=$.value,_=$.setValue,B=$.cursorPosition,z=d1(),L=M1(),W=r1(),A=P8(),T=A?x8(A):!1,[C,w]=d2(!1),[S,P]=d2([]),[b,I]=d2(0),R=i4(N,B,{cwd:L,maxSuggestions:10}),H=v0(U||!1,X),f=Q6(0),E=500,t=Q6(!1);$6(()=>{if(U)t.current=!1},[U]),$6(()=>{if(R.hasQuery&&R.suggestions.length>0){let M=R.suggestions.map((k)=>({command:k,description:J6(k)?`Directory: ${k}`:`File: ${k}`,matchScore:1}));P(M),w(!0),I(0)}else if(N.startsWith("/"))if(N.includes(" "))w(!1),P([]);else{let k=Y6(N,L);P(k),w(k.length>0),I(0)}else w(!1),P([])},[N,R.hasQuery,R.suggestions,L]);let l=e4(()=>{z.clearMessages(),z.setError(null)}),v=e4(()=>{l8.debug("[DIAG] handleSubmit called:",{input:N,showSuggestions:C});let M=N.trim();if(M){let k=$.resolveInput(M);l8.debug("[DIAG] Submitting command:",{displayText:M,textLength:k.text.length,imageCount:k.images.length}),w(!1),P([]);let D=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(M,D),$.clear(),Q(k),l8.debug("[DIAG] Command submitted to onSubmit callback")}else l8.debug("[DIAG] Empty command, not submitting")});return VY((M,k)=>{if(M==="?"&&!N){K?.(),setTimeout(()=>$.clear(),0);return}if(k.backspace||k.delete||k.leftArrow||k.rightArrow||k.pageUp||k.pageDown||!k.ctrl&&!k.meta&&!k.escape&&!k.tab&&!k.upArrow&&!k.downArrow&&!k.return&&!(M==="?"&&!N))return;if(k.ctrl&&M==="c"||k.meta&&M==="c"||k.ctrl&&M==="d"||k.meta&&M==="d"){H();return}if(k.ctrl&&M==="l"||k.meta&&M==="l"){l();return}if(k.ctrl&&M==="t"||k.meta&&M==="t"){z.toggleThinkingExpanded();return}if(k.ctrl&&M==="o"||k.meta&&M==="o"){z.toggleHistoryExpanded();return}if(k.escape){if(q)K?.();else if(U&&X){if(t.current)return;t.current=!0,X()}else if(C)w(!1),P([]);else if(N){let y=Date.now();if(y-f.current<500)$.clear(),f.current=0;else f.current=y}return}if(k.tab&&k.shift){G?.();return}if(k.tab){if(C&&S.length>0){let y=S[b].command;if(R.hasQuery&&R.suggestions.includes(y)){let{newInput:g,newCursorPos:h}=o4(N,R,y);_(g),$.setCursorPosition(h)}else{let g=y+" ";_(g),$.setCursorPosition(g.length)}w(!1),P([])}else if(T)W.toggleThinkingMode();return}if(k.return){v();return}if(k.upArrow){if(C&&S.length>0){let y=S.length-1;I((g)=>g>0?g-1:y)}else{let y=Y();if(y){if(y.pasteMappings.size>0)$.restorePasteMappings(y.pasteMappings);_(y.display),$.setCursorPosition(y.display.length)}}return}if(k.downArrow){if(C&&S.length>0){let y=S.length-1;I((g)=>g<y?g+1:0)}else{let y=J();if(y){if(y.pasteMappings.size>0)$.restorePasteMappings(y.pasteMappings);_(y.display),$.setCursorPosition(y.display.length)}}return}},{isActive:O}),{handleSubmit:v,showSuggestions:C,suggestions:S,selectedSuggestionIndex:b}};import mY from"ansi-escapes";import{useStdout as pY}from"ink";import{useCallback as cY,useEffect as uY,useRef as xY}from"react";import{useStdout as jY}from"ink";import{debounce as hY}from"lodash-es";import{useEffect as EY,useState as gY}from"react";function h$($=200){let{stdout:Q}=jY(),[Y,J]=gY(Q.columns||80);return EY(()=>{let Z=hY(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function X6(){let{stdout:$}=pY(),Q=h$(),Y=xY(!0),J=J0((X)=>X.session.actions.incrementClearCount),Z=cY(()=>{if($)$.write(mY.clearTerminal);J()},[$,J]);return uY(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import U6 from"node:fs";import lY from"node:os";import r2 from"node:path";import{MultiSelect as dY}from"@inkjs/ui";import{useMemoizedFn as d8}from"ahooks";import{Box as Z0,Text as n,useFocus as rY,useFocusManager as aY,useInput as K6}from"ink";import r8 from"ink-select-input";import iY from"ink-spinner";import U8 from"ink-text-input";import{useEffect as G6,useState as E$}from"react";import{jsxDEV as j}from"react/jsx-dev-runtime";var oY=[{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"}],nY=[{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 tY($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function G8({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=E$(Y?"name":"mode"),[X,U]=E$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[G,K]=E$(""),[q,F]=E$(!1),[O,N]=E$(""),[_,B]=E$(Y?"edit":"manual"),{focus:z}=aY(),W={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[_];G6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;z(`step-${J}`)},[J,z]);let A=d8(()=>{let P=W.indexOf(J);if(P<W.length-1)Z(W[P+1])}),T=d8(()=>{if(O)N("");if(J==="confirm"&&_==="ai"){Z("aiPrompt");return}let P=W.indexOf(J);if(P>0)Z(W[P-1]);else Q()}),C=d8(async()=>{F(!0),N("");try{let P=await Q8.create(),b=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
41
41
 
42
42
  ## 可用工具列表
43
43
 
@@ -113,48 +113,48 @@ ${h0}`}]}}let c0=j2(K0),i0=await P(c0);if(!i0.accepted){let h0=i0.reason==="queu
113
113
  4. **color**: 选择一个合适的颜色用于 UI 区分
114
114
  5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
115
115
 
116
- **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,K)).trim(),H=R.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(H)R=H[1];let f=JSON.parse(R);if(!f.name||!f.description||!f.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(f.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");U({name:f.name,description:f.description,tools:Array.isArray(f.tools)?f.tools:[],color:f.color||"blue",location:"project",systemPrompt:f.systemPrompt}),Z("confirm")}catch(P){N(P instanceof Error?P.message:String(P))}finally{F(!1)}});U6(()=>{if(J==="aiGenerating"&&!q&&!O)C()},[J,q,O,C]);let w=d8(async()=>{try{let P=X.location==="project"?d2.join(u0(),".blade","agents"):d2.join(xY.homedir(),".blade","agents");await X6.promises.mkdir(P,{recursive:!0});let b=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){b.push("tools:");for(let H of X.tools)b.push(` - ${H}`)}if(X.color)b.push(`color: ${X.color}`);b.push("---");let I=[b.join(`
116
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,G)).trim(),H=R.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(H)R=H[1];let f=JSON.parse(R);if(!f.name||!f.description||!f.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(f.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");U({name:f.name,description:f.description,tools:Array.isArray(f.tools)?f.tools:[],color:f.color||"blue",location:"project",systemPrompt:f.systemPrompt}),Z("confirm")}catch(P){N(P instanceof Error?P.message:String(P))}finally{F(!1)}});G6(()=>{if(J==="aiGenerating"&&!q&&!O)C()},[J,q,O,C]);let w=d8(async()=>{try{let P=X.location==="project"?r2.join(u0(),".blade","agents"):r2.join(lY.homedir(),".blade","agents");await U6.promises.mkdir(P,{recursive:!0});let b=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){b.push("tools:");for(let H of X.tools)b.push(` - ${H}`)}if(X.color)b.push(`color: ${X.color}`);b.push("---");let I=[b.join(`
117
117
  `),"",`# ${X.name} Subagent`,"",X.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
118
- `),R=d2.join(P,`${X.name}.md`);await X6.promises.writeFile(R,I,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),S=v0(!1,Q);if(K6((P,b)=>{if(b.escape)T();else if(b.ctrl&&P==="c"||b.meta&&P==="c")S()},{isActive:J!=="tools"}),J==="mode")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(r8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(P)=>{if(P.value==="ai")B("ai"),Z("aiPrompt");else B("manual"),Z("name")}},void 0,!1,void 0,this),j(Z0,{marginTop:1,children:j(n,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiPrompt")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:[j(n,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(U8,{value:K,onChange:G,onSubmit:(P)=>{if(!P.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Z0,{children:j(n,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(O)return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"yellow",children:[j(aY,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:['根据你的描述:"',K,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="name"){let P=_==="edit";return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:["Step 1/7: ",P?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:P?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:[j(n,{color:"green",children:"名称: "},void 0,!1,void 0,this),P?j(n,{children:X.name},void 0,!1,void 0,this):j(U8,{value:X.name,onChange:(b)=>U({...X,name:b}),onSubmit:(b)=>{if(nY(b))return;A()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Z0,{children:j(n,{dimColor:!0,children:P?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P&&j(U8,{value:"",onChange:()=>{},onSubmit:A,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:[j(n,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(U8,{value:X.description,onChange:(P)=>U({...X,description:P}),onSubmit:(P)=>{if(!P.trim())return;A()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Z0,{children:j(n,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="tools")return j(tY,{config:X,setConfig:U,onNext:A,onPrev:T},void 0,!1,void 0,this);if(J==="color")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(r8,{items:oY,onSelect:(P)=>{let b=P.value==="none"?void 0:P.value;U({...X,color:b}),A()}},void 0,!1,void 0,this),j(Z0,{marginTop:1,children:j(n,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="location")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(r8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(P)=>{U({...X,location:P.value}),A()}},void 0,!1,void 0,this),j(Z0,{marginTop:1,children:j(n,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="systemPrompt")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:[j(n,{color:"green",children:"提示词: "},void 0,!1,void 0,this),j(U8,{value:X.systemPrompt,onChange:(P)=>U({...X,systemPrompt:P}),onSubmit:()=>A()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Z0,{children:j(n,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="confirm")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[j(n,{children:[j(n,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),j(n,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),j(n,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),j(n,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),j(n,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),j(n,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),j(n,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(r8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(P)=>{if(P.value==="save")w();else if(P.value==="back")T();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function tY({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=dY({id:"step-tools"});K6((U,K)=>{if(K.escape)J()},{isActive:Z});let X=(U)=>{if(U.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:U});Y()};return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(lY,{options:iY,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import sY from"node:fs";import{useMemoizedFn as _$}from"ahooks";import{Box as C0,Text as f0,useInput as eY}from"ink";import r2 from"ink-select-input";import{useEffect as $3,useMemo as G6,useState as a8}from"react";import{jsxDEV as a}from"react/jsx-dev-runtime";var a2=10;function O6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=q6($),[X,U]=a8(Q),[K,G]=a8(null),[q,F]=a8(0),[O,N]=a8(0),_=_$(()=>{Z.clear(),Z.loadFromStandardLocations(),F((R)=>R+1)}),B=G6(()=>{return Z.getAllSubagents()},[q]),z=Math.ceil(B.length/a2)||1,L=G6(()=>{let R=O*a2;return B.slice(R,R+a2)},[B,O]);$3(()=>{let R=Math.max(0,z-1);if(O>R)N(R)},[z,O]);let W=_$(()=>{if(O<z-1)N((R)=>R+1)}),A=_$(()=>{if(O>0)N((R)=>R-1)}),T=[{key:"list",label:"查看所有 Agents",value:"list"},{key:"create",label:"创建新 Agent",value:"create"},{key:"edit",label:"编辑 Agent",value:"edit"},{key:"delete",label:"删除 Agent",value:"delete"},{key:"cancel",label:"取消",value:"cancel"}],C=_$((R)=>{if(R.value==="cancel"){J?.();return}U(R.value)}),w=_$((R)=>{if(G(R.value),X==="edit")U("editWizard");else if(X==="delete")U("deleteConfirm")}),S=_$(async()=>{if(!K?.configPath)return;try{await sY.promises.unlink(K.configPath),_(),P()}catch(R){console.error("删除失败:",R)}}),P=_$(()=>{U("menu"),G(null)}),b=v0(!1,J);if(eY((R,H)=>{if(H.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")N(0),P();else if(X==="deleteConfirm")P()}else if(H.ctrl&&R==="c"||H.meta&&R==="c")b();else if(X==="list"){if(H.leftArrow||R==="h")A();else if(H.rightArrow||R==="l")W()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:a(f0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(r2,{items:T,onSelect:C},void 0,!1,void 0,this),a(C0,{marginTop:1,children:a(f0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="list"){if(B.length===0)return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:a(f0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{paddingLeft:2,children:a(f0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{marginTop:1,paddingLeft:2,children:a(f0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{marginTop:1,paddingLeft:2,children:a(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:[a(f0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),a(f0,{color:"gray",children:[" (共 ",B.length," 个)"]},void 0,!0,void 0,this),z>1&&a(f0,{color:"yellow",children:[" ","第 ",O+1,"/",z," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L.map((R)=>a(C0,{flexDirection:"column",paddingLeft:2,children:[a(C0,{children:a(f0,{children:[a(f0,{bold:!0,color:R.color||"white",children:["• ",R.name]},void 0,!0,void 0,this),a(f0,{color:"gray",children:[" - ",R.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.tools&&R.tools.length>0&&a(C0,{paddingLeft:2,children:a(f0,{color:"gray",children:["工具: ",R.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.configPath&&a(C0,{paddingLeft:2,children:a(f0,{color:"gray",dimColor:!0,children:R.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R.name,!0,void 0,this)),a(C0,{marginTop:1,paddingLeft:2,children:z>1?a(f0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):a(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let I=(R)=>{if(B.length===0)return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:a(f0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{paddingLeft:2,children:a(f0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{marginTop:1,paddingLeft:2,children:a(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let H=B.map((f)=>({key:f.name,label:`${f.name} - ${f.description}`,value:f}));return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:a(f0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(r2,{items:H,onSelect:w},void 0,!1,void 0,this),a(C0,{marginTop:1,children:a(f0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(X==="create")return a(K8,{onComplete:()=>{_(),P()},onCancel:P},void 0,!1,void 0,this);if(X==="edit")return I("编辑 Agent");if(X==="editWizard"&&K){let R={name:K.name,description:K.description,tools:K.tools||[],color:K.color,location:K.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:K.systemPrompt||""};return a(K8,{initialConfig:R,onComplete:()=>{_(),P()},onCancel:P},void 0,!1,void 0,this)}if(X==="delete")return I("删除 Agent");if(X==="deleteConfirm"&&K)return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:a(f0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{marginBottom:1,paddingLeft:2,children:a(f0,{children:["你确定要删除 Agent"," ",a(f0,{bold:!0,color:"yellow",children:K.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),a(C0,{marginBottom:1,paddingLeft:2,children:a(f0,{dimColor:!0,children:["文件路径: ",K.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),a(C0,{marginBottom:1,paddingLeft:2,children:a(f0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(r2,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(R)=>{if(R.value==="confirm")S();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as g$,Text as _0}from"ink";import J3,{useEffect as Y3,useState as Z3}from"react";import{useEffect as Q3,useState as z6}from"react";function F6($=u0(),Q=5000){let[Y,J]=z6(null),[Z,X]=z6(!0);return Q3(()=>{let U=!0,K=async()=>{try{let q=await _6($);if(!U)return;if(!q){J(null),X(!1);return}let F=await N6($);if(!U)return;J(F)}catch{if(U)J(null)}finally{if(U)X(!1)}};K();let G=null;if(Q>0)G=setInterval(K,Q);return()=>{if(U=!1,G)clearInterval(G)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as o,Fragment as b1}from"react/jsx-dev-runtime";var H6=J3.memo(()=>{let $=A8(),Q=f$(),J=b8()==="shortcuts",Z=X4(),X=M1(),{branch:U}=F6(X),K=P8(),G=eQ(),q=tQ(),F=M8(),O=C8(),N=I8(),_=T8(),B=v8(),z=sQ(),L=y8(),W=z4(),A=v$(),[T,C]=Z3(null);Y3(()=>{let R=!1;new i2(X,A).get().then((E)=>{if(!R)C(E)}).catch(()=>{if(!R)C(null)});let f=i2.subscribe((E)=>{if(!R&&E.sessionId===A&&E.workspaceRoot===X)C(E.goal)});return()=>{R=!0,f()}},[A,X]);let w=K?x8(K):!1,P=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return o(_0,{color:"magenta",children:[">> ","auto edit on ",o(_0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return o(_0,{color:"cyan",children:["‖ plan mode on ",o(_0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return o(_0,{color:"red",children:["yolo mode on ",o(_0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),b=P!==null,I=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return o(g$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?o(g$,{flexDirection:"column",gap:0,children:I.map((R,H)=>o(g$,{flexDirection:"row",children:[R.map((f,E)=>{let[t,l]=f.split(":");return o(g$,{flexDirection:"row",width:20,children:[o(_0,{color:"yellow",children:t},void 0,!1,void 0,this),o(_0,{color:"gray",children:":"},void 0,!1,void 0,this),o(_0,{color:"white",children:l},void 0,!1,void 0,this)]},E,!0,void 0,this)}),H===I.length-1&&o(_0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},H,!0,void 0,this))},void 0,!1,void 0,this):o(g$,{flexDirection:"row",gap:1,children:[U&&o(b1,{children:[o(_0,{color:"gray",children:[" ",U]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P,b&&o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),T&&o(b1,{children:[o(_0,{color:T.status==="active"?"green":T.status==="blocked"||T.status==="budget_limited"?"yellow":"gray",children:["goal:",T.status," ",T.objective.slice(0,32)]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(g$,{flexDirection:"row",gap:1,children:!$?o(_0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):o(b1,{children:[w&&o(b1,{children:[F?o(_0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):o(_0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N!=="auto"&&o(b1,{children:[o(_0,{color:N==="fast"?"yellow":"gray",children:["Speed ",N]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&o(b1,{children:[o(_0,{color:"gray",children:["Output ",_]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B!=="auto"&&o(b1,{children:[o(_0,{color:"gray",children:["Style ",B]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K&&o(_0,{color:"gray",children:K.model},void 0,!1,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?o(_0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):o(_0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),z>0.001&&o(b1,{children:[o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(_0,{color:"green",children:["$",z<0.01?z.toFixed(4):z.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L.length>0&&o(b1,{children:[o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(_0,{color:"yellow",children:["已排队 ",L.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W>0&&o(b1,{children:[o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(_0,{color:"cyan",children:["已恢复 ",W," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&o(b1,{children:[o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(_0,{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 o2,Text as n2}from"ink";import X3 from"react";import{jsxDEV as m$}from"react/jsx-dev-runtime";var W6=X3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),U=Q>=$.length;if(Q>=J&&!U)Z=Q-J+1,X=Q+1;let K=$.slice(Z,X),G=$.length>J;return m$(o2,{flexDirection:"column",paddingX:2,paddingY:0,children:[K.map((q,F)=>{let N=Z+F===Q;return m$(o2,{flexDirection:"row",paddingX:1,gap:2,children:[m$(n2,{color:N?"cyan":"white",bold:N,children:q.command},void 0,!1,void 0,this),m$(n2,{color:N?"cyan":"gray",dimColor:!N,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),G&&m$(o2,{paddingX:1,children:m$(n2,{color:U?"cyan":"gray",bold:U,dimColor:!U,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as W1,Text as I1,useInput as t3,useStdout as s3}from"ink";import e3 from"ink-select-input";import AQ,{useMemo as l6}from"react";import{Box as z0,Text as b0}from"ink";import H$,{useEffect as wQ,useMemo as F$,useRef as c6}from"react";import{Box as GQ,Text as T6}from"ink";import w3 from"react";import{Text as A1}from"ink";import W3 from"react";import M6 from"string-width";import G8 from"string-width";function t2({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 U3=t2();function s2($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(U3,"")}var L6=($=0)=>(Q)=>`\x1B[${Q+$}m`,B6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,w6=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,j0={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]}},CK=Object.keys(j0.modifier),K3=Object.keys(j0.color),G3=Object.keys(j0.bgColor),IK=[...K3,...G3];function q3(){let $=new Map;for(let[Q,Y]of Object.entries(j0)){for(let[J,Z]of Object.entries(Y))j0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=j0[J],$.set(Z[0],Z[1]);Object.defineProperty(j0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(j0,"codes",{value:$,enumerable:!1}),j0.color.close="\x1B[39m",j0.bgColor.close="\x1B[49m",j0.color.ansi=L6(),j0.color.ansi256=B6(),j0.color.ansi16m=w6(),j0.bgColor.ansi=L6(10),j0.bgColor.ansi256=B6(10),j0.bgColor.ansi16m=w6(10),Object.defineProperties(j0,{rgbToAnsi256:{value(Q,Y,J){if(Q===Y&&Y===J){if(Q<8)return 16;if(Q>248)return 231;return Math.round((Q-8)/247*24)+232}return 16+36*Math.round(Q/255*5)+6*Math.round(Y/255*5)+Math.round(J/255*5)},enumerable:!1},hexToRgb:{value(Q){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(Q.toString(16));if(!Y)return[0,0,0];let[J]=Y;if(J.length===3)J=[...J].map((X)=>X+X).join("");let Z=Number.parseInt(J,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(Q)=>j0.rgbToAnsi256(...j0.hexToRgb(Q)),enumerable:!1},ansi256ToAnsi:{value(Q){if(Q<8)return 30+Q;if(Q<16)return 90+(Q-8);let Y,J,Z;if(Q>=232)Y=((Q-232)*10+8)/255,J=Y,Z=Y;else{Q-=16;let K=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(K/6)/5,Z=K%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let U=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)U+=60;return U},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>j0.ansi256ToAnsi(j0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>j0.ansi256ToAnsi(j0.hexToAnsi256(Q)),enumerable:!1}}),j0}var O3=q3(),b6=O3;var o8=new Set(["\x1B","›"]),z3=39,$Q="\x07",R6="[",_3="]",y6="m",i8=`${_3}8;;`,A6=($)=>`${o8.values().next().value}${R6}${$}${y6}`,P6=($)=>`${o8.values().next().value}${i8}${$}${$Q}`,N3=($)=>$.split(" ").map((Q)=>G8(Q)),e2=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,U=G8(s2($.at(-1)));for(let[K,G]of J.entries()){let q=G8(G);if(U+q<=Y)$[$.length-1]+=G;else $.push(G),U=0;if(o8.has(G))Z=!0,X=J.slice(K+1,K+1+i8.length).join("")===i8;if(Z){if(X){if(G===$Q)Z=!1,X=!1}else if(G===y6)Z=!1;continue}if(U+=q,U===Y&&K<J.length-1)$.push(""),U=0}if(!U&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},F3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(G8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},H3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,U=N3($),K=[""];for(let[O,N]of $.split(" ").entries()){if(Y.trim!==!1)K[K.length-1]=K.at(-1).trimStart();let _=G8(K.at(-1));if(O!==0){if(_>=Q&&(Y.wordWrap===!1||Y.trim===!1))K.push(""),_=0;if(_>0||Y.trim===!1)K[K.length-1]+=" ",_++}if(Y.hard&&U[O]>Q){let B=Q-_,z=1+Math.floor((U[O]-B-1)/Q);if(Math.floor((U[O]-1)/Q)<z)K.push("");e2(K,N,Q);continue}if(_+U[O]>Q&&_>0&&U[O]>0){if(Y.wordWrap===!1&&_<Q){e2(K,N,Q);continue}K.push("")}if(_+U[O]>Q&&Y.wordWrap===!1){e2(K,N,Q);continue}K[K.length-1]+=N}if(Y.trim!==!1)K=K.map((O)=>F3(O));let G=K.join(`
119
- `),q=[...G],F=0;for(let[O,N]of q.entries()){if(J+=N,o8.has(N)){let{groups:B}=new RegExp(`(?:\\${R6}(?<code>\\d+)m|\\${i8}(?<uri>.*)${$Q})`).exec(G.slice(F))||{groups:{}};if(B.code!==void 0){let z=Number.parseFloat(B.code);Z=z===z3?void 0:z}else if(B.uri!==void 0)X=B.uri.length===0?void 0:B.uri}let _=b6.codes.get(Number(Z));if(q[O+1]===`
120
- `){if(X)J+=P6("");if(Z&&_)J+=A6(_)}else if(N===`
121
- `){if(Z&&_)J+=A6(Z);if(X)J+=P6(X)}F+=N.length}return J};function QQ($,Q,Y){return String($).normalize().replaceAll(`\r
118
+ `),R=r2.join(P,`${X.name}.md`);await U6.promises.writeFile(R,I,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),S=v0(!1,Q);if(K6((P,b)=>{if(b.escape)T();else if(b.ctrl&&P==="c"||b.meta&&P==="c")S()},{isActive:J!=="tools"}),J==="mode")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(r8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(P)=>{if(P.value==="ai")B("ai"),Z("aiPrompt");else B("manual"),Z("name")}},void 0,!1,void 0,this),j(Z0,{marginTop:1,children:j(n,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiPrompt")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:[j(n,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(U8,{value:G,onChange:K,onSubmit:(P)=>{if(!P.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Z0,{children:j(n,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(O)return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"yellow",children:[j(iY,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:['根据你的描述:"',G,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="name"){let P=_==="edit";return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:["Step 1/7: ",P?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:P?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:[j(n,{color:"green",children:"名称: "},void 0,!1,void 0,this),P?j(n,{children:X.name},void 0,!1,void 0,this):j(U8,{value:X.name,onChange:(b)=>U({...X,name:b}),onSubmit:(b)=>{if(tY(b))return;A()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Z0,{children:j(n,{dimColor:!0,children:P?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P&&j(U8,{value:"",onChange:()=>{},onSubmit:A,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:[j(n,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(U8,{value:X.description,onChange:(P)=>U({...X,description:P}),onSubmit:(P)=>{if(!P.trim())return;A()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Z0,{children:j(n,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="tools")return j(sY,{config:X,setConfig:U,onNext:A,onPrev:T},void 0,!1,void 0,this);if(J==="color")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(r8,{items:nY,onSelect:(P)=>{let b=P.value==="none"?void 0:P.value;U({...X,color:b}),A()}},void 0,!1,void 0,this),j(Z0,{marginTop:1,children:j(n,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="location")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(r8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(P)=>{U({...X,location:P.value}),A()}},void 0,!1,void 0,this),j(Z0,{marginTop:1,children:j(n,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="systemPrompt")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:[j(n,{color:"green",children:"提示词: "},void 0,!1,void 0,this),j(U8,{value:X.systemPrompt,onChange:(P)=>U({...X,systemPrompt:P}),onSubmit:()=>A()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(Z0,{children:j(n,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="confirm")return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[j(n,{children:[j(n,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),j(n,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),j(n,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),j(n,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),j(n,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),j(n,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(n,{children:[j(n,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),j(n,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(r8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(P)=>{if(P.value==="save")w();else if(P.value==="back")T();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function sY({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=rY({id:"step-tools"});K6((U,G)=>{if(G.escape)J()},{isActive:Z});let X=(U)=>{if(U.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:U});Y()};return j(Z0,{flexDirection:"column",paddingY:1,children:[j(Z0,{marginBottom:1,children:j(n,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(Z0,{marginBottom:1,children:j(n,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(dY,{options:oY,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import eY from"node:fs";import{useMemoizedFn as _$}from"ahooks";import{Box as C0,Text as f0,useInput as $3}from"ink";import a2 from"ink-select-input";import{useEffect as Q3,useMemo as q6,useState as a8}from"react";import{jsxDEV as a}from"react/jsx-dev-runtime";var i2=10;function z6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=O6($),[X,U]=a8(Q),[G,K]=a8(null),[q,F]=a8(0),[O,N]=a8(0),_=_$(()=>{Z.clear(),Z.loadFromStandardLocations(),F((R)=>R+1)}),B=q6(()=>{return Z.getAllSubagents()},[q]),z=Math.ceil(B.length/i2)||1,L=q6(()=>{let R=O*i2;return B.slice(R,R+i2)},[B,O]);Q3(()=>{let R=Math.max(0,z-1);if(O>R)N(R)},[z,O]);let W=_$(()=>{if(O<z-1)N((R)=>R+1)}),A=_$(()=>{if(O>0)N((R)=>R-1)}),T=[{key:"list",label:"查看所有 Agents",value:"list"},{key:"create",label:"创建新 Agent",value:"create"},{key:"edit",label:"编辑 Agent",value:"edit"},{key:"delete",label:"删除 Agent",value:"delete"},{key:"cancel",label:"取消",value:"cancel"}],C=_$((R)=>{if(R.value==="cancel"){J?.();return}U(R.value)}),w=_$((R)=>{if(K(R.value),X==="edit")U("editWizard");else if(X==="delete")U("deleteConfirm")}),S=_$(async()=>{if(!G?.configPath)return;try{await eY.promises.unlink(G.configPath),_(),P()}catch(R){console.error("删除失败:",R)}}),P=_$(()=>{U("menu"),K(null)}),b=v0(!1,J);if($3((R,H)=>{if(H.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")N(0),P();else if(X==="deleteConfirm")P()}else if(H.ctrl&&R==="c"||H.meta&&R==="c")b();else if(X==="list"){if(H.leftArrow||R==="h")A();else if(H.rightArrow||R==="l")W()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:a(f0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(a2,{items:T,onSelect:C},void 0,!1,void 0,this),a(C0,{marginTop:1,children:a(f0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="list"){if(B.length===0)return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:a(f0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{paddingLeft:2,children:a(f0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{marginTop:1,paddingLeft:2,children:a(f0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{marginTop:1,paddingLeft:2,children:a(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:[a(f0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),a(f0,{color:"gray",children:[" (共 ",B.length," 个)"]},void 0,!0,void 0,this),z>1&&a(f0,{color:"yellow",children:[" ","第 ",O+1,"/",z," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L.map((R)=>a(C0,{flexDirection:"column",paddingLeft:2,children:[a(C0,{children:a(f0,{children:[a(f0,{bold:!0,color:R.color||"white",children:["• ",R.name]},void 0,!0,void 0,this),a(f0,{color:"gray",children:[" - ",R.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.tools&&R.tools.length>0&&a(C0,{paddingLeft:2,children:a(f0,{color:"gray",children:["工具: ",R.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.configPath&&a(C0,{paddingLeft:2,children:a(f0,{color:"gray",dimColor:!0,children:R.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R.name,!0,void 0,this)),a(C0,{marginTop:1,paddingLeft:2,children:z>1?a(f0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):a(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let I=(R)=>{if(B.length===0)return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:a(f0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{paddingLeft:2,children:a(f0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{marginTop:1,paddingLeft:2,children:a(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let H=B.map((f)=>({key:f.name,label:`${f.name} - ${f.description}`,value:f}));return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:a(f0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(a2,{items:H,onSelect:w},void 0,!1,void 0,this),a(C0,{marginTop:1,children:a(f0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(X==="create")return a(G8,{onComplete:()=>{_(),P()},onCancel:P},void 0,!1,void 0,this);if(X==="edit")return I("编辑 Agent");if(X==="editWizard"&&G){let R={name:G.name,description:G.description,tools:G.tools||[],color:G.color,location:G.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:G.systemPrompt||""};return a(G8,{initialConfig:R,onComplete:()=>{_(),P()},onCancel:P},void 0,!1,void 0,this)}if(X==="delete")return I("删除 Agent");if(X==="deleteConfirm"&&G)return a(C0,{flexDirection:"column",paddingY:1,children:[a(C0,{marginBottom:1,children:a(f0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(C0,{marginBottom:1,paddingLeft:2,children:a(f0,{children:["你确定要删除 Agent"," ",a(f0,{bold:!0,color:"yellow",children:G.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),a(C0,{marginBottom:1,paddingLeft:2,children:a(f0,{dimColor:!0,children:["文件路径: ",G.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),a(C0,{marginBottom:1,paddingLeft:2,children:a(f0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(a2,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(R)=>{if(R.value==="confirm")S();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as g$,Text as _0}from"ink";import Y3,{useEffect as Z3,useState as X3}from"react";import{useEffect as J3,useState as _6}from"react";function H6($=u0(),Q=5000){let[Y,J]=_6(null),[Z,X]=_6(!0);return J3(()=>{let U=!0,G=async()=>{try{let q=await N6($);if(!U)return;if(!q){J(null),X(!1);return}let F=await F6($);if(!U)return;J(F)}catch{if(U)J(null)}finally{if(U)X(!1)}};G();let K=null;if(Q>0)K=setInterval(G,Q);return()=>{if(U=!1,K)clearInterval(K)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as o,Fragment as b1}from"react/jsx-dev-runtime";var W6=Y3.memo(()=>{let $=A8(),Q=f$(),J=b8()==="shortcuts",Z=U4(),X=M1(),{branch:U}=H6(X),G=P8(),K=$4(),q=sQ(),F=M8(),O=C8(),N=I8(),_=T8(),B=v8(),z=eQ(),L=y8(),W=_4(),A=v$(),[T,C]=X3(null);Z3(()=>{let R=!1;new o2(X,A).get().then((E)=>{if(!R)C(E)}).catch(()=>{if(!R)C(null)});let f=o2.subscribe((E)=>{if(!R&&E.sessionId===A&&E.workspaceRoot===X)C(E.goal)});return()=>{R=!0,f()}},[A,X]);let w=G?x8(G):!1,P=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return o(_0,{color:"magenta",children:[">> ","auto edit on ",o(_0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return o(_0,{color:"cyan",children:["‖ plan mode on ",o(_0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return o(_0,{color:"red",children:["yolo mode on ",o(_0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),b=P!==null,I=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return o(g$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?o(g$,{flexDirection:"column",gap:0,children:I.map((R,H)=>o(g$,{flexDirection:"row",children:[R.map((f,E)=>{let[t,l]=f.split(":");return o(g$,{flexDirection:"row",width:20,children:[o(_0,{color:"yellow",children:t},void 0,!1,void 0,this),o(_0,{color:"gray",children:":"},void 0,!1,void 0,this),o(_0,{color:"white",children:l},void 0,!1,void 0,this)]},E,!0,void 0,this)}),H===I.length-1&&o(_0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},H,!0,void 0,this))},void 0,!1,void 0,this):o(g$,{flexDirection:"row",gap:1,children:[U&&o(b1,{children:[o(_0,{color:"gray",children:[" ",U]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P,b&&o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),T&&o(b1,{children:[o(_0,{color:T.status==="active"?"green":T.status==="blocked"||T.status==="budget_limited"?"yellow":"gray",children:["goal:",T.status," ",T.objective.slice(0,32)]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(g$,{flexDirection:"row",gap:1,children:!$?o(_0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):o(b1,{children:[w&&o(b1,{children:[F?o(_0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):o(_0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N!=="auto"&&o(b1,{children:[o(_0,{color:N==="fast"?"yellow":"gray",children:["Speed ",N]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&o(b1,{children:[o(_0,{color:"gray",children:["Output ",_]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B!=="auto"&&o(b1,{children:[o(_0,{color:"gray",children:["Style ",B]},void 0,!0,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G&&o(_0,{color:"gray",children:G.model},void 0,!1,void 0,this),o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?o(_0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):o(_0,{color:K<20?"red":K<50?"yellow":"gray",children:[K,"%"]},void 0,!0,void 0,this),z>0.001&&o(b1,{children:[o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(_0,{color:"green",children:["$",z<0.01?z.toFixed(4):z.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L.length>0&&o(b1,{children:[o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(_0,{color:"yellow",children:["已排队 ",L.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W>0&&o(b1,{children:[o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(_0,{color:"cyan",children:["已恢复 ",W," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&o(b1,{children:[o(_0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(_0,{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 n2,Text as t2}from"ink";import U3 from"react";import{jsxDEV as m$}from"react/jsx-dev-runtime";var L6=U3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),U=Q>=$.length;if(Q>=J&&!U)Z=Q-J+1,X=Q+1;let G=$.slice(Z,X),K=$.length>J;return m$(n2,{flexDirection:"column",paddingX:2,paddingY:0,children:[G.map((q,F)=>{let N=Z+F===Q;return m$(n2,{flexDirection:"row",paddingX:1,gap:2,children:[m$(t2,{color:N?"cyan":"white",bold:N,children:q.command},void 0,!1,void 0,this),m$(t2,{color:N?"cyan":"gray",dimColor:!N,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),K&&m$(n2,{paddingX:1,children:m$(t2,{color:U?"cyan":"gray",bold:U,dimColor:!U,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as W1,Text as I1,useInput as s3,useStdout as e3}from"ink";import $Z from"ink-select-input";import PQ,{useMemo as d6}from"react";import{Box as z0,Text as b0}from"ink";import H$,{useEffect as bQ,useMemo as F$,useRef as u6}from"react";import{Box as qQ,Text as v6}from"ink";import b3 from"react";import{Text as A1}from"ink";import L3 from"react";import C6 from"string-width";import K8 from"string-width";function s2({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 G3=s2();function e2($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(G3,"")}var B6=($=0)=>(Q)=>`\x1B[${Q+$}m`,w6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,b6=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,j0={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]}},TG=Object.keys(j0.modifier),K3=Object.keys(j0.color),q3=Object.keys(j0.bgColor),vG=[...K3,...q3];function O3(){let $=new Map;for(let[Q,Y]of Object.entries(j0)){for(let[J,Z]of Object.entries(Y))j0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=j0[J],$.set(Z[0],Z[1]);Object.defineProperty(j0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(j0,"codes",{value:$,enumerable:!1}),j0.color.close="\x1B[39m",j0.bgColor.close="\x1B[49m",j0.color.ansi=B6(),j0.color.ansi256=w6(),j0.color.ansi16m=b6(),j0.bgColor.ansi=B6(10),j0.bgColor.ansi256=w6(10),j0.bgColor.ansi16m=b6(10),Object.defineProperties(j0,{rgbToAnsi256:{value(Q,Y,J){if(Q===Y&&Y===J){if(Q<8)return 16;if(Q>248)return 231;return Math.round((Q-8)/247*24)+232}return 16+36*Math.round(Q/255*5)+6*Math.round(Y/255*5)+Math.round(J/255*5)},enumerable:!1},hexToRgb:{value(Q){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(Q.toString(16));if(!Y)return[0,0,0];let[J]=Y;if(J.length===3)J=[...J].map((X)=>X+X).join("");let Z=Number.parseInt(J,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(Q)=>j0.rgbToAnsi256(...j0.hexToRgb(Q)),enumerable:!1},ansi256ToAnsi:{value(Q){if(Q<8)return 30+Q;if(Q<16)return 90+(Q-8);let Y,J,Z;if(Q>=232)Y=((Q-232)*10+8)/255,J=Y,Z=Y;else{Q-=16;let G=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(G/6)/5,Z=G%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let U=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)U+=60;return U},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>j0.ansi256ToAnsi(j0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>j0.ansi256ToAnsi(j0.hexToAnsi256(Q)),enumerable:!1}}),j0}var z3=O3(),A6=z3;var o8=new Set(["\x1B","›"]),_3=39,QQ="\x07",y6="[",N3="]",M6="m",i8=`${N3}8;;`,P6=($)=>`${o8.values().next().value}${y6}${$}${M6}`,R6=($)=>`${o8.values().next().value}${i8}${$}${QQ}`,F3=($)=>$.split(" ").map((Q)=>K8(Q)),$Q=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,U=K8(e2($.at(-1)));for(let[G,K]of J.entries()){let q=K8(K);if(U+q<=Y)$[$.length-1]+=K;else $.push(K),U=0;if(o8.has(K))Z=!0,X=J.slice(G+1,G+1+i8.length).join("")===i8;if(Z){if(X){if(K===QQ)Z=!1,X=!1}else if(K===M6)Z=!1;continue}if(U+=q,U===Y&&G<J.length-1)$.push(""),U=0}if(!U&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},H3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(K8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},W3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,U=F3($),G=[""];for(let[O,N]of $.split(" ").entries()){if(Y.trim!==!1)G[G.length-1]=G.at(-1).trimStart();let _=K8(G.at(-1));if(O!==0){if(_>=Q&&(Y.wordWrap===!1||Y.trim===!1))G.push(""),_=0;if(_>0||Y.trim===!1)G[G.length-1]+=" ",_++}if(Y.hard&&U[O]>Q){let B=Q-_,z=1+Math.floor((U[O]-B-1)/Q);if(Math.floor((U[O]-1)/Q)<z)G.push("");$Q(G,N,Q);continue}if(_+U[O]>Q&&_>0&&U[O]>0){if(Y.wordWrap===!1&&_<Q){$Q(G,N,Q);continue}G.push("")}if(_+U[O]>Q&&Y.wordWrap===!1){$Q(G,N,Q);continue}G[G.length-1]+=N}if(Y.trim!==!1)G=G.map((O)=>H3(O));let K=G.join(`
119
+ `),q=[...K],F=0;for(let[O,N]of q.entries()){if(J+=N,o8.has(N)){let{groups:B}=new RegExp(`(?:\\${y6}(?<code>\\d+)m|\\${i8}(?<uri>.*)${QQ})`).exec(K.slice(F))||{groups:{}};if(B.code!==void 0){let z=Number.parseFloat(B.code);Z=z===_3?void 0:z}else if(B.uri!==void 0)X=B.uri.length===0?void 0:B.uri}let _=A6.codes.get(Number(Z));if(q[O+1]===`
120
+ `){if(X)J+=R6("");if(Z&&_)J+=P6(_)}else if(N===`
121
+ `){if(Z&&_)J+=P6(Z);if(X)J+=R6(X)}F+=N.length}return J};function JQ($,Q,Y){return String($).normalize().replaceAll(`\r
122
122
  `,`
123
123
  `).split(`
124
- `).map((J)=>H3(J,Q,Y)).join(`
125
- `)}var JQ=($)=>{let Q=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1");return M6(Q)};var C6=($)=>{return/[*_~`<[\]https?:]/.test($)},YQ=($)=>{let Y=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((J)=>J.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((J)=>M6(J)))},n8=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=QQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
126
- `).filter((U)=>U.length>0);return X.length>0?X:[""]},I6=($,Q,Y,J)=>{let Z=Math.max(0,Y-Q);if(J==="center"){let X=Math.floor(Z/2);return" ".repeat(X)+$+" ".repeat(Z-X)}if(J==="right")return" ".repeat(Z)+$;return $+" ".repeat(Z)};import{jsxDEV as H1,Fragment as B3}from"react/jsx-dev-runtime";var ZQ=2,XQ=1,UQ=2;function KQ($,Q){return`inline-${$}-${Q}`}var L3=({text:$})=>{let Q=A0();if(!C6($))return H1(A1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,U=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,K;while((K=U.exec($))!==null){if(K.index>J){let O=$.slice(J,K.index);Y.push(H1(A1,{children:O},KQ("text",Z++),!1,void 0,this))}let G=K[0],q=null,F=KQ("match",X++);try{if(G.startsWith("**")&&G.endsWith("**")&&G.length>ZQ*2)q=H1(A1,{bold:!0,children:G.slice(ZQ,-ZQ)},F,!1,void 0,this);else if(G.length>XQ*2&&(G.startsWith("*")&&G.endsWith("*")||G.startsWith("_")&&G.endsWith("_"))){let O=$.substring(K.index-1,K.index),N=$.substring(U.lastIndex,U.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(N)||/[./\\]/.test(O+N)))q=H1(A1,{italic:!0,children:G.slice(XQ,-XQ)},F,!1,void 0,this)}else if(G.startsWith("~~")&&G.endsWith("~~")&&G.length>UQ*2)q=H1(A1,{strikethrough:!0,children:G.slice(UQ,-UQ)},F,!1,void 0,this);else if(G.startsWith("`")&&G.endsWith("`")){let O=G.match(/^(`+)([^`]+)\1$/);if(O&&O[2])q=H1(A1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},F,!1,void 0,this)}else if(G.startsWith("[")&&G.includes("](")&&G.endsWith(")")){let O=G.match(/\[(.*?)\]\((.*?)\)/);if(O){let N=O[1],_=O[2];q=H1(A1,{children:[N,H1(A1,{color:Q.colors.info,children:[" (",_,")"]},void 0,!0,void 0,this)]},F,!0,void 0,this)}}else if(G.match(/^https?:\/\//))q=H1(A1,{color:Q.colors.info,children:G},F,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",G,O),q=null}Y.push(q??H1(A1,{children:G},F,!1,void 0,this)),J=U.lastIndex}if(J<$.length){let G=$.slice(J);Y.push(H1(A1,{children:G},KQ("text",Z++),!1,void 0,this))}return H1(B3,{children:Y.filter((G)=>G!==null)},void 0,!1,void 0,this)},P1=W3.memo(L3);import{jsxDEV as p$}from"react/jsx-dev-runtime";var b3="▎",v6=w3.memo(({lines:$,level:Q})=>{let Y=A0(),J=b3.repeat(Q);return p$(GQ,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return p$(GQ,{height:1},X,!1,void 0,this);return p$(GQ,{flexDirection:"row",children:[p$(T6,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),p$(T6,{italic:!0,wrap:"wrap",children:p$(P1,{text:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},X,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as s8,Text as V1}from"ink";import{isPlainObject as NQ}from"lodash-es";import{common as M3,createLowlight as C3}from"lowlight";import V6 from"react";import{Box as t8,Text as q8}from"ink";import D1,{Fragment as k6}from"react";import A3 from"string-width";var f6=new Map,S6=1000;function OQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=S6){let J=f6.get($);if(J)return J}let Y=Array.from($);if($.length<=S6)f6.set($,Y);return Y}var qQ=new Map;function k1($){if(/^[\x20-\x7E]*$/.test($))return $.length;if(qQ.has($))return qQ.get($);let Q=A3($);return qQ.set($,Q),Q}import{jsxDEV as c$}from"react/jsx-dev-runtime";var zQ=2,D6=D1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=A0(),U=[],K=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),zQ);function G(z){if(!D1.isValidElement(z))return;if(z.type===k6){D1.Children.forEach(z.props.children,G);return}if(z.type===t8){R3(z,Q,U);return}}D1.Children.forEach($,G);let F=U.length>K||Z>0?K-1:K,O=F!==void 0?Math.max(0,U.length-F):0,N=O+Z,B=(O>0?J==="top"?U.slice(O):U.slice(0,F):U).map((z,L)=>c$(t8,{children:z.length>0?z.map((W,A)=>c$(q8,{...W.props,children:W.text},A,!1,void 0,this)):c$(q8,{children:" "},void 0,!1,void 0,this)},L,!1,void 0,this));return c$(t8,{flexDirection:"column",width:Q,flexShrink:0,children:[N>0&&J==="top"&&c$(q8,{color:X.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),B,N>0&&J==="bottom"&&c$(q8,{color:X.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function P3($){if(!D1.isValidElement($)||$.type!==t8)return{noWrapSegments:[],segments:[]};let Q={noWrapSegments:[],segments:[]},Y=!1;function J(Z,X){if(Z===null||Z===void 0)return;if(typeof Z==="string"||typeof Z==="number"){let q=String(Z);if(!q)return;let F={text:q,props:X??{}};if(X===void 0||X.wrap==="wrap")Y=!0,Q.segments.push(F);else if(!Y)Q.noWrapSegments.push(F);else Q.segments.push(F);return}if(!D1.isValidElement(Z))return;if(Z.type===k6){D1.Children.forEach(Z.props.children,(q)=>J(q,X));return}if(Z.type!==q8)return;let{children:U,...K}=Z.props,G=X===void 0?K:{...X,...K};D1.Children.forEach(U,(q)=>J(q,G))}return D1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function R3($,Q,Y){let J=P3($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=k1(O.text);if(J.segments.length===0){let O=[],N=[];for(let _ of J.noWrapSegments){let B=_.text.split(`
127
- `);for(let z=0;z<B.length;z++){if(z>0)O.push(N),N=[];if(B[z])N.push({text:B[z],props:_.props})}}if(N.length>0)O.push(N);for(let _ of O)Y.push(_);return}let X=Q-Z;if(X<1){y3(J.noWrapSegments,Q,Y);return}let U=[],K=[],G=0;function q(){if(U.length===0)U.push([...J.noWrapSegments,...K]);else if(Z>0)U.push([{text:" ".repeat(Z),props:{}},...K]);else U.push(K);K=[],G=0}function F(O,N){if(K.length>0&&K[K.length-1].props===N)K[K.length-1].text+=O;else K.push({text:O,props:N})}for(let O of J.segments){let N=O.text.split(`
128
- `);for(let _=0;_<N.length;_++){if(_>0)q();let z=N[_].split(/(\s+)/);for(let L of z){if(!L)continue;let W=k1(L);if(G+W>X&&G>0){if(q(),/^\s+$/.test(L))continue}if(W>X){let T=OQ(L);while(T.length>0){let C=0,w=0;for(let S of T){let P=k1(S);if(G+w+P>X)break;w+=P,C++}if(C>0){let S=T.slice(0,C).join("");F(S,O.props),G+=k1(S),T=T.slice(C)}if(T.length>0)q()}}else F(L,O.props),G+=W}}if(O.text.endsWith(`
129
- `))q()}if(K.length>0)q();for(let O of U)Y.push(O)}function y3($,Q,Y){let J=[],Z=[],X=0;for(let U of $){let K=U.text.split(`
130
- `);for(let G=0;G<K.length;G++){if(G>0)J.push(Z),Z=[],X=0;let q=K[G];if(!q)continue;let F=k1(q),O=Math.max(0,Q-k1("…"));if(F<=O&&X===0)Z.push({text:q,props:U.props}),X+=F;else{let N=OQ(q),_=X,B=0;for(let L of N){let W=k1(L);if(_+W>O)break;_+=W,B++}let z=N.slice(0,B).join("");if(z)Z.push({text:z,props:U.props});Z.push({text:"…",props:{}}),X=_+k1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let U of J)Y.push(U)}import{jsxDEV as U1}from"react/jsx-dev-runtime";var _Q=C3(M3),I3=200,N$=new Map;function T3($,Q){let Y=`${Q??"__auto__"}:${$}`,J=N$.get(Y);if(J!==void 0)N$.delete(Y),N$.set(Y,J);return J}function v3($,Q,Y){let J=`${Q??"__auto__"}:${$}`;if(N$.size>=I3){let Z=N$.keys().next().value;if(Z!==void 0)N$.delete(Z)}N$.set(J,Y)}function f3($){return NQ($)&&$.type==="text"&&typeof $.value==="string"}function S3($){return NQ($)&&$.type==="element"}function k3($){return NQ($)&&$.type==="root"&&Array.isArray($.children)}function e8($,Q,Y=0){if(f3($))return U1(V1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(S3($)){let J=$.properties?.className?.[0]||"",Z=Q.default;if(J.includes("comment"))Z=Q.comment;else if(J.includes("string"))Z=Q.string;else if(J.includes("number"))Z=Q.number;else if(J.includes("keyword"))Z=Q.keyword;else if(J.includes("function"))Z=Q.function;else if(J.includes("variable"))Z=Q.variable;else if(J.includes("operator"))Z=Q.operator;else if(J.includes("type"))Z=Q.type;else if(J.includes("tag"))Z=Q.tag;else if(J.includes("attr"))Z=Q.attr;let X=$.children?.map((U,K)=>e8(U,Q,K));return U1(V1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(k3($))return U1(V6.Fragment,{children:$.children.map((J,Z)=>e8(J,Q,Z))},Y,!1,void 0,this);return U1(V1,{},Y,!1,void 0,this)}function D3($,Q,Y){let J=Y||d0.getTheme().colors.syntax;try{let Z=T3($,Q);if(Z)return e8(Z,J);let X;if(!Q||!_Q.registered(Q))X=_Q.highlightAuto($);else X=_Q.highlight(Q,$);let U=X;if(!U.children||U.children.length===0)return U1(V1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return v3($,Q,X),e8(X,J)}catch(Z){return U1(V1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var $2=V6.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=A0(),U=$.split(`
131
- `),K=0;if(Z&&U.length>Z){let O=Math.max(Z,zQ);if(U.length>O)K=U.length-O,U=U.slice(K)}let G=U.length+K,q=String(G).length+1,F=Math.max(20,J-4);return U1(s8,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&U1(s8,{marginBottom:0,children:U1(V1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),K>0&&U1(s8,{marginBottom:0,children:U1(V1,{color:X.colors.text.muted,dimColor:!0,children:["... ",K," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),U1(D6,{maxWidth:F,maxHeight:Z,children:U.map((O,N)=>{let _=N+K+1;return U1(s8,{flexDirection:"row",children:[Y&&U1(V1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(_).padStart(q-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?U1(V1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):D3(O,Q,X.colors.syntax)]},N,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as j6,Text as O1,useInput as V3}from"ink";import j3,{useState as h3}from"react";import{jsxDEV as K1}from"react/jsx-dev-runtime";var h6=400;function E3($){let Q=$.split(`
132
- `),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let U=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(U)J=parseInt(U[1],10),Z=parseInt(U[3],10);Y.push({type:"header",content:X});continue}if(X.startsWith("-")){Y.push({type:"remove",content:X.substring(1),lineNumber:J}),J++;continue}if(X.startsWith("+")){Y.push({type:"add",content:X.substring(1),lineNumber:Z}),Z++;continue}if(X.startsWith(" ")||X===""){Y.push({type:"context",content:X.substring(1),lineNumber:Z}),J++,Z++;continue}}return Y}var FQ=j3.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let U=A0(),K=E3($),[G,q]=h3(!1);V3((A)=>{if(A.toLowerCase()==="e")q((T)=>!T)},{isActive:X&&K.length>Z});let O=Math.max(...K.map((A)=>A.lineNumber||0)).toString().length+1,N=K.filter((A)=>A.type==="add").length,_=K.filter((A)=>A.type==="remove").length,B=K.length,z=B>Z,L;if(!z)L=K;else if(G)L=K.slice(0,h6);else L=K.slice(0,Z);let W=B-L.length;return K1(j6,{flexDirection:"column",marginTop:1,marginBottom:1,children:[K1(O1,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),z&&K1(O1,{color:U.colors.info,children:[G?`已展开 ${L.length}/${B} 行`:`显示前 ${Z} 行,共 ${B} 行`," · ",K1(O1,{color:U.colors.success,children:["+",N]},void 0,!0,void 0,this)," ",K1(O1,{color:U.colors.error,children:["-",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z&&K1(O1,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),L.map((A,T)=>{if(A.type==="header")return K1(O1,{color:U.colors.muted,dimColor:!0,children:A.content},T,!1,void 0,this);let C=A.lineNumber?A.lineNumber.toString().padStart(O," "):" ".repeat(O),w=" ",S,P;if(A.type==="add")w="+",P=U.colors.success,S=void 0;else if(A.type==="remove")w="-",P=U.colors.error,S=void 0;else P=U.colors.text.primary;let b=Math.max(0,J-O-2),I=A.content;if(I.length>b)I=I.substring(0,b-3)+"...";return K1(O1,{color:P,backgroundColor:S,children:[K1(O1,{dimColor:!0,children:C},void 0,!1,void 0,this),K1(O1,{children:w},void 0,!1,void 0,this),K1(O1,{children:[" ",I]},void 0,!0,void 0,this)]},T,!0,void 0,this)}),z&&K1(j6,{marginTop:1,children:G?K1(O1,{color:U.colors.info,dimColor:!0,children:[W>0?`已达显示上限 ${h6} 行,仍有 ${W} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):K1(O1,{color:U.colors.info,dimColor:!0,children:["已隐藏剩余 ",W," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),K1(O1,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as HQ,Text as E6}from"ink";import g3 from"react";import{jsxDEV as u$}from"react/jsx-dev-runtime";var m3=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,U=J.length;return u$(HQ,{paddingLeft:U+1,flexDirection:"row",children:[u$(HQ,{width:X,children:u$(E6,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),u$(HQ,{flexGrow:1,children:u$(E6,{wrap:"wrap",children:u$(P1,{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)},WQ=g3.memo(m3);import{Text as LQ}from"ink";import p3,{useMemo as c3}from"react";import g6 from"string-width";import{jsxDEV as BQ}from"react/jsx-dev-runtime";var m6=4,x$=3,u3=4,p6=p3.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=A0(),Z=c3(()=>{if($.length===0||Q.length===0)return null;let O=$.length,N=$.map((P,b)=>{let I=Math.max(YQ(P),x$);for(let R of Q)I=Math.max(I,YQ(R[b]||""));return I}),_=$.map((P,b)=>{let I=Math.max(JQ(P),x$);for(let R of Q)I=Math.max(I,JQ(R[b]||""));return I}),B=1+O*3,z=Math.max(Y-B-m6,O*x$),L=N.reduce((P,b)=>P+b,0),W=_.reduce((P,b)=>P+b,0),A=!1,T;if(W<=z)T=_;else if(L<=z){let P=z-L,b=_.map((R,H)=>R-N[H]),I=b.reduce((R,H)=>R+H,0);T=N.map((R,H)=>{if(I===0)return R;let f=Math.floor(b[H]/I*P);return R+f})}else{A=!0;let P=z/L;T=N.map((b)=>Math.max(Math.floor(b*P),x$))}function C(){let P=1;for(let b=0;b<$.length;b++){let I=n8($[b],T[b],A);P=Math.max(P,I.length)}for(let b of Q)for(let I=0;I<b.length;I++){let R=n8(b[I]||"",T[I],A);P=Math.max(P,R.length)}return P}if(C()>u3)return{type:"vertical",columnWidths:T,needsHardWrap:A};return{type:"horizontal",columnWidths:T,needsHardWrap:A}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),N="─".repeat(O);return BQ(LQ,{children:Q.map((_,B)=>{let z=[];if(B>0)z.push(N);return _.forEach((L,W)=>{let A=$[W]||`Column ${W+1}`,T=(L||"").replace(/\n+/g," ").trim();z.push(`\x1B[1m${A}:\x1B[22m ${T}`)}),z.join(`
124
+ `).map((J)=>W3(J,Q,Y)).join(`
125
+ `)}var YQ=($)=>{let Q=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1");return C6(Q)};var I6=($)=>{return/[*_~`<[\]https?:]/.test($)},ZQ=($)=>{let Y=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((J)=>J.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((J)=>C6(J)))},n8=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=JQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
126
+ `).filter((U)=>U.length>0);return X.length>0?X:[""]},T6=($,Q,Y,J)=>{let Z=Math.max(0,Y-Q);if(J==="center"){let X=Math.floor(Z/2);return" ".repeat(X)+$+" ".repeat(Z-X)}if(J==="right")return" ".repeat(Z)+$;return $+" ".repeat(Z)};import{jsxDEV as H1,Fragment as w3}from"react/jsx-dev-runtime";var XQ=2,UQ=1,GQ=2;function KQ($,Q){return`inline-${$}-${Q}`}var B3=({text:$})=>{let Q=A0();if(!I6($))return H1(A1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,U=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,G;while((G=U.exec($))!==null){if(G.index>J){let O=$.slice(J,G.index);Y.push(H1(A1,{children:O},KQ("text",Z++),!1,void 0,this))}let K=G[0],q=null,F=KQ("match",X++);try{if(K.startsWith("**")&&K.endsWith("**")&&K.length>XQ*2)q=H1(A1,{bold:!0,children:K.slice(XQ,-XQ)},F,!1,void 0,this);else if(K.length>UQ*2&&(K.startsWith("*")&&K.endsWith("*")||K.startsWith("_")&&K.endsWith("_"))){let O=$.substring(G.index-1,G.index),N=$.substring(U.lastIndex,U.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(N)||/[./\\]/.test(O+N)))q=H1(A1,{italic:!0,children:K.slice(UQ,-UQ)},F,!1,void 0,this)}else if(K.startsWith("~~")&&K.endsWith("~~")&&K.length>GQ*2)q=H1(A1,{strikethrough:!0,children:K.slice(GQ,-GQ)},F,!1,void 0,this);else if(K.startsWith("`")&&K.endsWith("`")){let O=K.match(/^(`+)([^`]+)\1$/);if(O&&O[2])q=H1(A1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},F,!1,void 0,this)}else if(K.startsWith("[")&&K.includes("](")&&K.endsWith(")")){let O=K.match(/\[(.*?)\]\((.*?)\)/);if(O){let N=O[1],_=O[2];q=H1(A1,{children:[N,H1(A1,{color:Q.colors.info,children:[" (",_,")"]},void 0,!0,void 0,this)]},F,!0,void 0,this)}}else if(K.match(/^https?:\/\//))q=H1(A1,{color:Q.colors.info,children:K},F,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",K,O),q=null}Y.push(q??H1(A1,{children:K},F,!1,void 0,this)),J=U.lastIndex}if(J<$.length){let K=$.slice(J);Y.push(H1(A1,{children:K},KQ("text",Z++),!1,void 0,this))}return H1(w3,{children:Y.filter((K)=>K!==null)},void 0,!1,void 0,this)},P1=L3.memo(B3);import{jsxDEV as p$}from"react/jsx-dev-runtime";var A3="▎",f6=b3.memo(({lines:$,level:Q})=>{let Y=A0(),J=A3.repeat(Q);return p$(qQ,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return p$(qQ,{height:1},X,!1,void 0,this);return p$(qQ,{flexDirection:"row",children:[p$(v6,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),p$(v6,{italic:!0,wrap:"wrap",children:p$(P1,{text:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},X,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as s8,Text as V1}from"ink";import{isPlainObject as FQ}from"lodash-es";import{common as C3,createLowlight as I3}from"lowlight";import j6 from"react";import{Box as t8,Text as q8}from"ink";import D1,{Fragment as D6}from"react";import P3 from"string-width";var S6=new Map,k6=1000;function zQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=k6){let J=S6.get($);if(J)return J}let Y=Array.from($);if($.length<=k6)S6.set($,Y);return Y}var OQ=new Map;function k1($){if(/^[\x20-\x7E]*$/.test($))return $.length;if(OQ.has($))return OQ.get($);let Q=P3($);return OQ.set($,Q),Q}import{jsxDEV as c$}from"react/jsx-dev-runtime";var _Q=2,V6=D1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=A0(),U=[],G=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),_Q);function K(z){if(!D1.isValidElement(z))return;if(z.type===D6){D1.Children.forEach(z.props.children,K);return}if(z.type===t8){y3(z,Q,U);return}}D1.Children.forEach($,K);let F=U.length>G||Z>0?G-1:G,O=F!==void 0?Math.max(0,U.length-F):0,N=O+Z,B=(O>0?J==="top"?U.slice(O):U.slice(0,F):U).map((z,L)=>c$(t8,{children:z.length>0?z.map((W,A)=>c$(q8,{...W.props,children:W.text},A,!1,void 0,this)):c$(q8,{children:" "},void 0,!1,void 0,this)},L,!1,void 0,this));return c$(t8,{flexDirection:"column",width:Q,flexShrink:0,children:[N>0&&J==="top"&&c$(q8,{color:X.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),B,N>0&&J==="bottom"&&c$(q8,{color:X.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function R3($){if(!D1.isValidElement($)||$.type!==t8)return{noWrapSegments:[],segments:[]};let Q={noWrapSegments:[],segments:[]},Y=!1;function J(Z,X){if(Z===null||Z===void 0)return;if(typeof Z==="string"||typeof Z==="number"){let q=String(Z);if(!q)return;let F={text:q,props:X??{}};if(X===void 0||X.wrap==="wrap")Y=!0,Q.segments.push(F);else if(!Y)Q.noWrapSegments.push(F);else Q.segments.push(F);return}if(!D1.isValidElement(Z))return;if(Z.type===D6){D1.Children.forEach(Z.props.children,(q)=>J(q,X));return}if(Z.type!==q8)return;let{children:U,...G}=Z.props,K=X===void 0?G:{...X,...G};D1.Children.forEach(U,(q)=>J(q,K))}return D1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function y3($,Q,Y){let J=R3($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=k1(O.text);if(J.segments.length===0){let O=[],N=[];for(let _ of J.noWrapSegments){let B=_.text.split(`
127
+ `);for(let z=0;z<B.length;z++){if(z>0)O.push(N),N=[];if(B[z])N.push({text:B[z],props:_.props})}}if(N.length>0)O.push(N);for(let _ of O)Y.push(_);return}let X=Q-Z;if(X<1){M3(J.noWrapSegments,Q,Y);return}let U=[],G=[],K=0;function q(){if(U.length===0)U.push([...J.noWrapSegments,...G]);else if(Z>0)U.push([{text:" ".repeat(Z),props:{}},...G]);else U.push(G);G=[],K=0}function F(O,N){if(G.length>0&&G[G.length-1].props===N)G[G.length-1].text+=O;else G.push({text:O,props:N})}for(let O of J.segments){let N=O.text.split(`
128
+ `);for(let _=0;_<N.length;_++){if(_>0)q();let z=N[_].split(/(\s+)/);for(let L of z){if(!L)continue;let W=k1(L);if(K+W>X&&K>0){if(q(),/^\s+$/.test(L))continue}if(W>X){let T=zQ(L);while(T.length>0){let C=0,w=0;for(let S of T){let P=k1(S);if(K+w+P>X)break;w+=P,C++}if(C>0){let S=T.slice(0,C).join("");F(S,O.props),K+=k1(S),T=T.slice(C)}if(T.length>0)q()}}else F(L,O.props),K+=W}}if(O.text.endsWith(`
129
+ `))q()}if(G.length>0)q();for(let O of U)Y.push(O)}function M3($,Q,Y){let J=[],Z=[],X=0;for(let U of $){let G=U.text.split(`
130
+ `);for(let K=0;K<G.length;K++){if(K>0)J.push(Z),Z=[],X=0;let q=G[K];if(!q)continue;let F=k1(q),O=Math.max(0,Q-k1("…"));if(F<=O&&X===0)Z.push({text:q,props:U.props}),X+=F;else{let N=zQ(q),_=X,B=0;for(let L of N){let W=k1(L);if(_+W>O)break;_+=W,B++}let z=N.slice(0,B).join("");if(z)Z.push({text:z,props:U.props});Z.push({text:"…",props:{}}),X=_+k1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let U of J)Y.push(U)}import{jsxDEV as U1}from"react/jsx-dev-runtime";var NQ=I3(C3),T3=200,N$=new Map;function v3($,Q){let Y=`${Q??"__auto__"}:${$}`,J=N$.get(Y);if(J!==void 0)N$.delete(Y),N$.set(Y,J);return J}function f3($,Q,Y){let J=`${Q??"__auto__"}:${$}`;if(N$.size>=T3){let Z=N$.keys().next().value;if(Z!==void 0)N$.delete(Z)}N$.set(J,Y)}function S3($){return FQ($)&&$.type==="text"&&typeof $.value==="string"}function k3($){return FQ($)&&$.type==="element"}function D3($){return FQ($)&&$.type==="root"&&Array.isArray($.children)}function e8($,Q,Y=0){if(S3($))return U1(V1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(k3($)){let J=$.properties?.className?.[0]||"",Z=Q.default;if(J.includes("comment"))Z=Q.comment;else if(J.includes("string"))Z=Q.string;else if(J.includes("number"))Z=Q.number;else if(J.includes("keyword"))Z=Q.keyword;else if(J.includes("function"))Z=Q.function;else if(J.includes("variable"))Z=Q.variable;else if(J.includes("operator"))Z=Q.operator;else if(J.includes("type"))Z=Q.type;else if(J.includes("tag"))Z=Q.tag;else if(J.includes("attr"))Z=Q.attr;let X=$.children?.map((U,G)=>e8(U,Q,G));return U1(V1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(D3($))return U1(j6.Fragment,{children:$.children.map((J,Z)=>e8(J,Q,Z))},Y,!1,void 0,this);return U1(V1,{},Y,!1,void 0,this)}function V3($,Q,Y){let J=Y||d0.getTheme().colors.syntax;try{let Z=v3($,Q);if(Z)return e8(Z,J);let X;if(!Q||!NQ.registered(Q))X=NQ.highlightAuto($);else X=NQ.highlight(Q,$);let U=X;if(!U.children||U.children.length===0)return U1(V1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return f3($,Q,X),e8(X,J)}catch(Z){return U1(V1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var $2=j6.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=A0(),U=$.split(`
131
+ `),G=0;if(Z&&U.length>Z){let O=Math.max(Z,_Q);if(U.length>O)G=U.length-O,U=U.slice(G)}let K=U.length+G,q=String(K).length+1,F=Math.max(20,J-4);return U1(s8,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&U1(s8,{marginBottom:0,children:U1(V1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),G>0&&U1(s8,{marginBottom:0,children:U1(V1,{color:X.colors.text.muted,dimColor:!0,children:["... ",G," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),U1(V6,{maxWidth:F,maxHeight:Z,children:U.map((O,N)=>{let _=N+G+1;return U1(s8,{flexDirection:"row",children:[Y&&U1(V1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(_).padStart(q-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?U1(V1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):V3(O,Q,X.colors.syntax)]},N,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as h6,Text as O1,useInput as j3}from"ink";import h3,{useState as E3}from"react";import{jsxDEV as G1}from"react/jsx-dev-runtime";var E6=400;function g3($){let Q=$.split(`
132
+ `),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let U=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(U)J=parseInt(U[1],10),Z=parseInt(U[3],10);Y.push({type:"header",content:X});continue}if(X.startsWith("-")){Y.push({type:"remove",content:X.substring(1),lineNumber:J}),J++;continue}if(X.startsWith("+")){Y.push({type:"add",content:X.substring(1),lineNumber:Z}),Z++;continue}if(X.startsWith(" ")||X===""){Y.push({type:"context",content:X.substring(1),lineNumber:Z}),J++,Z++;continue}}return Y}var HQ=h3.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let U=A0(),G=g3($),[K,q]=E3(!1);j3((A)=>{if(A.toLowerCase()==="e")q((T)=>!T)},{isActive:X&&G.length>Z});let O=Math.max(...G.map((A)=>A.lineNumber||0)).toString().length+1,N=G.filter((A)=>A.type==="add").length,_=G.filter((A)=>A.type==="remove").length,B=G.length,z=B>Z,L;if(!z)L=G;else if(K)L=G.slice(0,E6);else L=G.slice(0,Z);let W=B-L.length;return G1(h6,{flexDirection:"column",marginTop:1,marginBottom:1,children:[G1(O1,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),z&&G1(O1,{color:U.colors.info,children:[K?`已展开 ${L.length}/${B} 行`:`显示前 ${Z} 行,共 ${B} 行`," · ",G1(O1,{color:U.colors.success,children:["+",N]},void 0,!0,void 0,this)," ",G1(O1,{color:U.colors.error,children:["-",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z&&G1(O1,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),L.map((A,T)=>{if(A.type==="header")return G1(O1,{color:U.colors.muted,dimColor:!0,children:A.content},T,!1,void 0,this);let C=A.lineNumber?A.lineNumber.toString().padStart(O," "):" ".repeat(O),w=" ",S,P;if(A.type==="add")w="+",P=U.colors.success,S=void 0;else if(A.type==="remove")w="-",P=U.colors.error,S=void 0;else P=U.colors.text.primary;let b=Math.max(0,J-O-2),I=A.content;if(I.length>b)I=I.substring(0,b-3)+"...";return G1(O1,{color:P,backgroundColor:S,children:[G1(O1,{dimColor:!0,children:C},void 0,!1,void 0,this),G1(O1,{children:w},void 0,!1,void 0,this),G1(O1,{children:[" ",I]},void 0,!0,void 0,this)]},T,!0,void 0,this)}),z&&G1(h6,{marginTop:1,children:K?G1(O1,{color:U.colors.info,dimColor:!0,children:[W>0?`已达显示上限 ${E6} 行,仍有 ${W} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):G1(O1,{color:U.colors.info,dimColor:!0,children:["已隐藏剩余 ",W," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G1(O1,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as WQ,Text as g6}from"ink";import m3 from"react";import{jsxDEV as u$}from"react/jsx-dev-runtime";var p3=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,U=J.length;return u$(WQ,{paddingLeft:U+1,flexDirection:"row",children:[u$(WQ,{width:X,children:u$(g6,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),u$(WQ,{flexGrow:1,children:u$(g6,{wrap:"wrap",children:u$(P1,{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)},LQ=m3.memo(p3);import{Text as BQ}from"ink";import c3,{useMemo as u3}from"react";import m6 from"string-width";import{jsxDEV as wQ}from"react/jsx-dev-runtime";var p6=4,x$=3,x3=4,c6=c3.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=A0(),Z=u3(()=>{if($.length===0||Q.length===0)return null;let O=$.length,N=$.map((P,b)=>{let I=Math.max(ZQ(P),x$);for(let R of Q)I=Math.max(I,ZQ(R[b]||""));return I}),_=$.map((P,b)=>{let I=Math.max(YQ(P),x$);for(let R of Q)I=Math.max(I,YQ(R[b]||""));return I}),B=1+O*3,z=Math.max(Y-B-p6,O*x$),L=N.reduce((P,b)=>P+b,0),W=_.reduce((P,b)=>P+b,0),A=!1,T;if(W<=z)T=_;else if(L<=z){let P=z-L,b=_.map((R,H)=>R-N[H]),I=b.reduce((R,H)=>R+H,0);T=N.map((R,H)=>{if(I===0)return R;let f=Math.floor(b[H]/I*P);return R+f})}else{A=!0;let P=z/L;T=N.map((b)=>Math.max(Math.floor(b*P),x$))}function C(){let P=1;for(let b=0;b<$.length;b++){let I=n8($[b],T[b],A);P=Math.max(P,I.length)}for(let b of Q)for(let I=0;I<b.length;I++){let R=n8(b[I]||"",T[I],A);P=Math.max(P,R.length)}return P}if(C()>x3)return{type:"vertical",columnWidths:T,needsHardWrap:A};return{type:"horizontal",columnWidths:T,needsHardWrap:A}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),N="─".repeat(O);return wQ(BQ,{children:Q.map((_,B)=>{let z=[];if(B>0)z.push(N);return _.forEach((L,W)=>{let A=$[W]||`Column ${W+1}`,T=(L||"").replace(/\n+/g," ").trim();z.push(`\x1B[1m${A}:\x1B[22m ${T}`)}),z.join(`
133
133
  `)}).join(`
134
- `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:U}=Z;function K(O){let _={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],B=_.left;return X.forEach((z,L)=>{B+=_.h.repeat(z+2),B+=L<X.length-1?_.mid:_.right}),B}function G(O,N){let _=O.map((W,A)=>{let T=X[A]||x$;return n8(W||"",T,U)}),B=Math.max(..._.map((W)=>W.length),1),z=_.map((W)=>Math.floor((B-W.length)/2)),L=[];for(let W=0;W<B;W++){let A="│";for(let T=0;T<O.length;T++){let C=_[T],w=z[T],S=W-w,P=S>=0&&S<C.length?C[S]:"",b=X[T]||x$,I=g6(P),R=I6(N?`\x1B[1m${P}\x1B[22m`:P,I,b,N?"center":"left");A+=` ${R} │`}L.push(A)}return L}let q=[];if(q.push(K("top")),q.push(...G($,!0)),q.push(K("middle")),Q.forEach((O,N)=>{if(q.push(...G(O,!1)),N<Q.length-1)q.push(K("middle"))}),q.push(K("bottom")),Math.max(...q.map((O)=>g6(O)))>Y-m6){let O=Math.min(Y-1,40),N="─".repeat(O);return BQ(LQ,{children:Q.map((_,B)=>{let z=[];if(B>0)z.push(N);return _.forEach((L,W)=>{let A=$[W]||`Column ${W+1}`,T=(L||"").replace(/\n+/g," ").trim();z.push(`\x1B[1m${A}:\x1B[22m ${T}`)}),z.join(`
134
+ `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:U}=Z;function G(O){let _={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],B=_.left;return X.forEach((z,L)=>{B+=_.h.repeat(z+2),B+=L<X.length-1?_.mid:_.right}),B}function K(O,N){let _=O.map((W,A)=>{let T=X[A]||x$;return n8(W||"",T,U)}),B=Math.max(..._.map((W)=>W.length),1),z=_.map((W)=>Math.floor((B-W.length)/2)),L=[];for(let W=0;W<B;W++){let A="│";for(let T=0;T<O.length;T++){let C=_[T],w=z[T],S=W-w,P=S>=0&&S<C.length?C[S]:"",b=X[T]||x$,I=m6(P),R=T6(N?`\x1B[1m${P}\x1B[22m`:P,I,b,N?"center":"left");A+=` ${R} │`}L.push(A)}return L}let q=[];if(q.push(G("top")),q.push(...K($,!0)),q.push(G("middle")),Q.forEach((O,N)=>{if(q.push(...K(O,!1)),N<Q.length-1)q.push(G("middle"))}),q.push(G("bottom")),Math.max(...q.map((O)=>m6(O)))>Y-p6){let O=Math.min(Y-1,40),N="─".repeat(O);return wQ(BQ,{children:Q.map((_,B)=>{let z=[];if(B>0)z.push(N);return _.forEach((L,W)=>{let A=$[W]||`Column ${W+1}`,T=(L||"").replace(/\n+/g," ").trim();z.push(`\x1B[1m${A}:\x1B[22m ${T}`)}),z.join(`
135
135
  `)}).join(`
136
- `)},void 0,!1,void 0,this)}return BQ(LQ,{color:J.colors.text.primary,children:q.join(`
137
- `)},void 0,!1,void 0,this)});import{jsxDEV as m}from"react/jsx-dev-runtime";var x3=($,Q,Y)=>{switch($){case"user":return{color:Q.info,prefix:"> "};case"assistant":return{color:Q.success,prefix:"• "};case"system":return{color:Q.warning,prefix:" "};case"tool":{let J=Y&&"phase"in Y?Y.phase:void 0;return{color:Q.text.secondary,prefix:J==="start"?"• ":J==="complete"?" └ ":" "}}default:return{color:Q.text.primary,prefix:" "}}},l3=H$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=A0();if(J&&Z!==void 0){let U=$.split(`
138
- `),K=4,G=Math.max(1,Z-4);if(U.length>G){let q=U.slice(0,G).join(`
139
- `);return m(z0,{flexDirection:"column",flexShrink:0,children:[m($2,{content:q,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),m(b0,{color:X.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return m($2,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),d3=H$.memo(({content:$,level:Q})=>{let Y=A0();switch(Q){case 1:return m(b0,{bold:!0,color:Y.colors.primary,children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return m(b0,{bold:!0,color:Y.colors.primary,children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return m(b0,{bold:!0,color:Y.colors.text.primary,children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return m(b0,{italic:!0,color:Y.colors.text.muted,children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return m(b0,{children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),r3=H$.memo(({terminalWidth:$})=>{let Q=A0(),Y=Math.max(0,Math.min($-4,80));return m(b0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),a3=H$.memo(({content:$})=>{return m(b0,{wrap:"wrap",children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),i3=H$.memo(({content:$})=>{let Q=A0();return m(z0,{flexDirection:"row",gap:1,children:[m(b0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),m(b0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),o3=H$.memo(({detail:$,terminalWidth:Q})=>{let Y=A0(),J=50,Z=$.split(`
140
- `);while(Z.length>0&&Z[0].trim()==="")Z.shift();while(Z.length>0&&Z[Z.length-1].trim()==="")Z.pop();let X=Z.length>50,U=X?Z.slice(0,50):Z,K=U.join(`
141
- `),G=K.includes("<<<DIFF>>>"),q=K.includes("```");if(G){let F=K.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(F)try{let O=JSON.parse(F[1]);return m(z0,{flexDirection:"column",children:[m(FQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&m(z0,{marginTop:1,children:m(b0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(q){let F=K.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(F){let O=F[1]||"text",N=F[2];return m(z0,{flexDirection:"column",children:[m($2,{content:N,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&m(z0,{marginTop:1,children:m(b0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return m(z0,{flexDirection:"column",children:[U.map((F,O)=>m(b0,{color:Y.colors.text.primary,children:F},O,!1,void 0,this)),X&&m(z0,{marginTop:1,children:m(b0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function n3($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),U=Math.max(40,J*0.8),K=X*U;if($.length<=K)return{content:$,isTruncated:!1,hiddenLines:0};let G=Math.floor(K*0.9),q=$.length-G,F=q,O=$.indexOf(`
142
- `,q);if(O!==-1&&O-q<U)F=O+1;let N=$.slice(F),B=($.slice(0,F).match(/\n/g)||[]).length+1;return{content:N,isTruncated:!0,hiddenLines:B}}var t1=H$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:U=!1,noMargin:K=!1,renderPlainTextOnly:G=!1,streamingLines:q,streamingHiddenLines:F,messageId:O,blocksOverride:N,currentLineOverride:_,streamingMode:B="text",renderCodeBlocksAsPlainText:z=!1})=>{let L=A0(),W=N!==void 0,A=F$(()=>x3(Q,L.colors,J),[Q,L.colors,J]),{color:T,prefix:C}=A,w=C.length+1,S=F$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let y=J.subtaskRef;if(!y||typeof y!=="object")return null;return y},[J]),P=Q==="tool"&&J?.phase==="start",b=!K&&!P,I=F$(()=>{if(!G)return[];return $.split(/\r?\n/)},[$,G]);if(!W&&Z){let y=q??$.split(/\r?\n/),g=F??0,h=!1,x=!1,V=!1;if(B!=="text")h=B==="code",x=B==="diff",V=B==="table";return m(z0,{flexDirection:"column",marginBottom:b?1:0,flexShrink:0,children:[g>0&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(b0,{color:L.colors.text.muted,dimColor:!0,children:["^ ",g," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y.map((i,U0)=>{if(B==="text"){if(i.match(n1.codeBlock))h=!h;else if(i.match(n1.diffStart))x=!0;else if(i.match(n1.diffEnd))x=!1;else if(i.match(n1.table))V=!0;else if(V&&!i.match(n1.table))V=!1}let q0=B==="text"&&!h&&!x&&!V,R0=q0?i.match(n1.ulItem):null,B0=q0?i.match(n1.olItem):null,s0=R0??B0;return m(z0,{flexDirection:"row",flexShrink:0,children:[U0===0&&!U?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:T,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:s0?m(WQ,{type:R0?"ul":"ol",marker:s0[2],itemText:s0[3],leadingWhitespace:s0[1]},void 0,!1,void 0,this):m(b0,{wrap:"wrap",children:i===""?" ":i},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},U0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!W&&G)return m(z0,{flexDirection:"column",marginBottom:b?1:0,flexShrink:0,children:I.map((y,g)=>m(z0,{flexDirection:"row",flexShrink:0,children:[g===0&&!U?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:T,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:m(b0,{wrap:"wrap",children:y===""?" ":y},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},g,!0,void 0,this))},void 0,!1,void 0,this);let R=c6(null);wQ(()=>{R.current=null},[O]);let H=F$(()=>{if(W)return null;if(!O)return null;return u6(O)},[O,W]);wQ(()=>{if(W)return;if(!H||!O)return;R.current={messageId:O,blocks:H}},[H,O,W]),wQ(()=>{if(W)return;if(!H||!O)return;x6(O)},[H,O,W]);let f=F$(()=>W?{content:$,isTruncated:!1,hiddenLines:0}:n3($,X,Z,Y),[$,X,Z,Y,W]),{content:E,isTruncated:t,hiddenLines:l}=f;if(!W&&Q==="tool"&&J&&"detail"in J){let y=J;if(y.detail)return m(z0,{flexDirection:"column",marginBottom:K?0:1,children:[m(z0,{flexDirection:"row",children:[m(z0,{marginRight:1,children:m(b0,{color:T,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(b0,{color:T,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),m(z0,{marginLeft:C.length+1,children:m(o3,{detail:y.detail,terminalWidth:Y-(C.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:v,currentLine:M}=F$(()=>{if(W)return{completedContent:"",currentLine:_??""};if(!Z)return{completedContent:E,currentLine:""};let y=E.lastIndexOf(`
143
- `);if(y===-1)return{completedContent:"",currentLine:E};return{completedContent:E.slice(0,y+1),currentLine:E.slice(y+1)}},[E,Z,W,_]),k=c6({content:"",blocks:[]}),D=F$(()=>{if(W)return N??[];if(H)return H;if(R.current&&R.current.messageId===O)return R.current.blocks;let y=k.current;if(!Z||!v.startsWith(y.content)){let V=bQ(v);return k.current={content:v,blocks:V},V}if(v===y.content)return y.blocks;let g=v.slice(y.content.length),h=bQ(g),x=[...y.blocks,...h];return k.current={content:v,blocks:x},x},[v,Z,W,N]);return m(z0,{flexDirection:"column",marginBottom:b?1:0,flexShrink:0,children:[t&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(b0,{color:L.colors.text.muted,dimColor:!0,children:["^ ",l," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D.map((y,g)=>{if(y.type==="empty")return m(z0,{height:1,flexShrink:0},g,!1,void 0,this);return m(z0,{flexDirection:"row",flexShrink:0,children:[g===0&&!U&&m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:T,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),(g>0||U)&&m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:y.type==="code"?z?m(b0,{wrap:"wrap",children:y.content},void 0,!1,void 0,this):m(l3,{content:y.content,language:y.language,terminalWidth:Y-w,isPending:Z,availableHeight:X},void 0,!1,void 0,this):y.type==="table"&&y.tableData?m(p6,{headers:y.tableData.headers,rows:y.tableData.rows,terminalWidth:Y-w},void 0,!1,void 0,this):y.type==="heading"?m(d3,{content:y.content,level:y.level||1},void 0,!1,void 0,this):y.type==="list"?m(WQ,{type:y.listType||"ul",marker:y.marker||"-",itemText:y.content,leadingWhitespace:" ".repeat(y.indentation||0)},void 0,!1,void 0,this):y.type==="hr"?m(r3,{terminalWidth:Y-w},void 0,!1,void 0,this):y.type==="diff"&&y.diffData?m(FQ,{patch:y.diffData.patch,startLine:y.diffData.startLine,matchLine:y.diffData.matchLine,terminalWidth:Y-w},void 0,!1,void 0,this):y.type==="command-message"?m(i3,{content:y.content},void 0,!1,void 0,this):y.type==="blockquote"&&y.blockquoteLines?m(v6,{lines:y.blockquoteLines,level:y.blockquoteLevel||1},void 0,!1,void 0,this):m(a3,{content:y.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},g,!0,void 0,this)}),M&&m(z0,{flexDirection:"row",flexShrink:0,children:[D.length===0&&!U?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:T,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:m(b0,{wrap:"wrap",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[m(b0,{color:L.colors.text.muted,children:["Subtask"," ",typeof S.agentType==="string"?`@${S.agentType}`:"",typeof S.status==="string"?` · ${S.status}`:""]},void 0,!0,void 0,this),typeof S.summary==="string"&&S.summary.trim()!==""&&m(b0,{wrap:"wrap",children:S.summary},void 0,!1,void 0,this),typeof S.childSessionId==="string"&&m(b0,{color:L.colors.text.muted,children:["Session ",S.childSessionId]},void 0,!0,void 0,this),typeof S.resumedFrom==="string"&&m(b0,{color:L.colors.text.muted,children:["Resumed from ",S.resumedFrom,typeof S.resumeDepth==="number"?` · depth ${S.resumeDepth}`:""]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},($,Q)=>{return $.content===Q.content&&$.role===Q.role&&$.terminalWidth===Q.terminalWidth&&$.isPending===Q.isPending&&$.availableTerminalHeight===Q.availableTerminalHeight&&$.hidePrefix===Q.hidePrefix&&$.noMargin===Q.noMargin&&$.renderPlainTextOnly===Q.renderPlainTextOnly&&$.streamingHiddenLines===Q.streamingHiddenLines&&$.streamingLines===Q.streamingLines&&$.messageId===Q.messageId&&$.metadata===Q.metadata&&$.blocksOverride===Q.blocksOverride&&$.currentLineOverride===Q.currentLineOverride&&$.streamingMode===Q.streamingMode&&$.renderCodeBlocksAsPlainText===Q.renderCodeBlocksAsPlainText});import{jsxDEV as I0,Fragment as YZ}from"react/jsx-dev-runtime";var $Z=AQ.memo(({label:$,isSelected:Q})=>I0(I1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),QZ=AQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(YZ,{children:[I0(W1,{marginBottom:1,children:I0(I1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&I0(W1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[I0(I1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(W1,{marginTop:1,children:I0(t1,{content:$.planContent,role:"assistant",terminalWidth:Z-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&I0(W1,{flexDirection:"column",marginBottom:1,children:I0(t1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&I0(W1,{flexDirection:"column",marginBottom:1,children:[I0(I1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,U)=>I0(W1,{marginLeft:2,children:I0(I1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},U,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&I0(W1,{flexDirection:"column",marginBottom:1,children:[I0(I1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,U)=>I0(W1,{marginLeft:2,children:I0(I1,{children:["• ",X]},void 0,!0,void 0,this)},U,!1,void 0,this)),$.affectedFiles.length>3&&I0(W1,{marginLeft:2,children:I0(I1,{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 JZ($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var d6=AQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=s3(),J=Y.columns||80,X=$1()==="confirmation-prompt",U=v0(!1),K=$.type==="exitPlanMode",G=$.type==="enterPlanMode",q=$.type==="maxTurnsExceeded",F=$.type==="mcpSampling";t3((_,B)=>{if(B.ctrl&&_==="c"||B.meta&&_==="c"){U();return}if(B.escape){Q({approved:!1,reason:"用户取消"});return}let z=_.toLowerCase();if(K){if(z==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(z==="s"){Q({approved:!0,targetMode:"default"});return}if(z==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(G){if(z==="y"){Q({approved:!0});return}if(z==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(q){if(z==="y"){Q({approved:!0});return}if(z==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(F){if(z==="y"){Q({approved:!0,scope:"once"});return}if(z==="n"){Q({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(z==="y"){Q({approved:!0,scope:"once"});return}if(z==="s"){Q({approved:!0,scope:"session"});return}if(z==="p"){Q({approved:!0,scope:"project"});return}if(z==="n"){Q({approved:!1,reason:"用户拒绝"});return}}},{isActive:X});let O=l6(()=>{if(K)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(G)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(q)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(F)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:"用户拒绝"}}]},[K,G,q,F]),N=l6(()=>{if(K)return{color:"cyan",title:"方案审核"};if(G)return{color:"magenta",title:"进入规划模式"};if(q)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[K,G,q,$.title]);return I0(W1,{flexDirection:"column",borderStyle:"round",borderColor:X?N.color:"gray",padding:1,children:[I0(W1,{marginBottom:1,children:I0(I1,{bold:!0,color:N.color,children:N.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(QZ,{details:$,headerColor:N.color,isPlanModeExit:K,isPlanModeEnter:G,terminalWidth:J},void 0,!1,void 0,this),I0(W1,{flexDirection:"column",children:[I0(I1,{color:"gray",children:JZ(K,G,q,F)},void 0,!1,void 0,this),I0(e3,{items:O,isFocused:X,itemComponent:$Z,onSelect:(_)=>{Q(_.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as L0,Text as X0,useInput as ZZ}from"ink";import r6 from"ink-text-input";import{useState as j1}from"react";import{jsxDEV as p}from"react/jsx-dev-runtime";var O8=[{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"}],Q2=[{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"}],J2=[{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"}],XZ=[`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"],a6=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=d0.getTheme(),[X,U]=j1("action"),[K,G]=j1(0),[q,F]=j1(0),[O,N]=j1(0),[_,B]=j1(""),[z,L]=j1(""),[W,A]=j1(null),[T,C]=j1(!1),[w,S]=j1(null),P=O8[K],b=J2[q],I=Q2[O],R=()=>{if(w){S(null);return}switch(X){case"action":Y();break;case"event":U("action");break;case"matcher":U("event");break;case"command":U("matcher");break;case"location":U("command");break;case"confirm":U("location");break}};ZZ((D,y)=>{if(y.escape){R();return}if(X==="action"){if(y.upArrow)G((g)=>g>0?g-1:O8.length-1);else if(y.downArrow)G((g)=>g<O8.length-1?g+1:0);else if(y.return)H()}else if(X==="event"){if(y.upArrow)F((g)=>g>0?g-1:J2.length-1);else if(y.downArrow)F((g)=>g<J2.length-1?g+1:0);else if(y.return)U("matcher")}else if(X==="location"){if(y.upArrow)N((g)=>g>0?g-1:Q2.length-1);else if(y.downArrow)N((g)=>g<Q2.length-1?g+1:0);else if(y.return)U("confirm")}else if(X==="confirm"){if(y.return)k()}});let H=()=>{let D=O8[K].action;if(D==="add")U("event");else if(D==="status")f();else if(D==="list")l();else if(D==="enable")q1.getInstance().enableSession(Q,$),S("Hooks enabled for this session");else if(D==="disable")q1.getInstance().disableSession(Q,$),S("Hooks disabled for this session");else if(D==="trust")E();else if(D==="revoke")t()},f=async()=>{let D=q1.getInstance(),y=D.isEnabled($,Q),g=D.getConfig($),h=await D.getTrustStatus($),x={};for(let i of Object.values(RQ)){let U0=g[i];if(U0&&Array.isArray(U0)){let q0=U0.reduce((R0,B0)=>R0+(B0.hooks?.length||0),0);if(q0>0)x[i]=q0}}let V=[`Status: ${y?"Enabled":"Disabled"}`,`Trust: ${h.state}`,`Digest: ${h.currentDigest??"none"}`,""];if(Object.keys(x).length>0){V.push("Configured hooks:");for(let[i,U0]of Object.entries(x))V.push(` ${i}: ${U0} hook(s)`)}else V.push("No hooks configured");S(V.join(`
136
+ `)},void 0,!1,void 0,this)}return wQ(BQ,{color:J.colors.text.primary,children:q.join(`
137
+ `)},void 0,!1,void 0,this)});import{jsxDEV as m}from"react/jsx-dev-runtime";var l3=($,Q,Y)=>{switch($){case"user":return{color:Q.info,prefix:"> "};case"assistant":return{color:Q.success,prefix:"• "};case"system":return{color:Q.warning,prefix:" "};case"tool":{let J=Y&&"phase"in Y?Y.phase:void 0;return{color:Q.text.secondary,prefix:J==="start"?"• ":J==="complete"?" └ ":" "}}default:return{color:Q.text.primary,prefix:" "}}},d3=H$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=A0();if(J&&Z!==void 0){let U=$.split(`
138
+ `),G=4,K=Math.max(1,Z-4);if(U.length>K){let q=U.slice(0,K).join(`
139
+ `);return m(z0,{flexDirection:"column",flexShrink:0,children:[m($2,{content:q,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),m(b0,{color:X.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return m($2,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),r3=H$.memo(({content:$,level:Q})=>{let Y=A0();switch(Q){case 1:return m(b0,{bold:!0,color:Y.colors.primary,children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return m(b0,{bold:!0,color:Y.colors.primary,children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return m(b0,{bold:!0,color:Y.colors.text.primary,children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return m(b0,{italic:!0,color:Y.colors.text.muted,children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return m(b0,{children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),a3=H$.memo(({terminalWidth:$})=>{let Q=A0(),Y=Math.max(0,Math.min($-4,80));return m(b0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),i3=H$.memo(({content:$})=>{return m(b0,{wrap:"wrap",children:m(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),o3=H$.memo(({content:$})=>{let Q=A0();return m(z0,{flexDirection:"row",gap:1,children:[m(b0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),m(b0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),n3=H$.memo(({detail:$,terminalWidth:Q})=>{let Y=A0(),J=50,Z=$.split(`
140
+ `);while(Z.length>0&&Z[0].trim()==="")Z.shift();while(Z.length>0&&Z[Z.length-1].trim()==="")Z.pop();let X=Z.length>50,U=X?Z.slice(0,50):Z,G=U.join(`
141
+ `),K=G.includes("<<<DIFF>>>"),q=G.includes("```");if(K){let F=G.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(F)try{let O=JSON.parse(F[1]);return m(z0,{flexDirection:"column",children:[m(HQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&m(z0,{marginTop:1,children:m(b0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(q){let F=G.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(F){let O=F[1]||"text",N=F[2];return m(z0,{flexDirection:"column",children:[m($2,{content:N,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&m(z0,{marginTop:1,children:m(b0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return m(z0,{flexDirection:"column",children:[U.map((F,O)=>m(b0,{color:Y.colors.text.primary,children:F},O,!1,void 0,this)),X&&m(z0,{marginTop:1,children:m(b0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function t3($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),U=Math.max(40,J*0.8),G=X*U;if($.length<=G)return{content:$,isTruncated:!1,hiddenLines:0};let K=Math.floor(G*0.9),q=$.length-K,F=q,O=$.indexOf(`
142
+ `,q);if(O!==-1&&O-q<U)F=O+1;let N=$.slice(F),B=($.slice(0,F).match(/\n/g)||[]).length+1;return{content:N,isTruncated:!0,hiddenLines:B}}var t1=H$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:U=!1,noMargin:G=!1,renderPlainTextOnly:K=!1,streamingLines:q,streamingHiddenLines:F,messageId:O,blocksOverride:N,currentLineOverride:_,streamingMode:B="text",renderCodeBlocksAsPlainText:z=!1})=>{let L=A0(),W=N!==void 0,A=F$(()=>l3(Q,L.colors,J),[Q,L.colors,J]),{color:T,prefix:C}=A,w=C.length+1,S=F$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let y=J.subtaskRef;if(!y||typeof y!=="object")return null;return y},[J]),P=Q==="tool"&&J?.phase==="start",b=!G&&!P,I=F$(()=>{if(!K)return[];return $.split(/\r?\n/)},[$,K]);if(!W&&Z){let y=q??$.split(/\r?\n/),g=F??0,h=!1,x=!1,V=!1;if(B!=="text")h=B==="code",x=B==="diff",V=B==="table";return m(z0,{flexDirection:"column",marginBottom:b?1:0,flexShrink:0,children:[g>0&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(b0,{color:L.colors.text.muted,dimColor:!0,children:["^ ",g," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y.map((i,U0)=>{if(B==="text"){if(i.match(n1.codeBlock))h=!h;else if(i.match(n1.diffStart))x=!0;else if(i.match(n1.diffEnd))x=!1;else if(i.match(n1.table))V=!0;else if(V&&!i.match(n1.table))V=!1}let q0=B==="text"&&!h&&!x&&!V,R0=q0?i.match(n1.ulItem):null,B0=q0?i.match(n1.olItem):null,s0=R0??B0;return m(z0,{flexDirection:"row",flexShrink:0,children:[U0===0&&!U?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:T,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:s0?m(LQ,{type:R0?"ul":"ol",marker:s0[2],itemText:s0[3],leadingWhitespace:s0[1]},void 0,!1,void 0,this):m(b0,{wrap:"wrap",children:i===""?" ":i},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},U0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!W&&K)return m(z0,{flexDirection:"column",marginBottom:b?1:0,flexShrink:0,children:I.map((y,g)=>m(z0,{flexDirection:"row",flexShrink:0,children:[g===0&&!U?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:T,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:m(b0,{wrap:"wrap",children:y===""?" ":y},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},g,!0,void 0,this))},void 0,!1,void 0,this);let R=u6(null);bQ(()=>{R.current=null},[O]);let H=F$(()=>{if(W)return null;if(!O)return null;return x6(O)},[O,W]);bQ(()=>{if(W)return;if(!H||!O)return;R.current={messageId:O,blocks:H}},[H,O,W]),bQ(()=>{if(W)return;if(!H||!O)return;l6(O)},[H,O,W]);let f=F$(()=>W?{content:$,isTruncated:!1,hiddenLines:0}:t3($,X,Z,Y),[$,X,Z,Y,W]),{content:E,isTruncated:t,hiddenLines:l}=f;if(!W&&Q==="tool"&&J&&"detail"in J){let y=J;if(y.detail)return m(z0,{flexDirection:"column",marginBottom:G?0:1,children:[m(z0,{flexDirection:"row",children:[m(z0,{marginRight:1,children:m(b0,{color:T,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(b0,{color:T,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),m(z0,{marginLeft:C.length+1,children:m(n3,{detail:y.detail,terminalWidth:Y-(C.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:v,currentLine:M}=F$(()=>{if(W)return{completedContent:"",currentLine:_??""};if(!Z)return{completedContent:E,currentLine:""};let y=E.lastIndexOf(`
143
+ `);if(y===-1)return{completedContent:"",currentLine:E};return{completedContent:E.slice(0,y+1),currentLine:E.slice(y+1)}},[E,Z,W,_]),k=u6({content:"",blocks:[]}),D=F$(()=>{if(W)return N??[];if(H)return H;if(R.current&&R.current.messageId===O)return R.current.blocks;let y=k.current;if(!Z||!v.startsWith(y.content)){let V=AQ(v);return k.current={content:v,blocks:V},V}if(v===y.content)return y.blocks;let g=v.slice(y.content.length),h=AQ(g),x=[...y.blocks,...h];return k.current={content:v,blocks:x},x},[v,Z,W,N]);return m(z0,{flexDirection:"column",marginBottom:b?1:0,flexShrink:0,children:[t&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(b0,{color:L.colors.text.muted,dimColor:!0,children:["^ ",l," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D.map((y,g)=>{if(y.type==="empty")return m(z0,{height:1,flexShrink:0},g,!1,void 0,this);return m(z0,{flexDirection:"row",flexShrink:0,children:[g===0&&!U&&m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:T,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),(g>0||U)&&m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:y.type==="code"?z?m(b0,{wrap:"wrap",children:y.content},void 0,!1,void 0,this):m(d3,{content:y.content,language:y.language,terminalWidth:Y-w,isPending:Z,availableHeight:X},void 0,!1,void 0,this):y.type==="table"&&y.tableData?m(c6,{headers:y.tableData.headers,rows:y.tableData.rows,terminalWidth:Y-w},void 0,!1,void 0,this):y.type==="heading"?m(r3,{content:y.content,level:y.level||1},void 0,!1,void 0,this):y.type==="list"?m(LQ,{type:y.listType||"ul",marker:y.marker||"-",itemText:y.content,leadingWhitespace:" ".repeat(y.indentation||0)},void 0,!1,void 0,this):y.type==="hr"?m(a3,{terminalWidth:Y-w},void 0,!1,void 0,this):y.type==="diff"&&y.diffData?m(HQ,{patch:y.diffData.patch,startLine:y.diffData.startLine,matchLine:y.diffData.matchLine,terminalWidth:Y-w},void 0,!1,void 0,this):y.type==="command-message"?m(o3,{content:y.content},void 0,!1,void 0,this):y.type==="blockquote"&&y.blockquoteLines?m(f6,{lines:y.blockquoteLines,level:y.blockquoteLevel||1},void 0,!1,void 0,this):m(i3,{content:y.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},g,!0,void 0,this)}),M&&m(z0,{flexDirection:"row",flexShrink:0,children:[D.length===0&&!U?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:T,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:m(b0,{wrap:"wrap",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[m(b0,{color:L.colors.text.muted,children:["Subtask"," ",typeof S.agentType==="string"?`@${S.agentType}`:"",typeof S.status==="string"?` · ${S.status}`:""]},void 0,!0,void 0,this),typeof S.summary==="string"&&S.summary.trim()!==""&&m(b0,{wrap:"wrap",children:S.summary},void 0,!1,void 0,this),typeof S.childSessionId==="string"&&m(b0,{color:L.colors.text.muted,children:["Session ",S.childSessionId]},void 0,!0,void 0,this),typeof S.resumedFrom==="string"&&m(b0,{color:L.colors.text.muted,children:["Resumed from ",S.resumedFrom,typeof S.resumeDepth==="number"?` · depth ${S.resumeDepth}`:""]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},($,Q)=>{return $.content===Q.content&&$.role===Q.role&&$.terminalWidth===Q.terminalWidth&&$.isPending===Q.isPending&&$.availableTerminalHeight===Q.availableTerminalHeight&&$.hidePrefix===Q.hidePrefix&&$.noMargin===Q.noMargin&&$.renderPlainTextOnly===Q.renderPlainTextOnly&&$.streamingHiddenLines===Q.streamingHiddenLines&&$.streamingLines===Q.streamingLines&&$.messageId===Q.messageId&&$.metadata===Q.metadata&&$.blocksOverride===Q.blocksOverride&&$.currentLineOverride===Q.currentLineOverride&&$.streamingMode===Q.streamingMode&&$.renderCodeBlocksAsPlainText===Q.renderCodeBlocksAsPlainText});import{jsxDEV as I0,Fragment as ZZ}from"react/jsx-dev-runtime";var QZ=PQ.memo(({label:$,isSelected:Q})=>I0(I1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),JZ=PQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(ZZ,{children:[I0(W1,{marginBottom:1,children:I0(I1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&I0(W1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[I0(I1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(W1,{marginTop:1,children:I0(t1,{content:$.planContent,role:"assistant",terminalWidth:Z-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&I0(W1,{flexDirection:"column",marginBottom:1,children:I0(t1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&I0(W1,{flexDirection:"column",marginBottom:1,children:[I0(I1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,U)=>I0(W1,{marginLeft:2,children:I0(I1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},U,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&I0(W1,{flexDirection:"column",marginBottom:1,children:[I0(I1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,U)=>I0(W1,{marginLeft:2,children:I0(I1,{children:["• ",X]},void 0,!0,void 0,this)},U,!1,void 0,this)),$.affectedFiles.length>3&&I0(W1,{marginLeft:2,children:I0(I1,{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 YZ($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var r6=PQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=e3(),J=Y.columns||80,X=$1()==="confirmation-prompt",U=v0(!1),G=$.type==="exitPlanMode",K=$.type==="enterPlanMode",q=$.type==="maxTurnsExceeded",F=$.type==="mcpSampling";s3((_,B)=>{if(B.ctrl&&_==="c"||B.meta&&_==="c"){U();return}if(B.escape){Q({approved:!1,reason:"用户取消"});return}let z=_.toLowerCase();if(G){if(z==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(z==="s"){Q({approved:!0,targetMode:"default"});return}if(z==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(K){if(z==="y"){Q({approved:!0});return}if(z==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(q){if(z==="y"){Q({approved:!0});return}if(z==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(F){if(z==="y"){Q({approved:!0,scope:"once"});return}if(z==="n"){Q({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(z==="y"){Q({approved:!0,scope:"once"});return}if(z==="s"){Q({approved:!0,scope:"session"});return}if(z==="p"){Q({approved:!0,scope:"project"});return}if(z==="n"){Q({approved:!1,reason:"用户拒绝"});return}}},{isActive:X});let O=d6(()=>{if(G)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(K)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(q)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(F)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(本次会话)",value:{approved:!0,scope:"session"}},{key:"approve-project",label:"[P] 允许并记住(本项目)",value:{approved:!0,scope:"project"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[G,K,q,F]),N=d6(()=>{if(G)return{color:"cyan",title:"方案审核"};if(K)return{color:"magenta",title:"进入规划模式"};if(q)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[G,K,q,$.title]);return I0(W1,{flexDirection:"column",borderStyle:"round",borderColor:X?N.color:"gray",padding:1,children:[I0(W1,{marginBottom:1,children:I0(I1,{bold:!0,color:N.color,children:N.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(JZ,{details:$,headerColor:N.color,isPlanModeExit:G,isPlanModeEnter:K,terminalWidth:J},void 0,!1,void 0,this),I0(W1,{flexDirection:"column",children:[I0(I1,{color:"gray",children:YZ(G,K,q,F)},void 0,!1,void 0,this),I0($Z,{items:O,isFocused:X,itemComponent:QZ,onSelect:(_)=>{Q(_.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as L0,Text as X0,useInput as XZ}from"ink";import a6 from"ink-text-input";import{useState as j1}from"react";import{jsxDEV as p}from"react/jsx-dev-runtime";var O8=[{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"}],Q2=[{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"}],J2=[{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"}],UZ=[`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"],i6=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=d0.getTheme(),[X,U]=j1("action"),[G,K]=j1(0),[q,F]=j1(0),[O,N]=j1(0),[_,B]=j1(""),[z,L]=j1(""),[W,A]=j1(null),[T,C]=j1(!1),[w,S]=j1(null),P=O8[G],b=J2[q],I=Q2[O],R=()=>{if(w){S(null);return}switch(X){case"action":Y();break;case"event":U("action");break;case"matcher":U("event");break;case"command":U("matcher");break;case"location":U("command");break;case"confirm":U("location");break}};XZ((D,y)=>{if(y.escape){R();return}if(X==="action"){if(y.upArrow)K((g)=>g>0?g-1:O8.length-1);else if(y.downArrow)K((g)=>g<O8.length-1?g+1:0);else if(y.return)H()}else if(X==="event"){if(y.upArrow)F((g)=>g>0?g-1:J2.length-1);else if(y.downArrow)F((g)=>g<J2.length-1?g+1:0);else if(y.return)U("matcher")}else if(X==="location"){if(y.upArrow)N((g)=>g>0?g-1:Q2.length-1);else if(y.downArrow)N((g)=>g<Q2.length-1?g+1:0);else if(y.return)U("confirm")}else if(X==="confirm"){if(y.return)k()}});let H=()=>{let D=O8[G].action;if(D==="add")U("event");else if(D==="status")f();else if(D==="list")l();else if(D==="enable")q1.getInstance().enableSession(Q,$),S("Hooks enabled for this session");else if(D==="disable")q1.getInstance().disableSession(Q,$),S("Hooks disabled for this session");else if(D==="trust")E();else if(D==="revoke")t()},f=async()=>{let D=q1.getInstance(),y=D.isEnabled($,Q),g=D.getConfig($),h=await D.getTrustStatus($),x={};for(let i of Object.values(yQ)){let U0=g[i];if(U0&&Array.isArray(U0)){let q0=U0.reduce((R0,B0)=>R0+(B0.hooks?.length||0),0);if(q0>0)x[i]=q0}}let V=[`Status: ${y?"Enabled":"Disabled"}`,`Trust: ${h.state}`,`Digest: ${h.currentDigest??"none"}`,""];if(Object.keys(x).length>0){V.push("Configured hooks:");for(let[i,U0]of Object.entries(x))V.push(` ${i}: ${U0} hook(s)`)}else V.push("No hooks configured");S(V.join(`
144
144
  `))},E=async()=>{try{let D=await q1.getInstance().trustProject($);S(`Trust: ${D.state}
145
- Digest: ${D.currentDigest??"none"}`)}catch(D){A(D instanceof Error?D.message:"Failed to trust hooks")}},t=async()=>{try{let D=await q1.getInstance().revokeProjectTrust($);S(`Trust: ${D.state}`)}catch(D){A(D instanceof Error?D.message:"Failed to revoke hook trust")}},l=()=>{let y=q1.getInstance().getConfig($),g=[],h=!1;for(let x of Object.values(RQ)){let V=y[x];if(!V||!Array.isArray(V)||V.length===0)continue;h=!0,g.push(`${x}:`);for(let i of V){let U0=i.matcher,q0="all";if(U0?.tools)q0=`tools: ${Array.isArray(U0.tools)?U0.tools.join(", "):U0.tools}`;g.push(` [${q0}]`);for(let R0 of i.hooks||[])if(R0.type==="command")g.push(` -> ${R0.command}`)}g.push("")}if(!h)g.push("No hooks configured"),g.push(""),g.push("Configure hooks in .blade/settings.local.json");S(g.join(`
146
- `))},v=()=>{U("command")},M=()=>{if(!z.trim()){A("Command cannot be empty");return}A(null),U("location")},k=async()=>{C(!0),A(null);try{let D=q1.getInstance(),y=await import("node:fs/promises"),g=await import("node:path"),h=await import("node:os"),x={matcher:_.trim()?{tools:_.trim()}:{},hooks:[{type:"command",command:z.trim()}]},V;switch(I.location){case"local":V=g.join($,".blade","settings.local.json");break;case"project":V=g.join($,".blade","settings.json");break;case"user":V=g.join(h.homedir(),".blade","settings.json");break}await y.mkdir(g.dirname(V),{recursive:!0});let i={};try{let B0=await y.readFile(V,"utf-8");i=JSON.parse(B0)}catch{}let U0=i.hooks||{},q0=U0[b.event]||[],R0={...U0,enabled:!0,[b.event]:[...q0,x]};if(i.hooks=R0,await y.writeFile(V,JSON.stringify(i,null,2),"utf-8"),await D.reloadConfig($),J)J({event:b.event,matcher:_.trim(),command:z.trim()});Y()}catch(D){A(`Failed to save hook: ${D instanceof Error?D.message:"Unknown error"}`),C(!1)}};return p(L0,{flexDirection:"column",padding:1,children:[p(L0,{marginBottom:1,children:p(X0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(L0,{marginBottom:1,children:p(X0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),w&&p(L0,{flexDirection:"column",marginBottom:1,children:[p(X0,{children:w},void 0,!1,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="action"&&!w&&p(L0,{flexDirection:"column",children:[p(L0,{flexDirection:"column",marginTop:1,children:O8.map((D,y)=>p(L0,{children:[p(X0,{color:y===K?Z.colors.primary:void 0,bold:y===K,children:[y===K?"> ":" ",D.action]},void 0,!0,void 0,this),p(X0,{color:Z.colors.muted,children:[" - ",D.description]},void 0,!0,void 0,this)]},D.action,!0,void 0,this))},void 0,!1,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="event"&&p(L0,{flexDirection:"column",children:[p(X0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),p(L0,{flexDirection:"column",marginTop:1,children:J2.map((D,y)=>p(L0,{children:[p(X0,{color:y===q?Z.colors.primary:void 0,bold:y===q,children:[y===q?"> ":" ",D.event]},void 0,!0,void 0,this),p(X0,{color:Z.colors.muted,children:[" - ",D.description]},void 0,!0,void 0,this)]},D.event,!0,void 0,this))},void 0,!1,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X!=="event"&&p(L0,{marginBottom:1,children:p(X0,{children:["Event:"," ",p(X0,{bold:!0,color:Z.colors.primary,children:b.event},void 0,!1,void 0,this),p(X0,{color:Z.colors.muted,children:[" - ",b.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(X==="matcher"||X==="command"||X==="confirm")&&p(L0,{flexDirection:"column",marginBottom:1,children:[p(X0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),p(X0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),p(X0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),p(X0,{color:Z.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="matcher"&&p(L0,{flexDirection:"column",children:[p(L0,{children:[p(X0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),p(r6,{value:_,onChange:B,onSubmit:v,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(X==="command"||X==="confirm")&&p(L0,{marginBottom:1,children:p(X0,{children:["Matcher: ",p(X0,{bold:!0,children:_||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X==="command"&&p(L0,{flexDirection:"column",children:[p(L0,{children:p(X0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(L0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:p(r6,{value:z,onChange:L,onSubmit:M,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(L0,{flexDirection:"column",marginTop:1,children:[p(X0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),XZ.map((D,y)=>p(X0,{color:Z.colors.muted,children:["• ",D]},y,!0,void 0,this))]},void 0,!0,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="location"&&p(L0,{flexDirection:"column",children:[p(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[p(X0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),p(X0,{children:" "},void 0,!1,void 0,this),p(X0,{children:[" ","Event: ",b.event," - ",b.description]},void 0,!0,void 0,this),p(X0,{children:[" Matcher: ",_||"(all)"]},void 0,!0,void 0,this),p(X0,{children:[" Command: ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(X0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),p(L0,{flexDirection:"column",marginTop:1,children:Q2.map((D,y)=>p(L0,{children:[p(X0,{color:y===O?Z.colors.primary:void 0,bold:y===O,children:[y===O?"> ":" ",y+1,". ",D.name]},void 0,!0,void 0,this),p(X0,{color:Z.colors.muted,children:[" ",D.description]},void 0,!0,void 0,this)]},D.location,!0,void 0,this))},void 0,!1,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="confirm"&&p(L0,{flexDirection:"column",children:[p(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[p(X0,{bold:!0,children:["Saving hook to ",I.description,"..."]},void 0,!0,void 0,this),p(X0,{children:" "},void 0,!1,void 0,this),p(X0,{children:["Event: ",b.event]},void 0,!0,void 0,this),p(X0,{children:["Matcher: ",_||"(all tools)"]},void 0,!0,void 0,this),p(X0,{children:["Command: ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:T?"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),W&&p(L0,{marginTop:1,children:p(X0,{color:Z.colors.error,children:W},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as z9}from"ahooks";import{Box as PZ,Text as RZ}from"ink";import yZ from"react";import{useMemoizedFn as Z2}from"ahooks";import L$ from"chalk";import{Text as LZ,useInput as BZ}from"ink";import{useEffect as G9,useRef as X2}from"react";var Y2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var W$="\x1B",UZ=`${W$}[200~`,KZ=`${W$}[201~`,GZ="[200~",qZ="[201~",OZ=[`${W$}[I`,`${W$}[O`,"[I","[O"],n6=`${W$}[?2004h`,t6=`${W$}[?2004l`,MQ=`${W$}[?1004l`,zZ=[UZ,GZ],_Z=[KZ,qZ];function s6(){return{pasteBuffer:null,pasteOverflowed:!1}}function i6($,Q){let Y;for(let J of Q){let Z=$.indexOf(J);if(Z===-1)continue;if(!Y||Z<Y.index||Z===Y.index&&J.length>Y.marker.length)Y={index:Z,marker:J}}return Y}function o6($){return OZ.some((Q)=>$===Q)}function e6($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,U=[];while(Y.length>0){if(J!==null){let q=i6(Y,_Z);if(!q){if(J.length+Y.length>yQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+q.index>yQ)Z=!0;else if(!Z)J+=Y.slice(0,q.index),U.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length);continue}let K=i6(Y,zZ);if(!K){if(o6(Y))X=!0;else U.push({kind:"text",text:Y});Y="";break}let G=Y.slice(0,K.index);if(G&&!o6(G))U.push({kind:"text",text:G});J="",Z=!1,X=!0,Y=Y.slice(K.index+K.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:U}}import{execSync as l$}from"node:child_process";import{existsSync as NZ,readFileSync as CQ}from"node:fs";import{basename as $9,isAbsolute as FZ}from"node:path";function Q9($){try{let Q=Buffer.from($,"base64");if(Q.length<4)return"image/png";if(Q[0]===137&&Q[1]===80&&Q[2]===78&&Q[3]===71)return"image/png";if(Q[0]===255&&Q[1]===216&&Q[2]===255)return"image/jpeg";if(Q[0]===71&&Q[1]===73&&Q[2]===70)return"image/gif";if(Q[0]===82&&Q[1]===73&&Q[2]===70&&Q[3]===70){if(Q.length>=12&&Q[8]===87&&Q[9]===69&&Q[10]===66&&Q[11]===80)return"image/webp"}return"image/png"}catch{return"image/png"}}function J9(){let $=process.platform,Q={darwin:"/tmp/blade_cli_latest_screenshot.png",linux:"/tmp/blade_cli_latest_screenshot.png",win32:process.env.TEMP?`${process.env.TEMP}\\blade_cli_latest_screenshot.png`:"C:\\Temp\\blade_cli_latest_screenshot.png"},Y={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(J)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${J}" with write permission' -e 'write png_data to fp' -e 'close access fp'`,getPath:"osascript -e 'get POSIX path of (the clipboard as «class furl»)'",deleteFile:(J)=>`rm -f "${J}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(J)=>`xclip -selection clipboard -t image/png -o > "${J}" || wl-paste --type image/png > "${J}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(J)=>`rm -f "${J}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(J)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${J.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(J)=>`del /f "${J}"`}};return{commands:Y[$]||Y.linux,screenshotPath:Q[$]||Q.linux}}function HZ(){let{commands:$}=J9();try{return l$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function Y9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function Z9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function IQ($){let Q=Y9($.trim()),Y=Z9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function WZ($){let Q=Y9($.trim()),Y=Z9(Q);if(IQ(Y))return Y;return null}async function X9($){let Q=WZ($);if(!Q)return null;let Y;try{if(FZ(Q))Y=CQ(Q);else{let U=HZ();if(U&&Q===$9(U))Y=CQ(U);else return null}}catch(U){return console.error("Failed to read image file:",U),null}let J=Y.toString("base64"),Z=Q9(J),X=$9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function U9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return l$(Y,{encoding:"utf-8"})||null}catch{return null}}async function K9(){let{commands:$,screenshotPath:Q}=J9();try{if(l$($.checkImage,{stdio:"ignore"}),l$($.saveImage(Q),{stdio:"ignore"}),!NZ(Q))return null;let J=CQ(Q).toString("base64"),Z=Q9(J);return l$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{l$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as AZ}from"react/jsx-dev-runtime";var wZ=/\r\n/g,bZ=/\r/g;function TQ($){if(!$.includes("\r"))return $;return $.replace(wZ,`
147
- `).replace(bZ,`
148
- `)}function q9($,Q,Y){let J=Math.max(0,Math.min(Y,Q.length)),Z=Q.slice(0,J),X=Q.slice(J);return{newValue:Z+$+X,newCursorPosition:J+$.length}}function O9({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:U,onImagePaste:K,disabledKeys:G=[]}){let q=X2(s6()),F=X2($),O=X2(Z),N=X2(null);G9(()=>{F.current=$,O.current=Z},[$,Z]),G9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let _=Z2((C,w)=>{let S=F.current,P=O.current;if(F.current=C,O.current=w,C!==S)J(C);if(w!==P)X(w)}),B=Z2((C)=>{if(!C)return;let{newValue:w,newCursorPosition:S}=q9(TQ(C),F.current,O.current);_(w,S)}),z=Z2(async(C)=>{let w=TQ(C);if(!w)return;if(K&&IQ(w))try{let P=await X9(w);if(P){let b=await K(P.base64,P.mediaType,P.filename);if(b?.prompt)B(b.prompt);return}}catch(P){console.error("Failed to process image path:",P)}if((w.length>Y2.LARGE_INPUT_THRESHOLD||w.includes(`
149
- `))&&U){let P=await U(w);if(P?.prompt){B(P.prompt);return}}B(w)}),L=Z2((C)=>{let w=N.current;if(!w){try{let P=C();if(!P)return;let b=P.catch(()=>{return});N.current=b,b.finally(()=>{if(N.current===b)N.current=null})}catch{}return}let S=w.then(C).then(()=>{return}).catch(()=>{return});N.current=S,S.finally(()=>{if(N.current===S)N.current=null})});BZ((C,w)=>{L(()=>{let S=TQ(C),P=e6(q.current,S);if(q.current=P.state,P.handled)return(async()=>{for(let E of P.segments)if(E.kind==="paste")await z(E.text);else B(E.text)})();if(G.some((E)=>w[E])||w.ctrl&&C==="c"||w.ctrl&&C==="l"||w.ctrl&&C==="t"||w.ctrl&&C==="o"||w.meta&&C==="l"||w.meta&&C==="t"||w.meta&&C==="o"||w.shift&&w.tab||S==="?"&&F.current==="")return;let I=F.current,R=O.current,H=R,f=I;if(w.leftArrow)H--;else if(w.rightArrow)H++;else if(w.backspace||w.delete){if(C===""){if(R>0)f=I.slice(0,R-1)+I.slice(R,I.length),H--}else if(R<I.length)f=I.slice(0,R)+I.slice(R+1,I.length)}else if(w.ctrl&&S==="a")H=0;else if(w.ctrl&&S==="e")H=I.length;else if(w.ctrl&&S==="k")f=I.slice(0,R);else if(w.ctrl&&S==="u")f=I.slice(R),H=0;else if(w.ctrl&&S==="w"){let t=I.slice(0,R).match(/\s*\S+\s*$/);if(t){let l=t[0].length;f=I.slice(0,R-l)+I.slice(R),H-=l}}else if(w.ctrl&&S==="v"){let E=process.platform==="darwin";return(async()=>{if(K){let l=await K9();if(l){let v=await K(l.base64,l.mediaType,"clipboard.png");if(v?.prompt)B(v.prompt);return}}if(E)return;let t=await U9();if(t)await z(t)})()}else if(w.pageUp)H=0;else if(w.pageDown)H=I.length;else if(S===`
150
- `&&(w.shift||w.meta)){let{newValue:E,newCursorPosition:t}=q9(S,I,R);_(E,t);return}else if(!w.ctrl&&!w.meta){if(U&&(S.length>Y2.LARGE_INPUT_THRESHOLD||S.includes(`
151
- `)))return z(S);f=I.slice(0,R)+S+I.slice(R,I.length),H+=S.length}if(H<0)H=0;if(H>f.length)H=f.length;_(f,H)})},{isActive:Y});let W=Y,A=$,T=Q?L$.grey(Q):void 0;if(W)if(T=Q.length>0?L$.inverse(Q[0])+L$.grey(Q.slice(1)):L$.inverse(" "),$.length===0)A=L$.inverse(" ");else{A="";for(let C=0;C<$.length;C++)if(C===Z&&Z<$.length)A+=L$.inverse($[C]);else A+=$[C];if(Z>=$.length)A+=L$.inverse(" ")}return AZ(LZ,{children:Q?$.length>0?A:T:A},void 0,!1,void 0,this)}import{jsxDEV as vQ}from"react/jsx-dev-runtime";var _9=yZ.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let K=$1()==="main-input",G=$.trimStart().startsWith("!"),q=z9((O)=>{let N=O.split(`
152
- `).length,_=O.length,B=500,z=10;if(_>500||N>10){let L=Z(O),W=O.slice(0,30).replace(/\n/g," "),A=`${_} chars, ${N} lines: ${W}...`;return{prompt:`${u8(L)}${A}${p2()}`}}return{}}),F=z9(async(O,N,_)=>{try{let B=X(O,N);return{prompt:`${u8(B)}[Image #${B}]${p2()}`}}catch(B){return console.error("[Image Paste] Failed to process image:",B),{prompt:`[Image paste failed: ${B instanceof Error?B.message:"Unknown error"}] `}}});return vQ(PZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[vQ(RZ,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),vQ(O9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:q,onImagePaste:F,placeholder:" 输入命令...",focus:K,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as U2,Text as R1}from"ink";import vZ,{useEffect as fZ,useState as SZ}from"react";import{useEffect as TZ,useState as W9}from"react";import{useEffect as MZ,useState as CZ}from"react";var IZ=15000,N9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],F9=["Esc - 中止任务 / 隐藏建议 / 双击清空输入","Shift+Tab - 切换模式 (DEFAULT → AUTO_EDIT → PLAN)","Tab - 选中建议 / 切换 thinking 模式","Up/Down - 浏览建议或输入历史","? - 显示快捷键帮助(输入框为空时)","Ctrl+C - 停止任务(双击退出)","Ctrl+L - 清屏","Ctrl+T - 展开/折叠 thinking 内容","Ctrl+O - 展开/折叠历史消息","Ctrl+A / Ctrl+E - 光标跳到行首/行尾","Ctrl+U / Ctrl+K - 删到行首/行尾","Ctrl+W - 删除前一个单词","Shift+Enter - 插入换行","/help - 显示所有可用命令","/init - 分析项目并生成 BLADE.md","/resume - 恢复历史会话","/compact - 压缩上下文,节省 token","/theme - 切换主题","/model - 管理和切换模型","/permissions - 管理权限规则","/mcp - 查看 MCP 服务器状态","/agents - 管理 subagent 配置","/clear - 清除对话历史","/status - 查看当前配置","/context - 可视化 token 使用情况","/git - Git 查询和 AI 辅助","/git review - AI Code Review","/git commit - AI 生成 commit message","/hooks - 管理 Hook 配置","/tasks - 查看后台任务","/skills - 查看可用 Skills","/plugins - 管理插件","/memory - 管理项目记忆","/ide - 管理 IDE 集成","@ 文件路径 - 附加文件到上下文","@dir/ - 附加整个目录","@file.ts:10-20 - 附加指定行范围","Plan 模式 - 先规划后编码(Shift+Tab 切换)","Auto Edit 模式 - 自动批准工具调用","MCP 协议 - 扩展外部工具集成","Subagents - 并行执行子任务","Hooks - 自定义工具执行流程","Skills - 可复用的技能模板","Plugins - 扩展功能插件","提示:/init 让 AI 理解你的项目结构","提示:Plan 模式适合复杂多步骤任务","提示:Auto Edit 可加速重复性操作","提示:@ 引用可提供更精准的上下文","提示:定期 /compact 节省 token","提示:Esc 可随时中断任务","提示:/resume 继续未完成的对话","提示:/model once 临时切换模型"];function H9($,Q,Y=!1){let[J,Z]=CZ("");return MZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let q=Math.floor(Math.random()*F9.length);return F9[q]}let G=Math.floor(Math.random()*N9.length);return N9[G]};Z(X());let U=setInterval(()=>{Z(X())},IZ);return()=>{clearInterval(U)}},[$,Q,Y]),J}function L9($,Q=!1,Y=!1){let[J,Z]=W9(0),[X,U]=W9(null),K=H9($,Q,Y);return TZ(()=>{if(!$){Z(0),U(null);return}if(Y)return;if(X===null)U(Date.now());let G=setInterval(()=>{if(X!==null){let q=Math.floor((Date.now()-X)/1000);Z(q)}},1000);return()=>{clearInterval(G)}},[$,X,Y]),{currentPhrase:K,elapsedTime:J}}import{jsxDEV as J1,Fragment as DZ}from"react/jsx-dev-runtime";var fQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],kZ=80;function B9($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var w9=vZ.memo(({message:$,paused:Q=!1})=>{let Y=a1(),J=A8(),Z=Y||!J,[X,U]=SZ(0),K=A0(),q=h$()>=kZ,{currentPhrase:F,elapsedTime:O}=L9(Z,!1,Q);if(fZ(()=>{if(!Z||Q){U(0);return}let _=setInterval(()=>{U((B)=>(B+1)%fQ.length)},150);return()=>clearInterval(_)},[Z,Q]),!Z)return null;let N=$||F||"正在思考中...";if(q)return J1(U2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[J1(R1,{color:K.colors.warning,bold:!0,children:fQ[X]},void 0,!1,void 0,this),J1(R1,{color:K.colors.text.primary,children:N},void 0,!1,void 0,this),O>0&&J1(DZ,{children:[J1(R1,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),J1(R1,{color:K.colors.info,children:["已用时: ",B9(O)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J1(R1,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),J1(R1,{color:K.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return J1(U2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[J1(U2,{flexDirection:"row",gap:1,children:[J1(R1,{color:K.colors.warning,bold:!0,children:fQ[X]},void 0,!1,void 0,this),J1(R1,{color:K.colors.text.primary,children:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O>0&&J1(U2,{marginLeft:2,flexDirection:"row",gap:1,children:[J1(R1,{color:K.colors.info,children:["已用时: ",B9(O)]},void 0,!0,void 0,this),J1(R1,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),J1(R1,{color:K.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 q2,Text as S0,useInput as VZ,useStdout as jZ}from"ink";import hZ from"ink-text-input";import EZ,{useCallback as K2,useEffect as gZ,useMemo as mZ,useState as B$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var R9=EZ.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=jZ(),J=Y.columns||80,Z=$1()==="confirmation-prompt",X=v0(!1),U=$.fields??[],[K,G]=B$("field"),[q,F]=B$(0),[O,N]=B$(()=>b9($)),[_,B]=B$(""),[z,L]=B$(0),[W,A]=B$([]),[T,C]=B$(),w=U[q],S=mZ(()=>pZ(w),[w]);gZ(()=>{if(!w)return;let H=O[w.name];B(typeof H==="string"||typeof H==="number"?String(H):""),A(Array.isArray(H)?[...H]:[]);let f=S.findIndex((E)=>E.value===String(H));L(f>=0?f:0),C(void 0)},[O,w,S]);let P=K2((H)=>{if(N(H),q<U.length-1){F((f)=>f+1);return}G("review")},[q,U.length]),b=K2((H)=>{if(!w)return;let f={...O};if(H===void 0)delete f[w.name];else f[w.name]=H;P(f)},[O,w,P]),I=K2((H)=>{if(!w)return;try{b(A9(w,H))}catch(f){C(f instanceof Error?f.message:String(f))}},[w,b]),R=K2(()=>{try{let H=P9($,{action:"accept",content:O});Q({action:H.action,...H.content?{content:H.content}:{}})}catch(H){C(H instanceof Error?H.message:String(H))}},[O,$,Q]);if(VZ((H,f)=>{if(f.ctrl&&H==="c"||f.meta&&H==="c"){X();return}if(f.escape){Q({action:"cancel"});return}if($.mode==="url"){if(H.toLowerCase()==="y")Q({action:"accept"},!0);else if(H.toLowerCase()==="n")Q({action:"decline"});return}if(K==="review"){if(H.toLowerCase()==="y"||f.return)R();else if(H.toLowerCase()==="e")F(0),G("field");else if(H.toLowerCase()==="d")Q({action:"decline"});return}if(!w){if(f.return)R();return}if(SQ(w))return;if(H.toLowerCase()==="d"){Q({action:"decline"});return}if(f.upArrow){L((E)=>E>0?E-1:Math.max(S.length-1,0));return}if(f.downArrow||f.tab){L((E)=>E<S.length-1?E+1:0);return}if(H===" "&&w.type==="multi-select"){let E=S[z];if(E)A((t)=>t.includes(E.value)?t.filter((l)=>l!==E.value):[...t,E.value]);return}if(f.return)if(w.type==="multi-select")b(W);else{let E=S[z];if(E)b(E.typedValue)}},{isActive:Z}),$.mode==="url")return F0(G2,{width:J,color:"yellow",children:[F0(S0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),F0(S0,{children:$.message},void 0,!1,void 0,this),F0(S0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),F0(S0,{children:["Domain: ",F0(S0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(S0,{wrap:"wrap",children:["URL: ",F0(S0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(S0,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(K==="review")return F0(G2,{width:J,color:"green",children:[F0(S0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),F0(S0,{children:$.message},void 0,!1,void 0,this),U.map((H)=>F0(S0,{children:[H.title,": ",uZ(O[H.name])]},H.name,!0,void 0,this)),T&&F0(S0,{color:"red",children:T},void 0,!1,void 0,this),F0(S0,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!w)return F0(G2,{width:J,color:"cyan",children:[F0(S0,{children:$.message},void 0,!1,void 0,this),F0(S0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),F0(S0,{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(G2,{width:J,color:"cyan",children:[F0(S0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),F0(S0,{children:$.message},void 0,!1,void 0,this),F0(q2,{flexDirection:"column",marginTop:1,children:[F0(S0,{bold:!0,children:[w.title,w.required?" *":""]},void 0,!0,void 0,this),w.description&&F0(S0,{color:"gray",children:w.description},void 0,!1,void 0,this),F0(S0,{color:"gray",children:cZ(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),SQ(w)?F0(q2,{children:[F0(S0,{color:"cyan",children:"> "},void 0,!1,void 0,this),F0(hZ,{value:_,onChange:B,onSubmit:I,focus:Z,placeholder:w.defaultValue===void 0?w.required?"Required":"Optional":String(w.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):F0(q2,{flexDirection:"column",children:S.map((H,f)=>{let E=w.type==="multi-select"&&W.includes(H.value);return F0(S0,{color:z===f?"yellow":void 0,children:[z===f?"> ":" ",w.type==="multi-select"?E?"(*) ":"( ) ":"",H.label]},H.value,!0,void 0,this)})},void 0,!1,void 0,this),T&&F0(S0,{color:"red",children:T},void 0,!1,void 0,this),F0(S0,{color:"gray",children:[SQ(w)?"Enter to continue":w.type==="multi-select"?"Space to toggle · Enter to continue":"Up/Down to select · Enter to continue"," · [D] Decline · Esc Cancel"]},void 0,!0,void 0,this),F0(S0,{color:"gray",children:["Field ",q+1," of ",U.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function G2({children:$,width:Q,color:Y}){return F0(q2,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function SQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function pZ($){if(!$)return[];if($.type==="boolean")return[{value:"true",label:"Yes",typedValue:!0},{value:"false",label:"No",typedValue:!1}];return($.options??[]).map((Q)=>({...Q,typedValue:Q.value}))}function cZ($){let Q=[];if($.format)Q.push(`format: ${$.format}`);if($.minimum!==void 0)Q.push(`min: ${$.minimum}`);if($.maximum!==void 0)Q.push(`max: ${$.maximum}`);if($.minLength!==void 0)Q.push(`min length: ${$.minLength}`);if($.maxLength!==void 0)Q.push(`max length: ${$.maxLength}`);if($.minItems!==void 0)Q.push(`min selections: ${$.minItems}`);if($.maxItems!==void 0)Q.push(`max selections: ${$.maxItems}`);return Q.join(" · ")}function uZ($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import N2 from"ansi-escapes";import{Box as e1,Static as h9,useStdout as Y5}from"ink";import Z5,{useEffect as g1,useMemo as E9,useRef as $$,useState as gQ}from"react";import{useStdout as xZ}from"ink";import{debounce as lZ}from"lodash-es";import{useEffect as dZ,useState as rZ}from"react";function y9($=200){let{stdout:Q}=xZ(),[Y,J]=rZ(Q.rows||24);return dZ(()=>{let Z=lZ(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import w$ from"chalk";import aZ from"string-width";var N0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},z2="\x1B",kQ=`${z2}[2K`,O2=($)=>$>0?`${z2}[${$}A`:"",M9=`${z2}[?25l`,C9=`${z2}[?25h`;function I9($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function T9($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function v9($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),U=[],K=d0.getTheme(),G=" ".repeat(N0.prefixIndent),q=w$.dim.hex(K.colors.border.light);if(Q>0)U.push(`${G}${w$.dim.hex(K.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let F=Y==="code",O=Y==="diff",N="",_=$;if(F&&$.length>0)N=$[0].match(/^```(\w+)?/)?.[1]||"",_=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")_=$.slice(1);let B=_.slice(-X);if(F&&Q===0){let L=N?` ${w$.hex(K.colors.text.secondary)(N)}`:"";U.push(`${G}${q("╭─")}${L}`)}for(let L=0;L<B.length;L++){let W=B[L],A=G;if(L===0&&!J&&N0.isFirstRender&&!F&&!O)A=w$.bold.hex(K.colors.success)("• ")+" ",N0.isFirstRender=!1;let T=F?4:0,C=N0.terminalWidth-N0.prefixIndent-2-T,w=W;if(aZ(W)>C)w=W.slice(0,C);if(F)U.push(`${G}${q("│")} ${w}`);else if(O){let S=w;if(S.startsWith("+"))U.push(`${A}${w$.green(w)}`);else if(S.startsWith("-"))U.push(`${A}${w$.red(w)}`);else if(S.startsWith("@@"))U.push(`${A}${w$.dim(w)}`);else U.push(`${A}${w}`)}else U.push(`${A}${w}`);if(L===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let z=[];if(z.push(M9),N0.renderedLineCount>0)z.push(O2(N0.renderedLineCount)),z.push("\r");for(let L=0;L<U.length;L++){let W=U[L],A=N0.lastRenderedLines[L];if(W!==A)z.push(kQ),z.push(W);if(L<U.length-1)z.push(`
145
+ Digest: ${D.currentDigest??"none"}`)}catch(D){A(D instanceof Error?D.message:"Failed to trust hooks")}},t=async()=>{try{let D=await q1.getInstance().revokeProjectTrust($);S(`Trust: ${D.state}`)}catch(D){A(D instanceof Error?D.message:"Failed to revoke hook trust")}},l=()=>{let y=q1.getInstance().getConfig($),g=[],h=!1;for(let x of Object.values(yQ)){let V=y[x];if(!V||!Array.isArray(V)||V.length===0)continue;h=!0,g.push(`${x}:`);for(let i of V){let U0=i.matcher,q0="all";if(U0?.tools)q0=`tools: ${Array.isArray(U0.tools)?U0.tools.join(", "):U0.tools}`;g.push(` [${q0}]`);for(let R0 of i.hooks||[])if(R0.type==="command")g.push(` -> ${R0.command}`)}g.push("")}if(!h)g.push("No hooks configured"),g.push(""),g.push("Configure hooks in .blade/settings.local.json");S(g.join(`
146
+ `))},v=()=>{U("command")},M=()=>{if(!z.trim()){A("Command cannot be empty");return}A(null),U("location")},k=async()=>{C(!0),A(null);try{let D=q1.getInstance(),y=await import("node:fs/promises"),g=await import("node:path"),h=await import("node:os"),x={matcher:_.trim()?{tools:_.trim()}:{},hooks:[{type:"command",command:z.trim()}]},V;switch(I.location){case"local":V=g.join($,".blade","settings.local.json");break;case"project":V=g.join($,".blade","settings.json");break;case"user":V=g.join(h.homedir(),".blade","settings.json");break}await y.mkdir(g.dirname(V),{recursive:!0});let i={};try{let B0=await y.readFile(V,"utf-8");i=JSON.parse(B0)}catch{}let U0=i.hooks||{},q0=U0[b.event]||[],R0={...U0,enabled:!0,[b.event]:[...q0,x]};if(i.hooks=R0,await y.writeFile(V,JSON.stringify(i,null,2),"utf-8"),await D.reloadConfig($),J)J({event:b.event,matcher:_.trim(),command:z.trim()});Y()}catch(D){A(`Failed to save hook: ${D instanceof Error?D.message:"Unknown error"}`),C(!1)}};return p(L0,{flexDirection:"column",padding:1,children:[p(L0,{marginBottom:1,children:p(X0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(L0,{marginBottom:1,children:p(X0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),w&&p(L0,{flexDirection:"column",marginBottom:1,children:[p(X0,{children:w},void 0,!1,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="action"&&!w&&p(L0,{flexDirection:"column",children:[p(L0,{flexDirection:"column",marginTop:1,children:O8.map((D,y)=>p(L0,{children:[p(X0,{color:y===G?Z.colors.primary:void 0,bold:y===G,children:[y===G?"> ":" ",D.action]},void 0,!0,void 0,this),p(X0,{color:Z.colors.muted,children:[" - ",D.description]},void 0,!0,void 0,this)]},D.action,!0,void 0,this))},void 0,!1,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="event"&&p(L0,{flexDirection:"column",children:[p(X0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),p(L0,{flexDirection:"column",marginTop:1,children:J2.map((D,y)=>p(L0,{children:[p(X0,{color:y===q?Z.colors.primary:void 0,bold:y===q,children:[y===q?"> ":" ",D.event]},void 0,!0,void 0,this),p(X0,{color:Z.colors.muted,children:[" - ",D.description]},void 0,!0,void 0,this)]},D.event,!0,void 0,this))},void 0,!1,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X!=="event"&&p(L0,{marginBottom:1,children:p(X0,{children:["Event:"," ",p(X0,{bold:!0,color:Z.colors.primary,children:b.event},void 0,!1,void 0,this),p(X0,{color:Z.colors.muted,children:[" - ",b.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(X==="matcher"||X==="command"||X==="confirm")&&p(L0,{flexDirection:"column",marginBottom:1,children:[p(X0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),p(X0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),p(X0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),p(X0,{color:Z.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="matcher"&&p(L0,{flexDirection:"column",children:[p(L0,{children:[p(X0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),p(a6,{value:_,onChange:B,onSubmit:v,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(X==="command"||X==="confirm")&&p(L0,{marginBottom:1,children:p(X0,{children:["Matcher: ",p(X0,{bold:!0,children:_||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X==="command"&&p(L0,{flexDirection:"column",children:[p(L0,{children:p(X0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(L0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:p(a6,{value:z,onChange:L,onSubmit:M,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(L0,{flexDirection:"column",marginTop:1,children:[p(X0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),UZ.map((D,y)=>p(X0,{color:Z.colors.muted,children:["• ",D]},y,!0,void 0,this))]},void 0,!0,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="location"&&p(L0,{flexDirection:"column",children:[p(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[p(X0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),p(X0,{children:" "},void 0,!1,void 0,this),p(X0,{children:[" ","Event: ",b.event," - ",b.description]},void 0,!0,void 0,this),p(X0,{children:[" Matcher: ",_||"(all)"]},void 0,!0,void 0,this),p(X0,{children:[" Command: ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(X0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),p(L0,{flexDirection:"column",marginTop:1,children:Q2.map((D,y)=>p(L0,{children:[p(X0,{color:y===O?Z.colors.primary:void 0,bold:y===O,children:[y===O?"> ":" ",y+1,". ",D.name]},void 0,!0,void 0,this),p(X0,{color:Z.colors.muted,children:[" ",D.description]},void 0,!0,void 0,this)]},D.location,!0,void 0,this))},void 0,!1,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="confirm"&&p(L0,{flexDirection:"column",children:[p(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[p(X0,{bold:!0,children:["Saving hook to ",I.description,"..."]},void 0,!0,void 0,this),p(X0,{children:" "},void 0,!1,void 0,this),p(X0,{children:["Event: ",b.event]},void 0,!0,void 0,this),p(X0,{children:["Matcher: ",_||"(all tools)"]},void 0,!0,void 0,this),p(X0,{children:["Command: ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(L0,{marginTop:1,children:p(X0,{color:Z.colors.muted,children:T?"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),W&&p(L0,{marginTop:1,children:p(X0,{color:Z.colors.error,children:W},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as _9}from"ahooks";import{Box as RZ,Text as yZ}from"ink";import MZ from"react";import{useMemoizedFn as Z2}from"ahooks";import L$ from"chalk";import{Text as BZ,useInput as wZ}from"ink";import{useEffect as q9,useRef as X2}from"react";var Y2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var W$="\x1B",GZ=`${W$}[200~`,KZ=`${W$}[201~`,qZ="[200~",OZ="[201~",zZ=[`${W$}[I`,`${W$}[O`,"[I","[O"],t6=`${W$}[?2004h`,s6=`${W$}[?2004l`,CQ=`${W$}[?1004l`,_Z=[GZ,qZ],NZ=[KZ,OZ];function e6(){return{pasteBuffer:null,pasteOverflowed:!1}}function o6($,Q){let Y;for(let J of Q){let Z=$.indexOf(J);if(Z===-1)continue;if(!Y||Z<Y.index||Z===Y.index&&J.length>Y.marker.length)Y={index:Z,marker:J}}return Y}function n6($){return zZ.some((Q)=>$===Q)}function $9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,U=[];while(Y.length>0){if(J!==null){let q=o6(Y,NZ);if(!q){if(J.length+Y.length>MQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+q.index>MQ)Z=!0;else if(!Z)J+=Y.slice(0,q.index),U.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length);continue}let G=o6(Y,_Z);if(!G){if(n6(Y))X=!0;else U.push({kind:"text",text:Y});Y="";break}let K=Y.slice(0,G.index);if(K&&!n6(K))U.push({kind:"text",text:K});J="",Z=!1,X=!0,Y=Y.slice(G.index+G.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:U}}import{execSync as l$}from"node:child_process";import{existsSync as FZ,readFileSync as IQ}from"node:fs";import{basename as Q9,isAbsolute as HZ}from"node:path";function J9($){try{let Q=Buffer.from($,"base64");if(Q.length<4)return"image/png";if(Q[0]===137&&Q[1]===80&&Q[2]===78&&Q[3]===71)return"image/png";if(Q[0]===255&&Q[1]===216&&Q[2]===255)return"image/jpeg";if(Q[0]===71&&Q[1]===73&&Q[2]===70)return"image/gif";if(Q[0]===82&&Q[1]===73&&Q[2]===70&&Q[3]===70){if(Q.length>=12&&Q[8]===87&&Q[9]===69&&Q[10]===66&&Q[11]===80)return"image/webp"}return"image/png"}catch{return"image/png"}}function Y9(){let $=process.platform,Q={darwin:"/tmp/blade_cli_latest_screenshot.png",linux:"/tmp/blade_cli_latest_screenshot.png",win32:process.env.TEMP?`${process.env.TEMP}\\blade_cli_latest_screenshot.png`:"C:\\Temp\\blade_cli_latest_screenshot.png"},Y={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(J)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${J}" with write permission' -e 'write png_data to fp' -e 'close access fp'`,getPath:"osascript -e 'get POSIX path of (the clipboard as «class furl»)'",deleteFile:(J)=>`rm -f "${J}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(J)=>`xclip -selection clipboard -t image/png -o > "${J}" || wl-paste --type image/png > "${J}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(J)=>`rm -f "${J}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(J)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${J.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(J)=>`del /f "${J}"`}};return{commands:Y[$]||Y.linux,screenshotPath:Q[$]||Q.linux}}function WZ(){let{commands:$}=Y9();try{return l$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function Z9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function X9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function TQ($){let Q=Z9($.trim()),Y=X9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function LZ($){let Q=Z9($.trim()),Y=X9(Q);if(TQ(Y))return Y;return null}async function U9($){let Q=LZ($);if(!Q)return null;let Y;try{if(HZ(Q))Y=IQ(Q);else{let U=WZ();if(U&&Q===Q9(U))Y=IQ(U);else return null}}catch(U){return console.error("Failed to read image file:",U),null}let J=Y.toString("base64"),Z=J9(J),X=Q9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function G9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return l$(Y,{encoding:"utf-8"})||null}catch{return null}}async function K9(){let{commands:$,screenshotPath:Q}=Y9();try{if(l$($.checkImage,{stdio:"ignore"}),l$($.saveImage(Q),{stdio:"ignore"}),!FZ(Q))return null;let J=IQ(Q).toString("base64"),Z=J9(J);return l$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{l$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as PZ}from"react/jsx-dev-runtime";var bZ=/\r\n/g,AZ=/\r/g;function vQ($){if(!$.includes("\r"))return $;return $.replace(bZ,`
147
+ `).replace(AZ,`
148
+ `)}function O9($,Q,Y){let J=Math.max(0,Math.min(Y,Q.length)),Z=Q.slice(0,J),X=Q.slice(J);return{newValue:Z+$+X,newCursorPosition:J+$.length}}function z9({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:U,onImagePaste:G,disabledKeys:K=[]}){let q=X2(e6()),F=X2($),O=X2(Z),N=X2(null);q9(()=>{F.current=$,O.current=Z},[$,Z]),q9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let _=Z2((C,w)=>{let S=F.current,P=O.current;if(F.current=C,O.current=w,C!==S)J(C);if(w!==P)X(w)}),B=Z2((C)=>{if(!C)return;let{newValue:w,newCursorPosition:S}=O9(vQ(C),F.current,O.current);_(w,S)}),z=Z2(async(C)=>{let w=vQ(C);if(!w)return;if(G&&TQ(w))try{let P=await U9(w);if(P){let b=await G(P.base64,P.mediaType,P.filename);if(b?.prompt)B(b.prompt);return}}catch(P){console.error("Failed to process image path:",P)}if((w.length>Y2.LARGE_INPUT_THRESHOLD||w.includes(`
149
+ `))&&U){let P=await U(w);if(P?.prompt){B(P.prompt);return}}B(w)}),L=Z2((C)=>{let w=N.current;if(!w){try{let P=C();if(!P)return;let b=P.catch(()=>{return});N.current=b,b.finally(()=>{if(N.current===b)N.current=null})}catch{}return}let S=w.then(C).then(()=>{return}).catch(()=>{return});N.current=S,S.finally(()=>{if(N.current===S)N.current=null})});wZ((C,w)=>{L(()=>{let S=vQ(C),P=$9(q.current,S);if(q.current=P.state,P.handled)return(async()=>{for(let E of P.segments)if(E.kind==="paste")await z(E.text);else B(E.text)})();if(K.some((E)=>w[E])||w.ctrl&&C==="c"||w.ctrl&&C==="l"||w.ctrl&&C==="t"||w.ctrl&&C==="o"||w.meta&&C==="l"||w.meta&&C==="t"||w.meta&&C==="o"||w.shift&&w.tab||S==="?"&&F.current==="")return;let I=F.current,R=O.current,H=R,f=I;if(w.leftArrow)H--;else if(w.rightArrow)H++;else if(w.backspace||w.delete){if(C===""){if(R>0)f=I.slice(0,R-1)+I.slice(R,I.length),H--}else if(R<I.length)f=I.slice(0,R)+I.slice(R+1,I.length)}else if(w.ctrl&&S==="a")H=0;else if(w.ctrl&&S==="e")H=I.length;else if(w.ctrl&&S==="k")f=I.slice(0,R);else if(w.ctrl&&S==="u")f=I.slice(R),H=0;else if(w.ctrl&&S==="w"){let t=I.slice(0,R).match(/\s*\S+\s*$/);if(t){let l=t[0].length;f=I.slice(0,R-l)+I.slice(R),H-=l}}else if(w.ctrl&&S==="v"){let E=process.platform==="darwin";return(async()=>{if(G){let l=await K9();if(l){let v=await G(l.base64,l.mediaType,"clipboard.png");if(v?.prompt)B(v.prompt);return}}if(E)return;let t=await G9();if(t)await z(t)})()}else if(w.pageUp)H=0;else if(w.pageDown)H=I.length;else if(S===`
150
+ `&&(w.shift||w.meta)){let{newValue:E,newCursorPosition:t}=O9(S,I,R);_(E,t);return}else if(!w.ctrl&&!w.meta){if(U&&(S.length>Y2.LARGE_INPUT_THRESHOLD||S.includes(`
151
+ `)))return z(S);f=I.slice(0,R)+S+I.slice(R,I.length),H+=S.length}if(H<0)H=0;if(H>f.length)H=f.length;_(f,H)})},{isActive:Y});let W=Y,A=$,T=Q?L$.grey(Q):void 0;if(W)if(T=Q.length>0?L$.inverse(Q[0])+L$.grey(Q.slice(1)):L$.inverse(" "),$.length===0)A=L$.inverse(" ");else{A="";for(let C=0;C<$.length;C++)if(C===Z&&Z<$.length)A+=L$.inverse($[C]);else A+=$[C];if(Z>=$.length)A+=L$.inverse(" ")}return PZ(BZ,{children:Q?$.length>0?A:T:A},void 0,!1,void 0,this)}import{jsxDEV as fQ}from"react/jsx-dev-runtime";var N9=MZ.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let G=$1()==="main-input",K=$.trimStart().startsWith("!"),q=_9((O)=>{let N=O.split(`
152
+ `).length,_=O.length,B=500,z=10;if(_>500||N>10){let L=Z(O),W=O.slice(0,30).replace(/\n/g," "),A=`${_} chars, ${N} lines: ${W}...`;return{prompt:`${u8(L)}${A}${c2()}`}}return{}}),F=_9(async(O,N,_)=>{try{let B=X(O,N);return{prompt:`${u8(B)}[Image #${B}]${c2()}`}}catch(B){return console.error("[Image Paste] Failed to process image:",B),{prompt:`[Image paste failed: ${B instanceof Error?B.message:"Unknown error"}] `}}});return fQ(RZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[fQ(yZ,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),fQ(z9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:q,onImagePaste:F,placeholder:" 输入命令...",focus:G,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as U2,Text as R1}from"ink";import fZ,{useEffect as SZ,useState as kZ}from"react";import{useEffect as vZ,useState as L9}from"react";import{useEffect as CZ,useState as IZ}from"react";var TZ=15000,F9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],H9=["Esc - 中止任务 / 隐藏建议 / 双击清空输入","Shift+Tab - 切换模式 (DEFAULT → AUTO_EDIT → PLAN)","Tab - 选中建议 / 切换 thinking 模式","Up/Down - 浏览建议或输入历史","? - 显示快捷键帮助(输入框为空时)","Ctrl+C - 停止任务(双击退出)","Ctrl+L - 清屏","Ctrl+T - 展开/折叠 thinking 内容","Ctrl+O - 展开/折叠历史消息","Ctrl+A / Ctrl+E - 光标跳到行首/行尾","Ctrl+U / Ctrl+K - 删到行首/行尾","Ctrl+W - 删除前一个单词","Shift+Enter - 插入换行","/help - 显示所有可用命令","/init - 分析项目并生成 BLADE.md","/resume - 恢复历史会话","/compact - 压缩上下文,节省 token","/theme - 切换主题","/model - 管理和切换模型","/permissions - 管理权限规则","/mcp - 查看 MCP 服务器状态","/agents - 管理 subagent 配置","/clear - 清除对话历史","/status - 查看当前配置","/context - 可视化 token 使用情况","/git - Git 查询和 AI 辅助","/git review - AI Code Review","/git commit - AI 生成 commit message","/hooks - 管理 Hook 配置","/tasks - 查看后台任务","/skills - 查看可用 Skills","/plugins - 管理插件","/memory - 管理项目记忆","/ide - 管理 IDE 集成","@ 文件路径 - 附加文件到上下文","@dir/ - 附加整个目录","@file.ts:10-20 - 附加指定行范围","Plan 模式 - 先规划后编码(Shift+Tab 切换)","Auto Edit 模式 - 自动批准工具调用","MCP 协议 - 扩展外部工具集成","Subagents - 并行执行子任务","Hooks - 自定义工具执行流程","Skills - 可复用的技能模板","Plugins - 扩展功能插件","提示:/init 让 AI 理解你的项目结构","提示:Plan 模式适合复杂多步骤任务","提示:Auto Edit 可加速重复性操作","提示:@ 引用可提供更精准的上下文","提示:定期 /compact 节省 token","提示:Esc 可随时中断任务","提示:/resume 继续未完成的对话","提示:/model once 临时切换模型"];function W9($,Q,Y=!1){let[J,Z]=IZ("");return CZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let q=Math.floor(Math.random()*H9.length);return H9[q]}let K=Math.floor(Math.random()*F9.length);return F9[K]};Z(X());let U=setInterval(()=>{Z(X())},TZ);return()=>{clearInterval(U)}},[$,Q,Y]),J}function B9($,Q=!1,Y=!1){let[J,Z]=L9(0),[X,U]=L9(null),G=W9($,Q,Y);return vZ(()=>{if(!$){Z(0),U(null);return}if(Y)return;if(X===null)U(Date.now());let K=setInterval(()=>{if(X!==null){let q=Math.floor((Date.now()-X)/1000);Z(q)}},1000);return()=>{clearInterval(K)}},[$,X,Y]),{currentPhrase:G,elapsedTime:J}}import{jsxDEV as J1,Fragment as VZ}from"react/jsx-dev-runtime";var SQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],DZ=80;function w9($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var b9=fZ.memo(({message:$,paused:Q=!1})=>{let Y=a1(),J=A8(),Z=Y||!J,[X,U]=kZ(0),G=A0(),q=h$()>=DZ,{currentPhrase:F,elapsedTime:O}=B9(Z,!1,Q);if(SZ(()=>{if(!Z||Q){U(0);return}let _=setInterval(()=>{U((B)=>(B+1)%SQ.length)},150);return()=>clearInterval(_)},[Z,Q]),!Z)return null;let N=$||F||"正在思考中...";if(q)return J1(U2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[J1(R1,{color:G.colors.warning,bold:!0,children:SQ[X]},void 0,!1,void 0,this),J1(R1,{color:G.colors.text.primary,children:N},void 0,!1,void 0,this),O>0&&J1(VZ,{children:[J1(R1,{color:G.colors.muted,children:"|"},void 0,!1,void 0,this),J1(R1,{color:G.colors.info,children:["已用时: ",w9(O)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J1(R1,{color:G.colors.muted,children:"|"},void 0,!1,void 0,this),J1(R1,{color:G.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return J1(U2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[J1(U2,{flexDirection:"row",gap:1,children:[J1(R1,{color:G.colors.warning,bold:!0,children:SQ[X]},void 0,!1,void 0,this),J1(R1,{color:G.colors.text.primary,children:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O>0&&J1(U2,{marginLeft:2,flexDirection:"row",gap:1,children:[J1(R1,{color:G.colors.info,children:["已用时: ",w9(O)]},void 0,!0,void 0,this),J1(R1,{color:G.colors.muted,children:"|"},void 0,!1,void 0,this),J1(R1,{color:G.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 q2,Text as S0,useInput as jZ,useStdout as hZ}from"ink";import EZ from"ink-text-input";import gZ,{useCallback as G2,useEffect as mZ,useMemo as pZ,useState as B$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var y9=gZ.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=hZ(),J=Y.columns||80,Z=$1()==="confirmation-prompt",X=v0(!1),U=$.fields??[],[G,K]=B$("field"),[q,F]=B$(0),[O,N]=B$(()=>A9($)),[_,B]=B$(""),[z,L]=B$(0),[W,A]=B$([]),[T,C]=B$(),w=U[q],S=pZ(()=>cZ(w),[w]);mZ(()=>{if(!w)return;let H=O[w.name];B(typeof H==="string"||typeof H==="number"?String(H):""),A(Array.isArray(H)?[...H]:[]);let f=S.findIndex((E)=>E.value===String(H));L(f>=0?f:0),C(void 0)},[O,w,S]);let P=G2((H)=>{if(N(H),q<U.length-1){F((f)=>f+1);return}K("review")},[q,U.length]),b=G2((H)=>{if(!w)return;let f={...O};if(H===void 0)delete f[w.name];else f[w.name]=H;P(f)},[O,w,P]),I=G2((H)=>{if(!w)return;try{b(P9(w,H))}catch(f){C(f instanceof Error?f.message:String(f))}},[w,b]),R=G2(()=>{try{let H=R9($,{action:"accept",content:O});Q({action:H.action,...H.content?{content:H.content}:{}})}catch(H){C(H instanceof Error?H.message:String(H))}},[O,$,Q]);if(jZ((H,f)=>{if(f.ctrl&&H==="c"||f.meta&&H==="c"){X();return}if(f.escape){Q({action:"cancel"});return}if($.mode==="url"){if(H.toLowerCase()==="y")Q({action:"accept"},!0);else if(H.toLowerCase()==="n")Q({action:"decline"});return}if(G==="review"){if(H.toLowerCase()==="y"||f.return)R();else if(H.toLowerCase()==="e")F(0),K("field");else if(H.toLowerCase()==="d")Q({action:"decline"});return}if(!w){if(f.return)R();return}if(kQ(w))return;if(H.toLowerCase()==="d"){Q({action:"decline"});return}if(f.upArrow){L((E)=>E>0?E-1:Math.max(S.length-1,0));return}if(f.downArrow||f.tab){L((E)=>E<S.length-1?E+1:0);return}if(H===" "&&w.type==="multi-select"){let E=S[z];if(E)A((t)=>t.includes(E.value)?t.filter((l)=>l!==E.value):[...t,E.value]);return}if(f.return)if(w.type==="multi-select")b(W);else{let E=S[z];if(E)b(E.typedValue)}},{isActive:Z}),$.mode==="url")return F0(K2,{width:J,color:"yellow",children:[F0(S0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),F0(S0,{children:$.message},void 0,!1,void 0,this),F0(S0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),F0(S0,{children:["Domain: ",F0(S0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(S0,{wrap:"wrap",children:["URL: ",F0(S0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(S0,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(G==="review")return F0(K2,{width:J,color:"green",children:[F0(S0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),F0(S0,{children:$.message},void 0,!1,void 0,this),U.map((H)=>F0(S0,{children:[H.title,": ",xZ(O[H.name])]},H.name,!0,void 0,this)),T&&F0(S0,{color:"red",children:T},void 0,!1,void 0,this),F0(S0,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!w)return F0(K2,{width:J,color:"cyan",children:[F0(S0,{children:$.message},void 0,!1,void 0,this),F0(S0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),F0(S0,{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(K2,{width:J,color:"cyan",children:[F0(S0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),F0(S0,{children:$.message},void 0,!1,void 0,this),F0(q2,{flexDirection:"column",marginTop:1,children:[F0(S0,{bold:!0,children:[w.title,w.required?" *":""]},void 0,!0,void 0,this),w.description&&F0(S0,{color:"gray",children:w.description},void 0,!1,void 0,this),F0(S0,{color:"gray",children:uZ(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),kQ(w)?F0(q2,{children:[F0(S0,{color:"cyan",children:"> "},void 0,!1,void 0,this),F0(EZ,{value:_,onChange:B,onSubmit:I,focus:Z,placeholder:w.defaultValue===void 0?w.required?"Required":"Optional":String(w.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):F0(q2,{flexDirection:"column",children:S.map((H,f)=>{let E=w.type==="multi-select"&&W.includes(H.value);return F0(S0,{color:z===f?"yellow":void 0,children:[z===f?"> ":" ",w.type==="multi-select"?E?"(*) ":"( ) ":"",H.label]},H.value,!0,void 0,this)})},void 0,!1,void 0,this),T&&F0(S0,{color:"red",children:T},void 0,!1,void 0,this),F0(S0,{color:"gray",children:[kQ(w)?"Enter to continue":w.type==="multi-select"?"Space to toggle · Enter to continue":"Up/Down to select · Enter to continue"," · [D] Decline · Esc Cancel"]},void 0,!0,void 0,this),F0(S0,{color:"gray",children:["Field ",q+1," of ",U.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function K2({children:$,width:Q,color:Y}){return F0(q2,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function kQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function cZ($){if(!$)return[];if($.type==="boolean")return[{value:"true",label:"Yes",typedValue:!0},{value:"false",label:"No",typedValue:!1}];return($.options??[]).map((Q)=>({...Q,typedValue:Q.value}))}function uZ($){let Q=[];if($.format)Q.push(`format: ${$.format}`);if($.minimum!==void 0)Q.push(`min: ${$.minimum}`);if($.maximum!==void 0)Q.push(`max: ${$.maximum}`);if($.minLength!==void 0)Q.push(`min length: ${$.minLength}`);if($.maxLength!==void 0)Q.push(`max length: ${$.maxLength}`);if($.minItems!==void 0)Q.push(`min selections: ${$.minItems}`);if($.maxItems!==void 0)Q.push(`max selections: ${$.maxItems}`);return Q.join(" · ")}function xZ($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import N2 from"ansi-escapes";import{Box as e1,Static as E9,useStdout as Z5}from"ink";import X5,{useEffect as g1,useMemo as g9,useRef as $$,useState as mQ}from"react";import{useStdout as lZ}from"ink";import{debounce as dZ}from"lodash-es";import{useEffect as rZ,useState as aZ}from"react";function M9($=200){let{stdout:Q}=lZ(),[Y,J]=aZ(Q.rows||24);return rZ(()=>{let Z=dZ(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import w$ from"chalk";import iZ from"string-width";var N0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},z2="\x1B",DQ=`${z2}[2K`,O2=($)=>$>0?`${z2}[${$}A`:"",C9=`${z2}[?25l`,I9=`${z2}[?25h`;function T9($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function v9($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function f9($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),U=[],G=d0.getTheme(),K=" ".repeat(N0.prefixIndent),q=w$.dim.hex(G.colors.border.light);if(Q>0)U.push(`${K}${w$.dim.hex(G.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let F=Y==="code",O=Y==="diff",N="",_=$;if(F&&$.length>0)N=$[0].match(/^```(\w+)?/)?.[1]||"",_=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")_=$.slice(1);let B=_.slice(-X);if(F&&Q===0){let L=N?` ${w$.hex(G.colors.text.secondary)(N)}`:"";U.push(`${K}${q("╭─")}${L}`)}for(let L=0;L<B.length;L++){let W=B[L],A=K;if(L===0&&!J&&N0.isFirstRender&&!F&&!O)A=w$.bold.hex(G.colors.success)("• ")+" ",N0.isFirstRender=!1;let T=F?4:0,C=N0.terminalWidth-N0.prefixIndent-2-T,w=W;if(iZ(W)>C)w=W.slice(0,C);if(F)U.push(`${K}${q("│")} ${w}`);else if(O){let S=w;if(S.startsWith("+"))U.push(`${A}${w$.green(w)}`);else if(S.startsWith("-"))U.push(`${A}${w$.red(w)}`);else if(S.startsWith("@@"))U.push(`${A}${w$.dim(w)}`);else U.push(`${A}${w}`)}else U.push(`${A}${w}`);if(L===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let z=[];if(z.push(C9),N0.renderedLineCount>0)z.push(O2(N0.renderedLineCount)),z.push("\r");for(let L=0;L<U.length;L++){let W=U[L],A=N0.lastRenderedLines[L];if(W!==A)z.push(DQ),z.push(W);if(L<U.length-1)z.push(`
153
153
  `)}if(U.length<N0.renderedLineCount){for(let W=U.length;W<N0.renderedLineCount;W++)z.push(`
154
- `),z.push(kQ);let L=N0.renderedLineCount-U.length;z.push(O2(L))}z.push(C9),process.stdout.write(z.join("")),N0.renderedLineCount=U.length,N0.lastRenderedLines=U}function h1(){if(!N0.active)return;if(N0.renderedLineCount>0){let $=[];$.push(M9),$.push(O2(N0.renderedLineCount)),$.push("\r");for(let Q=0;Q<N0.renderedLineCount;Q++)if($.push(kQ),Q<N0.renderedLineCount-1)$.push(`
155
- `);if(N0.renderedLineCount>1)$.push(O2(N0.renderedLineCount-1)),$.push("\r");$.push(C9),process.stdout.write($.join(""))}N0.active=!1,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.isFirstRender=!0}function T1(){return N0.active}import{Box as iZ,Text as f9}from"ink";import oZ from"react";import{jsxDEV as DQ}from"react/jsx-dev-runtime";var VQ=oZ.memo(({collapsedCount:$})=>{let Q=A0();if($<=0)return null;let Y=Q.colors.text.muted;return DQ(iZ,{flexDirection:"row",marginBottom:1,children:[DQ(f9,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),DQ(f9,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});VQ.displayName="CollapsedHistorySummary";import{Box as z8,Text as _8}from"ink";import nZ from"ink-big-text";import tZ from"ink-gradient";import sZ from"react";import{jsxDEV as L1}from"react/jsx-dev-runtime";var k9=sZ.memo(()=>{return L1(z8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[L1(z8,{flexDirection:"column",children:L1(tZ,{name:"pastel",children:L1(nZ,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(z8,{marginBottom:1,children:L1(_8,{color:"white",dimColor:!0,children:S9()},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(z8,{flexDirection:"column",marginBottom:1,children:[L1(z8,{marginBottom:1,children:L1(_8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(_8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),L1(_8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),L1(_8,{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 _2,Text as jQ}from"ink";import D9 from"react";import{jsxDEV as s1}from"react/jsx-dev-runtime";var V9=D9.memo(({tasks:$,visible:Q=!0,compact:Y=!1})=>{let{colors:J}=A0();if(!Q||$.length===0)return null;let Z={total:$.length,completed:$.filter((X)=>X.status==="completed").length,inProgress:$.filter((X)=>X.status==="in_progress").length};return s1(_2,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[s1(_2,{marginBottom:Y?0:1,children:[s1(jQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),s1(jQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s1(_2,{flexDirection:"column",children:$.map((X,U)=>s1(eZ,{task:X,compact:Y},X.id||U,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),eZ=D9.memo(({task:$,compact:Q})=>{let Y,J=!1,Z;switch($.status){case"completed":Y="[OK]",J=!0,Z=$.subject;break;case"in_progress":Y=">",J=!1,Z=$.activeForm||$.subject;break;case"pending":default:Y="-",J=!0,Z=$.subject;break}return s1(_2,{paddingY:Q?0:0,children:s1(jQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as hQ,Text as d$}from"ink";import $5,{useMemo as j9}from"react";import{jsxDEV as E1}from"react/jsx-dev-runtime";function Q5($,Q=60){if(!$)return"";let Y=$.split(`
156
- `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function J5($){if(!$)return 0;return $.split(`
157
- `).length}var EQ=$5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=j9(()=>J5($),[$]),X=j9(()=>Q5($),[$]),U=J.colors.info,K=J.colors.muted;return E1(hQ,{flexDirection:"column",marginBottom:1,children:[E1(hQ,{flexDirection:"row",children:[E1(d$,{color:U,children:Y?"v":">"},void 0,!1,void 0,this),E1(d$,{children:" "},void 0,!1,void 0,this),E1(d$,{color:K,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&E1(d$,{color:K,children:[" - ",X]},void 0,!0,void 0,this),E1(d$,{color:K,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&E1(hQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:E1(d$,{color:K,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});EQ.displayName="ThinkingBlock";import{jsxDEV as a0}from"react/jsx-dev-runtime";var m9=Z5.memo(()=>{let $=oQ(),Q=F4(),Y=H4(),J=W4(),Z=a1(),X=J4(),U=U4(),K=y8(),G=_4(),q=N4(),F=nQ(),O=B4(),N=L4(),_=h$(),B=y9(),{stdout:z}=Y5(),L=d1(),[W,A]=gQ(null),[T,C]=gQ([]),[w,S]=gQ(new Set),P=$$(N),b=$$(null),I=$$(0),R=$$(0),H=$$(new Set),f=$$(new Set),E=$$([]),t=$$(null);g1(()=>{if(P.current!==N){if(T1())h1();if(z)z.write(N2.clearTerminal);L.incrementClearCount(),P.current=N}},[N,z,L]);let l=$,v=J;g1(()=>{if(!J||Z){t.current=null;return}if(t.current===J)return;if(t.current=J,T1())h1();if(z)z.write(N2.eraseScreen+N2.cursorTo(0,0));H.current=new Set,f.current=new Set(l.filter((h)=>h.role==="tool").map((h)=>h.id)),b.current=null,I.current=0,R.current=0,E.current=[],C([]),S(new Set),L.incrementClearCount(),L.clearFinalizingStreamingMessageId()},[J,Z,z,L,l]);let M=Q??J;g1(()=>{if(T1())h1();b.current=null,I.current=0,R.current=0,H.current=new Set,f.current=new Set(l.filter((h)=>h.role==="tool").map((h)=>h.id)),E.current=[],C([]),S(new Set)},[F]),g1(()=>{if(!M)return;if(b.current===M)return;b.current=M,I.current=0,R.current=0,f.current=new Set(l.filter((h)=>h.role==="tool").map((h)=>h.id)),E.current=[],C([])},[M,l]),g1(()=>{if(!M)return;let h=mQ(M);if(!h||h.length<=I.current)return;let x=h.slice(I.current);I.current=h.length;let V=x,i=E.current;if(i.length>0)if(V.some((B0)=>B0.type!=="empty"))V=[...i,...V],E.current=[];else{E.current=[...i,...V];return}let U0=V.length;while(U0>0&&V[U0-1].type==="empty")U0-=1;if(U0!==V.length)E.current=V.slice(U0),V=V.slice(0,U0);if(V.length===0)return;let q0=R.current;R.current+=1;let R0=q0>0;if(T1())h1();S((B0)=>{if(!M||B0.has(M))return B0;let s0=new Set(B0);return s0.add(M),s0}),C((B0)=>[...B0,a0(e1,{flexDirection:"column",children:a0(t1,{content:"",role:"assistant",terminalWidth:_,isPending:!1,hidePrefix:R0,noMargin:!0,blocksOverride:V,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${M}-${q0}`,!1,void 0,this)])},[M,Y.version,_,F]),g1(()=>{if(!M)return;let h=f.current,x=l.filter((V)=>V.role==="tool"&&!h.has(V.id)&&!H.current.has(V.id));if(x.length===0)return;if(T1())h1();for(let V of x)H.current.add(V.id);C((V)=>[...V,...x.map((i)=>a0(e1,{flexDirection:"column",children:a0(t1,{content:i.content,role:i.role,terminalWidth:_,metadata:i.metadata,isPending:!1,messageId:i.id},void 0,!1,void 0,this)},`streaming-tool-${i.id}`,!1,void 0,this))])},[M,l,_]),g1(()=>{if(!M){if(T1())h1();return}if(!T1())I9(_,B);else T9(_,B);let h=g9(M);if(!h||h.lines.length===0)return;let V=Math.max(1,B-8),i=Math.max(0,h.lines.length-V),U0=h.lines.slice(-V),q0=(mQ(M)?.length??0)>0;v9(U0,i,h.mode,q0)},[M,Y.version,B,_]),g1(()=>{if(!M&&T1())h1()},[M]),g1(()=>{if(W===null&&l.length>O){if(A(l.length),T1())h1();if(z)z.write(N2.clearTerminal);L.incrementClearCount()}},[l.length,O,W,z,L]);let k=E9(()=>{return X.some((h)=>h.status==="pending"||h.status==="in_progress")},[X]),D=N?0:W??0,y=D,g=E9(()=>{let h=[];if(h.push(a0(k9,{},"header",!1,void 0,this)),y>0)h.push(a0(VQ,{collapsedCount:y},"collapsed-summary",!1,void 0,this));for(let x=D;x<l.length;x++){let V=l[x];if(v&&V.id===v)continue;if(V.role==="tool"&&H.current.has(V.id))continue;if(V.role==="assistant"&&w.has(V.id))continue;h.push(a0(e1,{flexDirection:"column",children:a0(t1,{content:V.content,role:V.role,terminalWidth:_,metadata:V.metadata,isPending:!1,messageId:V.id},void 0,!1,void 0,this)},V.id,!1,void 0,this))}return h},[l,D,y,_,v,w]);return a0(e1,{flexDirection:"column",paddingX:2,children:a0(e1,{flexDirection:"column",children:[a0(h9,{items:g,children:(h)=>h},F,!1,void 0,this),G&&a0(e1,{marginBottom:1,children:a0(EQ,{content:G,isStreaming:Z,isExpanded:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),T.length>0&&a0(h9,{items:T,children:(h)=>h},`streaming-${F}`,!1,void 0,this),U&&k&&a0(e1,{marginTop:1,children:a0(V9,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.map((h,x)=>a0(e1,{flexDirection:"column",children:a0(t1,{content:h.displayText,role:"user",terminalWidth:_},void 0,!1,void 0,this)},`pending-${x}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as F2,useMount as X5}from"ahooks";import{Box as B1,Text as H0,useFocus as U5,useFocusManager as K5,useInput as G5}from"ink";import q5 from"ink-select-input";import{memo as O5,useMemo as z5,useState as H2}from"react";import{jsxDEV as $0,Fragment as F5}from"react/jsx-dev-runtime";var _5=({isSelected:$})=>$0(B1,{marginRight:1,children:$0(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),N5=({isSelected:$,label:Q})=>$0(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),p9=O5(({onClose:$,onEdit:Q})=>{let Y=K4(),J=R8()??"",{isFocused:Z}=U5({id:"model-selector"}),X=K5(),[U,K]=H2(""),[G,q]=H2(!1),[F,O]=H2(null),N=v0(!1),[_]=H2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});X5(()=>{if(X?.focus("model-selector"),Y.length>0)K(Y[0].id)}),G5((P,b)=>{if(G)return;if(b.ctrl&&P==="c"||b.meta&&P==="c"){N();return}if(b.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){z();return}if((P==="e"||P==="E")&&Q)L()},{isActive:!0});let B=F2(async(P)=>{if(G)return;let b=P.value;if(b===J){$();return}q(!0),O(null);try{await g0().setCurrentModel(b),$()}catch(I){O(I.message),q(!1)}}),z=F2(async()=>{if(G||U===J)return;q(!0),O(null);try{if(await g0().removeModel(U),Y.length<=1)$()}catch(P){O(P.message)}finally{q(!1)}}),L=F2(()=>{if(G||!Q)return;let P=Y.find((b)=>b.id===U);if(!P)return;Q(P)}),W=F2((P)=>{K(P.value)}),A=z5(()=>{return Y.find((P)=>P.id===U)},[Y,U]),T=A?W2()?.modelProviders[A.provider]:void 0,C=Y.map((P)=>{let b=P.id===J?" (当前)":"";return{label:pQ(P)+b,value:P.id}}),w=U===J;return $0(B1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[$0(B1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[$0(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),$0(H0,{dimColor:!0,children:[G?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(B1,{flexDirection:"row",children:[$0(B1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[$0(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),$0(B1,{marginTop:1,children:$0(q5,{items:C,onSelect:B,onHighlight:W,indicatorComponent:_5,itemComponent:N5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(B1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[$0(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),$0(B1,{marginY:1,children:$0(H0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A?$0(B1,{flexDirection:"column",children:[$0(H0,{children:[$0(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),$0(H0,{bold:!0,color:"cyan",children:pQ(A)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(H0,{children:[$0(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),$0(H0,{bold:!0,children:T?.name??A.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),T&&$0(F5,{children:[$0(H0,{children:[$0(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),$0(H0,{children:A.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(H0,{children:[$0(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),$0(H0,{children:T.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(H0,{children:[$0(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),$0(H0,{color:"blueBright",children:T.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(H0,{children:[$0(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),$0(H0,{bold:!0,children:A.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A.overrides?.baseUrl&&$0(H0,{children:[$0(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),$0(H0,{color:"blueBright",children:A.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(H0,{children:[$0(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),$0(H0,{children:S1().resolveConfig(A).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):$0(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F&&$0(B1,{marginTop:1,children:$0(H0,{color:"red",children:F},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(B1,{justifyContent:"center",marginTop:1,children:$0(H0,{dimColor:!0,children:"─".repeat(_)},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(B1,{justifyContent:"center",children:$0(H0,{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 cQ}from"ahooks";import{Box as j5,Text as uQ,useInput as h5}from"ink";import{useState as P$}from"react";import{Box as b$,Text as m1,useInput as H5}from"ink";import W5 from"ink-text-input";import{jsxDEV as o0}from"react/jsx-dev-runtime";var c9=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return H5((U,K)=>{if(K.escape)Z()}),o0(b$,{flexDirection:"column",children:[o0(b$,{marginBottom:1,children:o0(m1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(b$,{marginBottom:1,children:o0(m1,{children:["Provider: ",o0(m1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o0(b$,{marginBottom:1,children:o0(m1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(b$,{children:[o0(m1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),o0(W5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&o0(b$,{marginTop:1,children:o0(m1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(b$,{marginTop:1,children:o0(m1,{dimColor:!0,children:["输入完成后按 ",o0(m1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",o0(m1,{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 L2,Text as Q$,useInput as L5}from"ink";import B5 from"ink-text-input";import{useState as B2}from"react";import{jsxDEV as z1}from"react/jsx-dev-runtime";var w2=["id","name","baseUrl","model"];function u9($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function w5($,Q,Y){switch($){case"id":return"team-gateway";case"name":return Y||"Team Gateway";case"baseUrl":return Q==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return Q==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function b5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=l9(Y,J);if(!$.model.trim())Z.push("Model ID must not be empty");if(Z.length>0)throw Error(Z[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:J}}var d9=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,U]=B2(Q?3:0),[K,G]=B2(Q?.model??""),[q,F]=B2(Z),[O,N]=B2(),_=w2[X];L5((z,L)=>{if(!L.escape)return;if(N(void 0),X===0){J();return}let W=X-1,A=w2[W];U(W),G(q[A])});let B=(z)=>{let L=z.trim();if(_==="id"&&!x9.test(L)){N("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(_==="baseUrl")try{let A=new URL(L);if(!["http:","https:"].includes(A.protocol))throw Error()}catch{N("Base URL 必须是绝对 HTTP(S) URL");return}if(_==="model"&&!L){N("Model ID 不能为空");return}let W={...q,[_]:_==="name"&&!L?q.id:L};if(F(W),N(void 0),X===w2.length-1){try{Y(b5(W,$))}catch(A){N(A instanceof Error?A.message:"渠道配置无效")}return}U(X+1),G("")};return z1(L2,{flexDirection:"column",children:[z1(L2,{marginBottom:1,children:z1(Q$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z1(Q$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),w2.slice(0,X).map((z)=>z1(Q$,{children:[u9(z),": ",z1(Q$,{color:"cyan",children:q[z]},void 0,!1,void 0,this)]},z,!0,void 0,this)),z1(L2,{marginTop:1,children:[z1(Q$,{bold:!0,children:[u9(_),": "]},void 0,!0,void 0,this),z1(B5,{value:K,onChange:(z)=>{G(z),N(void 0)},onSubmit:B,placeholder:w5(_,$,q.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_==="name"&&z1(Q$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&z1(Q$,{color:"red",children:O},void 0,!1,void 0,this),z1(L2,{marginTop:1,children:z1(Q$,{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 i9,useState as r$}from"react";var o9=()=>{let[$,Q]=r$([]),[Y,J]=r$(!0),[Z,X]=r$(null);return i9(()=>{(async()=>{try{Q(await r9())}catch(K){X(K instanceof Error?K.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},n9=($)=>{let[Q,Y]=r$([]),[J,Z]=r$(!1),[X,U]=r$(null);return i9(()=>{if(!$){Y([]);return}(async()=>{Z(!0),U(null);try{Y(await a9($))}catch(G){U(G instanceof Error?G.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as p1,Text as y1,useInput as A5}from"ink";import P5 from"ink-select-input";import R5 from"ink-text-input";import{useMemo as t9,useState as y5}from"react";import{jsxDEV as E0,Fragment as T5}from"react/jsx-dev-runtime";var M5=({isSelected:$})=>E0(p1,{marginRight:1,children:E0(y1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),C5=($)=>{let Q=[$.name];if($.contextWindow){let Y=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;Q.push(`[${Y} ctx]`)}if($.reasoning)Q.push("[reasoning]");if($.input.includes("image"))Q.push("[vision]");if($.cost.input||$.cost.output)Q.push(`[$${$.cost.input}/$${$.cost.output}]`);return Q.join(" ")},I5=({isSelected:$,label:Q})=>E0(y1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),s9=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[U,K]=y5("");A5((F,O)=>{if(O.escape)if(U)K("");else X()});let G=t9(()=>{if(!U)return Q;let F=U.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(F)||O.id.toLowerCase().includes(F))},[Q,U]),q=t9(()=>G.map((F)=>({key:F.id,label:C5(F),value:F})),[G]);if(Y)return E0(p1,{flexDirection:"column",children:E0(y1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return E0(p1,{flexDirection:"column",children:[E0(y1,{color:"red",children:J},void 0,!1,void 0,this),E0(y1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E0(p1,{flexDirection:"column",children:[E0(p1,{marginBottom:1,children:E0(y1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(p1,{marginBottom:1,children:E0(y1,{children:["Provider: ",E0(y1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E0(T5,{children:[E0(p1,{marginBottom:1,children:[E0(y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),E0(R5,{value:U,onChange:K,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(p1,{marginBottom:1,children:E0(y1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(p1,{flexDirection:"column",height:12,children:E0(P5,{items:q,onSelect:(F)=>Z(F.value),indicatorComponent:M5,itemComponent:I5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&E0(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 A$,Text as J$,useInput as v5}from"ink";import f5 from"ink-select-input";import S5 from"ink-text-input";import{useMemo as e9,useState as k5}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var D5=({isSelected:$})=>n0(A$,{marginRight:1,children:n0(J$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),V5=({isSelected:$,label:Q})=>n0(J$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),$J=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,U]=k5("");v5((q,F)=>{if(F.escape)if(X)U("");else Z()});let K=e9(()=>{if(!X)return $;let q=X.toLowerCase();return $.filter((F)=>F.name.toLowerCase().includes(q)||F.id.toLowerCase().includes(q))},[$,X]),G=e9(()=>K.map((q)=>({key:q.id,label:`${q.name} - ${q.modelCount} models${q.configured?" [configured]":""}`,value:q})),[K]);if(Q)return n0(A$,{flexDirection:"column",children:n0(J$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(A$,{flexDirection:"column",children:[n0(J$,{color:"red",children:Y},void 0,!1,void 0,this),n0(J$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(A$,{flexDirection:"column",children:[n0(A$,{marginBottom:1,children:n0(J$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(A$,{marginBottom:1,children:[n0(J$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(S5,{value:X,onChange:U,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(A$,{flexDirection:"column",height:12,children:n0(f5,{items:G,onSelect:(q)=>J(q.value),indicatorComponent:D5,itemComponent:V5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&n0(J$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function QJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as Y$}from"react/jsx-dev-runtime";var xQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,U]=P$("provider"),[K,G]=P$(),[q,F]=P$(),[O,N]=P$(),[_,B]=P$(""),[z,L]=P$(),[W,A]=P$(!1),T=o9(),C=n9(K?.id),w=v0(!1);h5((I,R)=>{if(R.ctrl&&I==="c"||R.meta&&I==="c")$==="setup"?w():Z()});let S=cQ(async(I)=>{if(!K)return;let R=O??(q?{provider:K.id,model:q.id,displayName:Q?.displayName}:void 0);if(!R)return;A(!0),L(void 0);try{if(R.modelProvider)S1().registerModelProvider(R.provider,R.modelProvider,[R.model]);if(I?.trim())await S1().setApiKey(R.provider,I.trim());let H={displayName:R.displayName,provider:R.provider,model:R.model,overrides:R.overrides};if($==="setup")await J(R);else if($==="add"){let f=R.modelProvider?await g0().addModelWithProvider(H,R.modelProvider):await g0().addModel(H);await g0().setCurrentModel(f.id),await J(R)}else if(Y){if(R.modelProvider)await g0().updateModelWithProvider(Y,H,R.modelProvider);else await g0().updateModel(Y,H);await J(R)}}catch(H){if(R.modelProvider){await S1().credentials.delete(R.provider);let f=W2();S1().configureModelProviders(f?.modelProviders??{},f?.models??[])}L(H instanceof Error?H.message:"保存配置失败"),A(!1)}}),P=cQ((I)=>{if(F(I),K?.configured)S();else if(K?.supportsApiKey)U("credential");else L(`${K?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),b=cQ(()=>{if(L(void 0),X==="credential"&&O){U("custom");return}let I=QJ(X);if(I)U(I)});return Y$(j5,{flexDirection:"column",padding:1,children:[Y$(uQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&Y$($J,{...T,onSelect:(I)=>{G(I),F(void 0),N(void 0),U(I.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&K?.factoryWireApi&&Y$(d9,{wireApi:K.factoryWireApi,initialConfig:O,onSubmit:(I)=>{N(I),U("credential")},onCancel:b},void 0,!1,void 0,this),X==="model"&&K&&Y$(s9,{provider:K,...C,onSelect:P,onCancel:b},void 0,!1,void 0,this),X==="credential"&&K&&Y$(c9,{provider:K,value:_,onChange:B,onSubmit:()=>void S(_),onCancel:b,error:z},void 0,!1,void 0,this),W&&Y$(uQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),z&&X!=="credential"&&Y$(uQ,{color:"red",children:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as N8}from"ahooks";import{promises as XJ}from"fs";import{Box as _1,Text as D0,useInput as E5}from"ink";import JJ from"ink-select-input";import g5 from"ink-text-input";import m5 from"os";import b2 from"path";import{useEffect as p5,useMemo as A2,useRef as c5,useState as Z$}from"react";import{jsxDEV as G0}from"react/jsx-dev-runtime";var F8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],u5={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},x5={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},YJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},l5=["project","global","local"],d5={allow:[],ask:[],deny:[]},r5={localExists:!1,projectExists:!1,globalExists:!1},ZJ={allow:[],ask:[],deny:[]};function a5($){let Q=(J)=>Array.isArray(J)?J.filter((Z)=>typeof Z==="string"):[],Y=$?.permissions??{};return{allow:Q(Y?.allow),ask:Q(Y?.ask),deny:Q(Y?.deny)}}async function i5($){try{let Q=await XJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:a5(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...ZJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...ZJ}}}}function o5($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${YJ[Q]} <- 可删除`:YJ[Q];return`${Y} ${J}`}var UJ=({onClose:$})=>{let Y=$1()==="permissions-manager",J=v0(!1),[Z,X]=Z$(0),U=F8[Z].key,[K,G]=Z$(d5),[q,F]=Z$(r5),[O,N]=Z$(!0),[_,B]=Z$("list"),[z,L]=Z$(""),[W,A]=Z$(null),[T,C]=Z$(null),w=c5(!1),S=A2(()=>b2.join(u0(),".blade","settings.local.json"),[]),P=A2(()=>b2.join(u0(),".blade","settings.json"),[]),b=A2(()=>b2.join(m5.homedir(),".blade","settings.json"),[]),I=N8(async()=>{N(!0);let x=await Promise.all([{source:"local",path:S},{source:"project",path:P},{source:"global",path:b}].map(async({source:q0,path:R0})=>{let B0=await i5(R0);return{source:q0,path:R0,...B0}})),V={localExists:x.find((q0)=>q0.source==="local")?.exists??!1,projectExists:x.find((q0)=>q0.source==="project")?.exists??!1,globalExists:x.find((q0)=>q0.source==="global")?.exists??!1};F(V);let i={allow:[],ask:[],deny:[]},U0=Object.fromEntries(x.map((q0)=>[q0.source,q0]));["allow","ask","deny"].forEach((q0)=>{l5.forEach((R0)=>{(U0[R0]?.permissions[q0]??[]).forEach((s0,k0)=>{let F1={key:`${R0}:${k0}:${s0}`,rule:s0,source:R0};i[q0].push(F1)})})}),G(i),N(!1)});p5(()=>{I()},[I]);let R=N8(async(h,x)=>{try{let V=b2.join(u0(),".blade","settings.local.json"),i={allow:[],ask:[],deny:[]};try{let q0=await XJ.readFile(V,"utf-8"),B0=JSON.parse(q0).permissions||{};i={allow:Array.isArray(B0.allow)?B0.allow:[],ask:Array.isArray(B0.ask)?B0.ask:[],deny:Array.isArray(B0.deny)?B0.deny:[]}}catch(q0){}let U0=x(i);await g0().updateConfig({permissions:U0},{scope:"local",immediate:!0}),await I()}catch(V){throw console.error("[PermissionsManager] 修改权限规则失败:",V),V}});E5((h,x)=>{if(x.ctrl&&h==="c"||x.meta&&h==="c"){J();return}if(_==="locked"){if(w.current){w.current=!1;return}B("list"),A(null),C(null);return}if(x.escape){if(_==="list"||U==="info")$();else B("list"),L(""),A(null),C(null);return}if(_==="list"){if(x.tab&&x.shift)X((V)=>(V-1+F8.length)%F8.length);else if(x.tab)X((V)=>(V+1)%F8.length);else if(h?.toLowerCase()==="q")$()}},{isActive:Y});let H=N8((h)=>{let x=h.value;if(U==="info")return;if(x.type==="add"){B("add"),L(""),C(null);return}if(x.entry.source!=="local"){B("locked"),w.current=!0,A({tab:U,entry:x.entry}),C({type:"error",text:x.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}B("confirm-delete"),A({tab:U,entry:x.entry}),C(null)}),f=N8(async()=>{if(U==="info")return;let h=z.trim();if(!h){C({type:"error",text:"Permission rule 不能为空"});return}if(K[U].map((V)=>V.rule).includes(h)){C({type:"error",text:"该规则已存在"});return}try{await R(U,(V)=>{let i={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return i[U]=[...new Set([...V[U],h])],i}),B("list"),L(""),C({type:"success",text:"已添加本地权限规则"})}catch(V){C({type:"error",text:`保存失败: ${V instanceof Error?V.message:"未知错误"}`})}}),E=N8(async()=>{if(!W)return;let{tab:h,entry:x}=W;try{await R(h,(V)=>{let i={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return i[h]=V[h].filter((U0)=>U0!==x.rule),i}),B("list"),A(null),C({type:"success",text:"已删除本地权限规则"})}catch(V){C({type:"error",text:`删除失败: ${V instanceof Error?V.message:"未知错误"}`})}}),t=A2(()=>{if(U==="info")return[];let h=U;return[{key:"add-new-rule",label:`› ${u5[h]}`,value:{type:"add"}},...K[h].map((V)=>({key:V.key,label:o5(V.rule,V.source),value:{type:"rule",entry:V}}))]},[U,K]),l=()=>G0(_1,{marginBottom:1,children:F8.map((h,x)=>G0(_1,{marginRight:2,children:G0(D0,{color:x===Z?"yellow":"gray",children:["[",h.label,"]"]},void 0,!0,void 0,this)},h.key,!1,void 0,this))},void 0,!1,void 0,this),v=()=>G0(_1,{flexDirection:"column",gap:1,children:[G0(D0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),G0(_1,{flexDirection:"column",marginLeft:2,children:[G0(D0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",q.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),G0(D0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",q.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),G0(D0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",q.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G0(D0,{children:"说明:"},void 0,!1,void 0,this),G0(_1,{flexDirection:"column",marginLeft:2,children:[G0(D0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),G0(D0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),G0(D0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),M=(h)=>G0(_1,{flexDirection:"column",gap:1,children:[G0(D0,{bold:!0,children:x5[h]},void 0,!1,void 0,this),G0(D0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),G0(D0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),G0(_1,{marginTop:1,children:G0(g5,{value:z,onChange:L,onSubmit:f},void 0,!1,void 0,this)},void 0,!1,void 0,this),G0(D0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k=(h,x)=>G0(_1,{flexDirection:"column",gap:1,children:[G0(D0,{bold:!0,children:["Delete ",h," permission rule?"]},void 0,!0,void 0,this),G0(D0,{children:x.rule},void 0,!1,void 0,this),G0(D0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),G0(D0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),G0(JJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(V)=>{if(V.value==="yes")E();else B("list"),A(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D=(h)=>G0(_1,{flexDirection:"column",gap:1,children:[G0(D0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),G0(D0,{children:h.rule},void 0,!1,void 0,this),G0(D0,{color:"gray",children:h.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),G0(D0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y=(h)=>G0(JJ,{items:t,isFocused:_==="list",onSelect:H},void 0,!1,void 0,this),g=()=>{if(O)return G0(D0,{children:"加载中..."},void 0,!1,void 0,this);if(U==="info")return v();if(_==="add")return M(U);if(_==="confirm-delete"&&W)return k(W.tab,W.entry);if(_==="locked"&&W)return D(W.entry);return y(U)};return G0(_1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[G0(D0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),l(),G0(_1,{flexDirection:"column",gap:1,children:g()},void 0,!1,void 0,this),T&&G0(_1,{marginTop:1,children:G0(D0,{color:T.type==="success"?"green":"red",children:T.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),G0(_1,{marginTop:1,children:G0(D0,{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 w0,Text as Y0,useInput as n5}from"ink";import{useEffect as t5,useState as R$}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var lQ=["local","project","global"];function NJ({workspaceRoot:$,onCancel:Q}){let Y=GJ($),J=Y.getAll(),[Z,X]=R$(0),[U,K]=R$(!1),[G,q]=R$(""),[F,O]=R$(null),[N,_]=R$("local"),[B,z]=R$(null),[L,W]=R$(0),A=Y.getBySource(),T=Y.getStats(),C=Y.getSourcePolicy(),w=v0(!1,Q);t5(()=>{let H=!0;return KJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((f)=>{if(H)z(f.settings)}).catch((f)=>{if(H)q(f instanceof Error?f.message:"无法读取插件作用域配置")}),()=>{H=!1}},[Y,L]);let S=()=>{_((H)=>{let f=lQ.indexOf(H);return lQ[(f+1)%lQ.length]}),O(null)},P=async()=>{let H=J[Z];if(!H||U)return;if(H.source==="cli"){q(`${H.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(H.status==="error"){q(H.error??`${H.manifest.name} 当前不可用`);return}K(!0),q("");try{let f=await qJ(Y.getWorkspaceRoot(),H.manifest.name,H.status!=="active",N);q(f.effectiveEnabled?`已启用 ${H.manifest.name} · 生效层级 ${f.effectiveScope}`:`已禁用 ${H.manifest.name} · 生效层级 ${f.effectiveScope}`),W((E)=>E+1)}catch(f){q(f instanceof Error?f.message:String(f))}finally{K(!1)}},b=async()=>{if(U)return;K(!0),q("");try{await OJ(Y.getWorkspaceRoot()),X(0),q("插件列表已刷新"),W((H)=>H+1)}catch(H){q(H instanceof Error?H.message:String(H))}finally{K(!1)}},I=async()=>{let H=J[Z];if(!H||U)return;if(!H.installation){q(`${H.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}K(!0),O(null),q("");try{let{result:f}=await zJ(Y.getWorkspaceRoot(),H.manifest.name,{trusted:!0});if(!f.success)throw Error(f.error);q(f.changed?`已更新 ${H.manifest.name} 到 ${f.installation?.revision}`:`${H.manifest.name} 已是最新版本`),W((E)=>E+1)}catch(f){q(f instanceof Error?f.message:String(f))}finally{K(!1)}},R=async()=>{let H=J[Z];if(!H||U)return;if(!H.installation){q(`${H.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(F!==H.manifest.name){O(H.manifest.name),q(`再次按 x 确认卸载 ${H.manifest.name}`);return}K(!0),q("");try{let{result:f}=await _J(Y.getWorkspaceRoot(),H.manifest.name,!0);if(!f.success)throw Error(f.error);O(null),X(0),q(`已卸载 ${H.manifest.name}`),W((E)=>E+1)}catch(f){q(f instanceof Error?f.message:String(f))}finally{K(!1)}};if(n5((H,f)=>{if(f.escape)Q?.();else if(f.ctrl&&H==="c"||f.meta&&H==="c")w();else if((f.upArrow||H==="k")&&J.length>0)O(null),X((E)=>(E-1+J.length)%J.length);else if((f.downArrow||H==="j")&&J.length>0)O(null),X((E)=>(E+1)%J.length);else if(H===" "||f.return)P();else if(H==="r")b();else if(H==="s")S();else if(H==="u")I();else if(H==="x")R()}),J.length===0)return c(w0,{flexDirection:"column",paddingY:1,children:[c(w0,{marginBottom:1,children:c(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[c(Y0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{marginTop:1,paddingLeft:2,children:c(Y0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(Y0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return c(w0,{flexDirection:"column",paddingY:1,children:[c(w0,{marginBottom:1,children:[c(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),c(Y0,{color:"gray",children:[" (共 ",T.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{paddingLeft:2,marginBottom:1,children:c(Y0,{color:"gray",children:["启用: ",T.active," | 禁用: ",T.inactive," | 命令: ",T.commands," | 技能:"," ",T.skills," | 代理: ",T.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,marginBottom:1,children:c(Y0,{color:"gray",children:["来源策略: ",C.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",C.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,marginBottom:1,children:c(Y0,{color:"gray",children:["写入层级: ",c(Y0,{color:"cyan",children:N},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),A.cli.length>0&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(w0,{paddingLeft:1,children:[c(Y0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),c(Y0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A.cli.map((H)=>{let f=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return c(w0,{flexDirection:"column",paddingLeft:2,children:[c(Y0,{children:[c(Y0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",H.manifest.name]},void 0,!0,void 0,this),c(Y0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&c(w0,{paddingLeft:2,children:c(Y0,{color:"blue",children:["命令:"," ",H.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),A.project.length>0&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(w0,{paddingLeft:1,children:[c(Y0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),c(Y0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A.project.map((H)=>{let f=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return c(w0,{flexDirection:"column",paddingLeft:2,children:[c(Y0,{children:[c(Y0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",H.manifest.name]},void 0,!0,void 0,this),c(Y0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[H.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&c(w0,{paddingLeft:2,children:c(Y0,{color:"blue",children:["命令:"," ",H.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),A.user.length>0&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(w0,{paddingLeft:1,children:[c(Y0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),c(Y0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A.user.map((H)=>{let f=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return c(w0,{flexDirection:"column",paddingLeft:2,children:[c(Y0,{children:[c(Y0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",H.manifest.name]},void 0,!0,void 0,this),c(Y0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[H.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&c(w0,{paddingLeft:2,children:c(Y0,{color:"blue",children:["命令:"," ",H.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),c(w0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[c(Y0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{marginTop:1,children:c(Y0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&c(w0,{marginTop:1,children:c(Y0,{color:G.includes("失败")?"red":"cyan",children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&c(Y0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as Y1,Text as Z1,useInput as FJ,useStdout as s5}from"ink";import e5 from"ink-text-input";import dQ,{useCallback as H8,useMemo as $X,useState as X$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var QX=dQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>W0(Y1,{flexDirection:"column",marginBottom:1,children:[W0(Z1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),W0(Y1,{marginLeft:4,children:W0(Z1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),JX=dQ.memo(({questions:$,answers:Q})=>W0(Y1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return W0(Y1,{marginBottom:1,children:[W0(Z1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),W0(Z1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),HJ=dQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=s5(),Z=J.columns||80,U=$1()==="confirmation-prompt",K=v0(!1),[G,q]=X$("answering"),[F,O]=X$(0),[N,_]=X$({}),[B,z]=X$(0),[L,W]=X$([]),[A,T]=X$(!1),[C,w]=X$(""),[S,P]=X$(0),b=$[F],I=$X(()=>{if(!b)return[];return[...b.options.map((l)=>({label:l.label,value:l.label,description:l.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[b]),R=H8((l)=>{let v={...N,[b.header]:l};if(_(v),F<$.length-1)O(F+1),z(0),W([]),T(!1),w("");else q("submit"),P(0)},[N,b?.header,F,$.length]),H=H8((l)=>{let v=I[l];if(!v)return;if(v.value==="__other__"){T(!0);return}if(b.multiSelect)W((M)=>M.includes(v.value)?M.filter((k)=>k!==v.value):[...M,v.value]);else R(v.value)},[I,b?.multiSelect,R]),f=H8((l)=>{if(l.trim())R(l.trim())},[R]),E=H8(()=>{q("answering"),O(0),z(0),W([]),T(!1)},[]),t=H8(()=>{Q(N)},[N,Q]);if(FJ((l,v)=>{if(v.ctrl&&l==="c"||v.meta&&l==="c"){K();return}if(A){if(v.escape)T(!1),w("");return}if(v.escape){Y();return}let M=parseInt(l);if(M>=1&&M<=I.length){H(M-1);return}if(v.upArrow){z((k)=>k>0?k-1:I.length-1);return}if(v.downArrow||v.tab){z((k)=>k<I.length-1?k+1:0);return}if(v.return){if(b.multiSelect&&L.length>0)R(L);else H(B);return}if(l===" "&&b.multiSelect){let k=I[B];if(k&&k.value!=="__other__")W((D)=>D.includes(k.value)?D.filter((y)=>y!==k.value):[...D,k.value]);return}},{isActive:U&&G==="answering"&&!A}),FJ((l,v)=>{if(v.ctrl&&l==="c"||v.meta&&l==="c"){K();return}if(v.escape){Y();return}if(v.upArrow||v.downArrow||v.tab){P((M)=>M===0?1:0);return}if(v.return){if(S===0)t();else E();return}if(l.toLowerCase()==="y"){t();return}if(l.toLowerCase()==="e"){E();return}},{isActive:U&&G==="submit"}),G==="submit")return W0(Y1,{flexDirection:"column",borderStyle:"round",borderColor:U?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(Y1,{marginBottom:1,children:W0(Z1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W0(JX,{questions:$,answers:N},void 0,!1,void 0,this),W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:S===0?"yellow":void 0,bold:S===0,children:[S===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Z1,{color:S===1?"yellow":void 0,bold:S===1,children:[S===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(Y1,{marginTop:1,children:W0(Z1,{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(!b)return null;return W0(Y1,{flexDirection:"column",borderStyle:"round",borderColor:U?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(Y1,{marginBottom:1,children:[W0(Z1,{backgroundColor:"blue",color:"white",children:[" ",b.header," "]},void 0,!0,void 0,this),W0(Z1,{children:[" ",b.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A?W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),W0(Y1,{marginTop:1,children:[W0(Z1,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0(e5,{value:C,onChange:w,onSubmit:f,focus:U},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(Y1,{marginTop:1,children:W0(Z1,{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):W0(Y1,{flexDirection:"column",children:I.map((l,v)=>W0(QX,{option:l,index:v,isSelected:L.includes(l.value),isMultiSelect:b.multiSelect,isHighlighted:B===v},l.value,!1,void 0,this))},void 0,!1,void 0,this),!A&&W0(Y1,{marginTop:1,flexDirection:"column",children:[W0(Z1,{color:"gray",children:b.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),b.multiSelect&&L.length>0&&W0(Z1,{color:"green",children:["Selected: ",L.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&W0(Y1,{marginTop:1,children:W0(Z1,{color:"gray",children:["Question ",F+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as YX}from"node:path";import{Box as i$,Text as w1,useInput as ZX}from"ink";import XX from"ink-select-input";import{useEffect as rQ,useMemo as a$,useRef as AJ,useState as P2}from"react";function WJ($){return`${$.projectPath}\x00${$.sessionId}`}function LJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function BJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function wJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function bJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as x0}from"react/jsx-dev-runtime";function UX($){let Q=new Date($),J=new Date().getTime()-Q.getTime(),Z=Math.floor(J/86400000);if(Z===0)return`今天 ${Q.getHours().toString().padStart(2,"0")}:${Q.getMinutes().toString().padStart(2,"0")}`;if(Z===1)return"昨天";if(Z<7)return`${Z}天前`;return`${Q.getMonth()+1}/${Q.getDate()}`}function KX($){return YX($)}function GX($){switch($){case"queued":return"QUEUED";case"running":return"RUNNING";case"failed":return"FAILED";case"cancelled":return"CANCELLED";case"interrupted":return"INTERRUPTED";case"completed":return"DONE"}}var qX=({isSelected:$})=>x0(i$,{marginRight:1,children:x0(w1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),OX=({isSelected:$,label:Q})=>x0(w1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),W8=20,PJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=P2([]),[U,K]=P2(!1),[G,q]=P2(0),[F,O]=P2(!1),N=AJ(!1),_=AJ(!0);rQ(()=>{return _.current=!0,()=>{_.current=!1}},[]);let z=$1()==="session-selector",L=v0(!1);ZX((b,I)=>{if(I.ctrl&&b==="c"||I.meta&&b==="c"){L();return}if(N.current)return;if(I.escape&&J){J();return}if(I.leftArrow||b==="h"||b==="H"){if(G>0)q((R)=>R-1);return}if(I.rightArrow||b==="l"||b==="L"){if(G<C-1)q((R)=>R+1);return}},{isActive:z}),rQ(()=>{if(Q){X(Q);return}(async()=>{K(!0);try{let I=await y0.listSessions({includeSubagents:!1});X(I)}catch(I){console.error("[SessionSelector] Failed to load sessions:",I),X([])}finally{K(!1)}})()},[Q]);let W=a$(()=>wJ(Q||Z,$),[$,Q,Z]),A=a$(()=>bJ($),[$]),T=a$(()=>{return W.map((b)=>{let I=KX(b.taskSourceProjectPath??b.projectPath),R=UX(b.lastMessageTime),H=LJ(b),f=`[${GX(b.taskStatus)}]`,E=b.gitBranch?` (${b.gitBranch})`:"",t=b.hasErrors?" [!]":"",l=b.taskRetriedFrom?` ↻ retry:${b.taskRetriedFrom.sessionId.slice(0,6)}`:b.relationType==="subagent"?" ↳ subagent":b.relationType==="fork"?" ↳ fork":"",v=b.taskIsolation==="worktree"?` | wt:${b.taskWorktreeBranch??"managed"}`:b.taskIsolation==="local"?" | local":"",M=b.taskDiffStat?` | ${b.taskDiffStat.changedFiles} files +${b.taskDiffStat.additions} -${b.taskDiffStat.deletions}`:"",k=b.taskStatus==="queued"&&b.taskQueuePosition?` | queue:${b.taskQueuePosition}/${b.taskQueueDepth??b.taskQueuePosition}`:"",D=BJ(b);return{key:WJ(b),label:`${f} ${H} · ${R} | ${I}${E} | ${b.messageCount} 条消息${v}${k}${M}${D}${t}${l}`,value:b}})},[W]),C=a$(()=>Math.max(1,Math.ceil(T.length/W8)),[T.length]),w=a$(()=>{let b=G*W8;return T.slice(b,b+W8)},[T,G]),S=a$(()=>({start:G*W8+1,end:Math.min((G+1)*W8,T.length)}),[G,T.length]);rQ(()=>{q(0)},[W.length]);let P=(b)=>{if(N.current)return;N.current=!0,O(!0);let I=()=>{if(!_.current)return;N.current=!1,O(!1)};Promise.resolve().then(()=>Y(b.value)).then(I,I)};if(U)return x0(i$,{flexDirection:"column",paddingX:2,paddingY:1,children:x0(w1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(W.length===0)return x0(i$,{flexDirection:"column",paddingX:2,paddingY:1,children:[x0(w1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),x0(w1,{dimColor:!0,children:[`
154
+ `),z.push(DQ);let L=N0.renderedLineCount-U.length;z.push(O2(L))}z.push(I9),process.stdout.write(z.join("")),N0.renderedLineCount=U.length,N0.lastRenderedLines=U}function h1(){if(!N0.active)return;if(N0.renderedLineCount>0){let $=[];$.push(C9),$.push(O2(N0.renderedLineCount)),$.push("\r");for(let Q=0;Q<N0.renderedLineCount;Q++)if($.push(DQ),Q<N0.renderedLineCount-1)$.push(`
155
+ `);if(N0.renderedLineCount>1)$.push(O2(N0.renderedLineCount-1)),$.push("\r");$.push(I9),process.stdout.write($.join(""))}N0.active=!1,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.isFirstRender=!0}function T1(){return N0.active}import{Box as oZ,Text as S9}from"ink";import nZ from"react";import{jsxDEV as VQ}from"react/jsx-dev-runtime";var jQ=nZ.memo(({collapsedCount:$})=>{let Q=A0();if($<=0)return null;let Y=Q.colors.text.muted;return VQ(oZ,{flexDirection:"row",marginBottom:1,children:[VQ(S9,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),VQ(S9,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});jQ.displayName="CollapsedHistorySummary";import{Box as z8,Text as _8}from"ink";import tZ from"ink-big-text";import sZ from"ink-gradient";import eZ from"react";import{jsxDEV as L1}from"react/jsx-dev-runtime";var D9=eZ.memo(()=>{return L1(z8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[L1(z8,{flexDirection:"column",children:L1(sZ,{name:"pastel",children:L1(tZ,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(z8,{marginBottom:1,children:L1(_8,{color:"white",dimColor:!0,children:k9()},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(z8,{flexDirection:"column",marginBottom:1,children:[L1(z8,{marginBottom:1,children:L1(_8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(_8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),L1(_8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),L1(_8,{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 _2,Text as hQ}from"ink";import V9 from"react";import{jsxDEV as s1}from"react/jsx-dev-runtime";var j9=V9.memo(({tasks:$,visible:Q=!0,compact:Y=!1})=>{let{colors:J}=A0();if(!Q||$.length===0)return null;let Z={total:$.length,completed:$.filter((X)=>X.status==="completed").length,inProgress:$.filter((X)=>X.status==="in_progress").length};return s1(_2,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[s1(_2,{marginBottom:Y?0:1,children:[s1(hQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),s1(hQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s1(_2,{flexDirection:"column",children:$.map((X,U)=>s1($5,{task:X,compact:Y},X.id||U,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),$5=V9.memo(({task:$,compact:Q})=>{let Y,J=!1,Z;switch($.status){case"completed":Y="[OK]",J=!0,Z=$.subject;break;case"in_progress":Y=">",J=!1,Z=$.activeForm||$.subject;break;case"pending":default:Y="-",J=!0,Z=$.subject;break}return s1(_2,{paddingY:Q?0:0,children:s1(hQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as EQ,Text as d$}from"ink";import Q5,{useMemo as h9}from"react";import{jsxDEV as E1}from"react/jsx-dev-runtime";function J5($,Q=60){if(!$)return"";let Y=$.split(`
156
+ `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function Y5($){if(!$)return 0;return $.split(`
157
+ `).length}var gQ=Q5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=h9(()=>Y5($),[$]),X=h9(()=>J5($),[$]),U=J.colors.info,G=J.colors.muted;return E1(EQ,{flexDirection:"column",marginBottom:1,children:[E1(EQ,{flexDirection:"row",children:[E1(d$,{color:U,children:Y?"v":">"},void 0,!1,void 0,this),E1(d$,{children:" "},void 0,!1,void 0,this),E1(d$,{color:G,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&E1(d$,{color:G,children:[" - ",X]},void 0,!0,void 0,this),E1(d$,{color:G,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&E1(EQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:E1(d$,{color:G,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});gQ.displayName="ThinkingBlock";import{jsxDEV as a0}from"react/jsx-dev-runtime";var p9=X5.memo(()=>{let $=nQ(),Q=H4(),Y=W4(),J=L4(),Z=a1(),X=Y4(),U=G4(),G=y8(),K=N4(),q=F4(),F=tQ(),O=w4(),N=B4(),_=h$(),B=M9(),{stdout:z}=Z5(),L=d1(),[W,A]=mQ(null),[T,C]=mQ([]),[w,S]=mQ(new Set),P=$$(N),b=$$(null),I=$$(0),R=$$(0),H=$$(new Set),f=$$(new Set),E=$$([]),t=$$(null);g1(()=>{if(P.current!==N){if(T1())h1();if(z)z.write(N2.clearTerminal);L.incrementClearCount(),P.current=N}},[N,z,L]);let l=$,v=J;g1(()=>{if(!J||Z){t.current=null;return}if(t.current===J)return;if(t.current=J,T1())h1();if(z)z.write(N2.eraseScreen+N2.cursorTo(0,0));H.current=new Set,f.current=new Set(l.filter((h)=>h.role==="tool").map((h)=>h.id)),b.current=null,I.current=0,R.current=0,E.current=[],C([]),S(new Set),L.incrementClearCount(),L.clearFinalizingStreamingMessageId()},[J,Z,z,L,l]);let M=Q??J;g1(()=>{if(T1())h1();b.current=null,I.current=0,R.current=0,H.current=new Set,f.current=new Set(l.filter((h)=>h.role==="tool").map((h)=>h.id)),E.current=[],C([]),S(new Set)},[F]),g1(()=>{if(!M)return;if(b.current===M)return;b.current=M,I.current=0,R.current=0,f.current=new Set(l.filter((h)=>h.role==="tool").map((h)=>h.id)),E.current=[],C([])},[M,l]),g1(()=>{if(!M)return;let h=pQ(M);if(!h||h.length<=I.current)return;let x=h.slice(I.current);I.current=h.length;let V=x,i=E.current;if(i.length>0)if(V.some((B0)=>B0.type!=="empty"))V=[...i,...V],E.current=[];else{E.current=[...i,...V];return}let U0=V.length;while(U0>0&&V[U0-1].type==="empty")U0-=1;if(U0!==V.length)E.current=V.slice(U0),V=V.slice(0,U0);if(V.length===0)return;let q0=R.current;R.current+=1;let R0=q0>0;if(T1())h1();S((B0)=>{if(!M||B0.has(M))return B0;let s0=new Set(B0);return s0.add(M),s0}),C((B0)=>[...B0,a0(e1,{flexDirection:"column",children:a0(t1,{content:"",role:"assistant",terminalWidth:_,isPending:!1,hidePrefix:R0,noMargin:!0,blocksOverride:V,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${M}-${q0}`,!1,void 0,this)])},[M,Y.version,_,F]),g1(()=>{if(!M)return;let h=f.current,x=l.filter((V)=>V.role==="tool"&&!h.has(V.id)&&!H.current.has(V.id));if(x.length===0)return;if(T1())h1();for(let V of x)H.current.add(V.id);C((V)=>[...V,...x.map((i)=>a0(e1,{flexDirection:"column",children:a0(t1,{content:i.content,role:i.role,terminalWidth:_,metadata:i.metadata,isPending:!1,messageId:i.id},void 0,!1,void 0,this)},`streaming-tool-${i.id}`,!1,void 0,this))])},[M,l,_]),g1(()=>{if(!M){if(T1())h1();return}if(!T1())T9(_,B);else v9(_,B);let h=m9(M);if(!h||h.lines.length===0)return;let V=Math.max(1,B-8),i=Math.max(0,h.lines.length-V),U0=h.lines.slice(-V),q0=(pQ(M)?.length??0)>0;f9(U0,i,h.mode,q0)},[M,Y.version,B,_]),g1(()=>{if(!M&&T1())h1()},[M]),g1(()=>{if(W===null&&l.length>O){if(A(l.length),T1())h1();if(z)z.write(N2.clearTerminal);L.incrementClearCount()}},[l.length,O,W,z,L]);let k=g9(()=>{return X.some((h)=>h.status==="pending"||h.status==="in_progress")},[X]),D=N?0:W??0,y=D,g=g9(()=>{let h=[];if(h.push(a0(D9,{},"header",!1,void 0,this)),y>0)h.push(a0(jQ,{collapsedCount:y},"collapsed-summary",!1,void 0,this));for(let x=D;x<l.length;x++){let V=l[x];if(v&&V.id===v)continue;if(V.role==="tool"&&H.current.has(V.id))continue;if(V.role==="assistant"&&w.has(V.id))continue;h.push(a0(e1,{flexDirection:"column",children:a0(t1,{content:V.content,role:V.role,terminalWidth:_,metadata:V.metadata,isPending:!1,messageId:V.id},void 0,!1,void 0,this)},V.id,!1,void 0,this))}return h},[l,D,y,_,v,w]);return a0(e1,{flexDirection:"column",paddingX:2,children:a0(e1,{flexDirection:"column",children:[a0(E9,{items:g,children:(h)=>h},F,!1,void 0,this),K&&a0(e1,{marginBottom:1,children:a0(gQ,{content:K,isStreaming:Z,isExpanded:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),T.length>0&&a0(E9,{items:T,children:(h)=>h},`streaming-${F}`,!1,void 0,this),U&&k&&a0(e1,{marginTop:1,children:a0(j9,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.map((h,x)=>a0(e1,{flexDirection:"column",children:a0(t1,{content:h.displayText,role:"user",terminalWidth:_},void 0,!1,void 0,this)},`pending-${x}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as F2,useMount as U5}from"ahooks";import{Box as B1,Text as H0,useFocus as G5,useFocusManager as K5,useInput as q5}from"ink";import O5 from"ink-select-input";import{memo as z5,useMemo as _5,useState as H2}from"react";import{jsxDEV as $0,Fragment as H5}from"react/jsx-dev-runtime";var N5=({isSelected:$})=>$0(B1,{marginRight:1,children:$0(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),F5=({isSelected:$,label:Q})=>$0(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),c9=z5(({onClose:$,onEdit:Q})=>{let Y=K4(),J=R8()??"",{isFocused:Z}=G5({id:"model-selector"}),X=K5(),[U,G]=H2(""),[K,q]=H2(!1),[F,O]=H2(null),N=v0(!1),[_]=H2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});U5(()=>{if(X?.focus("model-selector"),Y.length>0)G(Y[0].id)}),q5((P,b)=>{if(K)return;if(b.ctrl&&P==="c"||b.meta&&P==="c"){N();return}if(b.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){z();return}if((P==="e"||P==="E")&&Q)L()},{isActive:!0});let B=F2(async(P)=>{if(K)return;let b=P.value;if(b===J){$();return}q(!0),O(null);try{await g0().setCurrentModel(b),$()}catch(I){O(I.message),q(!1)}}),z=F2(async()=>{if(K||U===J)return;q(!0),O(null);try{if(await g0().removeModel(U),Y.length<=1)$()}catch(P){O(P.message)}finally{q(!1)}}),L=F2(()=>{if(K||!Q)return;let P=Y.find((b)=>b.id===U);if(!P)return;Q(P)}),W=F2((P)=>{G(P.value)}),A=_5(()=>{return Y.find((P)=>P.id===U)},[Y,U]),T=A?W2()?.modelProviders[A.provider]:void 0,C=Y.map((P)=>{let b=P.id===J?" (当前)":"";return{label:cQ(P)+b,value:P.id}}),w=U===J;return $0(B1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[$0(B1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[$0(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),$0(H0,{dimColor:!0,children:[K?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(B1,{flexDirection:"row",children:[$0(B1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[$0(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),$0(B1,{marginTop:1,children:$0(O5,{items:C,onSelect:B,onHighlight:W,indicatorComponent:N5,itemComponent:F5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(B1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[$0(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),$0(B1,{marginY:1,children:$0(H0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A?$0(B1,{flexDirection:"column",children:[$0(H0,{children:[$0(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),$0(H0,{bold:!0,color:"cyan",children:cQ(A)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(H0,{children:[$0(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),$0(H0,{bold:!0,children:T?.name??A.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),T&&$0(H5,{children:[$0(H0,{children:[$0(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),$0(H0,{children:A.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(H0,{children:[$0(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),$0(H0,{children:T.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(H0,{children:[$0(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),$0(H0,{color:"blueBright",children:T.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(H0,{children:[$0(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),$0(H0,{bold:!0,children:A.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A.overrides?.baseUrl&&$0(H0,{children:[$0(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),$0(H0,{color:"blueBright",children:A.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(H0,{children:[$0(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),$0(H0,{children:S1().resolveConfig(A).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):$0(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F&&$0(B1,{marginTop:1,children:$0(H0,{color:"red",children:F},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(B1,{justifyContent:"center",marginTop:1,children:$0(H0,{dimColor:!0,children:"─".repeat(_)},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(B1,{justifyContent:"center",children:$0(H0,{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 uQ}from"ahooks";import{Box as h5,Text as xQ,useInput as E5}from"ink";import{useState as P$}from"react";import{Box as b$,Text as m1,useInput as W5}from"ink";import L5 from"ink-text-input";import{jsxDEV as o0}from"react/jsx-dev-runtime";var u9=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return W5((U,G)=>{if(G.escape)Z()}),o0(b$,{flexDirection:"column",children:[o0(b$,{marginBottom:1,children:o0(m1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(b$,{marginBottom:1,children:o0(m1,{children:["Provider: ",o0(m1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o0(b$,{marginBottom:1,children:o0(m1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(b$,{children:[o0(m1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),o0(L5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&o0(b$,{marginTop:1,children:o0(m1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(b$,{marginTop:1,children:o0(m1,{dimColor:!0,children:["输入完成后按 ",o0(m1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",o0(m1,{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 L2,Text as Q$,useInput as B5}from"ink";import w5 from"ink-text-input";import{useState as B2}from"react";import{jsxDEV as z1}from"react/jsx-dev-runtime";var w2=["id","name","baseUrl","model"];function x9($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function b5($,Q,Y){switch($){case"id":return"team-gateway";case"name":return Y||"Team Gateway";case"baseUrl":return Q==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return Q==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function A5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=d9(Y,J);if(!$.model.trim())Z.push("Model ID must not be empty");if(Z.length>0)throw Error(Z[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:J}}var r9=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,U]=B2(Q?3:0),[G,K]=B2(Q?.model??""),[q,F]=B2(Z),[O,N]=B2(),_=w2[X];B5((z,L)=>{if(!L.escape)return;if(N(void 0),X===0){J();return}let W=X-1,A=w2[W];U(W),K(q[A])});let B=(z)=>{let L=z.trim();if(_==="id"&&!l9.test(L)){N("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(_==="baseUrl")try{let A=new URL(L);if(!["http:","https:"].includes(A.protocol))throw Error()}catch{N("Base URL 必须是绝对 HTTP(S) URL");return}if(_==="model"&&!L){N("Model ID 不能为空");return}let W={...q,[_]:_==="name"&&!L?q.id:L};if(F(W),N(void 0),X===w2.length-1){try{Y(A5(W,$))}catch(A){N(A instanceof Error?A.message:"渠道配置无效")}return}U(X+1),K("")};return z1(L2,{flexDirection:"column",children:[z1(L2,{marginBottom:1,children:z1(Q$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z1(Q$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),w2.slice(0,X).map((z)=>z1(Q$,{children:[x9(z),": ",z1(Q$,{color:"cyan",children:q[z]},void 0,!1,void 0,this)]},z,!0,void 0,this)),z1(L2,{marginTop:1,children:[z1(Q$,{bold:!0,children:[x9(_),": "]},void 0,!0,void 0,this),z1(w5,{value:G,onChange:(z)=>{K(z),N(void 0)},onSubmit:B,placeholder:b5(_,$,q.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_==="name"&&z1(Q$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&z1(Q$,{color:"red",children:O},void 0,!1,void 0,this),z1(L2,{marginTop:1,children:z1(Q$,{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 o9,useState as r$}from"react";var n9=()=>{let[$,Q]=r$([]),[Y,J]=r$(!0),[Z,X]=r$(null);return o9(()=>{(async()=>{try{Q(await a9())}catch(G){X(G instanceof Error?G.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},t9=($)=>{let[Q,Y]=r$([]),[J,Z]=r$(!1),[X,U]=r$(null);return o9(()=>{if(!$){Y([]);return}(async()=>{Z(!0),U(null);try{Y(await i9($))}catch(K){U(K instanceof Error?K.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as p1,Text as y1,useInput as P5}from"ink";import R5 from"ink-select-input";import y5 from"ink-text-input";import{useMemo as s9,useState as M5}from"react";import{jsxDEV as E0,Fragment as v5}from"react/jsx-dev-runtime";var C5=({isSelected:$})=>E0(p1,{marginRight:1,children:E0(y1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),I5=($)=>{let Q=[$.name];if($.contextWindow){let Y=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;Q.push(`[${Y} ctx]`)}if($.reasoning)Q.push("[reasoning]");if($.input.includes("image"))Q.push("[vision]");if($.cost.input||$.cost.output)Q.push(`[$${$.cost.input}/$${$.cost.output}]`);return Q.join(" ")},T5=({isSelected:$,label:Q})=>E0(y1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),e9=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[U,G]=M5("");P5((F,O)=>{if(O.escape)if(U)G("");else X()});let K=s9(()=>{if(!U)return Q;let F=U.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(F)||O.id.toLowerCase().includes(F))},[Q,U]),q=s9(()=>K.map((F)=>({key:F.id,label:I5(F),value:F})),[K]);if(Y)return E0(p1,{flexDirection:"column",children:E0(y1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return E0(p1,{flexDirection:"column",children:[E0(y1,{color:"red",children:J},void 0,!1,void 0,this),E0(y1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E0(p1,{flexDirection:"column",children:[E0(p1,{marginBottom:1,children:E0(y1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(p1,{marginBottom:1,children:E0(y1,{children:["Provider: ",E0(y1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E0(v5,{children:[E0(p1,{marginBottom:1,children:[E0(y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),E0(y5,{value:U,onChange:G,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(p1,{marginBottom:1,children:E0(y1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(p1,{flexDirection:"column",height:12,children:E0(R5,{items:q,onSelect:(F)=>Z(F.value),indicatorComponent:C5,itemComponent:T5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&E0(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 A$,Text as J$,useInput as f5}from"ink";import S5 from"ink-select-input";import k5 from"ink-text-input";import{useMemo as $J,useState as D5}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var V5=({isSelected:$})=>n0(A$,{marginRight:1,children:n0(J$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),j5=({isSelected:$,label:Q})=>n0(J$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),QJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,U]=D5("");f5((q,F)=>{if(F.escape)if(X)U("");else Z()});let G=$J(()=>{if(!X)return $;let q=X.toLowerCase();return $.filter((F)=>F.name.toLowerCase().includes(q)||F.id.toLowerCase().includes(q))},[$,X]),K=$J(()=>G.map((q)=>({key:q.id,label:`${q.name} - ${q.modelCount} models${q.configured?" [configured]":""}`,value:q})),[G]);if(Q)return n0(A$,{flexDirection:"column",children:n0(J$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(A$,{flexDirection:"column",children:[n0(J$,{color:"red",children:Y},void 0,!1,void 0,this),n0(J$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(A$,{flexDirection:"column",children:[n0(A$,{marginBottom:1,children:n0(J$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(A$,{marginBottom:1,children:[n0(J$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(k5,{value:X,onChange:U,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(A$,{flexDirection:"column",height:12,children:n0(S5,{items:K,onSelect:(q)=>J(q.value),indicatorComponent:V5,itemComponent:j5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&n0(J$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function JJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as Y$}from"react/jsx-dev-runtime";var lQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,U]=P$("provider"),[G,K]=P$(),[q,F]=P$(),[O,N]=P$(),[_,B]=P$(""),[z,L]=P$(),[W,A]=P$(!1),T=n9(),C=t9(G?.id),w=v0(!1);E5((I,R)=>{if(R.ctrl&&I==="c"||R.meta&&I==="c")$==="setup"?w():Z()});let S=uQ(async(I)=>{if(!G)return;let R=O??(q?{provider:G.id,model:q.id,displayName:Q?.displayName}:void 0);if(!R)return;A(!0),L(void 0);try{if(R.modelProvider)S1().registerModelProvider(R.provider,R.modelProvider,[R.model]);if(I?.trim())await S1().setApiKey(R.provider,I.trim());let H={displayName:R.displayName,provider:R.provider,model:R.model,overrides:R.overrides};if($==="setup")await J(R);else if($==="add"){let f=R.modelProvider?await g0().addModelWithProvider(H,R.modelProvider):await g0().addModel(H);await g0().setCurrentModel(f.id),await J(R)}else if(Y){if(R.modelProvider)await g0().updateModelWithProvider(Y,H,R.modelProvider);else await g0().updateModel(Y,H);await J(R)}}catch(H){if(R.modelProvider){await S1().credentials.delete(R.provider);let f=W2();S1().configureModelProviders(f?.modelProviders??{},f?.models??[])}L(H instanceof Error?H.message:"保存配置失败"),A(!1)}}),P=uQ((I)=>{if(F(I),G?.configured)S();else if(G?.supportsApiKey)U("credential");else L(`${G?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),b=uQ(()=>{if(L(void 0),X==="credential"&&O){U("custom");return}let I=JJ(X);if(I)U(I)});return Y$(h5,{flexDirection:"column",padding:1,children:[Y$(xQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&Y$(QJ,{...T,onSelect:(I)=>{K(I),F(void 0),N(void 0),U(I.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&G?.factoryWireApi&&Y$(r9,{wireApi:G.factoryWireApi,initialConfig:O,onSubmit:(I)=>{N(I),U("credential")},onCancel:b},void 0,!1,void 0,this),X==="model"&&G&&Y$(e9,{provider:G,...C,onSelect:P,onCancel:b},void 0,!1,void 0,this),X==="credential"&&G&&Y$(u9,{provider:G,value:_,onChange:B,onSubmit:()=>void S(_),onCancel:b,error:z},void 0,!1,void 0,this),W&&Y$(xQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),z&&X!=="credential"&&Y$(xQ,{color:"red",children:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as N8}from"ahooks";import{promises as UJ}from"fs";import{Box as _1,Text as D0,useInput as g5}from"ink";import YJ from"ink-select-input";import m5 from"ink-text-input";import p5 from"os";import b2 from"path";import{useEffect as c5,useMemo as A2,useRef as u5,useState as Z$}from"react";import{jsxDEV as K0}from"react/jsx-dev-runtime";var F8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],x5={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},l5={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},ZJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},d5=["project","global","local"],r5={allow:[],ask:[],deny:[]},a5={localExists:!1,projectExists:!1,globalExists:!1},XJ={allow:[],ask:[],deny:[]};function i5($){let Q=(J)=>Array.isArray(J)?J.filter((Z)=>typeof Z==="string"):[],Y=$?.permissions??{};return{allow:Q(Y?.allow),ask:Q(Y?.ask),deny:Q(Y?.deny)}}async function o5($){try{let Q=await UJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:i5(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...XJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...XJ}}}}function n5($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${ZJ[Q]} <- 可删除`:ZJ[Q];return`${Y} ${J}`}var GJ=({onClose:$})=>{let Y=$1()==="permissions-manager",J=v0(!1),[Z,X]=Z$(0),U=F8[Z].key,[G,K]=Z$(r5),[q,F]=Z$(a5),[O,N]=Z$(!0),[_,B]=Z$("list"),[z,L]=Z$(""),[W,A]=Z$(null),[T,C]=Z$(null),w=u5(!1),S=A2(()=>b2.join(u0(),".blade","settings.local.json"),[]),P=A2(()=>b2.join(u0(),".blade","settings.json"),[]),b=A2(()=>b2.join(p5.homedir(),".blade","settings.json"),[]),I=N8(async()=>{N(!0);let x=await Promise.all([{source:"local",path:S},{source:"project",path:P},{source:"global",path:b}].map(async({source:q0,path:R0})=>{let B0=await o5(R0);return{source:q0,path:R0,...B0}})),V={localExists:x.find((q0)=>q0.source==="local")?.exists??!1,projectExists:x.find((q0)=>q0.source==="project")?.exists??!1,globalExists:x.find((q0)=>q0.source==="global")?.exists??!1};F(V);let i={allow:[],ask:[],deny:[]},U0=Object.fromEntries(x.map((q0)=>[q0.source,q0]));["allow","ask","deny"].forEach((q0)=>{d5.forEach((R0)=>{(U0[R0]?.permissions[q0]??[]).forEach((s0,k0)=>{let F1={key:`${R0}:${k0}:${s0}`,rule:s0,source:R0};i[q0].push(F1)})})}),K(i),N(!1)});c5(()=>{I()},[I]);let R=N8(async(h,x)=>{try{let V=b2.join(u0(),".blade","settings.local.json"),i={allow:[],ask:[],deny:[]};try{let q0=await UJ.readFile(V,"utf-8"),B0=JSON.parse(q0).permissions||{};i={allow:Array.isArray(B0.allow)?B0.allow:[],ask:Array.isArray(B0.ask)?B0.ask:[],deny:Array.isArray(B0.deny)?B0.deny:[]}}catch(q0){}let U0=x(i);await g0().updateConfig({permissions:U0},{scope:"local",immediate:!0}),await I()}catch(V){throw console.error("[PermissionsManager] 修改权限规则失败:",V),V}});g5((h,x)=>{if(x.ctrl&&h==="c"||x.meta&&h==="c"){J();return}if(_==="locked"){if(w.current){w.current=!1;return}B("list"),A(null),C(null);return}if(x.escape){if(_==="list"||U==="info")$();else B("list"),L(""),A(null),C(null);return}if(_==="list"){if(x.tab&&x.shift)X((V)=>(V-1+F8.length)%F8.length);else if(x.tab)X((V)=>(V+1)%F8.length);else if(h?.toLowerCase()==="q")$()}},{isActive:Y});let H=N8((h)=>{let x=h.value;if(U==="info")return;if(x.type==="add"){B("add"),L(""),C(null);return}if(x.entry.source!=="local"){B("locked"),w.current=!0,A({tab:U,entry:x.entry}),C({type:"error",text:x.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}B("confirm-delete"),A({tab:U,entry:x.entry}),C(null)}),f=N8(async()=>{if(U==="info")return;let h=z.trim();if(!h){C({type:"error",text:"Permission rule 不能为空"});return}if(G[U].map((V)=>V.rule).includes(h)){C({type:"error",text:"该规则已存在"});return}try{await R(U,(V)=>{let i={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return i[U]=[...new Set([...V[U],h])],i}),B("list"),L(""),C({type:"success",text:"已添加本地权限规则"})}catch(V){C({type:"error",text:`保存失败: ${V instanceof Error?V.message:"未知错误"}`})}}),E=N8(async()=>{if(!W)return;let{tab:h,entry:x}=W;try{await R(h,(V)=>{let i={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return i[h]=V[h].filter((U0)=>U0!==x.rule),i}),B("list"),A(null),C({type:"success",text:"已删除本地权限规则"})}catch(V){C({type:"error",text:`删除失败: ${V instanceof Error?V.message:"未知错误"}`})}}),t=A2(()=>{if(U==="info")return[];let h=U;return[{key:"add-new-rule",label:`› ${x5[h]}`,value:{type:"add"}},...G[h].map((V)=>({key:V.key,label:n5(V.rule,V.source),value:{type:"rule",entry:V}}))]},[U,G]),l=()=>K0(_1,{marginBottom:1,children:F8.map((h,x)=>K0(_1,{marginRight:2,children:K0(D0,{color:x===Z?"yellow":"gray",children:["[",h.label,"]"]},void 0,!0,void 0,this)},h.key,!1,void 0,this))},void 0,!1,void 0,this),v=()=>K0(_1,{flexDirection:"column",gap:1,children:[K0(D0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),K0(_1,{flexDirection:"column",marginLeft:2,children:[K0(D0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",q.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),K0(D0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",q.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),K0(D0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",q.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K0(D0,{children:"说明:"},void 0,!1,void 0,this),K0(_1,{flexDirection:"column",marginLeft:2,children:[K0(D0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),K0(D0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),K0(D0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),M=(h)=>K0(_1,{flexDirection:"column",gap:1,children:[K0(D0,{bold:!0,children:l5[h]},void 0,!1,void 0,this),K0(D0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),K0(D0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),K0(_1,{marginTop:1,children:K0(m5,{value:z,onChange:L,onSubmit:f},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0(D0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k=(h,x)=>K0(_1,{flexDirection:"column",gap:1,children:[K0(D0,{bold:!0,children:["Delete ",h," permission rule?"]},void 0,!0,void 0,this),K0(D0,{children:x.rule},void 0,!1,void 0,this),K0(D0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),K0(D0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),K0(YJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(V)=>{if(V.value==="yes")E();else B("list"),A(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D=(h)=>K0(_1,{flexDirection:"column",gap:1,children:[K0(D0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),K0(D0,{children:h.rule},void 0,!1,void 0,this),K0(D0,{color:"gray",children:h.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),K0(D0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y=(h)=>K0(YJ,{items:t,isFocused:_==="list",onSelect:H},void 0,!1,void 0,this),g=()=>{if(O)return K0(D0,{children:"加载中..."},void 0,!1,void 0,this);if(U==="info")return v();if(_==="add")return M(U);if(_==="confirm-delete"&&W)return k(W.tab,W.entry);if(_==="locked"&&W)return D(W.entry);return y(U)};return K0(_1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[K0(D0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),l(),K0(_1,{flexDirection:"column",gap:1,children:g()},void 0,!1,void 0,this),T&&K0(_1,{marginTop:1,children:K0(D0,{color:T.type==="success"?"green":"red",children:T.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0(_1,{marginTop:1,children:K0(D0,{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 w0,Text as Y0,useInput as t5}from"ink";import{useEffect as s5,useState as R$}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var dQ=["local","project","global"];function FJ({workspaceRoot:$,onCancel:Q}){let Y=qJ($),J=Y.getAll(),[Z,X]=R$(0),[U,G]=R$(!1),[K,q]=R$(""),[F,O]=R$(null),[N,_]=R$("local"),[B,z]=R$(null),[L,W]=R$(0),A=Y.getBySource(),T=Y.getStats(),C=Y.getSourcePolicy(),w=v0(!1,Q);s5(()=>{let H=!0;return KJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((f)=>{if(H)z(f.settings)}).catch((f)=>{if(H)q(f instanceof Error?f.message:"无法读取插件作用域配置")}),()=>{H=!1}},[Y,L]);let S=()=>{_((H)=>{let f=dQ.indexOf(H);return dQ[(f+1)%dQ.length]}),O(null)},P=async()=>{let H=J[Z];if(!H||U)return;if(H.source==="cli"){q(`${H.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(H.status==="error"){q(H.error??`${H.manifest.name} 当前不可用`);return}G(!0),q("");try{let f=await OJ(Y.getWorkspaceRoot(),H.manifest.name,H.status!=="active",N);q(f.effectiveEnabled?`已启用 ${H.manifest.name} · 生效层级 ${f.effectiveScope}`:`已禁用 ${H.manifest.name} · 生效层级 ${f.effectiveScope}`),W((E)=>E+1)}catch(f){q(f instanceof Error?f.message:String(f))}finally{G(!1)}},b=async()=>{if(U)return;G(!0),q("");try{await zJ(Y.getWorkspaceRoot()),X(0),q("插件列表已刷新"),W((H)=>H+1)}catch(H){q(H instanceof Error?H.message:String(H))}finally{G(!1)}},I=async()=>{let H=J[Z];if(!H||U)return;if(!H.installation){q(`${H.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}G(!0),O(null),q("");try{let{result:f}=await _J(Y.getWorkspaceRoot(),H.manifest.name,{trusted:!0});if(!f.success)throw Error(f.error);q(f.changed?`已更新 ${H.manifest.name} 到 ${f.installation?.revision}`:`${H.manifest.name} 已是最新版本`),W((E)=>E+1)}catch(f){q(f instanceof Error?f.message:String(f))}finally{G(!1)}},R=async()=>{let H=J[Z];if(!H||U)return;if(!H.installation){q(`${H.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(F!==H.manifest.name){O(H.manifest.name),q(`再次按 x 确认卸载 ${H.manifest.name}`);return}G(!0),q("");try{let{result:f}=await NJ(Y.getWorkspaceRoot(),H.manifest.name,!0);if(!f.success)throw Error(f.error);O(null),X(0),q(`已卸载 ${H.manifest.name}`),W((E)=>E+1)}catch(f){q(f instanceof Error?f.message:String(f))}finally{G(!1)}};if(t5((H,f)=>{if(f.escape)Q?.();else if(f.ctrl&&H==="c"||f.meta&&H==="c")w();else if((f.upArrow||H==="k")&&J.length>0)O(null),X((E)=>(E-1+J.length)%J.length);else if((f.downArrow||H==="j")&&J.length>0)O(null),X((E)=>(E+1)%J.length);else if(H===" "||f.return)P();else if(H==="r")b();else if(H==="s")S();else if(H==="u")I();else if(H==="x")R()}),J.length===0)return c(w0,{flexDirection:"column",paddingY:1,children:[c(w0,{marginBottom:1,children:c(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[c(Y0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{marginTop:1,paddingLeft:2,children:c(Y0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(Y0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return c(w0,{flexDirection:"column",paddingY:1,children:[c(w0,{marginBottom:1,children:[c(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),c(Y0,{color:"gray",children:[" (共 ",T.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{paddingLeft:2,marginBottom:1,children:c(Y0,{color:"gray",children:["启用: ",T.active," | 禁用: ",T.inactive," | 命令: ",T.commands," | 技能:"," ",T.skills," | 代理: ",T.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,marginBottom:1,children:c(Y0,{color:"gray",children:["来源策略: ",C.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",C.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,marginBottom:1,children:c(Y0,{color:"gray",children:["写入层级: ",c(Y0,{color:"cyan",children:N},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),A.cli.length>0&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(w0,{paddingLeft:1,children:[c(Y0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),c(Y0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A.cli.map((H)=>{let f=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return c(w0,{flexDirection:"column",paddingLeft:2,children:[c(Y0,{children:[c(Y0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",H.manifest.name]},void 0,!0,void 0,this),c(Y0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&c(w0,{paddingLeft:2,children:c(Y0,{color:"blue",children:["命令:"," ",H.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),A.project.length>0&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(w0,{paddingLeft:1,children:[c(Y0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),c(Y0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A.project.map((H)=>{let f=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return c(w0,{flexDirection:"column",paddingLeft:2,children:[c(Y0,{children:[c(Y0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",H.manifest.name]},void 0,!0,void 0,this),c(Y0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[H.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&c(w0,{paddingLeft:2,children:c(Y0,{color:"blue",children:["命令:"," ",H.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),A.user.length>0&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(w0,{paddingLeft:1,children:[c(Y0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),c(Y0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A.user.map((H)=>{let f=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return c(w0,{flexDirection:"column",paddingLeft:2,children:[c(Y0,{children:[c(Y0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",f," ",H.manifest.name]},void 0,!0,void 0,this),c(Y0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,children:c(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[H.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&c(w0,{paddingLeft:2,children:c(Y0,{color:"blue",children:["命令:"," ",H.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),c(w0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[c(Y0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),c(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{marginTop:1,children:c(Y0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&c(w0,{marginTop:1,children:c(Y0,{color:K.includes("失败")?"red":"cyan",children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&c(Y0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as Y1,Text as Z1,useInput as HJ,useStdout as e5}from"ink";import $X from"ink-text-input";import rQ,{useCallback as H8,useMemo as QX,useState as X$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var JX=rQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>W0(Y1,{flexDirection:"column",marginBottom:1,children:[W0(Z1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),W0(Y1,{marginLeft:4,children:W0(Z1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),YX=rQ.memo(({questions:$,answers:Q})=>W0(Y1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return W0(Y1,{marginBottom:1,children:[W0(Z1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),W0(Z1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),WJ=rQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=e5(),Z=J.columns||80,U=$1()==="confirmation-prompt",G=v0(!1),[K,q]=X$("answering"),[F,O]=X$(0),[N,_]=X$({}),[B,z]=X$(0),[L,W]=X$([]),[A,T]=X$(!1),[C,w]=X$(""),[S,P]=X$(0),b=$[F],I=QX(()=>{if(!b)return[];return[...b.options.map((l)=>({label:l.label,value:l.label,description:l.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[b]),R=H8((l)=>{let v={...N,[b.header]:l};if(_(v),F<$.length-1)O(F+1),z(0),W([]),T(!1),w("");else q("submit"),P(0)},[N,b?.header,F,$.length]),H=H8((l)=>{let v=I[l];if(!v)return;if(v.value==="__other__"){T(!0);return}if(b.multiSelect)W((M)=>M.includes(v.value)?M.filter((k)=>k!==v.value):[...M,v.value]);else R(v.value)},[I,b?.multiSelect,R]),f=H8((l)=>{if(l.trim())R(l.trim())},[R]),E=H8(()=>{q("answering"),O(0),z(0),W([]),T(!1)},[]),t=H8(()=>{Q(N)},[N,Q]);if(HJ((l,v)=>{if(v.ctrl&&l==="c"||v.meta&&l==="c"){G();return}if(A){if(v.escape)T(!1),w("");return}if(v.escape){Y();return}let M=parseInt(l);if(M>=1&&M<=I.length){H(M-1);return}if(v.upArrow){z((k)=>k>0?k-1:I.length-1);return}if(v.downArrow||v.tab){z((k)=>k<I.length-1?k+1:0);return}if(v.return){if(b.multiSelect&&L.length>0)R(L);else H(B);return}if(l===" "&&b.multiSelect){let k=I[B];if(k&&k.value!=="__other__")W((D)=>D.includes(k.value)?D.filter((y)=>y!==k.value):[...D,k.value]);return}},{isActive:U&&K==="answering"&&!A}),HJ((l,v)=>{if(v.ctrl&&l==="c"||v.meta&&l==="c"){G();return}if(v.escape){Y();return}if(v.upArrow||v.downArrow||v.tab){P((M)=>M===0?1:0);return}if(v.return){if(S===0)t();else E();return}if(l.toLowerCase()==="y"){t();return}if(l.toLowerCase()==="e"){E();return}},{isActive:U&&K==="submit"}),K==="submit")return W0(Y1,{flexDirection:"column",borderStyle:"round",borderColor:U?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(Y1,{marginBottom:1,children:W0(Z1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W0(YX,{questions:$,answers:N},void 0,!1,void 0,this),W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:S===0?"yellow":void 0,bold:S===0,children:[S===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Z1,{color:S===1?"yellow":void 0,bold:S===1,children:[S===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(Y1,{marginTop:1,children:W0(Z1,{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(!b)return null;return W0(Y1,{flexDirection:"column",borderStyle:"round",borderColor:U?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(Y1,{marginBottom:1,children:[W0(Z1,{backgroundColor:"blue",color:"white",children:[" ",b.header," "]},void 0,!0,void 0,this),W0(Z1,{children:[" ",b.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A?W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),W0(Y1,{marginTop:1,children:[W0(Z1,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0($X,{value:C,onChange:w,onSubmit:f,focus:U},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(Y1,{marginTop:1,children:W0(Z1,{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):W0(Y1,{flexDirection:"column",children:I.map((l,v)=>W0(JX,{option:l,index:v,isSelected:L.includes(l.value),isMultiSelect:b.multiSelect,isHighlighted:B===v},l.value,!1,void 0,this))},void 0,!1,void 0,this),!A&&W0(Y1,{marginTop:1,flexDirection:"column",children:[W0(Z1,{color:"gray",children:b.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),b.multiSelect&&L.length>0&&W0(Z1,{color:"green",children:["Selected: ",L.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&W0(Y1,{marginTop:1,children:W0(Z1,{color:"gray",children:["Question ",F+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as ZX}from"node:path";import{Box as i$,Text as w1,useInput as XX}from"ink";import UX from"ink-select-input";import{useEffect as aQ,useMemo as a$,useRef as PJ,useState as P2}from"react";function LJ($){return`${$.projectPath}\x00${$.sessionId}`}function BJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function wJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function bJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function AJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as x0}from"react/jsx-dev-runtime";function GX($){let Q=new Date($),J=new Date().getTime()-Q.getTime(),Z=Math.floor(J/86400000);if(Z===0)return`今天 ${Q.getHours().toString().padStart(2,"0")}:${Q.getMinutes().toString().padStart(2,"0")}`;if(Z===1)return"昨天";if(Z<7)return`${Z}天前`;return`${Q.getMonth()+1}/${Q.getDate()}`}function KX($){return ZX($)}function qX($){switch($){case"queued":return"QUEUED";case"running":return"RUNNING";case"failed":return"FAILED";case"cancelled":return"CANCELLED";case"interrupted":return"INTERRUPTED";case"completed":return"DONE"}}var OX=({isSelected:$})=>x0(i$,{marginRight:1,children:x0(w1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),zX=({isSelected:$,label:Q})=>x0(w1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),W8=20,RJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=P2([]),[U,G]=P2(!1),[K,q]=P2(0),[F,O]=P2(!1),N=PJ(!1),_=PJ(!0);aQ(()=>{return _.current=!0,()=>{_.current=!1}},[]);let z=$1()==="session-selector",L=v0(!1);XX((b,I)=>{if(I.ctrl&&b==="c"||I.meta&&b==="c"){L();return}if(N.current)return;if(I.escape&&J){J();return}if(I.leftArrow||b==="h"||b==="H"){if(K>0)q((R)=>R-1);return}if(I.rightArrow||b==="l"||b==="L"){if(K<C-1)q((R)=>R+1);return}},{isActive:z}),aQ(()=>{if(Q){X(Q);return}(async()=>{G(!0);try{let I=await y0.listSessions({includeSubagents:!1});X(I)}catch(I){console.error("[SessionSelector] Failed to load sessions:",I),X([])}finally{G(!1)}})()},[Q]);let W=a$(()=>bJ(Q||Z,$),[$,Q,Z]),A=a$(()=>AJ($),[$]),T=a$(()=>{return W.map((b)=>{let I=KX(b.taskSourceProjectPath??b.projectPath),R=GX(b.lastMessageTime),H=BJ(b),f=`[${qX(b.taskStatus)}]`,E=b.gitBranch?` (${b.gitBranch})`:"",t=b.hasErrors?" [!]":"",l=b.taskRetriedFrom?` ↻ retry:${b.taskRetriedFrom.sessionId.slice(0,6)}`:b.relationType==="subagent"?" ↳ subagent":b.relationType==="fork"?" ↳ fork":"",v=b.taskIsolation==="worktree"?` | wt:${b.taskWorktreeBranch??"managed"}`:b.taskIsolation==="local"?" | local":"",M=b.taskDiffStat?` | ${b.taskDiffStat.changedFiles} files +${b.taskDiffStat.additions} -${b.taskDiffStat.deletions}`:"",k=b.taskStatus==="queued"&&b.taskQueuePosition?` | queue:${b.taskQueuePosition}/${b.taskQueueDepth??b.taskQueuePosition}`:"",D=wJ(b);return{key:LJ(b),label:`${f} ${H} · ${R} | ${I}${E} | ${b.messageCount} 条消息${v}${k}${M}${D}${t}${l}`,value:b}})},[W]),C=a$(()=>Math.max(1,Math.ceil(T.length/W8)),[T.length]),w=a$(()=>{let b=K*W8;return T.slice(b,b+W8)},[T,K]),S=a$(()=>({start:K*W8+1,end:Math.min((K+1)*W8,T.length)}),[K,T.length]);aQ(()=>{q(0)},[W.length]);let P=(b)=>{if(N.current)return;N.current=!0,O(!0);let I=()=>{if(!_.current)return;N.current=!1,O(!1)};Promise.resolve().then(()=>Y(b.value)).then(I,I)};if(U)return x0(i$,{flexDirection:"column",paddingX:2,paddingY:1,children:x0(w1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(W.length===0)return x0(i$,{flexDirection:"column",paddingX:2,paddingY:1,children:[x0(w1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),x0(w1,{dimColor:!0,children:[`
158
158
  `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return x0(i$,{flexDirection:"column",paddingX:2,paddingY:1,children:[x0(w1,{bold:!0,color:"cyan",children:A.title},void 0,!1,void 0,this),x0(w1,{dimColor:!0,children:[`
159
159
  `,A.instructions,`
160
- `]},void 0,!0,void 0,this),x0(XX,{items:w,onSelect:P,isFocused:z&&!F,indicatorComponent:qX,itemComponent:OX},void 0,!1,void 0,this),F&&x0(w1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),x0(i$,{marginTop:1,flexDirection:"column",children:[x0(w1,{dimColor:!0,children:["第 ",G+1,"/",C," 页 · 共 ",W.length," 个会话 · 显示"," ",S.start,"-",S.end]},void 0,!0,void 0,this),C>1&&x0(i$,{marginTop:1,children:[x0(w1,{color:G>0?"cyan":"gray",children:G>0?"<< 上一页":" "},void 0,!1,void 0,this),x0(w1,{children:" "},void 0,!1,void 0,this),x0(w1,{color:G<C-1?"cyan":"gray",children:G<C-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 m0,Text as T0,useInput as zX}from"ink";import{jsxDEV as Q0}from"react/jsx-dev-runtime";function yJ({onCancel:$}){let Q=M1(),J=RJ({cwd:Q}).getAll(),Z=J.filter((G)=>G.source==="builtin"),X=J.filter((G)=>G.source==="user"),U=J.filter((G)=>G.source==="project"),K=v0(!1,$);if(zX((G,q)=>{if(q.escape)$?.();else if(q.ctrl&&G==="c"||q.meta&&G==="c")K()}),J.length===0)return Q0(m0,{flexDirection:"column",paddingY:1,children:[Q0(m0,{marginBottom:1,children:Q0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0(m0,{marginTop:1,paddingLeft:2,children:Q0(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0(m0,{marginTop:1,children:Q0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Q0(m0,{flexDirection:"column",paddingY:1,children:[Q0(m0,{marginBottom:1,children:[Q0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),Q0(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U.length>0&&Q0(m0,{flexDirection:"column",marginBottom:1,children:[Q0(m0,{paddingLeft:1,children:[Q0(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),Q0(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((G)=>{let F=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Q0(m0,{flexDirection:"column",paddingLeft:2,children:[Q0(T0,{children:[Q0(T0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Q0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&Q0(m0,{flexDirection:"column",marginBottom:1,children:[Q0(m0,{paddingLeft:1,children:[Q0(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),Q0(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((G)=>{let F=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Q0(m0,{flexDirection:"column",paddingLeft:2,children:[Q0(T0,{children:[Q0(T0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Q0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&Q0(m0,{flexDirection:"column",marginBottom:1,children:[Q0(m0,{paddingLeft:1,children:[Q0(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),Q0(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((G)=>{let F=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Q0(m0,{flexDirection:"column",paddingLeft:2,children:[Q0(T0,{children:[Q0(T0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Q0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.userInvocable&&Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"blue",children:["命令: /",G.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q0(m0,{marginTop:1,children:Q0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as MJ,Text as c1}from"ink";import _X,{useEffect as NX,useMemo as FX,useState as CJ}from"react";import{jsxDEV as N1,Fragment as TJ}from"react/jsx-dev-runtime";var IJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function HX($){let Q=Math.floor($/1000);if(Q<60)return`${Q}s`;let Y=Math.floor(Q/60),J=Q%60;return`${Y}m ${J}s`}var vJ=_X.memo(()=>{let $=J0((q)=>q.app.subagentProgresses),Q=J0((q)=>q.app.subagentProgress),Y=A0(),[J,Z]=CJ(0),[X,U]=CJ(()=>Date.now()),K=FX(()=>{let q=Object.values($);return q.length>0?q:Q?[Q]:[]},[Q,$]),G=K.some((q)=>q.status==="running");if(NX(()=>{if(!G){Z(0);return}let q=setInterval(()=>{Z((O)=>(O+1)%IJ.length)},80),F=setInterval(()=>{U(Date.now())},1000);return()=>{clearInterval(q),clearInterval(F)}},[G]),K.length===0)return null;return N1(MJ,{paddingX:2,paddingY:0,flexDirection:"column",children:K.map((q)=>{let F=q.status==="running"?IJ[J]:q.status==="completed"?"[OK]":"[X]",O=q.status==="running"?Y.colors.info:q.status==="completed"?Y.colors.success:Y.colors.error,N=Math.max(0,X-q.startTime);return N1(MJ,{flexDirection:"row",gap:1,children:[N1(c1,{color:O,bold:!0,children:F},void 0,!1,void 0,this),N1(c1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),N1(c1,{color:Y.colors.text.primary,bold:!0,children:q.type},void 0,!1,void 0,this),N1(c1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(c1,{color:Y.colors.text.secondary,children:q.description},void 0,!1,void 0,this),q.currentTool&&N1(TJ,{children:[N1(c1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(c1,{color:Y.colors.warning,children:q.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="running"&&N>0&&N1(TJ,{children:[N1(c1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(c1,{color:Y.colors.info,children:HX(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},q.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as WX}from"ahooks";import{Box as v1,Text as d,useInput as LX}from"ink";import BX from"ink-select-input";import{useState as fJ}from"react";import{jsxDEV as u}from"react/jsx-dev-runtime";var SJ=y$.map(($)=>({label:$.label,value:$.id})),wX=({theme:$})=>{let{colors:Q}=$;return u(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.error,children:["- print(",u(d,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),u(d,{color:Q.success,children:["+ print(",u(d,{color:Q.syntax.string,children:['f"Hello, ',"{","name","}",'"']},void 0,!0,void 0,this),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},bX=({theme:$})=>{let{colors:Q}=$;return u(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{children:" "},void 0,!1,void 0,this),u(d,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),u(d,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),u(d,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),u(d,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),u(d,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),u(d,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},kJ=()=>{let $=r1(),Q=d0.getCurrentThemeName(),Y=y$.findIndex((B)=>B.label===Q),J=Y>=0?y$[Y].theme:y$[0].theme,[Z,X]=fJ(J),[U,K]=fJ(!1),G=WX(async(B)=>{if(U)return;K(!0);try{await g0().setTheme(B.value),$.closeModal()}catch(z){console.error("主题切换失败:",z instanceof Error?z.message:z)}finally{K(!1)}}),q=(B)=>{let z=y$.find((L)=>L.id===B.value);if(z)X(z.theme)},O=$1()==="theme-selector",N=v0(!1);LX((B,z)=>{if(z.ctrl&&B==="c"||z.meta&&B==="c"){N();return}if(z.escape&&!U)$.closeModal()},{isActive:O});let _=(B)=>{let{isSelected:z,label:L}=B,A=L===Q?"[OK]":" ";return u(d,{color:z?Z.colors.primary:Z.colors.text.primary,children:[A," ",L]},void 0,!0,void 0,this)};return u(v1,{flexDirection:"column",height:"100%",children:[u(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(v1,{flexDirection:"row",flexGrow:1,children:[u(v1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:u(v1,{flexDirection:"column",children:[u(v1,{paddingTop:1,paddingBottom:1,children:u(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",SJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(BX,{items:SJ,initialIndex:Y>=0?Y:0,onSelect:G,onHighlight:q,itemComponent:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(v1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[u(wX,{theme:Z},void 0,!1,void 0,this),u(bX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{color:Z.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{jsxDEV as P0}from"react/jsx-dev-runtime";var G1=i1("UI"),jJ=({debug:$,continue:Q,...Y})=>{if($)G1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=R2(!1),Z=R2(!1),X=R2(!1),U=R2(null),K=$4(),G=Q4(),q=b8(),F=Z4(),O=Y4(),N=r1(),_=d1(),B=v$(),z=M1(),L=q4(),W=f$(),A=a1(),T=G4();K$(()=>{if(d0.getCurrentThemeName()!==T)try{d0.setTheme(T)}catch{}},[T]);let C=K==="ready",w=K==="needsSetup",S=K==="idle",P=AX(()=>Y.agents?VJ(Y.agents):void 0,[Y.agents]),{confirmationState:b,confirmationHandler:I,handleResponse:R,dismissAll:H}=u4(),{executeCommand:f,handleAbort:E,cleanupAgent:t}=g4(Y.systemPrompt,Y.appendSystemPrompt,I,Y.maxTurns,H,P),{getPreviousCommand:l,getNextCommand:v,addToHistory:M}=p4();Z6();let k=l4("",0),D=t0(async()=>{let r=W,e;if(r==="default")e="autoEdit";else if(r==="autoEdit")e="plan";else if(r==="plan")e="default";else e="default";try{await y0.setSessionPermissionMode(B,z,e),await g0().setPermissionMode(e)}catch(l0){G1.error("权限模式切换失败:",l0 instanceof Error?l0.message:l0)}}),y=t0(async(r)=>{try{let e={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await g0().addModelWithProvider(e,r.modelProvider);else await g0().addModel(e);N.setInitializationStatus("ready")}catch(e){throw G1.error("初始化配置保存失败:",e instanceof Error?e.message:e),e}}),g=t0(()=>{if(q==="shortcuts")N.closeModal();else N.setActiveModal("shortcuts")}),h=t0(async(r,e,l0)=>{return j8({intent:e,session:r,newSessionId:l0?.newSessionId,announceFork:l0?.announceFork,permissionModeOverride:Y.permissionMode},z,_,t)}),x=t0(async(r,e)=>{let V0=(await V8(e,z)).filter((I$)=>I$.sessionId===r);if(V0.length===0)throw Error(`Session not found: ${r}`);if(V0.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return V0[0]}),{showSuggestions:V,suggestions:i,selectedSuggestionIndex:U0}=Y6(k,f,l,v,M,E,A,D,g,q==="shortcuts");K$(()=>{if(k.value&&q==="shortcuts")N.closeModal()},[k.value,q,N]);let q0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",e=await V8(r,z);if(e.length===0){if(Y.forkSession){G1.error("没有可供 fork 的历史会话"),C1(1);return}_.addAssistantMessage("没有找到历史会话,开始新对话。");return}let l0=e[0];await h(l0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(G1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){C1(1);return}_.addAssistantMessage("继续会话失败,开始新对话。")}}),R0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let l0=Y.forkSession?"fork":"resume",l1=await x(Y.resume,l0);await h(l1,l0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",e=await V8(r,z);if(e.length===0)G1.error("没有找到历史会话"),C1(1);N.showSessionSelector(e,r)}catch(r){G1.error("[BladeInterface] 加载会话失败:",r),C1(1)}});K$(()=>{if(J.current)return;if(Q){J.current=!0,q0();return}if(Y.resume)J.current=!0,R0()},[Q,Y.resume,q0,R0]);let B0=t0(async(r)=>{let e=b.details?.type;if(e==="enterPlanMode"&&r.approved)try{await y0.setSessionPermissionMode(B,z,"plan"),await g0().setPermissionMode("plan"),G1.debug("[BladeInterface] Entered Plan mode")}catch(l0){G1.error("[BladeInterface] Failed to enter Plan mode:",l0)}if(e==="exitPlanMode"&&r.approved)G1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");R(r)}),s0=t0(()=>{_.addAssistantMessage("设置已取消"),_.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),_.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),C1(0)}),k0=t0(()=>{N.closeModal()}),F1=t0(async(r)=>{try{await h(r,F?.intent??"resume"),N.closeModal()}catch(e){G1.error("[BladeInterface] Failed to restore session:",e),_.addAssistantMessage(`会话操作失败: ${e instanceof Error?e.message:"未知错误"}`),N.closeModal()}}),C$=t0(()=>{if(Y.resume)C1(0);else N.closeModal()}),e0=t0((r)=>{N.showModelEditWizard(r)}),T2=t0((r)=>{_.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),k0()}),q$=t0((r)=>{_.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),k0()});K$(()=>{if(w){L.setFocus("model-config-wizard");return}if(b.isVisible)L.setFocus("confirmation-prompt");else if(q==="sessionSelector")L.setFocus("session-selector");else if(q==="themeSelector")L.setFocus("theme-selector");else if(q==="modelSelector")L.setFocus("model-selector");else if(q==="modelAddWizard"||q==="modelEditWizard")L.setFocus("model-config-wizard");else if(q==="permissionsManager")L.setFocus("permissions-manager");else if(q==="agentsManager")L.setFocus("agents-manager");else if(q==="agentCreationWizard")L.setFocus("agent-creation-wizard");else if(q==="hooksManager")L.setFocus("hooks-manager");else if(q==="shortcuts")L.setFocus("main-input");else L.setFocus("main-input")},[w,b.isVisible,q,L.setFocus]),K$(()=>{if(!C||X.current)return;if(DJ().length>0){X.current=!0;return}X.current=!0,_.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[C]),K$(()=>{if(!G)return;if(U.current===G)return;if(U.current=G,K==="error")_.addAssistantMessage(`初始化失败: ${G}`);else _.addAssistantMessage(`${G}`),_.addAssistantMessage("请重新尝试设置,或检查文件权限")},[G,K,_.addAssistantMessage]);let v2=t0(async(r)=>{try{await f({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(e){let l0=e instanceof Error?e.message:"无法发送初始消息";_.addAssistantMessage(`初始消息发送失败:${l0}`)}});K$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!C||w)return;Z.current=!0,M(r),v2(r)},[Y.initialMessage,C,w,f,M]);let O0=t0(async(r)=>{try{await g0().setPermissionMode(r)}catch(e){G1.error("权限模式初始化失败:",e instanceof Error?e.message:e)}});if(K$(()=>{let r=Y.permissionMode;if($)G1.debug("[Debug] permissionMode from CLI:",r),G1.debug("[Debug] current permissionMode:",W);if(!r||r===W)return;O0(r)},[Y.permissionMode,W]),S)return null;if(w)return P0(xQ,{mode:"setup",onComplete:y,onCancel:s0},void 0,!1,void 0,this);if($)G1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:b.isVisible,activeModal:q});let p0=q==="modelSelector",s=O,K0=q==="modelAddWizard"?"add":q==="modelEditWizard"&&s?"edit":null,c0=p0||Boolean(K0),i0=q==="agentsManager",h0=q==="agentCreationWizard",f2=q==="skillsManager",t$=q==="pluginsManager",S2=s?{displayName:s.displayName,provider:s.provider,model:s.model,overrides:s.overrides}:void 0,B8=b.isVisible&&b.details?b.details.type==="mcpElicitation"&&b.details.mcpElicitation?P0(R9,{details:b.details.mcpElicitation,onComplete:(r,e)=>B0({approved:r.action==="accept",elicitation:r,...e?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):b.details.type==="askUserQuestion"&&b.details.questions?P0(HJ,{questions:b.details.questions,onComplete:(r)=>B0({approved:!0,answers:r}),onCancel:()=>B0({approved:!1})},void 0,!1,void 0,this):P0(d6,{details:b.details,onResponse:B0},void 0,!1,void 0,this):q==="themeSelector"?P0(kJ,{},void 0,!1,void 0,this):q==="permissionsManager"?P0(UJ,{onClose:k0},void 0,!1,void 0,this):q==="sessionSelector"?P0(PJ,{intent:F?.intent??"resume",sessions:F?.sessions,onSelect:F1,onCancel:C$},void 0,!1,void 0,this):q==="hooksManager"?P0(a6,{workspaceRoot:z,sessionId:B,onClose:k0},void 0,!1,void 0,this):null,s$=Boolean(B8);return P0(U$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[B8,P0(U$,{flexDirection:"column",display:s$?"none":"flex",children:[P0(m9,{},void 0,!1,void 0,this),P0(vJ,{},void 0,!1,void 0,this),P0(w9,{paused:s$},void 0,!1,void 0,this),P0(_9,{input:k.value,cursorPosition:k.cursorPosition,onChange:k.setValue,onChangeCursorPosition:k.setCursorPosition,onAddPasteMapping:k.addPasteMapping,onAddImagePasteMapping:k.addImagePasteMapping},void 0,!1,void 0,this),p0&&P0(U$,{marginTop:1,paddingX:2,children:P0(p9,{onClose:k0,onEdit:e0},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0&&P0(U$,{marginTop:1,paddingX:2,children:P0(xQ,{mode:K0,modelId:s?.id,initialConfig:K0==="edit"?S2:void 0,onComplete:K0==="edit"?q$:T2,onCancel:k0},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0&&P0(U$,{marginTop:1,paddingX:2,children:P0(O6,{workspaceRoot:z,onComplete:k0,onCancel:k0},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0&&P0(U$,{marginTop:1,paddingX:2,children:P0(K8,{onComplete:k0,onCancel:k0},void 0,!1,void 0,this)},void 0,!1,void 0,this),f2&&P0(U$,{marginTop:1,paddingX:2,children:P0(yJ,{onComplete:k0,onCancel:k0},void 0,!1,void 0,this)},void 0,!1,void 0,this),t$&&P0(U$,{marginTop:1,paddingX:2,children:P0(NJ,{workspaceRoot:z,onComplete:k0,onCancel:k0},void 0,!1,void 0,this)},void 0,!1,void 0,this),P0(W6,{suggestions:i,selectedIndex:U0,visible:V&&!c0},void 0,!1,void 0,this),P0(H6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as PX,Text as G$}from"ink";import RX from"react";import{jsxDEV as u1}from"react/jsx-dev-runtime";class L8 extends RX.Component{constructor($){super($);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError($){return{hasError:!0,error:$,errorInfo:null}}componentDidCatch($,Q){this.setState({error:$,errorInfo:Q}),console.error("未捕获的错误:",$,Q)}render(){if(this.state.hasError)return u1(PX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[u1(G$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),u1(G$,{children:" "},void 0,!1,void 0,this),u1(G$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),u1(G$,{children:" "},void 0,!1,void 0,this),u1(G$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),u1(G$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),u1(G$,{children:" "},void 0,!1,void 0,this),u1(G$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as M$,Text as x1,useInput as yX}from"ink";import{useState as aQ}from"react";import{jsxDEV as X1}from"react/jsx-dev-runtime";var y2=[{key:"update",label:"Update now",description:`runs \`${EJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],mJ=({versionInfo:$,onComplete:Q})=>{let[Y,J]=aQ(0),[Z,X]=aQ(!1),[U,K]=aQ(null);yX((q,F)=>{if(F.ctrl&&q==="c"){X8().shutdown("SIGINT",0);return}if(Z||U)return;if(F.upArrow||q==="k")J((O)=>O>0?O-1:y2.length-1);else if(F.downArrow||q==="j")J((O)=>O<y2.length-1?O+1:0);else if(F.return)G(y2[Y].key);else if(q==="1")G("update");else if(q==="2")G("skip");else if(q==="3")G("skip_until_next")});let G=async(q)=>{switch(q){case"update":{X(!0);let F=await gJ();K(F.message),setTimeout(()=>{X8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await hJ($.latestVersion);Q();break}};if(U)return X1(M$,{flexDirection:"column",marginY:1,children:X1(x1,{children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return X1(M$,{flexDirection:"column",marginY:1,children:X1(x1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X1(M$,{flexDirection:"column",marginY:1,children:[X1(x1,{color:"yellow",bold:!0,children:["Update available! ",X1(x1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X1(M$,{marginTop:1,children:X1(x1,{color:"gray",children:["Release notes:"," ",X1(x1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(M$,{flexDirection:"column",marginTop:1,children:y2.map((q,F)=>{let O=F===Y,N=O?"› ":" ",_=`${F+1}. `;return X1(M$,{children:X1(x1,{color:O?"cyan":void 0,children:[N,_,q.label,q.description&&X1(x1,{color:"gray",children:[" (",q.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},q.key,!1,void 0,this)})},void 0,!1,void 0,this),X1(M$,{marginTop:1,children:X1(x1,{color:"gray",children:"Press enter to continue"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as M2,Text as o$,useInput as MX}from"ink";import{useState as pJ}from"react";import{jsxDEV as f1}from"react/jsx-dev-runtime";var cJ=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=d0.getTheme(),[Z,X]=pJ(!1),[U,K]=pJ(null);return MX((G,q)=>{if(Z)return;if(q.return||G.toLowerCase()==="t"){X(!0),K(null),Q().catch((F)=>{K(F instanceof Error?F.message:"Failed to trust workspace"),X(!1)});return}if(G.toLowerCase()==="s"||q.escape)X(!0),K(null),Y().catch((F)=>{K(F instanceof Error?F.message:"Failed to continue safely"),X(!1)})}),f1(M2,{flexDirection:"column",paddingX:1,children:[f1(o$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),f1(o$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),f1(M2,{marginTop:1,flexDirection:"column",children:[f1(o$,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((G)=>f1(o$,{children:[" ",G.path," · ",G.effects.length," effect(s)"]},`${G.kind}:${G.path}`,!0,void 0,this))]},void 0,!0,void 0,this),U&&f1(M2,{marginTop:1,children:f1(o$,{color:J.colors.error,children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),f1(M2,{marginTop:1,children:f1(o$,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as CX}from"ink";import{useEffect as IX}from"react";function uJ(){let{stdout:$}=CX();IX(()=>{if(!$.isTTY)return;return $.write(n6),$.write(MQ),()=>{$.write(t6),$.write(MQ)}},[$])}function xJ($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}import{jsxDEV as n$}from"react/jsx-dev-runtime";function vX($){if(Q1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");r0().setInitializationStatus("ready")}var cF=($)=>{uJ();let[Q,Y]=I2(!1),[J,Z]=I2(null),[X,U]=I2(!1),[K,G]=I2(null),q=C2((_,B)=>{let z=_ instanceof Error?_.message:String(_);if(r0().setInitializationError(z),r0().setInitializationStatus("error"),Y(!0),B)console.error("[FAIL] 应用初始化失败:",z)}),F=C2(async()=>{try{let _=Q1().config.config??dJ,B=rJ(_,$);if(vX(B),B.resumeSessionId)aJ().restoreSession(B.resumeSessionId,[]);if(B.debug)console.error("[Debug] 运行时配置:",B);let z=B.theme;if(z&&d0.hasTheme(z)){if(d0.setTheme(z),$.debug)console.log(`[OK] 已加载主题: ${z}`)}try{q1.getInstance().loadConfig(B.hooks||{},u0());let W=await iJ(u0());if($.debug&&B.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${W.subagents.getAllNames().length} agents, ${W.skills.size} skills, ${W.commands.getCommandCount()+W.commands.getPluginCommandCount()} commands, ${W.plugins.getAll().length} plugins`);let T=Q1().session.sessionId;lJ(T)}catch(L){if($.debug)console.warn("Hooks 初始化失败:",xJ(L))}E8(async()=>{await nJ.getInstance().killAll(),await oJ.getInstance().disconnectAll(),q1.getInstance().cleanup()}),Y(!0)}catch(_){q(_,!!$.debug)}}),O=C2(async()=>{let _=await iQ.getInstance().getStatus(u0());if(_.state==="untrusted"||_.state==="error"){G(_);return}await F()}),N=C2(async()=>{if($.versionCheckPromise){let _=await $.versionCheckPromise;if(_){Z(_),U(!0);return}}await O()});if(TX(()=>{N()},[]),X&&J)return n$(L8,{children:n$(mJ,{versionInfo:J,onComplete:()=>{U(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(K)return n$(L8,{children:n$(cJ,{status:K,onTrust:async()=>{await iQ.getInstance().trust(u0()),await tJ(),G(null),await F()},onContinueSafely:async()=>{G(null),await F()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return n$(L8,{children:n$(jJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{cF as AppWrapper};
160
+ `]},void 0,!0,void 0,this),x0(UX,{items:w,onSelect:P,isFocused:z&&!F,indicatorComponent:OX,itemComponent:zX},void 0,!1,void 0,this),F&&x0(w1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),x0(i$,{marginTop:1,flexDirection:"column",children:[x0(w1,{dimColor:!0,children:["第 ",K+1,"/",C," 页 · 共 ",W.length," 个会话 · 显示"," ",S.start,"-",S.end]},void 0,!0,void 0,this),C>1&&x0(i$,{marginTop:1,children:[x0(w1,{color:K>0?"cyan":"gray",children:K>0?"<< 上一页":" "},void 0,!1,void 0,this),x0(w1,{children:" "},void 0,!1,void 0,this),x0(w1,{color:K<C-1?"cyan":"gray",children:K<C-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 m0,Text as T0,useInput as _X}from"ink";import{jsxDEV as Q0}from"react/jsx-dev-runtime";function MJ({onCancel:$}){let Q=M1(),J=yJ({cwd:Q}).getAll(),Z=J.filter((K)=>K.source==="builtin"),X=J.filter((K)=>K.source==="user"),U=J.filter((K)=>K.source==="project"),G=v0(!1,$);if(_X((K,q)=>{if(q.escape)$?.();else if(q.ctrl&&K==="c"||q.meta&&K==="c")G()}),J.length===0)return Q0(m0,{flexDirection:"column",paddingY:1,children:[Q0(m0,{marginBottom:1,children:Q0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0(m0,{marginTop:1,paddingLeft:2,children:Q0(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0(m0,{marginTop:1,children:Q0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Q0(m0,{flexDirection:"column",paddingY:1,children:[Q0(m0,{marginBottom:1,children:[Q0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),Q0(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U.length>0&&Q0(m0,{flexDirection:"column",marginBottom:1,children:[Q0(m0,{paddingLeft:1,children:[Q0(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),Q0(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((K)=>{let F=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return Q0(m0,{flexDirection:"column",paddingLeft:2,children:[Q0(T0,{children:[Q0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),Q0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&Q0(m0,{flexDirection:"column",marginBottom:1,children:[Q0(m0,{paddingLeft:1,children:[Q0(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),Q0(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((K)=>{let F=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return Q0(m0,{flexDirection:"column",paddingLeft:2,children:[Q0(T0,{children:[Q0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),Q0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&Q0(m0,{flexDirection:"column",marginBottom:1,children:[Q0(m0,{paddingLeft:1,children:[Q0(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),Q0(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((K)=>{let F=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return Q0(m0,{flexDirection:"column",paddingLeft:2,children:[Q0(T0,{children:[Q0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),Q0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&Q0(m0,{paddingLeft:2,children:Q0(T0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q0(m0,{marginTop:1,children:Q0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as CJ,Text as c1}from"ink";import NX,{useEffect as FX,useMemo as HX,useState as IJ}from"react";import{jsxDEV as N1,Fragment as vJ}from"react/jsx-dev-runtime";var TJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function WX($){let Q=Math.floor($/1000);if(Q<60)return`${Q}s`;let Y=Math.floor(Q/60),J=Q%60;return`${Y}m ${J}s`}var fJ=NX.memo(()=>{let $=J0((q)=>q.app.subagentProgresses),Q=J0((q)=>q.app.subagentProgress),Y=A0(),[J,Z]=IJ(0),[X,U]=IJ(()=>Date.now()),G=HX(()=>{let q=Object.values($);return q.length>0?q:Q?[Q]:[]},[Q,$]),K=G.some((q)=>q.status==="running");if(FX(()=>{if(!K){Z(0);return}let q=setInterval(()=>{Z((O)=>(O+1)%TJ.length)},80),F=setInterval(()=>{U(Date.now())},1000);return()=>{clearInterval(q),clearInterval(F)}},[K]),G.length===0)return null;return N1(CJ,{paddingX:2,paddingY:0,flexDirection:"column",children:G.map((q)=>{let F=q.status==="running"?TJ[J]:q.status==="completed"?"[OK]":"[X]",O=q.status==="running"?Y.colors.info:q.status==="completed"?Y.colors.success:Y.colors.error,N=Math.max(0,X-q.startTime);return N1(CJ,{flexDirection:"row",gap:1,children:[N1(c1,{color:O,bold:!0,children:F},void 0,!1,void 0,this),N1(c1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),N1(c1,{color:Y.colors.text.primary,bold:!0,children:q.type},void 0,!1,void 0,this),N1(c1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(c1,{color:Y.colors.text.secondary,children:q.description},void 0,!1,void 0,this),q.currentTool&&N1(vJ,{children:[N1(c1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(c1,{color:Y.colors.warning,children:q.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="running"&&N>0&&N1(vJ,{children:[N1(c1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(c1,{color:Y.colors.info,children:WX(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},q.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as LX}from"ahooks";import{Box as v1,Text as d,useInput as BX}from"ink";import wX from"ink-select-input";import{useState as SJ}from"react";import{jsxDEV as u}from"react/jsx-dev-runtime";var kJ=y$.map(($)=>({label:$.label,value:$.id})),bX=({theme:$})=>{let{colors:Q}=$;return u(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.error,children:["- print(",u(d,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),u(d,{color:Q.success,children:["+ print(",u(d,{color:Q.syntax.string,children:['f"Hello, ',"{","name","}",'"']},void 0,!0,void 0,this),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},AX=({theme:$})=>{let{colors:Q}=$;return u(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{children:" "},void 0,!1,void 0,this),u(d,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),u(d,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),u(d,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),u(d,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),u(d,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),u(d,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},DJ=()=>{let $=r1(),Q=d0.getCurrentThemeName(),Y=y$.findIndex((B)=>B.label===Q),J=Y>=0?y$[Y].theme:y$[0].theme,[Z,X]=SJ(J),[U,G]=SJ(!1),K=LX(async(B)=>{if(U)return;G(!0);try{await g0().setTheme(B.value),$.closeModal()}catch(z){console.error("主题切换失败:",z instanceof Error?z.message:z)}finally{G(!1)}}),q=(B)=>{let z=y$.find((L)=>L.id===B.value);if(z)X(z.theme)},O=$1()==="theme-selector",N=v0(!1);BX((B,z)=>{if(z.ctrl&&B==="c"||z.meta&&B==="c"){N();return}if(z.escape&&!U)$.closeModal()},{isActive:O});let _=(B)=>{let{isSelected:z,label:L}=B,A=L===Q?"[OK]":" ";return u(d,{color:z?Z.colors.primary:Z.colors.text.primary,children:[A," ",L]},void 0,!0,void 0,this)};return u(v1,{flexDirection:"column",height:"100%",children:[u(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(v1,{flexDirection:"row",flexGrow:1,children:[u(v1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:u(v1,{flexDirection:"column",children:[u(v1,{paddingTop:1,paddingBottom:1,children:u(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",kJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(wX,{items:kJ,initialIndex:Y>=0?Y:0,onSelect:K,onHighlight:q,itemComponent:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(v1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[u(bX,{theme:Z},void 0,!1,void 0,this),u(AX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{color:Z.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{jsxDEV as P0}from"react/jsx-dev-runtime";var K1=i1("UI"),hJ=({debug:$,continue:Q,...Y})=>{if($)K1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=R2(!1),Z=R2(!1),X=R2(!1),U=R2(null),G=Q4(),K=J4(),q=b8(),F=X4(),O=Z4(),N=r1(),_=d1(),B=v$(),z=M1(),L=O4(),W=f$(),A=a1(),T=q4();G$(()=>{if(d0.getCurrentThemeName()!==T)try{d0.setTheme(T)}catch{}},[T]);let C=G==="ready",w=G==="needsSetup",S=G==="idle",P=PX(()=>Y.agents?jJ(Y.agents):void 0,[Y.agents]),{confirmationState:b,confirmationHandler:I,handleResponse:R,dismissAll:H}=x4(),{executeCommand:f,handleAbort:E,cleanupAgent:t}=m4(Y.systemPrompt,Y.appendSystemPrompt,I,Y.maxTurns,H,P),{getPreviousCommand:l,getNextCommand:v,addToHistory:M}=c4();X6();let k=d4("",0),D=t0(async()=>{let r=W,e;if(r==="default")e="autoEdit";else if(r==="autoEdit")e="plan";else if(r==="plan")e="default";else e="default";try{await y0.setSessionPermissionMode(B,z,e),await g0().setPermissionMode(e)}catch(l0){K1.error("权限模式切换失败:",l0 instanceof Error?l0.message:l0)}}),y=t0(async(r)=>{try{let e={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await g0().addModelWithProvider(e,r.modelProvider);else await g0().addModel(e);N.setInitializationStatus("ready")}catch(e){throw K1.error("初始化配置保存失败:",e instanceof Error?e.message:e),e}}),g=t0(()=>{if(q==="shortcuts")N.closeModal();else N.setActiveModal("shortcuts")}),h=t0(async(r,e,l0)=>{return j8({intent:e,session:r,newSessionId:l0?.newSessionId,announceFork:l0?.announceFork,permissionModeOverride:Y.permissionMode},z,_,t)}),x=t0(async(r,e)=>{let V0=(await V8(e,z)).filter((I$)=>I$.sessionId===r);if(V0.length===0)throw Error(`Session not found: ${r}`);if(V0.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return V0[0]}),{showSuggestions:V,suggestions:i,selectedSuggestionIndex:U0}=Z6(k,f,l,v,M,E,A,D,g,q==="shortcuts");G$(()=>{if(k.value&&q==="shortcuts")N.closeModal()},[k.value,q,N]);let q0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",e=await V8(r,z);if(e.length===0){if(Y.forkSession){K1.error("没有可供 fork 的历史会话"),C1(1);return}_.addAssistantMessage("没有找到历史会话,开始新对话。");return}let l0=e[0];await h(l0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(K1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){C1(1);return}_.addAssistantMessage("继续会话失败,开始新对话。")}}),R0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let l0=Y.forkSession?"fork":"resume",l1=await x(Y.resume,l0);await h(l1,l0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",e=await V8(r,z);if(e.length===0)K1.error("没有找到历史会话"),C1(1);N.showSessionSelector(e,r)}catch(r){K1.error("[BladeInterface] 加载会话失败:",r),C1(1)}});G$(()=>{if(J.current)return;if(Q){J.current=!0,q0();return}if(Y.resume)J.current=!0,R0()},[Q,Y.resume,q0,R0]);let B0=t0(async(r)=>{let e=b.details?.type;if(e==="enterPlanMode"&&r.approved)try{await y0.setSessionPermissionMode(B,z,"plan"),await g0().setPermissionMode("plan"),K1.debug("[BladeInterface] Entered Plan mode")}catch(l0){K1.error("[BladeInterface] Failed to enter Plan mode:",l0)}if(e==="exitPlanMode"&&r.approved)K1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");R(r)}),s0=t0(()=>{_.addAssistantMessage("设置已取消"),_.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),_.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),C1(0)}),k0=t0(()=>{N.closeModal()}),F1=t0(async(r)=>{try{await h(r,F?.intent??"resume"),N.closeModal()}catch(e){K1.error("[BladeInterface] Failed to restore session:",e),_.addAssistantMessage(`会话操作失败: ${e instanceof Error?e.message:"未知错误"}`),N.closeModal()}}),C$=t0(()=>{if(Y.resume)C1(0);else N.closeModal()}),e0=t0((r)=>{N.showModelEditWizard(r)}),T2=t0((r)=>{_.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),k0()}),q$=t0((r)=>{_.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),k0()});G$(()=>{if(w){L.setFocus("model-config-wizard");return}if(b.isVisible)L.setFocus("confirmation-prompt");else if(q==="sessionSelector")L.setFocus("session-selector");else if(q==="themeSelector")L.setFocus("theme-selector");else if(q==="modelSelector")L.setFocus("model-selector");else if(q==="modelAddWizard"||q==="modelEditWizard")L.setFocus("model-config-wizard");else if(q==="permissionsManager")L.setFocus("permissions-manager");else if(q==="agentsManager")L.setFocus("agents-manager");else if(q==="agentCreationWizard")L.setFocus("agent-creation-wizard");else if(q==="hooksManager")L.setFocus("hooks-manager");else if(q==="shortcuts")L.setFocus("main-input");else L.setFocus("main-input")},[w,b.isVisible,q,L.setFocus]),G$(()=>{if(!C||X.current)return;if(VJ().length>0){X.current=!0;return}X.current=!0,_.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[C]),G$(()=>{if(!K)return;if(U.current===K)return;if(U.current=K,G==="error")_.addAssistantMessage(`初始化失败: ${K}`);else _.addAssistantMessage(`${K}`),_.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,G,_.addAssistantMessage]);let v2=t0(async(r)=>{try{await f({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(e){let l0=e instanceof Error?e.message:"无法发送初始消息";_.addAssistantMessage(`初始消息发送失败:${l0}`)}});G$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!C||w)return;Z.current=!0,M(r),v2(r)},[Y.initialMessage,C,w,f,M]);let O0=t0(async(r)=>{try{await g0().setPermissionMode(r)}catch(e){K1.error("权限模式初始化失败:",e instanceof Error?e.message:e)}});if(G$(()=>{let r=Y.permissionMode;if($)K1.debug("[Debug] permissionMode from CLI:",r),K1.debug("[Debug] current permissionMode:",W);if(!r||r===W)return;O0(r)},[Y.permissionMode,W]),S)return null;if(w)return P0(lQ,{mode:"setup",onComplete:y,onCancel:s0},void 0,!1,void 0,this);if($)K1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:b.isVisible,activeModal:q});let p0=q==="modelSelector",s=O,G0=q==="modelAddWizard"?"add":q==="modelEditWizard"&&s?"edit":null,c0=p0||Boolean(G0),i0=q==="agentsManager",h0=q==="agentCreationWizard",f2=q==="skillsManager",t$=q==="pluginsManager",S2=s?{displayName:s.displayName,provider:s.provider,model:s.model,overrides:s.overrides}:void 0,B8=b.isVisible&&b.details?b.details.type==="mcpElicitation"&&b.details.mcpElicitation?P0(y9,{details:b.details.mcpElicitation,onComplete:(r,e)=>B0({approved:r.action==="accept",elicitation:r,...e?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):b.details.type==="askUserQuestion"&&b.details.questions?P0(WJ,{questions:b.details.questions,onComplete:(r)=>B0({approved:!0,answers:r}),onCancel:()=>B0({approved:!1})},void 0,!1,void 0,this):P0(r6,{details:b.details,onResponse:B0},void 0,!1,void 0,this):q==="themeSelector"?P0(DJ,{},void 0,!1,void 0,this):q==="permissionsManager"?P0(GJ,{onClose:k0},void 0,!1,void 0,this):q==="sessionSelector"?P0(RJ,{intent:F?.intent??"resume",sessions:F?.sessions,onSelect:F1,onCancel:C$},void 0,!1,void 0,this):q==="hooksManager"?P0(i6,{workspaceRoot:z,sessionId:B,onClose:k0},void 0,!1,void 0,this):null,s$=Boolean(B8);return P0(U$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[B8,P0(U$,{flexDirection:"column",display:s$?"none":"flex",children:[P0(p9,{},void 0,!1,void 0,this),P0(fJ,{},void 0,!1,void 0,this),P0(b9,{paused:s$},void 0,!1,void 0,this),P0(N9,{input:k.value,cursorPosition:k.cursorPosition,onChange:k.setValue,onChangeCursorPosition:k.setCursorPosition,onAddPasteMapping:k.addPasteMapping,onAddImagePasteMapping:k.addImagePasteMapping},void 0,!1,void 0,this),p0&&P0(U$,{marginTop:1,paddingX:2,children:P0(c9,{onClose:k0,onEdit:e0},void 0,!1,void 0,this)},void 0,!1,void 0,this),G0&&P0(U$,{marginTop:1,paddingX:2,children:P0(lQ,{mode:G0,modelId:s?.id,initialConfig:G0==="edit"?S2:void 0,onComplete:G0==="edit"?q$:T2,onCancel:k0},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0&&P0(U$,{marginTop:1,paddingX:2,children:P0(z6,{workspaceRoot:z,onComplete:k0,onCancel:k0},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0&&P0(U$,{marginTop:1,paddingX:2,children:P0(G8,{onComplete:k0,onCancel:k0},void 0,!1,void 0,this)},void 0,!1,void 0,this),f2&&P0(U$,{marginTop:1,paddingX:2,children:P0(MJ,{onComplete:k0,onCancel:k0},void 0,!1,void 0,this)},void 0,!1,void 0,this),t$&&P0(U$,{marginTop:1,paddingX:2,children:P0(FJ,{workspaceRoot:z,onComplete:k0,onCancel:k0},void 0,!1,void 0,this)},void 0,!1,void 0,this),P0(L6,{suggestions:i,selectedIndex:U0,visible:V&&!c0},void 0,!1,void 0,this),P0(W6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as RX,Text as K$}from"ink";import yX from"react";import{jsxDEV as u1}from"react/jsx-dev-runtime";class L8 extends yX.Component{constructor($){super($);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError($){return{hasError:!0,error:$,errorInfo:null}}componentDidCatch($,Q){this.setState({error:$,errorInfo:Q}),console.error("未捕获的错误:",$,Q)}render(){if(this.state.hasError)return u1(RX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[u1(K$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),u1(K$,{children:" "},void 0,!1,void 0,this),u1(K$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),u1(K$,{children:" "},void 0,!1,void 0,this),u1(K$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),u1(K$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),u1(K$,{children:" "},void 0,!1,void 0,this),u1(K$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as M$,Text as x1,useInput as MX}from"ink";import{useState as iQ}from"react";import{jsxDEV as X1}from"react/jsx-dev-runtime";var y2=[{key:"update",label:"Update now",description:`runs \`${gJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],pJ=({versionInfo:$,onComplete:Q})=>{let[Y,J]=iQ(0),[Z,X]=iQ(!1),[U,G]=iQ(null);MX((q,F)=>{if(F.ctrl&&q==="c"){X8().shutdown("SIGINT",0);return}if(Z||U)return;if(F.upArrow||q==="k")J((O)=>O>0?O-1:y2.length-1);else if(F.downArrow||q==="j")J((O)=>O<y2.length-1?O+1:0);else if(F.return)K(y2[Y].key);else if(q==="1")K("update");else if(q==="2")K("skip");else if(q==="3")K("skip_until_next")});let K=async(q)=>{switch(q){case"update":{X(!0);let F=await mJ();G(F.message),setTimeout(()=>{X8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await EJ($.latestVersion);Q();break}};if(U)return X1(M$,{flexDirection:"column",marginY:1,children:X1(x1,{children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return X1(M$,{flexDirection:"column",marginY:1,children:X1(x1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X1(M$,{flexDirection:"column",marginY:1,children:[X1(x1,{color:"yellow",bold:!0,children:["Update available! ",X1(x1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X1(M$,{marginTop:1,children:X1(x1,{color:"gray",children:["Release notes:"," ",X1(x1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(M$,{flexDirection:"column",marginTop:1,children:y2.map((q,F)=>{let O=F===Y,N=O?"› ":" ",_=`${F+1}. `;return X1(M$,{children:X1(x1,{color:O?"cyan":void 0,children:[N,_,q.label,q.description&&X1(x1,{color:"gray",children:[" (",q.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},q.key,!1,void 0,this)})},void 0,!1,void 0,this),X1(M$,{marginTop:1,children:X1(x1,{color:"gray",children:"Press enter to continue"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as M2,Text as o$,useInput as CX}from"ink";import{useState as cJ}from"react";import{jsxDEV as f1}from"react/jsx-dev-runtime";var uJ=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=d0.getTheme(),[Z,X]=cJ(!1),[U,G]=cJ(null);return CX((K,q)=>{if(Z)return;if(q.return||K.toLowerCase()==="t"){X(!0),G(null),Q().catch((F)=>{G(F instanceof Error?F.message:"Failed to trust workspace"),X(!1)});return}if(K.toLowerCase()==="s"||q.escape)X(!0),G(null),Y().catch((F)=>{G(F instanceof Error?F.message:"Failed to continue safely"),X(!1)})}),f1(M2,{flexDirection:"column",paddingX:1,children:[f1(o$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),f1(o$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),f1(M2,{marginTop:1,flexDirection:"column",children:[f1(o$,{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)=>f1(o$,{children:[" ",K.path," · ",K.effects.length," effect(s)"]},`${K.kind}:${K.path}`,!0,void 0,this))]},void 0,!0,void 0,this),U&&f1(M2,{marginTop:1,children:f1(o$,{color:J.colors.error,children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),f1(M2,{marginTop:1,children:f1(o$,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as IX}from"ink";import{useEffect as TX}from"react";function xJ(){let{stdout:$}=IX();TX(()=>{if(!$.isTTY)return;return $.write(t6),$.write(CQ),()=>{$.write(s6),$.write(CQ)}},[$])}function lJ($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}import{jsxDEV as n$}from"react/jsx-dev-runtime";function fX($){if(Q1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");r0().setInitializationStatus("ready")}var xF=($)=>{xJ();let[Q,Y]=I2(!1),[J,Z]=I2(null),[X,U]=I2(!1),[G,K]=I2(null),q=C2((_,B)=>{let z=_ instanceof Error?_.message:String(_);if(r0().setInitializationError(z),r0().setInitializationStatus("error"),Y(!0),B)console.error("[FAIL] 应用初始化失败:",z)}),F=C2(async()=>{try{let _=Q1().config.config??rJ,B=aJ(_,$);if(fX(B),B.resumeSessionId)iJ().restoreSession(B.resumeSessionId,[]);if(B.debug)console.error("[Debug] 运行时配置:",B);let z=B.theme;if(z&&d0.hasTheme(z)){if(d0.setTheme(z),$.debug)console.log(`[OK] 已加载主题: ${z}`)}try{q1.getInstance().loadConfig(B.hooks||{},u0());let W=await oJ(u0());if($.debug&&B.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${W.subagents.getAllNames().length} agents, ${W.skills.size} skills, ${W.commands.getCommandCount()+W.commands.getPluginCommandCount()} commands, ${W.plugins.getAll().length} plugins`);let T=Q1().session.sessionId;dJ(T)}catch(L){if($.debug)console.warn("Hooks 初始化失败:",lJ(L))}E8(async()=>{await tJ.getInstance().killAll(),await nJ.getInstance().disconnectAll(),q1.getInstance().cleanup()}),Y(!0)}catch(_){q(_,!!$.debug)}}),O=C2(async()=>{let _=await oQ.getInstance().getStatus(u0());if(_.state==="untrusted"||_.state==="error"){K(_);return}await F()}),N=C2(async()=>{if($.versionCheckPromise){let _=await $.versionCheckPromise;if(_){Z(_),U(!0);return}}await O()});if(vX(()=>{N()},[]),X&&J)return n$(L8,{children:n$(pJ,{versionInfo:J,onComplete:()=>{U(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(G)return n$(L8,{children:n$(uJ,{status:G,onTrust:async()=>{await oQ.getInstance().trust(u0()),await sJ(),K(null),await F()},onContinueSafely:async()=>{K(null),await F()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return n$(L8,{children:n$(hJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{xF as AppWrapper};