blade-code 0.10.47 → 0.10.64

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 (114) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-0d1197b9.js +1 -0
  3. package/dist/chunk-0jxh2zq5.js +5 -0
  4. package/dist/{chunk-26wse17p.js → chunk-1jc7d3nt.js} +2 -2
  5. package/dist/chunk-1vw79f30.js +1 -0
  6. package/dist/chunk-1wr6hrwt.js +1 -0
  7. package/dist/{chunk-94zrzfyz.js → chunk-2m7at619.js} +2 -2
  8. package/dist/{chunk-sqd5ge5s.js → chunk-2xbmkyb2.js} +1 -1
  9. package/dist/{chunk-0qsssahq.js → chunk-2z3xe3rw.js} +1 -1
  10. package/dist/{chunk-1h9pcmkk.js → chunk-3m640njb.js} +2 -2
  11. package/dist/{chunk-fk4wbmv6.js → chunk-3tednchw.js} +2 -2
  12. package/dist/chunk-5g2p1fwn.js +2 -0
  13. package/dist/{chunk-qp2z1r7y.js → chunk-69rc9hw6.js} +1 -1
  14. package/dist/chunk-6fwh0m6d.js +45 -0
  15. package/dist/{chunk-c9s4n31b.js → chunk-6g3qzz9h.js} +1 -1
  16. package/dist/{chunk-2eddqgnh.js → chunk-6rg6mngq.js} +1 -1
  17. package/dist/chunk-7781czcd.js +1 -0
  18. package/dist/{chunk-m8ss9rmx.js → chunk-7b467h8k.js} +1 -1
  19. package/dist/chunk-7p0bzza4.js +44 -0
  20. package/dist/{chunk-hr79r0ee.js → chunk-81pdgcq7.js} +2 -2
  21. package/dist/{chunk-8vtyatd6.js → chunk-83wm4akj.js} +1 -1
  22. package/dist/chunk-86gc2mqb.js +1 -0
  23. package/dist/{chunk-cxzx7j0p.js → chunk-87jz5600.js} +1 -1
  24. package/dist/{chunk-yk9pxkc1.js → chunk-8ekk8pa7.js} +1 -1
  25. package/dist/chunk-9c31jemm.js +1 -0
  26. package/dist/chunk-9kmtcgm6.js +2 -0
  27. package/dist/{chunk-mrsc4a55.js → chunk-9r0yebs1.js} +1 -1
  28. package/dist/chunk-9zdx6jsh.js +160 -0
  29. package/dist/chunk-acfka6w7.js +1 -0
  30. package/dist/{chunk-6pz076m9.js → chunk-addsr9hg.js} +2 -2
  31. package/dist/{chunk-kr5wj66e.js → chunk-as5z4m2d.js} +1 -1
  32. package/dist/{chunk-hfrcwkc8.js → chunk-av10vmxk.js} +1 -1
  33. package/dist/chunk-avhwgbg0.js +1 -0
  34. package/dist/{chunk-9rrced3b.js → chunk-b19f55s7.js} +1 -1
  35. package/dist/chunk-bcp7nwwy.js +10 -0
  36. package/dist/chunk-bjz7t9fe.js +8 -0
  37. package/dist/{chunk-q78s028m.js → chunk-cm9mph7j.js} +1 -1
  38. package/dist/{chunk-qb0sqh29.js → chunk-cz68x56m.js} +2 -2
  39. package/dist/{chunk-tpa75y39.js → chunk-d1t91jgz.js} +1 -1
  40. package/dist/{chunk-b29dn3xe.js → chunk-d9z0rbz1.js} +2 -2
  41. package/dist/chunk-dbs94h44.js +1 -0
  42. package/dist/{chunk-2yvte5a7.js → chunk-detkh4dd.js} +1 -1
  43. package/dist/{chunk-f4sp074f.js → chunk-eeac8teg.js} +1 -1
  44. package/dist/{chunk-7pprh90t.js → chunk-egb457mv.js} +1 -1
  45. package/dist/chunk-ej6h16ae.js +3 -0
  46. package/dist/{chunk-hcm55r3d.js → chunk-fp1h8wdh.js} +1 -1
  47. package/dist/chunk-g0n88mhg.js +1 -0
  48. package/dist/{chunk-yp1vvxyc.js → chunk-gdrqxnzh.js} +1 -1
  49. package/dist/{chunk-7fqsgdee.js → chunk-j9snkjpe.js} +2 -2
  50. package/dist/{chunk-v9tzhe90.js → chunk-jk8bqc5b.js} +2 -2
  51. package/dist/{chunk-v287pexf.js → chunk-jy1e6ve5.js} +2 -2
  52. package/dist/chunk-khkhsaan.js +2 -0
  53. package/dist/{chunk-kfpzrmq7.js → chunk-kjvntyr5.js} +1 -1
  54. package/dist/{chunk-yre5973e.js → chunk-pdys123h.js} +1 -1
  55. package/dist/chunk-pxy15vf3.js +710 -0
  56. package/dist/chunk-q8zp4je9.js +1 -0
  57. package/dist/{chunk-y6tkxqjx.js → chunk-qs4erqd0.js} +2 -2
  58. package/dist/{chunk-nxcc0fbe.js → chunk-rctbavme.js} +2 -2
  59. package/dist/{chunk-pgz8t0mk.js → chunk-rcv4q8hm.js} +1 -1
  60. package/dist/{chunk-26p6t5f2.js → chunk-tcga95a4.js} +2 -2
  61. package/dist/chunk-vjyysxhx.js +1 -0
  62. package/dist/chunk-wqewxnez.js +1621 -0
  63. package/dist/{chunk-5wjnbhpg.js → chunk-wrw5hegj.js} +2 -2
  64. package/dist/{chunk-k5f4kx9z.js → chunk-wt4wv5rb.js} +1 -1
  65. package/dist/{chunk-56qew7w0.js → chunk-wwsg165p.js} +2 -2
  66. package/dist/{chunk-k2wnxzdx.js → chunk-wy2b5hsh.js} +1 -1
  67. package/dist/{chunk-wwvb6znp.js → chunk-wy4pn9sk.js} +1 -1
  68. package/dist/chunk-xm44tqjb.js +1 -0
  69. package/dist/{chunk-z699m84q.js → chunk-y78m734s.js} +53 -53
  70. package/dist/chunk-y83x0w26.js +1 -0
  71. package/dist/{chunk-fhnkyqfb.js → chunk-y8r2knxm.js} +2 -2
  72. package/dist/chunk-z2hmx0jz.js +6 -0
  73. package/dist/{chunk-e8zc6vbq.js → chunk-z8heg5qv.js} +1 -1
  74. package/dist/web/assets/ChatView-B6IO9U-D.js +18 -0
  75. package/dist/web/assets/{CodeBlockHighlighter-D5L0d-8-.js → CodeBlockHighlighter-DVGtFQgX.js} +1 -1
  76. package/dist/web/assets/{FilePreview-Cb2olorI.js → FilePreview-C-8_o7yw.js} +1 -1
  77. package/dist/web/assets/{MarkdownRenderer-7ymM1e5M.js → MarkdownRenderer-D04IKQhF.js} +3 -3
  78. package/dist/web/assets/{SettingsModal-D6hLNUk9.js → SettingsModal-BMoZLVEe.js} +1 -1
  79. package/dist/web/assets/{TaskSwitcher-DAAp5x-y.js → TaskSwitcher-CIuCEbvU.js} +1 -1
  80. package/dist/web/assets/{TerminalPanel-BpDMAo49.js → TerminalPanel-fTk9D5hU.js} +1 -1
  81. package/dist/web/assets/{index-BdsO44FI.js → index-CO5sUiJn.js} +4 -4
  82. package/dist/web/assets/index-Dxdnbd79.css +1 -0
  83. package/dist/web/assets/{session-events-DJh6SZcl.js → session-events-BvtUOaNG.js} +8 -8
  84. package/dist/web/index.html +3 -3
  85. package/package.json +12 -2
  86. package/dist/chunk-0b1qj502.js +0 -45
  87. package/dist/chunk-12akr5tm.js +0 -1
  88. package/dist/chunk-1906ftqm.js +0 -1
  89. package/dist/chunk-3y784b9c.js +0 -1
  90. package/dist/chunk-4ntsj9x5.js +0 -1
  91. package/dist/chunk-5x4v6tkt.js +0 -1
  92. package/dist/chunk-64z1vsd7.js +0 -1612
  93. package/dist/chunk-6cx4t8r6.js +0 -1
  94. package/dist/chunk-6tcagnpd.js +0 -1
  95. package/dist/chunk-74nmcybn.js +0 -1
  96. package/dist/chunk-7sna3js9.js +0 -2
  97. package/dist/chunk-85d5jmk3.js +0 -1
  98. package/dist/chunk-b76w8nsk.js +0 -10
  99. package/dist/chunk-bvf9syb2.js +0 -3
  100. package/dist/chunk-cwcngsfq.js +0 -8
  101. package/dist/chunk-de1s7f6p.js +0 -710
  102. package/dist/chunk-egczvfsv.js +0 -5
  103. package/dist/chunk-fer18bbe.js +0 -1
  104. package/dist/chunk-j7edwwg1.js +0 -2
  105. package/dist/chunk-nvjkw9e5.js +0 -1
  106. package/dist/chunk-pxqgt2h6.js +0 -2
  107. package/dist/chunk-rcjpv1qs.js +0 -160
  108. package/dist/chunk-sx4mkt0c.js +0 -44
  109. package/dist/chunk-t1wxd1hj.js +0 -1
  110. package/dist/chunk-va43bd74.js +0 -6
  111. package/dist/chunk-xwe22whb.js +0 -1
  112. package/dist/chunk-z1aqe7ms.js +0 -1
  113. package/dist/web/assets/ChatView-DsPSY2pr.js +0 -18
  114. package/dist/web/assets/index-7zaeanZL.css +0 -1
