blade-code 0.10.2 → 0.10.4

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 (108) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-8nm1hqr1.js → chunk-0n97186m.js} +2 -2
  3. package/dist/{chunk-t8q9ks7e.js → chunk-15d49qty.js} +1 -1
  4. package/dist/{chunk-tm2ckreq.js → chunk-1ndryz4h.js} +20 -20
  5. package/dist/{chunk-d9ddpapp.js → chunk-35yktzm1.js} +1 -1
  6. package/dist/chunk-4ncbd4k0.js +1 -0
  7. package/dist/{chunk-qhf0knnx.js → chunk-5t0vs4hz.js} +1 -1
  8. package/dist/{chunk-zkbf8n6y.js → chunk-5twefby5.js} +1 -1
  9. package/dist/{chunk-ct32ngah.js → chunk-5ze48kg7.js} +8 -8
  10. package/dist/{chunk-sndbq5xt.js → chunk-63ysxybd.js} +1 -1
  11. package/dist/{chunk-nah0cbnp.js → chunk-6tx8k249.js} +2 -2
  12. package/dist/chunk-7443b95r.js +1 -0
  13. package/dist/chunk-79s052sw.js +2 -0
  14. package/dist/{chunk-e2ccyhgz.js → chunk-90fnvvcf.js} +1 -1
  15. package/dist/{chunk-6n5xdf2r.js → chunk-948qe2pp.js} +1 -1
  16. package/dist/{chunk-mjp61rqd.js → chunk-9ffr01c3.js} +1 -1
  17. package/dist/chunk-9kwt0w46.js +180 -0
  18. package/dist/chunk-a7a74pza.js +1484 -0
  19. package/dist/{chunk-5tfzehcg.js → chunk-age5tc86.js} +3 -3
  20. package/dist/{chunk-44wkjs2j.js → chunk-an96c54z.js} +2 -2
  21. package/dist/{chunk-m9zpxzg2.js → chunk-b9v7waxf.js} +2 -2
  22. package/dist/{chunk-2beq0syt.js → chunk-bexgcc2d.js} +1 -1
  23. package/dist/chunk-ccwskwb3.js +1 -0
  24. package/dist/{chunk-bpzv054r.js → chunk-csr5vppa.js} +8 -8
  25. package/dist/chunk-d4zw0xxe.js +1 -0
  26. package/dist/chunk-d5a66cgn.js +160 -0
  27. package/dist/chunk-d7xb0vp1.js +1 -0
  28. package/dist/{chunk-af49jmns.js → chunk-dqvcgwhe.js} +2 -2
  29. package/dist/{chunk-kq5my0yy.js → chunk-drrdzmaa.js} +2 -2
  30. package/dist/{chunk-px5ck9pf.js → chunk-ea7wsges.js} +2 -2
  31. package/dist/{chunk-vjpd3nee.js → chunk-epj56s0n.js} +1 -1
  32. package/dist/chunk-f647z66n.js +1 -0
  33. package/dist/{chunk-2km4w0ky.js → chunk-ffp3ypbb.js} +2 -2
  34. package/dist/{chunk-0h81hxkw.js → chunk-fvhc1yj8.js} +1 -1
  35. package/dist/{chunk-k9a1vb8a.js → chunk-fx87s3mb.js} +2 -2
  36. package/dist/chunk-g6h6h8xr.js +1 -0
  37. package/dist/{chunk-d3236505.js → chunk-gb54hc78.js} +1 -1
  38. package/dist/{chunk-fjw32ex5.js → chunk-gxmrakrk.js} +1 -1
  39. package/dist/{chunk-a7nbn5kf.js → chunk-gxzbv67r.js} +2 -2
  40. package/dist/chunk-jbnrscvz.js +1 -0
  41. package/dist/{chunk-88vy9hh0.js → chunk-jza1rsan.js} +1 -1
  42. package/dist/chunk-kkd7mm55.js +1 -0
  43. package/dist/{chunk-ws3gc024.js → chunk-mxqpg4gy.js} +1 -1
  44. package/dist/chunk-n2s54h1r.js +1 -0
  45. package/dist/{chunk-k89phc5j.js → chunk-nr53mq0k.js} +2 -2
  46. package/dist/chunk-pehpndk9.js +1 -0
  47. package/dist/{chunk-jxv6r0c7.js → chunk-qda309d9.js} +2 -2
  48. package/dist/{chunk-beqaxytd.js → chunk-qm11hjd3.js} +1 -1
  49. package/dist/{chunk-y0hwzmdn.js → chunk-rv80ak15.js} +1 -1
  50. package/dist/{chunk-8mepk4tc.js → chunk-scq3ns6v.js} +2 -2
  51. package/dist/chunk-t8x2qpe2.js +1 -0
  52. package/dist/{chunk-4vaywb2r.js → chunk-tq52pbde.js} +1 -1
  53. package/dist/chunk-tx8f345j.js +1 -0
  54. package/dist/chunk-v8kp3ep9.js +6 -0
  55. package/dist/{chunk-vvy506b3.js → chunk-v93hcxe7.js} +1 -1
  56. package/dist/{chunk-rkzds6k8.js → chunk-ve9cke2g.js} +2 -2
  57. package/dist/{chunk-6sc78810.js → chunk-vxymgh8e.js} +5 -5
  58. package/dist/chunk-wdbmbk6h.js +10 -0
  59. package/dist/{chunk-gr5mzxdf.js → chunk-xkzy5wbm.js} +1 -1
  60. package/dist/{chunk-m5tjrr5c.js → chunk-xq8vf15n.js} +2 -2
  61. package/dist/{chunk-th7sxjtk.js → chunk-ydtcvxsm.js} +1 -1
  62. package/dist/{chunk-wvj9h7mb.js → chunk-ygx03mdh.js} +1 -1
  63. package/dist/chunk-ys8bp9jm.js +1 -0
  64. package/dist/{chunk-6hj2dk75.js → chunk-z906d5tb.js} +2 -2
  65. package/dist/chunk-zswrw5f9.js +3 -0
  66. package/dist/chunk-zyz82mcd.js +1 -0
  67. package/dist/web/assets/{ChatView-CnwNosSG.js → ChatView-iK7ff8qU.js} +5 -5
  68. package/dist/web/assets/{CodeBlockHighlighter-CBo_AxjZ.js → CodeBlockHighlighter-BoJp_Xb0.js} +1 -1
  69. package/dist/web/assets/{FilePreview-hNo6RCNY.js → FilePreview-Bi1HWOvY.js} +2 -2
  70. package/dist/web/assets/{MarkdownRenderer-BON4fqSr.js → MarkdownRenderer-DMW1pg5N.js} +3 -3
  71. package/dist/web/assets/McpModal-CHUqitJ6.js +5 -0
  72. package/dist/web/assets/SettingsModal-zsS9O6SW.js +1 -0
  73. package/dist/web/assets/SkillsModal-C2oTDXoy.js +1 -0
  74. package/dist/web/assets/{TaskSwitcher-Ds8CBVtp.js → TaskSwitcher-CncVasNA.js} +1 -1
  75. package/dist/web/assets/{TerminalPanel-Dm4bu6ib.js → TerminalPanel-CBi2mUxx.js} +1 -1
  76. package/dist/web/assets/index-B7etZcne.css +1 -0
  77. package/dist/web/assets/index-DvDtvgA4.js +32 -0
  78. package/dist/web/assets/useRequest-BvqVDnKl.js +1 -0
  79. package/dist/web/assets/{vendor-icons-CsBKlDXT.js → vendor-icons-D_AkWmWB.js} +70 -60
  80. package/dist/web/assets/{vendor-radix-DXRuAJHH.js → vendor-radix-DBy9B2DN.js} +1 -1
  81. package/dist/web/index.html +4 -4
  82. package/package.json +1 -1
  83. package/dist/chunk-0h9m2fqd.js +0 -160
  84. package/dist/chunk-1wyfb6s7.js +0 -1
  85. package/dist/chunk-3vyjshqp.js +0 -1
  86. package/dist/chunk-6g21dh3n.js +0 -1
  87. package/dist/chunk-asbp4cv4.js +0 -1
  88. package/dist/chunk-bqk3wqts.js +0 -1
  89. package/dist/chunk-cjdnfyy0.js +0 -1485
  90. package/dist/chunk-d8zj7c0t.js +0 -6
  91. package/dist/chunk-gafbzeyk.js +0 -1
  92. package/dist/chunk-jv4nkkb5.js +0 -1
  93. package/dist/chunk-m3tx1k0s.js +0 -1
  94. package/dist/chunk-m78ceafk.js +0 -1
  95. package/dist/chunk-nqq4sbmv.js +0 -1
  96. package/dist/chunk-p7ppnewt.js +0 -3
  97. package/dist/chunk-qev36qrb.js +0 -2
  98. package/dist/chunk-tckfyfsx.js +0 -1
  99. package/dist/chunk-xhpezpjq.js +0 -10
  100. package/dist/chunk-y5vq7gek.js +0 -174
  101. package/dist/chunk-ydqeg4p8.js +0 -1
  102. package/dist/chunk-yknrffcs.js +0 -1
  103. package/dist/chunk-ymmtbq2b.js +0 -1
  104. package/dist/chunk-z2yzyr9h.js +0 -1
  105. package/dist/web/assets/McpModal-Go_8v1Vu.js +0 -5
  106. package/dist/web/assets/SettingsModal-CRu1zGQf.js +0 -1
  107. package/dist/web/assets/index-BNsnHxlt.js +0 -32
  108. package/dist/web/assets/index-DVTiq-7u.css +0 -1