@@ -0,0 +1,160 @@
1
+ import{b as $Y,c as QY,d as JY}from"./chunk-z8heg5qv.js";import{j as zJ,k as _J}from"./chunk-83wm4akj.js";import{u as c8}from"./chunk-egb457mv.js";import{$ as SJ,B as B6,D as FY,F as s2,G as a2,H as U6,N as h1,P as V4,Q as j4,V as Y8,W as TJ,X as fJ,_ as kJ,da as $4,ea as v6,ga as f6,ha as k6,ia as HY,ja as d4,la as r4,na as w6}from"./chunk-wqewxnez.js";import{ra as c9,sa as x9,ta as u9,wa as NY}from"./chunk-3m640njb.js";import"./chunk-qs4erqd0.js";import{Za as s4,_a as e4,nb as $6,wb as u2}from"./chunk-y78m734s.js";import{Fb as K8}from"./chunk-9r0yebs1.js";import{Cc as P0,Yb as a4,bc as v4,gc as D4,nc as g4,oc as x2,pc as m4,rc as V8,zc as J8}from"./chunk-jy1e6ve5.js";import"./chunk-2z3xe3rw.js";import"./chunk-wwsg165p.js";import{cd as sJ}from"./chunk-jk8bqc5b.js";import{dd as G8,ed as x8,gd as f1}from"./chunk-rctbavme.js";import"./chunk-3tednchw.js";import{Ad as Z8,Dd as u4,Kd as m0,kd as C$,ld as r0,md as Q$,nd as yQ,od as v$,pd as j8,qd as O9,rd as uQ,sd as YJ,td as z9,ud as f$,vd as $1,wd as zY,xd as a0,yd as tJ,zd as P2}from"./chunk-2m7at619.js";import"./chunk-v508x7cg.js";import"./chunk-wy4pn9sk.js";import"./chunk-0jxh2zq5.js";import{Xd as lQ}from"./chunk-j9snkjpe.js";import"./chunk-69rc9hw6.js";import"./chunk-d9z0rbz1.js";import{ge as C6,je as xJ,oe as IJ,xe as _Y}from"./chunk-pxy15vf3.js";import"./chunk-d1t91jgz.js";import"./chunk-detkh4dd.js";import"./chunk-2xbmkyb2.js";import{Ne as CQ,Pe as z1}from"./chunk-6fwh0m6d.js";import"./chunk-87jz5600.js";import{Rf as UY,Wf as CJ,Xf as OY}from"./chunk-7p0bzza4.js";import"./chunk-khkhsaan.js";import"./chunk-7b467h8k.js";import{eg as D$,fg as h8,gg as IQ}from"./chunk-9kmtcgm6.js";import{kg as l0}from"./chunk-kjvntyr5.js";import"./chunk-8ekk8pa7.js";import{Ig as qY,Lg as e1}from"./chunk-y8r2knxm.js";import{Ng as qJ,Og as UJ,Rg as E1}from"./chunk-1jc7d3nt.js";import"./chunk-fp1h8wdh.js";import{bh as s9}from"./chunk-5g2p1fwn.js";import{dh as eQ}from"./chunk-ej6h16ae.js";import"./chunk-cm9mph7j.js";import"./chunk-cz68x56m.js";import{ph as MQ}from"./chunk-av10vmxk.js";import{useMemoizedFn as v2}from"ahooks";import{useEffect as Q7,useState as D2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as z$}from"ink";import{useEffect as _$,useMemo as iX,useRef as f2}from"react";import{useShallow as LY}from"zustand/react/shallow";import{useStore as WY}from"zustand";function t($){return WY(f$,$)}var BY=[],k$=()=>t(($)=>$.session.sessionId),T1=()=>t(($)=>$.session.workspaceRoot),Q4=()=>t(($)=>$.session.messages),J4=()=>t(($)=>$.session.clearCount),Y4=()=>t(($)=>$.session.isCompacting),Z4=()=>t(($)=>$.session.tokenUsage.estimatedCostUsd),X4=()=>t(($)=>{let{totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}=$.session.tokenUsage;return $4({totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}).hitRate}),K4=()=>t(($)=>$.session.providerCircuit),G4=()=>t(($)=>$.session.providerAdmission),q4=()=>t(($)=>$.session.providerRetry),U4=()=>t(($)=>$.session.providerStall),O4=()=>t(($)=>$.session.actionStationarity),n1=()=>t(($)=>$.session.actions),z4=()=>t(($)=>{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=()=>t(($)=>$.app.initializationStatus),N4=()=>t(($)=>$.app.initializationError),y8=()=>t(($)=>$.app.activeModal),F4=()=>t(($)=>$.app.tasks),H4=()=>t(($)=>$.app.modelEditorTarget),W4=()=>t(($)=>$.app.sessionSelectorData),L4=()=>t(($)=>$.app.awaitingSecondCtrlC),t1=()=>t(($)=>$.app.actions),R8=()=>t(($)=>$.app.initializationStatus==="ready"),B4=()=>t(($)=>$.app.tasks.length>0),S$=()=>t(($)=>$.config.config?.permissionMode||"default"),w4=()=>t(($)=>$.config.config?.models??BY),M8=()=>t(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),C8=()=>t(($)=>$.config.config?.currentModelId),A0=()=>t(($)=>{return r0.getTheme()}),b4=()=>t(($)=>$.config.config?.codeTheme??"default"),e0=()=>t(($)=>$.focus.currentFocus),A4=()=>t(($)=>$.focus.actions),s1=()=>t(($)=>$.command.isProcessing),P4=()=>t(($)=>$.command.actions),I8=()=>t(($)=>$.command.pendingCommands),y4=()=>t(($)=>$.command.recoveredSteeringCount),T8=()=>t(($)=>$.app.thinkingModeEnabled),f8=()=>t(($)=>$.app.reasoningEffort),k8=()=>t(($)=>$.app.serviceTier),S8=()=>t(($)=>$.app.responseVerbosity),v8=()=>t(($)=>$.app.communicationStyle),R4=()=>t(($)=>$.session.currentThinkingContent),M4=()=>t(($)=>$.session.thinkingExpanded),C4=()=>t(($)=>$.session.currentStreamingMessageId),I4=()=>t(LY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),T4=()=>t(($)=>$.session.finalizingStreamingMessageId),f4=()=>t(($)=>$.session.historyExpanded),k4=()=>t(($)=>$.session.expandedMessageCount);import{useMemoizedFn as j$}from"ahooks";import{useEffect as l8,useRef as t4}from"react";function wY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let K=JSON.parse(J.responseBody)?.error?.message;if(K){let q=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${K}${q}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function bY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function AY($){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 D8($){let Q=bY($),Y=AY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=wY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as PY,mkdirSync as yY,writeFileSync as RY}from"node:fs";import MY from"node:os";import h2 from"node:path";var S4=null;function CY(){let $=process.env.BLADE_STORAGE_ROOT||h2.join(MY.homedir(),".blade");return h2.join($,"logs","stream-debug.log")}function IY($){if(S4===$)return;let Q=h2.dirname($);yY(Q,{recursive:!0,mode:493}),RY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
+ `),S4=$}function E2($,Q,Y){try{let J=CY();IY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",K=`[${Z}] [${$}] ${Q}${X}
3
+ `;PY(J,K)}catch{}}var Q8=e1("UI");function h4($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,E2("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($.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Q8.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),E2("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(),K=$.getStreamingMessageId();if(K){if(Z)v$(K,Z);j8(K)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"provider_admission":{let{kind:Z,...X}=J;$.sessionActions.setProviderAdmission(J.phase==="queued"?X:null);break}case"provider_circuit":{let{kind:Z,...X}=J;$.sessionActions.setProviderCircuit(J.phase==="closed"?null:X);break}case"provider_retry":{let{kind:Z,...X}=J;$.sessionActions.setProviderRetry(J.phase==="recovered"?null:X);break}case"provider_stall":{let{kind:Z,...X}=J;$.sessionActions.setProviderStall(J.phase==="detected"?X:null);break}case"action_stationarity":{let{kind:Z,...X}=J;$.sessionActions.setActionStationarity(J.phase==="recovered"?null:X);break}case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===V8)break;if(Q8.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),K=V4(Z.function.name,X);$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:K,params:X})}catch(X){Q8.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===V8)break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",K=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:K,...J.update.admission?{admission:J.update.admission}:{}});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===V8)break;Q8.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=D4(j4(Z.function.name,J.result),v4);$.sessionActions.addToolMessage(X.summary,{toolCallId:Z.id,toolName:Z.function.name,phase:"complete",summary:X.summary,detail:X.detail});break}case"structured_output":$.sessionActions.replaceLastAssistantMessage(JSON.stringify(J.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(J.usage);break;case"compaction":if($.sessionActions.setCompacting(J.phase==="start"),J.phase==="end"){if($.sessionActions.resetContextUsage(),J.outcome!=="failed")Q.compactionCount=(Q.compactionCount??0)+1}break;case"turn_start":Q8.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),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
+ `)});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
+ `)});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
+ `)});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(`
7
+ `)});break}case"mcp_instructions_changed":{let Z=`MCP instructions ${J.action}: ${J.serverName}`+(J.truncated?" (truncated)":"");$.sessionActions.addToolMessage(Z,{toolName:"MCP Instructions",phase:"complete",summary:Z,detail:[J.text??"",J.sha256?`sha256: ${J.sha256}`:"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
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
+ `)});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
+ `)});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((K)=>K.type==="text"?K.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 m2($){let{text:Q,parts:Y}=$,J=Y.filter((K)=>K.type==="image");if(J.length===0)return Q;if(J.length>D$)throw Error(`最多只能发送 ${D$} 张图片`);if(J.reduce((K,q)=>K+`data:${q.mimeType};base64,`.length+q.base64.length,0)>h8)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let K of Y)if(K.type==="text")X.push({type:"text",text:K.text});else X.push({type:"image_url",image_url:{url:`data:${K.mimeType};base64,${K.base64}`}});return X}function E4($){let Q=m4($.metadata);return{role:$.role,content:Q?g4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function E8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(E4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(E4);return[...$.restoredContextMessages,...Q]}import TY from"node:path";function p4($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function fY($){return TY.resolve($)}function c4($){if(!$||!u4($))return;$1().config.actions.updateConfig({currentModelId:$})}function x4($){if(!$)return;$1().config.actions.updateConfig({permissionMode:$})}async function g8($,Q){return P0.listSessions({includeSubagents:!1})}async function m8($,Q,Y,J){let{intent:Z,session:X,newSessionId:K,announceFork:q,permissionModeOverride:G}=$,U=fY(X.projectPath);if(Z==="fork"){let z=await P0.forkSession(X.sessionId,{...K?{newSessionId:K}:{},sourceProjectPath:U,targetProjectPath:U}),w=await P0.loadSessionModelContext(z.sessionId,z.metadata.projectPath),_=[...P0.toUISafeMessages(z.messages)];if(q!==!1){let F=Date.parse(z.metadata.lastMessageTime);_.push({id:"fork-announcement-"+z.sessionId,role:"assistant",content:"Forked "+p4(X.sessionId)+" → "+p4(z.sessionId),timestamp:Number.isNaN(F)?0:F})}return await J(),x4(G??z.metadata.permissionMode),c4(z.metadata.selectedModelId),Y.restoreSession(z.sessionId,_,w,z.metadata.projectPath),{sessionId:z.sessionId,messages:w}}await P0.assertSessionWritable(X.sessionId,X.projectPath);let[W,O]=await Promise.all([P0.loadSession(X.sessionId,X.projectPath),P0.loadSessionModelContext(X.sessionId,X.projectPath)]),H=P0.toUISafeMessages(W);return await J(),x4(G??X.permissionMode),c4(X.selectedModelId),Y.restoreSession(X.sessionId,H,O,X.projectPath),{sessionId:X.sessionId,messages:O}}function l4($){return typeof $==="object"&&$!==null&&typeof $.sessionId==="string"&&typeof $.projectPath==="string"&&typeof $.rootId==="string"&&typeof $.messageCount==="number"&&typeof $.firstMessageTime==="string"&&typeof $.lastMessageTime==="string"&&typeof $.hasErrors==="boolean"}function kY($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function SY($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function vY($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function DY($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function VY($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function jY($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function hY($){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)=>l4(Z))}if(Y==="activate_session")return l4($.session);return!1}function EY($,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} 已归档。`:"当前会话已归档。"),f1(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 f1(0),!0;default:return!1}}async function p2($,Q,Y,J,Z,X,K,q,G,U,W,O,H,z,w=l0(),_){let{text:F}=$;if(!d4(F))return{type:"not_slash"};let N=await r4(F,{cwd:w,surface:"tui",workspaceRoot:w,sessionId:X,messages:K,rewind:q,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),P0.archiveSession(X,w)}},subagents:G,mcp:U,reasoning:W,serviceTier:O,responseVerbosity:H,communicationStyle:z,codeReview:_,signal:J});if(N.success&&hY(N.data)){if(N.data.action==="select_session")return Q.showSessionSelector(N.data.sessions,N.data.intent),{type:"handled",commandResult:{success:!0}};return await m8(N.data,w,Y,Z),{type:"handled",commandResult:{success:!0}}}if(N.success&&jY(N.data))return Y.restoreSession(N.data.sessionId,N.data.visibleMessages,N.data.messages),Q.setTasks([]),{type:"handled",commandResult:{success:!0}};if(N.message){if(EY(N.message,N.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(kY(N.data)){let{skillName:R,skillArgs:B}=N.data,f=B?`Please use the "${R}" skill to help me with: ${B}`:`Please use the "${R}" skill.`;return Y.addUserMessage(f),{type:"continue_as_agent",result:{userDisplayMessage:f,agentInput:{displayText:f,text:f,images:[],parts:[{type:"text",text:f}]},userMessageAlreadyAdded:!0}}}if(SY(N.data)){let{commandName:R,processedContent:B}=N.data;Y.addUserMessage(F);let f=`# Custom Command: /${R}
12
+
13
+ The user has invoked the custom command "/${R}". Follow the instructions below to complete the task.
14
+
15
+ ---
16
+
17
+ ${B}
18
+
19
+ ---
20
+
21
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:f,images:[],parts:[{type:"text",text:f}]},userMessageAlreadyAdded:!0}}}if(vY(N.data)){let{commandName:R,pluginName:B,processedContent:f}=N.data;Y.addUserMessage(F);let P=`# Plugin Command: /${R}
22
+
23
+ The user has invoked the plugin command "/${R}" from plugin "${B}". Follow the instructions below to complete the task.
24
+
25
+ ---
26
+
27
+ ${f}
28
+
29
+ ---
30
+
31
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(DY(N.data)){let{modelId:R,prompt:B}=N.data;return Y.addUserMessage(B),{type:"continue_as_agent",result:{userDisplayMessage:B,agentInput:{displayText:B,text:B,images:[],parts:[{type:"text",text:B}]},userMessageAlreadyAdded:!0,onceModelId:R}}}if(VY(N.data)){let R=N.data.goal.objective;return Y.addUserMessage(F),{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:R,images:[],parts:[{type:"text",text:R}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!N.success&&N.error)return Y.addAssistantMessage(`${N.error}`),{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}};let S=N.message;if(N.success&&typeof S==="string"&&S.trim()!=="")Y.addAssistantMessage(S);return{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}}}import{useMemoizedFn as R0}from"ahooks";import{useEffect as gY,useRef as p8}from"react";function i4($){let Q=p8(void 0),Y=p8(void 0),J=p8(void 0),Z=p8(void 0),X=R0(async()=>{if(Z.current)return Z.current;let I=Q.current,y=Y.current;if(!I&&!y)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let v=(async()=>{try{await I?.destroy()}finally{await y?.dispose()}})();Z.current=v;try{await v}finally{if(Z.current===v)Z.current=void 0}}),K=R0(async(I)=>{let y=$.workspaceRoot??Y.current?.workspaceRoot??l0();if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==y))await X();if(!Y.current){let v=await P0.findSessionMetadata(I,y),b=v!==void 0&&(await P0.loadSession(I,y)).length>0;Y.current=await h1.create({sessionId:I,workspaceRoot:y,modelId:$.modelId,permissionMode:$.permissionMode??v?.permissionMode,reasoningEffort:v?.reasoningEffort??$.reasoningEffort,serviceTier:v?.serviceTier??$.serviceTier,responseVerbosity:v?.responseVerbosity??$.responseVerbosity,communicationStyle:v?.communicationStyle??$.communicationStyle,communicationStyleDigest:v?.communicationStyleDigest,agents:$.agents,...b?{sessionStart:{isResume:!0,resumeSessionId:I}}:{}});try{J.current={sessionId:I,modelId:v?.selectedModelId,permissionMode:v?.permissionMode,reasoningEffort:v?.reasoningEffort,serviceTier:v?.serviceTier,responseVerbosity:v?.responseVerbosity,communicationStyle:v?.communicationStyle,communicationStyleDigest:v?.communicationStyleDigest},a0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),a0().setServiceTier(Y.current.getServiceTierConfiguration().selection),a0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),a0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(V){let p=Y.current;throw Y.current=void 0,await p.dispose().catch(()=>{return}),V}}return Y.current}),q=R0(async(I)=>{let y=I?.sessionId??$.sessionId,v=!!I?.modelId&&I.modelId!==$.modelId,b;if(!v&&y){let V=Y.current!==void 0,p=await K(y),j=I?.modelId??$.modelId,h=I?.reasoningEffort??(V?$.reasoningEffort:p.getReasoningConfiguration().selection),E=I?.serviceTier??(V?$.serviceTier:p.getServiceTierConfiguration().selection),Z0=I?.responseVerbosity??(V?$.responseVerbosity:p.getResponseVerbosityConfiguration().selection),J0=I?.communicationStyle??(V?$.communicationStyle:p.getCommunicationStyleConfiguration().selection),w0=p.getCurrentModelId(),f0=p.getReasoningConfiguration(),c0=p.getServiceTierConfiguration(),h0=p.getResponseVerbosityConfiguration(),H1=p.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==y||J.current.permissionMode!==$.permissionMode)){let s0=await P0.setSessionPermissionMode(y,p.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:y,permissionMode:s0.permissionMode}}await p.refresh({modelId:j,...h?{reasoningEffort:h}:{},...E?{serviceTier:E}:{},...Z0?{responseVerbosity:Z0}:{},...J0?{communicationStyle:J0}:{}});let I1=p.getCommunicationStyleConfiguration();if(I1.source!=="built-in"&&!I1.contentSha256)throw Error("Custom communication style has no provenance");let T$={...j&&j!=="inherit"&&(J.current?.sessionId!==y||J.current.modelId!==j)?{selectedModelId:j}:{},...h&&(J.current?.sessionId!==y||J.current.reasoningEffort!==h)?{reasoningEffort:h}:{},...E&&(J.current?.sessionId!==y||J.current.serviceTier!==E)?{serviceTier:E}:{},...Z0&&(J.current?.sessionId!==y||J.current.responseVerbosity!==Z0)?{responseVerbosity:Z0}:{},...J0&&(J.current?.sessionId!==y||J.current.communicationStyle!==J0||J.current.communicationStyleDigest!==I1.contentSha256)?{communicationStyle:J0,communicationStyleDigest:I1.source==="built-in"?null:I1.contentSha256}:{}};if(Object.keys(T$).length>0)try{let s0=await P0.updateSessionMetadata(y,p.workspaceRoot,T$);J.current={sessionId:y,modelId:s0.selectedModelId,permissionMode:s0.permissionMode,reasoningEffort:s0.reasoningEffort,serviceTier:s0.serviceTier,responseVerbosity:s0.responseVerbosity,communicationStyle:s0.communicationStyle,communicationStyleDigest:s0.communicationStyleDigest}}catch(s0){throw await p.refresh({...w0?{modelId:w0}:{},reasoningEffort:f0.selection,serviceTier:c0.selection,responseVerbosity:h0.selection,communicationStyle:H1.selection}).catch(()=>{return}),s0}b=await Y8.createWithRuntime(p,{sessionId:y,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents})}else b=await Y8.create({systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents});return Q.current=b,b}),G=R0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await K($.sessionId)).listRewindCheckpoints()}),U=R0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let v=await(await K($.sessionId)).rewindSession(I);return await X(),v}),W=R0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await K($.sessionId)).listSubagents()}),O=R0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for subagent control");let v=await K($.sessionId),b=!1,V,p=I,j=(E)=>{let Z0=E.status==="completed"?E.result?.message:E.result?.error||E.result?.message;f$.getState().app.actions.completeSubagentProgress(p,E.status==="completed",Z0)},h=v.resumeSubagent({agentId:I,prompt:y,onEvent:(E)=>{if(E.kind==="tool_start"&&"function"in E.toolCall)f$.getState().app.actions.updateSubagentTool(p,E.toolCall.function.name)},onCompleted:(E)=>{if(b)j(E);else V=E}});if(p=h.session.id,f$.getState().app.actions.startSubagentProgress(h.session.id,h.session.subagentType,`Resumed from ${h.source.id}: ${h.session.description}`),b=!0,V)j(V);return h}),H=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await K($.sessionId)).getMcpContentCatalog()}),z=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await K($.sessionId)).refreshMcpContentCatalogs(I)}),w=R0(async(I,y,v)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await K($.sessionId)).getMcpPrompt(I,y,v)}),_=R0(async(I,y,v)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await K($.sessionId)).completeMcpArgument(I,y,v)}),F=R0(async(I,y={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await K($.sessionId)).getMcpLogs(I,y)}),C=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).listMcpTasks(I)}),N=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).getMcpTask(I)}),S=R0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).cancelMcpTask(I,y)}),R=R0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await K($.sessionId)).setMcpLoggingLevel(I,y)}),B=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await K($.sessionId)).getMcpInstructions()}),f=R0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await K($.sessionId)).getReasoningConfiguration()}),P=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let v=y.getReasoningConfiguration();if(y.resolveReasoningConfiguration(I),v.selection===I)return v;await y.refresh({reasoningEffort:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{reasoningEffort:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:I,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setReasoningEffort(I),y.getReasoningConfiguration()}catch(b){throw await y.refresh({reasoningEffort:v.selection}),b}}),A=R0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await K($.sessionId)).getServiceTierConfiguration()}),T=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for service tier");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let v=y.getServiceTierConfiguration();if(y.resolveServiceTierConfiguration(I),v.selection===I)return v;await y.refresh({serviceTier:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{serviceTier:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:I,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setServiceTier(I),y.getServiceTierConfiguration()}catch(b){throw await y.refresh({serviceTier:v.selection}),b}}),M=R0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await K($.sessionId)).getResponseVerbosityConfiguration()}),L=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let v=y.getResponseVerbosityConfiguration();if(y.resolveResponseVerbosityConfiguration(I),v.selection===I)return v;await y.refresh({responseVerbosity:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{responseVerbosity:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:I,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setResponseVerbosity(I),y.getResponseVerbosityConfiguration()}catch(b){throw await y.refresh({responseVerbosity:v.selection}),b}}),k=R0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await K($.sessionId)).getCommunicationStyleConfiguration()}),g=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for communication style");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let v=y.getCommunicationStyleConfiguration(),b=y.resolveCommunicationStyleConfiguration(I);if(b.source!=="built-in"&&!b.contentSha256)throw Error("Custom communication style has no provenance");if(v.selection===I)return v;await y.refresh({communicationStyle:I});try{let V;try{V=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{communicationStyle:I,communicationStyleDigest:b.source==="built-in"?null:b.contentSha256})}catch(p){if(!(p instanceof J8)&&p.code!=="ENOENT")throw p;V=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:I,...b.source!=="built-in"&&b.contentSha256?{communicationStyleDigest:b.contentSha256}:{}})}return J.current={sessionId:$.sessionId,modelId:V.selectedModelId,permissionMode:V.permissionMode,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},a0().setCommunicationStyle(I),y.getCommunicationStyleConfiguration()}catch(V){throw await y.refresh({communicationStyle:v.selection}),V}}),o=R0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),l=R0(async(I,y)=>{let v=$.sessionId;if(!v)throw Error("User shell command requires a Session");return(await K(v)).executeUserShellCommand(I,y)}),a=R0(async(I,y)=>{let v=$.sessionId;if(!v)throw Error("Code review requires a Session");let b=await K(v);await c8.recoverInterrupted(b.workspaceRoot,v,b);let V=await c8.start({sessionId:v,projectPath:b.workspaceRoot,runtime:b,request:I,signal:y}),p=await V.completion,j=(await c8.list(b.workspaceRoot,v)).find((h)=>h.start.reviewId===V.reviewId);if(!j)throw Error(`Review not found after completion: ${V.reviewId}`);return{reviewId:V.reviewId,status:p.status,findings:p.findings.length,content:a4(j.start,p)}});return gY(()=>{let I=x8(X);return()=>{I(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:q,cleanupAgent:X,steerActiveTurn:o,runCodeReview:a,executeUserShellCommand:l,listRewindCheckpoints:G,rewindSession:U,listSubagents:W,resumeSubagent:O,getMcpContentCatalog:H,refreshMcpContentCatalogs:z,getMcpPrompt:w,completeMcpArgument:_,listMcpTasks:C,getMcpTask:N,cancelMcpTask:S,getMcpLogs:F,setMcpLoggingLevel:R,getMcpInstructions:B,getReasoningConfiguration:f,setReasoningEffort:P,getServiceTierConfiguration:A,setServiceTier:T,getResponseVerbosityConfiguration:M,setResponseVerbosity:L,getCommunicationStyleConfiguration:k,setCommunicationStyle:g}}import{useMemoizedFn as V$}from"ahooks";import{useEffect as mY,useRef as u8}from"react";function o4($){let Q=0;for(let Y of $)if(Y===`
32
+ `)Q++;return Q}function n4($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=u8(""),K=u8(null),q=u8(""),G=u8(null),U=V$(()=>{if(X.current){let _=X.current,F=$.appendAssistantContent(_);v$(F,_),X.current=""}if(K.current)clearTimeout(K.current),K.current=null}),W=V$(()=>{if(q.current)$.appendThinkingContent(q.current),q.current="";if(G.current)clearTimeout(G.current),G.current=null}),O=V$((_)=>{X.current+=_;let F=X.current;if(o4(F)>=J||F.length>=Z){U();return}if(!K.current)K.current=setTimeout(U,Y)}),H=V$((_)=>{q.current+=_;let F=q.current;if(o4(F)>=J||F.length>=Z){W();return}if(!G.current)G.current=setTimeout(W,Y)}),z=V$(()=>{if(X.current="",K.current)clearTimeout(K.current),K.current=null;if(q.current="",G.current)clearTimeout(G.current),G.current=null}),w=V$(()=>{if(K.current)clearTimeout(K.current),K.current=null;if(G.current)clearTimeout(G.current),G.current=null;let _=X.current,F=q.current;return X.current="",q.current="",{extraContent:_,extraThinking:F}});return mY(()=>{return()=>{z()}},[z]),{batchAppendContent:O,batchAppendThinking:H,flushContentBuffer:U,flushThinkingBuffer:W,resetStreamingBuffers:z,drainPendingBuffers:w}}var c2=e1("UI"),Q6=($,Q,Y,J,Z,X)=>{let K=s1(),q=k$(),G=T1(),U=C8(),W=S$(),O=T8(),H=f8(),z=k8(),w=S8(),_=v8(),F=n1(),C=t1(),N=P4(),S=t4(!1),R=t4(!1),{createAgent:B,cleanupAgent:f,steerActiveTurn:P,listRewindCheckpoints:A,rewindSession:T,listSubagents:M,resumeSubagent:L,getMcpContentCatalog:k,refreshMcpContentCatalogs:g,getMcpPrompt:o,completeMcpArgument:l,listMcpTasks:a,getMcpTask:I,cancelMcpTask:y,getMcpLogs:v,setMcpLoggingLevel:b,getMcpInstructions:V,getReasoningConfiguration:p,setReasoningEffort:j,getServiceTierConfiguration:h,setServiceTier:E,getResponseVerbosityConfiguration:Z0,setResponseVerbosity:J0,getCommunicationStyleConfiguration:w0,setCommunicationStyle:f0,runCodeReview:c0,executeUserShellCommand:h0}=i4({sessionId:q,workspaceRoot:G,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:U,permissionMode:W,reasoningEffort:H,serviceTier:z,responseVerbosity:w,communicationStyle:_,agents:X}),H1=n4(F),I1=j$(async(q0,y0)=>{if(q0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let Q0=q0.text.trimStart().slice(1).trim();if(!Q0)return{success:!1,error:"User shell command cannot be empty"};F.setCommand(`! ${Q0}`);try{let _0=await h0(Q0,{signal:y0});if(F.addMessage({id:`user-shell-${_0.executionId}`,role:"user",content:x2(_0.record),timestamp:Date.now(),metadata:{userShellCommand:_0.record}}),_0.delivery==="next_turn")R.current=!0;return{success:_0.record.status!=="spawn_error",output:x2(_0.record),..._0.record.status==="spawn_error"?{error:_0.record.stderr||"User shell command failed"}:{}}}finally{F.setCommand(null)}});l8(()=>{return()=>{H1.resetStreamingBuffers()}},[H1.resetStreamingBuffers]),l8(()=>{if(!O)F.setCurrentThinkingContent(null)},[O,F]);let T$=j$(()=>{if(!K)return;Z?.();let{extraContent:q0,extraThinking:y0}=H1.drainPendingBuffers();N.abort("user-cancel"),C.setTasks([]);let Q0=$1().session.currentStreamingMessageId;if(Q0){if(q0)v$(Q0,q0);j8(Q0)}if(F.finalizeStreamingMessage(q0,y0),!S.current)F.addAssistantMessage("任务已停止"),S.current=!0}),s0=j$(async(q0,y0)=>{let Q0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},_0=h4({sessionActions:F,appActions:C,commandActions:N,streamingBuffer:H1,thinkingModeEnabled:O,getStreamingMessageId:()=>$1().session.currentStreamingMessageId,signal:y0.signal},Q0);return{loopResult:await $6(q0,_0),stats:Q0}}),V2=j$(async(q0)=>{let y0=!1,Q0,_0=!1,x0=q0;try{if(q0.text.trimStart().startsWith("!")){let g0=N.getAbortController()??N.createAbortController();return await I1(q0,g0.signal)}await Z8();let K1=N.getAbortController()??N.createAbortController(),u0=E8($1().session),O1=await p2(q0,C,F,K1.signal,f,q,E8($1().session),{listCheckpoints:A,execute:T},{list:M,resume:L},{getCatalog:k,refresh:g,getPrompt:o,complete:l,listTasks:a,getTask:I,cancelTask:y,getLogs:v,setLoggingLevel:b,getInstructions:V},{get:p,set:j},{get:h,set:E},{get:Z0,set:J0},{get:w0,set:f0},G,{run:c0});if(O1.type==="handled")return O1.commandResult;if(O1.type==="continue_as_agent")y0=O1.result.userMessageAlreadyAdded,Q0=O1.result.onceModelId,_0=O1.result.goalContinuationOnly===!0,x0=O1.result.agentInput;let e$=z1.getInstance(),o1;if(!_0){let g0=await e$.executeUserPromptSubmitHooks(x0.text,{projectDir:G,sessionId:q,permissionMode:W,hasImages:x0.images.length>0,imageCount:x0.images.length});if(!g0.proceed){if(g0.warning)F.addAssistantMessage(`${g0.warning}`);return{success:!1,error:"blocked by hook"}}if(g0.updatedPrompt)x0={...x0,text:g0.updatedPrompt,displayText:g0.updatedPrompt,parts:[{type:"text",text:g0.updatedPrompt},...x0.parts.filter((A8)=>A8.type==="image")]};if(g0.contextInjection)o1=g0.contextInjection}if(!y0)F.addUserMessage(x0.displayText);let b8=m2(x0),r=await B(Q0?{modelId:Q0}:void 0);if(K1.signal.aborted)return c2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(o1)u0.push({role:"system",content:`<user-prompt-submit-hook>
33
+ ${o1}
34
+ </user-prompt-submit-hook>`});let K0={messages:u0,userId:"cli-user",sessionId:q,workspaceRoot:G,signal:K1.signal,confirmationHandler:Y,permissionMode:W,onPermissionModeChange:async(g0)=>{await m0().setPermissionMode(g0)}},{loopResult:k0,stats:$8}=await s0(r.chatStream(b8,K0,{stream:!0,goalContinuationOnly:_0,onTurnLimitReached:Y?async(g0)=>{let A8=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${g0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:A8.approved,reason:A8.reason}}:void 0}),K1);if($8.compactionCount>0)F.setCompactedContext(K0.messages);if(k0.metadata?.outputTruncated)F.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let j1=k0.finalMessage||"";if(c2.debug("[handleCommandSubmit] final reply",{success:k0.success,outputLength:j1.length,turnsCount:k0.metadata?.turnsCount,toolCallsCount:k0.metadata?.toolCallsCount}),!k0.success&&k0.error?.type==="api_error"){let g0=k0.error.message||"请求失败,请检查网络连接和 API 配置";return F.addAssistantMessage(g0),{success:!1,error:g0}}if(!j1||j1.trim()===""){let g0=k0.metadata?.abortReason;if(!S.current&&$8.contentDeltaCount===0&&g0!=="interrupt")return F.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:j1??""}}return{success:!0,output:j1}}catch(K1){if(S.current)return{success:!1,error:"aborted"};let u0=D8(K1);return F.addAssistantMessage(`${u0.displayMessage}`),{success:!1,error:u0.displayMessage}}}),V1=j$(async()=>{if($1().command.isProcessing){R.current=!0;return}let q0=await h1.hasPendingInbox(G,q),y0=!q0&&await h1.hasActiveGoal(G,q);if(!q0&&!y0){R.current=!1;return}if($1().command.isProcessing){R.current=!0;return}R.current=!1,await Z8();let Q0=N.createAbortController();H1.resetStreamingBuffers(),F.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let _0=await B();if(Q0.signal.aborted)return;let x0=await h1.hasPendingInbox(G,q),K1=!x0&&await h1.hasActiveGoal(G,q);if(!x0&&!K1)return;let u0={messages:E8($1().session),userId:"cli-user",sessionId:q,workspaceRoot:G,signal:Q0.signal,confirmationHandler:Y,permissionMode:W,onPermissionModeChange:async(o1)=>{await m0().setPermissionMode(o1)}},{loopResult:O1,stats:e$}=await s0(_0.chatStream("",u0,{stream:!0,pendingInputOnly:x0,goalContinuationOnly:K1}),Q0);if(e$.compactionCount>0)F.setCompactedContext(u0.messages);if(O1.metadata?.outputTruncated)F.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!O1.success&&O1.error?.type==="api_error")F.addAssistantMessage(O1.error.message||"恢复排队指令失败,请检查网络和 API 配置")}catch(_0){let x0=D8(_0);if(!x0.isAbort)F.setError(`恢复排队指令失败: ${x0.displayMessage}`)}finally{if(N.getAbortController()===Q0)N.setProcessing(!1),N.clearAbortController(Q0),F.setCurrentThinkingContent(null);if(R.current)queueMicrotask(()=>{V1()})}}),j2=j$(async(q0)=>{if(!q0.text.trim()&&q0.images.length===0)return;if(q0.text.trimStart().startsWith("!")&&K){let Q0=N.getAbortController();if(!Q0){F.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let _0=await I1(q0,Q0.signal);if(!_0.success&&_0.error&&_0.error!=="aborted")F.setError(_0.error);return}if(K){if(q0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(q0.text.trim())){await Z8();let u0=N.getAbortController()??N.createAbortController();await p2(q0,C,F,u0.signal,f,q,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,G);return}F.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await Z8();let Q0=await z1.getInstance().executeUserPromptSubmitHooks(q0.text,{projectDir:G,sessionId:q,permissionMode:W,hasImages:q0.images.length>0,imageCount:q0.images.length});if(!Q0.proceed){if(Q0.warning)F.addAssistantMessage(Q0.warning);return}let _0=q0;if(Q0.updatedPrompt)_0={...q0,text:Q0.updatedPrompt,parts:[{type:"text",text:Q0.updatedPrompt},...q0.parts.filter((u0)=>u0.type==="image")]};if(Q0.contextInjection){let u0=`<user-prompt-submit-hook>
35
+ ${Q0.contextInjection}
36
+ </user-prompt-submit-hook>`;_0={..._0,text:`${_0.text}
37
+
38
+ ${u0}`,parts:[..._0.parts,{type:"text",text:`
39
+
40
+ ${u0}`}]}}let x0=m2(_0),K1=await P(x0);if(!K1.accepted){let u0=K1.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";F.addAssistantMessage(u0);return}if(N.enqueueCommand(q0),F.addUserMessage(q0.displayText),K1.delivery==="next_turn"){if(R.current=!0,!$1().command.isProcessing)queueMicrotask(()=>{V1()})}return}C.setTasks([]),N.setRecoveredSteeringCount(0),S.current=!1;let y0=N.createAbortController();H1.resetStreamingBuffers(),F.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let Q0=await V2(q0);if(!Q0.success&&Q0.error&&Q0.error!=="aborted")F.setError(Q0.error)}catch(Q0){let _0=D8(Q0);if(_0.isAbort);else F.setError(`执行失败: ${_0.displayMessage}`)}finally{if(N.getAbortController()===y0){if(N.setProcessing(!1),N.clearAbortController(y0),F.setCurrentThinkingContent(null),R.current)queueMicrotask(()=>{V1()})}}});return l8(()=>{let q0=e4.subscribe((y0)=>{if(y0.type!=="subagent.completion.queued"||!s4(y0,{sessionId:q,projectPath:G}))return;R.current=!0,queueMicrotask(()=>{V1()})});return()=>{q0()}},[V1,q,G]),l8(()=>{let q0=!1;return(async()=>{if(Y)await u2.resolvePendingWithHandler(G,q,Y);else await u2.cancelPendingNonInteractive(G,q);if(q0)return;let[y0,Q0]=await Promise.all([h1.hasPendingInbox(G,q),h1.hasActiveGoal(G,q)]);if(y0||Q0)await V1()})().catch((y0)=>{if(!q0)c2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",y0)}),()=>{q0=!0}},[Y,V1,q,G]),{executeCommand:j2,handleAbort:T$,isProcessing:K,cleanupAgent:f}};import{useMemoizedFn as d8}from"ahooks";import{useState as J6}from"react";var Y6=()=>{let[$,Q]=J6([]),[Y,J]=J6(-1),Z=d8((G,U)=>{let W={display:G,pasteMappings:U?new Map(U):new Map};Q((O)=>[...O,W]),J(-1)}),X=d8(()=>{if($.length===0)return null;let G=Y===-1?$.length-1:Math.max(0,Y-1);return J(G),$[G]||null}),K=d8(()=>{if(Y===-1)return null;let G=Y+1;if(G>=$.length)return J(-1),null;else return J(G),$[G]||null}),q=d8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:K,resetHistoryIndex:q}};import{useMemoizedFn as X8}from"ahooks";import{useMemo as pY,useRef as Z6,useState as cY}from"react";var X6=()=>{let[$,Q]=cY({isVisible:!1,details:null,resolver:null}),Y=Z6(null),J=Z6([]),Z=X8((W)=>{Y.current=W,Q({isVisible:Boolean(W),details:W?.details??null,resolver:W?.resolve??null})}),X=X8((W,O)=>{if(W.settled)return;if(W.settled=!0,W.signal&&W.abortListener)W.signal.removeEventListener("abort",W.abortListener);W.resolve(O)}),K=X8((W,O)=>{return new Promise((H)=>{let z={details:W,resolve:H,signal:O,settled:!1},w=()=>{if(Y.current===z){X(z,{approved:!1,reason:K8}),Z(J.current.shift()??null);return}let _=J.current.indexOf(z);if(_>=0)J.current.splice(_,1);X(z,{approved:!1,reason:K8})};if(z.abortListener=w,O?.aborted){w();return}if(O?.addEventListener("abort",w,{once:!0}),!Y.current){Z(z);return}J.current.push(z)})}),q=X8((W)=>{let O=Y.current;if(O)X(O,W);let H=J.current.shift()??null;Z(H)}),G=X8(()=>{if(Y.current)X(Y.current,{approved:!1,reason:K8});for(let W of J.current)X(W,{approved:!1,reason:K8});J.current=[],Z(null)}),U=pY(()=>({requestConfirmation:K}),[K]);return{confirmationState:$,confirmationHandler:U,handleResponse:q,dismissAll:G}};import{useMemoizedFn as F$}from"ahooks";import{useRef as K6,useState as xY}from"react";var r8="␞",a8="␟";function i8($){return`${r8}PASTE:${$}:`}function l2(){return a8}var vK=new RegExp(`${r8}PASTE:(\\d+):[\\s\\S]*?${a8}`,"g");function uY($){return $.includes(r8)&&$.includes(a8)}function G6($="",Q=0){let[Y,J]=xY({value:$,cursorPosition:Q}),Z=K6(0),X=K6(new Map),K=F$((z)=>{J((w)=>({value:z,cursorPosition:w.cursorPosition}));for(let w of X.current.keys()){let _=i8(w);if(!z.includes(_))X.current.delete(w)}}),q=F$((z)=>{J((w)=>({...w,cursorPosition:Math.max(0,Math.min(z,w.value.length))}))}),G=F$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),U=F$((z)=>{Z.current+=1;let w=Z.current;return X.current.set(w,{type:"text",data:z}),w}),W=F$((z,w)=>{let _=[...X.current.values()].filter((S)=>S.type==="image");if(_.length>=D$)throw Error(`最多只能粘贴 ${D$} 张图片`);let F=_.reduce((S,R)=>S+`data:${R.mimeType};base64,`.length+R.data.length,0),C=`data:${w};base64,`.length+z.length;if(F+C>h8)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let N=Z.current;return X.current.set(N,{type:"image",data:z,mimeType:w}),N}),O=F$((z)=>{for(let[w,_]of z)if(X.current.set(w,_),w>=Z.current)Z.current=w}),H=F$((z)=>{let w=[],_=[];if(!uY(z)){let T=z.trim();if(T)_.push({type:"text",text:T});return{displayText:z,text:z,images:w,parts:_}}let F=new RegExp(`${r8}PASTE:(\\d+):[\\s\\S]*?${a8}`,"g"),C=Array.from(z.matchAll(F)),N=0,S="",R="";for(let T of C){let M=T.index,L=M+T[0].length,k=parseInt(T[1],10),g=X.current.get(k);if(M>N){let o=z.slice(N,M);_.push({type:"text",text:o}),S+=o,R+=o}if(!g)S+=T[0],R+=T[0],_.push({type:"text",text:T[0]});else if(g.type==="text")S+=g.data,R+=g.data,_.push({type:"text",text:g.data});else{let o={id:k,base64:g.data,mimeType:g.mimeType};w.push(o),_.push({type:"image",...o}),R+=`[Image #${k}]`}N=L}if(N<z.length){let T=z.slice(N);_.push({type:"text",text:T}),S+=T,R+=T}let B=[];for(let T of _)if(T.type==="text"&&B.length>0&&B[B.length-1].type==="text")B[B.length-1].text+=T.text;else B.push(T);let f=0,P=B.length;while(f<B.length&&B[f].type==="text"&&B[f].text.trim()==="")f++;while(P>f&&B[P-1].type==="text"&&B[P-1].text.trim()==="")P--;let A=B.slice(f,P);return{displayText:R.trim(),text:S.trim(),images:w,parts:A}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:K,setCursorPosition:q,clear:G,pasteMap:X.current,addPasteMapping:U,addImagePasteMapping:W,restorePasteMappings:O,resolveInput:H}}import{useMemoizedFn as H6}from"ahooks";import{useInput as tY}from"ink";import{useEffect as W6,useRef as L6,useState as i2}from"react";function lY($){return{supportsThinking:E1().resolveConfig($).reasoning}}function o8($){return lY($).supportsThinking}import dY from"fast-glob";import rY from"fuse.js";import{useEffect as q6,useMemo as d2,useState as r2}from"react";var h$=null,aY=5000;function iY($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),K=X+Z.length;if(Q>=X&&Q<=K){let q=Z.slice(1),G=!1;if(q.startsWith('"')){if(G=!0,q=q.slice(1),q.endsWith('"'))q=q.slice(0,-1)}return{hasQuery:!0,query:q,startIndex:X,endIndex:K,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var oY=[...a2.map(($)=>`${$}/**`),...a2,...U6.map(($)=>`**/${$}`)];function O6($,Q,Y={}){let{cwd:J=l0(),maxSuggestions:Z=15,ignorePatterns:X=oY,debounceDelay:K=300,fuzzyMatch:q=!0}=Y,[G,U]=r2([]),[W,O]=r2(!1),[H,z]=r2(0),w=d2(()=>JSON.stringify(X),[X]),_=d2(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return iY($,Q)},[$,Q]);q6(()=>{if(!$.includes("@")){U([]),O(!1);return}let C=Date.now();if(h$&&h$.cwd===J&&h$.ignoreKey===w&&C-h$.timestamp<aY){U(h$.files),O(!1);return}let N=!1,R=setTimeout(async()=>{O(!0);try{let f=(await dY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((P)=>P.replace(/\\/g,"/"));if(!N)U(f),h$={cwd:J,ignoreKey:w,files:f,timestamp:C}}catch(B){if(console.error("Failed to load files for @ completion:",B),!N)U([])}finally{if(!N)O(!1)}},K);return()=>{N=!0,clearTimeout(R)}},[$,J,K,w]);let F=d2(()=>{if(!_.hasQuery||G.length===0)return[];let C=_.query.toLowerCase();if(C==="")return G.slice(0,Z);if(q)return new rY(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(C).slice(0,Z).map((R)=>R.item);return G.filter((N)=>N.toLowerCase().includes(C)).slice(0,Z)},[_,G,Z,q]);return q6(()=>{z(0)},[F]),{..._,suggestions:F,selectedIndex:H,loading:W}}function nY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function z6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=nY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),K=Z+J+" "+X,q=Q.startIndex+J.length+1;return{newInput:K,newCursorPos:q}}import{useMemoizedFn as _6}from"ahooks";import{useEffect as N6,useRef as F6}from"react";var S0=($,Q)=>{let Y=F6(!1),J=F6(null),Z=_6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{a0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{G8().shutdown("SIGINT",0)},K=_6(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();a0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;a0().setAwaitingSecondCtrlC(!1),X()}});return N6(()=>{if($){if(a0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),N6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),K};var n8=e1("UI"),b6=($,Q,Y,J,Z,X,K,q,G,U)=>{let O=e0()==="main-input",H=$.value,z=$.setValue,w=$.cursorPosition,_=n1(),F=T1(),C=t1(),N=M8(),S=N?o8(N):!1,[R,B]=i2(!1),[f,P]=i2([]),[A,T]=i2(0),M=O6(H,w,{cwd:F,maxSuggestions:10}),L=S0(K||!1,X),k=L6(0),g=500,o=L6(!1);W6(()=>{if(K)o.current=!1},[K]),W6(()=>{if(M.hasQuery&&M.suggestions.length>0){let I=M.suggestions.map((y)=>({command:y,description:B6(y)?`Directory: ${y}`:`File: ${y}`,matchScore:1}));P(I),B(!0),T(0)}else if(H.startsWith("/"))if(H.includes(" "))B(!1),P([]);else{let y=w6(H,F);P(y),B(y.length>0),T(0)}else B(!1),P([])},[H,M.hasQuery,M.suggestions,F]);let l=H6(()=>{_.clearMessages(),_.setError(null)}),a=H6(()=>{n8.debug("[DIAG] handleSubmit called:",{input:H,showSuggestions:R});let I=H.trim();if(I){let y=$.resolveInput(I);n8.debug("[DIAG] Submitting command:",{displayText:I,textLength:y.text.length,imageCount:y.images.length}),B(!1),P([]);let v=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(I,v),$.clear(),Q(y),n8.debug("[DIAG] Command submitted to onSubmit callback")}else n8.debug("[DIAG] Empty command, not submitting")});return tY((I,y)=>{if(I==="?"&&!H){G?.(),setTimeout(()=>$.clear(),0);return}if(y.backspace||y.delete||y.leftArrow||y.rightArrow||y.pageUp||y.pageDown||!y.ctrl&&!y.meta&&!y.escape&&!y.tab&&!y.upArrow&&!y.downArrow&&!y.return&&!(I==="?"&&!H))return;if(y.ctrl&&I==="c"||y.meta&&I==="c"||y.ctrl&&I==="d"||y.meta&&I==="d"){L();return}if(y.ctrl&&I==="l"||y.meta&&I==="l"){l();return}if(y.ctrl&&I==="t"||y.meta&&I==="t"){_.toggleThinkingExpanded();return}if(y.ctrl&&I==="o"||y.meta&&I==="o"){_.toggleHistoryExpanded();return}if(y.escape){if(U)G?.();else if(K&&X){if(o.current)return;o.current=!0,X()}else if(R)B(!1),P([]);else if(H){let b=Date.now();if(b-k.current<500)$.clear(),k.current=0;else k.current=b}return}if(y.tab&&y.shift){q?.();return}if(y.tab){if(R&&f.length>0){let b=f[A].command;if(M.hasQuery&&M.suggestions.includes(b)){let{newInput:V,newCursorPos:p}=z6(H,M,b);z(V),$.setCursorPosition(p)}else{let V=b+" ";z(V),$.setCursorPosition(V.length)}B(!1),P([])}else if(S)C.toggleThinkingMode();return}if(y.return){a();return}if(y.upArrow){if(R&&f.length>0){let b=f.length-1;T((V)=>V>0?V-1:b)}else{let b=Y();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);z(b.display),$.setCursorPosition(b.display.length)}}return}if(y.downArrow){if(R&&f.length>0){let b=f.length-1;T((V)=>V<b?V+1:0)}else{let b=J();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);z(b.display),$.setCursorPosition(b.display.length)}}return}},{isActive:O}),{handleSubmit:a,showSuggestions:R,suggestions:f,selectedSuggestionIndex:A}};import J3 from"ansi-escapes";import{useStdout as Y3}from"ink";import{useCallback as Z3,useEffect as X3,useRef as K3}from"react";import{useStdout as sY}from"ink";import{debounce as eY}from"lodash-es";import{useEffect as $3,useState as Q3}from"react";function E$($=200){let{stdout:Q}=sY(),[Y,J]=Q3(Q.columns||80);return $3(()=>{let Z=eY(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function A6(){let{stdout:$}=Y3(),Q=E$(),Y=K3(!0),J=t((X)=>X.session.actions.incrementClearCount),Z=Z3(()=>{if($)$.write(J3.clearTerminal);J()},[$,J]);return X3(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import P6 from"node:fs";import G3 from"node:os";import o2 from"node:path";import{MultiSelect as q3}from"@inkjs/ui";import{useMemoizedFn as t8}from"ahooks";import{Box as X0,Text as s,useFocus as U3,useFocusManager as O3,useInput as R6}from"ink";import s8 from"ink-select-input";import z3 from"ink-spinner";import q8 from"ink-text-input";import{useEffect as y6,useState as g$}from"react";import{jsxDEV as D}from"react/jsx-dev-runtime";var _3=[{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"}],N3=[{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 F3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function U8({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=g$(Y?"name":"mode"),[X,K]=g$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[q,G]=g$(""),[U,W]=g$(!1),[O,H]=g$(""),[z,w]=g$(Y?"edit":"manual"),{focus:_}=O3(),C={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];y6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;_(`step-${J}`)},[J,_]);let N=t8(()=>{let P=C.indexOf(J);if(P<C.length-1)Z(C[P+1])}),S=t8(()=>{if(O)H("");if(J==="confirm"&&z==="ai"){Z("aiPrompt");return}let P=C.indexOf(J);if(P>0)Z(C[P-1]);else Q()}),R=t8(async()=>{W(!0),H("");try{let P=await Y8.create(),A=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
41
+
42
+ ## 可用工具列表
43
+
44
+ - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
45
+ - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
46
+ - **Read**: 读取文件内容
47
+ - **Write**: 写入/创建文件
48
+ - **Edit**: 编辑文件(字符串替换)
49
+ - **ApplyPatch**: 原子应用多文件文本补丁
50
+ - **Bash**: 执行命令行命令
51
+
52
+ ## 可用颜色
53
+
54
+ - red, blue, green, yellow, purple, orange, pink, cyan
55
+
56
+ ## 输出格式
57
+
58
+ 你必须以 JSON 格式返回配置,格式如下:
59
+
60
+ \`\`\`json
61
+ {
62
+ "name": "agent-name",
63
+ "description": "简洁的一句话描述(英文)",
64
+ "tools": ["Glob", "Grep", "Read"],
65
+ "color": "blue",
66
+ "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
67
+ }
68
+ \`\`\`
69
+
70
+ ## 注意事项
71
+
72
+ 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
73
+ 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
74
+ 3. **tools**: 根据任务选择必要的工具,不要选择太多
75
+ 4. **color**: 选择一个合适的颜色用于 UI 区分
76
+ 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
77
+
78
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,M=(await P.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
79
+
80
+ ## 可用工具列表
81
+
82
+ - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
83
+ - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
84
+ - **Read**: 读取文件内容
85
+ - **Write**: 写入/创建文件
86
+ - **Edit**: 编辑文件(字符串替换)
87
+ - **ApplyPatch**: 原子应用多文件文本补丁
88
+ - **Bash**: 执行命令行命令
89
+
90
+ ## 可用颜色
91
+
92
+ - red, blue, green, yellow, purple, orange, pink, cyan
93
+
94
+ ## 输出格式
95
+
96
+ 你必须以 JSON 格式返回配置,格式如下:
97
+
98
+ \`\`\`json
99
+ {
100
+ "name": "agent-name",
101
+ "description": "简洁的一句话描述(英文)",
102
+ "tools": ["Glob", "Grep", "Read"],
103
+ "color": "blue",
104
+ "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
105
+ }
106
+ \`\`\`
107
+
108
+ ## 注意事项
109
+
110
+ 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
111
+ 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
112
+ 3. **tools**: 根据任务选择必要的工具,不要选择太多
113
+ 4. **color**: 选择一个合适的颜色用于 UI 区分
114
+ 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
115
+
116
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,q)).trim(),L=M.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(L)M=L[1];let k=JSON.parse(M);if(!k.name||!k.description||!k.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(k.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");K({name:k.name,description:k.description,tools:Array.isArray(k.tools)?k.tools:[],color:k.color||"blue",location:"project",systemPrompt:k.systemPrompt}),Z("confirm")}catch(P){H(P instanceof Error?P.message:String(P))}finally{W(!1)}});y6(()=>{if(J==="aiGenerating"&&!U&&!O)R()},[J,U,O,R]);let B=t8(async()=>{try{let P=X.location==="project"?o2.join(l0(),".blade","agents"):o2.join(G3.homedir(),".blade","agents");await P6.promises.mkdir(P,{recursive:!0});let A=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){A.push("tools:");for(let L of X.tools)A.push(` - ${L}`)}if(X.color)A.push(`color: ${X.color}`);A.push("---");let T=[A.join(`
117
+ `),"",`# ${X.name} Subagent`,"",X.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
118
+ `),M=o2.join(P,`${X.name}.md`);await P6.promises.writeFile(M,T,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),f=S0(!1,Q);if(R6((P,A)=>{if(A.escape)S();else if(A.ctrl&&P==="c"||A.meta&&P==="c")f()},{isActive:J!=="tools"}),J==="mode")return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(P)=>{if(P.value==="ai")w("ai"),Z("aiPrompt");else w("manual"),Z("name")}},void 0,!1,void 0,this),D(X0,{marginTop:1,children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(q8,{value:q,onChange:G,onSubmit:(P)=>{if(!P.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"yellow",children:[D(z3,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:['根据你的描述:"',q,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{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=z==="edit";return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:["Step 1/7: ",P?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:P?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"名称: "},void 0,!1,void 0,this),P?D(s,{children:X.name},void 0,!1,void 0,this):D(q8,{value:X.name,onChange:(A)=>K({...X,name:A}),onSubmit:(A)=>{if(F3(A))return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{dimColor:!0,children:P?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P&&D(q8,{value:"",onChange:()=>{},onSubmit:N,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(q8,{value:X.description,onChange:(P)=>K({...X,description:P}),onSubmit:(P)=>{if(!P.trim())return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{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 D(H3,{config:X,setConfig:K,onNext:N,onPrev:S},void 0,!1,void 0,this);if(J==="color")return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:N3,onSelect:(P)=>{let A=P.value==="none"?void 0:P.value;K({...X,color:A}),N()}},void 0,!1,void 0,this),D(X0,{marginTop:1,children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(P)=>{K({...X,location:P.value}),N()}},void 0,!1,void 0,this),D(X0,{marginTop:1,children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"提示词: "},void 0,!1,void 0,this),D(q8,{value:X.systemPrompt,onChange:(P)=>K({...X,systemPrompt:P}),onSubmit:()=>N()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[D(s,{children:[D(s,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),D(s,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),D(s,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),D(s,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),D(s,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),D(s,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),D(s,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D(s8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(P)=>{if(P.value==="save")B();else if(P.value==="back")S();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function H3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=U3({id:"step-tools"});R6((K,q)=>{if(q.escape)J()},{isActive:Z});let X=(K)=>{if(K.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:K});Y()};return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(q3,{options:_3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import W3 from"node:fs";import{useMemoizedFn as H$}from"ahooks";import{Box as C0,Text as v0,useInput as L3}from"ink";import n2 from"ink-select-input";import{useEffect as B3,useMemo as M6,useState as e8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var t2=10;function I6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=C6($),[X,K]=e8(Q),[q,G]=e8(null),[U,W]=e8(0),[O,H]=e8(0),z=H$(()=>{Z.clear(),Z.loadFromStandardLocations(),W((M)=>M+1)}),w=M6(()=>{return Z.getAllSubagents()},[U]),_=Math.ceil(w.length/t2)||1,F=M6(()=>{let M=O*t2;return w.slice(M,M+t2)},[w,O]);B3(()=>{let M=Math.max(0,_-1);if(O>M)H(M)},[_,O]);let C=H$(()=>{if(O<_-1)H((M)=>M+1)}),N=H$(()=>{if(O>0)H((M)=>M-1)}),S=[{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"}],R=H$((M)=>{if(M.value==="cancel"){J?.();return}K(M.value)}),B=H$((M)=>{if(G(M.value),X==="edit")K("editWizard");else if(X==="delete")K("deleteConfirm")}),f=H$(async()=>{if(!q?.configPath)return;try{await W3.promises.unlink(q.configPath),z(),P()}catch(M){console.error("删除失败:",M)}}),P=H$(()=>{K("menu"),G(null)}),A=S0(!1,J);if(L3((M,L)=>{if(L.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")H(0),P();else if(X==="deleteConfirm")P()}else if(L.ctrl&&M==="c"||L.meta&&M==="c")A();else if(X==="list"){if(L.leftArrow||M==="h")N();else if(L.rightArrow||M==="l")C()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:S,onSelect:R},void 0,!1,void 0,this),i(C0,{marginTop:1,children:i(v0,{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(w.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(v0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:[i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),i(v0,{color:"gray",children:[" (共 ",w.length," 个)"]},void 0,!0,void 0,this),_>1&&i(v0,{color:"yellow",children:[" ","第 ",O+1,"/",_," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.map((M)=>i(C0,{flexDirection:"column",paddingLeft:2,children:[i(C0,{children:i(v0,{children:[i(v0,{bold:!0,color:M.color||"white",children:["• ",M.name]},void 0,!0,void 0,this),i(v0,{color:"gray",children:[" - ",M.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.tools&&M.tools.length>0&&i(C0,{paddingLeft:2,children:i(v0,{color:"gray",children:["工具: ",M.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.configPath&&i(C0,{paddingLeft:2,children:i(v0,{color:"gray",dimColor:!0,children:M.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},M.name,!0,void 0,this)),i(C0,{marginTop:1,paddingLeft:2,children:_>1?i(v0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let T=(M)=>{if(w.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let L=w.map((k)=>({key:k.name,label:`${k.name} - ${k.description}`,value:k}));return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:L,onSelect:B},void 0,!1,void 0,this),i(C0,{marginTop:1,children:i(v0,{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 i(U8,{onComplete:()=>{z(),P()},onCancel:P},void 0,!1,void 0,this);if(X==="edit")return T("编辑 Agent");if(X==="editWizard"&&q){let M={name:q.name,description:q.description,tools:q.tools||[],color:q.color,location:q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:q.systemPrompt||""};return i(U8,{initialConfig:M,onComplete:()=>{z(),P()},onCancel:P},void 0,!1,void 0,this)}if(X==="delete")return T("删除 Agent");if(X==="deleteConfirm"&&q)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(v0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(v0,{children:["你确定要删除 Agent"," ",i(v0,{bold:!0,color:"yellow",children:q.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:["文件路径: ",q.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(v0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(M)=>{if(M.value==="confirm")f();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as m$,Text as O0}from"ink";import b3,{useEffect as A3,useState as P3}from"react";import{useEffect as w3,useState as T6}from"react";function S6($=l0(),Q=5000){let[Y,J]=T6(null),[Z,X]=T6(!0);return w3(()=>{let K=!0,q=async()=>{try{let U=await f6($);if(!K)return;if(!U){J(null),X(!1);return}let W=await k6($);if(!K)return;J(W)}catch{if(K)J(null)}finally{if(K)X(!1)}};q();let G=null;if(Q>0)G=setInterval(q,Q);return()=>{if(K=!1,G)clearInterval(G)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as n,Fragment as A1}from"react/jsx-dev-runtime";var D6=b3.memo(()=>{let $=R8(),Q=S$(),J=y8()==="shortcuts",Z=L4(),X=T1(),{branch:K}=S6(X),q=M8(),G=z4(),U=Y4(),W=T8(),O=f8(),H=k8(),z=S8(),w=v8(),_=Z4(),F=X4(),C=I8(),N=y4(),S=k$(),[R,B]=P3(null);A3(()=>{let L=!1;new s2(X,S).get().then((o)=>{if(!L)B(o)}).catch(()=>{if(!L)B(null)});let g=s2.subscribe((o)=>{if(!L&&o.sessionId===S&&o.workspaceRoot===X)B(o.goal)});return()=>{L=!0,g()}},[S,X]);let f=q?o8(q):!1,A=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return n(O0,{color:"magenta",children:[">> ","auto edit on ",n(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return n(O0,{color:"cyan",children:["‖ plan mode on ",n(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return n(O0,{color:"red",children:["yolo mode on ",n(O0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),T=A!==null,M=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return n(m$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?n(m$,{flexDirection:"column",gap:0,children:M.map((L,k)=>n(m$,{flexDirection:"row",children:[L.map((g,o)=>{let[l,a]=g.split(":");return n(m$,{flexDirection:"row",width:20,children:[n(O0,{color:"yellow",children:l},void 0,!1,void 0,this),n(O0,{color:"gray",children:":"},void 0,!1,void 0,this),n(O0,{color:"white",children:a},void 0,!1,void 0,this)]},o,!0,void 0,this)}),k===M.length-1&&n(O0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},k,!0,void 0,this))},void 0,!1,void 0,this):n(m$,{flexDirection:"row",gap:1,children:[K&&n(A1,{children:[n(O0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A,T&&n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),R&&n(A1,{children:[n(O0,{color:R.status==="active"?"green":R.status==="verifying"?"cyan":R.status==="blocked"||R.status==="budget_limited"?"yellow":"gray",children:["goal:",R.status," ",R.objective.slice(0,32)]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n(m$,{flexDirection:"row",gap:1,children:!$?n(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):n(A1,{children:[f&&n(A1,{children:[W?n(O0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):n(O0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H!=="auto"&&n(A1,{children:[n(O0,{color:H==="fast"?"yellow":"gray",children:["Speed ",H]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&n(A1,{children:[n(O0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w!=="auto"&&n(A1,{children:[n(O0,{color:"gray",children:["Style ",w]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q&&n(O0,{color:"gray",children:q.model},void 0,!1,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),U?n(O0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):n(O0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:F===void 0?"gray":"cyan",children:["Cache ",v6(F)]},void 0,!0,void 0,this),_>0.001&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:"green",children:["$",_<0.01?_.toFixed(4):_.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C.length>0&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:"yellow",children:["已排队 ",C.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N>0&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:"cyan",children:["已恢复 ",N," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{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 e2,Text as $Q}from"ink";import y3 from"react";import{jsxDEV as p$}from"react/jsx-dev-runtime";var V6=y3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),K=Q>=$.length;if(Q>=J&&!K)Z=Q-J+1,X=Q+1;let q=$.slice(Z,X),G=$.length>J;return p$(e2,{flexDirection:"column",paddingX:2,paddingY:0,children:[q.map((U,W)=>{let H=Z+W===Q;return p$(e2,{flexDirection:"row",paddingX:1,gap:2,children:[p$($Q,{color:H?"cyan":"white",bold:H,children:U.command},void 0,!1,void 0,this),p$($Q,{color:H?"cyan":"gray",dimColor:!H,children:["- ",U.description]},void 0,!0,void 0,this)]},U.command,!0,void 0,this)}),G&&p$(e2,{paddingX:1,children:p$($Q,{color:K?"cyan":"gray",bold:K,dimColor:!K,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 L1,Text as k1,useInput as yZ,useStdout as RZ}from"ink";import MZ from"ink-select-input";import RQ,{useMemo as _9}from"react";import{Box as z0,Text as b0}from"ink";import L$,{useEffect as PQ,useMemo as W$,useRef as U9}from"react";import{Box as _Q,Text as r6}from"ink";import E3 from"react";import{Text as P1}from"ink";import V3 from"react";import u6 from"string-width";import O8 from"string-width";function QQ({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 R3=QQ();function JQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(R3,"")}var j6=($=0)=>(Q)=>`\x1B[${Q+$}m`,h6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,E6=($=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]}},Gq=Object.keys(j0.modifier),M3=Object.keys(j0.color),C3=Object.keys(j0.bgColor),qq=[...M3,...C3];function I3(){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=j6(),j0.color.ansi256=h6(),j0.color.ansi16m=E6(),j0.bgColor.ansi=j6(10),j0.bgColor.ansi256=h6(10),j0.bgColor.ansi16m=E6(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 q=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(q/6)/5,Z=q%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let K=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)K+=60;return K},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 T3=I3(),g6=T3;var Q2=new Set(["\x1B","›"]),f3=39,ZQ="\x07",c6="[",k3="]",x6="m",$2=`${k3}8;;`,m6=($)=>`${Q2.values().next().value}${c6}${$}${x6}`,p6=($)=>`${Q2.values().next().value}${$2}${$}${ZQ}`,S3=($)=>$.split(" ").map((Q)=>O8(Q)),YQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,K=O8(JQ($.at(-1)));for(let[q,G]of J.entries()){let U=O8(G);if(K+U<=Y)$[$.length-1]+=G;else $.push(G),K=0;if(Q2.has(G))Z=!0,X=J.slice(q+1,q+1+$2.length).join("")===$2;if(Z){if(X){if(G===ZQ)Z=!1,X=!1}else if(G===x6)Z=!1;continue}if(K+=U,K===Y&&q<J.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},v3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(O8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},D3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,K=S3($),q=[""];for(let[O,H]of $.split(" ").entries()){if(Y.trim!==!1)q[q.length-1]=q.at(-1).trimStart();let z=O8(q.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))q.push(""),z=0;if(z>0||Y.trim===!1)q[q.length-1]+=" ",z++}if(Y.hard&&K[O]>Q){let w=Q-z,_=1+Math.floor((K[O]-w-1)/Q);if(Math.floor((K[O]-1)/Q)<_)q.push("");YQ(q,H,Q);continue}if(z+K[O]>Q&&z>0&&K[O]>0){if(Y.wordWrap===!1&&z<Q){YQ(q,H,Q);continue}q.push("")}if(z+K[O]>Q&&Y.wordWrap===!1){YQ(q,H,Q);continue}q[q.length-1]+=H}if(Y.trim!==!1)q=q.map((O)=>v3(O));let G=q.join(`
119
+ `),U=[...G],W=0;for(let[O,H]of U.entries()){if(J+=H,Q2.has(H)){let{groups:w}=new RegExp(`(?:\\${c6}(?<code>\\d+)m|\\${$2}(?<uri>.*)${ZQ})`).exec(G.slice(W))||{groups:{}};if(w.code!==void 0){let _=Number.parseFloat(w.code);Z=_===f3?void 0:_}else if(w.uri!==void 0)X=w.uri.length===0?void 0:w.uri}let z=g6.codes.get(Number(Z));if(U[O+1]===`
120
+ `){if(X)J+=p6("");if(Z&&z)J+=m6(z)}else if(H===`
121
+ `){if(Z&&z)J+=m6(Z);if(X)J+=p6(X)}W+=H.length}return J};function XQ($,Q,Y){return String($).normalize().replaceAll(`\r
122
+ `,`
123
+ `).split(`
124
+ `).map((J)=>D3(J,Q,Y)).join(`
125
+ `)}var KQ=($)=>{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 u6(Q)};var l6=($)=>{return/[*_~`<[\]https?:]/.test($)},GQ=($)=>{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)=>u6(J)))},J2=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=XQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
126
+ `).filter((K)=>K.length>0);return X.length>0?X:[""]},d6=($,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 W1,Fragment as h3}from"react/jsx-dev-runtime";var qQ=2,UQ=1,OQ=2;function zQ($,Q){return`inline-${$}-${Q}`}var j3=({text:$})=>{let Q=A0();if(!l6($))return W1(P1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,K=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,q;while((q=K.exec($))!==null){if(q.index>J){let O=$.slice(J,q.index);Y.push(W1(P1,{children:O},zQ("text",Z++),!1,void 0,this))}let G=q[0],U=null,W=zQ("match",X++);try{if(G.startsWith("**")&&G.endsWith("**")&&G.length>qQ*2)U=W1(P1,{bold:!0,children:G.slice(qQ,-qQ)},W,!1,void 0,this);else if(G.length>UQ*2&&(G.startsWith("*")&&G.endsWith("*")||G.startsWith("_")&&G.endsWith("_"))){let O=$.substring(q.index-1,q.index),H=$.substring(K.lastIndex,K.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(H)||/[./\\]/.test(O+H)))U=W1(P1,{italic:!0,children:G.slice(UQ,-UQ)},W,!1,void 0,this)}else if(G.startsWith("~~")&&G.endsWith("~~")&&G.length>OQ*2)U=W1(P1,{strikethrough:!0,children:G.slice(OQ,-OQ)},W,!1,void 0,this);else if(G.startsWith("`")&&G.endsWith("`")){let O=G.match(/^(`+)([^`]+)\1$/);if(O&&O[2])U=W1(P1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},W,!1,void 0,this)}else if(G.startsWith("[")&&G.includes("](")&&G.endsWith(")")){let O=G.match(/\[(.*?)\]\((.*?)\)/);if(O){let H=O[1],z=O[2];U=W1(P1,{children:[H,W1(P1,{color:Q.colors.info,children:[" (",z,")"]},void 0,!0,void 0,this)]},W,!0,void 0,this)}}else if(G.match(/^https?:\/\//))U=W1(P1,{color:Q.colors.info,children:G},W,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",G,O),U=null}Y.push(U??W1(P1,{children:G},W,!1,void 0,this)),J=K.lastIndex}if(J<$.length){let G=$.slice(J);Y.push(W1(P1,{children:G},zQ("text",Z++),!1,void 0,this))}return W1(h3,{children:Y.filter((G)=>G!==null)},void 0,!1,void 0,this)},y1=V3.memo(j3);import{jsxDEV as c$}from"react/jsx-dev-runtime";var g3="▎",a6=E3.memo(({lines:$,level:Q})=>{let Y=A0(),J=g3.repeat(Q);return c$(_Q,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return c$(_Q,{height:1},X,!1,void 0,this);return c$(_Q,{flexDirection:"row",children:[c$(r6,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),c$(r6,{italic:!0,wrap:"wrap",children:c$(y1,{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 Z2,Text as p1}from"ink";import{isPlainObject as WQ}from"lodash-es";import{common as i3,createLowlight as o3}from"lowlight";import{LRUCache as n3}from"lru-cache";import $9 from"react";import{Box as Y2,Text as z8}from"ink";import m1,{Fragment as s6}from"react";import{LRUCache as t6}from"lru-cache";import m3 from"string-width";var p3=1024,c3=1048576,i6=1000,o6=new t6({max:p3,maxSize:c3,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+$.length*8)});function NQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=i6){let J=o6.get($);if(J)return J}let Y=Array.from($);if($.length<=i6)o6.set($,Y);return Y}var x3=2048,u3=524288,l3=4096,n6=new t6({max:x3,maxSize:u3,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+8)});function g1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let Q=n6.get($);if(Q!==void 0)return Q;let Y=m3($);if($.length<=l3)n6.set($,Y);return Y}import{jsxDEV as x$}from"react/jsx-dev-runtime";var FQ=2,e6=m1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=A0(),K=[],q=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),FQ);function G(_){if(!m1.isValidElement(_))return;if(_.type===s6){m1.Children.forEach(_.props.children,G);return}if(_.type===Y2){r3(_,Q,K);return}}m1.Children.forEach($,G);let W=K.length>q||Z>0?q-1:q,O=W!==void 0?Math.max(0,K.length-W):0,H=O+Z,w=(O>0?J==="top"?K.slice(O):K.slice(0,W):K).map((_,F)=>x$(Y2,{children:_.length>0?_.map((C,N)=>x$(z8,{...C.props,children:C.text},N,!1,void 0,this)):x$(z8,{children:" "},void 0,!1,void 0,this)},F,!1,void 0,this));return x$(Y2,{flexDirection:"column",width:Q,flexShrink:0,children:[H>0&&J==="top"&&x$(z8,{color:X.colors.text.muted,dimColor:!0,children:["... ",H," line",H===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),w,H>0&&J==="bottom"&&x$(z8,{color:X.colors.text.muted,dimColor:!0,children:["... ",H," line",H===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function d3($){if(!m1.isValidElement($)||$.type!==Y2)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 U=String(Z);if(!U)return;let W={text:U,props:X??{}};if(X===void 0||X.wrap==="wrap")Y=!0,Q.segments.push(W);else if(!Y)Q.noWrapSegments.push(W);else Q.segments.push(W);return}if(!m1.isValidElement(Z))return;if(Z.type===s6){m1.Children.forEach(Z.props.children,(U)=>J(U,X));return}if(Z.type!==z8)return;let{children:K,...q}=Z.props,G=X===void 0?q:{...X,...q};m1.Children.forEach(K,(U)=>J(U,G))}return m1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function r3($,Q,Y){let J=d3($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=g1(O.text);if(J.segments.length===0){let O=[],H=[];for(let z of J.noWrapSegments){let w=z.text.split(`
127
+ `);for(let _=0;_<w.length;_++){if(_>0)O.push(H),H=[];if(w[_])H.push({text:w[_],props:z.props})}}if(H.length>0)O.push(H);for(let z of O)Y.push(z);return}let X=Q-Z;if(X<1){a3(J.noWrapSegments,Q,Y);return}let K=[],q=[],G=0;function U(){if(K.length===0)K.push([...J.noWrapSegments,...q]);else if(Z>0)K.push([{text:" ".repeat(Z),props:{}},...q]);else K.push(q);q=[],G=0}function W(O,H){if(q.length>0&&q[q.length-1].props===H)q[q.length-1].text+=O;else q.push({text:O,props:H})}for(let O of J.segments){let H=O.text.split(`
128
+ `);for(let z=0;z<H.length;z++){if(z>0)U();let _=H[z].split(/(\s+)/);for(let F of _){if(!F)continue;let C=g1(F);if(G+C>X&&G>0){if(U(),/^\s+$/.test(F))continue}if(C>X){let S=NQ(F);while(S.length>0){let R=0,B=0;for(let f of S){let P=g1(f);if(G+B+P>X)break;B+=P,R++}if(R>0){let f=S.slice(0,R).join("");W(f,O.props),G+=g1(f),S=S.slice(R)}if(S.length>0)U()}}else W(F,O.props),G+=C}}if(O.text.endsWith(`
129
+ `))U()}if(q.length>0)U();for(let O of K)Y.push(O)}function a3($,Q,Y){let J=[],Z=[],X=0;for(let K of $){let q=K.text.split(`
130
+ `);for(let G=0;G<q.length;G++){if(G>0)J.push(Z),Z=[],X=0;let U=q[G];if(!U)continue;let W=g1(U),O=Math.max(0,Q-g1("…"));if(W<=O&&X===0)Z.push({text:U,props:K.props}),X+=W;else{let H=NQ(U),z=X,w=0;for(let F of H){let C=g1(F);if(z+C>O)break;z+=C,w++}let _=H.slice(0,w).join("");if(_)Z.push({text:_,props:K.props});Z.push({text:"…",props:{}}),X=z+g1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let K of J)Y.push(K)}import{jsxDEV as G1}from"react/jsx-dev-runtime";var HQ=o3(i3),t3=200,s3=524288,e3=4096,Q9=new n3({max:t3,maxSize:s3,sizeCalculation:($)=>$.retainedChars});function J9($,Q){return`${Q??"__auto__"}\x00${$}`}function $Z($,Q){return Q9.get(J9($,Q))?.root}function QZ($,Q,Y){if($.length>e3)return;let J=Q?.length??0;Q9.set(J9($,Q),{root:Y,retainedChars:Math.max(1,$.length*2+J)})}function JZ($){return WQ($)&&$.type==="text"&&typeof $.value==="string"}function YZ($){return WQ($)&&$.type==="element"}function ZZ($){return WQ($)&&$.type==="root"&&Array.isArray($.children)}function X2($,Q,Y=0){if(JZ($))return G1(p1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(YZ($)){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((K,q)=>X2(K,Q,q));return G1(p1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(ZZ($))return G1($9.Fragment,{children:$.children.map((J,Z)=>X2(J,Q,Z))},Y,!1,void 0,this);return G1(p1,{},Y,!1,void 0,this)}function XZ($,Q,Y){let J=Y||r0.getTheme().colors.syntax;try{let Z=$Z($,Q);if(Z)return X2(Z,J);let X;if(!Q||!HQ.registered(Q))X=HQ.highlightAuto($);else X=HQ.highlight(Q,$);let K=X;if(!K.children||K.children.length===0)return G1(p1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return QZ($,Q,X),X2(X,J)}catch(Z){return G1(p1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var K2=$9.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=A0(),K=$.split(`
131
+ `),q=0;if(Z&&K.length>Z){let O=Math.max(Z,FQ);if(K.length>O)q=K.length-O,K=K.slice(q)}let G=K.length+q,U=String(G).length+1,W=Math.max(20,J-4);return G1(Z2,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&G1(Z2,{marginBottom:0,children:G1(p1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),q>0&&G1(Z2,{marginBottom:0,children:G1(p1,{color:X.colors.text.muted,dimColor:!0,children:["... ",q," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G1(e6,{maxWidth:W,maxHeight:Z,children:K.map((O,H)=>{let z=H+q+1;return G1(Z2,{flexDirection:"row",children:[Y&&G1(p1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(z).padStart(U-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?G1(p1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):XZ(O,Q,X.colors.syntax)]},H,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as Y9,Text as _1,useInput as KZ}from"ink";import GZ,{useState as qZ}from"react";import{jsxDEV as q1}from"react/jsx-dev-runtime";var Z9=400;function UZ($){let Q=$.split(`
132
+ `),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let K=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(K)J=parseInt(K[1],10),Z=parseInt(K[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 LQ=GZ.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let K=A0(),q=UZ($),[G,U]=qZ(!1);KZ((N)=>{if(N.toLowerCase()==="e")U((S)=>!S)},{isActive:X&&q.length>Z});let O=Math.max(...q.map((N)=>N.lineNumber||0)).toString().length+1,H=q.filter((N)=>N.type==="add").length,z=q.filter((N)=>N.type==="remove").length,w=q.length,_=w>Z,F;if(!_)F=q;else if(G)F=q.slice(0,Z9);else F=q.slice(0,Z);let C=w-F.length;return q1(Y9,{flexDirection:"column",marginTop:1,marginBottom:1,children:[q1(_1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),_&&q1(_1,{color:K.colors.info,children:[G?`已展开 ${F.length}/${w} 行`:`显示前 ${Z} 行,共 ${w} 行`," · ",q1(_1,{color:K.colors.success,children:["+",H]},void 0,!0,void 0,this)," ",q1(_1,{color:K.colors.error,children:["-",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_&&q1(_1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),F.map((N,S)=>{if(N.type==="header")return q1(_1,{color:K.colors.muted,dimColor:!0,children:N.content},S,!1,void 0,this);let R=N.lineNumber?N.lineNumber.toString().padStart(O," "):" ".repeat(O),B=" ",f,P;if(N.type==="add")B="+",P=K.colors.success,f=void 0;else if(N.type==="remove")B="-",P=K.colors.error,f=void 0;else P=K.colors.text.primary;let A=Math.max(0,J-O-2),T=N.content;if(T.length>A)T=T.substring(0,A-3)+"...";return q1(_1,{color:P,backgroundColor:f,children:[q1(_1,{dimColor:!0,children:R},void 0,!1,void 0,this),q1(_1,{children:B},void 0,!1,void 0,this),q1(_1,{children:[" ",T]},void 0,!0,void 0,this)]},S,!0,void 0,this)}),_&&q1(Y9,{marginTop:1,children:G?q1(_1,{color:K.colors.info,dimColor:!0,children:[C>0?`已达显示上限 ${Z9} 行,仍有 ${C} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):q1(_1,{color:K.colors.info,dimColor:!0,children:["已隐藏剩余 ",C," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),q1(_1,{color:K.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 BQ,Text as X9}from"ink";import OZ from"react";import{jsxDEV as u$}from"react/jsx-dev-runtime";var zZ=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,K=J.length;return u$(BQ,{paddingLeft:K+1,flexDirection:"row",children:[u$(BQ,{width:X,children:u$(X9,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),u$(BQ,{flexGrow:1,children:u$(X9,{wrap:"wrap",children:u$(y1,{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=OZ.memo(zZ);import{Text as bQ}from"ink";import _Z,{useMemo as NZ}from"react";import K9 from"string-width";import{jsxDEV as AQ}from"react/jsx-dev-runtime";var G9=4,l$=3,FZ=4,q9=_Z.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=A0(),Z=NZ(()=>{if($.length===0||Q.length===0)return null;let O=$.length,H=$.map((P,A)=>{let T=Math.max(GQ(P),l$);for(let M of Q)T=Math.max(T,GQ(M[A]||""));return T}),z=$.map((P,A)=>{let T=Math.max(KQ(P),l$);for(let M of Q)T=Math.max(T,KQ(M[A]||""));return T}),w=1+O*3,_=Math.max(Y-w-G9,O*l$),F=H.reduce((P,A)=>P+A,0),C=z.reduce((P,A)=>P+A,0),N=!1,S;if(C<=_)S=z;else if(F<=_){let P=_-F,A=z.map((M,L)=>M-H[L]),T=A.reduce((M,L)=>M+L,0);S=H.map((M,L)=>{if(T===0)return M;let k=Math.floor(A[L]/T*P);return M+k})}else{N=!0;let P=_/F;S=H.map((A)=>Math.max(Math.floor(A*P),l$))}function R(){let P=1;for(let A=0;A<$.length;A++){let T=J2($[A],S[A],N);P=Math.max(P,T.length)}for(let A of Q)for(let T=0;T<A.length;T++){let M=J2(A[T]||"",S[T],N);P=Math.max(P,M.length)}return P}if(R()>FZ)return{type:"vertical",columnWidths:S,needsHardWrap:N};return{type:"horizontal",columnWidths:S,needsHardWrap:N}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),H="─".repeat(O);return AQ(bQ,{children:Q.map((z,w)=>{let _=[];if(w>0)_.push(H);return z.forEach((F,C)=>{let N=$[C]||`Column ${C+1}`,S=(F||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${S}`)}),_.join(`
133
+ `)}).join(`
134
+ `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:K}=Z;function q(O){let z={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],w=z.left;return X.forEach((_,F)=>{w+=z.h.repeat(_+2),w+=F<X.length-1?z.mid:z.right}),w}function G(O,H){let z=O.map((C,N)=>{let S=X[N]||l$;return J2(C||"",S,K)}),w=Math.max(...z.map((C)=>C.length),1),_=z.map((C)=>Math.floor((w-C.length)/2)),F=[];for(let C=0;C<w;C++){let N="│";for(let S=0;S<O.length;S++){let R=z[S],B=_[S],f=C-B,P=f>=0&&f<R.length?R[f]:"",A=X[S]||l$,T=K9(P),M=d6(H?`\x1B[1m${P}\x1B[22m`:P,T,A,H?"center":"left");N+=` ${M} │`}F.push(N)}return F}let U=[];if(U.push(q("top")),U.push(...G($,!0)),U.push(q("middle")),Q.forEach((O,H)=>{if(U.push(...G(O,!1)),H<Q.length-1)U.push(q("middle"))}),U.push(q("bottom")),Math.max(...U.map((O)=>K9(O)))>Y-G9){let O=Math.min(Y-1,40),H="─".repeat(O);return AQ(bQ,{children:Q.map((z,w)=>{let _=[];if(w>0)_.push(H);return z.forEach((F,C)=>{let N=$[C]||`Column ${C+1}`,S=(F||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${S}`)}),_.join(`
135
+ `)}).join(`
136
+ `)},void 0,!1,void 0,this)}return AQ(bQ,{color:J.colors.text.primary,children:U.join(`
137
+ `)},void 0,!1,void 0,this)});import{jsxDEV as m}from"react/jsx-dev-runtime";var HZ=($,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:" "}}},WZ=L$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=A0();if(J&&Z!==void 0){let K=$.split(`
138
+ `),q=4,G=Math.max(1,Z-4);if(K.length>G){let U=K.slice(0,G).join(`
139
+ `);return m(z0,{flexDirection:"column",flexShrink:0,children:[m(K2,{content:U,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(K2,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),LZ=L$.memo(({content:$,level:Q})=>{let Y=A0();switch(Q){case 1:return m(b0,{bold:!0,color:Y.colors.primary,children:m(y1,{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(y1,{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(y1,{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(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return m(b0,{children:m(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),BZ=L$.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)}),wZ=L$.memo(({content:$})=>{return m(b0,{wrap:"wrap",children:m(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),bZ=L$.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)}),AZ=L$.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,K=X?Z.slice(0,50):Z,q=K.join(`
141
+ `),G=q.includes("<<<DIFF>>>"),U=q.includes("```");if(G){let W=q.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(W)try{let O=JSON.parse(W[1]);return m(z0,{flexDirection:"column",children:[m(LQ,{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(U){let W=q.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(W){let O=W[1]||"text",H=W[2];return m(z0,{flexDirection:"column",children:[m(K2,{content:H,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:[K.map((W,O)=>m(b0,{color:Y.colors.text.primary,children:W},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 PZ($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),K=Math.max(40,J*0.8),q=X*K;if($.length<=q)return{content:$,isTruncated:!1,hiddenLines:0};let G=Math.floor(q*0.9),U=$.length-G,W=U,O=$.indexOf(`
142
+ `,U);if(O!==-1&&O-U<K)W=O+1;let H=$.slice(W),w=($.slice(0,W).match(/\n/g)||[]).length+1;return{content:H,isTruncated:!0,hiddenLines:w}}var J$=L$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:K=!1,noMargin:q=!1,renderPlainTextOnly:G=!1,streamingLines:U,streamingHiddenLines:W,messageId:O,blocksOverride:H,currentLineOverride:z,streamingMode:w="text",renderCodeBlocksAsPlainText:_=!1})=>{let F=A0(),C=H!==void 0,N=W$(()=>HZ(Q,F.colors,J),[Q,F.colors,J]),{color:S,prefix:R}=N,B=R.length+1,f=W$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let b=J.subtaskRef;if(!b||typeof b!=="object")return null;return b},[J]),P=Q==="tool"&&J?.phase==="start",A=!q&&!P,T=W$(()=>{if(!G)return[];return $.split(/\r?\n/)},[$,G]);if(!C&&Z){let b=U??$.split(/\r?\n/),V=W??0,p=!1,j=!1,h=!1;if(w!=="text")p=w==="code",j=w==="diff",h=w==="table";return m(z0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[V>0&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(b0,{color:F.colors.text.muted,dimColor:!0,children:["^ ",V," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b.map((E,Z0)=>{if(w==="text"){if(E.match(Q$.codeBlock))p=!p;else if(E.match(Q$.diffStart))j=!0;else if(E.match(Q$.diffEnd))j=!1;else if(E.match(Q$.table))h=!0;else if(h&&!E.match(Q$.table))h=!1}let J0=w==="text"&&!p&&!j&&!h,w0=J0?E.match(Q$.ulItem):null,f0=J0?E.match(Q$.olItem):null,c0=w0??f0;return m(z0,{flexDirection:"row",flexShrink:0,children:[Z0===0&&!K?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:c0?m(wQ,{type:w0?"ul":"ol",marker:c0[2],itemText:c0[3],leadingWhitespace:c0[1]},void 0,!1,void 0,this):m(b0,{wrap:"wrap",children:E===""?" ":E},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},Z0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!C&&G)return m(z0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:T.map((b,V)=>m(z0,{flexDirection:"row",flexShrink:0,children:[V===0&&!K?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:m(b0,{wrap:"wrap",children:b===""?" ":b},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},V,!0,void 0,this))},void 0,!1,void 0,this);let M=U9(null);PQ(()=>{M.current=null},[O]);let L=W$(()=>{if(C)return null;if(!O)return null;return O9(O)},[O,C]);PQ(()=>{if(C)return;if(!L||!O)return;M.current={messageId:O,blocks:L}},[L,O,C]),PQ(()=>{if(C)return;if(!L||!O)return;z9(O)},[L,O,C]);let k=W$(()=>C?{content:$,isTruncated:!1,hiddenLines:0}:PZ($,X,Z,Y),[$,X,Z,Y,C]),{content:g,isTruncated:o,hiddenLines:l}=k;if(!C&&Q==="tool"&&J&&"detail"in J){let b=J;if(b.detail)return m(z0,{flexDirection:"column",marginBottom:q?0:1,children:[m(z0,{flexDirection:"row",children:[m(z0,{marginRight:1,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(b0,{color:S,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),m(z0,{marginLeft:R.length+1,children:m(AZ,{detail:b.detail,terminalWidth:Y-(R.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:a,currentLine:I}=W$(()=>{if(C)return{completedContent:"",currentLine:z??""};if(!Z)return{completedContent:g,currentLine:""};let b=g.lastIndexOf(`
143
+ `);if(b===-1)return{completedContent:"",currentLine:g};return{completedContent:g.slice(0,b+1),currentLine:g.slice(b+1)}},[g,Z,C,z]),y=U9({content:"",blocks:[]}),v=W$(()=>{if(C)return H??[];if(L)return L;if(M.current&&M.current.messageId===O)return M.current.blocks;let b=y.current;if(!Z||!a.startsWith(b.content)){let h=yQ(a);return y.current={content:a,blocks:h},h}if(a===b.content)return b.blocks;let V=a.slice(b.content.length),p=yQ(V),j=[...b.blocks,...p];return y.current={content:a,blocks:j},j},[a,Z,C,H]);return m(z0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[o&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(b0,{color:F.colors.text.muted,dimColor:!0,children:["^ ",l," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),v.map((b,V)=>{if(b.type==="empty")return m(z0,{height:1,flexShrink:0},V,!1,void 0,this);return m(z0,{flexDirection:"row",flexShrink:0,children:[V===0&&!K&&m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),(V>0||K)&&m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:b.type==="code"?_?m(b0,{wrap:"wrap",children:b.content},void 0,!1,void 0,this):m(WZ,{content:b.content,language:b.language,terminalWidth:Y-B,isPending:Z,availableHeight:X},void 0,!1,void 0,this):b.type==="table"&&b.tableData?m(q9,{headers:b.tableData.headers,rows:b.tableData.rows,terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="heading"?m(LZ,{content:b.content,level:b.level||1},void 0,!1,void 0,this):b.type==="list"?m(wQ,{type:b.listType||"ul",marker:b.marker||"-",itemText:b.content,leadingWhitespace:" ".repeat(b.indentation||0)},void 0,!1,void 0,this):b.type==="hr"?m(BZ,{terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="diff"&&b.diffData?m(LQ,{patch:b.diffData.patch,startLine:b.diffData.startLine,matchLine:b.diffData.matchLine,terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="command-message"?m(bZ,{content:b.content},void 0,!1,void 0,this):b.type==="blockquote"&&b.blockquoteLines?m(a6,{lines:b.blockquoteLines,level:b.blockquoteLevel||1},void 0,!1,void 0,this):m(wZ,{content:b.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},V,!0,void 0,this)}),I&&m(z0,{flexDirection:"row",flexShrink:0,children:[v.length===0&&!K?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:m(b0,{wrap:"wrap",children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[m(b0,{color:F.colors.text.muted,children:["Subtask"," ",typeof f.agentType==="string"?`@${f.agentType}`:"",typeof f.status==="string"?` · ${f.status}`:""]},void 0,!0,void 0,this),typeof f.summary==="string"&&f.summary.trim()!==""&&m(b0,{wrap:"wrap",children:f.summary},void 0,!1,void 0,this),typeof f.childSessionId==="string"&&m(b0,{color:F.colors.text.muted,children:["Session ",f.childSessionId]},void 0,!0,void 0,this),typeof f.resumedFrom==="string"&&m(b0,{color:F.colors.text.muted,children:["Resumed from ",f.resumedFrom,typeof f.resumeDepth==="number"?` · depth ${f.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 fZ}from"react/jsx-dev-runtime";var CZ=RQ.memo(({label:$,isSelected:Q})=>I0(k1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),IZ=RQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(fZ,{children:[I0(L1,{marginBottom:1,children:I0(k1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&I0(L1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[I0(k1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(L1,{marginTop:1,children:I0(J$,{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(L1,{flexDirection:"column",marginBottom:1,children:I0(J$,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&I0(L1,{flexDirection:"column",marginBottom:1,children:[I0(k1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,K)=>I0(L1,{marginLeft:2,children:I0(k1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&I0(L1,{flexDirection:"column",marginBottom:1,children:[I0(k1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,K)=>I0(L1,{marginLeft:2,children:I0(k1,{children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this)),$.affectedFiles.length>3&&I0(L1,{marginLeft:2,children:I0(k1,{color:"gray",children:["...还有 ",$.affectedFiles.length-3," 个文件"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this));function TZ($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var N9=RQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=RZ(),J=Y.columns||80,X=e0()==="confirmation-prompt",K=S0(!1),q=$.type==="exitPlanMode",G=$.type==="enterPlanMode",U=$.type==="maxTurnsExceeded",W=$.type==="mcpSampling";yZ((z,w)=>{if(w.ctrl&&z==="c"||w.meta&&z==="c"){K();return}if(w.escape){Q({approved:!1,reason:"用户取消"});return}let _=z.toLowerCase();if(q){if(_==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(_==="s"){Q({approved:!0,targetMode:"default"});return}if(_==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(G){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(U){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(W){if(_==="y"){Q({approved:!0,scope:"once"});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(_==="y"){Q({approved:!0,scope:"once"});return}if(_==="s"){Q({approved:!0,scope:"session"});return}if(_==="p"){Q({approved:!0,scope:"project"});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝"});return}}},{isActive:X});let O=_9(()=>{if(q)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(G)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(U)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(W)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(本次会话)",value:{approved:!0,scope:"session"}},{key:"approve-project",label:"[P] 允许并记住(本项目)",value:{approved:!0,scope:"project"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[q,G,U,W]),H=_9(()=>{if(q)return{color:"cyan",title:"方案审核"};if(G)return{color:"magenta",title:"进入规划模式"};if(U)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[q,G,U,$.title]);return I0(L1,{flexDirection:"column",borderStyle:"round",borderColor:X?H.color:"gray",padding:1,children:[I0(L1,{marginBottom:1,children:I0(k1,{bold:!0,color:H.color,children:H.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(IZ,{details:$,headerColor:H.color,isPlanModeExit:q,isPlanModeEnter:G,terminalWidth:J},void 0,!1,void 0,this),I0(L1,{flexDirection:"column",children:[I0(k1,{color:"gray",children:TZ(q,G,U,W)},void 0,!1,void 0,this),I0(MZ,{items:O,isFocused:X,itemComponent:CZ,onSelect:(z)=>{Q(z.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 G0,useInput as kZ}from"ink";import F9 from"ink-text-input";import{useState as c1}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var _8=[{action:"add",description:"Add a new hook"},{action:"status",description:"Show hooks status"},{action:"list",description:"List all configured hooks"},{action:"enable",description:"Enable hooks for this session"},{action:"disable",description:"Disable hooks for this session"},{action:"trust",description:"Trust the current project hook digest"},{action:"revoke",description:"Revoke project hook trust"}],G2=[{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"}],q2=[{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"}],SZ=[`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"],H9=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=r0.getTheme(),[X,K]=c1("action"),[q,G]=c1(0),[U,W]=c1(0),[O,H]=c1(0),[z,w]=c1(""),[_,F]=c1(""),[C,N]=c1(null),[S,R]=c1(!1),[B,f]=c1(null),P=_8[q],A=q2[U],T=G2[O],M=()=>{if(B){f(null);return}switch(X){case"action":Y();break;case"event":K("action");break;case"matcher":K("event");break;case"command":K("matcher");break;case"location":K("command");break;case"confirm":K("location");break}};kZ((v,b)=>{if(b.escape){M();return}if(X==="action"){if(b.upArrow)G((V)=>V>0?V-1:_8.length-1);else if(b.downArrow)G((V)=>V<_8.length-1?V+1:0);else if(b.return)L()}else if(X==="event"){if(b.upArrow)W((V)=>V>0?V-1:q2.length-1);else if(b.downArrow)W((V)=>V<q2.length-1?V+1:0);else if(b.return)K("matcher")}else if(X==="location"){if(b.upArrow)H((V)=>V>0?V-1:G2.length-1);else if(b.downArrow)H((V)=>V<G2.length-1?V+1:0);else if(b.return)K("confirm")}else if(X==="confirm"){if(b.return)y()}});let L=()=>{let v=_8[q].action;if(v==="add")K("event");else if(v==="status")k();else if(v==="list")l();else if(v==="enable")z1.getInstance().enableSession(Q,$),f("Hooks enabled for this session");else if(v==="disable")z1.getInstance().disableSession(Q,$),f("Hooks disabled for this session");else if(v==="trust")g();else if(v==="revoke")o()},k=async()=>{let v=z1.getInstance(),b=v.isEnabled($,Q),V=v.getConfig($),p=await v.getTrustStatus($),j={};for(let E of Object.values(CQ)){let Z0=V[E];if(Z0&&Array.isArray(Z0)){let J0=Z0.reduce((w0,f0)=>w0+(f0.hooks?.length||0),0);if(J0>0)j[E]=J0}}let h=[`Status: ${b?"Enabled":"Disabled"}`,`Trust: ${p.state}`,`Digest: ${p.currentDigest??"none"}`,""];if(Object.keys(j).length>0){h.push("Configured hooks:");for(let[E,Z0]of Object.entries(j))h.push(` ${E}: ${Z0} hook(s)`)}else h.push("No hooks configured");f(h.join(`
144
+ `))},g=async()=>{try{let v=await z1.getInstance().trustProject($);f(`Trust: ${v.state}
145
+ Digest: ${v.currentDigest??"none"}`)}catch(v){N(v instanceof Error?v.message:"Failed to trust hooks")}},o=async()=>{try{let v=await z1.getInstance().revokeProjectTrust($);f(`Trust: ${v.state}`)}catch(v){N(v instanceof Error?v.message:"Failed to revoke hook trust")}},l=()=>{let b=z1.getInstance().getConfig($),V=[],p=!1;for(let j of Object.values(CQ)){let h=b[j];if(!h||!Array.isArray(h)||h.length===0)continue;p=!0,V.push(`${j}:`);for(let E of h){let Z0=E.matcher,J0="all";if(Z0?.tools)J0=`tools: ${Array.isArray(Z0.tools)?Z0.tools.join(", "):Z0.tools}`;V.push(` [${J0}]`);for(let w0 of E.hooks||[])if(w0.type==="command")V.push(` -> ${w0.command}`)}V.push("")}if(!p)V.push("No hooks configured"),V.push(""),V.push("Configure hooks in .blade/settings.local.json");f(V.join(`
146
+ `))},a=()=>{K("command")},I=()=>{if(!_.trim()){N("Command cannot be empty");return}N(null),K("location")},y=async()=>{R(!0),N(null);try{let v=z1.getInstance(),b=await import("node:fs/promises"),V=await import("node:path"),p=await import("node:os"),j={matcher:z.trim()?{tools:z.trim()}:{},hooks:[{type:"command",command:_.trim()}]},h;switch(T.location){case"local":h=V.join($,".blade","settings.local.json");break;case"project":h=V.join($,".blade","settings.json");break;case"user":h=V.join(p.homedir(),".blade","settings.json");break}await b.mkdir(V.dirname(h),{recursive:!0});let E={};try{let f0=await b.readFile(h,"utf-8");E=JSON.parse(f0)}catch{}let Z0=E.hooks||{},J0=Z0[A.event]||[],w0={...Z0,enabled:!0,[A.event]:[...J0,j]};if(E.hooks=w0,await b.writeFile(h,JSON.stringify(E,null,2),"utf-8"),await v.reloadConfig($),J)J({event:A.event,matcher:z.trim(),command:_.trim()});Y()}catch(v){N(`Failed to save hook: ${v instanceof Error?v.message:"Unknown error"}`),R(!1)}};return c(L0,{flexDirection:"column",padding:1,children:[c(L0,{marginBottom:1,children:c(G0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{marginBottom:1,children:c(G0,{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),B&&c(L0,{flexDirection:"column",marginBottom:1,children:[c(G0,{children:B},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{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"&&!B&&c(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",marginTop:1,children:_8.map((v,b)=>c(L0,{children:[c(G0,{color:b===q?Z.colors.primary:void 0,bold:b===q,children:[b===q?"> ":" ",v.action]},void 0,!0,void 0,this),c(G0,{color:Z.colors.muted,children:[" - ",v.description]},void 0,!0,void 0,this)]},v.action,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{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"&&c(L0,{flexDirection:"column",children:[c(G0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:q2.map((v,b)=>c(L0,{children:[c(G0,{color:b===U?Z.colors.primary:void 0,bold:b===U,children:[b===U?"> ":" ",v.event]},void 0,!0,void 0,this),c(G0,{color:Z.colors.muted,children:[" - ",v.description]},void 0,!0,void 0,this)]},v.event,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{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"&&c(L0,{marginBottom:1,children:c(G0,{children:["Event:"," ",c(G0,{bold:!0,color:Z.colors.primary,children:A.event},void 0,!1,void 0,this),c(G0,{color:Z.colors.muted,children:[" - ",A.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")&&c(L0,{flexDirection:"column",marginBottom:1,children:[c(G0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),c(G0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),c(G0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),c(G0,{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"&&c(L0,{flexDirection:"column",children:[c(L0,{children:[c(G0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),c(F9,{value:z,onChange:w,onSubmit:a,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(G0,{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),c(L0,{marginTop:1,children:c(G0,{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")&&c(L0,{marginBottom:1,children:c(G0,{children:["Matcher: ",c(G0,{bold:!0,children:z||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X==="command"&&c(L0,{flexDirection:"column",children:[c(L0,{children:c(G0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:c(F9,{value:_,onChange:F,onSubmit:I,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:[c(G0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),SZ.map((v,b)=>c(G0,{color:Z.colors.muted,children:["• ",v]},b,!0,void 0,this))]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(G0,{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"&&c(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[c(G0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),c(G0,{children:" "},void 0,!1,void 0,this),c(G0,{children:[" ","Event: ",A.event," - ",A.description]},void 0,!0,void 0,this),c(G0,{children:[" Matcher: ",z||"(all)"]},void 0,!0,void 0,this),c(G0,{children:[" Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(G0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:G2.map((v,b)=>c(L0,{children:[c(G0,{color:b===O?Z.colors.primary:void 0,bold:b===O,children:[b===O?"> ":" ",b+1,". ",v.name]},void 0,!0,void 0,this),c(G0,{color:Z.colors.muted,children:[" ",v.description]},void 0,!0,void 0,this)]},v.location,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{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"&&c(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[c(G0,{bold:!0,children:["Saving hook to ",T.description,"..."]},void 0,!0,void 0,this),c(G0,{children:" "},void 0,!1,void 0,this),c(G0,{children:["Event: ",A.event]},void 0,!0,void 0,this),c(G0,{children:["Matcher: ",z||"(all tools)"]},void 0,!0,void 0,this),c(G0,{children:["Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.colors.muted,children:S?"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),C&&c(L0,{marginTop:1,children:c(G0,{color:Z.colors.error,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as D9}from"ahooks";import{Box as iZ,Text as oZ}from"ink";import nZ from"react";import{useMemoizedFn as O2}from"ahooks";import w$ from"chalk";import{Text as uZ,useInput as lZ}from"ink";import{useEffect as k9,useRef as z2}from"react";var U2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var B$="\x1B",vZ=`${B$}[200~`,DZ=`${B$}[201~`,VZ="[200~",jZ="[201~",hZ=[`${B$}[I`,`${B$}[O`,"[I","[O"],B9=`${B$}[?2004h`,w9=`${B$}[?2004l`,TQ=`${B$}[?1004l`,EZ=[vZ,VZ],gZ=[DZ,jZ];function b9(){return{pasteBuffer:null,pasteOverflowed:!1}}function W9($,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 L9($){return hZ.some((Q)=>$===Q)}function A9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,K=[];while(Y.length>0){if(J!==null){let U=W9(Y,gZ);if(!U){if(J.length+Y.length>IQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+U.index>IQ)Z=!0;else if(!Z)J+=Y.slice(0,U.index),K.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(U.index+U.marker.length);continue}let q=W9(Y,EZ);if(!q){if(L9(Y))X=!0;else K.push({kind:"text",text:Y});Y="";break}let G=Y.slice(0,q.index);if(G&&!L9(G))K.push({kind:"text",text:G});J="",Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:K}}import{execSync as d$}from"node:child_process";import{existsSync as mZ,readFileSync as fQ}from"node:fs";import{basename as P9,isAbsolute as pZ}from"node:path";function y9($){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 R9(){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 cZ(){let{commands:$}=R9();try{return d$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function M9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function C9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function kQ($){let Q=M9($.trim()),Y=C9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function xZ($){let Q=M9($.trim()),Y=C9(Q);if(kQ(Y))return Y;return null}async function I9($){let Q=xZ($);if(!Q)return null;let Y;try{if(pZ(Q))Y=fQ(Q);else{let K=cZ();if(K&&Q===P9(K))Y=fQ(K);else return null}}catch(K){return console.error("Failed to read image file:",K),null}let J=Y.toString("base64"),Z=y9(J),X=P9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function T9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return d$(Y,{encoding:"utf-8"})||null}catch{return null}}async function f9(){let{commands:$,screenshotPath:Q}=R9();try{if(d$($.checkImage,{stdio:"ignore"}),d$($.saveImage(Q),{stdio:"ignore"}),!mZ(Q))return null;let J=fQ(Q).toString("base64"),Z=y9(J);return d$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{d$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as aZ}from"react/jsx-dev-runtime";var dZ=/\r\n/g,rZ=/\r/g;function SQ($){if(!$.includes("\r"))return $;return $.replace(dZ,`
147
+ `).replace(rZ,`
148
+ `)}function S9($,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 v9({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:K,onImagePaste:q,disabledKeys:G=[]}){let U=z2(b9()),W=z2($),O=z2(Z),H=z2(null);k9(()=>{W.current=$,O.current=Z},[$,Z]),k9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let z=O2((R,B)=>{let f=W.current,P=O.current;if(W.current=R,O.current=B,R!==f)J(R);if(B!==P)X(B)}),w=O2((R)=>{if(!R)return;let{newValue:B,newCursorPosition:f}=S9(SQ(R),W.current,O.current);z(B,f)}),_=O2(async(R)=>{let B=SQ(R);if(!B)return;if(q&&kQ(B))try{let P=await I9(B);if(P){let A=await q(P.base64,P.mediaType,P.filename);if(A?.prompt)w(A.prompt);return}}catch(P){console.error("Failed to process image path:",P)}if((B.length>U2.LARGE_INPUT_THRESHOLD||B.includes(`
149
+ `))&&K){let P=await K(B);if(P?.prompt){w(P.prompt);return}}w(B)}),F=O2((R)=>{let B=H.current;if(!B){try{let P=R();if(!P)return;let A=P.catch(()=>{return});H.current=A,A.finally(()=>{if(H.current===A)H.current=null})}catch{}return}let f=B.then(R).then(()=>{return}).catch(()=>{return});H.current=f,f.finally(()=>{if(H.current===f)H.current=null})});lZ((R,B)=>{F(()=>{let f=SQ(R),P=A9(U.current,f);if(U.current=P.state,P.handled)return(async()=>{for(let g of P.segments)if(g.kind==="paste")await _(g.text);else w(g.text)})();if(G.some((g)=>B[g])||B.ctrl&&R==="c"||B.ctrl&&R==="l"||B.ctrl&&R==="t"||B.ctrl&&R==="o"||B.meta&&R==="l"||B.meta&&R==="t"||B.meta&&R==="o"||B.shift&&B.tab||f==="?"&&W.current==="")return;let T=W.current,M=O.current,L=M,k=T;if(B.leftArrow)L--;else if(B.rightArrow)L++;else if(B.backspace||B.delete){if(R===""){if(M>0)k=T.slice(0,M-1)+T.slice(M,T.length),L--}else if(M<T.length)k=T.slice(0,M)+T.slice(M+1,T.length)}else if(B.ctrl&&f==="a")L=0;else if(B.ctrl&&f==="e")L=T.length;else if(B.ctrl&&f==="k")k=T.slice(0,M);else if(B.ctrl&&f==="u")k=T.slice(M),L=0;else if(B.ctrl&&f==="w"){let o=T.slice(0,M).match(/\s*\S+\s*$/);if(o){let l=o[0].length;k=T.slice(0,M-l)+T.slice(M),L-=l}}else if(B.ctrl&&f==="v"){let g=process.platform==="darwin";return(async()=>{if(q){let l=await f9();if(l){let a=await q(l.base64,l.mediaType,"clipboard.png");if(a?.prompt)w(a.prompt);return}}if(g)return;let o=await T9();if(o)await _(o)})()}else if(B.pageUp)L=0;else if(B.pageDown)L=T.length;else if(f===`
150
+ `&&(B.shift||B.meta)){let{newValue:g,newCursorPosition:o}=S9(f,T,M);z(g,o);return}else if(!B.ctrl&&!B.meta){if(K&&(f.length>U2.LARGE_INPUT_THRESHOLD||f.includes(`
151
+ `)))return _(f);k=T.slice(0,M)+f+T.slice(M,T.length),L+=f.length}if(L<0)L=0;if(L>k.length)L=k.length;z(k,L)})},{isActive:Y});let C=Y,N=$,S=Q?w$.grey(Q):void 0;if(C)if(S=Q.length>0?w$.inverse(Q[0])+w$.grey(Q.slice(1)):w$.inverse(" "),$.length===0)N=w$.inverse(" ");else{N="";for(let R=0;R<$.length;R++)if(R===Z&&Z<$.length)N+=w$.inverse($[R]);else N+=$[R];if(Z>=$.length)N+=w$.inverse(" ")}return aZ(uZ,{children:Q?$.length>0?N:S:N},void 0,!1,void 0,this)}import{jsxDEV as vQ}from"react/jsx-dev-runtime";var V9=nZ.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let q=e0()==="main-input",G=$.trimStart().startsWith("!"),U=D9((O)=>{let H=O.split(`
152
+ `).length,z=O.length,w=500,_=10;if(z>500||H>10){let F=Z(O),C=O.slice(0,30).replace(/\n/g," "),N=`${z} chars, ${H} lines: ${C}...`;return{prompt:`${i8(F)}${N}${l2()}`}}return{}}),W=D9(async(O,H,z)=>{try{let w=X(O,H);return{prompt:`${i8(w)}[Image #${w}]${l2()}`}}catch(w){return console.error("[Image Paste] Failed to process image:",w),{prompt:`[Image paste failed: ${w instanceof Error?w.message:"Unknown error"}] `}}});return vQ(iZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[vQ(oZ,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),vQ(v9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:U,onImagePaste:W,placeholder:" 输入命令...",focus:q,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as _2,Text as R1}from"ink";import Q5,{useEffect as J5,useState as Y5}from"react";import{useEffect as $5,useState as g9}from"react";import{useEffect as tZ,useState as sZ}from"react";var eZ=15000,j9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],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 E9($,Q,Y=!1){let[J,Z]=sZ("");return tZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let U=Math.floor(Math.random()*h9.length);return h9[U]}let G=Math.floor(Math.random()*j9.length);return j9[G]};Z(X());let K=setInterval(()=>{Z(X())},eZ);return()=>{clearInterval(K)}},[$,Q,Y]),J}function m9($,Q=!1,Y=!1){let[J,Z]=g9(0),[X,K]=g9(null),q=E9($,Q,Y);return $5(()=>{if(!$){Z(0),K(null);return}if(Y)return;if(X===null)K(Date.now());let G=setInterval(()=>{if(X!==null){let U=Math.floor((Date.now()-X)/1000);Z(U)}},1000);return()=>{clearInterval(G)}},[$,X,Y]),{currentPhrase:q,elapsedTime:J}}import{jsxDEV as Q1,Fragment as X5}from"react/jsx-dev-runtime";var DQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],Z5=80;function r$($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var p9=Q5.memo(({message:$,paused:Q=!1})=>{let Y=s1(),J=R8(),Z=G4(),X=K4(),K=q4(),q=U4(),G=O4(),U=Y||!J,[W,O]=Y5(0),H=A0(),w=E$()>=Z5,{currentPhrase:_,elapsedTime:F}=m9(U,!1,Q);if(J5(()=>{if(!U||Q){O(0);return}let P=setInterval(()=>{O((A)=>(A+1)%DQ.length)},150);return()=>clearInterval(P)},[U,Q]),!U)return null;let C=K?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${K.attempt}/${K.maxRetries}),剩余约 ${r$(Math.max(0,Math.ceil((K.recoveryRemainingMs??0)/1000)))}`:K?.phase==="scheduled"?`Provider 暂时不可用,${K.attempt}/${K.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((K.delayMs??0)/1000))}s 后开始`:K?.phase==="attempt"?`正在重试 Provider (${K.attempt}/${K.maxRetries})`:null,N=X?X.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${X.retryAfterMs!==void 0?` (${r$(Math.max(0,Math.ceil(X.retryAfterMs/1000)))})`:""}${X.recoveryRemainingMs!==void 0?`,剩余预算 ${r$(Math.max(0,Math.ceil(X.recoveryRemainingMs/1000)))}`:""}`:null,S=Z?`等待 Provider 容量(${Z.scope},队列 ${Z.queuePosition}/${Math.max(Z.queueDepth,Z.queuePosition)},已等待 ${r$(Math.max(0,Math.ceil(Z.waitMs/1000)))})`:null,R=q?q.outputStarted?`Provider 流已暂停 ${Math.ceil(q.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(q.durationMs/1000)}s(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:null,f=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||N||S||C||R||$||_||"正在思考中...";if(w)return Q1(_2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[Q1(R1,{color:H.colors.warning,bold:!0,children:DQ[W]},void 0,!1,void 0,this),Q1(R1,{color:H.colors.text.primary,children:f},void 0,!1,void 0,this),F>0&&Q1(X5,{children:[Q1(R1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(R1,{color:H.colors.info,children:["已用时: ",r$(F)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Q1(R1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(R1,{color:H.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Q1(_2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[Q1(_2,{flexDirection:"row",gap:1,children:[Q1(R1,{color:H.colors.warning,bold:!0,children:DQ[W]},void 0,!1,void 0,this),Q1(R1,{color:H.colors.text.primary,children:f},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F>0&&Q1(_2,{marginLeft:2,flexDirection:"row",gap:1,children:[Q1(R1,{color:H.colors.info,children:["已用时: ",r$(F)]},void 0,!0,void 0,this),Q1(R1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(R1,{color:H.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 H2,Text as D0,useInput as K5,useStdout as G5}from"ink";import q5 from"ink-text-input";import U5,{useCallback as N2,useEffect as O5,useMemo as z5,useState as b$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var l9=U5.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=G5(),J=Y.columns||80,Z=e0()==="confirmation-prompt",X=S0(!1),K=$.fields??[],[q,G]=b$("field"),[U,W]=b$(0),[O,H]=b$(()=>c9($)),[z,w]=b$(""),[_,F]=b$(0),[C,N]=b$([]),[S,R]=b$(),B=K[U],f=z5(()=>_5(B),[B]);O5(()=>{if(!B)return;let L=O[B.name];w(typeof L==="string"||typeof L==="number"?String(L):""),N(Array.isArray(L)?[...L]:[]);let k=f.findIndex((g)=>g.value===String(L));F(k>=0?k:0),R(void 0)},[O,B,f]);let P=N2((L)=>{if(H(L),U<K.length-1){W((k)=>k+1);return}G("review")},[U,K.length]),A=N2((L)=>{if(!B)return;let k={...O};if(L===void 0)delete k[B.name];else k[B.name]=L;P(k)},[O,B,P]),T=N2((L)=>{if(!B)return;try{A(x9(B,L))}catch(k){R(k instanceof Error?k.message:String(k))}},[B,A]),M=N2(()=>{try{let L=u9($,{action:"accept",content:O});Q({action:L.action,...L.content?{content:L.content}:{}})}catch(L){R(L instanceof Error?L.message:String(L))}},[O,$,Q]);if(K5((L,k)=>{if(k.ctrl&&L==="c"||k.meta&&L==="c"){X();return}if(k.escape){Q({action:"cancel"});return}if($.mode==="url"){if(L.toLowerCase()==="y")Q({action:"accept"},!0);else if(L.toLowerCase()==="n")Q({action:"decline"});return}if(q==="review"){if(L.toLowerCase()==="y"||k.return)M();else if(L.toLowerCase()==="e")W(0),G("field");else if(L.toLowerCase()==="d")Q({action:"decline"});return}if(!B){if(k.return)M();return}if(VQ(B))return;if(L.toLowerCase()==="d"){Q({action:"decline"});return}if(k.upArrow){F((g)=>g>0?g-1:Math.max(f.length-1,0));return}if(k.downArrow||k.tab){F((g)=>g<f.length-1?g+1:0);return}if(L===" "&&B.type==="multi-select"){let g=f[_];if(g)N((o)=>o.includes(g.value)?o.filter((l)=>l!==g.value):[...o,g.value]);return}if(k.return)if(B.type==="multi-select")A(C);else{let g=f[_];if(g)A(g.typedValue)}},{isActive:Z}),$.mode==="url")return F0(F2,{width:J,color:"yellow",children:[F0(D0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),F0(D0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),F0(D0,{children:["Domain: ",F0(D0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{wrap:"wrap",children:["URL: ",F0(D0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(q==="review")return F0(F2,{width:J,color:"green",children:[F0(D0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),K.map((L)=>F0(D0,{children:[L.title,": ",F5(O[L.name])]},L.name,!0,void 0,this)),S&&F0(D0,{color:"red",children:S},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!B)return F0(F2,{width:J,color:"cyan",children:[F0(D0,{children:$.message},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),F0(D0,{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(F2,{width:J,color:"cyan",children:[F0(D0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),F0(H2,{flexDirection:"column",marginTop:1,children:[F0(D0,{bold:!0,children:[B.title,B.required?" *":""]},void 0,!0,void 0,this),B.description&&F0(D0,{color:"gray",children:B.description},void 0,!1,void 0,this),F0(D0,{color:"gray",children:N5(B)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),VQ(B)?F0(H2,{children:[F0(D0,{color:"cyan",children:"> "},void 0,!1,void 0,this),F0(q5,{value:z,onChange:w,onSubmit:T,focus:Z,placeholder:B.defaultValue===void 0?B.required?"Required":"Optional":String(B.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):F0(H2,{flexDirection:"column",children:f.map((L,k)=>{let g=B.type==="multi-select"&&C.includes(L.value);return F0(D0,{color:_===k?"yellow":void 0,children:[_===k?"> ":" ",B.type==="multi-select"?g?"(*) ":"( ) ":"",L.label]},L.value,!0,void 0,this)})},void 0,!1,void 0,this),S&&F0(D0,{color:"red",children:S},void 0,!1,void 0,this),F0(D0,{color:"gray",children:[VQ(B)?"Enter to continue":B.type==="multi-select"?"Space to toggle · Enter to continue":"Up/Down to select · Enter to continue"," · [D] Decline · Esc Cancel"]},void 0,!0,void 0,this),F0(D0,{color:"gray",children:["Field ",U+1," of ",K.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function F2({children:$,width:Q,color:Y}){return F0(H2,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function VQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function _5($){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 N5($){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 F5($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import w2 from"ansi-escapes";import{Box as Z$,Static as f5,useStdout as k5}from"ink";import S5,{useEffect as l1,useMemo as cQ,useRef as X$,useState as xQ}from"react";import{useStdout as H5}from"ink";import{debounce as W5}from"lodash-es";import{useEffect as L5,useState as B5}from"react";function d9($=200){let{stdout:Q}=H5(),[Y,J]=B5(Q.rows||24);return L5(()=>{let Z=W5(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import A$ from"chalk";import w5 from"string-width";var N0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},L2="\x1B",jQ=`${L2}[2K`,W2=($)=>$>0?`${L2}[${$}A`:"",r9=`${L2}[?25l`,a9=`${L2}[?25h`;function i9($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function o9($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function n9($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),K=[],q=r0.getTheme(),G=" ".repeat(N0.prefixIndent),U=A$.dim.hex(q.colors.border.light);if(Q>0)K.push(`${G}${A$.dim.hex(q.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let W=Y==="code",O=Y==="diff",H="",z=$;if(W&&$.length>0)H=$[0].match(/^```(\w+)?/)?.[1]||"",z=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")z=$.slice(1);let w=z.slice(-X);if(W&&Q===0){let F=H?` ${A$.hex(q.colors.text.secondary)(H)}`:"";K.push(`${G}${U("╭─")}${F}`)}for(let F=0;F<w.length;F++){let C=w[F],N=G;if(F===0&&!J&&N0.isFirstRender&&!W&&!O)N=A$.bold.hex(q.colors.success)("• ")+" ",N0.isFirstRender=!1;let S=W?4:0,R=N0.terminalWidth-N0.prefixIndent-2-S,B=C;if(w5(C)>R)B=C.slice(0,R);if(W)K.push(`${G}${U("│")} ${B}`);else if(O){let f=B;if(f.startsWith("+"))K.push(`${N}${A$.green(B)}`);else if(f.startsWith("-"))K.push(`${N}${A$.red(B)}`);else if(f.startsWith("@@"))K.push(`${N}${A$.dim(B)}`);else K.push(`${N}${B}`)}else K.push(`${N}${B}`);if(F===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let _=[];if(_.push(r9),N0.renderedLineCount>0)_.push(W2(N0.renderedLineCount)),_.push("\r");for(let F=0;F<K.length;F++){let C=K[F],N=N0.lastRenderedLines[F];if(C!==N)_.push(jQ),_.push(C);if(F<K.length-1)_.push(`
153
+ `)}if(K.length<N0.renderedLineCount){for(let C=K.length;C<N0.renderedLineCount;C++)_.push(`
154
+ `),_.push(jQ);let F=N0.renderedLineCount-K.length;_.push(W2(F))}_.push(a9),process.stdout.write(_.join("")),N0.renderedLineCount=K.length,N0.lastRenderedLines=K}function x1(){if(!N0.active)return;if(N0.renderedLineCount>0){let $=[];$.push(r9),$.push(W2(N0.renderedLineCount)),$.push("\r");for(let Q=0;Q<N0.renderedLineCount;Q++)if($.push(jQ),Q<N0.renderedLineCount-1)$.push(`
155
+ `);if(N0.renderedLineCount>1)$.push(W2(N0.renderedLineCount-1)),$.push("\r");$.push(a9),process.stdout.write($.join(""))}N0.active=!1,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.isFirstRender=!0}function S1(){return N0.active}import{Box as b5,Text as t9}from"ink";import A5 from"react";import{jsxDEV as hQ}from"react/jsx-dev-runtime";var EQ=A5.memo(({collapsedCount:$})=>{let Q=A0();if($<=0)return null;let Y=Q.colors.text.muted;return hQ(b5,{flexDirection:"row",marginBottom:1,children:[hQ(t9,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),hQ(t9,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});EQ.displayName="CollapsedHistorySummary";import{Box as N8,Text as F8}from"ink";import P5 from"ink-big-text";import y5 from"ink-gradient";import R5 from"react";import{jsxDEV as B1}from"react/jsx-dev-runtime";var e9=R5.memo(()=>{return B1(N8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[B1(N8,{flexDirection:"column",children:B1(y5,{name:"pastel",children:B1(P5,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(N8,{marginBottom:1,children:B1(F8,{color:"white",dimColor:!0,children:s9()},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(N8,{flexDirection:"column",marginBottom:1,children:[B1(N8,{marginBottom:1,children:B1(F8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(F8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),B1(F8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),B1(F8,{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 B2,Text as gQ}from"ink";import $J from"react";import{jsxDEV as Y$}from"react/jsx-dev-runtime";var QJ=$J.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 Y$(B2,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[Y$(B2,{marginBottom:Y?0:1,children:[Y$(gQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),Y$(gQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y$(B2,{flexDirection:"column",children:$.map((X,K)=>Y$(M5,{task:X,compact:Y},X.id||K,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),M5=$J.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 Y$(B2,{paddingY:Q?0:0,children:Y$(gQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as mQ,Text as a$}from"ink";import C5,{useMemo as JJ}from"react";import{jsxDEV as u1}from"react/jsx-dev-runtime";function I5($,Q=60){if(!$)return"";let Y=$.split(`
156
+ `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function T5($){if(!$)return 0;return $.split(`
157
+ `).length}var pQ=C5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=JJ(()=>T5($),[$]),X=JJ(()=>I5($),[$]),K=J.colors.info,q=J.colors.muted;return u1(mQ,{flexDirection:"column",marginBottom:1,children:[u1(mQ,{flexDirection:"row",children:[u1(a$,{color:K,children:Y?"v":">"},void 0,!1,void 0,this),u1(a$,{children:" "},void 0,!1,void 0,this),u1(a$,{color:q,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&u1(a$,{color:q,children:[" - ",X]},void 0,!0,void 0,this),u1(a$,{color:q,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&u1(mQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:u1(a$,{color:q,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});pQ.displayName="ThinkingBlock";import{jsxDEV as i0}from"react/jsx-dev-runtime";var ZJ=S5.memo(()=>{let $=Q4(),Q=C4(),Y=I4(),J=T4(),Z=s1(),X=F4(),K=B4(),q=I8(),G=R4(),U=M4(),W=J4(),O=k4(),H=f4(),z=E$(),w=d9(),{stdout:_}=k5(),F=n1(),[C,N]=xQ(null),[S,R]=xQ([]),[B,f]=xQ(new Set),P=X$(H),A=X$(null),T=X$(0),M=X$(0),L=X$(new Set),k=X$(new Set),g=X$([]),o=X$(null);l1(()=>{if(P.current!==H){if(S1())x1();if(_)_.write(w2.clearTerminal);F.incrementClearCount(),P.current=H}},[H,_,F]);let l=$,a=J;l1(()=>{if(!J||Z){o.current=null;return}if(o.current===J)return;if(o.current=J,S1())x1();if(_)_.write(w2.eraseScreen+w2.cursorTo(0,0));L.current=new Set,k.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),A.current=null,T.current=0,M.current=0,g.current=[],R([]),f(new Set),F.incrementClearCount(),F.clearFinalizingStreamingMessageId()},[J,Z,_,F,l]);let I=Q??J;l1(()=>{if(S1())x1();A.current=null,T.current=0,M.current=0,L.current=new Set,k.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),g.current=[],R([]),f(new Set)},[W]),l1(()=>{if(!I)return;if(A.current===I)return;A.current=I,T.current=0,M.current=0,k.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),g.current=[],R([])},[I,l]),l1(()=>{if(!I)return;let j=uQ(I);if(!j||j.length<=T.current)return;let h=j.slice(T.current);T.current=j.length;let E=h,Z0=g.current;if(Z0.length>0)if(E.some((c0)=>c0.type!=="empty"))E=[...Z0,...E],g.current=[];else{g.current=[...Z0,...E];return}let J0=E.length;while(J0>0&&E[J0-1].type==="empty")J0-=1;if(J0!==E.length)g.current=E.slice(J0),E=E.slice(0,J0);if(E.length===0)return;let w0=M.current;M.current+=1;let f0=w0>0;if(S1())x1();f((c0)=>{if(!I||c0.has(I))return c0;let h0=new Set(c0);return h0.add(I),h0}),R((c0)=>[...c0,i0(Z$,{flexDirection:"column",children:i0(J$,{content:"",role:"assistant",terminalWidth:z,isPending:!1,hidePrefix:f0,noMargin:!0,blocksOverride:E,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${w0}`,!1,void 0,this)])},[I,Y.version,z,W]),l1(()=>{if(!I)return;let j=k.current,h=l.filter((E)=>E.role==="tool"&&!j.has(E.id)&&!L.current.has(E.id));if(h.length===0)return;if(S1())x1();for(let E of h)L.current.add(E.id);R((E)=>[...E,...h.map((Z0)=>i0(Z$,{flexDirection:"column",children:i0(J$,{content:Z0.content,role:Z0.role,terminalWidth:z,metadata:Z0.metadata,isPending:!1,messageId:Z0.id},void 0,!1,void 0,this)},`streaming-tool-${Z0.id}`,!1,void 0,this))])},[I,l,z]),l1(()=>{if(!I){if(S1())x1();return}if(!S1())i9(z,w);else o9(z,w);let j=YJ(I);if(!j||j.lines.length===0)return;let E=Math.max(1,w-8),Z0=Math.max(0,j.lines.length-E),J0=j.lines.slice(-E),w0=(uQ(I)?.length??0)>0;n9(J0,Z0,j.mode,w0)},[I,Y.version,w,z]),l1(()=>{if(!I&&S1())x1()},[I]),l1(()=>{if(C===null&&l.length>O){if(N(l.length),S1())x1();if(_)_.write(w2.clearTerminal);F.incrementClearCount()}},[l.length,O,C,_,F]);let y=cQ(()=>{return X.some((j)=>j.status==="pending"||j.status==="in_progress")},[X]),v=H?0:C??0,b=v,V=cQ(()=>{let j=[];if(j.push(i0(e9,{},"header",!1,void 0,this)),b>0)j.push(i0(EQ,{collapsedCount:b},"collapsed-summary",!1,void 0,this));for(let h=v;h<l.length;h++){let E=l[h];if(a&&E.id===a)continue;if(E.role==="tool"&&L.current.has(E.id))continue;if(E.role==="assistant"&&B.has(E.id))continue;j.push(i0(Z$,{flexDirection:"column",children:i0(J$,{content:E.content,role:E.role,terminalWidth:z,metadata:E.metadata,isPending:!1,messageId:E.id},void 0,!1,void 0,this)},E.id,!1,void 0,this))}return j},[l,v,b,z,a,B]),p=cQ(()=>S.length>0?[...V,...S]:V,[V,S]);return i0(Z$,{flexDirection:"column",paddingX:2,children:i0(Z$,{flexDirection:"column",children:[i0(f5,{items:p,children:(j)=>j},W,!1,void 0,this),G&&i0(Z$,{marginBottom:1,children:i0(pQ,{content:G,isStreaming:Z,isExpanded:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&y&&i0(Z$,{marginTop:1,children:i0(QJ,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.map((j,h)=>i0(Z$,{flexDirection:"column",children:i0(J$,{content:j.displayText,role:"user",terminalWidth:z},void 0,!1,void 0,this)},`pending-${h}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as b2,useMount as v5}from"ahooks";import{Box as w1,Text as H0,useFocus as D5,useFocusManager as V5,useInput as j5}from"ink";import h5 from"ink-select-input";import{memo as E5,useMemo as g5,useState as A2}from"react";import{jsxDEV as e,Fragment as c5}from"react/jsx-dev-runtime";var m5=({isSelected:$})=>e(w1,{marginRight:1,children:e(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),p5=({isSelected:$,label:Q})=>e(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),XJ=E5(({onClose:$,onEdit:Q})=>{let Y=w4(),J=C8()??"",{isFocused:Z}=D5({id:"model-selector"}),X=V5(),[K,q]=A2(""),[G,U]=A2(!1),[W,O]=A2(null),H=S0(!1),[z]=A2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});v5(()=>{if(X?.focus("model-selector"),Y.length>0)q(Y[0].id)}),j5((P,A)=>{if(G)return;if(A.ctrl&&P==="c"||A.meta&&P==="c"){H();return}if(A.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){_();return}if((P==="e"||P==="E")&&Q)F()},{isActive:!0});let w=b2(async(P)=>{if(G)return;let A=P.value;if(A===J){$();return}U(!0),O(null);try{await m0().setCurrentModel(A),$()}catch(T){O(T.message),U(!1)}}),_=b2(async()=>{if(G||K===J)return;U(!0),O(null);try{if(await m0().removeModel(K),Y.length<=1)$()}catch(P){O(P.message)}finally{U(!1)}}),F=b2(()=>{if(G||!Q)return;let P=Y.find((A)=>A.id===K);if(!P)return;Q(P)}),C=b2((P)=>{q(P.value)}),N=g5(()=>{return Y.find((P)=>P.id===K)},[Y,K]),S=N?P2()?.modelProviders[N.provider]:void 0,R=Y.map((P)=>{let A=P.id===J?" (当前)":"";return{label:lQ(P)+A,value:P.id}}),B=K===J;return e(w1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[e(w1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[e(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),e(H0,{dimColor:!0,children:[G?"处理中...":B?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(w1,{flexDirection:"row",children:[e(w1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),e(w1,{marginTop:1,children:e(h5,{items:R,onSelect:w,onHighlight:C,indicatorComponent:m5,itemComponent:p5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(w1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),e(w1,{marginY:1,children:e(H0,{color:B?"green":"yellow",children:B?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N?e(w1,{flexDirection:"column",children:[e(H0,{children:[e(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),e(H0,{bold:!0,color:"cyan",children:lQ(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:S?.name??N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S&&e(c5,{children:[e(H0,{children:[e(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),e(H0,{children:N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),e(H0,{children:S.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:S.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:N.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.overrides?.baseUrl&&e(H0,{children:[e(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:N.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),e(H0,{children:E1().resolveConfig(N).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):e(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W&&e(w1,{marginTop:1,children:e(H0,{color:"red",children:W},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(w1,{justifyContent:"center",marginTop:1,children:e(H0,{dimColor:!0,children:"─".repeat(z)},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(w1,{justifyContent:"center",children:e(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 dQ}from"ahooks";import{Box as qX,Text as rQ,useInput as UX}from"ink";import{useState as R$}from"react";import{Box as P$,Text as d1,useInput as x5}from"ink";import u5 from"ink-text-input";import{jsxDEV as o0}from"react/jsx-dev-runtime";var KJ=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return x5((K,q)=>{if(q.escape)Z()}),o0(P$,{flexDirection:"column",children:[o0(P$,{marginBottom:1,children:o0(d1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(d1,{children:["Provider: ",o0(d1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(d1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{children:[o0(d1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),o0(u5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&o0(P$,{marginTop:1,children:o0(d1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginTop:1,children:o0(d1,{dimColor:!0,children:["输入完成后按 ",o0(d1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",o0(d1,{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 y2,Text as K$,useInput as l5}from"ink";import d5 from"ink-text-input";import{useState as R2}from"react";import{jsxDEV as N1}from"react/jsx-dev-runtime";var M2=["id","name","baseUrl","model"];function GJ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function r5($,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=UJ(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 OJ=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,K]=R2(Q?3:0),[q,G]=R2(Q?.model??""),[U,W]=R2(Z),[O,H]=R2(),z=M2[X];l5((_,F)=>{if(!F.escape)return;if(H(void 0),X===0){J();return}let C=X-1,N=M2[C];K(C),G(U[N])});let w=(_)=>{let F=_.trim();if(z==="id"&&!qJ.test(F)){H("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(z==="baseUrl")try{let N=new URL(F);if(!["http:","https:"].includes(N.protocol))throw Error()}catch{H("Base URL 必须是绝对 HTTP(S) URL");return}if(z==="model"&&!F){H("Model ID 不能为空");return}let C={...U,[z]:z==="name"&&!F?U.id:F};if(W(C),H(void 0),X===M2.length-1){try{Y(a5(C,$))}catch(N){H(N instanceof Error?N.message:"渠道配置无效")}return}K(X+1),G("")};return N1(y2,{flexDirection:"column",children:[N1(y2,{marginBottom:1,children:N1(K$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N1(K$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),M2.slice(0,X).map((_)=>N1(K$,{children:[GJ(_),": ",N1(K$,{color:"cyan",children:U[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),N1(y2,{marginTop:1,children:[N1(K$,{bold:!0,children:[GJ(z),": "]},void 0,!0,void 0,this),N1(d5,{value:q,onChange:(_)=>{G(_),H(void 0)},onSubmit:w,placeholder:r5(z,$,U.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z==="name"&&N1(K$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&N1(K$,{color:"red",children:O},void 0,!1,void 0,this),N1(y2,{marginTop:1,children:N1(K$,{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 NJ,useState as i$}from"react";var FJ=()=>{let[$,Q]=i$([]),[Y,J]=i$(!0),[Z,X]=i$(null);return NJ(()=>{(async()=>{try{Q(await zJ())}catch(q){X(q instanceof Error?q.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},HJ=($)=>{let[Q,Y]=i$([]),[J,Z]=i$(!1),[X,K]=i$(null);return NJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),K(null);try{Y(await _J($))}catch(G){K(G instanceof Error?G.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as r1,Text as M1,useInput as i5}from"ink";import o5 from"ink-select-input";import n5 from"ink-text-input";import{useMemo as WJ,useState as t5}from"react";import{jsxDEV as E0,Fragment as QX}from"react/jsx-dev-runtime";var s5=({isSelected:$})=>E0(r1,{marginRight:1,children:E0(M1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),e5=($)=>{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(" ")},$X=({isSelected:$,label:Q})=>E0(M1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),LJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[K,q]=t5("");i5((W,O)=>{if(O.escape)if(K)q("");else X()});let G=WJ(()=>{if(!K)return Q;let W=K.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(W)||O.id.toLowerCase().includes(W))},[Q,K]),U=WJ(()=>G.map((W)=>({key:W.id,label:e5(W),value:W})),[G]);if(Y)return E0(r1,{flexDirection:"column",children:E0(M1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return E0(r1,{flexDirection:"column",children:[E0(M1,{color:"red",children:J},void 0,!1,void 0,this),E0(M1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E0(r1,{flexDirection:"column",children:[E0(r1,{marginBottom:1,children:E0(M1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(r1,{marginBottom:1,children:E0(M1,{children:["Provider: ",E0(M1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E0(QX,{children:[E0(r1,{marginBottom:1,children:[E0(M1,{color:"cyan",children:"> "},void 0,!1,void 0,this),E0(n5,{value:K,onChange:q,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(r1,{marginBottom:1,children:E0(M1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(r1,{flexDirection:"column",height:12,children:E0(o5,{items:U,onSelect:(W)=>Z(W.value),indicatorComponent:s5,itemComponent:$X,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&E0(M1,{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 y$,Text as G$,useInput as JX}from"ink";import YX from"ink-select-input";import ZX from"ink-text-input";import{useMemo as BJ,useState as XX}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var KX=({isSelected:$})=>n0(y$,{marginRight:1,children:n0(G$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),GX=({isSelected:$,label:Q})=>n0(G$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),wJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,K]=XX("");JX((U,W)=>{if(W.escape)if(X)K("");else Z()});let q=BJ(()=>{if(!X)return $;let U=X.toLowerCase();return $.filter((W)=>W.name.toLowerCase().includes(U)||W.id.toLowerCase().includes(U))},[$,X]),G=BJ(()=>q.map((U)=>({key:U.id,label:`${U.name} - ${U.modelCount} models${U.configured?" [configured]":""}`,value:U})),[q]);if(Q)return n0(y$,{flexDirection:"column",children:n0(G$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(y$,{flexDirection:"column",children:[n0(G$,{color:"red",children:Y},void 0,!1,void 0,this),n0(G$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(y$,{flexDirection:"column",children:[n0(y$,{marginBottom:1,children:n0(G$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(y$,{marginBottom:1,children:[n0(G$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(ZX,{value:X,onChange:K,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(y$,{flexDirection:"column",height:12,children:n0(YX,{items:G,onSelect:(U)=>J(U.value),indicatorComponent:KX,itemComponent:GX,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.length===0&&n0(G$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function bJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as q$}from"react/jsx-dev-runtime";var aQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,K]=R$("provider"),[q,G]=R$(),[U,W]=R$(),[O,H]=R$(),[z,w]=R$(""),[_,F]=R$(),[C,N]=R$(!1),S=FJ(),R=HJ(q?.id),B=S0(!1);UX((T,M)=>{if(M.ctrl&&T==="c"||M.meta&&T==="c")$==="setup"?B():Z()});let f=dQ(async(T)=>{if(!q)return;let M=O??(U?{provider:q.id,model:U.id,displayName:Q?.displayName}:void 0);if(!M)return;N(!0),F(void 0);try{if(M.modelProvider)E1().registerModelProvider(M.provider,M.modelProvider,[M.model]);if(T?.trim())await E1().setApiKey(M.provider,T.trim());let L={displayName:M.displayName,provider:M.provider,model:M.model,overrides:M.overrides};if($==="setup")await J(M);else if($==="add"){let k=M.modelProvider?await m0().addModelWithProvider(L,M.modelProvider):await m0().addModel(L);await m0().setCurrentModel(k.id),await J(M)}else if(Y){if(M.modelProvider)await m0().updateModelWithProvider(Y,L,M.modelProvider);else await m0().updateModel(Y,L);await J(M)}}catch(L){if(M.modelProvider){await E1().credentials.delete(M.provider);let k=P2();E1().configureModelProviders(k?.modelProviders??{},k?.models??[])}F(L instanceof Error?L.message:"保存配置失败"),N(!1)}}),P=dQ((T)=>{if(W(T),q?.configured)f();else if(q?.supportsApiKey)K("credential");else F(`${q?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),A=dQ(()=>{if(F(void 0),X==="credential"&&O){K("custom");return}let T=bJ(X);if(T)K(T)});return q$(qX,{flexDirection:"column",padding:1,children:[q$(rQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&q$(wJ,{...S,onSelect:(T)=>{G(T),W(void 0),H(void 0),K(T.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&q?.factoryWireApi&&q$(OJ,{wireApi:q.factoryWireApi,initialConfig:O,onSubmit:(T)=>{H(T),K("credential")},onCancel:A},void 0,!1,void 0,this),X==="model"&&q&&q$(LJ,{provider:q,...R,onSelect:P,onCancel:A},void 0,!1,void 0,this),X==="credential"&&q&&q$(KJ,{provider:q,value:z,onChange:w,onSubmit:()=>void f(z),onCancel:A,error:_},void 0,!1,void 0,this),C&&q$(rQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&q$(rQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as H8}from"ahooks";import{promises as RJ}from"fs";import{Box as F1,Text as V0,useInput as OX}from"ink";import AJ from"ink-select-input";import zX from"ink-text-input";import _X from"os";import C2 from"path";import{useEffect as NX,useMemo as I2,useRef as FX,useState as U$}from"react";import{jsxDEV as U0}from"react/jsx-dev-runtime";var W8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],HX={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},WX={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},PJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},LX=["project","global","local"],BX={allow:[],ask:[],deny:[]},wX={localExists:!1,projectExists:!1,globalExists:!1},yJ={allow:[],ask:[],deny:[]};function bX($){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 AX($){try{let Q=await RJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:bX(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...yJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...yJ}}}}function PX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${PJ[Q]} <- 可删除`:PJ[Q];return`${Y} ${J}`}var MJ=({onClose:$})=>{let Y=e0()==="permissions-manager",J=S0(!1),[Z,X]=U$(0),K=W8[Z].key,[q,G]=U$(BX),[U,W]=U$(wX),[O,H]=U$(!0),[z,w]=U$("list"),[_,F]=U$(""),[C,N]=U$(null),[S,R]=U$(null),B=FX(!1),f=I2(()=>C2.join(l0(),".blade","settings.local.json"),[]),P=I2(()=>C2.join(l0(),".blade","settings.json"),[]),A=I2(()=>C2.join(_X.homedir(),".blade","settings.json"),[]),T=H8(async()=>{H(!0);let j=await Promise.all([{source:"local",path:f},{source:"project",path:P},{source:"global",path:A}].map(async({source:J0,path:w0})=>{let f0=await AX(w0);return{source:J0,path:w0,...f0}})),h={localExists:j.find((J0)=>J0.source==="local")?.exists??!1,projectExists:j.find((J0)=>J0.source==="project")?.exists??!1,globalExists:j.find((J0)=>J0.source==="global")?.exists??!1};W(h);let E={allow:[],ask:[],deny:[]},Z0=Object.fromEntries(j.map((J0)=>[J0.source,J0]));["allow","ask","deny"].forEach((J0)=>{LX.forEach((w0)=>{(Z0[w0]?.permissions[J0]??[]).forEach((c0,h0)=>{let H1={key:`${w0}:${h0}:${c0}`,rule:c0,source:w0};E[J0].push(H1)})})}),G(E),H(!1)});NX(()=>{T()},[T]);let M=H8(async(p,j)=>{try{let h=C2.join(l0(),".blade","settings.local.json"),E={allow:[],ask:[],deny:[]};try{let J0=await RJ.readFile(h,"utf-8"),f0=JSON.parse(J0).permissions||{};E={allow:Array.isArray(f0.allow)?f0.allow:[],ask:Array.isArray(f0.ask)?f0.ask:[],deny:Array.isArray(f0.deny)?f0.deny:[]}}catch(J0){}let Z0=j(E);await m0().updateConfig({permissions:Z0},{scope:"local",immediate:!0}),await T()}catch(h){throw console.error("[PermissionsManager] 修改权限规则失败:",h),h}});OX((p,j)=>{if(j.ctrl&&p==="c"||j.meta&&p==="c"){J();return}if(z==="locked"){if(B.current){B.current=!1;return}w("list"),N(null),R(null);return}if(j.escape){if(z==="list"||K==="info")$();else w("list"),F(""),N(null),R(null);return}if(z==="list"){if(j.tab&&j.shift)X((h)=>(h-1+W8.length)%W8.length);else if(j.tab)X((h)=>(h+1)%W8.length);else if(p?.toLowerCase()==="q")$()}},{isActive:Y});let L=H8((p)=>{let j=p.value;if(K==="info")return;if(j.type==="add"){w("add"),F(""),R(null);return}if(j.entry.source!=="local"){w("locked"),B.current=!0,N({tab:K,entry:j.entry}),R({type:"error",text:j.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}w("confirm-delete"),N({tab:K,entry:j.entry}),R(null)}),k=H8(async()=>{if(K==="info")return;let p=_.trim();if(!p){R({type:"error",text:"Permission rule 不能为空"});return}if(q[K].map((h)=>h.rule).includes(p)){R({type:"error",text:"该规则已存在"});return}try{await M(K,(h)=>{let E={allow:[...h.allow],ask:[...h.ask],deny:[...h.deny]};return E[K]=[...new Set([...h[K],p])],E}),w("list"),F(""),R({type:"success",text:"已添加本地权限规则"})}catch(h){R({type:"error",text:`保存失败: ${h instanceof Error?h.message:"未知错误"}`})}}),g=H8(async()=>{if(!C)return;let{tab:p,entry:j}=C;try{await M(p,(h)=>{let E={allow:[...h.allow],ask:[...h.ask],deny:[...h.deny]};return E[p]=h[p].filter((Z0)=>Z0!==j.rule),E}),w("list"),N(null),R({type:"success",text:"已删除本地权限规则"})}catch(h){R({type:"error",text:`删除失败: ${h instanceof Error?h.message:"未知错误"}`})}}),o=I2(()=>{if(K==="info")return[];let p=K;return[{key:"add-new-rule",label:`› ${HX[p]}`,value:{type:"add"}},...q[p].map((h)=>({key:h.key,label:PX(h.rule,h.source),value:{type:"rule",entry:h}}))]},[K,q]),l=()=>U0(F1,{marginBottom:1,children:W8.map((p,j)=>U0(F1,{marginRight:2,children:U0(V0,{color:j===Z?"yellow":"gray",children:["[",p.label,"]"]},void 0,!0,void 0,this)},p.key,!1,void 0,this))},void 0,!1,void 0,this),a=()=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),U0(F1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",U.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",U.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",U.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U0(V0,{children:"说明:"},void 0,!1,void 0,this),U0(F1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),U0(V0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),U0(V0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),I=(p)=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:WX[p]},void 0,!1,void 0,this),U0(V0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),U0(F1,{marginTop:1,children:U0(zX,{value:_,onChange:F,onSubmit:k},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y=(p,j)=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:["Delete ",p," permission rule?"]},void 0,!0,void 0,this),U0(V0,{children:j.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),U0(V0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),U0(AJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(h)=>{if(h.value==="yes")g();else w("list"),N(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v=(p)=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),U0(V0,{children:p.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:p.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b=(p)=>U0(AJ,{items:o,isFocused:z==="list",onSelect:L},void 0,!1,void 0,this),V=()=>{if(O)return U0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(K==="info")return a();if(z==="add")return I(K);if(z==="confirm-delete"&&C)return y(C.tab,C.entry);if(z==="locked"&&C)return v(C.entry);return b(K)};return U0(F1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[U0(V0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),l(),U0(F1,{flexDirection:"column",gap:1,children:V()},void 0,!1,void 0,this),S&&U0(F1,{marginTop:1,children:U0(V0,{color:S.type==="success"?"green":"red",children:S.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(F1,{marginTop:1,children:U0(V0,{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 B0,Text as Y0,useInput as yX}from"ink";import{useEffect as RX,useState as M$}from"react";import{jsxDEV as x}from"react/jsx-dev-runtime";var iQ=["local","project","global"];function vJ({workspaceRoot:$,onCancel:Q}){let Y=IJ($),J=Y.getAll(),[Z,X]=M$(0),[K,q]=M$(!1),[G,U]=M$(""),[W,O]=M$(null),[H,z]=M$("local"),[w,_]=M$(null),[F,C]=M$(0),N=Y.getBySource(),S=Y.getStats(),R=Y.getSourcePolicy(),B=S0(!1,Q);RX(()=>{let L=!0;return CJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((k)=>{if(L)_(k.settings)}).catch((k)=>{if(L)U(k instanceof Error?k.message:"无法读取插件作用域配置")}),()=>{L=!1}},[Y,F]);let f=()=>{z((L)=>{let k=iQ.indexOf(L);return iQ[(k+1)%iQ.length]}),O(null)},P=async()=>{let L=J[Z];if(!L||K)return;if(L.source==="cli"){U(`${L.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(L.status==="error"){U(L.error??`${L.manifest.name} 当前不可用`);return}q(!0),U("");try{let k=await TJ(Y.getWorkspaceRoot(),L.manifest.name,L.status!=="active",H);U(k.effectiveEnabled?`已启用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`:`已禁用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`),C((g)=>g+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}},A=async()=>{if(K)return;q(!0),U("");try{await fJ(Y.getWorkspaceRoot()),X(0),U("插件列表已刷新"),C((L)=>L+1)}catch(L){U(L instanceof Error?L.message:String(L))}finally{q(!1)}},T=async()=>{let L=J[Z];if(!L||K)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}q(!0),O(null),U("");try{let{result:k}=await kJ(Y.getWorkspaceRoot(),L.manifest.name,{trusted:!0});if(!k.success)throw Error(k.error);U(k.changed?`已更新 ${L.manifest.name} 到 ${k.installation?.revision}`:`${L.manifest.name} 已是最新版本`),C((g)=>g+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}},M=async()=>{let L=J[Z];if(!L||K)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(W!==L.manifest.name){O(L.manifest.name),U(`再次按 x 确认卸载 ${L.manifest.name}`);return}q(!0),U("");try{let{result:k}=await SJ(Y.getWorkspaceRoot(),L.manifest.name,!0);if(!k.success)throw Error(k.error);O(null),X(0),U(`已卸载 ${L.manifest.name}`),C((g)=>g+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}};if(yX((L,k)=>{if(k.escape)Q?.();else if(k.ctrl&&L==="c"||k.meta&&L==="c")B();else if((k.upArrow||L==="k")&&J.length>0)O(null),X((g)=>(g-1+J.length)%J.length);else if((k.downArrow||L==="j")&&J.length>0)O(null),X((g)=>(g+1)%J.length);else if(L===" "||k.return)P();else if(L==="r")A();else if(L==="s")f();else if(L==="u")T();else if(L==="x")M()}),J.length===0)return x(B0,{flexDirection:"column",paddingY:1,children:[x(B0,{marginBottom:1,children:x(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Y0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{marginTop:1,paddingLeft:2,children:x(Y0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{marginTop:1,children:x(Y0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return x(B0,{flexDirection:"column",paddingY:1,children:[x(B0,{marginBottom:1,children:[x(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:[" (共 ",S.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["启用: ",S.active," | 禁用: ",S.inactive," | 命令: ",S.commands," | 技能:"," ",S.skills," | 代理: ",S.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["来源策略: ",R.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",R.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["写入层级: ",x(Y0,{color:"cyan",children:H},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),N.cli.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.cli.map((L)=>{let k=L.status==="active"?"[on]":"[off]",g=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:g?"cyan":"green",children:[g?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.project.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.project.map((L)=>{let k=L.status==="active"?"[on]":"[off]",g=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:g?"cyan":"green",children:[g?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",w?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.user.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.user.map((L)=>{let k=L.status==="active"?"[on]":"[off]",g=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:g?"cyan":"green",children:[g?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",w?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),x(B0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Y0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{marginTop:1,children:x(Y0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&x(B0,{marginTop:1,children:x(Y0,{color:G.includes("失败")?"red":"cyan",children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&x(Y0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as J1,Text as Y1,useInput as DJ,useStdout as MX}from"ink";import CX from"ink-text-input";import oQ,{useCallback as L8,useMemo as IX,useState as O$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var TX=oQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>W0(J1,{flexDirection:"column",marginBottom:1,children:[W0(Y1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),W0(J1,{marginLeft:4,children:W0(Y1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),fX=oQ.memo(({questions:$,answers:Q})=>W0(J1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return W0(J1,{marginBottom:1,children:[W0(Y1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),W0(Y1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),VJ=oQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=MX(),Z=J.columns||80,K=e0()==="confirmation-prompt",q=S0(!1),[G,U]=O$("answering"),[W,O]=O$(0),[H,z]=O$({}),[w,_]=O$(0),[F,C]=O$([]),[N,S]=O$(!1),[R,B]=O$(""),[f,P]=O$(0),A=$[W],T=IX(()=>{if(!A)return[];return[...A.options.map((l)=>({label:l.label,value:l.label,description:l.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[A]),M=L8((l)=>{let a={...H,[A.header]:l};if(z(a),W<$.length-1)O(W+1),_(0),C([]),S(!1),B("");else U("submit"),P(0)},[H,A?.header,W,$.length]),L=L8((l)=>{let a=T[l];if(!a)return;if(a.value==="__other__"){S(!0);return}if(A.multiSelect)C((I)=>I.includes(a.value)?I.filter((y)=>y!==a.value):[...I,a.value]);else M(a.value)},[T,A?.multiSelect,M]),k=L8((l)=>{if(l.trim())M(l.trim())},[M]),g=L8(()=>{U("answering"),O(0),_(0),C([]),S(!1)},[]),o=L8(()=>{Q(H)},[H,Q]);if(DJ((l,a)=>{if(a.ctrl&&l==="c"||a.meta&&l==="c"){q();return}if(N){if(a.escape)S(!1),B("");return}if(a.escape){Y();return}let I=parseInt(l);if(I>=1&&I<=T.length){L(I-1);return}if(a.upArrow){_((y)=>y>0?y-1:T.length-1);return}if(a.downArrow||a.tab){_((y)=>y<T.length-1?y+1:0);return}if(a.return){if(A.multiSelect&&F.length>0)M(F);else L(w);return}if(l===" "&&A.multiSelect){let y=T[w];if(y&&y.value!=="__other__")C((v)=>v.includes(y.value)?v.filter((b)=>b!==y.value):[...v,y.value]);return}},{isActive:K&&G==="answering"&&!N}),DJ((l,a)=>{if(a.ctrl&&l==="c"||a.meta&&l==="c"){q();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){P((I)=>I===0?1:0);return}if(a.return){if(f===0)o();else g();return}if(l.toLowerCase()==="y"){o();return}if(l.toLowerCase()==="e"){g();return}},{isActive:K&&G==="submit"}),G==="submit")return W0(J1,{flexDirection:"column",borderStyle:"round",borderColor:K?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(J1,{marginBottom:1,children:W0(Y1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W0(fX,{questions:$,answers:H},void 0,!1,void 0,this),W0(J1,{flexDirection:"column",marginTop:1,children:[W0(Y1,{color:f===0?"yellow":void 0,bold:f===0,children:[f===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Y1,{color:f===1?"yellow":void 0,bold:f===1,children:[f===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(J1,{marginTop:1,children:W0(Y1,{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(!A)return null;return W0(J1,{flexDirection:"column",borderStyle:"round",borderColor:K?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(J1,{marginBottom:1,children:[W0(Y1,{backgroundColor:"blue",color:"white",children:[" ",A.header," "]},void 0,!0,void 0,this),W0(Y1,{children:[" ",A.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N?W0(J1,{flexDirection:"column",marginTop:1,children:[W0(Y1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),W0(J1,{marginTop:1,children:[W0(Y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0(CX,{value:R,onChange:B,onSubmit:k,focus:K},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(J1,{marginTop:1,children:W0(Y1,{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(J1,{flexDirection:"column",children:T.map((l,a)=>W0(TX,{option:l,index:a,isSelected:F.includes(l.value),isMultiSelect:A.multiSelect,isHighlighted:w===a},l.value,!1,void 0,this))},void 0,!1,void 0,this),!N&&W0(J1,{marginTop:1,flexDirection:"column",children:[W0(Y1,{color:"gray",children:A.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),A.multiSelect&&F.length>0&&W0(Y1,{color:"green",children:["Selected: ",F.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&W0(J1,{marginTop:1,children:W0(Y1,{color:"gray",children:["Question ",W+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as kX}from"node:path";import{Box as n$,Text as b1,useInput as SX}from"ink";import vX from"ink-select-input";import{useEffect as nQ,useMemo as o$,useRef as pJ,useState as T2}from"react";function jJ($){return`${$.projectPath}\x00${$.sessionId}`}function hJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function EJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function gJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function mJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as d0}from"react/jsx-dev-runtime";function DX($){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 VX($){return kX($)}function jX($){switch($){case"queued":return"QUEUED";case"running":return"RUNNING";case"failed":return"FAILED";case"cancelled":return"CANCELLED";case"interrupted":return"INTERRUPTED";case"completed":return"DONE"}}var hX=({isSelected:$})=>d0(n$,{marginRight:1,children:d0(b1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),EX=({isSelected:$,label:Q})=>d0(b1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),B8=20,cJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=T2([]),[K,q]=T2(!1),[G,U]=T2(0),[W,O]=T2(!1),H=pJ(!1),z=pJ(!0);nQ(()=>{return z.current=!0,()=>{z.current=!1}},[]);let _=e0()==="session-selector",F=S0(!1);SX((A,T)=>{if(T.ctrl&&A==="c"||T.meta&&A==="c"){F();return}if(H.current)return;if(T.escape&&J){J();return}if(T.leftArrow||A==="h"||A==="H"){if(G>0)U((M)=>M-1);return}if(T.rightArrow||A==="l"||A==="L"){if(G<R-1)U((M)=>M+1);return}},{isActive:_}),nQ(()=>{if(Q){X(Q);return}(async()=>{q(!0);try{let T=await P0.listSessions({includeSubagents:!1});X(T)}catch(T){console.error("[SessionSelector] Failed to load sessions:",T),X([])}finally{q(!1)}})()},[Q]);let C=o$(()=>gJ(Q||Z,$),[$,Q,Z]),N=o$(()=>mJ($),[$]),S=o$(()=>{return C.map((A)=>{let T=VX(A.taskSourceProjectPath??A.projectPath),M=DX(A.lastMessageTime),L=hJ(A),k=`[${jX(A.taskStatus)}]`,g=A.gitBranch?` (${A.gitBranch})`:"",o=A.hasErrors?" [!]":"",l=A.taskRetriedFrom?` ↻ retry:${A.taskRetriedFrom.sessionId.slice(0,6)}`:A.relationType==="subagent"?" ↳ subagent":A.relationType==="fork"?" ↳ fork":"",a=A.taskIsolation==="worktree"?` | wt:${A.taskWorktreeBranch??"managed"}`:A.taskIsolation==="local"?" | local":"",I=A.taskDiffStat?` | ${A.taskDiffStat.changedFiles} files +${A.taskDiffStat.additions} -${A.taskDiffStat.deletions}`:"",y=A.taskStatus==="queued"&&A.taskQueuePosition?` | queue:${A.taskQueuePosition}/${A.taskQueueDepth??A.taskQueuePosition}`:"",v=EJ(A);return{key:jJ(A),label:`${k} ${L} · ${M} | ${T}${g} | ${A.messageCount} 条消息${a}${y}${I}${v}${o}${l}`,value:A}})},[C]),R=o$(()=>Math.max(1,Math.ceil(S.length/B8)),[S.length]),B=o$(()=>{let A=G*B8;return S.slice(A,A+B8)},[S,G]),f=o$(()=>({start:G*B8+1,end:Math.min((G+1)*B8,S.length)}),[G,S.length]);nQ(()=>{U(0)},[C.length]);let P=(A)=>{if(H.current)return;H.current=!0,O(!0);let T=()=>{if(!z.current)return;H.current=!1,O(!1)};Promise.resolve().then(()=>Y(A.value)).then(T,T)};if(K)return d0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:d0(b1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(C.length===0)return d0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[d0(b1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),d0(b1,{dimColor:!0,children:[`
158
+ `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return d0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[d0(b1,{bold:!0,color:"cyan",children:N.title},void 0,!1,void 0,this),d0(b1,{dimColor:!0,children:[`
159
+ `,N.instructions,`
160
+ `]},void 0,!0,void 0,this),d0(vX,{items:B,onSelect:P,isFocused:_&&!W,indicatorComponent:hX,itemComponent:EX},void 0,!1,void 0,this),W&&d0(b1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),d0(n$,{marginTop:1,flexDirection:"column",children:[d0(b1,{dimColor:!0,children:["第 ",G+1,"/",R," 页 · 共 ",C.length," 个会话 · 显示"," ",f.start,"-",f.end]},void 0,!0,void 0,this),R>1&&d0(n$,{marginTop:1,children:[d0(b1,{color:G>0?"cyan":"gray",children:G>0?"<< 上一页":" "},void 0,!1,void 0,this),d0(b1,{children:" "},void 0,!1,void 0,this),d0(b1,{color:G<R-1?"cyan":"gray",children:G<R-1?"下一页 >>":""},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as p0,Text as T0,useInput as gX}from"ink";import{jsxDEV as $0}from"react/jsx-dev-runtime";function uJ({onCancel:$}){let Q=T1(),J=xJ({cwd:Q}).getAll(),Z=J.filter((G)=>G.source==="builtin"),X=J.filter((G)=>G.source==="user"),K=J.filter((G)=>G.source==="project"),q=S0(!1,$);if(gX((G,U)=>{if(U.escape)$?.();else if(U.ctrl&&G==="c"||U.meta&&G==="c")q()}),J.length===0)return $0(p0,{flexDirection:"column",paddingY:1,children:[$0(p0,{marginBottom:1,children:$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{marginTop:1,paddingLeft:2,children:$0(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $0(p0,{flexDirection:"column",paddingY:1,children:[$0(p0,{marginBottom:1,children:[$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.map((G)=>{let W=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(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&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((G)=>{let W=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(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&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((G)=>{let W=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.userInvocable&&$0(p0,{paddingLeft:2,children:$0(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),$0(p0,{marginTop:1,children:$0(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 lJ,Text as C1}from"ink";import mX,{useEffect as pX,useMemo as cX,useState as dJ}from"react";import{jsxDEV as Z1,Fragment as tQ}from"react/jsx-dev-runtime";var rJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function xX($){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 aJ=mX.memo(()=>{let $=t((U)=>U.app.subagentProgresses),Q=t((U)=>U.app.subagentProgress),Y=A0(),[J,Z]=dJ(0),[X,K]=dJ(()=>Date.now()),q=cX(()=>{let U=Object.values($);return U.length>0?U:Q?[Q]:[]},[Q,$]),G=q.some((U)=>U.status==="running");if(pX(()=>{if(!G){Z(0);return}let U=setInterval(()=>{Z((O)=>(O+1)%rJ.length)},80),W=setInterval(()=>{K(Date.now())},1000);return()=>{clearInterval(U),clearInterval(W)}},[G]),q.length===0)return null;return Z1(lJ,{paddingX:2,paddingY:0,flexDirection:"column",children:q.map((U)=>{let W=U.status==="running"?rJ[J]:U.status==="completed"?"[OK]":"[X]",O=U.status==="running"?Y.colors.info:U.status==="completed"?Y.colors.success:Y.colors.error,H=Math.max(0,X-U.startTime);return Z1(lJ,{flexDirection:"row",gap:1,children:[Z1(C1,{color:O,bold:!0,children:W},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.text.primary,bold:!0,children:U.type},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.text.secondary,children:U.description},void 0,!1,void 0,this),U.currentTool&&Z1(tQ,{children:[Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.warning,children:U.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="running"&&H>0&&Z1(tQ,{children:[Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.info,children:xX(H)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="failed"&&U.terminalSummary&&Z1(tQ,{children:[Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.error,children:U.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},U.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as uX}from"ahooks";import{Box as v1,Text as d,useInput as lX}from"ink";import dX from"ink-select-input";import{useState as iJ}from"react";import{jsxDEV as u}from"react/jsx-dev-runtime";var oJ=C$.map(($)=>({label:$.label,value:$.id})),rX=({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)},nJ=()=>{let $=t1(),Q=r0.getCurrentThemeName(),Y=C$.findIndex((w)=>w.label===Q),J=Y>=0?C$[Y].theme:C$[0].theme,[Z,X]=iJ(J),[K,q]=iJ(!1),G=uX(async(w)=>{if(K)return;q(!0);try{await m0().setTheme(w.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{q(!1)}}),U=(w)=>{let _=C$.find((F)=>F.id===w.value);if(_)X(_.theme)},O=e0()==="theme-selector",H=S0(!1);lX((w,_)=>{if(_.ctrl&&w==="c"||_.meta&&w==="c"){H();return}if(_.escape&&!K)$.closeModal()},{isActive:O});let z=(w)=>{let{isSelected:_,label:F}=w,N=F===Q?"[OK]":" ";return u(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[N," ",F]},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:["可用主题 (",oJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(dX,{items:oJ,initialIndex:Y>=0?Y:0,onSelect:G,onHighlight:U,itemComponent:z},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(rX,{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:K?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as M0}from"react/jsx-dev-runtime";var U1=e1("UI"),eJ=({debug:$,continue:Q,...Y})=>{if($)U1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=f2(!1),Z=f2(!1),X=f2(!1),K=f2(null),q=_4(),G=N4(),U=y8(),W=W4(),O=H4(),H=t1(),z=n1(),w=k$(),_=T1(),F=A4(),C=S$(),N=s1(),S=b4();_$(()=>{if(r0.getCurrentThemeName()!==S)try{r0.setTheme(S)}catch{}},[S]);let R=q==="ready",B=q==="needsSetup",f=q==="idle",P=iX(()=>Y.agents?sJ(Y.agents):void 0,[Y.agents]),{confirmationState:A,confirmationHandler:T,handleResponse:M,dismissAll:L}=X6(),{executeCommand:k,handleAbort:g,cleanupAgent:o}=Q6(Y.systemPrompt,Y.appendSystemPrompt,T,Y.maxTurns,L,P),{getPreviousCommand:l,getNextCommand:a,addToHistory:I}=Y6();A6();let y=G6("",0),v=t0(async()=>{let r=C,K0;if(r==="default")K0="autoEdit";else if(r==="autoEdit")K0="plan";else if(r==="plan")K0="default";else K0="default";try{await P0.setSessionPermissionMode(w,_,K0),await m0().setPermissionMode(K0)}catch(k0){U1.error("权限模式切换失败:",k0 instanceof Error?k0.message:k0)}}),b=t0(async(r)=>{try{let K0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await m0().addModelWithProvider(K0,r.modelProvider);else await m0().addModel(K0);H.setInitializationStatus("ready")}catch(K0){throw U1.error("初始化配置保存失败:",K0 instanceof Error?K0.message:K0),K0}}),V=t0(()=>{if(U==="shortcuts")H.closeModal();else H.setActiveModal("shortcuts")}),p=t0(async(r,K0,k0)=>{return m8({intent:K0,session:r,newSessionId:k0?.newSessionId,announceFork:k0?.announceFork,permissionModeOverride:Y.permissionMode},_,z,o)}),j=t0(async(r,K0)=>{let j1=(await g8(K0,_)).filter((g0)=>g0.sessionId===r);if(j1.length===0)throw Error(`Session not found: ${r}`);if(j1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return j1[0]}),{showSuggestions:h,suggestions:E,selectedSuggestionIndex:Z0}=b6(y,k,l,a,I,g,N,v,V,U==="shortcuts");_$(()=>{if(y.value&&U==="shortcuts")H.closeModal()},[y.value,U,H]);let J0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",K0=await g8(r,_);if(K0.length===0){if(Y.forkSession){U1.error("没有可供 fork 的历史会话"),f1(1);return}z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let k0=K0[0];await p(k0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(U1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){f1(1);return}z.addAssistantMessage("继续会话失败,开始新对话。")}}),w0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let k0=Y.forkSession?"fork":"resume",$8=await j(Y.resume,k0);await p($8,k0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",K0=await g8(r,_);if(K0.length===0)U1.error("没有找到历史会话"),f1(1);H.showSessionSelector(K0,r)}catch(r){U1.error("[BladeInterface] 加载会话失败:",r),f1(1)}});_$(()=>{if(J.current)return;if(Q){J.current=!0,J0();return}if(Y.resume)J.current=!0,w0()},[Q,Y.resume,J0,w0]);let f0=t0(async(r)=>{let K0=A.details?.type;if(K0==="enterPlanMode"&&r.approved)try{await P0.setSessionPermissionMode(w,_,"plan"),await m0().setPermissionMode("plan"),U1.debug("[BladeInterface] Entered Plan mode")}catch(k0){U1.error("[BladeInterface] Failed to enter Plan mode:",k0)}if(K0==="exitPlanMode"&&r.approved)U1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");M(r)}),c0=t0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),f1(0)}),h0=t0(()=>{H.closeModal()}),H1=t0(async(r)=>{try{await p(r,W?.intent??"resume"),H.closeModal()}catch(K0){U1.error("[BladeInterface] Failed to restore session:",K0),z.addAssistantMessage(`会话操作失败: ${K0 instanceof Error?K0.message:"未知错误"}`),H.closeModal()}}),I1=t0(()=>{if(Y.resume)f1(0);else H.closeModal()}),T$=t0((r)=>{H.showModelEditWizard(r)}),s0=t0((r)=>{z.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),h0()}),V2=t0((r)=>{z.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),h0()});_$(()=>{if(B){F.setFocus("model-config-wizard");return}if(A.isVisible)F.setFocus("confirmation-prompt");else if(U==="sessionSelector")F.setFocus("session-selector");else if(U==="themeSelector")F.setFocus("theme-selector");else if(U==="modelSelector")F.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")F.setFocus("model-config-wizard");else if(U==="permissionsManager")F.setFocus("permissions-manager");else if(U==="agentsManager")F.setFocus("agents-manager");else if(U==="agentCreationWizard")F.setFocus("agent-creation-wizard");else if(U==="hooksManager")F.setFocus("hooks-manager");else if(U==="shortcuts")F.setFocus("main-input");else F.setFocus("main-input")},[B,A.isVisible,U,F.setFocus]),_$(()=>{if(!R||X.current)return;if(tJ().length>0){X.current=!0;return}X.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[R]),_$(()=>{if(!G)return;if(K.current===G)return;if(K.current=G,q==="error")z.addAssistantMessage(`初始化失败: ${G}`);else z.addAssistantMessage(`${G}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[G,q,z.addAssistantMessage]);let V1=t0(async(r)=>{try{await k({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(K0){let k0=K0 instanceof Error?K0.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${k0}`)}});_$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!R||B)return;Z.current=!0,I(r),V1(r)},[Y.initialMessage,R,B,k,I]);let j2=t0(async(r)=>{try{await m0().setPermissionMode(r)}catch(K0){U1.error("权限模式初始化失败:",K0 instanceof Error?K0.message:K0)}});if(_$(()=>{let r=Y.permissionMode;if($)U1.debug("[Debug] permissionMode from CLI:",r),U1.debug("[Debug] current permissionMode:",C);if(!r||r===C)return;j2(r)},[Y.permissionMode,C]),f)return null;if(B)return M0(aQ,{mode:"setup",onComplete:b,onCancel:c0},void 0,!1,void 0,this);if($)U1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:A.isVisible,activeModal:U});let q0=U==="modelSelector",y0=O,Q0=U==="modelAddWizard"?"add":U==="modelEditWizard"&&y0?"edit":null,_0=q0||Boolean(Q0),x0=U==="agentsManager",K1=U==="agentCreationWizard",u0=U==="skillsManager",O1=U==="pluginsManager",e$=y0?{displayName:y0.displayName,provider:y0.provider,model:y0.model,overrides:y0.overrides}:void 0,o1=A.isVisible&&A.details?A.details.type==="mcpElicitation"&&A.details.mcpElicitation?M0(l9,{details:A.details.mcpElicitation,onComplete:(r,K0)=>f0({approved:r.action==="accept",elicitation:r,...K0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):A.details.type==="askUserQuestion"&&A.details.questions?M0(VJ,{questions:A.details.questions,onComplete:(r)=>f0({approved:!0,answers:r}),onCancel:()=>f0({approved:!1})},void 0,!1,void 0,this):M0(N9,{details:A.details,onResponse:f0},void 0,!1,void 0,this):U==="themeSelector"?M0(nJ,{},void 0,!1,void 0,this):U==="permissionsManager"?M0(MJ,{onClose:h0},void 0,!1,void 0,this):U==="sessionSelector"?M0(cJ,{intent:W?.intent??"resume",sessions:W?.sessions,onSelect:H1,onCancel:I1},void 0,!1,void 0,this):U==="hooksManager"?M0(H9,{workspaceRoot:_,sessionId:w,onClose:h0},void 0,!1,void 0,this):null,b8=Boolean(o1);return M0(z$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[o1,M0(z$,{flexDirection:"column",display:b8?"none":"flex",children:[M0(ZJ,{},void 0,!1,void 0,this),M0(aJ,{},void 0,!1,void 0,this),M0(p9,{paused:b8},void 0,!1,void 0,this),M0(V9,{input:y.value,cursorPosition:y.cursorPosition,onChange:y.setValue,onChangeCursorPosition:y.setCursorPosition,onAddPasteMapping:y.addPasteMapping,onAddImagePasteMapping:y.addImagePasteMapping},void 0,!1,void 0,this),q0&&M0(z$,{marginTop:1,paddingX:2,children:M0(XJ,{onClose:h0,onEdit:T$},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0&&M0(z$,{marginTop:1,paddingX:2,children:M0(aQ,{mode:Q0,modelId:y0?.id,initialConfig:Q0==="edit"?e$:void 0,onComplete:Q0==="edit"?V2:s0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),x0&&M0(z$,{marginTop:1,paddingX:2,children:M0(I6,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),K1&&M0(z$,{marginTop:1,paddingX:2,children:M0(U8,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),u0&&M0(z$,{marginTop:1,paddingX:2,children:M0(uJ,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),O1&&M0(z$,{marginTop:1,paddingX:2,children:M0(vJ,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(V6,{suggestions:E,selectedIndex:Z0,visible:h&&!_0},void 0,!1,void 0,this),M0(D6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as oX,Text as N$}from"ink";import nX from"react";import{jsxDEV as a1}from"react/jsx-dev-runtime";class w8 extends nX.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 a1(oX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[a1(N$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),a1(N$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as I$,Text as i1,useInput as tX}from"ink";import{useState as sQ}from"react";import{jsxDEV as X1}from"react/jsx-dev-runtime";var k2=[{key:"update",label:"Update now",description:`runs \`${QY()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],YY=({versionInfo:$,onComplete:Q})=>{let[Y,J]=sQ(0),[Z,X]=sQ(!1),[K,q]=sQ(null);tX((U,W)=>{if(W.ctrl&&U==="c"){G8().shutdown("SIGINT",0);return}if(Z||K)return;if(W.upArrow||U==="k")J((O)=>O>0?O-1:k2.length-1);else if(W.downArrow||U==="j")J((O)=>O<k2.length-1?O+1:0);else if(W.return)G(k2[Y].key);else if(U==="1")G("update");else if(U==="2")G("skip");else if(U==="3")G("skip_until_next")});let G=async(U)=>{switch(U){case"update":{X(!0);let W=await JY();q(W.message),setTimeout(()=>{G8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await $Y($.latestVersion);Q();break}};if(K)return X1(I$,{flexDirection:"column",marginY:1,children:X1(i1,{children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return X1(I$,{flexDirection:"column",marginY:1,children:X1(i1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X1(I$,{flexDirection:"column",marginY:1,children:[X1(i1,{color:"yellow",bold:!0,children:["Update available! ",X1(i1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X1(I$,{marginTop:1,children:X1(i1,{color:"gray",children:["Release notes:"," ",X1(i1,{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(I$,{flexDirection:"column",marginTop:1,children:k2.map((U,W)=>{let O=W===Y,H=O?"› ":" ",z=`${W+1}. `;return X1(I$,{children:X1(i1,{color:O?"cyan":void 0,children:[H,z,U.label,U.description&&X1(i1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),X1(I$,{marginTop:1,children:X1(i1,{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 S2,Text as t$,useInput as sX}from"ink";import{useState as ZY}from"react";import{jsxDEV as D1}from"react/jsx-dev-runtime";var XY=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=r0.getTheme(),[Z,X]=ZY(!1),[K,q]=ZY(null);return sX((G,U)=>{if(Z)return;if(U.return||G.toLowerCase()==="t"){X(!0),q(null),Q().catch((W)=>{q(W instanceof Error?W.message:"Failed to trust workspace"),X(!1)});return}if(G.toLowerCase()==="s"||U.escape)X(!0),q(null),Y().catch((W)=>{q(W instanceof Error?W.message:"Failed to continue safely"),X(!1)})}),D1(S2,{flexDirection:"column",paddingX:1,children:[D1(t$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),D1(t$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),D1(S2,{marginTop:1,flexDirection:"column",children:[D1(t$,{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)=>D1(t$,{children:[" ",G.path," · ",G.effects.length," effect(s)"]},`${G.kind}:${G.path}`,!0,void 0,this))]},void 0,!0,void 0,this),K&&D1(S2,{marginTop:1,children:D1(t$,{color:J.colors.error,children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),D1(S2,{marginTop:1,children:D1(t$,{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 eX}from"ink";import{useEffect as $7}from"react";function KY(){let{stdout:$}=eX();$7(()=>{if(!$.isTTY)return;return $.write(B9),$.write(TQ),()=>{$.write(w9),$.write(TQ)}},[$])}function GY($){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 s$}from"react/jsx-dev-runtime";function J7($){if($1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");a0().setInitializationStatus("ready")}var RH=($)=>{KY();let[Q,Y]=D2(!1),[J,Z]=D2(null),[X,K]=D2(!1),[q,G]=D2(null),U=v2((z,w)=>{let _=z instanceof Error?z.message:String(z);if(a0().setInitializationError(_),a0().setInitializationStatus("error"),Y(!0),w)console.error("[FAIL] 应用初始化失败:",_)}),W=v2(async()=>{try{let z=$1().config.config??UY,w=OY(z,$);if(J7(w),w.resumeSessionId)zY().restoreSession(w.resumeSessionId,[]);if(w.debug)console.error("[Debug] 运行时配置:",w);let _=w.codeTheme;if(_&&r0.hasTheme(_)){if(r0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{z1.getInstance().loadConfig(w.hooks||{},l0());let C=await _Y(l0());if($.debug&&w.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${C.subagents.getAllNames().length} agents, ${C.skills.size} skills, ${C.commands.getCommandCount()+C.commands.getPluginCommandCount()} commands, ${C.plugins.getAll().length} plugins`);let S=$1().session.sessionId;qY(S)}catch(F){if($.debug)console.warn("Hooks 初始化失败:",GY(F))}x8(async()=>{await FY.getInstance().killAll(),await NY.getInstance().disconnectAll(),z1.getInstance().cleanup()}),Y(!0)}catch(z){U(z,!!$.debug)}}),O=v2(async()=>{let z=await eQ.getInstance().getStatus(l0());if(z.state==="untrusted"||z.state==="error"){G(z);return}await W()}),H=v2(async()=>{if($.versionCheckPromise){let z=await $.versionCheckPromise;if(z){Z(z),K(!0);return}}await O()});if(Q7(()=>{H()},[]),X&&J)return s$(w8,{children:s$(YY,{versionInfo:J,onComplete:()=>{K(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(q)return s$(w8,{children:s$(XY,{status:q,onTrust:async()=>{await eQ.getInstance().trust(l0()),await HY(),G(null),await W()},onContinueSafely:async()=>{G(null),await W()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return s$(w8,{children:s$(eJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{RH as AppWrapper};