@@ -1,160 +0,0 @@
1
- import{e as l9,f as d9}from"./chunk-wvj9h7mb.js";import{i as DJ,j as VJ,k as jJ}from"./chunk-th7sxjtk.js";import{$ as $6,E as O$,F as w4,G as b4,J as t$,K as UJ,L as GJ,O as KJ,P as qJ,U as O6,V as z6,W as oJ,X as v4,Z as k4,r as e4,u as o2,v as u2,w as l4,x as aJ}from"./chunk-cjdnfyy0.js";import{da as B9,ea as w9,fa as b9,ia as rJ}from"./chunk-ws3gc024.js";import{qa as j4}from"./chunk-y5vq7gek.js";import{La as $8}from"./chunk-88vy9hh0.js";import{$a as y4,Za as R4,_a as m2,db as n$,gb as E0}from"./chunk-8mepk4tc.js";import"./chunk-44wkjs2j.js";import{Eb as SJ}from"./chunk-nah0cbnp.js";import{Fb as Q8,Gb as g8,Ib as I1}from"./chunk-5tfzehcg.js";import"./chunk-kq5my0yy.js";import{$b as L2,Mb as R$,Nb as d0,Ob as n1,Pb as bQ,Qb as T$,Rb as f8,Sb as p6,Tb as mQ,Ub as E9,Vb as c6,Wb as I$,Xb as Y1,Yb as lJ,Zb as r0,_b as kJ,ac as s$,dc as C4,kc as u0}from"./chunk-m9zpxzg2.js";import"./chunk-gafbzeyk.js";import"./chunk-0h81hxkw.js";import"./chunk-af49jmns.js";import{uc as pQ}from"./chunk-px5ck9pf.js";import"./chunk-fjw32ex5.js";import"./chunk-k9a1vb8a.js";import{Ac as G6,Dc as bJ,Jc as XJ,Pc as dJ}from"./chunk-tm2ckreq.js";import"./chunk-d9ddpapp.js";import"./chunk-sndbq5xt.js";import{Yc as RQ,_c as F1}from"./chunk-6sc78810.js";import"./chunk-beqaxytd.js";import{ad as cJ,dd as o1}from"./chunk-jxv6r0c7.js";import{Hd as xJ,Sd as uJ}from"./chunk-bpzv054r.js";import"./chunk-4vaywb2r.js";import{be as v$,ce as D8,de as yQ}from"./chunk-qev36qrb.js";import{he as A0}from"./chunk-vjpd3nee.js";import{ie as c9,je as x9,me as f1}from"./chunk-a7nbn5kf.js";import"./chunk-2beq0syt.js";import{ye as v9}from"./chunk-k89phc5j.js";import{ze as aQ}from"./chunk-6hj2dk75.js";import"./chunk-6n5xdf2r.js";import"./chunk-8nm1hqr1.js";import{Le as PQ}from"./chunk-mjp61rqd.js";import{useMemoizedFn as C2}from"ahooks";import{useEffect as yX,useState as T2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as U$}from"ink";import{useEffect as G$,useMemo as LX,useRef as y2}from"react";import{useShallow as nJ}from"zustand/react/shallow";import{useStore as iJ}from"zustand";function $0($){return iJ(I$,$)}var tJ=[],b8=()=>$0(($)=>$.session.sessionId),M1=()=>$0(($)=>$.session.workspaceRoot),oQ=()=>$0(($)=>$.session.messages),iQ=()=>$0(($)=>$.session.clearCount),nQ=()=>$0(($)=>$.session.isCompacting),tQ=()=>$0(($)=>$.session.tokenUsage.estimatedCostUsd),d1=()=>$0(($)=>$.session.actions),sQ=()=>$0(($)=>{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)}),eQ=()=>$0(($)=>$.app.initializationStatus),$4=()=>$0(($)=>$.app.initializationError),A8=()=>$0(($)=>$.app.activeModal),Q4=()=>$0(($)=>$.app.tasks),J4=()=>$0(($)=>$.app.modelEditorTarget),Y4=()=>$0(($)=>$.app.sessionSelectorData),Z4=()=>$0(($)=>$.app.awaitingSecondCtrlC),r1=()=>$0(($)=>$.app.actions),P8=()=>$0(($)=>$.app.initializationStatus==="ready"),X4=()=>$0(($)=>$.app.tasks.length>0),C$=()=>$0(($)=>$.config.config?.permissionMode||"default"),U4=()=>$0(($)=>$.config.config?.models??tJ),R8=()=>$0(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),y8=()=>$0(($)=>$.config.config?.currentModelId),b0=()=>$0(($)=>{return d0.getTheme()}),G4=()=>$0(($)=>$.config.config?.theme??"default"),s0=()=>$0(($)=>$.focus.currentFocus),K4=()=>$0(($)=>$.focus.actions),a1=()=>$0(($)=>$.command.isProcessing),q4=()=>$0(($)=>$.command.actions),M8=()=>$0(($)=>$.command.pendingCommands),O4=()=>$0(($)=>$.command.recoveredSteeringCount),I8=()=>$0(($)=>$.app.thinkingModeEnabled),C8=()=>$0(($)=>$.app.reasoningEffort),T8=()=>$0(($)=>$.app.serviceTier),v8=()=>$0(($)=>$.app.responseVerbosity),k8=()=>$0(($)=>$.app.communicationStyle),z4=()=>$0(($)=>$.session.currentThinkingContent),_4=()=>$0(($)=>$.session.thinkingExpanded),N4=()=>$0(($)=>$.session.currentStreamingMessageId),F4=()=>$0(nJ(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),H4=()=>$0(($)=>$.session.finalizingStreamingMessageId),W4=()=>$0(($)=>$.session.historyExpanded),L4=()=>$0(($)=>$.session.expandedMessageCount);import{useMemoizedFn as S$}from"ahooks";import{useEffect as h2,useRef as V4}from"react";function sJ($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let U=JSON.parse(J.responseBody)?.error?.message;if(U){let G=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${U}${G}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function eJ($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function $Y($){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 S8($){let Q=eJ($),Y=$Y($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=sJ($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as QY,mkdirSync as JY,writeFileSync as YY}from"node:fs";import ZY from"node:os";import f2 from"node:path";var B4=null;function XY(){let $=process.env.BLADE_STORAGE_ROOT||f2.join(ZY.homedir(),".blade");return f2.join($,"logs","stream-debug.log")}function UY($){if(B4===$)return;let Q=f2.dirname($);JY(Q,{recursive:!0,mode:493}),YY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
- `),B4=$}function D2($,Q,Y){try{let J=XY();UY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",U=`[${Z}] [${$}] ${Q}${X}
3
- `;QY(J,U)}catch{}}var i$=o1("UI");function A4($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,D2("loopEventHandler","onContentDelta",{callCount:Q.contentDeltaCount,deltaLen:J.delta.length,totalLen:Q.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(J.delta);break;case"thinking_delta":if(Y||$.signal.aborted)break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(J.delta);break;case"stream_end":{if(i$.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),D2("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),Y||$.signal.aborted){Y=!0;break}let{extraContent:Z,extraThinking:X}=$.streamingBuffer.drainPendingBuffers(),U=$.getStreamingMessageId();if(U){if(Z)T$(U,Z);f8(U)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(i$.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:J.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let X=JSON.parse(Z.function.arguments),U=w4(Z.function.name,X);$.sessionActions.addToolMessage(U,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:U,params:X})}catch(X){i$.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",U=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(U,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:U});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;i$.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=b4(Z.function.name,J.result);$.sessionActions.addToolMessage(X.summary,{toolCallId:Z.id,toolName:Z.function.name,phase:"complete",summary:X.summary,detail:X.detail});break}case"token_usage":$.sessionActions.updateTokenUsage(J.usage);break;case"compaction":if($.sessionActions.setCompacting(J.phase==="start"),J.phase==="end")$.sessionActions.resetContextUsage();break;case"turn_start":i$.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
4
- `)});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((U)=>U.type==="text"?U.text:"[Image]").join(`
11
- `);$.sessionActions.addUserMessage(X)}if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=J}}}}function j2($){let{text:Q,parts:Y}=$,J=Y.filter((U)=>U.type==="image");if(J.length===0)return Q;if(J.length>v$)throw Error(`最多只能发送 ${v$} 张图片`);if(J.reduce((U,G)=>U+`data:${G.mimeType};base64,`.length+G.base64.length,0)>D8)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let U of Y)if(U.type==="text")X.push({type:"text",text:U.text});else X.push({type:"image_url",image_url:{url:`data:${U.mimeType};base64,${U.base64}`}});return X}function P4($){let Q=y4($.metadata);return{role:$.role,content:Q?R4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function V8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(P4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(P4);return[...$.restoredContextMessages,...Q]}import GY from"node:path";function M4($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function KY($){return GY.resolve($)}function I4($){if(!$||!C4($))return;Y1().config.actions.updateConfig({currentModelId:$})}async function j8($,Q){return E0.listSessions({includeSubagents:!1})}async function E8($,Q,Y,J){let{intent:Z,session:X,newSessionId:U,announceFork:G}=$,K=KY(X.projectPath);if(Z==="fork"){let O=await E0.forkSession(X.sessionId,{...U?{newSessionId:U}:{},sourceProjectPath:K,targetProjectPath:K}),F=[...E0.toUISafeMessages(O.messages)];if(G!==!1){let N=Date.parse(O.metadata.lastMessageTime);F.push({id:"fork-announcement-"+O.sessionId,role:"assistant",content:"Forked "+M4(X.sessionId)+" → "+M4(O.sessionId),timestamp:Number.isNaN(N)?0:N})}return await J(),I4(O.metadata.selectedModelId),Y.restoreSession(O.sessionId,F,O.messages,O.metadata.projectPath),{sessionId:O.sessionId,messages:O.messages}}await E0.assertSessionWritable(X.sessionId,X.projectPath);let q=await E0.loadSession(X.sessionId,X.projectPath),W=E0.toUISafeMessages(q);return await J(),I4(X.selectedModelId),Y.restoreSession(X.sessionId,W,q,X.projectPath),{sessionId:X.sessionId,messages:q}}function T4($){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 qY($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function OY($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function zY($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function _Y($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function NY($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function FY($){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)=>T4(Z))}if(Y==="activate_session")return T4($.session);return!1}function WY($,Q,Y,J){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=Q?.sessions;return Y.showSessionSelector(Z??[],"resume"),!0}case"session_forked":{let Z=Q;if(Z?.action!=="restore_forked_session"||!Z.sessionId||!Array.isArray(Z.messages)||!Array.isArray(Z.visibleMessages))return!1;return J.restoreSession(Z.sessionId,Z.visibleMessages,Z.messages),!0}case"session_archived":{let Z=Q?.session;return J.addAssistantMessage(Z?`会话 ${Z.sessionId} 已归档。`:"当前会话已归档。"),I1(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 I1(0),!0;default:return!1}}async function E2($,Q,Y,J,Z,X,U,G,K,q,W,O,F,N,B=A0()){let{text:_}=$;if(!v4(_))return{type:"not_slash"};let b=await k4(_,{cwd:B,surface:"tui",workspaceRoot:B,sessionId:X,messages:U,rewind:G,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),E0.archiveSession(X,B)}},subagents:K,mcp:q,reasoning:W,serviceTier:O,responseVerbosity:F,communicationStyle:N,signal:J});if(b.success&&HY(b.data)){if(b.data.action==="select_session")return Q.showSessionSelector(b.data.sessions,b.data.intent),{type:"handled",commandResult:{success:!0}};return await E8(b.data,B,Y,Z),{type:"handled",commandResult:{success:!0}}}if(b.success&&FY(b.data))return Y.restoreSession(b.data.sessionId,b.data.visibleMessages,b.data.messages),Q.setTasks([]),{type:"handled",commandResult:{success:!0}};if(b.message){if(WY(b.message,b.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(qY(b.data)){let{skillName:v,skillArgs:M}=b.data,z=M?`Please use the "${v}" skill to help me with: ${M}`:`Please use the "${v}" skill.`;return Y.addUserMessage(z),{type:"continue_as_agent",result:{userDisplayMessage:z,agentInput:{displayText:z,text:z,images:[],parts:[{type:"text",text:z}]},userMessageAlreadyAdded:!0}}}if(OY(b.data)){let{commandName:v,processedContent:M}=b.data;Y.addUserMessage(_);let z=`# Custom Command: /${v}
12
-
13
- The user has invoked the custom command "/${v}". Follow the instructions below to complete the task.
14
-
15
- ---
16
-
17
- ${M}
18
-
19
- ---
20
-
21
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:_,agentInput:{displayText:_,text:z,images:[],parts:[{type:"text",text:z}]},userMessageAlreadyAdded:!0}}}if(zY(b.data)){let{commandName:v,pluginName:M,processedContent:z}=b.data;Y.addUserMessage(_);let P=`# Plugin Command: /${v}
22
-
23
- The user has invoked the plugin command "/${v}" from plugin "${M}". Follow the instructions below to complete the task.
24
-
25
- ---
26
-
27
- ${z}
28
-
29
- ---
30
-
31
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:_,agentInput:{displayText:_,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(_Y(b.data)){let{modelId:v,prompt:M}=b.data;return Y.addUserMessage(M),{type:"continue_as_agent",result:{userDisplayMessage:M,agentInput:{displayText:M,text:M,images:[],parts:[{type:"text",text:M}]},userMessageAlreadyAdded:!0,onceModelId:v}}}if(NY(b.data)){let v=b.data.goal.objective;return Y.addUserMessage(_),{type:"continue_as_agent",result:{userDisplayMessage:_,agentInput:{displayText:_,text:v,images:[],parts:[{type:"text",text:v}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!b.success&&b.error)return Y.addAssistantMessage(`${b.error}`),{type:"handled",commandResult:{success:b.success,output:b.message,error:b.error,metadata:b.data}};let A=b.message;if(b.success&&typeof A==="string"&&A.trim()!=="")Y.addAssistantMessage(A);return{type:"handled",commandResult:{success:b.success,output:b.message,error:b.error,metadata:b.data}}}import{useMemoizedFn as y0}from"ahooks";import{useEffect as LY,useRef as h8}from"react";function S4($){let Q=h8(void 0),Y=h8(void 0),J=h8(void 0),Z=h8(void 0),X=y0(async()=>{if(Z.current)return Z.current;let T=Q.current,L=Y.current;if(!T&&!L)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let I=(async()=>{try{await T?.destroy()}finally{await L?.dispose()}})();Z.current=I;try{await I}finally{if(Z.current===I)Z.current=void 0}}),U=y0(async(T)=>{let L=$.workspaceRoot??Y.current?.workspaceRoot??A0();if(Y.current&&(Y.current.sessionId!==T||Y.current.workspaceRoot!==L))await X();if(!Y.current){let I=await E0.findSessionMetadata(T,L),V=I!==void 0&&(await E0.loadSession(T,L)).length>0;Y.current=await O$.create({sessionId:T,workspaceRoot:L,modelId:$.modelId,reasoningEffort:I?.reasoningEffort??$.reasoningEffort,serviceTier:I?.serviceTier??$.serviceTier,responseVerbosity:I?.responseVerbosity??$.responseVerbosity,communicationStyle:I?.communicationStyle??$.communicationStyle,communicationStyleDigest:I?.communicationStyleDigest,agents:$.agents,...V?{sessionStart:{isResume:!0,resumeSessionId:T}}:{}});try{J.current={sessionId:T,modelId:I?.selectedModelId,reasoningEffort:I?.reasoningEffort,serviceTier:I?.serviceTier,responseVerbosity:I?.responseVerbosity,communicationStyle:I?.communicationStyle,communicationStyleDigest:I?.communicationStyleDigest},r0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),r0().setServiceTier(Y.current.getServiceTierConfiguration().selection),r0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),r0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(k){let u=Y.current;throw Y.current=void 0,await u.dispose().catch(()=>{return}),k}}return Y.current}),G=y0(async(T)=>{let L=T?.sessionId??$.sessionId,I=!!T?.modelId&&T.modelId!==$.modelId,V;if(!I&&L){let k=Y.current!==void 0,u=await U(L),j=T?.modelId??$.modelId,m=T?.reasoningEffort??(k?$.reasoningEffort:u.getReasoningConfiguration().selection),f=T?.serviceTier??(k?$.serviceTier:u.getServiceTierConfiguration().selection),n=T?.responseVerbosity??(k?$.responseVerbosity:u.getResponseVerbosityConfiguration().selection),_0=T?.communicationStyle??(k?$.communicationStyle:u.getCommunicationStyleConfiguration().selection),N0=u.getCurrentModelId(),m0=u.getReasoningConfiguration(),D0=u.getServiceTierConfiguration(),w0=u.getResponseVerbosityConfiguration(),_1=u.getCommunicationStyleConfiguration();await u.refresh({modelId:j,...m?{reasoningEffort:m}:{},...f?{serviceTier:f}:{},...n?{responseVerbosity:n}:{},..._0?{communicationStyle:_0}:{}});let N1=u.getCommunicationStyleConfiguration();if(N1.source!=="built-in"&&!N1.contentSha256)throw Error("Custom communication style has no provenance");let M$={...j&&j!=="inherit"&&(J.current?.sessionId!==L||J.current.modelId!==j)?{selectedModelId:j}:{},...m&&(J.current?.sessionId!==L||J.current.reasoningEffort!==m)?{reasoningEffort:m}:{},...f&&(J.current?.sessionId!==L||J.current.serviceTier!==f)?{serviceTier:f}:{},...n&&(J.current?.sessionId!==L||J.current.responseVerbosity!==n)?{responseVerbosity:n}:{},..._0&&(J.current?.sessionId!==L||J.current.communicationStyle!==_0||J.current.communicationStyleDigest!==N1.contentSha256)?{communicationStyle:_0,communicationStyleDigest:N1.source==="built-in"?null:N1.contentSha256}:{}};if(Object.keys(M$).length>0)try{let G1=await E0.updateSessionMetadata(L,u.workspaceRoot,M$);J.current={sessionId:L,modelId:G1.selectedModelId,reasoningEffort:G1.reasoningEffort,serviceTier:G1.serviceTier,responseVerbosity:G1.responseVerbosity,communicationStyle:G1.communicationStyle,communicationStyleDigest:G1.communicationStyleDigest}}catch(G1){throw await u.refresh({...N0?{modelId:N0}:{},reasoningEffort:m0.selection,serviceTier:D0.selection,responseVerbosity:w0.selection,communicationStyle:_1.selection}).catch(()=>{return}),G1}V=await t$.createWithRuntime(u,{sessionId:L,systemPrompt:T?.systemPrompt??$.systemPrompt,appendSystemPrompt:T?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:T?.maxTurns??$.maxTurns,modelId:T?.modelId??$.modelId,agents:$.agents})}else V=await t$.create({systemPrompt:T?.systemPrompt??$.systemPrompt,appendSystemPrompt:T?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:T?.maxTurns??$.maxTurns,modelId:T?.modelId??$.modelId,agents:$.agents});return Q.current=V,V}),K=y0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await U($.sessionId)).listRewindCheckpoints()}),q=y0(async(T)=>{if(!$.sessionId)throw Error("No active session to rewind");let I=await(await U($.sessionId)).rewindSession(T);return await X(),I}),W=y0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await U($.sessionId)).listSubagents()}),O=y0(async(T,L)=>{if(!$.sessionId)throw Error("No active session for subagent control");let I=await U($.sessionId),V=!1,k,u=T,j=(f)=>{I$.getState().app.actions.completeSubagentProgress(u,f.status==="completed")},m=I.resumeSubagent({agentId:T,prompt:L,onEvent:(f)=>{if(f.kind==="tool_start"&&"function"in f.toolCall)I$.getState().app.actions.updateSubagentTool(u,f.toolCall.function.name)},onCompleted:(f)=>{if(V)j(f);else k=f}});if(u=m.session.id,I$.getState().app.actions.startSubagentProgress(m.session.id,m.session.subagentType,`Resumed from ${m.source.id}: ${m.session.description}`),V=!0,k)j(k);return m}),F=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await U($.sessionId)).getMcpContentCatalog()}),N=y0(async(T)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await U($.sessionId)).refreshMcpContentCatalogs(T)}),B=y0(async(T,L,I)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await U($.sessionId)).getMcpPrompt(T,L,I)}),_=y0(async(T,L,I)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await U($.sessionId)).completeMcpArgument(T,L,I)}),w=y0(async(T,L={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await U($.sessionId)).getMcpLogs(T,L)}),b=y0(async(T)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).listMcpTasks(T)}),A=y0(async(T)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).getMcpTask(T)}),v=y0(async(T,L)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await U($.sessionId)).cancelMcpTask(T,L)}),M=y0(async(T,L)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await U($.sessionId)).setMcpLoggingLevel(T,L)}),z=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await U($.sessionId)).getMcpInstructions()}),P=y0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await U($.sessionId)).getReasoningConfiguration()}),H=y0(async(T)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let L=await U($.sessionId);if(L.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let I=L.getReasoningConfiguration();if(L.resolveReasoningConfiguration(T),I.selection===T)return I;await L.refresh({reasoningEffort:T});try{let V;try{V=await E0.updateSessionMetadata($.sessionId,L.workspaceRoot,{reasoningEffort:T})}catch(k){if(!(k instanceof n$)&&k.code!=="ENOENT")throw k;V=await E0.createSessionMetadata($.sessionId,L.workspaceRoot,{taskStatus:"completed",selectedModelId:L.getCurrentModelId(),reasoningEffort:T,serviceTier:L.getServiceTierConfiguration().selection,responseVerbosity:L.getResponseVerbosityConfiguration().selection,communicationStyle:L.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:V.selectedModelId,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},r0().setReasoningEffort(T),L.getReasoningConfiguration()}catch(V){throw await L.refresh({reasoningEffort:I.selection}),V}}),R=y0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await U($.sessionId)).getServiceTierConfiguration()}),C=y0(async(T)=>{if(!$.sessionId)throw Error("No active session for service tier");let L=await U($.sessionId);if(L.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let I=L.getServiceTierConfiguration();if(L.resolveServiceTierConfiguration(T),I.selection===T)return I;await L.refresh({serviceTier:T});try{let V;try{V=await E0.updateSessionMetadata($.sessionId,L.workspaceRoot,{serviceTier:T})}catch(k){if(!(k instanceof n$)&&k.code!=="ENOENT")throw k;V=await E0.createSessionMetadata($.sessionId,L.workspaceRoot,{taskStatus:"completed",selectedModelId:L.getCurrentModelId(),reasoningEffort:L.getReasoningConfiguration().selection,serviceTier:T,responseVerbosity:L.getResponseVerbosityConfiguration().selection,communicationStyle:L.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:V.selectedModelId,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},r0().setServiceTier(T),L.getServiceTierConfiguration()}catch(V){throw await L.refresh({serviceTier:I.selection}),V}}),y=y0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await U($.sessionId)).getResponseVerbosityConfiguration()}),S=y0(async(T)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let L=await U($.sessionId);if(L.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let I=L.getResponseVerbosityConfiguration();if(L.resolveResponseVerbosityConfiguration(T),I.selection===T)return I;await L.refresh({responseVerbosity:T});try{let V;try{V=await E0.updateSessionMetadata($.sessionId,L.workspaceRoot,{responseVerbosity:T})}catch(k){if(!(k instanceof n$)&&k.code!=="ENOENT")throw k;V=await E0.createSessionMetadata($.sessionId,L.workspaceRoot,{taskStatus:"completed",selectedModelId:L.getCurrentModelId(),reasoningEffort:L.getReasoningConfiguration().selection,serviceTier:L.getServiceTierConfiguration().selection,responseVerbosity:T,communicationStyle:L.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:V.selectedModelId,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},r0().setResponseVerbosity(T),L.getResponseVerbosityConfiguration()}catch(V){throw await L.refresh({responseVerbosity:I.selection}),V}}),E=y0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await U($.sessionId)).getCommunicationStyleConfiguration()}),c=y0(async(T)=>{if(!$.sessionId)throw Error("No active session for communication style");let L=await U($.sessionId);if(L.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let I=L.getCommunicationStyleConfiguration(),V=L.resolveCommunicationStyleConfiguration(T);if(V.source!=="built-in"&&!V.contentSha256)throw Error("Custom communication style has no provenance");if(I.selection===T)return I;await L.refresh({communicationStyle:T});try{let k;try{k=await E0.updateSessionMetadata($.sessionId,L.workspaceRoot,{communicationStyle:T,communicationStyleDigest:V.source==="built-in"?null:V.contentSha256})}catch(u){if(!(u instanceof n$)&&u.code!=="ENOENT")throw u;k=await E0.createSessionMetadata($.sessionId,L.workspaceRoot,{taskStatus:"completed",selectedModelId:L.getCurrentModelId(),reasoningEffort:L.getReasoningConfiguration().selection,serviceTier:L.getServiceTierConfiguration().selection,responseVerbosity:L.getResponseVerbosityConfiguration().selection,communicationStyle:T,...V.source!=="built-in"&&V.contentSha256?{communicationStyleDigest:V.contentSha256}:{}})}return J.current={sessionId:$.sessionId,modelId:k.selectedModelId,reasoningEffort:k.reasoningEffort,serviceTier:k.serviceTier,responseVerbosity:k.responseVerbosity,communicationStyle:k.communicationStyle,communicationStyleDigest:k.communicationStyleDigest},r0().setCommunicationStyle(T),L.getCommunicationStyleConfiguration()}catch(k){throw await L.refresh({communicationStyle:I.selection}),k}}),J0=y0(async(T)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(T,{allowBeforeTurn:!0})}),l=y0(async(T,L)=>{let I=$.sessionId;if(!I)throw Error("User shell command requires a Session");return(await U(I)).executeUserShellCommand(T,L)});return LY(()=>{let T=g8(X);return()=>{T(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:G,cleanupAgent:X,steerActiveTurn:J0,executeUserShellCommand:l,listRewindCheckpoints:K,rewindSession:q,listSubagents:W,resumeSubagent:O,getMcpContentCatalog:F,refreshMcpContentCatalogs:N,getMcpPrompt:B,completeMcpArgument:_,listMcpTasks:b,getMcpTask:A,cancelMcpTask:v,getMcpLogs:w,setMcpLoggingLevel:M,getMcpInstructions:z,getReasoningConfiguration:P,setReasoningEffort:H,getServiceTierConfiguration:R,setServiceTier:C,getResponseVerbosityConfiguration:y,setResponseVerbosity:S,getCommunicationStyleConfiguration:E,setCommunicationStyle:c}}import{useMemoizedFn as k$}from"ahooks";import{useEffect as BY,useRef as m8}from"react";function f4($){let Q=0;for(let Y of $)if(Y===`
32
- `)Q++;return Q}function D4($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=m8(""),U=m8(null),G=m8(""),K=m8(null),q=k$(()=>{if(X.current){let _=X.current,w=$.appendAssistantContent(_);T$(w,_),X.current=""}if(U.current)clearTimeout(U.current),U.current=null}),W=k$(()=>{if(G.current)$.appendThinkingContent(G.current),G.current="";if(K.current)clearTimeout(K.current),K.current=null}),O=k$((_)=>{X.current+=_;let w=X.current;if(f4(w)>=J||w.length>=Z){q();return}if(!U.current)U.current=setTimeout(q,Y)}),F=k$((_)=>{G.current+=_;let w=G.current;if(f4(w)>=J||w.length>=Z){W();return}if(!K.current)K.current=setTimeout(W,Y)}),N=k$(()=>{if(X.current="",U.current)clearTimeout(U.current),U.current=null;if(G.current="",K.current)clearTimeout(K.current),K.current=null}),B=k$(()=>{if(U.current)clearTimeout(U.current),U.current=null;if(K.current)clearTimeout(K.current),K.current=null;let _=X.current,w=G.current;return X.current="",G.current="",{extraContent:_,extraThinking:w}});return BY(()=>{return()=>{N()}},[N]),{batchAppendContent:O,batchAppendThinking:F,flushContentBuffer:q,flushThinkingBuffer:W,resetStreamingBuffers:N,drainPendingBuffers:B}}var g2=o1("UI"),E4=($,Q,Y,J,Z,X)=>{let U=a1(),G=b8(),K=M1(),q=y8(),W=C$(),O=I8(),F=C8(),N=T8(),B=v8(),_=k8(),w=d1(),b=r1(),A=q4(),v=V4(!1),M=V4(!1),{createAgent:z,cleanupAgent:P,steerActiveTurn:H,listRewindCheckpoints:R,rewindSession:C,listSubagents:y,resumeSubagent:S,getMcpContentCatalog:E,refreshMcpContentCatalogs:c,getMcpPrompt:J0,completeMcpArgument:l,listMcpTasks:T,getMcpTask:L,cancelMcpTask:I,getMcpLogs:V,setMcpLoggingLevel:k,getMcpInstructions:u,getReasoningConfiguration:j,setReasoningEffort:m,getServiceTierConfiguration:f,setServiceTier:n,getResponseVerbosityConfiguration:_0,setResponseVerbosity:N0,getCommunicationStyleConfiguration:m0,setCommunicationStyle:D0,executeUserShellCommand:w0}=S4({sessionId:G,workspaceRoot:K,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:q,reasoningEffort:F,serviceTier:N,responseVerbosity:B,communicationStyle:_,agents:X}),_1=D4(w),N1=S$(async(X0,T0)=>{if(X0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let e=X0.text.trimStart().slice(1).trim();if(!e)return{success:!1,error:"User shell command cannot be empty"};w.setCommand(`! ${e}`);try{let O0=await w0(e,{signal:T0});if(w.addMessage({id:`user-shell-${O0.executionId}`,role:"user",content:m2(O0.record),timestamp:Date.now(),metadata:{userShellCommand:O0.record}}),O0.delivery==="next_turn")M.current=!0;return{success:O0.record.status!=="spawn_error",output:m2(O0.record),...O0.record.status==="spawn_error"?{error:O0.record.stderr||"User shell command failed"}:{}}}finally{w.setCommand(null)}});h2(()=>{return()=>{_1.resetStreamingBuffers()}},[_1.resetStreamingBuffers]),h2(()=>{if(!O)w.setCurrentThinkingContent(null)},[O,w]);let M$=S$(()=>{if(!U)return;Z?.();let{extraContent:X0,extraThinking:T0}=_1.drainPendingBuffers();A.abort("user-cancel"),b.setTasks([]);let e=Y1().session.currentStreamingMessageId;if(e){if(X0)T$(e,X0);f8(e)}if(w.finalizeStreamingMessage(X0,T0),!v.current)w.addAssistantMessage("任务已停止"),v.current=!0}),G1=S$(async(X0,T0)=>{let e={contentDeltaCount:0,contentDeltaTotalLen:0},O0=A4({sessionActions:w,appActions:b,commandActions:A,streamingBuffer:_1,thinkingModeEnabled:O,getStreamingMessageId:()=>Y1().session.currentStreamingMessageId,signal:T0.signal},e);return{loopResult:await j4(X0,O0),stats:e}}),v2=S$(async(X0)=>{let T0=!1,e,O0=!1,x0=X0;try{if(X0.text.trimStart().startsWith("!")){let c0=A.getAbortController()??A.createAbortController();return await N1(X0,c0.signal)}await s$();let o0=A.getAbortController()??A.createAbortController(),p0=await E2(X0,b,w,o0.signal,P,G,V8(Y1().session),{listCheckpoints:R,execute:C},{list:y,resume:S},{getCatalog:E,refresh:c,getPrompt:J0,complete:l,listTasks:T,getTask:L,cancelTask:I,getLogs:V,setLoggingLevel:k,getInstructions:u},{get:j,set:m},{get:f,set:n},{get:_0,set:N0},{get:m0,set:D0},K);if(p0.type==="handled")return p0.commandResult;if(p0.type==="continue_as_agent")T0=p0.result.userMessageAlreadyAdded,e=p0.result.onceModelId,O0=p0.result.goalContinuationOnly===!0,x0=p0.result.agentInput;let S2=F1.getInstance(),o$;if(!O0){let c0=await S2.executeUserPromptSubmitHooks(x0.text,{projectDir:K,sessionId:G,permissionMode:W,hasImages:x0.images.length>0,imageCount:x0.images.length});if(!c0.proceed){if(c0.warning)w.addAssistantMessage(`${c0.warning}`);return{success:!1,error:"blocked by hook"}}if(c0.updatedPrompt)x0={...x0,text:c0.updatedPrompt,displayText:c0.updatedPrompt,parts:[{type:"text",text:c0.updatedPrompt},...x0.parts.filter((B8)=>B8.type==="image")]};if(c0.contextInjection)o$=c0.contextInjection}if(!T0)w.addUserMessage(x0.displayText);let H8=j2(x0),W8=await z(e?{modelId:e}:void 0);if(o0.signal.aborted)return g2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};let r=V8(Y1().session);if(o$)r.push({role:"system",content:`<user-prompt-submit-hook>
33
- ${o$}
34
- </user-prompt-submit-hook>`});let U0={messages:r,userId:"cli-user",sessionId:G,workspaceRoot:K,signal:o0.signal,confirmationHandler:Y,permissionMode:W},{loopResult:v0,stats:L8}=await G1(W8.chatStream(H8,U0,{stream:!0,goalContinuationOnly:O0,onTurnLimitReached:Y?async(c0)=>{let B8=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${c0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:B8.approved,reason:B8.reason}}:void 0}),o0);if(v0.metadata?.outputTruncated)w.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let S1=v0.finalMessage||"";if(g2.debug("[handleCommandSubmit] final reply",{success:v0.success,outputLength:S1.length,turnsCount:v0.metadata?.turnsCount,toolCallsCount:v0.metadata?.toolCallsCount}),!v0.success&&v0.error?.type==="api_error"){let c0=v0.error.message||"请求失败,请检查网络连接和 API 配置";return w.addAssistantMessage(c0),{success:!1,error:c0}}if(!S1||S1.trim()===""){let c0=v0.metadata?.abortReason;if(!v.current&&L8.contentDeltaCount===0&&c0!=="interrupt")return w.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:S1??""}}return{success:!0,output:S1}}catch(o0){if(v.current)return{success:!1,error:"aborted"};let p0=S8(o0);return w.addAssistantMessage(`${p0.displayMessage}`),{success:!1,error:p0.displayMessage}}}),q$=S$(async()=>{if(Y1().command.isProcessing){M.current=!0;return}let X0=await O$.hasPendingInbox(K,G),T0=!X0&&await O$.hasActiveGoal(K,G);if(!X0&&!T0){M.current=!1;return}if(Y1().command.isProcessing){M.current=!0;return}M.current=!1,await s$();let e=A.createAbortController();_1.resetStreamingBuffers(),w.clearFinalizingStreamingMessageId(),A.setProcessing(!0);try{let O0=await z();if(e.signal.aborted)return;let x0={messages:V8(Y1().session),userId:"cli-user",sessionId:G,workspaceRoot:K,signal:e.signal,confirmationHandler:Y,permissionMode:W},{loopResult:o0}=await G1(O0.chatStream("",x0,{stream:!0,pendingInputOnly:X0,goalContinuationOnly:T0}),e);if(o0.metadata?.outputTruncated)w.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!o0.success&&o0.error?.type==="api_error")w.addAssistantMessage(o0.error.message||"恢复排队指令失败,请检查网络和 API 配置")}catch(O0){let x0=S8(O0);if(!x0.isAbort)w.setError(`恢复排队指令失败: ${x0.displayMessage}`)}finally{if(A.getAbortController()===e)A.setProcessing(!1),A.clearAbortController(e),w.setCurrentThinkingContent(null);if(M.current)queueMicrotask(()=>{q$()})}}),k2=S$(async(X0)=>{if(!X0.text.trim()&&X0.images.length===0)return;if(X0.text.trimStart().startsWith("!")&&U){let e=A.getAbortController();if(!e){w.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let O0=await N1(X0,e.signal);if(!O0.success&&O0.error&&O0.error!=="aborted")w.setError(O0.error);return}if(U){if(X0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(X0.text.trim())){await s$();let p0=A.getAbortController()??A.createAbortController();await E2(X0,b,w,p0.signal,P,G,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,K);return}w.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await s$();let e=await F1.getInstance().executeUserPromptSubmitHooks(X0.text,{projectDir:K,sessionId:G,permissionMode:W,hasImages:X0.images.length>0,imageCount:X0.images.length});if(!e.proceed){if(e.warning)w.addAssistantMessage(e.warning);return}let O0=X0;if(e.updatedPrompt)O0={...X0,text:e.updatedPrompt,parts:[{type:"text",text:e.updatedPrompt},...X0.parts.filter((p0)=>p0.type==="image")]};if(e.contextInjection){let p0=`<user-prompt-submit-hook>
35
- ${e.contextInjection}
36
- </user-prompt-submit-hook>`;O0={...O0,text:`${O0.text}
37
-
38
- ${p0}`,parts:[...O0.parts,{type:"text",text:`
39
-
40
- ${p0}`}]}}let x0=j2(O0),o0=await H(x0);if(!o0.accepted){let p0=o0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";w.addAssistantMessage(p0);return}if(A.enqueueCommand(X0),w.addUserMessage(X0.displayText),o0.delivery==="next_turn"){if(M.current=!0,!Y1().command.isProcessing)queueMicrotask(()=>{q$()})}return}b.setTasks([]),A.setRecoveredSteeringCount(0),v.current=!1;let T0=A.createAbortController();_1.resetStreamingBuffers(),w.clearFinalizingStreamingMessageId(),A.setProcessing(!0);try{let e=await v2(X0);if(!e.success&&e.error&&e.error!=="aborted")w.setError(e.error)}catch(e){let O0=S8(e);if(O0.isAbort);else w.setError(`执行失败: ${O0.displayMessage}`)}finally{if(A.getAbortController()===T0){if(A.setProcessing(!1),A.clearAbortController(T0),w.setCurrentThinkingContent(null),M.current)queueMicrotask(()=>{q$()})}}});return h2(()=>{let X0=!1;return Promise.all([O$.hasPendingInbox(K,G),O$.hasActiveGoal(K,G)]).then(([T0,e])=>{if(!X0&&(T0||e))return q$()}).catch((T0)=>{if(!X0)g2.warn("[useCommandHandler] Failed to inspect pending inbox",T0)}),()=>{X0=!0}},[q$,G,K]),{executeCommand:k2,handleAbort:M$,isProcessing:U,cleanupAgent:P}};import{useMemoizedFn as p8}from"ahooks";import{useState as h4}from"react";var g4=()=>{let[$,Q]=h4([]),[Y,J]=h4(-1),Z=p8((K,q)=>{let W={display:K,pasteMappings:q?new Map(q):new Map};Q((O)=>[...O,W]),J(-1)}),X=p8(()=>{if($.length===0)return null;let K=Y===-1?$.length-1:Math.max(0,Y-1);return J(K),$[K]||null}),U=p8(()=>{if(Y===-1)return null;let K=Y+1;if(K>=$.length)return J(-1),null;else return J(K),$[K]||null}),G=p8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:U,resetHistoryIndex:G}};import{useMemoizedFn as e$}from"ahooks";import{useMemo as wY,useRef as m4,useState as bY}from"react";var p4=()=>{let[$,Q]=bY({isVisible:!1,details:null,resolver:null}),Y=m4(null),J=m4([]),Z=e$((W)=>{Y.current=W,Q({isVisible:Boolean(W),details:W?.details??null,resolver:W?.resolve??null})}),X=e$((W,O)=>{if(W.settled)return;if(W.settled=!0,W.signal&&W.abortListener)W.signal.removeEventListener("abort",W.abortListener);W.resolve(O)}),U=e$((W,O)=>{return new Promise((F)=>{let N={details:W,resolve:F,signal:O,settled:!1},B=()=>{if(Y.current===N){X(N,{approved:!1,reason:$8}),Z(J.current.shift()??null);return}let _=J.current.indexOf(N);if(_>=0)J.current.splice(_,1);X(N,{approved:!1,reason:$8})};if(N.abortListener=B,O?.aborted){B();return}if(O?.addEventListener("abort",B,{once:!0}),!Y.current){Z(N);return}J.current.push(N)})}),G=e$((W)=>{let O=Y.current;if(O)X(O,W);let F=J.current.shift()??null;Z(F)}),K=e$(()=>{if(Y.current)X(Y.current,{approved:!1,reason:$8});for(let W of J.current)X(W,{approved:!1,reason:$8});J.current=[],Z(null)}),q=wY(()=>({requestConfirmation:U}),[U]);return{confirmationState:$,confirmationHandler:q,handleResponse:G,dismissAll:K}};import{useMemoizedFn as z$}from"ahooks";import{useRef as c4,useState as AY}from"react";var c8="␞",x8="␟";function u8($){return`${c8}PASTE:${$}:`}function p2(){return x8}var o7=new RegExp(`${c8}PASTE:(\\d+):[\\s\\S]*?${x8}`,"g");function PY($){return $.includes(c8)&&$.includes(x8)}function x4($="",Q=0){let[Y,J]=AY({value:$,cursorPosition:Q}),Z=c4(0),X=c4(new Map),U=z$((N)=>{J((B)=>({value:N,cursorPosition:B.cursorPosition}));for(let B of X.current.keys()){let _=u8(B);if(!N.includes(_))X.current.delete(B)}}),G=z$((N)=>{J((B)=>({...B,cursorPosition:Math.max(0,Math.min(N,B.value.length))}))}),K=z$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),q=z$((N)=>{Z.current+=1;let B=Z.current;return X.current.set(B,{type:"text",data:N}),B}),W=z$((N,B)=>{let _=[...X.current.values()].filter((v)=>v.type==="image");if(_.length>=v$)throw Error(`最多只能粘贴 ${v$} 张图片`);let w=_.reduce((v,M)=>v+`data:${M.mimeType};base64,`.length+M.data.length,0),b=`data:${B};base64,`.length+N.length;if(w+b>D8)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let A=Z.current;return X.current.set(A,{type:"image",data:N,mimeType:B}),A}),O=z$((N)=>{for(let[B,_]of N)if(X.current.set(B,_),B>=Z.current)Z.current=B}),F=z$((N)=>{let B=[],_=[];if(!PY(N)){let C=N.trim();if(C)_.push({type:"text",text:C});return{displayText:N,text:N,images:B,parts:_}}let w=new RegExp(`${c8}PASTE:(\\d+):[\\s\\S]*?${x8}`,"g"),b=Array.from(N.matchAll(w)),A=0,v="",M="";for(let C of b){let y=C.index,S=y+C[0].length,E=parseInt(C[1],10),c=X.current.get(E);if(y>A){let J0=N.slice(A,y);_.push({type:"text",text:J0}),v+=J0,M+=J0}if(!c)v+=C[0],M+=C[0],_.push({type:"text",text:C[0]});else if(c.type==="text")v+=c.data,M+=c.data,_.push({type:"text",text:c.data});else{let J0={id:E,base64:c.data,mimeType:c.mimeType};B.push(J0),_.push({type:"image",...J0}),M+=`[Image #${E}]`}A=S}if(A<N.length){let C=N.slice(A);_.push({type:"text",text:C}),v+=C,M+=C}let z=[];for(let C of _)if(C.type==="text"&&z.length>0&&z[z.length-1].type==="text")z[z.length-1].text+=C.text;else z.push(C);let P=0,H=z.length;while(P<z.length&&z[P].type==="text"&&z[P].text.trim()==="")P++;while(H>P&&z[H-1].type==="text"&&z[H-1].text.trim()==="")H--;let R=z.slice(P,H);return{displayText:M.trim(),text:v.trim(),images:B,parts:R}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:U,setCursorPosition:G,clear:K,pasteMap:X.current,addPasteMapping:q,addImagePasteMapping:W,restorePasteMappings:O,resolveInput:F}}import{useMemoizedFn as n4}from"ahooks";import{useInput as kY}from"ink";import{useEffect as t4,useRef as s4,useState as l2}from"react";function RY($){return{supportsThinking:f1().resolveConfig($).reasoning}}function l8($){return RY($).supportsThinking}import yY from"fast-glob";import MY from"fuse.js";import{useEffect as u4,useMemo as c2,useState as x2}from"react";var f$=null,IY=5000;function CY($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),U=X+Z.length;if(Q>=X&&Q<=U){let G=Z.slice(1),K=!1;if(G.startsWith('"')){if(K=!0,G=G.slice(1),G.endsWith('"'))G=G.slice(0,-1)}return{hasQuery:!0,query:G,startIndex:X,endIndex:U,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var TY=[...u2.map(($)=>`${$}/**`),...u2,...l4.map(($)=>`**/${$}`)];function d4($,Q,Y={}){let{cwd:J=A0(),maxSuggestions:Z=15,ignorePatterns:X=TY,debounceDelay:U=300,fuzzyMatch:G=!0}=Y,[K,q]=x2([]),[W,O]=x2(!1),[F,N]=x2(0),B=c2(()=>JSON.stringify(X),[X]),_=c2(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return CY($,Q)},[$,Q]);u4(()=>{if(!$.includes("@")){q([]),O(!1);return}let b=Date.now();if(f$&&f$.cwd===J&&f$.ignoreKey===B&&b-f$.timestamp<IY){q(f$.files),O(!1);return}let A=!1,M=setTimeout(async()=>{O(!0);try{let P=(await yY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((H)=>H.replace(/\\/g,"/"));if(!A)q(P),f$={cwd:J,ignoreKey:B,files:P,timestamp:b}}catch(z){if(console.error("Failed to load files for @ completion:",z),!A)q([])}finally{if(!A)O(!1)}},U);return()=>{A=!0,clearTimeout(M)}},[$,J,U,B]);let w=c2(()=>{if(!_.hasQuery||K.length===0)return[];let b=_.query.toLowerCase();if(b==="")return K.slice(0,Z);if(G)return new MY(K,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(b).slice(0,Z).map((M)=>M.item);return K.filter((A)=>A.toLowerCase().includes(b)).slice(0,Z)},[_,K,Z,G]);return u4(()=>{N(0)},[w]),{..._,suggestions:w,selectedIndex:F,loading:W}}function vY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function r4($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=vY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),U=Z+J+" "+X,G=Q.startIndex+J.length+1;return{newInput:U,newCursorPos:G}}import{useMemoizedFn as a4}from"ahooks";import{useEffect as o4,useRef as i4}from"react";var k0=($,Q)=>{let Y=i4(!1),J=i4(null),Z=a4(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{Q8().shutdown("SIGINT",0)},U=a4(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();r0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;r0().setAwaitingSecondCtrlC(!1),X()}});return o4(()=>{if($){if(r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),o4(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),U};var d8=o1("UI"),Q6=($,Q,Y,J,Z,X,U,G,K,q)=>{let O=s0()==="main-input",F=$.value,N=$.setValue,B=$.cursorPosition,_=d1(),w=M1(),b=r1(),A=R8(),v=A?l8(A):!1,[M,z]=l2(!1),[P,H]=l2([]),[R,C]=l2(0),y=d4(F,B,{cwd:w,maxSuggestions:10}),S=k0(U||!1,X),E=s4(0),c=500,J0=s4(!1);t4(()=>{if(U)J0.current=!1},[U]),t4(()=>{if(y.hasQuery&&y.suggestions.length>0){let L=y.suggestions.map((I)=>({command:I,description:e4(I)?`Directory: ${I}`:`File: ${I}`,matchScore:1}));H(L),z(!0),C(0)}else if(F.startsWith("/"))if(F.includes(" "))z(!1),H([]);else{let I=$6(F,w);H(I),z(I.length>0),C(0)}else z(!1),H([])},[F,y.hasQuery,y.suggestions,w]);let l=n4(()=>{_.clearMessages(),_.setError(null)}),T=n4(()=>{d8.debug("[DIAG] handleSubmit called:",{input:F,showSuggestions:M});let L=F.trim();if(L){let I=$.resolveInput(L);d8.debug("[DIAG] Submitting command:",{displayText:L,textLength:I.text.length,imageCount:I.images.length}),z(!1),H([]);let V=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(L,V),$.clear(),Q(I),d8.debug("[DIAG] Command submitted to onSubmit callback")}else d8.debug("[DIAG] Empty command, not submitting")});return kY((L,I)=>{if(L==="?"&&!F){K?.(),setTimeout(()=>$.clear(),0);return}if(I.backspace||I.delete||I.leftArrow||I.rightArrow||I.pageUp||I.pageDown||!I.ctrl&&!I.meta&&!I.escape&&!I.tab&&!I.upArrow&&!I.downArrow&&!I.return&&!(L==="?"&&!F))return;if(I.ctrl&&L==="c"||I.meta&&L==="c"||I.ctrl&&L==="d"||I.meta&&L==="d"){S();return}if(I.ctrl&&L==="l"||I.meta&&L==="l"){l();return}if(I.ctrl&&L==="t"||I.meta&&L==="t"){_.toggleThinkingExpanded();return}if(I.ctrl&&L==="o"||I.meta&&L==="o"){_.toggleHistoryExpanded();return}if(I.escape){if(q)K?.();else if(U&&X){if(J0.current)return;J0.current=!0,X()}else if(M)z(!1),H([]);else if(F){let k=Date.now();if(k-E.current<500)$.clear(),E.current=0;else E.current=k}return}if(I.tab&&I.shift){G?.();return}if(I.tab){if(M&&P.length>0){let k=P[R].command;if(y.hasQuery&&y.suggestions.includes(k)){let{newInput:u,newCursorPos:j}=r4(F,y,k);N(u),$.setCursorPosition(j)}else{let u=k+" ";N(u),$.setCursorPosition(u.length)}z(!1),H([])}else if(v)b.toggleThinkingMode();return}if(I.return){T();return}if(I.upArrow){if(M&&P.length>0){let k=P.length-1;C((u)=>u>0?u-1:k)}else{let k=Y();if(k){if(k.pasteMappings.size>0)$.restorePasteMappings(k.pasteMappings);N(k.display),$.setCursorPosition(k.display.length)}}return}if(I.downArrow){if(M&&P.length>0){let k=P.length-1;C((u)=>u<k?u+1:0)}else{let k=J();if(k){if(k.pasteMappings.size>0)$.restorePasteMappings(k.pasteMappings);N(k.display),$.setCursorPosition(k.display.length)}}return}},{isActive:O}),{handleSubmit:T,showSuggestions:M,suggestions:P,selectedSuggestionIndex:R}};import jY from"ansi-escapes";import{useStdout as EY}from"ink";import{useCallback as hY,useEffect as gY,useRef as mY}from"react";import{useStdout as SY}from"ink";import{debounce as fY}from"lodash-es";import{useEffect as DY,useState as VY}from"react";function D$($=200){let{stdout:Q}=SY(),[Y,J]=VY(Q.columns||80);return DY(()=>{let Z=fY(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function J6(){let{stdout:$}=EY(),Q=D$(),Y=mY(!0),J=$0((X)=>X.session.actions.incrementClearCount),Z=hY(()=>{if($)$.write(jY.clearTerminal);J()},[$,J]);return gY(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import Y6 from"node:fs";import pY from"node:os";import d2 from"node:path";import{MultiSelect as cY}from"@inkjs/ui";import{useMemoizedFn as r8}from"ahooks";import{Box as Q0,Text as i,useFocus as xY,useFocusManager as uY,useInput as X6}from"ink";import a8 from"ink-select-input";import lY from"ink-spinner";import J8 from"ink-text-input";import{useEffect as Z6,useState as V$}from"react";import{jsxDEV as D}from"react/jsx-dev-runtime";var dY=[{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"}],rY=[{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 aY($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function Y8({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=V$(Y?"name":"mode"),[X,U]=V$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[G,K]=V$(""),[q,W]=V$(!1),[O,F]=V$(""),[N,B]=V$(Y?"edit":"manual"),{focus:_}=uY(),b={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[N];Z6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;_(`step-${J}`)},[J,_]);let A=r8(()=>{let H=b.indexOf(J);if(H<b.length-1)Z(b[H+1])}),v=r8(()=>{if(O)F("");if(J==="confirm"&&N==="ai"){Z("aiPrompt");return}let H=b.indexOf(J);if(H>0)Z(b[H-1]);else Q()}),M=r8(async()=>{W(!0),F("");try{let H=await t$.create(),R=`你是一个 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,不要添加任何额外的解释或文字。`,y=(await H.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,不要添加任何额外的解释或文字。`,G)).trim(),S=y.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(S)y=S[1];let E=JSON.parse(y);if(!E.name||!E.description||!E.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(E.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");U({name:E.name,description:E.description,tools:Array.isArray(E.tools)?E.tools:[],color:E.color||"blue",location:"project",systemPrompt:E.systemPrompt}),Z("confirm")}catch(H){F(H instanceof Error?H.message:String(H))}finally{W(!1)}});Z6(()=>{if(J==="aiGenerating"&&!q&&!O)M()},[J,q,O,M]);let z=r8(async()=>{try{let H=X.location==="project"?d2.join(A0(),".blade","agents"):d2.join(pY.homedir(),".blade","agents");await Y6.promises.mkdir(H,{recursive:!0});let R=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){R.push("tools:");for(let S of X.tools)R.push(` - ${S}`)}if(X.color)R.push(`color: ${X.color}`);R.push("---");let C=[R.join(`
117
- `),"",`# ${X.name} Subagent`,"",X.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
118
- `),y=d2.join(H,`${X.name}.md`);await Y6.promises.writeFile(y,C,"utf-8"),$()}catch(H){console.error("保存配置失败:",H)}}),P=k0(!1,Q);if(X6((H,R)=>{if(R.escape)v();else if(R.ctrl&&H==="c"||R.meta&&H==="c")P()},{isActive:J!=="tools"}),J==="mode")return D(Q0,{flexDirection:"column",paddingY:1,children:[D(Q0,{marginBottom:1,children:D(i,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(a8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(H)=>{if(H.value==="ai")B("ai"),Z("aiPrompt");else B("manual"),Z("name")}},void 0,!1,void 0,this),D(Q0,{marginTop:1,children:D(i,{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(Q0,{flexDirection:"column",paddingY:1,children:[D(Q0,{marginBottom:1,children:D(i,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:[D(i,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(J8,{value:G,onChange:K,onSubmit:(H)=>{if(!H.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Q0,{children:D(i,{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(Q0,{flexDirection:"column",paddingY:1,children:[D(Q0,{marginBottom:1,children:D(i,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return D(Q0,{flexDirection:"column",paddingY:1,children:[D(Q0,{marginBottom:1,children:D(i,{bold:!0,color:"yellow",children:[D(lY,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{dimColor:!0,children:['根据你的描述:"',G,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{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 H=N==="edit";return D(Q0,{flexDirection:"column",paddingY:1,children:[D(Q0,{marginBottom:1,children:D(i,{bold:!0,color:"cyan",children:["Step 1/7: ",H?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{dimColor:!0,children:H?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:[D(i,{color:"green",children:"名称: "},void 0,!1,void 0,this),H?D(i,{children:X.name},void 0,!1,void 0,this):D(J8,{value:X.name,onChange:(R)=>U({...X,name:R}),onSubmit:(R)=>{if(aY(R))return;A()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Q0,{children:D(i,{dimColor:!0,children:H?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H&&D(J8,{value:"",onChange:()=>{},onSubmit:A,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return D(Q0,{flexDirection:"column",paddingY:1,children:[D(Q0,{marginBottom:1,children:D(i,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:[D(i,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(J8,{value:X.description,onChange:(H)=>U({...X,description:H}),onSubmit:(H)=>{if(!H.trim())return;A()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Q0,{children:D(i,{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(oY,{config:X,setConfig:U,onNext:A,onPrev:v},void 0,!1,void 0,this);if(J==="color")return D(Q0,{flexDirection:"column",paddingY:1,children:[D(Q0,{marginBottom:1,children:D(i,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(a8,{items:rY,onSelect:(H)=>{let R=H.value==="none"?void 0:H.value;U({...X,color:R}),A()}},void 0,!1,void 0,this),D(Q0,{marginTop:1,children:D(i,{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(Q0,{flexDirection:"column",paddingY:1,children:[D(Q0,{marginBottom:1,children:D(i,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(a8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(H)=>{U({...X,location:H.value}),A()}},void 0,!1,void 0,this),D(Q0,{marginTop:1,children:D(i,{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(Q0,{flexDirection:"column",paddingY:1,children:[D(Q0,{marginBottom:1,children:D(i,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:[D(i,{color:"green",children:"提示词: "},void 0,!1,void 0,this),D(J8,{value:X.systemPrompt,onChange:(H)=>U({...X,systemPrompt:H}),onSubmit:()=>A()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Q0,{children:D(i,{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(Q0,{flexDirection:"column",paddingY:1,children:[D(Q0,{marginBottom:1,children:D(i,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[D(i,{children:[D(i,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),D(i,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(i,{children:[D(i,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),D(i,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(i,{children:[D(i,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),D(i,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(i,{children:[D(i,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),D(i,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(i,{children:[D(i,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),D(i,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(i,{children:[D(i,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),D(i,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D(a8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(H)=>{if(H.value==="save")z();else if(H.value==="back")v();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function oY({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=xY({id:"step-tools"});X6((U,G)=>{if(G.escape)J()},{isActive:Z});let X=(U)=>{if(U.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:U});Y()};return D(Q0,{flexDirection:"column",paddingY:1,children:[D(Q0,{marginBottom:1,children:D(i,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q0,{marginBottom:1,children:D(i,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(cY,{options:dY,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import iY from"node:fs";import{useMemoizedFn as _$}from"ahooks";import{Box as M0,Text as S0,useInput as nY}from"ink";import r2 from"ink-select-input";import{useEffect as tY,useMemo as U6,useState as o8}from"react";import{jsxDEV as a}from"react/jsx-dev-runtime";var a2=10;function K6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=G6($),[X,U]=o8(Q),[G,K]=o8(null),[q,W]=o8(0),[O,F]=o8(0),N=_$(()=>{Z.clear(),Z.loadFromStandardLocations(),W((y)=>y+1)}),B=U6(()=>{return Z.getAllSubagents()},[q]),_=Math.ceil(B.length/a2)||1,w=U6(()=>{let y=O*a2;return B.slice(y,y+a2)},[B,O]);tY(()=>{let y=Math.max(0,_-1);if(O>y)F(y)},[_,O]);let b=_$(()=>{if(O<_-1)F((y)=>y+1)}),A=_$(()=>{if(O>0)F((y)=>y-1)}),v=[{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"}],M=_$((y)=>{if(y.value==="cancel"){J?.();return}U(y.value)}),z=_$((y)=>{if(K(y.value),X==="edit")U("editWizard");else if(X==="delete")U("deleteConfirm")}),P=_$(async()=>{if(!G?.configPath)return;try{await iY.promises.unlink(G.configPath),N(),H()}catch(y){console.error("删除失败:",y)}}),H=_$(()=>{U("menu"),K(null)}),R=k0(!1,J);if(nY((y,S)=>{if(S.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")F(0),H();else if(X==="deleteConfirm")H()}else if(S.ctrl&&y==="c"||S.meta&&y==="c")R();else if(X==="list"){if(S.leftArrow||y==="h")A();else if(S.rightArrow||y==="l")b()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return a(M0,{flexDirection:"column",paddingY:1,children:[a(M0,{marginBottom:1,children:a(S0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(r2,{items:v,onSelect:M},void 0,!1,void 0,this),a(M0,{marginTop:1,children:a(S0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="list"){if(B.length===0)return a(M0,{flexDirection:"column",paddingY:1,children:[a(M0,{marginBottom:1,children:a(S0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(M0,{paddingLeft:2,children:a(S0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(M0,{marginTop:1,paddingLeft:2,children:a(S0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(M0,{marginTop:1,paddingLeft:2,children:a(S0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return a(M0,{flexDirection:"column",paddingY:1,children:[a(M0,{marginBottom:1,children:[a(S0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),a(S0,{color:"gray",children:[" (共 ",B.length," 个)"]},void 0,!0,void 0,this),_>1&&a(S0,{color:"yellow",children:[" ","第 ",O+1,"/",_," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w.map((y)=>a(M0,{flexDirection:"column",paddingLeft:2,children:[a(M0,{children:a(S0,{children:[a(S0,{bold:!0,color:y.color||"white",children:["• ",y.name]},void 0,!0,void 0,this),a(S0,{color:"gray",children:[" - ",y.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y.tools&&y.tools.length>0&&a(M0,{paddingLeft:2,children:a(S0,{color:"gray",children:["工具: ",y.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y.configPath&&a(M0,{paddingLeft:2,children:a(S0,{color:"gray",dimColor:!0,children:y.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},y.name,!0,void 0,this)),a(M0,{marginTop:1,paddingLeft:2,children:_>1?a(S0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):a(S0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let C=(y)=>{if(B.length===0)return a(M0,{flexDirection:"column",paddingY:1,children:[a(M0,{marginBottom:1,children:a(S0,{bold:!0,color:"cyan",children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(M0,{paddingLeft:2,children:a(S0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(M0,{marginTop:1,paddingLeft:2,children:a(S0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let S=B.map((E)=>({key:E.name,label:`${E.name} - ${E.description}`,value:E}));return a(M0,{flexDirection:"column",paddingY:1,children:[a(M0,{marginBottom:1,children:a(S0,{bold:!0,color:"cyan",children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(r2,{items:S,onSelect:z},void 0,!1,void 0,this),a(M0,{marginTop:1,children:a(S0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(X==="create")return a(Y8,{onComplete:()=>{N(),H()},onCancel:H},void 0,!1,void 0,this);if(X==="edit")return C("编辑 Agent");if(X==="editWizard"&&G){let y={name:G.name,description:G.description,tools:G.tools||[],color:G.color,location:G.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:G.systemPrompt||""};return a(Y8,{initialConfig:y,onComplete:()=>{N(),H()},onCancel:H},void 0,!1,void 0,this)}if(X==="delete")return C("删除 Agent");if(X==="deleteConfirm"&&G)return a(M0,{flexDirection:"column",paddingY:1,children:[a(M0,{marginBottom:1,children:a(S0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(M0,{marginBottom:1,paddingLeft:2,children:a(S0,{children:["你确定要删除 Agent"," ",a(S0,{bold:!0,color:"yellow",children:G.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),a(M0,{marginBottom:1,paddingLeft:2,children:a(S0,{dimColor:!0,children:["文件路径: ",G.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),a(M0,{marginBottom:1,paddingLeft:2,children:a(S0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(r2,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(y)=>{if(y.value==="confirm")P();else H()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as j$,Text as q0}from"ink";import eY,{useEffect as $3,useState as Q3}from"react";import{useEffect as sY,useState as q6}from"react";function _6($=A0(),Q=5000){let[Y,J]=q6(null),[Z,X]=q6(!0);return sY(()=>{let U=!0,G=async()=>{try{let q=await O6($);if(!U)return;if(!q){J(null),X(!1);return}let W=await z6($);if(!U)return;J(W)}catch{if(U)J(null)}finally{if(U)X(!1)}};G();let K=null;if(Q>0)K=setInterval(G,Q);return()=>{if(U=!1,K)clearInterval(K)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as o,Fragment as b1}from"react/jsx-dev-runtime";var N6=eY.memo(()=>{let $=P8(),Q=C$(),J=A8()==="shortcuts",Z=Z4(),X=M1(),{branch:U}=_6(X),G=R8(),K=sQ(),q=nQ(),W=I8(),O=C8(),F=T8(),N=v8(),B=k8(),_=tQ(),w=M8(),b=O4(),A=b8(),[v,M]=Q3(null);$3(()=>{let y=!1;new o2(X,A).get().then((c)=>{if(!y)M(c)}).catch(()=>{if(!y)M(null)});let E=o2.subscribe((c)=>{if(!y&&c.sessionId===A&&c.workspaceRoot===X)M(c.goal)});return()=>{y=!0,E()}},[A,X]);let z=G?l8(G):!1,H=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return o(q0,{color:"magenta",children:[">> ","auto edit on ",o(q0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return o(q0,{color:"cyan",children:["‖ plan mode on ",o(q0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return o(q0,{color:"red",children:["yolo mode on ",o(q0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),R=H!==null,C=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return o(j$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?o(j$,{flexDirection:"column",gap:0,children:C.map((y,S)=>o(j$,{flexDirection:"row",children:[y.map((E,c)=>{let[J0,l]=E.split(":");return o(j$,{flexDirection:"row",width:20,children:[o(q0,{color:"yellow",children:J0},void 0,!1,void 0,this),o(q0,{color:"gray",children:":"},void 0,!1,void 0,this),o(q0,{color:"white",children:l},void 0,!1,void 0,this)]},c,!0,void 0,this)}),S===C.length-1&&o(q0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},S,!0,void 0,this))},void 0,!1,void 0,this):o(j$,{flexDirection:"row",gap:1,children:[U&&o(b1,{children:[o(q0,{color:"gray",children:[" ",U]},void 0,!0,void 0,this),o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H,R&&o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this),v&&o(b1,{children:[o(q0,{color:v.status==="active"?"green":v.status==="blocked"||v.status==="budget_limited"?"yellow":"gray",children:["goal:",v.status," ",v.objective.slice(0,32)]},void 0,!0,void 0,this),o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(q0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(j$,{flexDirection:"row",gap:1,children:!$?o(q0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):o(b1,{children:[z&&o(b1,{children:[W?o(q0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):o(q0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F!=="auto"&&o(b1,{children:[o(q0,{color:F==="fast"?"yellow":"gray",children:["Speed ",F]},void 0,!0,void 0,this),o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N!=="auto"&&o(b1,{children:[o(q0,{color:"gray",children:["Output ",N]},void 0,!0,void 0,this),o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B!=="auto"&&o(b1,{children:[o(q0,{color:"gray",children:["Style ",B]},void 0,!0,void 0,this),o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G&&o(q0,{color:"gray",children:G.model},void 0,!1,void 0,this),o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?o(q0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):o(q0,{color:K<20?"red":K<50?"yellow":"gray",children:[K,"%"]},void 0,!0,void 0,this),_>0.001&&o(b1,{children:[o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(q0,{color:"green",children:["$",_<0.01?_.toFixed(4):_.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w.length>0&&o(b1,{children:[o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(q0,{color:"yellow",children:["已排队 ",w.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b>0&&o(b1,{children:[o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(q0,{color:"cyan",children:["已恢复 ",b," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&o(b1,{children:[o(q0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(q0,{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 i2,Text as n2}from"ink";import J3 from"react";import{jsxDEV as E$}from"react/jsx-dev-runtime";var F6=J3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),U=Q>=$.length;if(Q>=J&&!U)Z=Q-J+1,X=Q+1;let G=$.slice(Z,X),K=$.length>J;return E$(i2,{flexDirection:"column",paddingX:2,paddingY:0,children:[G.map((q,W)=>{let F=Z+W===Q;return E$(i2,{flexDirection:"row",paddingX:1,gap:2,children:[E$(n2,{color:F?"cyan":"white",bold:F,children:q.command},void 0,!1,void 0,this),E$(n2,{color:F?"cyan":"gray",dimColor:!F,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),K&&E$(i2,{paddingX:1,children:E$(n2,{color:U?"cyan":"gray",bold:U,dimColor:!U,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as W1,Text as C1,useInput as o3,useStdout as i3}from"ink";import n3 from"ink-select-input";import AQ,{useMemo as x6}from"react";import{Box as K0,Text as B0}from"ink";import H$,{useEffect as wQ,useMemo as F$,useRef as m6}from"react";import{Box as KQ,Text as I6}from"ink";import W3 from"react";import{Text as A1}from"ink";import N3 from"react";import R6 from"string-width";import Z8 from"string-width";function t2({onlyFirst:$=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",$?void 0:"g")}var Y3=t2();function s2($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(Y3,"")}var H6=($=0)=>(Q)=>`\x1B[${Q+$}m`,W6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,L6=($=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]}},PG=Object.keys(j0.modifier),Z3=Object.keys(j0.color),X3=Object.keys(j0.bgColor),RG=[...Z3,...X3];function U3(){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=H6(),j0.color.ansi256=W6(),j0.color.ansi16m=L6(),j0.bgColor.ansi=H6(10),j0.bgColor.ansi256=W6(10),j0.bgColor.ansi16m=L6(10),Object.defineProperties(j0,{rgbToAnsi256:{value(Q,Y,J){if(Q===Y&&Y===J){if(Q<8)return 16;if(Q>248)return 231;return Math.round((Q-8)/247*24)+232}return 16+36*Math.round(Q/255*5)+6*Math.round(Y/255*5)+Math.round(J/255*5)},enumerable:!1},hexToRgb:{value(Q){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(Q.toString(16));if(!Y)return[0,0,0];let[J]=Y;if(J.length===3)J=[...J].map((X)=>X+X).join("");let Z=Number.parseInt(J,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(Q)=>j0.rgbToAnsi256(...j0.hexToRgb(Q)),enumerable:!1},ansi256ToAnsi:{value(Q){if(Q<8)return 30+Q;if(Q<16)return 90+(Q-8);let Y,J,Z;if(Q>=232)Y=((Q-232)*10+8)/255,J=Y,Z=Y;else{Q-=16;let G=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(G/6)/5,Z=G%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let U=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)U+=60;return U},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>j0.ansi256ToAnsi(j0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>j0.ansi256ToAnsi(j0.hexToAnsi256(Q)),enumerable:!1}}),j0}var G3=U3(),B6=G3;var n8=new Set(["\x1B","›"]),K3=39,$Q="\x07",A6="[",q3="]",P6="m",i8=`${q3}8;;`,w6=($)=>`${n8.values().next().value}${A6}${$}${P6}`,b6=($)=>`${n8.values().next().value}${i8}${$}${$Q}`,O3=($)=>$.split(" ").map((Q)=>Z8(Q)),e2=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,U=Z8(s2($.at(-1)));for(let[G,K]of J.entries()){let q=Z8(K);if(U+q<=Y)$[$.length-1]+=K;else $.push(K),U=0;if(n8.has(K))Z=!0,X=J.slice(G+1,G+1+i8.length).join("")===i8;if(Z){if(X){if(K===$Q)Z=!1,X=!1}else if(K===P6)Z=!1;continue}if(U+=q,U===Y&&G<J.length-1)$.push(""),U=0}if(!U&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},z3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(Z8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},_3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,U=O3($),G=[""];for(let[O,F]of $.split(" ").entries()){if(Y.trim!==!1)G[G.length-1]=G.at(-1).trimStart();let N=Z8(G.at(-1));if(O!==0){if(N>=Q&&(Y.wordWrap===!1||Y.trim===!1))G.push(""),N=0;if(N>0||Y.trim===!1)G[G.length-1]+=" ",N++}if(Y.hard&&U[O]>Q){let B=Q-N,_=1+Math.floor((U[O]-B-1)/Q);if(Math.floor((U[O]-1)/Q)<_)G.push("");e2(G,F,Q);continue}if(N+U[O]>Q&&N>0&&U[O]>0){if(Y.wordWrap===!1&&N<Q){e2(G,F,Q);continue}G.push("")}if(N+U[O]>Q&&Y.wordWrap===!1){e2(G,F,Q);continue}G[G.length-1]+=F}if(Y.trim!==!1)G=G.map((O)=>z3(O));let K=G.join(`
119
- `),q=[...K],W=0;for(let[O,F]of q.entries()){if(J+=F,n8.has(F)){let{groups:B}=new RegExp(`(?:\\${A6}(?<code>\\d+)m|\\${i8}(?<uri>.*)${$Q})`).exec(K.slice(W))||{groups:{}};if(B.code!==void 0){let _=Number.parseFloat(B.code);Z=_===K3?void 0:_}else if(B.uri!==void 0)X=B.uri.length===0?void 0:B.uri}let N=B6.codes.get(Number(Z));if(q[O+1]===`
120
- `){if(X)J+=b6("");if(Z&&N)J+=w6(N)}else if(F===`
121
- `){if(Z&&N)J+=w6(Z);if(X)J+=b6(X)}W+=F.length}return J};function QQ($,Q,Y){return String($).normalize().replaceAll(`\r
122
- `,`
123
- `).split(`
124
- `).map((J)=>_3(J,Q,Y)).join(`
125
- `)}var JQ=($)=>{let Q=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1");return R6(Q)};var y6=($)=>{return/[*_~`<[\]https?:]/.test($)},YQ=($)=>{let Y=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((J)=>J.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((J)=>R6(J)))},t8=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=QQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
126
- `).filter((U)=>U.length>0);return X.length>0?X:[""]},M6=($,Q,Y,J)=>{let Z=Math.max(0,Y-Q);if(J==="center"){let X=Math.floor(Z/2);return" ".repeat(X)+$+" ".repeat(Z-X)}if(J==="right")return" ".repeat(Z)+$;return $+" ".repeat(Z)};import{jsxDEV as H1,Fragment as H3}from"react/jsx-dev-runtime";var ZQ=2,XQ=1,UQ=2;function GQ($,Q){return`inline-${$}-${Q}`}var F3=({text:$})=>{let Q=b0();if(!y6($))return H1(A1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,U=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,G;while((G=U.exec($))!==null){if(G.index>J){let O=$.slice(J,G.index);Y.push(H1(A1,{children:O},GQ("text",Z++),!1,void 0,this))}let K=G[0],q=null,W=GQ("match",X++);try{if(K.startsWith("**")&&K.endsWith("**")&&K.length>ZQ*2)q=H1(A1,{bold:!0,children:K.slice(ZQ,-ZQ)},W,!1,void 0,this);else if(K.length>XQ*2&&(K.startsWith("*")&&K.endsWith("*")||K.startsWith("_")&&K.endsWith("_"))){let O=$.substring(G.index-1,G.index),F=$.substring(U.lastIndex,U.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(F)||/[./\\]/.test(O+F)))q=H1(A1,{italic:!0,children:K.slice(XQ,-XQ)},W,!1,void 0,this)}else if(K.startsWith("~~")&&K.endsWith("~~")&&K.length>UQ*2)q=H1(A1,{strikethrough:!0,children:K.slice(UQ,-UQ)},W,!1,void 0,this);else if(K.startsWith("`")&&K.endsWith("`")){let O=K.match(/^(`+)([^`]+)\1$/);if(O&&O[2])q=H1(A1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},W,!1,void 0,this)}else if(K.startsWith("[")&&K.includes("](")&&K.endsWith(")")){let O=K.match(/\[(.*?)\]\((.*?)\)/);if(O){let F=O[1],N=O[2];q=H1(A1,{children:[F,H1(A1,{color:Q.colors.info,children:[" (",N,")"]},void 0,!0,void 0,this)]},W,!0,void 0,this)}}else if(K.match(/^https?:\/\//))q=H1(A1,{color:Q.colors.info,children:K},W,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",K,O),q=null}Y.push(q??H1(A1,{children:K},W,!1,void 0,this)),J=U.lastIndex}if(J<$.length){let K=$.slice(J);Y.push(H1(A1,{children:K},GQ("text",Z++),!1,void 0,this))}return H1(H3,{children:Y.filter((K)=>K!==null)},void 0,!1,void 0,this)},P1=N3.memo(F3);import{jsxDEV as h$}from"react/jsx-dev-runtime";var L3="▎",C6=W3.memo(({lines:$,level:Q})=>{let Y=b0(),J=L3.repeat(Q);return h$(KQ,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return h$(KQ,{height:1},X,!1,void 0,this);return h$(KQ,{flexDirection:"row",children:[h$(I6,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),h$(I6,{italic:!0,wrap:"wrap",children:h$(P1,{text:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},X,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as e8,Text as j1}from"ink";import{isPlainObject as NQ}from"lodash-es";import{common as P3,createLowlight as R3}from"lowlight";import f6 from"react";import{Box as s8,Text as X8}from"ink";import V1,{Fragment as k6}from"react";import B3 from"string-width";var T6=new Map,v6=1000;function OQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=v6){let J=T6.get($);if(J)return J}let Y=Array.from($);if($.length<=v6)T6.set($,Y);return Y}var qQ=new Map;function D1($){if(/^[\x20-\x7E]*$/.test($))return $.length;if(qQ.has($))return qQ.get($);let Q=B3($);return qQ.set($,Q),Q}import{jsxDEV as g$}from"react/jsx-dev-runtime";var zQ=2,S6=V1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=b0(),U=[],G=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),zQ);function K(_){if(!V1.isValidElement(_))return;if(_.type===k6){V1.Children.forEach(_.props.children,K);return}if(_.type===s8){b3(_,Q,U);return}}V1.Children.forEach($,K);let W=U.length>G||Z>0?G-1:G,O=W!==void 0?Math.max(0,U.length-W):0,F=O+Z,B=(O>0?J==="top"?U.slice(O):U.slice(0,W):U).map((_,w)=>g$(s8,{children:_.length>0?_.map((b,A)=>g$(X8,{...b.props,children:b.text},A,!1,void 0,this)):g$(X8,{children:" "},void 0,!1,void 0,this)},w,!1,void 0,this));return g$(s8,{flexDirection:"column",width:Q,flexShrink:0,children:[F>0&&J==="top"&&g$(X8,{color:X.colors.text.muted,dimColor:!0,children:["... ",F," line",F===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),B,F>0&&J==="bottom"&&g$(X8,{color:X.colors.text.muted,dimColor:!0,children:["... ",F," line",F===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function w3($){if(!V1.isValidElement($)||$.type!==s8)return{noWrapSegments:[],segments:[]};let Q={noWrapSegments:[],segments:[]},Y=!1;function J(Z,X){if(Z===null||Z===void 0)return;if(typeof Z==="string"||typeof Z==="number"){let q=String(Z);if(!q)return;let W={text:q,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(!V1.isValidElement(Z))return;if(Z.type===k6){V1.Children.forEach(Z.props.children,(q)=>J(q,X));return}if(Z.type!==X8)return;let{children:U,...G}=Z.props,K=X===void 0?G:{...X,...G};V1.Children.forEach(U,(q)=>J(q,K))}return V1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function b3($,Q,Y){let J=w3($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=D1(O.text);if(J.segments.length===0){let O=[],F=[];for(let N of J.noWrapSegments){let B=N.text.split(`
127
- `);for(let _=0;_<B.length;_++){if(_>0)O.push(F),F=[];if(B[_])F.push({text:B[_],props:N.props})}}if(F.length>0)O.push(F);for(let N of O)Y.push(N);return}let X=Q-Z;if(X<1){A3(J.noWrapSegments,Q,Y);return}let U=[],G=[],K=0;function q(){if(U.length===0)U.push([...J.noWrapSegments,...G]);else if(Z>0)U.push([{text:" ".repeat(Z),props:{}},...G]);else U.push(G);G=[],K=0}function W(O,F){if(G.length>0&&G[G.length-1].props===F)G[G.length-1].text+=O;else G.push({text:O,props:F})}for(let O of J.segments){let F=O.text.split(`
128
- `);for(let N=0;N<F.length;N++){if(N>0)q();let _=F[N].split(/(\s+)/);for(let w of _){if(!w)continue;let b=D1(w);if(K+b>X&&K>0){if(q(),/^\s+$/.test(w))continue}if(b>X){let v=OQ(w);while(v.length>0){let M=0,z=0;for(let P of v){let H=D1(P);if(K+z+H>X)break;z+=H,M++}if(M>0){let P=v.slice(0,M).join("");W(P,O.props),K+=D1(P),v=v.slice(M)}if(v.length>0)q()}}else W(w,O.props),K+=b}}if(O.text.endsWith(`
129
- `))q()}if(G.length>0)q();for(let O of U)Y.push(O)}function A3($,Q,Y){let J=[],Z=[],X=0;for(let U of $){let G=U.text.split(`
130
- `);for(let K=0;K<G.length;K++){if(K>0)J.push(Z),Z=[],X=0;let q=G[K];if(!q)continue;let W=D1(q),O=Math.max(0,Q-D1("…"));if(W<=O&&X===0)Z.push({text:q,props:U.props}),X+=W;else{let F=OQ(q),N=X,B=0;for(let w of F){let b=D1(w);if(N+b>O)break;N+=b,B++}let _=F.slice(0,B).join("");if(_)Z.push({text:_,props:U.props});Z.push({text:"…",props:{}}),X=N+D1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let U of J)Y.push(U)}import{jsxDEV as Z1}from"react/jsx-dev-runtime";var _Q=R3(P3),y3=200,N$=new Map;function M3($,Q){let Y=`${Q??"__auto__"}:${$}`,J=N$.get(Y);if(J!==void 0)N$.delete(Y),N$.set(Y,J);return J}function I3($,Q,Y){let J=`${Q??"__auto__"}:${$}`;if(N$.size>=y3){let Z=N$.keys().next().value;if(Z!==void 0)N$.delete(Z)}N$.set(J,Y)}function C3($){return NQ($)&&$.type==="text"&&typeof $.value==="string"}function T3($){return NQ($)&&$.type==="element"}function v3($){return NQ($)&&$.type==="root"&&Array.isArray($.children)}function $2($,Q,Y=0){if(C3($))return Z1(j1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(T3($)){let J=$.properties?.className?.[0]||"",Z=Q.default;if(J.includes("comment"))Z=Q.comment;else if(J.includes("string"))Z=Q.string;else if(J.includes("number"))Z=Q.number;else if(J.includes("keyword"))Z=Q.keyword;else if(J.includes("function"))Z=Q.function;else if(J.includes("variable"))Z=Q.variable;else if(J.includes("operator"))Z=Q.operator;else if(J.includes("type"))Z=Q.type;else if(J.includes("tag"))Z=Q.tag;else if(J.includes("attr"))Z=Q.attr;let X=$.children?.map((U,G)=>$2(U,Q,G));return Z1(j1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(v3($))return Z1(f6.Fragment,{children:$.children.map((J,Z)=>$2(J,Q,Z))},Y,!1,void 0,this);return Z1(j1,{},Y,!1,void 0,this)}function k3($,Q,Y){let J=Y||d0.getTheme().colors.syntax;try{let Z=M3($,Q);if(Z)return $2(Z,J);let X;if(!Q||!_Q.registered(Q))X=_Q.highlightAuto($);else X=_Q.highlight(Q,$);let U=X;if(!U.children||U.children.length===0)return Z1(j1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return I3($,Q,X),$2(X,J)}catch(Z){return Z1(j1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var Q2=f6.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=b0(),U=$.split(`
131
- `),G=0;if(Z&&U.length>Z){let O=Math.max(Z,zQ);if(U.length>O)G=U.length-O,U=U.slice(G)}let K=U.length+G,q=String(K).length+1,W=Math.max(20,J-4);return Z1(e8,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&Z1(e8,{marginBottom:0,children:Z1(j1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),G>0&&Z1(e8,{marginBottom:0,children:Z1(j1,{color:X.colors.text.muted,dimColor:!0,children:["... ",G," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Z1(S6,{maxWidth:W,maxHeight:Z,children:U.map((O,F)=>{let N=F+G+1;return Z1(e8,{flexDirection:"row",children:[Y&&Z1(j1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(N).padStart(q-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?Z1(j1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):k3(O,Q,X.colors.syntax)]},F,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as D6,Text as K1,useInput as S3}from"ink";import f3,{useState as D3}from"react";import{jsxDEV as X1}from"react/jsx-dev-runtime";var V6=400;function V3($){let Q=$.split(`
132
- `),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let U=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(U)J=parseInt(U[1],10),Z=parseInt(U[3],10);Y.push({type:"header",content:X});continue}if(X.startsWith("-")){Y.push({type:"remove",content:X.substring(1),lineNumber:J}),J++;continue}if(X.startsWith("+")){Y.push({type:"add",content:X.substring(1),lineNumber:Z}),Z++;continue}if(X.startsWith(" ")||X===""){Y.push({type:"context",content:X.substring(1),lineNumber:Z}),J++,Z++;continue}}return Y}var FQ=f3.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let U=b0(),G=V3($),[K,q]=D3(!1);S3((A)=>{if(A.toLowerCase()==="e")q((v)=>!v)},{isActive:X&&G.length>Z});let O=Math.max(...G.map((A)=>A.lineNumber||0)).toString().length+1,F=G.filter((A)=>A.type==="add").length,N=G.filter((A)=>A.type==="remove").length,B=G.length,_=B>Z,w;if(!_)w=G;else if(K)w=G.slice(0,V6);else w=G.slice(0,Z);let b=B-w.length;return X1(D6,{flexDirection:"column",marginTop:1,marginBottom:1,children:[X1(K1,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),_&&X1(K1,{color:U.colors.info,children:[K?`已展开 ${w.length}/${B} 行`:`显示前 ${Z} 行,共 ${B} 行`," · ",X1(K1,{color:U.colors.success,children:["+",F]},void 0,!0,void 0,this)," ",X1(K1,{color:U.colors.error,children:["-",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_&&X1(K1,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),w.map((A,v)=>{if(A.type==="header")return X1(K1,{color:U.colors.muted,dimColor:!0,children:A.content},v,!1,void 0,this);let M=A.lineNumber?A.lineNumber.toString().padStart(O," "):" ".repeat(O),z=" ",P,H;if(A.type==="add")z="+",H=U.colors.success,P=void 0;else if(A.type==="remove")z="-",H=U.colors.error,P=void 0;else H=U.colors.text.primary;let R=Math.max(0,J-O-2),C=A.content;if(C.length>R)C=C.substring(0,R-3)+"...";return X1(K1,{color:H,backgroundColor:P,children:[X1(K1,{dimColor:!0,children:M},void 0,!1,void 0,this),X1(K1,{children:z},void 0,!1,void 0,this),X1(K1,{children:[" ",C]},void 0,!0,void 0,this)]},v,!0,void 0,this)}),_&&X1(D6,{marginTop:1,children:K?X1(K1,{color:U.colors.info,dimColor:!0,children:[b>0?`已达显示上限 ${V6} 行,仍有 ${b} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):X1(K1,{color:U.colors.info,dimColor:!0,children:["已隐藏剩余 ",b," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(K1,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as HQ,Text as j6}from"ink";import j3 from"react";import{jsxDEV as m$}from"react/jsx-dev-runtime";var E3=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,U=J.length;return m$(HQ,{paddingLeft:U+1,flexDirection:"row",children:[m$(HQ,{width:X,children:m$(j6,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),m$(HQ,{flexGrow:1,children:m$(j6,{wrap:"wrap",children:m$(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},WQ=j3.memo(E3);import{Text as LQ}from"ink";import h3,{useMemo as g3}from"react";import E6 from"string-width";import{jsxDEV as BQ}from"react/jsx-dev-runtime";var h6=4,p$=3,m3=4,g6=h3.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=b0(),Z=g3(()=>{if($.length===0||Q.length===0)return null;let O=$.length,F=$.map((H,R)=>{let C=Math.max(YQ(H),p$);for(let y of Q)C=Math.max(C,YQ(y[R]||""));return C}),N=$.map((H,R)=>{let C=Math.max(JQ(H),p$);for(let y of Q)C=Math.max(C,JQ(y[R]||""));return C}),B=1+O*3,_=Math.max(Y-B-h6,O*p$),w=F.reduce((H,R)=>H+R,0),b=N.reduce((H,R)=>H+R,0),A=!1,v;if(b<=_)v=N;else if(w<=_){let H=_-w,R=N.map((y,S)=>y-F[S]),C=R.reduce((y,S)=>y+S,0);v=F.map((y,S)=>{if(C===0)return y;let E=Math.floor(R[S]/C*H);return y+E})}else{A=!0;let H=_/w;v=F.map((R)=>Math.max(Math.floor(R*H),p$))}function M(){let H=1;for(let R=0;R<$.length;R++){let C=t8($[R],v[R],A);H=Math.max(H,C.length)}for(let R of Q)for(let C=0;C<R.length;C++){let y=t8(R[C]||"",v[C],A);H=Math.max(H,y.length)}return H}if(M()>m3)return{type:"vertical",columnWidths:v,needsHardWrap:A};return{type:"horizontal",columnWidths:v,needsHardWrap:A}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),F="─".repeat(O);return BQ(LQ,{children:Q.map((N,B)=>{let _=[];if(B>0)_.push(F);return N.forEach((w,b)=>{let A=$[b]||`Column ${b+1}`,v=(w||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${A}:\x1B[22m ${v}`)}),_.join(`
133
- `)}).join(`
134
- `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:U}=Z;function G(O){let N={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],B=N.left;return X.forEach((_,w)=>{B+=N.h.repeat(_+2),B+=w<X.length-1?N.mid:N.right}),B}function K(O,F){let N=O.map((b,A)=>{let v=X[A]||p$;return t8(b||"",v,U)}),B=Math.max(...N.map((b)=>b.length),1),_=N.map((b)=>Math.floor((B-b.length)/2)),w=[];for(let b=0;b<B;b++){let A="│";for(let v=0;v<O.length;v++){let M=N[v],z=_[v],P=b-z,H=P>=0&&P<M.length?M[P]:"",R=X[v]||p$,C=E6(H),y=M6(F?`\x1B[1m${H}\x1B[22m`:H,C,R,F?"center":"left");A+=` ${y} │`}w.push(A)}return w}let q=[];if(q.push(G("top")),q.push(...K($,!0)),q.push(G("middle")),Q.forEach((O,F)=>{if(q.push(...K(O,!1)),F<Q.length-1)q.push(G("middle"))}),q.push(G("bottom")),Math.max(...q.map((O)=>E6(O)))>Y-h6){let O=Math.min(Y-1,40),F="─".repeat(O);return BQ(LQ,{children:Q.map((N,B)=>{let _=[];if(B>0)_.push(F);return N.forEach((w,b)=>{let A=$[b]||`Column ${b+1}`,v=(w||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${A}:\x1B[22m ${v}`)}),_.join(`
135
- `)}).join(`
136
- `)},void 0,!1,void 0,this)}return BQ(LQ,{color:J.colors.text.primary,children:q.join(`
137
- `)},void 0,!1,void 0,this)});import{jsxDEV as h}from"react/jsx-dev-runtime";var p3=($,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:" "}}},c3=H$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=b0();if(J&&Z!==void 0){let U=$.split(`
138
- `),G=4,K=Math.max(1,Z-4);if(U.length>K){let q=U.slice(0,K).join(`
139
- `);return h(K0,{flexDirection:"column",flexShrink:0,children:[h(Q2,{content:q,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),h(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 h(Q2,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),x3=H$.memo(({content:$,level:Q})=>{let Y=b0();switch(Q){case 1:return h(B0,{bold:!0,color:Y.colors.primary,children:h(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return h(B0,{bold:!0,color:Y.colors.primary,children:h(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return h(B0,{bold:!0,color:Y.colors.text.primary,children:h(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return h(B0,{italic:!0,color:Y.colors.text.muted,children:h(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return h(B0,{children:h(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),u3=H$.memo(({terminalWidth:$})=>{let Q=b0(),Y=Math.max(0,Math.min($-4,80));return h(B0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),l3=H$.memo(({content:$})=>{return h(B0,{wrap:"wrap",children:h(P1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),d3=H$.memo(({content:$})=>{let Q=b0();return h(K0,{flexDirection:"row",gap:1,children:[h(B0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),h(B0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),r3=H$.memo(({detail:$,terminalWidth:Q})=>{let Y=b0(),J=50,Z=$.split(`
140
- `);while(Z.length>0&&Z[0].trim()==="")Z.shift();while(Z.length>0&&Z[Z.length-1].trim()==="")Z.pop();let X=Z.length>50,U=X?Z.slice(0,50):Z,G=U.join(`
141
- `),K=G.includes("<<<DIFF>>>"),q=G.includes("```");if(K){let W=G.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(W)try{let O=JSON.parse(W[1]);return h(K0,{flexDirection:"column",children:[h(FQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&h(K0,{marginTop:1,children:h(B0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(q){let W=G.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(W){let O=W[1]||"text",F=W[2];return h(K0,{flexDirection:"column",children:[h(Q2,{content:F,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&h(K0,{marginTop:1,children:h(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 h(K0,{flexDirection:"column",children:[U.map((W,O)=>h(B0,{color:Y.colors.text.primary,children:W},O,!1,void 0,this)),X&&h(K0,{marginTop:1,children:h(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 a3($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),U=Math.max(40,J*0.8),G=X*U;if($.length<=G)return{content:$,isTruncated:!1,hiddenLines:0};let K=Math.floor(G*0.9),q=$.length-K,W=q,O=$.indexOf(`
142
- `,q);if(O!==-1&&O-q<U)W=O+1;let F=$.slice(W),B=($.slice(0,W).match(/\n/g)||[]).length+1;return{content:F,isTruncated:!0,hiddenLines:B}}var t1=H$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:U=!1,noMargin:G=!1,renderPlainTextOnly:K=!1,streamingLines:q,streamingHiddenLines:W,messageId:O,blocksOverride:F,currentLineOverride:N,streamingMode:B="text",renderCodeBlocksAsPlainText:_=!1})=>{let w=b0(),b=F!==void 0,A=F$(()=>p3(Q,w.colors,J),[Q,w.colors,J]),{color:v,prefix:M}=A,z=M.length+1,P=F$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let k=J.subtaskRef;if(!k||typeof k!=="object")return null;return k},[J]),H=Q==="tool"&&J?.phase==="start",R=!G&&!H,C=F$(()=>{if(!K)return[];return $.split(/\r?\n/)},[$,K]);if(!b&&Z){let k=q??$.split(/\r?\n/),u=W??0,j=!1,m=!1,f=!1;if(B!=="text")j=B==="code",m=B==="diff",f=B==="table";return h(K0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:[u>0&&h(K0,{flexDirection:"row",flexShrink:0,children:[h(K0,{width:z,flexShrink:0},void 0,!1,void 0,this),h(B0,{color:w.colors.text.muted,dimColor:!0,children:["^ ",u," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),k.map((n,_0)=>{if(B==="text"){if(n.match(n1.codeBlock))j=!j;else if(n.match(n1.diffStart))m=!0;else if(n.match(n1.diffEnd))m=!1;else if(n.match(n1.table))f=!0;else if(f&&!n.match(n1.table))f=!1}let N0=B==="text"&&!j&&!m&&!f,m0=N0?n.match(n1.ulItem):null,D0=N0?n.match(n1.olItem):null,w0=m0??D0;return h(K0,{flexDirection:"row",flexShrink:0,children:[_0===0&&!U?h(K0,{marginRight:1,flexShrink:0,children:h(B0,{color:v,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this):h(K0,{width:z,flexShrink:0},void 0,!1,void 0,this),h(K0,{flexGrow:1,flexShrink:0,children:w0?h(WQ,{type:m0?"ul":"ol",marker:w0[2],itemText:w0[3],leadingWhitespace:w0[1]},void 0,!1,void 0,this):h(B0,{wrap:"wrap",children:n===""?" ":n},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},_0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!b&&K)return h(K0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:C.map((k,u)=>h(K0,{flexDirection:"row",flexShrink:0,children:[u===0&&!U?h(K0,{marginRight:1,flexShrink:0,children:h(B0,{color:v,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this):h(K0,{width:z,flexShrink:0},void 0,!1,void 0,this),h(K0,{flexGrow:1,flexShrink:0,children:h(B0,{wrap:"wrap",children:k===""?" ":k},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},u,!0,void 0,this))},void 0,!1,void 0,this);let y=m6(null);wQ(()=>{y.current=null},[O]);let S=F$(()=>{if(b)return null;if(!O)return null;return p6(O)},[O,b]);wQ(()=>{if(b)return;if(!S||!O)return;y.current={messageId:O,blocks:S}},[S,O,b]),wQ(()=>{if(b)return;if(!S||!O)return;c6(O)},[S,O,b]);let E=F$(()=>b?{content:$,isTruncated:!1,hiddenLines:0}:a3($,X,Z,Y),[$,X,Z,Y,b]),{content:c,isTruncated:J0,hiddenLines:l}=E;if(!b&&Q==="tool"&&J&&"detail"in J){let k=J;if(k.detail)return h(K0,{flexDirection:"column",marginBottom:G?0:1,children:[h(K0,{flexDirection:"row",children:[h(K0,{marginRight:1,children:h(B0,{color:v,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(B0,{color:v,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(K0,{marginLeft:M.length+1,children:h(r3,{detail:k.detail,terminalWidth:Y-(M.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:T,currentLine:L}=F$(()=>{if(b)return{completedContent:"",currentLine:N??""};if(!Z)return{completedContent:c,currentLine:""};let k=c.lastIndexOf(`
143
- `);if(k===-1)return{completedContent:"",currentLine:c};return{completedContent:c.slice(0,k+1),currentLine:c.slice(k+1)}},[c,Z,b,N]),I=m6({content:"",blocks:[]}),V=F$(()=>{if(b)return F??[];if(S)return S;if(y.current&&y.current.messageId===O)return y.current.blocks;let k=I.current;if(!Z||!T.startsWith(k.content)){let f=bQ(T);return I.current={content:T,blocks:f},f}if(T===k.content)return k.blocks;let u=T.slice(k.content.length),j=bQ(u),m=[...k.blocks,...j];return I.current={content:T,blocks:m},m},[T,Z,b,F]);return h(K0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:[J0&&h(K0,{flexDirection:"row",flexShrink:0,children:[h(K0,{width:z,flexShrink:0},void 0,!1,void 0,this),h(B0,{color:w.colors.text.muted,dimColor:!0,children:["^ ",l," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V.map((k,u)=>{if(k.type==="empty")return h(K0,{height:1,flexShrink:0},u,!1,void 0,this);return h(K0,{flexDirection:"row",flexShrink:0,children:[u===0&&!U&&h(K0,{marginRight:1,flexShrink:0,children:h(B0,{color:v,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),(u>0||U)&&h(K0,{width:z,flexShrink:0},void 0,!1,void 0,this),h(K0,{flexGrow:1,flexShrink:0,children:k.type==="code"?_?h(B0,{wrap:"wrap",children:k.content},void 0,!1,void 0,this):h(c3,{content:k.content,language:k.language,terminalWidth:Y-z,isPending:Z,availableHeight:X},void 0,!1,void 0,this):k.type==="table"&&k.tableData?h(g6,{headers:k.tableData.headers,rows:k.tableData.rows,terminalWidth:Y-z},void 0,!1,void 0,this):k.type==="heading"?h(x3,{content:k.content,level:k.level||1},void 0,!1,void 0,this):k.type==="list"?h(WQ,{type:k.listType||"ul",marker:k.marker||"-",itemText:k.content,leadingWhitespace:" ".repeat(k.indentation||0)},void 0,!1,void 0,this):k.type==="hr"?h(u3,{terminalWidth:Y-z},void 0,!1,void 0,this):k.type==="diff"&&k.diffData?h(FQ,{patch:k.diffData.patch,startLine:k.diffData.startLine,matchLine:k.diffData.matchLine,terminalWidth:Y-z},void 0,!1,void 0,this):k.type==="command-message"?h(d3,{content:k.content},void 0,!1,void 0,this):k.type==="blockquote"&&k.blockquoteLines?h(C6,{lines:k.blockquoteLines,level:k.blockquoteLevel||1},void 0,!1,void 0,this):h(l3,{content:k.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},u,!0,void 0,this)}),L&&h(K0,{flexDirection:"row",flexShrink:0,children:[V.length===0&&!U?h(K0,{marginRight:1,flexShrink:0,children:h(B0,{color:v,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this):h(K0,{width:z,flexShrink:0},void 0,!1,void 0,this),h(K0,{flexGrow:1,flexShrink:0,children:h(B0,{wrap:"wrap",children:L},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P&&h(K0,{flexDirection:"row",flexShrink:0,children:[h(K0,{width:z,flexShrink:0},void 0,!1,void 0,this),h(K0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[h(B0,{color:w.colors.text.muted,children:["Subtask"," ",typeof P.agentType==="string"?`@${P.agentType}`:"",typeof P.status==="string"?` · ${P.status}`:""]},void 0,!0,void 0,this),typeof P.summary==="string"&&P.summary.trim()!==""&&h(B0,{wrap:"wrap",children:P.summary},void 0,!1,void 0,this),typeof P.childSessionId==="string"&&h(B0,{color:w.colors.text.muted,children:["Session ",P.childSessionId]},void 0,!0,void 0,this),typeof P.resumedFrom==="string"&&h(B0,{color:w.colors.text.muted,children:["Resumed from ",P.resumedFrom,typeof P.resumeDepth==="number"?` · depth ${P.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 $Z}from"react/jsx-dev-runtime";var t3=AQ.memo(({label:$,isSelected:Q})=>I0(C1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),s3=AQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0($Z,{children:[I0(W1,{marginBottom:1,children:I0(C1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&I0(W1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[I0(C1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(W1,{marginTop:1,children:I0(t1,{content:$.planContent,role:"assistant",terminalWidth:Z-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&I0(W1,{flexDirection:"column",marginBottom:1,children:I0(t1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&I0(W1,{flexDirection:"column",marginBottom:1,children:[I0(C1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,U)=>I0(W1,{marginLeft:2,children:I0(C1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},U,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&I0(W1,{flexDirection:"column",marginBottom:1,children:[I0(C1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,U)=>I0(W1,{marginLeft:2,children:I0(C1,{children:["• ",X]},void 0,!0,void 0,this)},U,!1,void 0,this)),$.affectedFiles.length>3&&I0(W1,{marginLeft:2,children:I0(C1,{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 e3($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var u6=AQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=i3(),J=Y.columns||80,X=s0()==="confirmation-prompt",U=k0(!1),G=$.type==="exitPlanMode",K=$.type==="enterPlanMode",q=$.type==="maxTurnsExceeded",W=$.type==="mcpSampling";o3((N,B)=>{if(B.ctrl&&N==="c"||B.meta&&N==="c"){U();return}if(B.escape){Q({approved:!1,reason:"用户取消"});return}let _=N.toLowerCase();if(G){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(K){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(q){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=x6(()=>{if(G)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(K)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(q)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(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:"用户拒绝"}}]},[G,K,q,W]),F=x6(()=>{if(G)return{color:"cyan",title:"方案审核"};if(K)return{color:"magenta",title:"进入规划模式"};if(q)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[G,K,q,$.title]);return I0(W1,{flexDirection:"column",borderStyle:"round",borderColor:X?F.color:"gray",padding:1,children:[I0(W1,{marginBottom:1,children:I0(C1,{bold:!0,color:F.color,children:F.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(s3,{details:$,headerColor:F.color,isPlanModeExit:G,isPlanModeEnter:K,terminalWidth:J},void 0,!1,void 0,this),I0(W1,{flexDirection:"column",children:[I0(C1,{color:"gray",children:e3(G,K,q,W)},void 0,!1,void 0,this),I0(n3,{items:O,isFocused:X,itemComponent:t3,onSelect:(N)=>{Q(N.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 Y0,useInput as QZ}from"ink";import l6 from"ink-text-input";import{useState as E1}from"react";import{jsxDEV as g}from"react/jsx-dev-runtime";var U8=[{action:"add",description:"Add a new hook"},{action:"status",description:"Show hooks status"},{action:"list",description:"List all configured hooks"},{action:"trust",description:"Trust the current project hook digest"},{action:"revoke",description:"Revoke project hook trust"}],J2=[{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"}],Y2=[{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"}],JZ=[`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"],d6=({onClose:$,onSave:Q})=>{let Y=d0.getTheme(),[J,Z]=E1("action"),[X,U]=E1(0),[G,K]=E1(0),[q,W]=E1(0),[O,F]=E1(""),[N,B]=E1(""),[_,w]=E1(null),[b,A]=E1(!1),[v,M]=E1(null),z=U8[X],P=Y2[G],H=J2[q],R=()=>{if(v){M(null);return}switch(J){case"action":$();break;case"event":Z("action");break;case"matcher":Z("event");break;case"command":Z("matcher");break;case"location":Z("command");break;case"confirm":Z("location");break}};QZ((L,I)=>{if(I.escape){R();return}if(J==="action"){if(I.upArrow)U((V)=>V>0?V-1:U8.length-1);else if(I.downArrow)U((V)=>V<U8.length-1?V+1:0);else if(I.return)C()}else if(J==="event"){if(I.upArrow)K((V)=>V>0?V-1:Y2.length-1);else if(I.downArrow)K((V)=>V<Y2.length-1?V+1:0);else if(I.return)Z("matcher")}else if(J==="location"){if(I.upArrow)W((V)=>V>0?V-1:J2.length-1);else if(I.downArrow)W((V)=>V<J2.length-1?V+1:0);else if(I.return)Z("confirm")}else if(J==="confirm"){if(I.return)T()}});let C=()=>{let L=U8[X].action;if(L==="add")Z("event");else if(L==="status")y();else if(L==="list")c();else if(L==="trust")S();else if(L==="revoke")E()},y=async()=>{let L=F1.getInstance(),I=L.isEnabled(A0()),V=L.getConfig(A0()),k=await L.getTrustStatus(A0()),u={};for(let m of Object.values(RQ)){let f=V[m];if(f&&Array.isArray(f)){let n=f.reduce((_0,N0)=>_0+(N0.hooks?.length||0),0);if(n>0)u[m]=n}}let j=[`Status: ${I?"Enabled":"Disabled"}`,`Trust: ${k.state}`,`Digest: ${k.currentDigest??"none"}`,""];if(Object.keys(u).length>0){j.push("Configured hooks:");for(let[m,f]of Object.entries(u))j.push(` ${m}: ${f} hook(s)`)}else j.push("No hooks configured");M(j.join(`
144
- `))},S=async()=>{try{let L=await F1.getInstance().trustProject(A0());M(`Trust: ${L.state}
145
- Digest: ${L.currentDigest??"none"}`)}catch(L){w(L instanceof Error?L.message:"Failed to trust hooks")}},E=async()=>{try{let L=await F1.getInstance().revokeProjectTrust(A0());M(`Trust: ${L.state}`)}catch(L){w(L instanceof Error?L.message:"Failed to revoke hook trust")}},c=()=>{let I=F1.getInstance().getConfig(A0()),V=[],k=!1;for(let u of Object.values(RQ)){let j=I[u];if(!j||!Array.isArray(j)||j.length===0)continue;k=!0,V.push(`${u}:`);for(let m of j){let f=m.matcher,n="all";if(f?.tools)n=`tools: ${Array.isArray(f.tools)?f.tools.join(", "):f.tools}`;V.push(` [${n}]`);for(let _0 of m.hooks||[])if(_0.type==="command")V.push(` -> ${_0.command}`)}V.push("")}if(!k)V.push("No hooks configured"),V.push(""),V.push("Configure hooks in .blade/settings.local.json");M(V.join(`
146
- `))},J0=()=>{Z("command")},l=()=>{if(!N.trim()){w("Command cannot be empty");return}w(null),Z("location")},T=async()=>{A(!0),w(null);try{let L=F1.getInstance(),I=await import("node:fs/promises"),V=await import("node:path"),k=await import("node:os"),u={matcher:O.trim()?{tools:O.trim()}:{},hooks:[{type:"command",command:N.trim()}]},j;switch(H.location){case"local":j=V.join(A0(),".blade","settings.local.json");break;case"project":j=V.join(A0(),".blade","settings.json");break;case"user":j=V.join(k.homedir(),".blade","settings.json");break}await I.mkdir(V.dirname(j),{recursive:!0});let m={};try{let N0=await I.readFile(j,"utf-8");m=JSON.parse(N0)}catch{}let f=m.hooks||{},n=f[P.event]||[],_0={...f,enabled:!0,[P.event]:[...n,u]};if(m.hooks=_0,await I.writeFile(j,JSON.stringify(m,null,2),"utf-8"),await L.reloadConfig(),Q)Q({event:P.event,matcher:O.trim(),command:N.trim()});$()}catch(L){w(`Failed to save hook: ${L instanceof Error?L.message:"Unknown error"}`),A(!1)}};return g(L0,{flexDirection:"column",padding:1,children:[g(L0,{marginBottom:1,children:g(Y0,{bold:!0,color:Y.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(L0,{marginBottom:1,children:g(Y0,{color:Y.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),v&&g(L0,{flexDirection:"column",marginBottom:1,children:[g(Y0,{children:v},void 0,!1,void 0,this),g(L0,{marginTop:1,children:g(Y0,{color:Y.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),J==="action"&&!v&&g(L0,{flexDirection:"column",children:[g(L0,{flexDirection:"column",marginTop:1,children:U8.map((L,I)=>g(L0,{children:[g(Y0,{color:I===X?Y.colors.primary:void 0,bold:I===X,children:[I===X?"> ":" ",L.action]},void 0,!0,void 0,this),g(Y0,{color:Y.colors.muted,children:[" - ",L.description]},void 0,!0,void 0,this)]},L.action,!0,void 0,this))},void 0,!1,void 0,this),g(L0,{marginTop:1,children:g(Y0,{color:Y.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),J==="event"&&g(L0,{flexDirection:"column",children:[g(Y0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),g(L0,{flexDirection:"column",marginTop:1,children:Y2.map((L,I)=>g(L0,{children:[g(Y0,{color:I===G?Y.colors.primary:void 0,bold:I===G,children:[I===G?"> ":" ",L.event]},void 0,!0,void 0,this),g(Y0,{color:Y.colors.muted,children:[" - ",L.description]},void 0,!0,void 0,this)]},L.event,!0,void 0,this))},void 0,!1,void 0,this),g(L0,{marginTop:1,children:g(Y0,{color:Y.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),J!=="event"&&g(L0,{marginBottom:1,children:g(Y0,{children:["Event:"," ",g(Y0,{bold:!0,color:Y.colors.primary,children:P.event},void 0,!1,void 0,this),g(Y0,{color:Y.colors.muted,children:[" - ",P.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(J==="matcher"||J==="command"||J==="confirm")&&g(L0,{flexDirection:"column",marginBottom:1,children:[g(Y0,{color:Y.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),g(Y0,{color:Y.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),g(Y0,{color:Y.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),g(Y0,{color:Y.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),J==="matcher"&&g(L0,{flexDirection:"column",children:[g(L0,{children:[g(Y0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),g(l6,{value:O,onChange:F,onSubmit:J0,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(L0,{marginTop:1,children:g(Y0,{color:Y.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),g(L0,{marginTop:1,children:g(Y0,{color:Y.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),(J==="command"||J==="confirm")&&g(L0,{marginBottom:1,children:g(Y0,{children:["Matcher: ",g(Y0,{bold:!0,children:O||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),J==="command"&&g(L0,{flexDirection:"column",children:[g(L0,{children:g(Y0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(L0,{borderStyle:"single",borderColor:Y.colors.border.light,paddingX:1,marginTop:1,children:g(l6,{value:N,onChange:B,onSubmit:l,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(L0,{flexDirection:"column",marginTop:1,children:[g(Y0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),JZ.map((L,I)=>g(Y0,{color:Y.colors.muted,children:["• ",L]},I,!0,void 0,this))]},void 0,!0,void 0,this),g(L0,{marginTop:1,children:g(Y0,{color:Y.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),J==="location"&&g(L0,{flexDirection:"column",children:[g(L0,{flexDirection:"column",borderStyle:"round",borderColor:Y.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[g(Y0,{bold:!0,color:Y.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),g(Y0,{children:" "},void 0,!1,void 0,this),g(Y0,{children:[" ","Event: ",P.event," - ",P.description]},void 0,!0,void 0,this),g(Y0,{children:[" Matcher: ",O||"(all)"]},void 0,!0,void 0,this),g(Y0,{children:[" Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(Y0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),g(L0,{flexDirection:"column",marginTop:1,children:J2.map((L,I)=>g(L0,{children:[g(Y0,{color:I===q?Y.colors.primary:void 0,bold:I===q,children:[I===q?"> ":" ",I+1,". ",L.name]},void 0,!0,void 0,this),g(Y0,{color:Y.colors.muted,children:[" ",L.description]},void 0,!0,void 0,this)]},L.location,!0,void 0,this))},void 0,!1,void 0,this),g(L0,{marginTop:1,children:g(Y0,{color:Y.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),J==="confirm"&&g(L0,{flexDirection:"column",children:[g(L0,{flexDirection:"column",borderStyle:"round",borderColor:Y.colors.success,paddingX:2,paddingY:1,children:[g(Y0,{bold:!0,children:["Saving hook to ",H.description,"..."]},void 0,!0,void 0,this),g(Y0,{children:" "},void 0,!1,void 0,this),g(Y0,{children:["Event: ",P.event]},void 0,!0,void 0,this),g(Y0,{children:["Matcher: ",O||"(all tools)"]},void 0,!0,void 0,this),g(Y0,{children:["Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(L0,{marginTop:1,children:g(Y0,{color:Y.colors.muted,children:b?"Saving...":"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_&&g(L0,{marginTop:1,children:g(Y0,{color:Y.colors.error,children:_},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as q9}from"ahooks";import{Box as wZ,Text as bZ}from"ink";import AZ from"react";import{useMemoizedFn as X2}from"ahooks";import L$ from"chalk";import{Text as FZ,useInput as HZ}from"ink";import{useEffect as U9,useRef as U2}from"react";var Z2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var W$="\x1B",YZ=`${W$}[200~`,ZZ=`${W$}[201~`,XZ="[200~",UZ="[201~",GZ=[`${W$}[I`,`${W$}[O`,"[I","[O"],o6=`${W$}[?2004h`,i6=`${W$}[?2004l`,MQ=`${W$}[?1004l`,KZ=[YZ,XZ],qZ=[ZZ,UZ];function n6(){return{pasteBuffer:null,pasteOverflowed:!1}}function r6($,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 a6($){return GZ.some((Q)=>$===Q)}function t6($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,U=[];while(Y.length>0){if(J!==null){let q=r6(Y,qZ);if(!q){if(J.length+Y.length>yQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+q.index>yQ)Z=!0;else if(!Z)J+=Y.slice(0,q.index),U.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length);continue}let G=r6(Y,KZ);if(!G){if(a6(Y))X=!0;else U.push({kind:"text",text:Y});Y="";break}let K=Y.slice(0,G.index);if(K&&!a6(K))U.push({kind:"text",text:K});J="",Z=!1,X=!0,Y=Y.slice(G.index+G.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:U}}import{execSync as c$}from"node:child_process";import{existsSync as OZ,readFileSync as IQ}from"node:fs";import{basename as s6,isAbsolute as zZ}from"node:path";function e6($){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 $9(){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 _Z(){let{commands:$}=$9();try{return c$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function Q9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function J9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function CQ($){let Q=Q9($.trim()),Y=J9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function NZ($){let Q=Q9($.trim()),Y=J9(Q);if(CQ(Y))return Y;return null}async function Y9($){let Q=NZ($);if(!Q)return null;let Y;try{if(zZ(Q))Y=IQ(Q);else{let U=_Z();if(U&&Q===s6(U))Y=IQ(U);else return null}}catch(U){return console.error("Failed to read image file:",U),null}let J=Y.toString("base64"),Z=e6(J),X=s6(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function Z9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return c$(Y,{encoding:"utf-8"})||null}catch{return null}}async function X9(){let{commands:$,screenshotPath:Q}=$9();try{if(c$($.checkImage,{stdio:"ignore"}),c$($.saveImage(Q),{stdio:"ignore"}),!OZ(Q))return null;let J=IQ(Q).toString("base64"),Z=e6(J);return c$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{c$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as BZ}from"react/jsx-dev-runtime";var WZ=/\r\n/g,LZ=/\r/g;function TQ($){if(!$.includes("\r"))return $;return $.replace(WZ,`
147
- `).replace(LZ,`
148
- `)}function G9($,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 K9({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:U,onImagePaste:G,disabledKeys:K=[]}){let q=U2(n6()),W=U2($),O=U2(Z),F=U2(null);U9(()=>{W.current=$,O.current=Z},[$,Z]),U9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let N=X2((M,z)=>{let P=W.current,H=O.current;if(W.current=M,O.current=z,M!==P)J(M);if(z!==H)X(z)}),B=X2((M)=>{if(!M)return;let{newValue:z,newCursorPosition:P}=G9(TQ(M),W.current,O.current);N(z,P)}),_=X2(async(M)=>{let z=TQ(M);if(!z)return;if(G&&CQ(z))try{let H=await Y9(z);if(H){let R=await G(H.base64,H.mediaType,H.filename);if(R?.prompt)B(R.prompt);return}}catch(H){console.error("Failed to process image path:",H)}if((z.length>Z2.LARGE_INPUT_THRESHOLD||z.includes(`
149
- `))&&U){let H=await U(z);if(H?.prompt){B(H.prompt);return}}B(z)}),w=X2((M)=>{let z=F.current;if(!z){try{let H=M();if(!H)return;let R=H.catch(()=>{return});F.current=R,R.finally(()=>{if(F.current===R)F.current=null})}catch{}return}let P=z.then(M).then(()=>{return}).catch(()=>{return});F.current=P,P.finally(()=>{if(F.current===P)F.current=null})});HZ((M,z)=>{w(()=>{let P=TQ(M),H=t6(q.current,P);if(q.current=H.state,H.handled)return(async()=>{for(let c of H.segments)if(c.kind==="paste")await _(c.text);else B(c.text)})();if(K.some((c)=>z[c])||z.ctrl&&M==="c"||z.ctrl&&M==="l"||z.ctrl&&M==="t"||z.ctrl&&M==="o"||z.meta&&M==="l"||z.meta&&M==="t"||z.meta&&M==="o"||z.shift&&z.tab||P==="?"&&W.current==="")return;let C=W.current,y=O.current,S=y,E=C;if(z.leftArrow)S--;else if(z.rightArrow)S++;else if(z.backspace||z.delete){if(M===""){if(y>0)E=C.slice(0,y-1)+C.slice(y,C.length),S--}else if(y<C.length)E=C.slice(0,y)+C.slice(y+1,C.length)}else if(z.ctrl&&P==="a")S=0;else if(z.ctrl&&P==="e")S=C.length;else if(z.ctrl&&P==="k")E=C.slice(0,y);else if(z.ctrl&&P==="u")E=C.slice(y),S=0;else if(z.ctrl&&P==="w"){let J0=C.slice(0,y).match(/\s*\S+\s*$/);if(J0){let l=J0[0].length;E=C.slice(0,y-l)+C.slice(y),S-=l}}else if(z.ctrl&&P==="v"){let c=process.platform==="darwin";return(async()=>{if(G){let l=await X9();if(l){let T=await G(l.base64,l.mediaType,"clipboard.png");if(T?.prompt)B(T.prompt);return}}if(c)return;let J0=await Z9();if(J0)await _(J0)})()}else if(z.pageUp)S=0;else if(z.pageDown)S=C.length;else if(P===`
150
- `&&(z.shift||z.meta)){let{newValue:c,newCursorPosition:J0}=G9(P,C,y);N(c,J0);return}else if(!z.ctrl&&!z.meta){if(U&&(P.length>Z2.LARGE_INPUT_THRESHOLD||P.includes(`
151
- `)))return _(P);E=C.slice(0,y)+P+C.slice(y,C.length),S+=P.length}if(S<0)S=0;if(S>E.length)S=E.length;N(E,S)})},{isActive:Y});let b=Y,A=$,v=Q?L$.grey(Q):void 0;if(b)if(v=Q.length>0?L$.inverse(Q[0])+L$.grey(Q.slice(1)):L$.inverse(" "),$.length===0)A=L$.inverse(" ");else{A="";for(let M=0;M<$.length;M++)if(M===Z&&Z<$.length)A+=L$.inverse($[M]);else A+=$[M];if(Z>=$.length)A+=L$.inverse(" ")}return BZ(FZ,{children:Q?$.length>0?A:v:A},void 0,!1,void 0,this)}import{jsxDEV as vQ}from"react/jsx-dev-runtime";var O9=AZ.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let G=s0()==="main-input",K=$.trimStart().startsWith("!"),q=q9((O)=>{let F=O.split(`
152
- `).length,N=O.length,B=500,_=10;if(N>500||F>10){let w=Z(O),b=O.slice(0,30).replace(/\n/g," "),A=`${N} chars, ${F} lines: ${b}...`;return{prompt:`${u8(w)}${A}${p2()}`}}return{}}),W=q9(async(O,F,N)=>{try{let B=X(O,F);return{prompt:`${u8(B)}[Image #${B}]${p2()}`}}catch(B){return console.error("[Image Paste] Failed to process image:",B),{prompt:`[Image paste failed: ${B instanceof Error?B.message:"Unknown error"}] `}}});return vQ(wZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[vQ(bZ,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),vQ(K9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:q,onImagePaste:W,placeholder:" 输入命令...",focus:G,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as G2,Text as R1}from"ink";import IZ,{useEffect as CZ,useState as TZ}from"react";import{useEffect as MZ,useState as F9}from"react";import{useEffect as PZ,useState as RZ}from"react";var yZ=15000,z9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],_9=["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 N9($,Q,Y=!1){let[J,Z]=RZ("");return PZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let q=Math.floor(Math.random()*_9.length);return _9[q]}let K=Math.floor(Math.random()*z9.length);return z9[K]};Z(X());let U=setInterval(()=>{Z(X())},yZ);return()=>{clearInterval(U)}},[$,Q,Y]),J}function H9($,Q=!1,Y=!1){let[J,Z]=F9(0),[X,U]=F9(null),G=N9($,Q,Y);return MZ(()=>{if(!$){Z(0),U(null);return}if(Y)return;if(X===null)U(Date.now());let K=setInterval(()=>{if(X!==null){let q=Math.floor((Date.now()-X)/1000);Z(q)}},1000);return()=>{clearInterval(K)}},[$,X,Y]),{currentPhrase:G,elapsedTime:J}}import{jsxDEV as e0,Fragment as kZ}from"react/jsx-dev-runtime";var kQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],vZ=80;function W9($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var L9=IZ.memo(({message:$,paused:Q=!1})=>{let Y=a1(),J=P8(),Z=Y||!J,[X,U]=TZ(0),G=b0(),q=D$()>=vZ,{currentPhrase:W,elapsedTime:O}=H9(Z,!1,Q);if(CZ(()=>{if(!Z||Q){U(0);return}let N=setInterval(()=>{U((B)=>(B+1)%kQ.length)},150);return()=>clearInterval(N)},[Z,Q]),!Z)return null;let F=$||W||"正在思考中...";if(q)return e0(G2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[e0(R1,{color:G.colors.warning,bold:!0,children:kQ[X]},void 0,!1,void 0,this),e0(R1,{color:G.colors.text.primary,children:F},void 0,!1,void 0,this),O>0&&e0(kZ,{children:[e0(R1,{color:G.colors.muted,children:"|"},void 0,!1,void 0,this),e0(R1,{color:G.colors.info,children:["已用时: ",W9(O)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e0(R1,{color:G.colors.muted,children:"|"},void 0,!1,void 0,this),e0(R1,{color:G.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return e0(G2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[e0(G2,{flexDirection:"row",gap:1,children:[e0(R1,{color:G.colors.warning,bold:!0,children:kQ[X]},void 0,!1,void 0,this),e0(R1,{color:G.colors.text.primary,children:F},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O>0&&e0(G2,{marginLeft:2,flexDirection:"row",gap:1,children:[e0(R1,{color:G.colors.info,children:["已用时: ",W9(O)]},void 0,!0,void 0,this),e0(R1,{color:G.colors.muted,children:"|"},void 0,!1,void 0,this),e0(R1,{color:G.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as O2,Text as f0,useInput as SZ,useStdout as fZ}from"ink";import DZ from"ink-text-input";import VZ,{useCallback as K2,useEffect as jZ,useMemo as EZ,useState as B$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var A9=VZ.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=fZ(),J=Y.columns||80,Z=s0()==="confirmation-prompt",X=k0(!1),U=$.fields??[],[G,K]=B$("field"),[q,W]=B$(0),[O,F]=B$(()=>B9($)),[N,B]=B$(""),[_,w]=B$(0),[b,A]=B$([]),[v,M]=B$(),z=U[q],P=EZ(()=>hZ(z),[z]);jZ(()=>{if(!z)return;let S=O[z.name];B(typeof S==="string"||typeof S==="number"?String(S):""),A(Array.isArray(S)?[...S]:[]);let E=P.findIndex((c)=>c.value===String(S));w(E>=0?E:0),M(void 0)},[O,z,P]);let H=K2((S)=>{if(F(S),q<U.length-1){W((E)=>E+1);return}K("review")},[q,U.length]),R=K2((S)=>{if(!z)return;let E={...O};if(S===void 0)delete E[z.name];else E[z.name]=S;H(E)},[O,z,H]),C=K2((S)=>{if(!z)return;try{R(w9(z,S))}catch(E){M(E instanceof Error?E.message:String(E))}},[z,R]),y=K2(()=>{try{let S=b9($,{action:"accept",content:O});Q({action:S.action,...S.content?{content:S.content}:{}})}catch(S){M(S instanceof Error?S.message:String(S))}},[O,$,Q]);if(SZ((S,E)=>{if(E.ctrl&&S==="c"||E.meta&&S==="c"){X();return}if(E.escape){Q({action:"cancel"});return}if($.mode==="url"){if(S.toLowerCase()==="y")Q({action:"accept"},!0);else if(S.toLowerCase()==="n")Q({action:"decline"});return}if(G==="review"){if(S.toLowerCase()==="y"||E.return)y();else if(S.toLowerCase()==="e")W(0),K("field");else if(S.toLowerCase()==="d")Q({action:"decline"});return}if(!z){if(E.return)y();return}if(SQ(z))return;if(S.toLowerCase()==="d"){Q({action:"decline"});return}if(E.upArrow){w((c)=>c>0?c-1:Math.max(P.length-1,0));return}if(E.downArrow||E.tab){w((c)=>c<P.length-1?c+1:0);return}if(S===" "&&z.type==="multi-select"){let c=P[_];if(c)A((J0)=>J0.includes(c.value)?J0.filter((l)=>l!==c.value):[...J0,c.value]);return}if(E.return)if(z.type==="multi-select")R(b);else{let c=P[_];if(c)R(c.typedValue)}},{isActive:Z}),$.mode==="url")return F0(q2,{width:J,color:"yellow",children:[F0(f0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),F0(f0,{children:$.message},void 0,!1,void 0,this),F0(f0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),F0(f0,{children:["Domain: ",F0(f0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(f0,{wrap:"wrap",children:["URL: ",F0(f0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(f0,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(G==="review")return F0(q2,{width:J,color:"green",children:[F0(f0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),F0(f0,{children:$.message},void 0,!1,void 0,this),U.map((S)=>F0(f0,{children:[S.title,": ",mZ(O[S.name])]},S.name,!0,void 0,this)),v&&F0(f0,{color:"red",children:v},void 0,!1,void 0,this),F0(f0,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!z)return F0(q2,{width:J,color:"cyan",children:[F0(f0,{children:$.message},void 0,!1,void 0,this),F0(f0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),F0(f0,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return F0(q2,{width:J,color:"cyan",children:[F0(f0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),F0(f0,{children:$.message},void 0,!1,void 0,this),F0(O2,{flexDirection:"column",marginTop:1,children:[F0(f0,{bold:!0,children:[z.title,z.required?" *":""]},void 0,!0,void 0,this),z.description&&F0(f0,{color:"gray",children:z.description},void 0,!1,void 0,this),F0(f0,{color:"gray",children:gZ(z)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),SQ(z)?F0(O2,{children:[F0(f0,{color:"cyan",children:"> "},void 0,!1,void 0,this),F0(DZ,{value:N,onChange:B,onSubmit:C,focus:Z,placeholder:z.defaultValue===void 0?z.required?"Required":"Optional":String(z.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):F0(O2,{flexDirection:"column",children:P.map((S,E)=>{let c=z.type==="multi-select"&&b.includes(S.value);return F0(f0,{color:_===E?"yellow":void 0,children:[_===E?"> ":" ",z.type==="multi-select"?c?"(*) ":"( ) ":"",S.label]},S.value,!0,void 0,this)})},void 0,!1,void 0,this),v&&F0(f0,{color:"red",children:v},void 0,!1,void 0,this),F0(f0,{color:"gray",children:[SQ(z)?"Enter to continue":z.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(f0,{color:"gray",children:["Field ",q+1," of ",U.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function q2({children:$,width:Q,color:Y}){return F0(O2,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function SQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function hZ($){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 gZ($){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 mZ($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import F2 from"ansi-escapes";import{Box as e1,Static as V9,useStdout as $5}from"ink";import Q5,{useEffect as m1,useMemo as j9,useRef as $$,useState as gQ}from"react";import{useStdout as pZ}from"ink";import{debounce as cZ}from"lodash-es";import{useEffect as xZ,useState as uZ}from"react";function P9($=200){let{stdout:Q}=pZ(),[Y,J]=uZ(Q.rows||24);return xZ(()=>{let Z=cZ(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import w$ from"chalk";import lZ from"string-width";var z0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},_2="\x1B",fQ=`${_2}[2K`,z2=($)=>$>0?`${_2}[${$}A`:"",R9=`${_2}[?25l`,y9=`${_2}[?25h`;function M9($,Q){z0.active=!0,z0.renderedLineCount=0,z0.lastRenderedLines=[],z0.terminalWidth=$,z0.terminalHeight=Q,z0.isFirstRender=!0}function I9($,Q){z0.terminalWidth=$,z0.terminalHeight=Q}function C9($,Q,Y,J){if(!z0.active)return;let Z=8,X=Math.max(1,z0.terminalHeight-Z),U=[],G=d0.getTheme(),K=" ".repeat(z0.prefixIndent),q=w$.dim.hex(G.colors.border.light);if(Q>0)U.push(`${K}${w$.dim.hex(G.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let W=Y==="code",O=Y==="diff",F="",N=$;if(W&&$.length>0)F=$[0].match(/^```(\w+)?/)?.[1]||"",N=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")N=$.slice(1);let B=N.slice(-X);if(W&&Q===0){let w=F?` ${w$.hex(G.colors.text.secondary)(F)}`:"";U.push(`${K}${q("╭─")}${w}`)}for(let w=0;w<B.length;w++){let b=B[w],A=K;if(w===0&&!J&&z0.isFirstRender&&!W&&!O)A=w$.bold.hex(G.colors.success)("• ")+" ",z0.isFirstRender=!1;let v=W?4:0,M=z0.terminalWidth-z0.prefixIndent-2-v,z=b;if(lZ(b)>M)z=b.slice(0,M);if(W)U.push(`${K}${q("│")} ${z}`);else if(O){let P=z;if(P.startsWith("+"))U.push(`${A}${w$.green(z)}`);else if(P.startsWith("-"))U.push(`${A}${w$.red(z)}`);else if(P.startsWith("@@"))U.push(`${A}${w$.dim(z)}`);else U.push(`${A}${z}`)}else U.push(`${A}${z}`);if(w===0&&!J&&z0.isFirstRender)z0.isFirstRender=!1}let _=[];if(_.push(R9),z0.renderedLineCount>0)_.push(z2(z0.renderedLineCount)),_.push("\r");for(let w=0;w<U.length;w++){let b=U[w],A=z0.lastRenderedLines[w];if(b!==A)_.push(fQ),_.push(b);if(w<U.length-1)_.push(`
153
- `)}if(U.length<z0.renderedLineCount){for(let b=U.length;b<z0.renderedLineCount;b++)_.push(`
154
- `),_.push(fQ);let w=z0.renderedLineCount-U.length;_.push(z2(w))}_.push(y9),process.stdout.write(_.join("")),z0.renderedLineCount=U.length,z0.lastRenderedLines=U}function h1(){if(!z0.active)return;if(z0.renderedLineCount>0){let $=[];$.push(R9),$.push(z2(z0.renderedLineCount)),$.push("\r");for(let Q=0;Q<z0.renderedLineCount;Q++)if($.push(fQ),Q<z0.renderedLineCount-1)$.push(`
155
- `);if(z0.renderedLineCount>1)$.push(z2(z0.renderedLineCount-1)),$.push("\r");$.push(y9),process.stdout.write($.join(""))}z0.active=!1,z0.renderedLineCount=0,z0.lastRenderedLines=[],z0.isFirstRender=!0}function T1(){return z0.active}import{Box as dZ,Text as T9}from"ink";import rZ from"react";import{jsxDEV as DQ}from"react/jsx-dev-runtime";var VQ=rZ.memo(({collapsedCount:$})=>{let Q=b0();if($<=0)return null;let Y=Q.colors.text.muted;return DQ(dZ,{flexDirection:"row",marginBottom:1,children:[DQ(T9,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),DQ(T9,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});VQ.displayName="CollapsedHistorySummary";import{Box as G8,Text as K8}from"ink";import aZ from"ink-big-text";import oZ from"ink-gradient";import iZ from"react";import{jsxDEV as L1}from"react/jsx-dev-runtime";var k9=iZ.memo(()=>{return L1(G8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[L1(G8,{flexDirection:"column",children:L1(oZ,{name:"pastel",children:L1(aZ,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(G8,{marginBottom:1,children:L1(K8,{color:"white",dimColor:!0,children:v9()},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(G8,{flexDirection:"column",marginBottom:1,children:[L1(G8,{marginBottom:1,children:L1(K8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(K8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),L1(K8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),L1(K8,{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 N2,Text as jQ}from"ink";import S9 from"react";import{jsxDEV as s1}from"react/jsx-dev-runtime";var f9=S9.memo(({tasks:$,visible:Q=!0,compact:Y=!1})=>{let{colors:J}=b0();if(!Q||$.length===0)return null;let Z={total:$.length,completed:$.filter((X)=>X.status==="completed").length,inProgress:$.filter((X)=>X.status==="in_progress").length};return s1(N2,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[s1(N2,{marginBottom:Y?0:1,children:[s1(jQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),s1(jQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s1(N2,{flexDirection:"column",children:$.map((X,U)=>s1(nZ,{task:X,compact:Y},X.id||U,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),nZ=S9.memo(({task:$,compact:Q})=>{let Y,J=!1,Z;switch($.status){case"completed":Y="[OK]",J=!0,Z=$.subject;break;case"in_progress":Y=">",J=!1,Z=$.activeForm||$.subject;break;case"pending":default:Y="-",J=!0,Z=$.subject;break}return s1(N2,{paddingY:Q?0:0,children:s1(jQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as EQ,Text as x$}from"ink";import tZ,{useMemo as D9}from"react";import{jsxDEV as g1}from"react/jsx-dev-runtime";function sZ($,Q=60){if(!$)return"";let Y=$.split(`
156
- `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function eZ($){if(!$)return 0;return $.split(`
157
- `).length}var hQ=tZ.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=b0(),Z=D9(()=>eZ($),[$]),X=D9(()=>sZ($),[$]),U=J.colors.info,G=J.colors.muted;return g1(EQ,{flexDirection:"column",marginBottom:1,children:[g1(EQ,{flexDirection:"row",children:[g1(x$,{color:U,children:Y?"v":">"},void 0,!1,void 0,this),g1(x$,{children:" "},void 0,!1,void 0,this),g1(x$,{color:G,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&g1(x$,{color:G,children:[" - ",X]},void 0,!0,void 0,this),g1(x$,{color:G,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&g1(EQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:g1(x$,{color:G,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});hQ.displayName="ThinkingBlock";import{jsxDEV as a0}from"react/jsx-dev-runtime";var h9=Q5.memo(()=>{let $=oQ(),Q=N4(),Y=F4(),J=H4(),Z=a1(),X=Q4(),U=X4(),G=M8(),K=z4(),q=_4(),W=iQ(),O=L4(),F=W4(),N=D$(),B=P9(),{stdout:_}=$5(),w=d1(),[b,A]=gQ(null),[v,M]=gQ([]),[z,P]=gQ(new Set),H=$$(F),R=$$(null),C=$$(0),y=$$(0),S=$$(new Set),E=$$(new Set),c=$$([]),J0=$$(null);m1(()=>{if(H.current!==F){if(T1())h1();if(_)_.write(F2.clearTerminal);w.incrementClearCount(),H.current=F}},[F,_,w]);let l=$,T=J;m1(()=>{if(!J||Z){J0.current=null;return}if(J0.current===J)return;if(J0.current=J,T1())h1();if(_)_.write(F2.eraseScreen+F2.cursorTo(0,0));S.current=new Set,E.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),R.current=null,C.current=0,y.current=0,c.current=[],M([]),P(new Set),w.incrementClearCount(),w.clearFinalizingStreamingMessageId()},[J,Z,_,w,l]);let L=Q??J;m1(()=>{if(T1())h1();R.current=null,C.current=0,y.current=0,S.current=new Set,E.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),c.current=[],M([]),P(new Set)},[W]),m1(()=>{if(!L)return;if(R.current===L)return;R.current=L,C.current=0,y.current=0,E.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),c.current=[],M([])},[L,l]),m1(()=>{if(!L)return;let j=mQ(L);if(!j||j.length<=C.current)return;let m=j.slice(C.current);C.current=j.length;let f=m,n=c.current;if(n.length>0)if(f.some((D0)=>D0.type!=="empty"))f=[...n,...f],c.current=[];else{c.current=[...n,...f];return}let _0=f.length;while(_0>0&&f[_0-1].type==="empty")_0-=1;if(_0!==f.length)c.current=f.slice(_0),f=f.slice(0,_0);if(f.length===0)return;let N0=y.current;y.current+=1;let m0=N0>0;if(T1())h1();P((D0)=>{if(!L||D0.has(L))return D0;let w0=new Set(D0);return w0.add(L),w0}),M((D0)=>[...D0,a0(e1,{flexDirection:"column",children:a0(t1,{content:"",role:"assistant",terminalWidth:N,isPending:!1,hidePrefix:m0,noMargin:!0,blocksOverride:f,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${L}-${N0}`,!1,void 0,this)])},[L,Y.version,N,W]),m1(()=>{if(!L)return;let j=E.current,m=l.filter((f)=>f.role==="tool"&&!j.has(f.id)&&!S.current.has(f.id));if(m.length===0)return;if(T1())h1();for(let f of m)S.current.add(f.id);M((f)=>[...f,...m.map((n)=>a0(e1,{flexDirection:"column",children:a0(t1,{content:n.content,role:n.role,terminalWidth:N,metadata:n.metadata,isPending:!1,messageId:n.id},void 0,!1,void 0,this)},`streaming-tool-${n.id}`,!1,void 0,this))])},[L,l,N]),m1(()=>{if(!L){if(T1())h1();return}if(!T1())M9(N,B);else I9(N,B);let j=E9(L);if(!j||j.lines.length===0)return;let f=Math.max(1,B-8),n=Math.max(0,j.lines.length-f),_0=j.lines.slice(-f),N0=(mQ(L)?.length??0)>0;C9(_0,n,j.mode,N0)},[L,Y.version,B,N]),m1(()=>{if(!L&&T1())h1()},[L]),m1(()=>{if(b===null&&l.length>O){if(A(l.length),T1())h1();if(_)_.write(F2.clearTerminal);w.incrementClearCount()}},[l.length,O,b,_,w]);let I=j9(()=>{return X.some((j)=>j.status==="pending"||j.status==="in_progress")},[X]),V=F?0:b??0,k=V,u=j9(()=>{let j=[];if(j.push(a0(k9,{},"header",!1,void 0,this)),k>0)j.push(a0(VQ,{collapsedCount:k},"collapsed-summary",!1,void 0,this));for(let m=V;m<l.length;m++){let f=l[m];if(T&&f.id===T)continue;if(f.role==="tool"&&S.current.has(f.id))continue;if(f.role==="assistant"&&z.has(f.id))continue;j.push(a0(e1,{flexDirection:"column",children:a0(t1,{content:f.content,role:f.role,terminalWidth:N,metadata:f.metadata,isPending:!1,messageId:f.id},void 0,!1,void 0,this)},f.id,!1,void 0,this))}return j},[l,V,k,N,T,z]);return a0(e1,{flexDirection:"column",paddingX:2,children:a0(e1,{flexDirection:"column",children:[a0(V9,{items:u,children:(j)=>j},W,!1,void 0,this),K&&a0(e1,{marginBottom:1,children:a0(hQ,{content:K,isStreaming:Z,isExpanded:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),v.length>0&&a0(V9,{items:v,children:(j)=>j},`streaming-${W}`,!1,void 0,this),U&&I&&a0(e1,{marginTop:1,children:a0(f9,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.map((j,m)=>a0(e1,{flexDirection:"column",children:a0(t1,{content:j.displayText,role:"user",terminalWidth:N},void 0,!1,void 0,this)},`pending-${m}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as H2,useMount as J5}from"ahooks";import{Box as B1,Text as H0,useFocus as Y5,useFocusManager as Z5,useInput as X5}from"ink";import U5 from"ink-select-input";import{memo as G5,useMemo as K5,useState as W2}from"react";import{jsxDEV as t,Fragment as z5}from"react/jsx-dev-runtime";var q5=({isSelected:$})=>t(B1,{marginRight:1,children:t(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),O5=({isSelected:$,label:Q})=>t(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),g9=G5(({onClose:$,onEdit:Q})=>{let Y=U4(),J=y8()??"",{isFocused:Z}=Y5({id:"model-selector"}),X=Z5(),[U,G]=W2(""),[K,q]=W2(!1),[W,O]=W2(null),F=k0(!1),[N]=W2(()=>{let H=process.stdout?.columns||80;return Math.max(20,H-8)});J5(()=>{if(X?.focus("model-selector"),Y.length>0)G(Y[0].id)}),X5((H,R)=>{if(K)return;if(R.ctrl&&H==="c"||R.meta&&H==="c"){F();return}if(R.escape){$();return}if(!Z)return;if(H==="d"||H==="D"){_();return}if((H==="e"||H==="E")&&Q)w()},{isActive:!0});let B=H2(async(H)=>{if(K)return;let R=H.value;if(R===J){$();return}q(!0),O(null);try{await u0().setCurrentModel(R),$()}catch(C){O(C.message),q(!1)}}),_=H2(async()=>{if(K||U===J)return;q(!0),O(null);try{if(await u0().removeModel(U),Y.length<=1)$()}catch(H){O(H.message)}finally{q(!1)}}),w=H2(()=>{if(K||!Q)return;let H=Y.find((R)=>R.id===U);if(!H)return;Q(H)}),b=H2((H)=>{G(H.value)}),A=K5(()=>{return Y.find((H)=>H.id===U)},[Y,U]),v=A?L2()?.modelProviders[A.provider]:void 0,M=Y.map((H)=>{let R=H.id===J?" (当前)":"";return{label:pQ(H)+R,value:H.id}}),z=U===J;return t(B1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[t(B1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[t(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),t(H0,{dimColor:!0,children:[K?"处理中...":z?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(B1,{flexDirection:"row",children:[t(B1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[t(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),t(B1,{marginTop:1,children:t(U5,{items:M,onSelect:B,onHighlight:b,indicatorComponent:q5,itemComponent:O5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(B1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[t(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),t(B1,{marginY:1,children:t(H0,{color:z?"green":"yellow",children:z?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A?t(B1,{flexDirection:"column",children:[t(H0,{children:[t(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),t(H0,{bold:!0,color:"cyan",children:pQ(A)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(H0,{children:[t(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),t(H0,{bold:!0,children:v?.name??A.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v&&t(z5,{children:[t(H0,{children:[t(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),t(H0,{children:A.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(H0,{children:[t(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),t(H0,{children:v.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(H0,{children:[t(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),t(H0,{color:"blueBright",children:v.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(H0,{children:[t(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),t(H0,{bold:!0,children:A.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A.overrides?.baseUrl&&t(H0,{children:[t(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),t(H0,{color:"blueBright",children:A.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(H0,{children:[t(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),t(H0,{children:f1().resolveConfig(A).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):t(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W&&t(B1,{marginTop:1,children:t(H0,{color:"red",children:W},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(B1,{justifyContent:"center",marginTop:1,children:t(H0,{dimColor:!0,children:"─".repeat(N)},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(B1,{justifyContent:"center",children:t(H0,{dimColor:!0,children:"提示:D=删除 * E=编辑 * Up/Down=移动 * Enter/ESC=确认"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as cQ}from"ahooks";import{Box as f5,Text as xQ,useInput as D5}from"ink";import{useState as P$}from"react";import{Box as b$,Text as p1,useInput as _5}from"ink";import N5 from"ink-text-input";import{jsxDEV as i0}from"react/jsx-dev-runtime";var m9=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return _5((U,G)=>{if(G.escape)Z()}),i0(b$,{flexDirection:"column",children:[i0(b$,{marginBottom:1,children:i0(p1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0(b$,{marginBottom:1,children:i0(p1,{children:["Provider: ",i0(p1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i0(b$,{marginBottom:1,children:i0(p1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0(b$,{children:[i0(p1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),i0(N5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&i0(b$,{marginTop:1,children:i0(p1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0(b$,{marginTop:1,children:i0(p1,{dimColor:!0,children:["输入完成后按 ",i0(p1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",i0(p1,{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 B2,Text as Q$,useInput as F5}from"ink";import H5 from"ink-text-input";import{useState as w2}from"react";import{jsxDEV as q1}from"react/jsx-dev-runtime";var b2=["id","name","baseUrl","model"];function p9($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function W5($,Q,Y){switch($){case"id":return"team-gateway";case"name":return Y||"Team Gateway";case"baseUrl":return Q==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return Q==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function L5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=x9(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 u9=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,U]=w2(Q?3:0),[G,K]=w2(Q?.model??""),[q,W]=w2(Z),[O,F]=w2(),N=b2[X];F5((_,w)=>{if(!w.escape)return;if(F(void 0),X===0){J();return}let b=X-1,A=b2[b];U(b),K(q[A])});let B=(_)=>{let w=_.trim();if(N==="id"&&!c9.test(w)){F("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(N==="baseUrl")try{let A=new URL(w);if(!["http:","https:"].includes(A.protocol))throw Error()}catch{F("Base URL 必须是绝对 HTTP(S) URL");return}if(N==="model"&&!w){F("Model ID 不能为空");return}let b={...q,[N]:N==="name"&&!w?q.id:w};if(W(b),F(void 0),X===b2.length-1){try{Y(L5(b,$))}catch(A){F(A instanceof Error?A.message:"渠道配置无效")}return}U(X+1),K("")};return q1(B2,{flexDirection:"column",children:[q1(B2,{marginBottom:1,children:q1(Q$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q1(Q$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),b2.slice(0,X).map((_)=>q1(Q$,{children:[p9(_),": ",q1(Q$,{color:"cyan",children:q[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),q1(B2,{marginTop:1,children:[q1(Q$,{bold:!0,children:[p9(N),": "]},void 0,!0,void 0,this),q1(H5,{value:G,onChange:(_)=>{K(_),F(void 0)},onSubmit:B,placeholder:W5(N,$,q.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N==="name"&&q1(Q$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&q1(Q$,{color:"red",children:O},void 0,!1,void 0,this),q1(B2,{marginTop:1,children:q1(Q$,{dimColor:!0,children:"Enter 继续 · Esc 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useEffect as r9,useState as u$}from"react";var a9=()=>{let[$,Q]=u$([]),[Y,J]=u$(!0),[Z,X]=u$(null);return r9(()=>{(async()=>{try{Q(await l9())}catch(G){X(G instanceof Error?G.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},o9=($)=>{let[Q,Y]=u$([]),[J,Z]=u$(!1),[X,U]=u$(null);return r9(()=>{if(!$){Y([]);return}(async()=>{Z(!0),U(null);try{Y(await d9($))}catch(K){U(K instanceof Error?K.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as c1,Text as y1,useInput as B5}from"ink";import w5 from"ink-select-input";import b5 from"ink-text-input";import{useMemo as i9,useState as A5}from"react";import{jsxDEV as h0,Fragment as M5}from"react/jsx-dev-runtime";var P5=({isSelected:$})=>h0(c1,{marginRight:1,children:h0(y1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),R5=($)=>{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(" ")},y5=({isSelected:$,label:Q})=>h0(y1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),n9=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[U,G]=A5("");B5((W,O)=>{if(O.escape)if(U)G("");else X()});let K=i9(()=>{if(!U)return Q;let W=U.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(W)||O.id.toLowerCase().includes(W))},[Q,U]),q=i9(()=>K.map((W)=>({key:W.id,label:R5(W),value:W})),[K]);if(Y)return h0(c1,{flexDirection:"column",children:h0(y1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return h0(c1,{flexDirection:"column",children:[h0(y1,{color:"red",children:J},void 0,!1,void 0,this),h0(y1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return h0(c1,{flexDirection:"column",children:[h0(c1,{marginBottom:1,children:h0(y1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(c1,{marginBottom:1,children:h0(y1,{children:["Provider: ",h0(y1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),h0(M5,{children:[h0(c1,{marginBottom:1,children:[h0(y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),h0(b5,{value:U,onChange:G,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h0(c1,{marginBottom:1,children:h0(y1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(c1,{flexDirection:"column",height:12,children:h0(w5,{items:q,onSelect:(W)=>Z(W.value),indicatorComponent:P5,itemComponent:y5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&h0(y1,{color:"yellow",children:"内置 catalog 中没有匹配模型"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as A$,Text as J$,useInput as I5}from"ink";import C5 from"ink-select-input";import T5 from"ink-text-input";import{useMemo as t9,useState as v5}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var k5=({isSelected:$})=>n0(A$,{marginRight:1,children:n0(J$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),S5=({isSelected:$,label:Q})=>n0(J$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),s9=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,U]=v5("");I5((q,W)=>{if(W.escape)if(X)U("");else Z()});let G=t9(()=>{if(!X)return $;let q=X.toLowerCase();return $.filter((W)=>W.name.toLowerCase().includes(q)||W.id.toLowerCase().includes(q))},[$,X]),K=t9(()=>G.map((q)=>({key:q.id,label:`${q.name} - ${q.modelCount} models${q.configured?" [configured]":""}`,value:q})),[G]);if(Q)return n0(A$,{flexDirection:"column",children:n0(J$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(A$,{flexDirection:"column",children:[n0(J$,{color:"red",children:Y},void 0,!1,void 0,this),n0(J$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(A$,{flexDirection:"column",children:[n0(A$,{marginBottom:1,children:n0(J$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(A$,{marginBottom:1,children:[n0(J$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(T5,{value:X,onChange:U,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(A$,{flexDirection:"column",height:12,children:n0(C5,{items:K,onSelect:(q)=>J(q.value),indicatorComponent:k5,itemComponent:S5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&n0(J$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function e9($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as Y$}from"react/jsx-dev-runtime";var uQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,U]=P$("provider"),[G,K]=P$(),[q,W]=P$(),[O,F]=P$(),[N,B]=P$(""),[_,w]=P$(),[b,A]=P$(!1),v=a9(),M=o9(G?.id),z=k0(!1);D5((C,y)=>{if(y.ctrl&&C==="c"||y.meta&&C==="c")$==="setup"?z():Z()});let P=cQ(async(C)=>{if(!G)return;let y=O??(q?{provider:G.id,model:q.id,displayName:Q?.displayName}:void 0);if(!y)return;A(!0),w(void 0);try{if(y.modelProvider)f1().registerModelProvider(y.provider,y.modelProvider,[y.model]);if(C?.trim())await f1().setApiKey(y.provider,C.trim());let S={displayName:y.displayName,provider:y.provider,model:y.model,overrides:y.overrides};if($==="setup")await J(y);else if($==="add"){let E=y.modelProvider?await u0().addModelWithProvider(S,y.modelProvider):await u0().addModel(S);await u0().setCurrentModel(E.id),await J(y)}else if(Y){if(y.modelProvider)await u0().updateModelWithProvider(Y,S,y.modelProvider);else await u0().updateModel(Y,S);await J(y)}}catch(S){if(y.modelProvider){await f1().credentials.delete(y.provider);let E=L2();f1().configureModelProviders(E?.modelProviders??{},E?.models??[])}w(S instanceof Error?S.message:"保存配置失败"),A(!1)}}),H=cQ((C)=>{if(W(C),G?.configured)P();else if(G?.supportsApiKey)U("credential");else w(`${G?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),R=cQ(()=>{if(w(void 0),X==="credential"&&O){U("custom");return}let C=e9(X);if(C)U(C)});return Y$(f5,{flexDirection:"column",padding:1,children:[Y$(xQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&Y$(s9,{...v,onSelect:(C)=>{K(C),W(void 0),F(void 0),U(C.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&G?.factoryWireApi&&Y$(u9,{wireApi:G.factoryWireApi,initialConfig:O,onSubmit:(C)=>{F(C),U("credential")},onCancel:R},void 0,!1,void 0,this),X==="model"&&G&&Y$(n9,{provider:G,...M,onSelect:H,onCancel:R},void 0,!1,void 0,this),X==="credential"&&G&&Y$(m9,{provider:G,value:N,onChange:B,onSubmit:()=>void P(N),onCancel:R,error:_},void 0,!1,void 0,this),b&&Y$(xQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&Y$(xQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as q8}from"ahooks";import{promises as YJ}from"fs";import{Box as O1,Text as V0,useInput as V5}from"ink";import $J from"ink-select-input";import j5 from"ink-text-input";import E5 from"os";import A2 from"path";import{useEffect as h5,useMemo as P2,useRef as g5,useState as Z$}from"react";import{jsxDEV as G0}from"react/jsx-dev-runtime";var O8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],m5={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},p5={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},QJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},c5=["project","global","local"],x5={allow:[],ask:[],deny:[]},u5={localExists:!1,projectExists:!1,globalExists:!1},JJ={allow:[],ask:[],deny:[]};function l5($){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 d5($){try{let Q=await YJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:l5(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...JJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...JJ}}}}function r5($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${QJ[Q]} <- 可删除`:QJ[Q];return`${Y} ${J}`}var ZJ=({onClose:$})=>{let Y=s0()==="permissions-manager",J=k0(!1),[Z,X]=Z$(0),U=O8[Z].key,[G,K]=Z$(x5),[q,W]=Z$(u5),[O,F]=Z$(!0),[N,B]=Z$("list"),[_,w]=Z$(""),[b,A]=Z$(null),[v,M]=Z$(null),z=g5(!1),P=P2(()=>A2.join(A0(),".blade","settings.local.json"),[]),H=P2(()=>A2.join(A0(),".blade","settings.json"),[]),R=P2(()=>A2.join(E5.homedir(),".blade","settings.json"),[]),C=q8(async()=>{F(!0);let m=await Promise.all([{source:"local",path:P},{source:"project",path:H},{source:"global",path:R}].map(async({source:N0,path:m0})=>{let D0=await d5(m0);return{source:N0,path:m0,...D0}})),f={localExists:m.find((N0)=>N0.source==="local")?.exists??!1,projectExists:m.find((N0)=>N0.source==="project")?.exists??!1,globalExists:m.find((N0)=>N0.source==="global")?.exists??!1};W(f);let n={allow:[],ask:[],deny:[]},_0=Object.fromEntries(m.map((N0)=>[N0.source,N0]));["allow","ask","deny"].forEach((N0)=>{c5.forEach((m0)=>{(_0[m0]?.permissions[N0]??[]).forEach((w0,_1)=>{let N1={key:`${m0}:${_1}:${w0}`,rule:w0,source:m0};n[N0].push(N1)})})}),K(n),F(!1)});h5(()=>{C()},[C]);let y=q8(async(j,m)=>{try{let f=A2.join(A0(),".blade","settings.local.json"),n={allow:[],ask:[],deny:[]};try{let N0=await YJ.readFile(f,"utf-8"),D0=JSON.parse(N0).permissions||{};n={allow:Array.isArray(D0.allow)?D0.allow:[],ask:Array.isArray(D0.ask)?D0.ask:[],deny:Array.isArray(D0.deny)?D0.deny:[]}}catch(N0){}let _0=m(n);await u0().updateConfig({permissions:_0},{scope:"local",immediate:!0}),await C()}catch(f){throw console.error("[PermissionsManager] 修改权限规则失败:",f),f}});V5((j,m)=>{if(m.ctrl&&j==="c"||m.meta&&j==="c"){J();return}if(N==="locked"){if(z.current){z.current=!1;return}B("list"),A(null),M(null);return}if(m.escape){if(N==="list"||U==="info")$();else B("list"),w(""),A(null),M(null);return}if(N==="list"){if(m.tab&&m.shift)X((f)=>(f-1+O8.length)%O8.length);else if(m.tab)X((f)=>(f+1)%O8.length);else if(j?.toLowerCase()==="q")$()}},{isActive:Y});let S=q8((j)=>{let m=j.value;if(U==="info")return;if(m.type==="add"){B("add"),w(""),M(null);return}if(m.entry.source!=="local"){B("locked"),z.current=!0,A({tab:U,entry:m.entry}),M({type:"error",text:m.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}B("confirm-delete"),A({tab:U,entry:m.entry}),M(null)}),E=q8(async()=>{if(U==="info")return;let j=_.trim();if(!j){M({type:"error",text:"Permission rule 不能为空"});return}if(G[U].map((f)=>f.rule).includes(j)){M({type:"error",text:"该规则已存在"});return}try{await y(U,(f)=>{let n={allow:[...f.allow],ask:[...f.ask],deny:[...f.deny]};return n[U]=[...new Set([...f[U],j])],n}),B("list"),w(""),M({type:"success",text:"已添加本地权限规则"})}catch(f){M({type:"error",text:`保存失败: ${f instanceof Error?f.message:"未知错误"}`})}}),c=q8(async()=>{if(!b)return;let{tab:j,entry:m}=b;try{await y(j,(f)=>{let n={allow:[...f.allow],ask:[...f.ask],deny:[...f.deny]};return n[j]=f[j].filter((_0)=>_0!==m.rule),n}),B("list"),A(null),M({type:"success",text:"已删除本地权限规则"})}catch(f){M({type:"error",text:`删除失败: ${f instanceof Error?f.message:"未知错误"}`})}}),J0=P2(()=>{if(U==="info")return[];let j=U;return[{key:"add-new-rule",label:`› ${m5[j]}`,value:{type:"add"}},...G[j].map((f)=>({key:f.key,label:r5(f.rule,f.source),value:{type:"rule",entry:f}}))]},[U,G]),l=()=>G0(O1,{marginBottom:1,children:O8.map((j,m)=>G0(O1,{marginRight:2,children:G0(V0,{color:m===Z?"yellow":"gray",children:["[",j.label,"]"]},void 0,!0,void 0,this)},j.key,!1,void 0,this))},void 0,!1,void 0,this),T=()=>G0(O1,{flexDirection:"column",gap:1,children:[G0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),G0(O1,{flexDirection:"column",marginLeft:2,children:[G0(V0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",q.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),G0(V0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",q.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),G0(V0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",q.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G0(V0,{children:"说明:"},void 0,!1,void 0,this),G0(O1,{flexDirection:"column",marginLeft:2,children:[G0(V0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),G0(V0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),G0(V0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L=(j)=>G0(O1,{flexDirection:"column",gap:1,children:[G0(V0,{bold:!0,children:p5[j]},void 0,!1,void 0,this),G0(V0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),G0(V0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),G0(O1,{marginTop:1,children:G0(j5,{value:_,onChange:w,onSubmit:E},void 0,!1,void 0,this)},void 0,!1,void 0,this),G0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),I=(j,m)=>G0(O1,{flexDirection:"column",gap:1,children:[G0(V0,{bold:!0,children:["Delete ",j," permission rule?"]},void 0,!0,void 0,this),G0(V0,{children:m.rule},void 0,!1,void 0,this),G0(V0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),G0(V0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),G0($J,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(f)=>{if(f.value==="yes")c();else B("list"),A(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V=(j)=>G0(O1,{flexDirection:"column",gap:1,children:[G0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),G0(V0,{children:j.rule},void 0,!1,void 0,this),G0(V0,{color:"gray",children:j.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),G0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k=(j)=>G0($J,{items:J0,isFocused:N==="list",onSelect:S},void 0,!1,void 0,this),u=()=>{if(O)return G0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(U==="info")return T();if(N==="add")return L(U);if(N==="confirm-delete"&&b)return I(b.tab,b.entry);if(N==="locked"&&b)return V(b.entry);return k(U)};return G0(O1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[G0(V0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),l(),G0(O1,{flexDirection:"column",gap:1,children:u()},void 0,!1,void 0,this),v&&G0(O1,{marginTop:1,children:G0(V0,{color:v.type==="success"?"green":"red",children:v.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),G0(O1,{marginTop:1,children:G0(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 P0,Text as Z0,useInput as a5}from"ink";import{useState as z8}from"react";import{jsxDEV as x}from"react/jsx-dev-runtime";function OJ({workspaceRoot:$,onCancel:Q}){let Y=XJ($),J=Y.getAll(),[Z,X]=z8(0),[U,G]=z8(!1),[K,q]=z8(""),[W,O]=z8(null),[,F]=z8(0),N=Y.getBySource(),B=Y.getStats(),_=Y.getSourcePolicy(),w=k0(!1,Q),b=async()=>{let z=J[Z];if(!z||U)return;if(z.source==="cli"){q(`${z.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(z.status==="error"){q(z.error??`${z.manifest.name} 当前不可用`);return}G(!0),q("");try{let P=await UJ(Y.getWorkspaceRoot(),z.manifest.name,z.status!=="active","local");q(P.effectiveEnabled?`已启用 ${z.manifest.name}`:`已禁用 ${z.manifest.name}`),F((H)=>H+1)}catch(P){q(P instanceof Error?P.message:String(P))}finally{G(!1)}},A=async()=>{if(U)return;G(!0),q("");try{await GJ(Y.getWorkspaceRoot()),X(0),q("插件列表已刷新"),F((z)=>z+1)}catch(z){q(z instanceof Error?z.message:String(z))}finally{G(!1)}},v=async()=>{let z=J[Z];if(!z||U)return;if(!z.installation){q(`${z.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}G(!0),O(null),q("");try{let{result:P}=await KJ(Y.getWorkspaceRoot(),z.manifest.name,{trusted:!0});if(!P.success)throw Error(P.error);q(P.changed?`已更新 ${z.manifest.name} 到 ${P.installation?.revision}`:`${z.manifest.name} 已是最新版本`),F((H)=>H+1)}catch(P){q(P instanceof Error?P.message:String(P))}finally{G(!1)}},M=async()=>{let z=J[Z];if(!z||U)return;if(!z.installation){q(`${z.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(W!==z.manifest.name){O(z.manifest.name),q(`再次按 x 确认卸载 ${z.manifest.name}`);return}G(!0),q("");try{let{result:P}=await qJ(Y.getWorkspaceRoot(),z.manifest.name,!0);if(!P.success)throw Error(P.error);O(null),X(0),q(`已卸载 ${z.manifest.name}`),F((H)=>H+1)}catch(P){q(P instanceof Error?P.message:String(P))}finally{G(!1)}};if(a5((z,P)=>{if(P.escape)Q?.();else if(P.ctrl&&z==="c"||P.meta&&z==="c")w();else if((P.upArrow||z==="k")&&J.length>0)O(null),X((H)=>(H-1+J.length)%J.length);else if((P.downArrow||z==="j")&&J.length>0)O(null),X((H)=>(H+1)%J.length);else if(z===" "||P.return)b();else if(z==="r")A();else if(z==="u")v();else if(z==="x")M()}),J.length===0)return x(P0,{flexDirection:"column",paddingY:1,children:[x(P0,{marginBottom:1,children:x(Z0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(Z0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Z0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),x(Z0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),x(Z0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),x(Z0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{marginTop:1,paddingLeft:2,children:x(Z0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{marginTop:1,children:x(Z0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return x(P0,{flexDirection:"column",paddingY:1,children:[x(P0,{marginBottom:1,children:[x(Z0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),x(Z0,{color:"gray",children:[" (共 ",B.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,marginBottom:1,children:x(Z0,{color:"gray",children:["启用: ",B.active," | 禁用: ",B.inactive," | 命令: ",B.commands," | 技能:"," ",B.skills," | 代理: ",B.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,marginBottom:1,children:x(Z0,{color:"gray",children:["来源策略: ",_.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",_.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),N.cli.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(Z0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),x(Z0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.cli.map((z)=>{let P=z.status==="active"?"[on]":"[off]",H=J.indexOf(z)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(Z0,{children:[x(Z0,{bold:!0,color:H?"cyan":"green",children:[H?"› ":" ",P," ",z.manifest.name]},void 0,!0,void 0,this),x(Z0,{color:"gray",children:[" v",z.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(Z0,{color:"gray",children:z.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.commands.length>0&&x(P0,{paddingLeft:2,children:x(Z0,{color:"blue",children:["命令:"," ",z.commands.map((R)=>`/${R.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},z.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.project.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(Z0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),x(Z0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.project.map((z)=>{let P=z.status==="active"?"[on]":"[off]",H=J.indexOf(z)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(Z0,{children:[x(Z0,{bold:!0,color:H?"cyan":"green",children:[H?"› ":" ",P," ",z.manifest.name]},void 0,!0,void 0,this),x(Z0,{color:"gray",children:[" v",z.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(Z0,{color:"gray",children:z.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.commands.length>0&&x(P0,{paddingLeft:2,children:x(Z0,{color:"blue",children:["命令:"," ",z.commands.map((R)=>`/${R.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},z.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.user.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(Z0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),x(Z0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.user.map((z)=>{let P=z.status==="active"?"[on]":"[off]",H=J.indexOf(z)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(Z0,{children:[x(Z0,{bold:!0,color:H?"cyan":"green",children:[H?"› ":" ",P," ",z.manifest.name]},void 0,!0,void 0,this),x(Z0,{color:"gray",children:[" v",z.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(Z0,{color:"gray",children:z.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.commands.length>0&&x(P0,{paddingLeft:2,children:x(Z0,{color:"blue",children:["命令:"," ",z.commands.map((R)=>`/${R.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},z.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),x(P0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Z0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),x(Z0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),x(Z0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),x(Z0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),x(Z0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),x(Z0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{marginTop:1,children:x(Z0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&x(P0,{marginTop:1,children:x(Z0,{color:K.includes("失败")?"red":"cyan",children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&x(Z0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as $1,Text as Q1,useInput as zJ,useStdout as o5}from"ink";import i5 from"ink-text-input";import lQ,{useCallback as _8,useMemo as n5,useState as X$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var t5=lQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>W0($1,{flexDirection:"column",marginBottom:1,children:[W0(Q1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),W0($1,{marginLeft:4,children:W0(Q1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),s5=lQ.memo(({questions:$,answers:Q})=>W0($1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return W0($1,{marginBottom:1,children:[W0(Q1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),W0(Q1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),_J=lQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=o5(),Z=J.columns||80,U=s0()==="confirmation-prompt",G=k0(!1),[K,q]=X$("answering"),[W,O]=X$(0),[F,N]=X$({}),[B,_]=X$(0),[w,b]=X$([]),[A,v]=X$(!1),[M,z]=X$(""),[P,H]=X$(0),R=$[W],C=n5(()=>{if(!R)return[];return[...R.options.map((l)=>({label:l.label,value:l.label,description:l.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[R]),y=_8((l)=>{let T={...F,[R.header]:l};if(N(T),W<$.length-1)O(W+1),_(0),b([]),v(!1),z("");else q("submit"),H(0)},[F,R?.header,W,$.length]),S=_8((l)=>{let T=C[l];if(!T)return;if(T.value==="__other__"){v(!0);return}if(R.multiSelect)b((L)=>L.includes(T.value)?L.filter((I)=>I!==T.value):[...L,T.value]);else y(T.value)},[C,R?.multiSelect,y]),E=_8((l)=>{if(l.trim())y(l.trim())},[y]),c=_8(()=>{q("answering"),O(0),_(0),b([]),v(!1)},[]),J0=_8(()=>{Q(F)},[F,Q]);if(zJ((l,T)=>{if(T.ctrl&&l==="c"||T.meta&&l==="c"){G();return}if(A){if(T.escape)v(!1),z("");return}if(T.escape){Y();return}let L=parseInt(l);if(L>=1&&L<=C.length){S(L-1);return}if(T.upArrow){_((I)=>I>0?I-1:C.length-1);return}if(T.downArrow||T.tab){_((I)=>I<C.length-1?I+1:0);return}if(T.return){if(R.multiSelect&&w.length>0)y(w);else S(B);return}if(l===" "&&R.multiSelect){let I=C[B];if(I&&I.value!=="__other__")b((V)=>V.includes(I.value)?V.filter((k)=>k!==I.value):[...V,I.value]);return}},{isActive:U&&K==="answering"&&!A}),zJ((l,T)=>{if(T.ctrl&&l==="c"||T.meta&&l==="c"){G();return}if(T.escape){Y();return}if(T.upArrow||T.downArrow||T.tab){H((L)=>L===0?1:0);return}if(T.return){if(P===0)J0();else c();return}if(l.toLowerCase()==="y"){J0();return}if(l.toLowerCase()==="e"){c();return}},{isActive:U&&K==="submit"}),K==="submit")return W0($1,{flexDirection:"column",borderStyle:"round",borderColor:U?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[W0($1,{marginBottom:1,children:W0(Q1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W0(s5,{questions:$,answers:F},void 0,!1,void 0,this),W0($1,{flexDirection:"column",marginTop:1,children:[W0(Q1,{color:P===0?"yellow":void 0,bold:P===0,children:[P===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Q1,{color:P===1?"yellow":void 0,bold:P===1,children:[P===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0($1,{marginTop:1,children:W0(Q1,{color:"gray",children:"Enter to confirm · Up/Down to navigate · Y/E for quick select"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!R)return null;return W0($1,{flexDirection:"column",borderStyle:"round",borderColor:U?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[W0($1,{marginBottom:1,children:[W0(Q1,{backgroundColor:"blue",color:"white",children:[" ",R.header," "]},void 0,!0,void 0,this),W0(Q1,{children:[" ",R.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A?W0($1,{flexDirection:"column",marginTop:1,children:[W0(Q1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),W0($1,{marginTop:1,children:[W0(Q1,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0(i5,{value:M,onChange:z,onSubmit:E,focus:U},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0($1,{marginTop:1,children:W0(Q1,{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($1,{flexDirection:"column",children:C.map((l,T)=>W0(t5,{option:l,index:T,isSelected:w.includes(l.value),isMultiSelect:R.multiSelect,isHighlighted:B===T},l.value,!1,void 0,this))},void 0,!1,void 0,this),!A&&W0($1,{marginTop:1,flexDirection:"column",children:[W0(Q1,{color:"gray",children:R.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),R.multiSelect&&w.length>0&&W0(Q1,{color:"green",children:["Selected: ",w.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&W0($1,{marginTop:1,children:W0(Q1,{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 e5}from"node:path";import{Box as d$,Text as w1,useInput as $X}from"ink";import QX from"ink-select-input";import{useEffect as dQ,useMemo as l$,useRef as BJ,useState as R2}from"react";function NJ($){return`${$.projectPath}\x00${$.sessionId}`}function FJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function HJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function WJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function LJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as l0}from"react/jsx-dev-runtime";function JX($){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 YX($){return e5($)}function ZX($){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 XX=({isSelected:$})=>l0(d$,{marginRight:1,children:l0(w1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),UX=({isSelected:$,label:Q})=>l0(w1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),N8=20,wJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=R2([]),[U,G]=R2(!1),[K,q]=R2(0),[W,O]=R2(!1),F=BJ(!1),N=BJ(!0);dQ(()=>{return N.current=!0,()=>{N.current=!1}},[]);let _=s0()==="session-selector",w=k0(!1);$X((R,C)=>{if(C.ctrl&&R==="c"||C.meta&&R==="c"){w();return}if(F.current)return;if(C.escape&&J){J();return}if(C.leftArrow||R==="h"||R==="H"){if(K>0)q((y)=>y-1);return}if(C.rightArrow||R==="l"||R==="L"){if(K<M-1)q((y)=>y+1);return}},{isActive:_}),dQ(()=>{if(Q){X(Q);return}(async()=>{G(!0);try{let C=await E0.listSessions({includeSubagents:!1});X(C)}catch(C){console.error("[SessionSelector] Failed to load sessions:",C),X([])}finally{G(!1)}})()},[Q]);let b=l$(()=>WJ(Q||Z,$),[$,Q,Z]),A=l$(()=>LJ($),[$]),v=l$(()=>{return b.map((R)=>{let C=YX(R.taskSourceProjectPath??R.projectPath),y=JX(R.lastMessageTime),S=FJ(R),E=`[${ZX(R.taskStatus)}]`,c=R.gitBranch?` (${R.gitBranch})`:"",J0=R.hasErrors?" [!]":"",l=R.taskRetriedFrom?` ↻ retry:${R.taskRetriedFrom.sessionId.slice(0,6)}`:R.relationType==="subagent"?" ↳ subagent":R.relationType==="fork"?" ↳ fork":"",T=R.taskIsolation==="worktree"?` | wt:${R.taskWorktreeBranch??"managed"}`:R.taskIsolation==="local"?" | local":"",L=R.taskDiffStat?` | ${R.taskDiffStat.changedFiles} files +${R.taskDiffStat.additions} -${R.taskDiffStat.deletions}`:"",I=R.taskStatus==="queued"&&R.taskQueuePosition?` | queue:${R.taskQueuePosition}/${R.taskQueueDepth??R.taskQueuePosition}`:"",V=HJ(R);return{key:NJ(R),label:`${E} ${S} · ${y} | ${C}${c} | ${R.messageCount} 条消息${T}${I}${L}${V}${J0}${l}`,value:R}})},[b]),M=l$(()=>Math.max(1,Math.ceil(v.length/N8)),[v.length]),z=l$(()=>{let R=K*N8;return v.slice(R,R+N8)},[v,K]),P=l$(()=>({start:K*N8+1,end:Math.min((K+1)*N8,v.length)}),[K,v.length]);dQ(()=>{q(0)},[b.length]);let H=(R)=>{if(F.current)return;F.current=!0,O(!0);let C=()=>{if(!N.current)return;F.current=!1,O(!1)};Promise.resolve().then(()=>Y(R.value)).then(C,C)};if(U)return l0(d$,{flexDirection:"column",paddingX:2,paddingY:1,children:l0(w1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(b.length===0)return l0(d$,{flexDirection:"column",paddingX:2,paddingY:1,children:[l0(w1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),l0(w1,{dimColor:!0,children:[`
158
- `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return l0(d$,{flexDirection:"column",paddingX:2,paddingY:1,children:[l0(w1,{bold:!0,color:"cyan",children:A.title},void 0,!1,void 0,this),l0(w1,{dimColor:!0,children:[`
159
- `,A.instructions,`
160
- `]},void 0,!0,void 0,this),l0(QX,{items:z,onSelect:H,isFocused:_&&!W,indicatorComponent:XX,itemComponent:UX},void 0,!1,void 0,this),W&&l0(w1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),l0(d$,{marginTop:1,flexDirection:"column",children:[l0(w1,{dimColor:!0,children:["第 ",K+1,"/",M," 页 · 共 ",b.length," 个会话 · 显示"," ",P.start,"-",P.end]},void 0,!0,void 0,this),M>1&&l0(d$,{marginTop:1,children:[l0(w1,{color:K>0?"cyan":"gray",children:K>0?"<< 上一页":" "},void 0,!1,void 0,this),l0(w1,{children:" "},void 0,!1,void 0,this),l0(w1,{color:K<M-1?"cyan":"gray",children:K<M-1?"下一页 >>":""},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as g0,Text as C0,useInput as GX}from"ink";import{jsxDEV as s}from"react/jsx-dev-runtime";function AJ({onCancel:$}){let Q=M1(),J=bJ({cwd:Q}).getAll(),Z=J.filter((K)=>K.source==="builtin"),X=J.filter((K)=>K.source==="user"),U=J.filter((K)=>K.source==="project"),G=k0(!1,$);if(GX((K,q)=>{if(q.escape)$?.();else if(q.ctrl&&K==="c"||q.meta&&K==="c")G()}),J.length===0)return s(g0,{flexDirection:"column",paddingY:1,children:[s(g0,{marginBottom:1,children:s(C0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(g0,{paddingLeft:2,children:s(C0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(g0,{marginTop:1,paddingLeft:2,children:s(C0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(g0,{marginTop:1,children:s(C0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return s(g0,{flexDirection:"column",paddingY:1,children:[s(g0,{marginBottom:1,children:[s(C0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),s(C0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U.length>0&&s(g0,{flexDirection:"column",marginBottom:1,children:[s(g0,{paddingLeft:1,children:[s(C0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),s(C0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return s(g0,{flexDirection:"column",paddingLeft:2,children:[s(C0,{children:[s(C0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),s(C0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&s(g0,{paddingLeft:2,children:s(C0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),s(g0,{paddingLeft:2,children:s(C0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&s(g0,{flexDirection:"column",marginBottom:1,children:[s(g0,{paddingLeft:1,children:[s(C0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),s(C0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return s(g0,{flexDirection:"column",paddingLeft:2,children:[s(C0,{children:[s(C0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),s(C0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&s(g0,{paddingLeft:2,children:s(C0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),s(g0,{paddingLeft:2,children:s(C0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&s(g0,{flexDirection:"column",marginBottom:1,children:[s(g0,{paddingLeft:1,children:[s(C0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),s(C0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return s(g0,{flexDirection:"column",paddingLeft:2,children:[s(C0,{children:[s(C0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),s(C0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&s(g0,{paddingLeft:2,children:s(C0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),s(g0,{marginTop:1,children:s(C0,{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 PJ,Text as x1}from"ink";import KX,{useEffect as qX,useMemo as OX,useState as RJ}from"react";import{jsxDEV as z1,Fragment as MJ}from"react/jsx-dev-runtime";var yJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function zX($){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 IJ=KX.memo(()=>{let $=$0((q)=>q.app.subagentProgresses),Q=$0((q)=>q.app.subagentProgress),Y=b0(),[J,Z]=RJ(0),[X,U]=RJ(()=>Date.now()),G=OX(()=>{let q=Object.values($);return q.length>0?q:Q?[Q]:[]},[Q,$]),K=G.some((q)=>q.status==="running");if(qX(()=>{if(!K){Z(0);return}let q=setInterval(()=>{Z((O)=>(O+1)%yJ.length)},80),W=setInterval(()=>{U(Date.now())},1000);return()=>{clearInterval(q),clearInterval(W)}},[K]),G.length===0)return null;return z1(PJ,{paddingX:2,paddingY:0,flexDirection:"column",children:G.map((q)=>{let W=q.status==="running"?yJ[J]:q.status==="completed"?"[OK]":"[X]",O=q.status==="running"?Y.colors.info:q.status==="completed"?Y.colors.success:Y.colors.error,F=Math.max(0,X-q.startTime);return z1(PJ,{flexDirection:"row",gap:1,children:[z1(x1,{color:O,bold:!0,children:W},void 0,!1,void 0,this),z1(x1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),z1(x1,{color:Y.colors.text.primary,bold:!0,children:q.type},void 0,!1,void 0,this),z1(x1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),z1(x1,{color:Y.colors.text.secondary,children:q.description},void 0,!1,void 0,this),q.currentTool&&z1(MJ,{children:[z1(x1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),z1(x1,{color:Y.colors.warning,children:q.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="running"&&F>0&&z1(MJ,{children:[z1(x1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),z1(x1,{color:Y.colors.info,children:zX(F)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},q.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as _X}from"ahooks";import{Box as v1,Text as d,useInput as NX}from"ink";import FX from"ink-select-input";import{useState as CJ}from"react";import{jsxDEV as p}from"react/jsx-dev-runtime";var TJ=R$.map(($)=>({label:$.label,value:$.id})),HX=({theme:$})=>{let{colors:Q}=$;return p(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[p(d,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),p(d,{children:" "},void 0,!1,void 0,this),p(d,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),p(d,{children:[p(d,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),p(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),p(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),p(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p(d,{children:[" ",p(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),p(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),p(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p(d,{children:[" ",p(d,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),p(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),p(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),p(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p(d,{children:[" ",p(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),p(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),p(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p(d,{children:[" ",p(d,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",p(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p(d,{children:" "},void 0,!1,void 0,this),p(d,{color:Q.error,children:["- print(",p(d,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),p(d,{color:Q.success,children:["+ print(",p(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)},WX=({theme:$})=>{let{colors:Q}=$;return p(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[p(d,{children:" "},void 0,!1,void 0,this),p(d,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),p(d,{children:" "},void 0,!1,void 0,this),p(d,{children:[p(d,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),p(d,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p(d,{children:[p(d,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),p(d,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p(d,{children:[p(d,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),p(d,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p(d,{children:[p(d,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),p(d,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p(d,{children:[p(d,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),p(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)},vJ=()=>{let $=r1(),Q=d0.getCurrentThemeName(),Y=R$.findIndex((B)=>B.label===Q),J=Y>=0?R$[Y].theme:R$[0].theme,[Z,X]=CJ(J),[U,G]=CJ(!1),K=_X(async(B)=>{if(U)return;G(!0);try{await u0().setTheme(B.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{G(!1)}}),q=(B)=>{let _=R$.find((w)=>w.id===B.value);if(_)X(_.theme)},O=s0()==="theme-selector",F=k0(!1);NX((B,_)=>{if(_.ctrl&&B==="c"||_.meta&&B==="c"){F();return}if(_.escape&&!U)$.closeModal()},{isActive:O});let N=(B)=>{let{isSelected:_,label:w}=B,A=w===Q?"[OK]":" ";return p(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[A," ",w]},void 0,!0,void 0,this)};return p(v1,{flexDirection:"column",height:"100%",children:[p(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:p(d,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(v1,{flexDirection:"row",flexGrow:1,children:[p(v1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:p(v1,{flexDirection:"column",children:[p(v1,{paddingTop:1,paddingBottom:1,children:p(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",TJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),p(FX,{items:TJ,initialIndex:Y>=0?Y:0,onSelect:K,onHighlight:q,itemComponent:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),p(v1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[p(HX,{theme:Z},void 0,!1,void 0,this),p(WX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:p(d,{color:Z.colors.text.muted,children:U?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as R0}from"react/jsx-dev-runtime";var U1=o1("UI"),fJ=({debug:$,continue:Q,...Y})=>{if($)U1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=y2(!1),Z=y2(!1),X=y2(!1),U=y2(null),G=eQ(),K=$4(),q=A8(),W=Y4(),O=J4(),F=r1(),N=d1(),B=M1(),_=K4(),w=C$(),b=a1(),A=G4();G$(()=>{if(d0.getCurrentThemeName()!==A)try{d0.setTheme(A)}catch{}},[A]);let v=G==="ready",M=G==="needsSetup",z=G==="idle",P=LX(()=>Y.agents?SJ(Y.agents):void 0,[Y.agents]),{confirmationState:H,confirmationHandler:R,handleResponse:C,dismissAll:y}=p4(),{executeCommand:S,handleAbort:E,cleanupAgent:c}=E4(Y.systemPrompt,Y.appendSystemPrompt,R,Y.maxTurns,y,P),{getPreviousCommand:J0,getNextCommand:l,addToHistory:T}=g4();J6();let L=x4("",0),I=t0(async()=>{let r=w,U0;if(r==="default")U0="autoEdit";else if(r==="autoEdit")U0="plan";else if(r==="plan")U0="default";else U0="default";try{await u0().setPermissionMode(U0)}catch(v0){U1.error("权限模式切换失败:",v0 instanceof Error?v0.message:v0)}}),V=t0(async(r)=>{try{let U0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await u0().addModelWithProvider(U0,r.modelProvider);else await u0().addModel(U0);F.setInitializationStatus("ready")}catch(U0){throw U1.error("初始化配置保存失败:",U0 instanceof Error?U0.message:U0),U0}}),k=t0(()=>{if(q==="shortcuts")F.closeModal();else F.setActiveModal("shortcuts")}),u=t0(async(r,U0,v0)=>{return E8({intent:U0,session:r,newSessionId:v0?.newSessionId,announceFork:v0?.announceFork},B,N,c)}),j=t0(async(r,U0)=>{let S1=(await j8(U0,B)).filter((c0)=>c0.sessionId===r);if(S1.length===0)throw Error(`Session not found: ${r}`);if(S1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return S1[0]}),{showSuggestions:m,suggestions:f,selectedSuggestionIndex:n}=Q6(L,S,J0,l,T,E,b,I,k,q==="shortcuts");G$(()=>{if(L.value&&q==="shortcuts")F.closeModal()},[L.value,q,F]);let _0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",U0=await j8(r,B);if(U0.length===0){if(Y.forkSession){U1.error("没有可供 fork 的历史会话"),I1(1);return}N.addAssistantMessage("没有找到历史会话,开始新对话。");return}let v0=U0[0];await u(v0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(U1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){I1(1);return}N.addAssistantMessage("继续会话失败,开始新对话。")}}),N0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let v0=Y.forkSession?"fork":"resume",L8=await j(Y.resume,v0);await u(L8,v0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",U0=await j8(r,B);if(U0.length===0)U1.error("没有找到历史会话"),I1(1);F.showSessionSelector(U0,r)}catch(r){U1.error("[BladeInterface] 加载会话失败:",r),I1(1)}});G$(()=>{if(J.current)return;if(Q){J.current=!0,_0();return}if(Y.resume)J.current=!0,N0()},[Q,Y.resume,_0,N0]);let m0=t0(async(r)=>{let U0=H.details?.type;if(U0==="enterPlanMode"&&r.approved)try{await u0().setPermissionMode("plan"),U1.debug("[BladeInterface] Entered Plan mode")}catch(v0){U1.error("[BladeInterface] Failed to enter Plan mode:",v0)}if(U0==="exitPlanMode"&&r.approved)U1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");C(r)}),D0=t0(()=>{N.addAssistantMessage("设置已取消"),N.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),N.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),I1(0)}),w0=t0(()=>{F.closeModal()}),_1=t0(async(r)=>{try{await u(r,W?.intent??"resume"),F.closeModal()}catch(U0){U1.error("[BladeInterface] Failed to restore session:",U0),N.addAssistantMessage(`会话操作失败: ${U0 instanceof Error?U0.message:"未知错误"}`),F.closeModal()}}),N1=t0(()=>{if(Y.resume)I1(0);else F.closeModal()}),M$=t0((r)=>{F.showModelEditWizard(r)}),G1=t0((r)=>{N.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),w0()}),v2=t0((r)=>{N.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),w0()});G$(()=>{if(M){_.setFocus("model-config-wizard");return}if(H.isVisible)_.setFocus("confirmation-prompt");else if(q==="sessionSelector")_.setFocus("session-selector");else if(q==="themeSelector")_.setFocus("theme-selector");else if(q==="modelSelector")_.setFocus("model-selector");else if(q==="modelAddWizard"||q==="modelEditWizard")_.setFocus("model-config-wizard");else if(q==="permissionsManager")_.setFocus("permissions-manager");else if(q==="agentsManager")_.setFocus("agents-manager");else if(q==="agentCreationWizard")_.setFocus("agent-creation-wizard");else if(q==="hooksManager")_.setFocus("hooks-manager");else if(q==="shortcuts")_.setFocus("main-input");else _.setFocus("main-input")},[M,H.isVisible,q,_.setFocus]),G$(()=>{if(!v||X.current)return;if(kJ().length>0){X.current=!0;return}X.current=!0,N.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[v]),G$(()=>{if(!K)return;if(U.current===K)return;if(U.current=K,G==="error")N.addAssistantMessage(`初始化失败: ${K}`);else N.addAssistantMessage(`${K}`),N.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,G,N.addAssistantMessage]);let q$=t0(async(r)=>{try{await S({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(U0){let v0=U0 instanceof Error?U0.message:"无法发送初始消息";N.addAssistantMessage(`初始消息发送失败:${v0}`)}});G$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!v||M)return;Z.current=!0,T(r),q$(r)},[Y.initialMessage,v,M,S,T]);let k2=t0(async(r)=>{try{await u0().setPermissionMode(r)}catch(U0){U1.error("权限模式初始化失败:",U0 instanceof Error?U0.message:U0)}});if(G$(()=>{let r=Y.permissionMode;if($)U1.debug("[Debug] permissionMode from CLI:",r),U1.debug("[Debug] current permissionMode:",w);if(!r||r===w)return;k2(r)},[Y.permissionMode,w]),z)return null;if(M)return R0(uQ,{mode:"setup",onComplete:V,onCancel:D0},void 0,!1,void 0,this);if($)U1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:H.isVisible,activeModal:q});let X0=q==="modelSelector",T0=O,e=q==="modelAddWizard"?"add":q==="modelEditWizard"&&T0?"edit":null,O0=X0||Boolean(e),x0=q==="agentsManager",o0=q==="agentCreationWizard",p0=q==="skillsManager",S2=q==="pluginsManager",o$=T0?{displayName:T0.displayName,provider:T0.provider,model:T0.model,overrides:T0.overrides}:void 0,H8=H.isVisible&&H.details?H.details.type==="mcpElicitation"&&H.details.mcpElicitation?R0(A9,{details:H.details.mcpElicitation,onComplete:(r,U0)=>m0({approved:r.action==="accept",elicitation:r,...U0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):H.details.type==="askUserQuestion"&&H.details.questions?R0(_J,{questions:H.details.questions,onComplete:(r)=>m0({approved:!0,answers:r}),onCancel:()=>m0({approved:!1})},void 0,!1,void 0,this):R0(u6,{details:H.details,onResponse:m0},void 0,!1,void 0,this):q==="themeSelector"?R0(vJ,{},void 0,!1,void 0,this):q==="permissionsManager"?R0(ZJ,{onClose:w0},void 0,!1,void 0,this):q==="sessionSelector"?R0(wJ,{intent:W?.intent??"resume",sessions:W?.sessions,onSelect:_1,onCancel:N1},void 0,!1,void 0,this):q==="hooksManager"?R0(d6,{onClose:w0},void 0,!1,void 0,this):null,W8=Boolean(H8);return R0(U$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[H8,R0(U$,{flexDirection:"column",display:W8?"none":"flex",children:[R0(h9,{},void 0,!1,void 0,this),R0(IJ,{},void 0,!1,void 0,this),R0(L9,{paused:W8},void 0,!1,void 0,this),R0(O9,{input:L.value,cursorPosition:L.cursorPosition,onChange:L.setValue,onChangeCursorPosition:L.setCursorPosition,onAddPasteMapping:L.addPasteMapping,onAddImagePasteMapping:L.addImagePasteMapping},void 0,!1,void 0,this),X0&&R0(U$,{marginTop:1,paddingX:2,children:R0(g9,{onClose:w0,onEdit:M$},void 0,!1,void 0,this)},void 0,!1,void 0,this),e&&R0(U$,{marginTop:1,paddingX:2,children:R0(uQ,{mode:e,modelId:T0?.id,initialConfig:e==="edit"?o$:void 0,onComplete:e==="edit"?v2:G1,onCancel:w0},void 0,!1,void 0,this)},void 0,!1,void 0,this),x0&&R0(U$,{marginTop:1,paddingX:2,children:R0(K6,{workspaceRoot:B,onComplete:w0,onCancel:w0},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0&&R0(U$,{marginTop:1,paddingX:2,children:R0(Y8,{onComplete:w0,onCancel:w0},void 0,!1,void 0,this)},void 0,!1,void 0,this),p0&&R0(U$,{marginTop:1,paddingX:2,children:R0(AJ,{onComplete:w0,onCancel:w0},void 0,!1,void 0,this)},void 0,!1,void 0,this),S2&&R0(U$,{marginTop:1,paddingX:2,children:R0(OJ,{workspaceRoot:B,onComplete:w0,onCancel:w0},void 0,!1,void 0,this)},void 0,!1,void 0,this),R0(F6,{suggestions:f,selectedIndex:n,visible:m&&!O0},void 0,!1,void 0,this),R0(N6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as BX,Text as K$}from"ink";import wX from"react";import{jsxDEV as u1}from"react/jsx-dev-runtime";class F8 extends wX.Component{constructor($){super($);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError($){return{hasError:!0,error:$,errorInfo:null}}componentDidCatch($,Q){this.setState({error:$,errorInfo:Q}),console.error("未捕获的错误:",$,Q)}render(){if(this.state.hasError)return u1(BX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[u1(K$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),u1(K$,{children:" "},void 0,!1,void 0,this),u1(K$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),u1(K$,{children:" "},void 0,!1,void 0,this),u1(K$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),u1(K$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),u1(K$,{children:" "},void 0,!1,void 0,this),u1(K$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as y$,Text as l1,useInput as bX}from"ink";import{useState as rQ}from"react";import{jsxDEV as J1}from"react/jsx-dev-runtime";var M2=[{key:"update",label:"Update now",description:`runs \`${VJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],EJ=({versionInfo:$,onComplete:Q})=>{let[Y,J]=rQ(0),[Z,X]=rQ(!1),[U,G]=rQ(null);bX((q,W)=>{if(W.ctrl&&q==="c"){Q8().shutdown("SIGINT",0);return}if(Z||U)return;if(W.upArrow||q==="k")J((O)=>O>0?O-1:M2.length-1);else if(W.downArrow||q==="j")J((O)=>O<M2.length-1?O+1:0);else if(W.return)K(M2[Y].key);else if(q==="1")K("update");else if(q==="2")K("skip");else if(q==="3")K("skip_until_next")});let K=async(q)=>{switch(q){case"update":{X(!0);let W=await jJ();G(W.message),setTimeout(()=>{Q8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await DJ($.latestVersion);Q();break}};if(U)return J1(y$,{flexDirection:"column",marginY:1,children:J1(l1,{children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return J1(y$,{flexDirection:"column",marginY:1,children:J1(l1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return J1(y$,{flexDirection:"column",marginY:1,children:[J1(l1,{color:"yellow",bold:!0,children:["Update available! ",J1(l1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J1(y$,{marginTop:1,children:J1(l1,{color:"gray",children:["Release notes:"," ",J1(l1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),J1(y$,{flexDirection:"column",marginTop:1,children:M2.map((q,W)=>{let O=W===Y,F=O?"› ":" ",N=`${W+1}. `;return J1(y$,{children:J1(l1,{color:O?"cyan":void 0,children:[F,N,q.label,q.description&&J1(l1,{color:"gray",children:[" (",q.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},q.key,!1,void 0,this)})},void 0,!1,void 0,this),J1(y$,{marginTop:1,children:J1(l1,{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 I2,Text as r$,useInput as AX}from"ink";import{useState as hJ}from"react";import{jsxDEV as k1}from"react/jsx-dev-runtime";var gJ=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=d0.getTheme(),[Z,X]=hJ(!1),[U,G]=hJ(null);return AX((K,q)=>{if(Z)return;if(q.return||K.toLowerCase()==="t"){X(!0),G(null),Q().catch((W)=>{G(W instanceof Error?W.message:"Failed to trust workspace"),X(!1)});return}if(K.toLowerCase()==="s"||q.escape)X(!0),G(null),Y().catch((W)=>{G(W instanceof Error?W.message:"Failed to continue safely"),X(!1)})}),k1(I2,{flexDirection:"column",paddingX:1,children:[k1(r$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),k1(r$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),k1(I2,{marginTop:1,flexDirection:"column",children:[k1(r$,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((K)=>k1(r$,{children:[" ",K.path," · ",K.effects.length," effect(s)"]},`${K.kind}:${K.path}`,!0,void 0,this))]},void 0,!0,void 0,this),U&&k1(I2,{marginTop:1,children:k1(r$,{color:J.colors.error,children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),k1(I2,{marginTop:1,children:k1(r$,{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 PX}from"ink";import{useEffect as RX}from"react";function mJ(){let{stdout:$}=PX();RX(()=>{if(!$.isTTY)return;return $.write(o6),$.write(MQ),()=>{$.write(i6),$.write(MQ)}},[$])}function pJ($){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 a$}from"react/jsx-dev-runtime";function MX($){if(Y1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");r0().setInitializationStatus("ready")}var EF=($)=>{mJ();let[Q,Y]=T2(!1),[J,Z]=T2(null),[X,U]=T2(!1),[G,K]=T2(null),q=C2((N,B)=>{let _=N instanceof Error?N.message:String(N);if(r0().setInitializationError(_),r0().setInitializationStatus("error"),Y(!0),B)console.error("[FAIL] 应用初始化失败:",_)}),W=C2(async()=>{try{let N=Y1().config.config??xJ,B=uJ(N,$);if(MX(B),B.resumeSessionId)lJ().restoreSession(B.resumeSessionId,[]);if(B.debug)console.error("[Debug] 运行时配置:",B);let _=B.theme;if(_&&d0.hasTheme(_)){if(d0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{F1.getInstance().loadConfig(B.hooks||{},A0());let b=await dJ(A0());if($.debug&&B.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${b.subagents.getAllNames().length} agents, ${b.skills.size} skills, ${b.commands.getCommandCount()+b.commands.getPluginCommandCount()} commands, ${b.plugins.getAll().length} plugins`);let v=Y1().session.sessionId;cJ(v)}catch(w){if($.debug)console.warn("Hooks 初始化失败:",pJ(w))}g8(async()=>{await aJ.getInstance().killAll(),await rJ.getInstance().disconnectAll(),F1.getInstance().cleanup()}),Y(!0)}catch(N){q(N,!!$.debug)}}),O=C2(async()=>{let N=await aQ.getInstance().getStatus(A0());if(N.state==="untrusted"||N.state==="error"){K(N);return}await W()}),F=C2(async()=>{if($.versionCheckPromise){let N=await $.versionCheckPromise;if(N){Z(N),U(!0);return}}await O()});if(yX(()=>{F()},[]),X&&J)return a$(F8,{children:a$(EJ,{versionInfo:J,onComplete:()=>{U(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(G)return a$(F8,{children:a$(gJ,{status:G,onTrust:async()=>{await aQ.getInstance().trust(A0()),await oJ(),K(null),await W()},onContinueSafely:async()=>{K(null),await W()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return a$(F8,{children:a$(fJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{EF as AppWrapper};