blade-code 0.10.99 → 0.10.101

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 (70) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-r22mdmtr.js → chunk-2191220r.js} +1 -1
  3. package/dist/{chunk-bdbyy2ah.js → chunk-2cg8f38t.js} +1 -1
  4. package/dist/{chunk-ap8539bw.js → chunk-2f5kkhan.js} +274 -274
  5. package/dist/chunk-2r0f3b4t.js +1 -0
  6. package/dist/{chunk-qdgwprcv.js → chunk-3an3vxzt.js} +1 -1
  7. package/dist/{chunk-2jffgzdf.js → chunk-3c01jje5.js} +1 -1
  8. package/dist/{chunk-12vzyc3x.js → chunk-8yt4nmyb.js} +1 -1
  9. package/dist/chunk-8z9d0zd0.js +2 -0
  10. package/dist/chunk-9ajkzcqj.js +12 -0
  11. package/dist/chunk-as2ezx8p.js +1 -0
  12. package/dist/{chunk-vd6kmnc7.js → chunk-bswjne5v.js} +1 -1
  13. package/dist/{chunk-9z0yx0bn.js → chunk-c663rajb.js} +1 -1
  14. package/dist/chunk-cjgpas7y.js +23 -0
  15. package/dist/{chunk-6yz49rz2.js → chunk-dcjh1cj6.js} +1 -1
  16. package/dist/{chunk-71jnx206.js → chunk-f8z5v101.js} +1 -1
  17. package/dist/{chunk-ga15nptz.js → chunk-fqbc1ppx.js} +1 -1
  18. package/dist/{chunk-h8qjkxee.js → chunk-hpjnk87v.js} +18 -18
  19. package/dist/{chunk-1gjn9bp7.js → chunk-j22d84s7.js} +1 -1
  20. package/dist/{chunk-45sgvghd.js → chunk-jvxskq6a.js} +1 -1
  21. package/dist/{chunk-6vcy0nq7.js → chunk-kdatgrjy.js} +1 -1
  22. package/dist/{chunk-akfez2cs.js → chunk-kfcs62nw.js} +1 -1
  23. package/dist/{chunk-gmnv1jme.js → chunk-mzab7qak.js} +1 -1
  24. package/dist/{chunk-xg959k9w.js → chunk-n5jfmzp2.js} +1 -1
  25. package/dist/{chunk-d7j7z8hy.js → chunk-nh4jy5cs.js} +9 -1
  26. package/dist/{chunk-hyk4fw18.js → chunk-qgjgjzbx.js} +1 -1
  27. package/dist/{chunk-5dkzqgxa.js → chunk-qjeadpj2.js} +1 -1
  28. package/dist/chunk-qjv5kz7q.js +171 -0
  29. package/dist/chunk-sa7t9kht.js +6 -0
  30. package/dist/{chunk-p7zvg7e3.js → chunk-tazb5tze.js} +1 -1
  31. package/dist/chunk-tc9rq0st.js +160 -0
  32. package/dist/{chunk-a42rvwg4.js → chunk-tp5bep1y.js} +1 -1
  33. package/dist/{chunk-qwjfxvda.js → chunk-twhf09qs.js} +1 -1
  34. package/dist/{chunk-et6pvc3y.js → chunk-vc7gh3wc.js} +1 -1
  35. package/dist/{chunk-pmb5kr86.js → chunk-wbf4qcws.js} +2 -2
  36. package/dist/chunk-ykf4cqpg.js +8 -0
  37. package/dist/{chunk-1pscfw5q.js → chunk-z0dmm227.js} +1 -1
  38. package/dist/{chunk-fqwq3626.js → chunk-z5a8ay9s.js} +1 -1
  39. package/dist/{chunk-gwj637ey.js → chunk-zjpph3ys.js} +1 -1
  40. package/dist/{chunk-x5j6nexe.js → chunk-zydvg30x.js} +1 -1
  41. package/dist/web/assets/{ChatView-Cwc3fRAC.js → ChatView-Cc4bXZ6x.js} +14 -14
  42. package/dist/web/assets/{CodeBlockHighlighter-IGDocZUy.js → CodeBlockHighlighter-DZcVFtJE.js} +1 -1
  43. package/dist/web/assets/{FilePreview-EWE-k9VN.js → FilePreview-CzNS6kfM.js} +1 -1
  44. package/dist/web/assets/{KanbanBoard-FiiVQgTQ.js → KanbanBoard-cdh2g0r0.js} +1 -1
  45. package/dist/web/assets/{MarkdownRenderer-DjhWmikM.js → MarkdownRenderer-BqBOUlXa.js} +3 -3
  46. package/dist/web/assets/{SettingsModal-bHPx0fVG.js → SettingsModal-meSWhCOP.js} +1 -1
  47. package/dist/web/assets/{TaskSwitcher-CclOfJEl.js → TaskSwitcher-CiQi64Yl.js} +1 -1
  48. package/dist/web/assets/{TerminalPanel-Bnep8jE2.js → TerminalPanel-Bze9t5mz.js} +1 -1
  49. package/dist/web/assets/{arrow-left-CiX0E9Mt.js → arrow-left-DpTnLOBT.js} +1 -1
  50. package/dist/web/assets/{calendar-clock-Bgfr-twh.js → calendar-clock-DlAXXpl_.js} +1 -1
  51. package/dist/web/assets/{chevrons-up-down-B4T5fHUs.js → chevrons-up-down-CmAktdaR.js} +1 -1
  52. package/dist/web/assets/{clock-3-CGIhJjon.js → clock-3-_w8nIuEK.js} +1 -1
  53. package/dist/web/assets/{external-link-DnQv1VYE.js → external-link-AlymrIfc.js} +1 -1
  54. package/dist/web/assets/{folder-C5f8TpGj.js → folder-CrxO-9Rc.js} +1 -1
  55. package/dist/web/assets/{index-DNoVz0u1.js → index-JJH0FKfo.js} +5 -5
  56. package/dist/web/assets/{pause-Cb0ijwnO.js → pause-GQZaG_P3.js} +1 -1
  57. package/dist/web/assets/{play-Dsw1qmpk.js → play-BPhmPVpi.js} +1 -1
  58. package/dist/web/assets/{session-events-B4Cq2TwN.js → session-events-CO2pRY9U.js} +8 -8
  59. package/dist/web/assets/{teamService-C69fFhny.js → teamService-BqS4iOx0.js} +1 -1
  60. package/dist/web/index.html +2 -2
  61. package/package.json +1 -1
  62. package/dist/chunk-3ghvdscg.js +0 -9
  63. package/dist/chunk-5tq3s9h5.js +0 -160
  64. package/dist/chunk-c2s9rgyj.js +0 -1
  65. package/dist/chunk-cc3d4nne.js +0 -23
  66. package/dist/chunk-hcz98dbj.js +0 -1
  67. package/dist/chunk-mhfwp1f0.js +0 -2
  68. package/dist/chunk-mq4x8zhq.js +0 -171
  69. package/dist/chunk-spdrxj5e.js +0 -6
  70. package/dist/chunk-xz5ar75z.js +0 -8
@@ -1,160 +0,0 @@
1
- import{e as DJ,f as VJ}from"./chunk-j00px1es.js";import{i as RY,j as MY,k as TY}from"./chunk-71jnx206.js";import{u as s2}from"./chunk-a42rvwg4.js";import{B as c6,F as gY,H as OQ,I as XQ,J as v6,P as A6,Q as P6,U as j1,W as e4,X as $6,_ as y6,aa as z2,ba as nJ,ca as tJ,fa as sJ,ga as eJ,ka as L4,la as $9,na as t6,oa as s6,pa as mY,qa as O6,sa as z6,ua as x6}from"./chunk-ap8539bw.js";import"./chunk-0zhdjaen.js";import{Ca as qJ,Da as OJ,Ea as zJ,Ha as EY}from"./chunk-bdbyy2ah.js";import{Ja as b6}from"./chunk-hz5rsfxv.js";import{Db as w6,Mb as QQ,qb as L6,rb as B6}from"./chunk-mq4x8zhq.js";import{Xb as W2}from"./chunk-8hprmrd5.js";import{Bd as Y6,Cd as $Q,Dd as Z6,Fd as d2,Nd as O2,Qd as C0,ad as _6,pd as t4,ud as s4}from"./chunk-x5j6nexe.js";import"./chunk-s0tq8gyx.js";import"./chunk-h8qjkxee.js";import{te as PY}from"./chunk-10taec1j.js";import{ue as H2,ve as e2,xe as C1}from"./chunk-12vzyc3x.js";import"./chunk-rej5bbbs.js";import{$e as p0,Be as k$,Ce as a0,De as Q$,Ee as jQ,Fe as g$,Ge as r2,He as v9,Ie as Q4,Je as MJ,Ke as D9,Le as V$,Me as l0,Ne as jY,Oe as o0,Pe as AY,Qe as D8,Re as N2,Ue as U6}from"./chunk-1pscfw5q.js";import"./chunk-v508x7cg.js";import"./chunk-dg0d3303.js";import"./chunk-3awjdsef.js";import{pf as J4}from"./chunk-53xtssbf.js";import"./chunk-2hb222re.js";import"./chunk-r22mdmtr.js";import{Bf as Q8,Ef as _Y,Jf as iJ,Sf as hY}from"./chunk-d7j7z8hy.js";import"./chunk-fvfc95g3.js";import"./chunk-qcy79mva.js";import"./chunk-p0rvgzpx.js";import{mg as gQ,og as q1}from"./chunk-6yz49rz2.js";import"./chunk-c6tq09mt.js";import{qh as DY,vh as oJ,wh as VY}from"./chunk-fqwq3626.js";import"./chunk-f9asjkfz.js";import"./chunk-czcxx8tb.js";import{Fh as m$,Gh as a2,Ih as mQ}from"./chunk-maebpz1j.js";import{Nh as d0}from"./chunk-9sx3vsyj.js";import"./chunk-70hwyc2w.js";import{ki as vY,ni as t1}from"./chunk-d8wzc602.js";import{pi as kJ,qi as SJ,ti as h1}from"./chunk-425p4nwx.js";import"./chunk-k7vv9vne.js";import{Fi as bJ}from"./chunk-mhfwp1f0.js";import{Ii as F4}from"./chunk-cp7xsjj2.js";import"./chunk-2va6ex5v.js";import{Ti as e8}from"./chunk-q3vza5gt.js";import{Vi as EQ}from"./chunk-w9xfks7f.js";import{useMemoizedFn as u8}from"ahooks";import{useEffect as S7,useState as l8}from"react";import{useMemoizedFn as s0}from"ahooks";import{Box as z$}from"ink";import{useEffect as _$,useMemo as R7,useRef as p8}from"react";import{useShallow as uY}from"zustand/react/shallow";import{useStore as xY}from"zustand";function t($){return xY(V$,$)}var lY=[],j$=()=>t(($)=>$.session.sessionId),T1=()=>t(($)=>$.session.workspaceRoot),B4=()=>t(($)=>$.session.messages),w4=()=>t(($)=>$.session.clearCount),b4=()=>t(($)=>$.session.isCompacting),A4=()=>t(($)=>$.session.tokenUsage.estimatedCostUsd),P4=()=>t(($)=>{let{totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}=$.session.tokenUsage;return L4({totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}).hitRate}),y4=()=>t(($)=>$.session.providerCircuit),R4=()=>t(($)=>$.session.providerAdmission),M4=()=>t(($)=>$.session.providerRetry),T4=()=>t(($)=>$.session.providerStall),C4=()=>t(($)=>$.session.actionStationarity),i1=()=>t(($)=>$.session.actions),I4=()=>t(($)=>{let{totalTokens:Q,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Q/Y*100);return Math.round(J)}),f4=()=>t(($)=>$.app.initializationStatus),k4=()=>t(($)=>$.app.initializationError),D2=()=>t(($)=>$.app.activeModal),S4=()=>t(($)=>$.app.tasks),v4=()=>t(($)=>$.app.modelEditorTarget),D4=()=>t(($)=>$.app.sessionSelectorData),V4=()=>t(($)=>$.app.awaitingSecondCtrlC),n1=()=>t(($)=>$.app.actions),V2=()=>t(($)=>$.app.sideConversation),j4=()=>t(($)=>$.app.teams),j2=()=>t(($)=>$.app.initializationStatus==="ready"),h4=()=>t(($)=>$.app.tasks.length>0),h$=()=>t(($)=>$.config.config?.permissionMode||"default"),E4=()=>t(($)=>$.config.config?.models??lY),h2=()=>t(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),E2=()=>t(($)=>$.config.config?.currentModelId),g4=()=>t(($)=>$.config.config?.agentTeamsEnabled===!0),b0=()=>t(($)=>{return a0.getTheme()}),m4=()=>t(($)=>$.config.config?.codeTheme??"default"),e0=()=>t(($)=>$.focus.currentFocus),p4=()=>t(($)=>$.focus.actions),E$=()=>t(($)=>$.command.isProcessing),c4=()=>t(($)=>$.command.actions),g2=()=>t(($)=>$.command.pendingCommands),x4=()=>t(($)=>$.command.recoveredSteeringCount),m2=()=>t(($)=>$.app.reasoningEffort!=="off"),p2=()=>t(($)=>$.app.reasoningEffort),c2=()=>t(($)=>$.app.serviceTier),x2=()=>t(($)=>$.app.responseVerbosity),u2=()=>t(($)=>$.app.communicationStyle),u4=()=>t(($)=>$.session.currentThinkingContent),l4=()=>t(($)=>$.session.thinkingExpanded),d4=()=>t(($)=>$.session.currentStreamingMessageId),r4=()=>t(uY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),a4=()=>t(($)=>$.session.finalizingStreamingMessageId),o4=()=>t(($)=>$.session.historyExpanded),i4=()=>t(($)=>$.session.expandedMessageCount);import{useMemoizedFn as s1}from"ahooks";import{useEffect as c$,useRef as s8}from"react";function dY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let K=JSON.parse(J.responseBody)?.error?.message;if(K){let U=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${K}${U}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function rY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function aY($){if(!($ instanceof Error))return!1;let Q=$.message;return Q.includes("can only concatenate str")||Q.includes("image_url")||Q.includes("multimodal")||Q.includes("vision")||Q.includes("does not support images")}function l2($){let Q=rY($),Y=aY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=dY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as oY,mkdirSync as iY,writeFileSync as nY}from"node:fs";import tY from"node:os";import a8 from"node:path";var n4=null;function sY(){let $=process.env.BLADE_STORAGE_ROOT||a8.join(tY.homedir(),".blade");return a8.join($,"logs","stream-debug.log")}function eY($){if(n4===$)return;let Q=a8.dirname($);iY(Q,{recursive:!0,mode:493}),nY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
- `),n4=$}function o8($,Q,Y){try{let J=sY();eY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",K=`[${Z}] [${$}] ${Q}${X}
3
- `;oY(J,K)}catch{}}var q2=t1("UI");function Q6($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,o8("loopEventHandler","onContentDelta",{callCount:Q.contentDeltaCount,deltaLen:J.delta.length,totalLen:Q.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(J.delta);break;case"thinking_delta":if(Y||$.signal.aborted)break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(J.delta);break;case"stream_end":{if($.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),q2.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),o8("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),Y||$.signal.aborted){Y=!0;break}let{extraContent:Z,extraThinking:X}=$.streamingBuffer.drainPendingBuffers(),K=$.getStreamingMessageId();if(K){if(Z)g$(K,Z);r2(K)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"provider_admission":{let{kind:Z,...X}=J;$.sessionActions.setProviderAdmission(J.phase==="queued"?X:null);break}case"provider_circuit":{let{kind:Z,...X}=J;$.sessionActions.setProviderCircuit(J.phase==="closed"?null:X);break}case"provider_retry":{let{kind:Z,...X}=J;$.sessionActions.setProviderRetry(J.phase==="recovered"?null:X);break}case"provider_stall":{let{kind:Z,...X}=J;$.sessionActions.setProviderStall(J.phase==="detected"?X:null);break}case"action_stationarity":{let{kind:Z,...X}=J;$.sessionActions.setActionStationarity(J.phase==="recovered"?null:X);break}case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===d2)break;if(q2.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:J.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let X=JSON.parse(Z.function.arguments),K=e4(Z.function.name,X);$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:K,params:X})}catch(X){q2.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===d2)break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",K=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:K,...J.update.admission?{admission:J.update.admission}:{}});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===d2)break;q2.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=s4($6(Z.function.name,J.result),t4);$.sessionActions.addToolMessage(X.summary,{toolCallId:Z.id,toolName:Z.function.name,phase:"complete",summary:X.summary,detail:X.detail});break}case"structured_output":$.sessionActions.replaceLastAssistantMessage(JSON.stringify(J.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(J.usage);break;case"compaction":if($.sessionActions.setCompacting(J.phase==="start"),J.phase==="end"){if($.sessionActions.resetContextUsage(),J.outcome!=="failed")Q.compactionCount=(Q.compactionCount??0)+1}break;case"turn_start":q2.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
4
- `)});break}case"mcp_content_changed":{let Z=`MCP ${J.contentKind} r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Content",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
5
- `)});break}case"mcp_resource_updated":{let Z=`MCP resource updated: ${J.uri}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Resource",phase:"progress",summary:Z,detail:`${J.serverName} · revision ${J.revision}`});break}case"mcp_connection_changed":{let Z=J.phase==="reconnecting"?"recovering":J.phase==="recovered"?"recovered":"recovery failed",X=`MCP ${J.serverName} ${Z}`+(J.phase==="reconnecting"?` (${J.attempt}/${J.maxAttempts})`:"");$.sessionActions.addToolMessage(X,{toolName:"MCP Connection",phase:"complete",summary:X,detail:[`reason: ${J.reason}`,`revision: ${J.revision}`,J.error?`error: ${J.error}`:""].filter(Boolean).join(`
6
- `)});break}case"mcp_log":{let Z=J.logger?`${J.serverName} · ${J.logger}`:J.serverName,X=`MCP ${J.level} · ${Z}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Log",phase:"complete",summary:X,detail:[J.message,`revision: ${J.revision}`,`sha256: ${J.dataSha256}`,J.truncated?"truncated: true":"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
7
- `)});break}case"mcp_instructions_changed":{let Z=`MCP instructions ${J.action}: ${J.serverName}`+(J.truncated?" (truncated)":"");$.sessionActions.addToolMessage(Z,{toolName:"MCP Instructions",phase:"complete",summary:Z,detail:[J.text??"",J.sha256?`sha256: ${J.sha256}`:"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
8
- `)});break}case"mcp_task_changed":{let Z=`MCP task ${J.status}: ${J.taskId} (${J.serverName}/${J.toolName})`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Task",phase:"complete",summary:Z,detail:[J.statusMessage??"",`revision: ${J.revision}`,J.hasResult?"result available via TaskOutput":"",J.error?`error: ${J.error}`:""].filter(Boolean).join(`
9
- `)});break}case"project_rules_loaded":{let Z=`Project rules loaded: ${J.files.length}`+(J.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Z,{toolName:"Project Rules",phase:"complete",summary:Z,detail:J.files.map((X)=>`${X.relativePath} ${X.source} sha256=${X.contentSha256}`).join(`
10
- `)});break}case"steering_applied":for(let Z=0;Z<J.count;Z++)$.commandActions.dequeueCommand();if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"follow_up_started":for(let Z of J.messages){if(!Z.recovered||Z.persisted)continue;let X=typeof Z.content==="string"?Z.content:Z.content.map((K)=>K.type==="text"?K.text:"[Image]").join(`
11
- `);$.sessionActions.addUserMessage(X)}if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=J}}}}function n8($){let{text:Q,parts:Y}=$,J=Y.filter((K)=>K.type==="image");if(J.length===0)return Q;if(J.length>m$)throw Error(`最多只能发送 ${m$} 张图片`);if(J.reduce((K,U)=>K+`data:${U.mimeType};base64,`.length+U.base64.length,0)>a2)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let K of Y)if(K.type==="text")X.push({type:"text",text:K.text});else X.push({type:"image_url",image_url:{url:`data:${K.mimeType};base64,${K.base64}`}});return X}function J6($){let Q=Z6($.metadata);return{role:$.role,content:Q?Y6(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function o2($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(J6);let Q=$.messages.slice($.restoredVisibleMessageCount).map(J6);return[...$.restoredContextMessages,...Q]}import $3 from"node:path";function X6($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function Q3($){return $3.resolve($)}function K6($){if(!$||!U6($))return;l0().config.actions.updateConfig({currentModelId:$})}function G6($){if(!$)return;l0().config.actions.updateConfig({permissionMode:$})}async function i2($,Q){return C0.listSessions({includeSubagents:!1})}async function n2($,Q,Y,J){let{intent:Z,session:X,newSessionId:K,announceFork:U,permissionModeOverride:G}=$,q=Q3(X.projectPath);if(Z==="fork"){let z=await C0.forkSession(X.sessionId,{...K?{newSessionId:K}:{},sourceProjectPath:q,targetProjectPath:q}),b=await C0.loadSessionModelContext(z.sessionId,z.metadata.projectPath),N=[...C0.toUISafeMessages(z.messages)];if(U!==!1){let A=Date.parse(z.metadata.lastMessageTime);N.push({id:"fork-announcement-"+z.sessionId,role:"assistant",content:"Forked "+X6(X.sessionId)+" → "+X6(z.sessionId),timestamp:Number.isNaN(A)?0:A})}return await J(),G6(G??z.metadata.permissionMode),K6(z.metadata.selectedModelId),Y.restoreSession(z.sessionId,N,b,z.metadata.projectPath),{sessionId:z.sessionId,messages:b}}await C0.assertSessionWritable(X.sessionId,X.projectPath);let[L,O]=await Promise.all([C0.loadSession(X.sessionId,X.projectPath),C0.loadSessionModelContext(X.sessionId,X.projectPath)]),W=C0.toUISafeMessages(L);return await J(),G6(G??X.permissionMode),K6(X.selectedModelId),Y.restoreSession(X.sessionId,W,O,X.projectPath),{sessionId:X.sessionId,messages:O}}function q6($){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 J3($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function Y3($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function Z3($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function X3($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function K3($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function G3($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function U3($){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)=>q6(Z))}if(Y==="activate_session")return q6($.session);return!1}function q3($,Q,Y,J){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=Q?.sessions;return Y.showSessionSelector(Z??[],"resume"),!0}case"session_forked":{let Z=Q;if(Z?.action!=="restore_forked_session"||!Z.sessionId||!Array.isArray(Z.messages)||!Array.isArray(Z.visibleMessages))return!1;return J.restoreSession(Z.sessionId,Z.visibleMessages,Z.messages),!0}case"session_archived":{let Z=Q?.session;return J.addAssistantMessage(Z?`会话 ${Z.sessionId} 已归档。`:"当前会话已归档。"),C1(0),!0}case"clear_screen":return J.clearMessages(),J.setError(null),J.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let Z=Q,X=Z?.compactedMessages;if(X)J.setCompactedContext(X);if(Z?.usage)J.updateTokenUsage({inputTokens:Z.usage.promptTokens,outputTokens:Z.usage.completionTokens,totalTokens:Z.usage.totalTokens,maxContextTokens:Z.maxContextTokens,cacheReadTokens:Z.usage.cacheReadInputTokens??0,cacheWriteTokens:Z.usage.cacheCreationInputTokens??0,costUsd:Z.usage.costUsd});return J.resetContextUsage(),!0}case"exit_application":return C1(0),!0;default:return!1}}async function t8($,Q,Y,J,Z,X,K,U,G,q,L,O,W,z,b=d0(),N){let{text:A}=$;if(!O6(A))return{type:"not_slash"};let _=await z6(A,{cwd:b,surface:"tui",workspaceRoot:b,sessionId:X,messages:K,rewind:U,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),C0.archiveSession(X,b)}},subagents:G,mcp:q,reasoning:L,serviceTier:O,responseVerbosity:W,communicationStyle:z,codeReview:N,signal:J});if(_.success&&U3(_.data)){if(_.data.action==="select_session")return Q.showSessionSelector(_.data.sessions,_.data.intent),{type:"handled",commandResult:{success:!0}};return await n2(_.data,b,Y,Z),{type:"handled",commandResult:{success:!0}}}if(_.success&&G3(_.data))return Y.restoreSession(_.data.sessionId,_.data.visibleMessages,_.data.messages),Q.setTasks([]),{type:"handled",commandResult:{success:!0}};if(_.message){if(q3(_.message,_.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(J3(_.data)){let{skillName:P,skillArgs:w}=_.data,C=w?`Please use the "${P}" skill to help me with: ${w}`:`Please use the "${P}" skill.`;return Y.addUserMessage(C),{type:"continue_as_agent",result:{userDisplayMessage:C,agentInput:{displayText:C,text:C,images:[],parts:[{type:"text",text:C}]},userMessageAlreadyAdded:!0}}}if(Y3(_.data)){let{commandName:P,processedContent:w}=_.data;Y.addUserMessage(A);let C=`# Custom Command: /${P}
12
-
13
- The user has invoked the custom command "/${P}". Follow the instructions below to complete the task.
14
-
15
- ---
16
-
17
- ${w}
18
-
19
- ---
20
-
21
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:C,images:[],parts:[{type:"text",text:C}]},userMessageAlreadyAdded:!0}}}if(Z3(_.data)){let{commandName:P,pluginName:w,processedContent:C}=_.data;Y.addUserMessage(A);let B=`# Plugin Command: /${P}
22
-
23
- The user has invoked the plugin command "/${P}" from plugin "${w}". Follow the instructions below to complete the task.
24
-
25
- ---
26
-
27
- ${C}
28
-
29
- ---
30
-
31
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:B,images:[],parts:[{type:"text",text:B}]},userMessageAlreadyAdded:!0}}}if(X3(_.data)){let{modelId:P,prompt:w}=_.data;return Y.addUserMessage(w),{type:"continue_as_agent",result:{userDisplayMessage:w,agentInput:{displayText:w,text:w,images:[],parts:[{type:"text",text:w}]},userMessageAlreadyAdded:!0,onceModelId:P}}}if(K3(_.data)){let P=_.data.goal.objective;return Y.addUserMessage(A),{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!_.success&&_.error)return Y.addAssistantMessage(`${_.error}`),{type:"handled",commandResult:{success:_.success,output:_.message,error:_.error,metadata:_.data}};let f=_.message;if(_.success&&typeof f==="string"&&f.trim()!=="")Y.addAssistantMessage(f);return{type:"handled",commandResult:{success:_.success,output:_.message,error:_.error,metadata:_.data}}}import{useMemoizedFn as R0}from"ahooks";import{useEffect as O3,useRef as t2}from"react";function N6($){let Q=t2(void 0),Y=t2(void 0),J=t2(void 0),Z=t2(void 0),X=R0(async()=>{if(Z.current)return Z.current;let M=Q.current,F=Y.current;if(!M&&!F)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let S=(async()=>{try{await M?.destroy()}finally{await F?.dispose()}})();Z.current=S;try{await S}finally{if(Z.current===S)Z.current=void 0}}),K=R0(async(M)=>{let F=$.workspaceRoot??Y.current?.workspaceRoot??d0();if(Y.current&&(Y.current.sessionId!==M||Y.current.workspaceRoot!==F))await X();if(!Y.current){let S=await C0.findSessionMetadata(M,F),D=S!==void 0&&(await C0.loadSession(M,F)).length>0;Y.current=await j1.create({sessionId:M,workspaceRoot:F,modelId:$.modelId,permissionMode:$.permissionMode??S?.permissionMode,reasoningEffort:S?.reasoningEffort??$.reasoningEffort,serviceTier:S?.serviceTier??$.serviceTier,responseVerbosity:S?.responseVerbosity??$.responseVerbosity,communicationStyle:S?.communicationStyle??$.communicationStyle,communicationStyleDigest:S?.communicationStyleDigest,agents:$.agents,...D?{sessionStart:{isResume:!0,resumeSessionId:M}}:{}});try{J.current={sessionId:M,modelId:S?.selectedModelId,permissionMode:S?.permissionMode,reasoningEffort:S?.reasoningEffort,serviceTier:S?.serviceTier,responseVerbosity:S?.responseVerbosity,communicationStyle:S?.communicationStyle,communicationStyleDigest:S?.communicationStyleDigest},o0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),o0().setServiceTier(Y.current.getServiceTierConfiguration().selection),o0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),o0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(v){let h=Y.current;throw Y.current=void 0,await h.dispose().catch(()=>{return}),v}}return Y.current}),U=R0(async(M)=>{let F=M?.sessionId??$.sessionId,S=!!M?.modelId&&M.modelId!==$.modelId,D;if(!S&&F){let v=Y.current!==void 0,h=await K(F),m=M?.modelId??$.modelId,Q0=M?.reasoningEffort??(v?$.reasoningEffort:h.getReasoningConfiguration().selection),o=M?.serviceTier??(v?$.serviceTier:h.getServiceTierConfiguration().selection),F0=M?.responseVerbosity??(v?$.responseVerbosity:h.getResponseVerbosityConfiguration().selection),y0=M?.communicationStyle??(v?$.communicationStyle:h.getCommunicationStyleConfiguration().selection),m0=h.getCurrentModelId(),E0=h.getReasoningConfiguration(),F$=h.getServiceTierConfiguration(),X2=h.getResponseVerbosityConfiguration(),K2=h.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==F||J.current.permissionMode!==$.permissionMode)){let x0=await C0.setSessionPermissionMode(F,h.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:F,permissionMode:x0.permissionMode}}await h.refresh({modelId:m,...Q0?{reasoningEffort:Q0}:{},...o?{serviceTier:o}:{},...F0?{responseVerbosity:F0}:{},...y0?{communicationStyle:y0}:{}});let D1=h.getCommunicationStyleConfiguration();if(D1.source!=="built-in"&&!D1.contentSha256)throw Error("Custom communication style has no provenance");let v$={...m&&m!=="inherit"&&(J.current?.sessionId!==F||J.current.modelId!==m)?{selectedModelId:m}:{},...Q0&&(J.current?.sessionId!==F||J.current.reasoningEffort!==Q0)?{reasoningEffort:Q0}:{},...o&&(J.current?.sessionId!==F||J.current.serviceTier!==o)?{serviceTier:o}:{},...F0&&(J.current?.sessionId!==F||J.current.responseVerbosity!==F0)?{responseVerbosity:F0}:{},...y0&&(J.current?.sessionId!==F||J.current.communicationStyle!==y0||J.current.communicationStyleDigest!==D1.contentSha256)?{communicationStyle:y0,communicationStyleDigest:D1.source==="built-in"?null:D1.contentSha256}:{}};if(Object.keys(v$).length>0)try{let x0=await C0.updateSessionMetadata(F,h.workspaceRoot,v$);J.current={sessionId:F,modelId:x0.selectedModelId,permissionMode:x0.permissionMode,reasoningEffort:x0.reasoningEffort,serviceTier:x0.serviceTier,responseVerbosity:x0.responseVerbosity,communicationStyle:x0.communicationStyle,communicationStyleDigest:x0.communicationStyleDigest}}catch(x0){throw await h.refresh({...m0?{modelId:m0}:{},reasoningEffort:E0.selection,serviceTier:F$.selection,responseVerbosity:X2.selection,communicationStyle:K2.selection}).catch(()=>{return}),x0}D=await z2.createWithRuntime(h,{sessionId:F,systemPrompt:M?.systemPrompt??$.systemPrompt,appendSystemPrompt:M?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:M?.maxTurns??$.maxTurns,modelId:M?.modelId??$.modelId,permissionMode:M?.permissionMode??$.permissionMode,agents:$.agents})}else D=await z2.create({systemPrompt:M?.systemPrompt??$.systemPrompt,appendSystemPrompt:M?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:M?.maxTurns??$.maxTurns,modelId:M?.modelId??$.modelId,permissionMode:M?.permissionMode??$.permissionMode,agents:$.agents});return Q.current=D,D}),G=R0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await K($.sessionId)).listRewindCheckpoints()}),q=R0(async(M)=>{if(!$.sessionId)throw Error("No active session to rewind");let S=await(await K($.sessionId)).rewindSession(M);return await X(),S}),L=R0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await K($.sessionId)).listSubagents()}),O=R0(async(M,F)=>{if(!$.sessionId)throw Error("No active session for subagent control");let S=await K($.sessionId),D=!1,v,h=M,m=(o)=>{let F0=o.status==="completed"?o.result?.message:o.result?.error||o.result?.message;V$.getState().app.actions.completeSubagentProgress(h,o.status==="completed",F0)},Q0=S.resumeSubagent({agentId:M,prompt:F,onEvent:(o)=>{if(o.kind==="tool_start"&&"function"in o.toolCall)V$.getState().app.actions.updateSubagentTool(h,o.toolCall.function.name)},onCompleted:(o)=>{if(D)m(o);else v=o}});if(h=Q0.session.id,V$.getState().app.actions.startSubagentProgress(Q0.session.id,Q0.session.subagentType,`Resumed from ${Q0.source.id}: ${Q0.session.description}`),D=!0,v)m(v);return Q0}),W=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await K($.sessionId)).getMcpContentCatalog()}),z=R0(async(M)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await K($.sessionId)).refreshMcpContentCatalogs(M)}),b=R0(async(M,F,S)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await K($.sessionId)).getMcpPrompt(M,F,S)}),N=R0(async(M,F,S)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await K($.sessionId)).completeMcpArgument(M,F,S)}),A=R0(async(M,F={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await K($.sessionId)).getMcpLogs(M,F)}),T=R0(async(M)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).listMcpTasks(M)}),_=R0(async(M)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).getMcpTask(M)}),f=R0(async(M,F)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).cancelMcpTask(M,F)}),P=R0(async(M,F)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await K($.sessionId)).setMcpLoggingLevel(M,F)}),w=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await K($.sessionId)).getMcpInstructions()}),C=R0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await K($.sessionId)).getReasoningConfiguration()}),B=R0(async(M)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let F=await K($.sessionId);if(F.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let S=F.getReasoningConfiguration();if(F.resolveReasoningConfiguration(M),S.selection===M)return S;await F.refresh({reasoningEffort:M});try{let D;try{D=await C0.updateSessionMetadata($.sessionId,F.workspaceRoot,{reasoningEffort:M})}catch(v){if(!(v instanceof O2)&&v.code!=="ENOENT")throw v;D=await C0.createSessionMetadata($.sessionId,F.workspaceRoot,{taskStatus:"completed",selectedModelId:F.getCurrentModelId(),reasoningEffort:M,serviceTier:F.getServiceTierConfiguration().selection,responseVerbosity:F.getResponseVerbosityConfiguration().selection,communicationStyle:F.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},o0().setReasoningEffort(M),F.getReasoningConfiguration()}catch(D){throw await F.refresh({reasoningEffort:S.selection}),D}}),y=R0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await K($.sessionId)).getServiceTierConfiguration()}),I=R0(async(M)=>{if(!$.sessionId)throw Error("No active session for service tier");let F=await K($.sessionId);if(F.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let S=F.getServiceTierConfiguration();if(F.resolveServiceTierConfiguration(M),S.selection===M)return S;await F.refresh({serviceTier:M});try{let D;try{D=await C0.updateSessionMetadata($.sessionId,F.workspaceRoot,{serviceTier:M})}catch(v){if(!(v instanceof O2)&&v.code!=="ENOENT")throw v;D=await C0.createSessionMetadata($.sessionId,F.workspaceRoot,{taskStatus:"completed",selectedModelId:F.getCurrentModelId(),reasoningEffort:F.getReasoningConfiguration().selection,serviceTier:M,responseVerbosity:F.getResponseVerbosityConfiguration().selection,communicationStyle:F.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},o0().setServiceTier(M),F.getServiceTierConfiguration()}catch(D){throw await F.refresh({serviceTier:S.selection}),D}}),R=R0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await K($.sessionId)).getResponseVerbosityConfiguration()}),H=R0(async(M)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let F=await K($.sessionId);if(F.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let S=F.getResponseVerbosityConfiguration();if(F.resolveResponseVerbosityConfiguration(M),S.selection===M)return S;await F.refresh({responseVerbosity:M});try{let D;try{D=await C0.updateSessionMetadata($.sessionId,F.workspaceRoot,{responseVerbosity:M})}catch(v){if(!(v instanceof O2)&&v.code!=="ENOENT")throw v;D=await C0.createSessionMetadata($.sessionId,F.workspaceRoot,{taskStatus:"completed",selectedModelId:F.getCurrentModelId(),reasoningEffort:F.getReasoningConfiguration().selection,serviceTier:F.getServiceTierConfiguration().selection,responseVerbosity:M,communicationStyle:F.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},o0().setResponseVerbosity(M),F.getResponseVerbosityConfiguration()}catch(D){throw await F.refresh({responseVerbosity:S.selection}),D}}),k=R0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await K($.sessionId)).getCommunicationStyleConfiguration()}),E=R0(async(M)=>{if(!$.sessionId)throw Error("No active session for communication style");let F=await K($.sessionId);if(F.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let S=F.getCommunicationStyleConfiguration(),D=F.resolveCommunicationStyleConfiguration(M);if(D.source!=="built-in"&&!D.contentSha256)throw Error("Custom communication style has no provenance");if(S.selection===M)return S;await F.refresh({communicationStyle:M});try{let v;try{v=await C0.updateSessionMetadata($.sessionId,F.workspaceRoot,{communicationStyle:M,communicationStyleDigest:D.source==="built-in"?null:D.contentSha256})}catch(h){if(!(h instanceof O2)&&h.code!=="ENOENT")throw h;v=await C0.createSessionMetadata($.sessionId,F.workspaceRoot,{taskStatus:"completed",selectedModelId:F.getCurrentModelId(),reasoningEffort:F.getReasoningConfiguration().selection,serviceTier:F.getServiceTierConfiguration().selection,responseVerbosity:F.getResponseVerbosityConfiguration().selection,communicationStyle:M,...D.source!=="built-in"&&D.contentSha256?{communicationStyleDigest:D.contentSha256}:{}})}return J.current={sessionId:$.sessionId,modelId:v.selectedModelId,permissionMode:v.permissionMode,reasoningEffort:v.reasoningEffort,serviceTier:v.serviceTier,responseVerbosity:v.responseVerbosity,communicationStyle:v.communicationStyle,communicationStyleDigest:v.communicationStyleDigest},o0().setCommunicationStyle(M),F.getCommunicationStyleConfiguration()}catch(v){throw await F.refresh({communicationStyle:S.selection}),v}}),n=R0(async(M)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(M,{allowBeforeTurn:!0})}),d=R0(async(M,F)=>{let S=$.sessionId;if(!S)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await K(S)).enqueueSteering(M,{allowBeforeTurn:!0,...F})}),a=R0(async(M,F)=>{let S=$.sessionId;if(!S)throw Error("Side conversation requires a Session");return(await K(S)).askSideQuestion(M,{signal:F,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),l=R0(async(M,F)=>{let S=$.sessionId;if(!S)throw Error("User shell command requires a Session");return(await K(S)).executeUserShellCommand(M,F)}),p=R0(async(M,F)=>{let S=$.sessionId;if(!S)throw Error("Code review requires a Session");let D=await K(S);await s2.recoverInterrupted(D.workspaceRoot,S,D);let v=await s2.start({sessionId:S,projectPath:D.workspaceRoot,runtime:D,request:M,signal:F}),h=await v.completion,m=(await s2.list(D.workspaceRoot,S)).find((Q0)=>Q0.start.reviewId===v.reviewId);if(!m)throw Error(`Review not found after completion: ${v.reviewId}`);return{reviewId:v.reviewId,status:h.status,findings:h.findings.length,content:_6(m.start,h)}});return O3(()=>{let M=e2(X);return()=>{M(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:U,cleanupAgent:X,steerActiveTurn:n,enqueueSessionInput:d,askSideQuestion:a,runCodeReview:p,executeUserShellCommand:l,listRewindCheckpoints:G,rewindSession:q,listSubagents:L,resumeSubagent:O,getMcpContentCatalog:W,refreshMcpContentCatalogs:z,getMcpPrompt:b,completeMcpArgument:N,listMcpTasks:T,getMcpTask:_,cancelMcpTask:f,getMcpLogs:A,setMcpLoggingLevel:P,getMcpInstructions:w,getReasoningConfiguration:C,setReasoningEffort:B,getServiceTierConfiguration:y,setServiceTier:I,getResponseVerbosityConfiguration:R,setResponseVerbosity:H,getCommunicationStyleConfiguration:k,setCommunicationStyle:E}}import{useMemoizedFn as p$}from"ahooks";import{useEffect as z3,useRef as $8}from"react";function F6($){let Q=0;for(let Y of $)if(Y===`
32
- `)Q++;return Q}function W6($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=$8(""),K=$8(null),U=$8(""),G=$8(null),q=p$(()=>{if(X.current){let N=X.current,A=$.appendAssistantContent(N);g$(A,N),X.current=""}if(K.current)clearTimeout(K.current),K.current=null}),L=p$(()=>{if(U.current)$.appendThinkingContent(U.current),U.current="";if(G.current)clearTimeout(G.current),G.current=null}),O=p$((N)=>{X.current+=N;let A=X.current;if(F6(A)>=J||A.length>=Z){q();return}if(!K.current)K.current=setTimeout(q,Y)}),W=p$((N)=>{U.current+=N;let A=U.current;if(F6(A)>=J||A.length>=Z){L();return}if(!G.current)G.current=setTimeout(L,Y)}),z=p$(()=>{if(X.current="",K.current)clearTimeout(K.current),K.current=null;if(U.current="",G.current)clearTimeout(G.current),G.current=null}),b=p$(()=>{if(K.current)clearTimeout(K.current),K.current=null;if(G.current)clearTimeout(G.current),G.current=null;let N=X.current,A=U.current;return X.current="",U.current="",{extraContent:N,extraThinking:A}});return z3(()=>{return()=>{z()}},[z]),{batchAppendContent:O,batchAppendThinking:W,flushContentBuffer:q,flushThinkingBuffer:L,resetStreamingBuffers:z,drainPendingBuffers:b}}var _2=t1("UI");function H6($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var R6=($,Q,Y,J,Z,X)=>{let K=E$(),U=j$(),G=T1(),q=E2(),L=h$(),O=m2(),W=p2(),z=c2(),b=x2(),N=u2(),A=V2(),T=g4(),_=i1(),f=n1(),P=c4(),w=s8(!1),C=s8(!1),B=s8(null),{createAgent:y,cleanupAgent:I,steerActiveTurn:R,enqueueSessionInput:H,listRewindCheckpoints:k,rewindSession:E,listSubagents:n,resumeSubagent:d,getMcpContentCatalog:a,refreshMcpContentCatalogs:l,getMcpPrompt:p,completeMcpArgument:M,listMcpTasks:F,getMcpTask:S,cancelMcpTask:D,getMcpLogs:v,setMcpLoggingLevel:h,getMcpInstructions:m,getReasoningConfiguration:Q0,setReasoningEffort:o,getServiceTierConfiguration:F0,setServiceTier:y0,getResponseVerbosityConfiguration:m0,setResponseVerbosity:E0,getCommunicationStyleConfiguration:F$,setCommunicationStyle:X2,runCodeReview:K2,askSideQuestion:D1,executeUserShellCommand:v$}=N6({sessionId:U,workspaceRoot:G,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:q,permissionMode:L,reasoningEffort:W,serviceTier:z,responseVerbosity:b,communicationStyle:N,agents:X}),x0=W6(_),D$=s1(async()=>{if(!T||!U){f.setTeams([]);return}try{let A0=await new y6({configDir:e8(),subagentRegistry:Q8(G)}).list({sessionId:U,projectPath:G});if(l0().session.sessionId===U&&l0().session.workspaceRoot===G)f.setTeams(A0)}catch(X0){_2.warn("[useCommandHandler] Failed to refresh Agent Teams",X0)}}),G2=s1(async(X0,A0)=>{if(X0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let _0=X0.text.trimStart().slice(1).trim();if(!_0)return{success:!1,error:"User shell command cannot be empty"};_.setCommand(`! ${_0}`);try{let e=await v$(_0,{signal:A0});if(_.addMessage({id:`user-shell-${e.executionId}`,role:"user",content:$Q(e.record),timestamp:Date.now(),metadata:{userShellCommand:e.record}}),e.delivery==="next_turn")C.current=!0;return{success:e.record.status!=="spawn_error",output:$Q(e.record),...e.record.status==="spawn_error"?{error:e.record.stderr||"User shell command failed"}:{}}}finally{_.setCommand(null)}});c$(()=>{return()=>{x0.resetStreamingBuffers()}},[x0.resetStreamingBuffers]),c$(()=>{return()=>{B.current?.abort("side-conversation-session-change"),B.current=null,f.dismissSideConversation()}},[f,U,G]),c$(()=>{f.setTeams([]),D$()},[T,f,D$,U,G]),c$(()=>{if(!O)_.setCurrentThinkingContent(null)},[O,_]);let V1=s1(()=>{if(B.current){B.current.abort("user-cancel"),B.current=null,f.dismissSideConversation();return}if(!K)return;Z?.();let{extraContent:X0,extraThinking:A0}=x0.drainPendingBuffers();P.abort("user-cancel"),f.setTasks([]);let _0=l0().session.currentStreamingMessageId;if(_0){if(X0)g$(_0,X0);r2(_0)}if(_.finalizeStreamingMessage(X0,A0),!w.current)_.addAssistantMessage("任务已停止"),w.current=!0}),W$=s1(async(X0,A0)=>{let _0=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(f.startSideConversation(_0,A0),X0.images.length>0){f.failSideConversation(_0,"Side conversations do not accept image attachments");return}if(!A0){f.failSideConversation(_0,"Usage: /btw <question>");return}B.current?.abort("side-conversation-replaced");let e=new AbortController;B.current=e;try{let V=await D1(A0,e.signal);if(e.signal.aborted||B.current!==e)return;if(f.completeSideConversation(_0,V),V.usage)_.updateTokenUsage({inputTokens:V.usage.promptTokens,outputTokens:V.usage.completionTokens,totalTokens:V.usage.totalTokens,cacheReadTokens:V.usage.cacheReadInputTokens??0,cacheWriteTokens:V.usage.cacheCreationInputTokens??0,costUsd:V.usage.costUsd})}catch(V){if(e.signal.aborted||B.current!==e)return;f.failSideConversation(_0,V instanceof Error?V.message:String(V))}finally{if(B.current===e)B.current=null}}),k2=s1(async(X0,A0)=>{let _0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},e=Q6({sessionActions:_,appActions:f,commandActions:P,streamingBuffer:x0,thinkingModeEnabled:O,getStreamingMessageId:()=>l0().session.currentStreamingMessageId,signal:A0.signal},_0);return{loopResult:await w6(X0,e),stats:_0}}),d8=s1(async(X0)=>{let A0=!1,_0,e=!1,V=X0;try{if(X0.text.trimStart().startsWith("!")){let u0=P.getAbortController()??P.createAbortController();return await G2(X0,u0.signal)}await N2();let $0=P.getAbortController()??P.createAbortController(),B0=o2(l0().session),V0=await t8(X0,f,_,$0.signal,I,U,o2(l0().session),{listCheckpoints:k,execute:E},{list:n,resume:d},{getCatalog:a,refresh:l,getPrompt:p,complete:M,listTasks:F,getTask:S,cancelTask:D,getLogs:v,setLoggingLevel:h,getInstructions:m},{get:Q0,set:o},{get:F0,set:y0},{get:m0,set:E0},{get:F$,set:X2},G,{run:K2});if(V0.type==="handled")return V0.commandResult;if(V0.type==="continue_as_agent")A0=V0.result.userMessageAlreadyAdded,_0=V0.result.onceModelId,e=V0.result.goalContinuationOnly===!0,V=V0.result.agentInput;let H$=q1.getInstance(),L$;if(!e){let u0=await H$.executeUserPromptSubmitHooks(V.text,{projectDir:G,sessionId:U,permissionMode:L,hasImages:V.images.length>0,imageCount:V.images.length});if(!u0.proceed){if(u0.warning)_.addAssistantMessage(`${u0.warning}`);return{success:!1,error:"blocked by hook"}}if(u0.updatedPrompt)V={...V,text:u0.updatedPrompt,displayText:u0.updatedPrompt,parts:[{type:"text",text:u0.updatedPrompt},...V.parts.filter((S2)=>S2.type==="image")]};if(u0.contextInjection)L$=u0.contextInjection}if(!A0)_.addUserMessage(V.displayText);let pY=n8(V),cY=await y(_0?{modelId:_0}:void 0);if($0.signal.aborted)return _2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(L$)B0.push({role:"system",content:`<user-prompt-submit-hook>
33
- ${L$}
34
- </user-prompt-submit-hook>`});let W4={messages:B0,userId:"cli-user",sessionId:U,workspaceRoot:G,signal:$0.signal,confirmationHandler:Y,permissionMode:L,onPermissionModeChange:async(u0)=>{await p0().setPermissionMode(u0)}},{loopResult:M1,stats:H4}=await k2(cY.chatStream(pY,W4,{stream:!0,goalContinuationOnly:e,onTurnLimitReached:Y?async(u0)=>{let S2=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${u0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:S2.approved,reason:S2.reason}}:void 0}),$0);if(H4.compactionCount>0)_.setCompactedContext(W4.messages);if(M1.success&&M1.metadata?.outputTruncated)_.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let U2=M1.finalMessage||"";if(_2.debug("[handleCommandSubmit] final reply",{success:M1.success,outputLength:U2.length,turnsCount:M1.metadata?.turnsCount,toolCallsCount:M1.metadata?.toolCallsCount}),!M1.success&&!H6(M1)){let u0=M1.error?.message||"任务执行失败";return _.addAssistantMessage(u0),{success:!1,error:u0}}if(!U2||U2.trim()===""){let u0=M1.metadata?.abortReason;if(!w.current&&H4.contentDeltaCount===0&&u0!=="interrupt")return _.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:U2??""}}return{success:!0,output:U2}}catch($0){if(w.current)return{success:!1,error:"aborted"};let B0=l2($0);return _.addAssistantMessage(`${B0.displayMessage}`),{success:!1,error:B0.displayMessage}}}),R1=s1(async()=>{if(l0().command.isProcessing){C.current=!0;return}let X0=await j1.hasPendingInbox(G,U),A0=!X0&&await j1.hasActiveGoal(G,U);if(!X0&&!A0){C.current=!1;return}if(l0().command.isProcessing){C.current=!0;return}C.current=!1,await N2();let _0=P.createAbortController();x0.resetStreamingBuffers(),_.clearFinalizingStreamingMessageId(),P.setProcessing(!0);try{let e=await y();if(_0.signal.aborted)return;let V=await j1.hasPendingInbox(G,U),$0=!V&&await j1.hasActiveGoal(G,U);if(!V&&!$0)return;let B0={messages:o2(l0().session),userId:"cli-user",sessionId:U,workspaceRoot:G,signal:_0.signal,confirmationHandler:Y,permissionMode:L,onPermissionModeChange:async(L$)=>{await p0().setPermissionMode(L$)}},{loopResult:V0,stats:H$}=await k2(e.chatStream("",B0,{stream:!0,pendingInputOnly:V,goalContinuationOnly:$0}),_0);if(H$.compactionCount>0)_.setCompactedContext(B0.messages);if(V0.success&&V0.metadata?.outputTruncated)_.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!V0.success&&!H6(V0))_.addAssistantMessage(V0.error?.message||"恢复排队指令失败")}catch(e){let V=l2(e);if(!V.isAbort)_.setError(`恢复排队指令失败: ${V.displayMessage}`)}finally{if(P.getAbortController()===_0)P.setProcessing(!1),P.clearAbortController(_0),_.setCurrentThinkingContent(null);if(C.current)queueMicrotask(()=>{R1()})}}),r8=s1(async(X0)=>{if(!X0.text.trim()&&X0.images.length===0)return;let A0=b6(X0.text);if(A0){await W$(X0,A0.question);return}if(B.current?.abort("main-conversation-submitted"),B.current=null,f.dismissSideConversation(),X0.text.trimStart().startsWith("!")&&K){let e=P.getAbortController();if(!e){_.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let V=await G2(X0,e.signal);if(!V.success&&V.error&&V.error!=="aborted")_.setError(V.error);return}if(K){if(X0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(X0.text.trim())){await N2();let V0=P.getAbortController()??P.createAbortController();await t8(X0,f,_,V0.signal,I,U,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,G);return}_.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await N2();let e=await q1.getInstance().executeUserPromptSubmitHooks(X0.text,{projectDir:G,sessionId:U,permissionMode:L,hasImages:X0.images.length>0,imageCount:X0.images.length});if(!e.proceed){if(e.warning)_.addAssistantMessage(e.warning);return}let V=X0;if(e.updatedPrompt)V={...X0,text:e.updatedPrompt,parts:[{type:"text",text:e.updatedPrompt},...X0.parts.filter((V0)=>V0.type==="image")]};if(e.contextInjection){let V0=`<user-prompt-submit-hook>
35
- ${e.contextInjection}
36
- </user-prompt-submit-hook>`;V={...V,text:`${V.text}
37
-
38
- ${V0}`,parts:[...V.parts,{type:"text",text:`
39
-
40
- ${V0}`}]}}let $0=n8(V),B0=await R($0);if(!B0.accepted){let V0=B0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";_.addAssistantMessage(V0);return}if(P.enqueueCommand(X0),_.addUserMessage(X0.displayText),B0.delivery==="next_turn"){if(C.current=!0,!l0().command.isProcessing)queueMicrotask(()=>{R1()})}return}f.setTasks([]),P.setRecoveredSteeringCount(0),w.current=!1;let _0=P.createAbortController();x0.resetStreamingBuffers(),_.clearFinalizingStreamingMessageId(),P.setProcessing(!0);try{let e=await d8(X0);if(!e.success&&e.error&&e.error!=="aborted")_.setError(e.error)}catch(e){let V=l2(e);if(V.isAbort);else _.setError(`执行失败: ${V.displayMessage}`)}finally{if(P.getAbortController()===_0){if(P.setProcessing(!1),P.clearAbortController(_0),_.setCurrentThinkingContent(null),C.current)queueMicrotask(()=>{R1()})}}});return c$(()=>{let X0=B6.subscribe((A0)=>{if(!L6(A0,{sessionId:U,projectPath:G}))return;if(A0.type.startsWith("team.")){let{teamName:_0,messageId:e,content:V}=A0.properties,$0=A0.properties.metadata;if(A0.type==="team.message.received"&&typeof _0==="string"&&typeof e==="string"&&typeof V==="string"&&P6($0,{messageId:e,teamName:_0}))(async()=>{let B0=await H(V,{messageId:e,origin:"team_message",metadata:$0});if(!B0.accepted)return;if(await new A6(_0,e8()).markDelivered([e]),B0.delivery==="next_turn"){if(C.current=!0,!l0().command.isProcessing)await R1()}})().catch((B0)=>{_2.warn("[useCommandHandler] Failed to deliver teammate message",B0)});queueMicrotask(()=>{D$()});return}if(A0.type!=="subagent.completion.queued")return;C.current=!0,queueMicrotask(()=>{R1()})});return()=>{X0()}},[H,D$,R1,U,G]),c$(()=>{let X0=!1;return(async()=>{if(Y)await QQ.resolvePendingWithHandler(G,U,Y);else await QQ.cancelPendingNonInteractive(G,U);if(X0)return;let[A0,_0]=await Promise.all([j1.hasPendingInbox(G,U),j1.hasActiveGoal(G,U)]);if(A0||_0)await R1()})().catch((A0)=>{if(!X0)_2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",A0)}),()=>{X0=!0}},[Y,R1,U,G]),{executeCommand:r8,handleAbort:V1,isProcessing:K||A?.status==="loading",cleanupAgent:I}};import{useMemoizedFn as J8}from"ahooks";import{useState as M6}from"react";var T6=()=>{let[$,Q]=M6([]),[Y,J]=M6(-1),Z=J8((G,q)=>{let L={display:G,pasteMappings:q?new Map(q):new Map};Q((O)=>[...O,L]),J(-1)}),X=J8(()=>{if($.length===0)return null;let G=Y===-1?$.length-1:Math.max(0,Y-1);return J(G),$[G]||null}),K=J8(()=>{if(Y===-1)return null;let G=Y+1;if(G>=$.length)return J(-1),null;else return J(G),$[G]||null}),U=J8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:K,resetHistoryIndex:U}};import{useMemoizedFn as F2}from"ahooks";import{useMemo as _3,useRef as C6,useState as N3}from"react";var I6=()=>{let[$,Q]=N3({isVisible:!1,details:null,resolver:null}),Y=C6(null),J=C6([]),Z=F2((L)=>{Y.current=L,Q({isVisible:Boolean(L),details:L?.details??null,resolver:L?.resolve??null})}),X=F2((L,O)=>{if(L.settled)return;if(L.settled=!0,L.signal&&L.abortListener)L.signal.removeEventListener("abort",L.abortListener);L.resolve(O)}),K=F2((L,O)=>{return new Promise((W)=>{let z={details:L,resolve:W,signal:O,settled:!1},b=()=>{if(Y.current===z){X(z,{approved:!1,reason:W2}),Z(J.current.shift()??null);return}let N=J.current.indexOf(z);if(N>=0)J.current.splice(N,1);X(z,{approved:!1,reason:W2})};if(z.abortListener=b,O?.aborted){b();return}if(O?.addEventListener("abort",b,{once:!0}),!Y.current){Z(z);return}J.current.push(z)})}),U=F2((L)=>{let O=Y.current;if(O)X(O,L);let W=J.current.shift()??null;Z(W)}),G=F2(()=>{if(Y.current)X(Y.current,{approved:!1,reason:W2});for(let L of J.current)X(L,{approved:!1,reason:W2});J.current=[],Z(null)}),q=_3(()=>({requestConfirmation:K}),[K]);return{confirmationState:$,confirmationHandler:q,handleResponse:U,dismissAll:G}};import{useMemoizedFn as B$}from"ahooks";import{useRef as f6,useState as F3}from"react";var Y8="␞",Z8="␟";function X8($){return`${Y8}PASTE:${$}:`}function JQ(){return Z8}var NG=new RegExp(`${Y8}PASTE:(\\d+):[\\s\\S]*?${Z8}`,"g");function W3($){return $.includes(Y8)&&$.includes(Z8)}function k6($="",Q=0){let[Y,J]=F3({value:$,cursorPosition:Q}),Z=f6(0),X=f6(new Map),K=B$((z)=>{J((b)=>({value:z,cursorPosition:b.cursorPosition}));for(let b of X.current.keys()){let N=X8(b);if(!z.includes(N))X.current.delete(b)}}),U=B$((z)=>{J((b)=>({...b,cursorPosition:Math.max(0,Math.min(z,b.value.length))}))}),G=B$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),q=B$((z)=>{Z.current+=1;let b=Z.current;return X.current.set(b,{type:"text",data:z}),b}),L=B$((z,b)=>{let N=[...X.current.values()].filter((f)=>f.type==="image");if(N.length>=m$)throw Error(`最多只能粘贴 ${m$} 张图片`);let A=N.reduce((f,P)=>f+`data:${P.mimeType};base64,`.length+P.data.length,0),T=`data:${b};base64,`.length+z.length;if(A+T>a2)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let _=Z.current;return X.current.set(_,{type:"image",data:z,mimeType:b}),_}),O=B$((z)=>{for(let[b,N]of z)if(X.current.set(b,N),b>=Z.current)Z.current=b}),W=B$((z)=>{let b=[],N=[];if(!W3(z)){let I=z.trim();if(I)N.push({type:"text",text:I});return{displayText:z,text:z,images:b,parts:N}}let A=new RegExp(`${Y8}PASTE:(\\d+):[\\s\\S]*?${Z8}`,"g"),T=Array.from(z.matchAll(A)),_=0,f="",P="";for(let I of T){let R=I.index,H=R+I[0].length,k=parseInt(I[1],10),E=X.current.get(k);if(R>_){let n=z.slice(_,R);N.push({type:"text",text:n}),f+=n,P+=n}if(!E)f+=I[0],P+=I[0],N.push({type:"text",text:I[0]});else if(E.type==="text")f+=E.data,P+=E.data,N.push({type:"text",text:E.data});else{let n={id:k,base64:E.data,mimeType:E.mimeType};b.push(n),N.push({type:"image",...n}),P+=`[Image #${k}]`}_=H}if(_<z.length){let I=z.slice(_);N.push({type:"text",text:I}),f+=I,P+=I}let w=[];for(let I of N)if(I.type==="text"&&w.length>0&&w[w.length-1].type==="text")w[w.length-1].text+=I.text;else w.push(I);let C=0,B=w.length;while(C<w.length&&w[C].type==="text"&&w[C].text.trim()==="")C++;while(B>C&&w[B-1].type==="text"&&w[B-1].text.trim()==="")B--;let y=w.slice(C,B);return{displayText:P.trim(),text:f.trim(),images:b,parts:y}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:K,setCursorPosition:U,clear:G,pasteMap:X.current,addPasteMapping:q,addImagePasteMapping:L,restorePasteMappings:O,resolveInput:W}}import{useMemoizedFn as g6}from"ahooks";import{useInput as y3}from"ink";import{useEffect as m6,useRef as p6,useState as KQ}from"react";function H3($){return{supportsThinking:h1().resolveConfig($).reasoning}}function K8($){return H3($).supportsThinking}import L3 from"fast-glob";import B3 from"fuse.js";import{useEffect as S6,useMemo as YQ,useState as ZQ}from"react";var x$=null,w3=5000;function b3($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),K=X+Z.length;if(Q>=X&&Q<=K){let U=Z.slice(1),G=!1;if(U.startsWith('"')){if(G=!0,U=U.slice(1),U.endsWith('"'))U=U.slice(0,-1)}return{hasQuery:!0,query:U,startIndex:X,endIndex:K,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var A3=[...XQ.map(($)=>`${$}/**`),...XQ,...v6.map(($)=>`**/${$}`)];function D6($,Q,Y={}){let{cwd:J=d0(),maxSuggestions:Z=15,ignorePatterns:X=A3,debounceDelay:K=300,fuzzyMatch:U=!0}=Y,[G,q]=ZQ([]),[L,O]=ZQ(!1),[W,z]=ZQ(0),b=YQ(()=>JSON.stringify(X),[X]),N=YQ(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return b3($,Q)},[$,Q]);S6(()=>{if(!$.includes("@")){q([]),O(!1);return}let T=Date.now();if(x$&&x$.cwd===J&&x$.ignoreKey===b&&T-x$.timestamp<w3){q(x$.files),O(!1);return}let _=!1,P=setTimeout(async()=>{O(!0);try{let C=(await L3("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((B)=>B.replace(/\\/g,"/"));if(!_)q(C),x$={cwd:J,ignoreKey:b,files:C,timestamp:T}}catch(w){if(console.error("Failed to load files for @ completion:",w),!_)q([])}finally{if(!_)O(!1)}},K);return()=>{_=!0,clearTimeout(P)}},[$,J,K,b]);let A=YQ(()=>{if(!N.hasQuery||G.length===0)return[];let T=N.query.toLowerCase();if(T==="")return G.slice(0,Z);if(U)return new B3(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(T).slice(0,Z).map((P)=>P.item);return G.filter((_)=>_.toLowerCase().includes(T)).slice(0,Z)},[N,G,Z,U]);return S6(()=>{z(0)},[A]),{...N,suggestions:A,selectedIndex:W,loading:L}}function P3($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function V6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=P3(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),K=Z+J+" "+X,U=Q.startIndex+J.length+1;return{newInput:K,newCursorPos:U}}import{useMemoizedFn as j6}from"ahooks";import{useEffect as h6,useRef as E6}from"react";var S0=($,Q)=>{let Y=E6(!1),J=E6(null),Z=j6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{o0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{H2().shutdown("SIGINT",0)},K=j6(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();o0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;o0().setAwaitingSecondCtrlC(!1),X()}});return h6(()=>{if($){if(o0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),h6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),K};var G8=t1("UI"),u6=($,Q,Y,J,Z,X,K,U,G,q)=>{let O=e0()==="main-input",W=$.value,z=$.setValue,b=$.cursorPosition,N=i1(),A=T1(),T=n1(),_=h2(),f=_?K8(_):!1,[P,w]=KQ(!1),[C,B]=KQ([]),[y,I]=KQ(0),R=D6(W,b,{cwd:A,maxSuggestions:10}),H=S0(K||!1,X),k=p6(0),E=500,n=p6(!1);m6(()=>{if(K)n.current=!1},[K]),m6(()=>{if(R.hasQuery&&R.suggestions.length>0){let l=R.suggestions.map((p)=>({command:p,description:c6(p)?`Directory: ${p}`:`File: ${p}`,matchScore:1}));B(l),w(!0),I(0)}else if(W.startsWith("/"))if(W.includes(" "))w(!1),B([]);else{let p=x6(W,A);B(p),w(p.length>0),I(0)}else w(!1),B([])},[W,R.hasQuery,R.suggestions,A]);let d=g6(()=>{N.clearMessages(),N.setError(null)}),a=g6(()=>{G8.debug("[DIAG] handleSubmit called:",{input:W,showSuggestions:P});let l=W.trim();if(l){let p=$.resolveInput(l);G8.debug("[DIAG] Submitting command:",{displayText:l,textLength:p.text.length,imageCount:p.images.length}),w(!1),B([]);let M=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(l,M),$.clear(),Q(p),G8.debug("[DIAG] Command submitted to onSubmit callback")}else G8.debug("[DIAG] Empty command, not submitting")});return y3((l,p)=>{if(l==="?"&&!W){G?.(),setTimeout(()=>$.clear(),0);return}if(p.backspace||p.delete||p.leftArrow||p.rightArrow||p.pageUp||p.pageDown||!p.ctrl&&!p.meta&&!p.escape&&!p.tab&&!p.upArrow&&!p.downArrow&&!p.return&&!(l==="?"&&!W))return;if(p.ctrl&&l==="c"||p.meta&&l==="c"||p.ctrl&&l==="d"||p.meta&&l==="d"){H();return}if(p.ctrl&&l==="l"||p.meta&&l==="l"){d();return}if(p.ctrl&&l==="t"||p.meta&&l==="t"){N.toggleThinkingExpanded();return}if(p.ctrl&&l==="o"||p.meta&&l==="o"){N.toggleHistoryExpanded();return}if(p.escape){if(q)G?.();else if(K&&X){if(n.current)return;n.current=!0,X()}else if(P)w(!1),B([]);else if(W){let F=Date.now();if(F-k.current<500)$.clear(),k.current=0;else k.current=F}return}if(p.tab&&p.shift){U?.();return}if(p.tab){if(P&&C.length>0){let F=C[y].command;if(R.hasQuery&&R.suggestions.includes(F)){let{newInput:S,newCursorPos:D}=V6(W,R,F);z(S),$.setCursorPosition(D)}else{let S=F+" ";z(S),$.setCursorPosition(S.length)}w(!1),B([])}else if(f)T.toggleThinkingMode();return}if(p.return){a();return}if(p.upArrow){if(P&&C.length>0){let F=C.length-1;I((S)=>S>0?S-1:F)}else{let F=Y();if(F){if(F.pasteMappings.size>0)$.restorePasteMappings(F.pasteMappings);z(F.display),$.setCursorPosition(F.display.length)}}return}if(p.downArrow){if(P&&C.length>0){let F=C.length-1;I((S)=>S<F?S+1:0)}else{let F=J();if(F){if(F.pasteMappings.size>0)$.restorePasteMappings(F.pasteMappings);z(F.display),$.setCursorPosition(F.display.length)}}return}},{isActive:O}),{handleSubmit:a,showSuggestions:P,suggestions:C,selectedSuggestionIndex:y}};import I3 from"ansi-escapes";import{useStdout as f3}from"ink";import{useCallback as k3,useEffect as S3,useRef as v3}from"react";import{useStdout as R3}from"ink";import{debounce as M3}from"lodash-es";import{useEffect as T3,useState as C3}from"react";function $$($=200){let{stdout:Q}=R3(),[Y,J]=C3(Q.columns||80);return T3(()=>{let Z=M3(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function l6(){let{stdout:$}=f3(),Q=$$(),Y=v3(!0),J=t((X)=>X.session.actions.incrementClearCount),Z=k3(()=>{if($)$.write(I3.clearTerminal);J()},[$,J]);return S3(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import d6 from"node:fs";import D3 from"node:os";import GQ from"node:path";import{MultiSelect as V3}from"@inkjs/ui";import{useMemoizedFn as U8}from"ahooks";import{Box as G0,Text as J0,useFocus as j3,useFocusManager as h3,useInput as a6}from"ink";import q8 from"ink-select-input";import E3 from"ink-spinner";import L2 from"ink-text-input";import{useEffect as r6,useState as u$}from"react";import{jsxDEV as j}from"react/jsx-dev-runtime";var g3=[{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"}],m3=[{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 p3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function B2({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=u$(Y?"name":"mode"),[X,K]=u$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[U,G]=u$(""),[q,L]=u$(!1),[O,W]=u$(""),[z,b]=u$(Y?"edit":"manual"),{focus:N}=h3(),T={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];r6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;N(`step-${J}`)},[J,N]);let _=U8(()=>{let B=T.indexOf(J);if(B<T.length-1)Z(T[B+1])}),f=U8(()=>{if(O)W("");if(J==="confirm"&&z==="ai"){Z("aiPrompt");return}let B=T.indexOf(J);if(B>0)Z(T[B-1]);else Q()}),P=U8(async()=>{L(!0),W("");try{let B=await z2.create(),y=`你是一个 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,不要添加任何额外的解释或文字。`,R=(await B.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,不要添加任何额外的解释或文字。`,U)).trim(),H=R.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(H)R=H[1];let k=JSON.parse(R);if(!k.name||!k.description||!k.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(k.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");K({name:k.name,description:k.description,tools:Array.isArray(k.tools)?k.tools:[],color:k.color||"blue",location:"project",systemPrompt:k.systemPrompt}),Z("confirm")}catch(B){W(B instanceof Error?B.message:String(B))}finally{L(!1)}});r6(()=>{if(J==="aiGenerating"&&!q&&!O)P()},[J,q,O,P]);let w=U8(async()=>{try{let B=X.location==="project"?GQ.join(d0(),".blade","agents"):GQ.join(D3.homedir(),".blade","agents");await d6.promises.mkdir(B,{recursive:!0});let y=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){y.push("tools:");for(let H of X.tools)y.push(` - ${H}`)}if(X.color)y.push(`color: ${X.color}`);y.push("---");let I=[y.join(`
117
- `),"",`# ${X.name} Subagent`,"",X.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
118
- `),R=GQ.join(B,`${X.name}.md`);await d6.promises.writeFile(R,I,"utf-8"),$()}catch(B){console.error("保存配置失败:",B)}}),C=S0(!1,Q);if(a6((B,y)=>{if(y.escape)f();else if(y.ctrl&&B==="c"||y.meta&&B==="c")C()},{isActive:J!=="tools"}),J==="mode")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(q8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(B)=>{if(B.value==="ai")b("ai"),Z("aiPrompt");else b("manual"),Z("name")}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j(J0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiPrompt")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(L2,{value:U,onChange:G,onSubmit:(B)=>{if(!B.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(O)return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"yellow",children:[j(E3,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:['根据你的描述:"',U,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{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 B=z==="edit";return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:["Step 1/7: ",B?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:B?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"名称: "},void 0,!1,void 0,this),B?j(J0,{children:X.name},void 0,!1,void 0,this):j(L2,{value:X.name,onChange:(y)=>K({...X,name:y}),onSubmit:(y)=>{if(p3(y))return;_()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:B?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B&&j(L2,{value:"",onChange:()=>{},onSubmit:_,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(L2,{value:X.description,onChange:(B)=>K({...X,description:B}),onSubmit:(B)=>{if(!B.trim())return;_()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="tools")return j(c3,{config:X,setConfig:K,onNext:_,onPrev:f},void 0,!1,void 0,this);if(J==="color")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(q8,{items:m3,onSelect:(B)=>{let y=B.value==="none"?void 0:B.value;K({...X,color:y}),_()}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j(J0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="location")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(q8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(B)=>{K({...X,location:B.value}),_()}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j(J0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="systemPrompt")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),j(L2,{value:X.systemPrompt,onChange:(B)=>K({...X,systemPrompt:B}),onSubmit:()=>_()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="confirm")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[j(J0,{children:[j(J0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),j(J0,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),j(J0,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),j(J0,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),j(J0,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),j(J0,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),j(J0,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(q8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(B)=>{if(B.value==="save")w();else if(B.value==="back")f();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function c3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=j3({id:"step-tools"});a6((K,U)=>{if(U.escape)J()},{isActive:Z});let X=(K)=>{if(K.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:K});Y()};return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(V3,{options:g3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import x3 from"node:fs";import{useMemoizedFn as w$}from"ahooks";import{Box as I0,Text as v0,useInput as u3}from"ink";import UQ from"ink-select-input";import{useEffect as l3,useMemo as o6,useState as O8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var qQ=10;function i6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=Q8($),[X,K]=O8(Q),[U,G]=O8(null),[q,L]=O8(0),[O,W]=O8(0),z=w$(()=>{Z.clear(),Z.loadFromStandardLocations(),L((R)=>R+1)}),b=o6(()=>{return Z.getAllSubagents()},[q]),N=Math.ceil(b.length/qQ)||1,A=o6(()=>{let R=O*qQ;return b.slice(R,R+qQ)},[b,O]);l3(()=>{let R=Math.max(0,N-1);if(O>R)W(R)},[N,O]);let T=w$(()=>{if(O<N-1)W((R)=>R+1)}),_=w$(()=>{if(O>0)W((R)=>R-1)}),f=[{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"}],P=w$((R)=>{if(R.value==="cancel"){J?.();return}K(R.value)}),w=w$((R)=>{if(G(R.value),X==="edit")K("editWizard");else if(X==="delete")K("deleteConfirm")}),C=w$(async()=>{if(!U?.configPath)return;try{await x3.promises.unlink(U.configPath),z(),B()}catch(R){console.error("删除失败:",R)}}),B=w$(()=>{K("menu"),G(null)}),y=S0(!1,J);if(u3((R,H)=>{if(H.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")W(0),B();else if(X==="deleteConfirm")B()}else if(H.ctrl&&R==="c"||H.meta&&R==="c")y();else if(X==="list"){if(H.leftArrow||R==="h")_();else if(H.rightArrow||R==="l")T()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(UQ,{items:f,onSelect:P},void 0,!1,void 0,this),i(I0,{marginTop:1,children:i(v0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="list"){if(b.length===0)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:[i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),i(v0,{color:"gray",children:[" (共 ",b.length," 个)"]},void 0,!0,void 0,this),N>1&&i(v0,{color:"yellow",children:[" ","第 ",O+1,"/",N," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A.map((R)=>i(I0,{flexDirection:"column",paddingLeft:2,children:[i(I0,{children:i(v0,{children:[i(v0,{bold:!0,color:R.color||"white",children:["• ",R.name]},void 0,!0,void 0,this),i(v0,{color:"gray",children:[" - ",R.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.tools&&R.tools.length>0&&i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:["工具: ",R.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.configPath&&i(I0,{paddingLeft:2,children:i(v0,{color:"gray",dimColor:!0,children:R.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R.name,!0,void 0,this)),i(I0,{marginTop:1,paddingLeft:2,children:N>1?i(v0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let I=(R)=>{if(b.length===0)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let H=b.map((k)=>({key:k.name,label:`${k.name} - ${k.description}`,value:k}));return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(UQ,{items:H,onSelect:w},void 0,!1,void 0,this),i(I0,{marginTop:1,children:i(v0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(X==="create")return i(B2,{onComplete:()=>{z(),B()},onCancel:B},void 0,!1,void 0,this);if(X==="edit")return I("编辑 Agent");if(X==="editWizard"&&U){let R={name:U.name,description:U.description,tools:U.tools||[],color:U.color,location:U.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:U.systemPrompt||""};return i(B2,{initialConfig:R,onComplete:()=>{z(),B()},onCancel:B},void 0,!1,void 0,this)}if(X==="delete")return I("删除 Agent");if(X==="deleteConfirm"&&U)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{children:["你确定要删除 Agent"," ",i(v0,{bold:!0,color:"yellow",children:U.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:["文件路径: ",U.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(UQ,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(R)=>{if(R.value==="confirm")C();else B()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as l$,Text as O0}from"ink";import r3,{useEffect as a3,useState as o3}from"react";import{useEffect as d3,useState as n6}from"react";function e6($=d0(),Q=5000){let[Y,J]=n6(null),[Z,X]=n6(!0);return d3(()=>{let K=!0,U=async()=>{try{let q=await t6($);if(!K)return;if(!q){J(null),X(!1);return}let L=await s6($);if(!K)return;J(L)}catch{if(K)J(null)}finally{if(K)X(!1)}};U();let G=null;if(Q>0)G=setInterval(U,Q);return()=>{if(K=!1,G)clearInterval(G)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as s,Fragment as B1}from"react/jsx-dev-runtime";var Q9=r3.memo(()=>{let $=j2(),Q=h$(),J=D2()==="shortcuts",Z=V4(),X=T1(),{branch:K}=e6(X),U=h2(),G=I4(),q=b4(),L=m2(),O=p2(),W=c2(),z=x2(),b=u2(),N=A4(),A=P4(),T=g2(),_=x4(),f=j$(),[P,w]=o3(null);a3(()=>{let H=!1;new OQ(X,f).get().then((n)=>{if(!H)w(n)}).catch(()=>{if(!H)w(null)});let E=OQ.subscribe((n)=>{if(!H&&n.sessionId===f&&n.workspaceRoot===X)w(n.goal)});return()=>{H=!0,E()}},[f,X]);let C=U?K8(U):!1,y=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return s(O0,{color:"magenta",children:[">> ","auto edit on ",s(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return s(O0,{color:"cyan",children:["‖ plan mode on ",s(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return s(O0,{color:"red",children:["yolo mode on ",s(O0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),I=y!==null,R=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return s(l$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?s(l$,{flexDirection:"column",gap:0,children:R.map((H,k)=>s(l$,{flexDirection:"row",children:[H.map((E,n)=>{let[d,a]=E.split(":");return s(l$,{flexDirection:"row",width:20,children:[s(O0,{color:"yellow",children:d},void 0,!1,void 0,this),s(O0,{color:"gray",children:":"},void 0,!1,void 0,this),s(O0,{color:"white",children:a},void 0,!1,void 0,this)]},n,!0,void 0,this)}),k===R.length-1&&s(O0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},k,!0,void 0,this))},void 0,!1,void 0,this):s(l$,{flexDirection:"row",gap:1,children:[K&&s(B1,{children:[s(O0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y,I&&s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),P&&s(B1,{children:[s(O0,{color:P.status==="active"?"green":P.status==="verifying"?"cyan":P.status==="blocked"||P.status==="budget_limited"?"yellow":"gray",children:["goal:",P.status," ",P.objective.slice(0,32),P.prematureStop?` recovery:${P.prematureStop.consecutiveCount}`:"",P.verificationStall?` verify-gap:${P.verificationStall.consecutiveCount}`:""]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(l$,{flexDirection:"row",gap:1,children:!$?s(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):s(B1,{children:[C&&s(B1,{children:[L?s(O0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):s(O0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&s(B1,{children:[s(O0,{color:W==="fast"?"yellow":"gray",children:["Speed ",W]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&s(B1,{children:[s(O0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b!=="auto"&&s(B1,{children:[s(O0,{color:"gray",children:["Style ",b]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&s(O0,{color:"gray",children:U.model},void 0,!1,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?s(O0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):s(O0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:A===void 0?"gray":"cyan",children:["Cache ",$9(A)]},void 0,!0,void 0,this),N>0.001&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"green",children:["$",N<0.01?N.toFixed(4):N.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T.length>0&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"yellow",children:["已排队 ",T.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_>0&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"cyan",children:["已恢复 ",_," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"yellow",children:"再按一次 Ctrl+C 退出"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as zQ,Text as _Q}from"ink";import i3 from"react";import{jsxDEV as d$}from"react/jsx-dev-runtime";var J9=i3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),K=Q>=$.length;if(Q>=J&&!K)Z=Q-J+1,X=Q+1;let U=$.slice(Z,X),G=$.length>J;return d$(zQ,{flexDirection:"column",paddingX:2,paddingY:0,children:[U.map((q,L)=>{let W=Z+L===Q;return d$(zQ,{flexDirection:"row",paddingX:1,gap:2,children:[d$(_Q,{color:W?"cyan":"white",bold:W,children:q.command},void 0,!1,void 0,this),d$(_Q,{color:W?"cyan":"gray",dimColor:!W,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),G&&d$(zQ,{paddingX:1,children:d$(_Q,{color:K?"cyan":"gray",bold:K,dimColor:!K,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as F1,Text as f1,useInput as iZ,useStdout as nZ}from"ink";import tZ from"ink-select-input";import hQ,{useMemo as V9}from"react";import{Box as z0,Text as M0}from"ink";import A$,{useEffect as VQ,useMemo as b$,useRef as S9}from"react";import{Box as RQ,Text as F9}from"ink";import qZ from"react";import{Text as w1}from"ink";import KZ from"react";import z9 from"string-width";import w2 from"string-width";function NQ({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 n3=NQ();function FQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(n3,"")}var Y9=($=0)=>(Q)=>`\x1B[${Q+$}m`,Z9=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,X9=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,h0={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]}},xU=Object.keys(h0.modifier),t3=Object.keys(h0.color),s3=Object.keys(h0.bgColor),uU=[...t3,...s3];function e3(){let $=new Map;for(let[Q,Y]of Object.entries(h0)){for(let[J,Z]of Object.entries(Y))h0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=h0[J],$.set(Z[0],Z[1]);Object.defineProperty(h0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(h0,"codes",{value:$,enumerable:!1}),h0.color.close="\x1B[39m",h0.bgColor.close="\x1B[49m",h0.color.ansi=Y9(),h0.color.ansi256=Z9(),h0.color.ansi16m=X9(),h0.bgColor.ansi=Y9(10),h0.bgColor.ansi256=Z9(10),h0.bgColor.ansi16m=X9(10),Object.defineProperties(h0,{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)=>h0.rgbToAnsi256(...h0.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 U=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(U/6)/5,Z=U%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let K=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)K+=60;return K},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>h0.ansi256ToAnsi(h0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>h0.ansi256ToAnsi(h0.hexToAnsi256(Q)),enumerable:!1}}),h0}var $Z=e3(),K9=$Z;var _8=new Set(["\x1B","›"]),QZ=39,HQ="\x07",q9="[",JZ="]",O9="m",z8=`${JZ}8;;`,G9=($)=>`${_8.values().next().value}${q9}${$}${O9}`,U9=($)=>`${_8.values().next().value}${z8}${$}${HQ}`,YZ=($)=>$.split(" ").map((Q)=>w2(Q)),WQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,K=w2(FQ($.at(-1)));for(let[U,G]of J.entries()){let q=w2(G);if(K+q<=Y)$[$.length-1]+=G;else $.push(G),K=0;if(_8.has(G))Z=!0,X=J.slice(U+1,U+1+z8.length).join("")===z8;if(Z){if(X){if(G===HQ)Z=!1,X=!1}else if(G===O9)Z=!1;continue}if(K+=q,K===Y&&U<J.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},ZZ=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(w2(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},XZ=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,K=YZ($),U=[""];for(let[O,W]of $.split(" ").entries()){if(Y.trim!==!1)U[U.length-1]=U.at(-1).trimStart();let z=w2(U.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))U.push(""),z=0;if(z>0||Y.trim===!1)U[U.length-1]+=" ",z++}if(Y.hard&&K[O]>Q){let b=Q-z,N=1+Math.floor((K[O]-b-1)/Q);if(Math.floor((K[O]-1)/Q)<N)U.push("");WQ(U,W,Q);continue}if(z+K[O]>Q&&z>0&&K[O]>0){if(Y.wordWrap===!1&&z<Q){WQ(U,W,Q);continue}U.push("")}if(z+K[O]>Q&&Y.wordWrap===!1){WQ(U,W,Q);continue}U[U.length-1]+=W}if(Y.trim!==!1)U=U.map((O)=>ZZ(O));let G=U.join(`
119
- `),q=[...G],L=0;for(let[O,W]of q.entries()){if(J+=W,_8.has(W)){let{groups:b}=new RegExp(`(?:\\${q9}(?<code>\\d+)m|\\${z8}(?<uri>.*)${HQ})`).exec(G.slice(L))||{groups:{}};if(b.code!==void 0){let N=Number.parseFloat(b.code);Z=N===QZ?void 0:N}else if(b.uri!==void 0)X=b.uri.length===0?void 0:b.uri}let z=K9.codes.get(Number(Z));if(q[O+1]===`
120
- `){if(X)J+=U9("");if(Z&&z)J+=G9(z)}else if(W===`
121
- `){if(Z&&z)J+=G9(Z);if(X)J+=U9(X)}L+=W.length}return J};function LQ($,Q,Y){return String($).normalize().replaceAll(`\r
122
- `,`
123
- `).split(`
124
- `).map((J)=>XZ(J,Q,Y)).join(`
125
- `)}var BQ=($)=>{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 z9(Q)};var _9=($)=>{return/[*_~`<[\]https?:]/.test($)},wQ=($)=>{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)=>z9(J)))},N8=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=LQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
126
- `).filter((K)=>K.length>0);return X.length>0?X:[""]},N9=($,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 N1,Fragment as UZ}from"react/jsx-dev-runtime";var bQ=2,AQ=1,PQ=2;function yQ($,Q){return`inline-${$}-${Q}`}var GZ=({text:$})=>{let Q=b0();if(!_9($))return N1(w1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,K=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,U;while((U=K.exec($))!==null){if(U.index>J){let O=$.slice(J,U.index);Y.push(N1(w1,{children:O},yQ("text",Z++),!1,void 0,this))}let G=U[0],q=null,L=yQ("match",X++);try{if(G.startsWith("**")&&G.endsWith("**")&&G.length>bQ*2)q=N1(w1,{bold:!0,children:G.slice(bQ,-bQ)},L,!1,void 0,this);else if(G.length>AQ*2&&(G.startsWith("*")&&G.endsWith("*")||G.startsWith("_")&&G.endsWith("_"))){let O=$.substring(U.index-1,U.index),W=$.substring(K.lastIndex,K.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(W)||/[./\\]/.test(O+W)))q=N1(w1,{italic:!0,children:G.slice(AQ,-AQ)},L,!1,void 0,this)}else if(G.startsWith("~~")&&G.endsWith("~~")&&G.length>PQ*2)q=N1(w1,{strikethrough:!0,children:G.slice(PQ,-PQ)},L,!1,void 0,this);else if(G.startsWith("`")&&G.endsWith("`")){let O=G.match(/^(`+)([^`]+)\1$/);if(O&&O[2])q=N1(w1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},L,!1,void 0,this)}else if(G.startsWith("[")&&G.includes("](")&&G.endsWith(")")){let O=G.match(/\[(.*?)\]\((.*?)\)/);if(O){let W=O[1],z=O[2];q=N1(w1,{children:[W,N1(w1,{color:Q.colors.info,children:[" (",z,")"]},void 0,!0,void 0,this)]},L,!0,void 0,this)}}else if(G.match(/^https?:\/\//))q=N1(w1,{color:Q.colors.info,children:G},L,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",G,O),q=null}Y.push(q??N1(w1,{children:G},L,!1,void 0,this)),J=K.lastIndex}if(J<$.length){let G=$.slice(J);Y.push(N1(w1,{children:G},yQ("text",Z++),!1,void 0,this))}return N1(UZ,{children:Y.filter((G)=>G!==null)},void 0,!1,void 0,this)},b1=KZ.memo(GZ);import{jsxDEV as r$}from"react/jsx-dev-runtime";var OZ="▎",W9=qZ.memo(({lines:$,level:Q})=>{let Y=b0(),J=OZ.repeat(Q);return r$(RQ,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return r$(RQ,{height:1},X,!1,void 0,this);return r$(RQ,{flexDirection:"row",children:[r$(F9,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),r$(F9,{italic:!0,wrap:"wrap",children:r$(b1,{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 W8,Text as m1}from"ink";import{isPlainObject as IQ}from"lodash-es";import{common as bZ,createLowlight as AZ}from"lowlight";import{LRUCache as PZ}from"lru-cache";import P9 from"react";import{Box as F8,Text as b2}from"ink";import g1,{Fragment as b9}from"react";import{LRUCache as w9}from"lru-cache";import zZ from"string-width";var _Z=1024,NZ=1048576,H9=1000,L9=new w9({max:_Z,maxSize:NZ,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+$.length*8)});function MQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=H9){let J=L9.get($);if(J)return J}let Y=Array.from($);if($.length<=H9)L9.set($,Y);return Y}var FZ=2048,WZ=524288,HZ=4096,B9=new w9({max:FZ,maxSize:WZ,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+8)});function E1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let Q=B9.get($);if(Q!==void 0)return Q;let Y=zZ($);if($.length<=HZ)B9.set($,Y);return Y}import{jsxDEV as a$}from"react/jsx-dev-runtime";var TQ=2,A9=g1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=b0(),K=[],U=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),TQ);function G(N){if(!g1.isValidElement(N))return;if(N.type===b9){g1.Children.forEach(N.props.children,G);return}if(N.type===F8){BZ(N,Q,K);return}}g1.Children.forEach($,G);let L=K.length>U||Z>0?U-1:U,O=L!==void 0?Math.max(0,K.length-L):0,W=O+Z,b=(O>0?J==="top"?K.slice(O):K.slice(0,L):K).map((N,A)=>a$(F8,{children:N.length>0?N.map((T,_)=>a$(b2,{...T.props,children:T.text},_,!1,void 0,this)):a$(b2,{children:" "},void 0,!1,void 0,this)},A,!1,void 0,this));return a$(F8,{flexDirection:"column",width:Q,flexShrink:0,children:[W>0&&J==="top"&&a$(b2,{color:X.colors.text.muted,dimColor:!0,children:["... ",W," line",W===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),b,W>0&&J==="bottom"&&a$(b2,{color:X.colors.text.muted,dimColor:!0,children:["... ",W," line",W===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function LZ($){if(!g1.isValidElement($)||$.type!==F8)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 L={text:q,props:X??{}};if(X===void 0||X.wrap==="wrap")Y=!0,Q.segments.push(L);else if(!Y)Q.noWrapSegments.push(L);else Q.segments.push(L);return}if(!g1.isValidElement(Z))return;if(Z.type===b9){g1.Children.forEach(Z.props.children,(q)=>J(q,X));return}if(Z.type!==b2)return;let{children:K,...U}=Z.props,G=X===void 0?U:{...X,...U};g1.Children.forEach(K,(q)=>J(q,G))}return g1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function BZ($,Q,Y){let J=LZ($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=E1(O.text);if(J.segments.length===0){let O=[],W=[];for(let z of J.noWrapSegments){let b=z.text.split(`
127
- `);for(let N=0;N<b.length;N++){if(N>0)O.push(W),W=[];if(b[N])W.push({text:b[N],props:z.props})}}if(W.length>0)O.push(W);for(let z of O)Y.push(z);return}let X=Q-Z;if(X<1){wZ(J.noWrapSegments,Q,Y);return}let K=[],U=[],G=0;function q(){if(K.length===0)K.push([...J.noWrapSegments,...U]);else if(Z>0)K.push([{text:" ".repeat(Z),props:{}},...U]);else K.push(U);U=[],G=0}function L(O,W){if(U.length>0&&U[U.length-1].props===W)U[U.length-1].text+=O;else U.push({text:O,props:W})}for(let O of J.segments){let W=O.text.split(`
128
- `);for(let z=0;z<W.length;z++){if(z>0)q();let N=W[z].split(/(\s+)/);for(let A of N){if(!A)continue;let T=E1(A);if(G+T>X&&G>0){if(q(),/^\s+$/.test(A))continue}if(T>X){let f=MQ(A);while(f.length>0){let P=0,w=0;for(let C of f){let B=E1(C);if(G+w+B>X)break;w+=B,P++}if(P>0){let C=f.slice(0,P).join("");L(C,O.props),G+=E1(C),f=f.slice(P)}if(f.length>0)q()}}else L(A,O.props),G+=T}}if(O.text.endsWith(`
129
- `))q()}if(U.length>0)q();for(let O of K)Y.push(O)}function wZ($,Q,Y){let J=[],Z=[],X=0;for(let K of $){let U=K.text.split(`
130
- `);for(let G=0;G<U.length;G++){if(G>0)J.push(Z),Z=[],X=0;let q=U[G];if(!q)continue;let L=E1(q),O=Math.max(0,Q-E1("…"));if(L<=O&&X===0)Z.push({text:q,props:K.props}),X+=L;else{let W=MQ(q),z=X,b=0;for(let A of W){let T=E1(A);if(z+T>O)break;z+=T,b++}let N=W.slice(0,b).join("");if(N)Z.push({text:N,props:K.props});Z.push({text:"…",props:{}}),X=z+E1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let K of J)Y.push(K)}import{jsxDEV as X1}from"react/jsx-dev-runtime";var CQ=AZ(bZ),yZ=200,RZ=524288,MZ=4096,y9=new PZ({max:yZ,maxSize:RZ,sizeCalculation:($)=>$.retainedChars});function R9($,Q){return`${Q??"__auto__"}\x00${$}`}function TZ($,Q){return y9.get(R9($,Q))?.root}function CZ($,Q,Y){if($.length>MZ)return;let J=Q?.length??0;y9.set(R9($,Q),{root:Y,retainedChars:Math.max(1,$.length*2+J)})}function IZ($){return IQ($)&&$.type==="text"&&typeof $.value==="string"}function fZ($){return IQ($)&&$.type==="element"}function kZ($){return IQ($)&&$.type==="root"&&Array.isArray($.children)}function H8($,Q,Y=0){if(IZ($))return X1(m1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(fZ($)){let J=$.properties?.className?.[0]||"",Z=Q.default;if(J.includes("comment"))Z=Q.comment;else if(J.includes("string"))Z=Q.string;else if(J.includes("number"))Z=Q.number;else if(J.includes("keyword"))Z=Q.keyword;else if(J.includes("function"))Z=Q.function;else if(J.includes("variable"))Z=Q.variable;else if(J.includes("operator"))Z=Q.operator;else if(J.includes("type"))Z=Q.type;else if(J.includes("tag"))Z=Q.tag;else if(J.includes("attr"))Z=Q.attr;let X=$.children?.map((K,U)=>H8(K,Q,U));return X1(m1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(kZ($))return X1(P9.Fragment,{children:$.children.map((J,Z)=>H8(J,Q,Z))},Y,!1,void 0,this);return X1(m1,{},Y,!1,void 0,this)}function SZ($,Q,Y){let J=Y||a0.getTheme().colors.syntax;try{let Z=TZ($,Q);if(Z)return H8(Z,J);let X;if(!Q||!CQ.registered(Q))X=CQ.highlightAuto($);else X=CQ.highlight(Q,$);let K=X;if(!K.children||K.children.length===0)return X1(m1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return CZ($,Q,X),H8(X,J)}catch(Z){return X1(m1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var L8=P9.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=b0(),K=$.split(`
131
- `),U=0;if(Z&&K.length>Z){let O=Math.max(Z,TQ);if(K.length>O)U=K.length-O,K=K.slice(U)}let G=K.length+U,q=String(G).length+1,L=Math.max(20,J-4);return X1(W8,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&X1(W8,{marginBottom:0,children:X1(m1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),U>0&&X1(W8,{marginBottom:0,children:X1(m1,{color:X.colors.text.muted,dimColor:!0,children:["... ",U," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(A9,{maxWidth:L,maxHeight:Z,children:K.map((O,W)=>{let z=W+U+1;return X1(W8,{flexDirection:"row",children:[Y&&X1(m1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(z).padStart(q-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?X1(m1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):SZ(O,Q,X.colors.syntax)]},W,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as M9,Text as O1,useInput as vZ}from"ink";import DZ,{useState as VZ}from"react";import{jsxDEV as K1}from"react/jsx-dev-runtime";var T9=400;function jZ($){let Q=$.split(`
132
- `),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let K=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(K)J=parseInt(K[1],10),Z=parseInt(K[3],10);Y.push({type:"header",content:X});continue}if(X.startsWith("-")){Y.push({type:"remove",content:X.substring(1),lineNumber:J}),J++;continue}if(X.startsWith("+")){Y.push({type:"add",content:X.substring(1),lineNumber:Z}),Z++;continue}if(X.startsWith(" ")||X===""){Y.push({type:"context",content:X.substring(1),lineNumber:Z}),J++,Z++;continue}}return Y}var fQ=DZ.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let K=b0(),U=jZ($),[G,q]=VZ(!1);vZ((_)=>{if(_.toLowerCase()==="e")q((f)=>!f)},{isActive:X&&U.length>Z});let O=Math.max(...U.map((_)=>_.lineNumber||0)).toString().length+1,W=U.filter((_)=>_.type==="add").length,z=U.filter((_)=>_.type==="remove").length,b=U.length,N=b>Z,A;if(!N)A=U;else if(G)A=U.slice(0,T9);else A=U.slice(0,Z);let T=b-A.length;return K1(M9,{flexDirection:"column",marginTop:1,marginBottom:1,children:[K1(O1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),N&&K1(O1,{color:K.colors.info,children:[G?`已展开 ${A.length}/${b} 行`:`显示前 ${Z} 行,共 ${b} 行`," · ",K1(O1,{color:K.colors.success,children:["+",W]},void 0,!0,void 0,this)," ",K1(O1,{color:K.colors.error,children:["-",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N&&K1(O1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),A.map((_,f)=>{if(_.type==="header")return K1(O1,{color:K.colors.muted,dimColor:!0,children:_.content},f,!1,void 0,this);let P=_.lineNumber?_.lineNumber.toString().padStart(O," "):" ".repeat(O),w=" ",C,B;if(_.type==="add")w="+",B=K.colors.success,C=void 0;else if(_.type==="remove")w="-",B=K.colors.error,C=void 0;else B=K.colors.text.primary;let y=Math.max(0,J-O-2),I=_.content;if(I.length>y)I=I.substring(0,y-3)+"...";return K1(O1,{color:B,backgroundColor:C,children:[K1(O1,{dimColor:!0,children:P},void 0,!1,void 0,this),K1(O1,{children:w},void 0,!1,void 0,this),K1(O1,{children:[" ",I]},void 0,!0,void 0,this)]},f,!0,void 0,this)}),N&&K1(M9,{marginTop:1,children:G?K1(O1,{color:K.colors.info,dimColor:!0,children:[T>0?`已达显示上限 ${T9} 行,仍有 ${T} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):K1(O1,{color:K.colors.info,dimColor:!0,children:["已隐藏剩余 ",T," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),K1(O1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as kQ,Text as C9}from"ink";import hZ from"react";import{jsxDEV as o$}from"react/jsx-dev-runtime";var EZ=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,K=J.length;return o$(kQ,{paddingLeft:K+1,flexDirection:"row",children:[o$(kQ,{width:X,children:o$(C9,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),o$(kQ,{flexGrow:1,children:o$(C9,{wrap:"wrap",children:o$(b1,{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)},SQ=hZ.memo(EZ);import{Text as vQ}from"ink";import gZ,{useMemo as mZ}from"react";import I9 from"string-width";import{jsxDEV as DQ}from"react/jsx-dev-runtime";var f9=4,i$=3,pZ=4,k9=gZ.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=b0(),Z=mZ(()=>{if($.length===0||Q.length===0)return null;let O=$.length,W=$.map((B,y)=>{let I=Math.max(wQ(B),i$);for(let R of Q)I=Math.max(I,wQ(R[y]||""));return I}),z=$.map((B,y)=>{let I=Math.max(BQ(B),i$);for(let R of Q)I=Math.max(I,BQ(R[y]||""));return I}),b=1+O*3,N=Math.max(Y-b-f9,O*i$),A=W.reduce((B,y)=>B+y,0),T=z.reduce((B,y)=>B+y,0),_=!1,f;if(T<=N)f=z;else if(A<=N){let B=N-A,y=z.map((R,H)=>R-W[H]),I=y.reduce((R,H)=>R+H,0);f=W.map((R,H)=>{if(I===0)return R;let k=Math.floor(y[H]/I*B);return R+k})}else{_=!0;let B=N/A;f=W.map((y)=>Math.max(Math.floor(y*B),i$))}function P(){let B=1;for(let y=0;y<$.length;y++){let I=N8($[y],f[y],_);B=Math.max(B,I.length)}for(let y of Q)for(let I=0;I<y.length;I++){let R=N8(y[I]||"",f[I],_);B=Math.max(B,R.length)}return B}if(P()>pZ)return{type:"vertical",columnWidths:f,needsHardWrap:_};return{type:"horizontal",columnWidths:f,needsHardWrap:_}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),W="─".repeat(O);return DQ(vQ,{children:Q.map((z,b)=>{let N=[];if(b>0)N.push(W);return z.forEach((A,T)=>{let _=$[T]||`Column ${T+1}`,f=(A||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${_}:\x1B[22m ${f}`)}),N.join(`
133
- `)}).join(`
134
- `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:K}=Z;function U(O){let z={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],b=z.left;return X.forEach((N,A)=>{b+=z.h.repeat(N+2),b+=A<X.length-1?z.mid:z.right}),b}function G(O,W){let z=O.map((T,_)=>{let f=X[_]||i$;return N8(T||"",f,K)}),b=Math.max(...z.map((T)=>T.length),1),N=z.map((T)=>Math.floor((b-T.length)/2)),A=[];for(let T=0;T<b;T++){let _="│";for(let f=0;f<O.length;f++){let P=z[f],w=N[f],C=T-w,B=C>=0&&C<P.length?P[C]:"",y=X[f]||i$,I=I9(B),R=N9(W?`\x1B[1m${B}\x1B[22m`:B,I,y,W?"center":"left");_+=` ${R} │`}A.push(_)}return A}let q=[];if(q.push(U("top")),q.push(...G($,!0)),q.push(U("middle")),Q.forEach((O,W)=>{if(q.push(...G(O,!1)),W<Q.length-1)q.push(U("middle"))}),q.push(U("bottom")),Math.max(...q.map((O)=>I9(O)))>Y-f9){let O=Math.min(Y-1,40),W="─".repeat(O);return DQ(vQ,{children:Q.map((z,b)=>{let N=[];if(b>0)N.push(W);return z.forEach((A,T)=>{let _=$[T]||`Column ${T+1}`,f=(A||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${_}:\x1B[22m ${f}`)}),N.join(`
135
- `)}).join(`
136
- `)},void 0,!1,void 0,this)}return DQ(vQ,{color:J.colors.text.primary,children:q.join(`
137
- `)},void 0,!1,void 0,this)});import{jsxDEV as g}from"react/jsx-dev-runtime";var cZ=($,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:" "}}},xZ=A$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=b0();if(J&&Z!==void 0){let K=$.split(`
138
- `),U=4,G=Math.max(1,Z-4);if(K.length>G){let q=K.slice(0,G).join(`
139
- `);return g(z0,{flexDirection:"column",flexShrink:0,children:[g(L8,{content:q,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),g(M0,{color:X.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return g(L8,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),uZ=A$.memo(({content:$,level:Q})=>{let Y=b0();switch(Q){case 1:return g(M0,{bold:!0,color:Y.colors.primary,children:g(b1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return g(M0,{bold:!0,color:Y.colors.primary,children:g(b1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return g(M0,{bold:!0,color:Y.colors.text.primary,children:g(b1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return g(M0,{italic:!0,color:Y.colors.text.muted,children:g(b1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return g(M0,{children:g(b1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),lZ=A$.memo(({terminalWidth:$})=>{let Q=b0(),Y=Math.max(0,Math.min($-4,80));return g(M0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),dZ=A$.memo(({content:$})=>{return g(M0,{wrap:"wrap",children:g(b1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),rZ=A$.memo(({content:$})=>{let Q=b0();return g(z0,{flexDirection:"row",gap:1,children:[g(M0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),g(M0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),aZ=A$.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,K=X?Z.slice(0,50):Z,U=K.join(`
141
- `),G=U.includes("<<<DIFF>>>"),q=U.includes("```");if(G){let L=U.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(L)try{let O=JSON.parse(L[1]);return g(z0,{flexDirection:"column",children:[g(fQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&g(z0,{marginTop:1,children:g(M0,{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 L=U.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(L){let O=L[1]||"text",W=L[2];return g(z0,{flexDirection:"column",children:[g(L8,{content:W,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&g(z0,{marginTop:1,children:g(M0,{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 g(z0,{flexDirection:"column",children:[K.map((L,O)=>g(M0,{color:Y.colors.text.primary,children:L},O,!1,void 0,this)),X&&g(z0,{marginTop:1,children:g(M0,{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 oZ($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),K=Math.max(40,J*0.8),U=X*K;if($.length<=U)return{content:$,isTruncated:!1,hiddenLines:0};let G=Math.floor(U*0.9),q=$.length-G,L=q,O=$.indexOf(`
142
- `,q);if(O!==-1&&O-q<K)L=O+1;let W=$.slice(L),b=($.slice(0,L).match(/\n/g)||[]).length+1;return{content:W,isTruncated:!0,hiddenLines:b}}var I1=A$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:K=!1,noMargin:U=!1,renderPlainTextOnly:G=!1,streamingLines:q,streamingHiddenLines:L,messageId:O,blocksOverride:W,currentLineOverride:z,streamingMode:b="text",renderCodeBlocksAsPlainText:N=!1})=>{let A=b0(),T=W!==void 0,_=b$(()=>cZ(Q,A.colors,J),[Q,A.colors,J]),{color:f,prefix:P}=_,w=P.length+1,C=b$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let F=J.subtaskRef;if(!F||typeof F!=="object")return null;return F},[J]),B=Q==="tool"&&J?.phase==="start",y=!U&&!B,I=b$(()=>{if(!G)return[];return $.split(/\r?\n/)},[$,G]);if(!T&&Z){let F=q??$.split(/\r?\n/),S=L??0,D=!1,v=!1,h=!1;if(b!=="text")D=b==="code",v=b==="diff",h=b==="table";return g(z0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[S>0&&g(z0,{flexDirection:"row",flexShrink:0,children:[g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(M0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",S," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.map((m,Q0)=>{if(b==="text"){if(m.match(Q$.codeBlock))D=!D;else if(m.match(Q$.diffStart))v=!0;else if(m.match(Q$.diffEnd))v=!1;else if(m.match(Q$.table))h=!0;else if(h&&!m.match(Q$.table))h=!1}let o=b==="text"&&!D&&!v&&!h,F0=o?m.match(Q$.ulItem):null,y0=o?m.match(Q$.olItem):null,m0=F0??y0;return g(z0,{flexDirection:"row",flexShrink:0,children:[Q0===0&&!K?g(z0,{marginRight:1,flexShrink:0,children:g(M0,{color:f,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:m0?g(SQ,{type:F0?"ul":"ol",marker:m0[2],itemText:m0[3],leadingWhitespace:m0[1]},void 0,!1,void 0,this):g(M0,{wrap:"wrap",children:m===""?" ":m},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},Q0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!T&&G)return g(z0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:I.map((F,S)=>g(z0,{flexDirection:"row",flexShrink:0,children:[S===0&&!K?g(z0,{marginRight:1,flexShrink:0,children:g(M0,{color:f,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:g(M0,{wrap:"wrap",children:F===""?" ":F},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},S,!0,void 0,this))},void 0,!1,void 0,this);let R=S9(null);VQ(()=>{R.current=null},[O]);let H=b$(()=>{if(T)return null;if(!O)return null;return v9(O)},[O,T]);VQ(()=>{if(T)return;if(!H||!O)return;R.current={messageId:O,blocks:H}},[H,O,T]),VQ(()=>{if(T)return;if(!H||!O)return;D9(O)},[H,O,T]);let k=b$(()=>T?{content:$,isTruncated:!1,hiddenLines:0}:oZ($,X,Z,Y),[$,X,Z,Y,T]),{content:E,isTruncated:n,hiddenLines:d}=k;if(!T&&Q==="tool"&&J&&"detail"in J){let F=J;if(F.detail)return g(z0,{flexDirection:"column",marginBottom:U?0:1,children:[g(z0,{flexDirection:"row",children:[g(z0,{marginRight:1,children:g(M0,{color:f,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{color:f,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(z0,{marginLeft:P.length+1,children:g(aZ,{detail:F.detail,terminalWidth:Y-(P.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:a,currentLine:l}=b$(()=>{if(T)return{completedContent:"",currentLine:z??""};if(!Z)return{completedContent:E,currentLine:""};let F=E.lastIndexOf(`
143
- `);if(F===-1)return{completedContent:"",currentLine:E};return{completedContent:E.slice(0,F+1),currentLine:E.slice(F+1)}},[E,Z,T,z]),p=S9({content:"",blocks:[]}),M=b$(()=>{if(T)return W??[];if(H)return H;if(R.current&&R.current.messageId===O)return R.current.blocks;let F=p.current;if(!Z||!a.startsWith(F.content)){let h=jQ(a);return p.current={content:a,blocks:h},h}if(a===F.content)return F.blocks;let S=a.slice(F.content.length),D=jQ(S),v=[...F.blocks,...D];return p.current={content:a,blocks:v},v},[a,Z,T,W]);return g(z0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[n&&g(z0,{flexDirection:"row",flexShrink:0,children:[g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(M0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",d," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),M.map((F,S)=>{if(F.type==="empty")return g(z0,{height:1,flexShrink:0},S,!1,void 0,this);return g(z0,{flexDirection:"row",flexShrink:0,children:[S===0&&!K&&g(z0,{marginRight:1,flexShrink:0,children:g(M0,{color:f,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),(S>0||K)&&g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:F.type==="code"?N?g(M0,{wrap:"wrap",children:F.content},void 0,!1,void 0,this):g(xZ,{content:F.content,language:F.language,terminalWidth:Y-w,isPending:Z,availableHeight:X},void 0,!1,void 0,this):F.type==="table"&&F.tableData?g(k9,{headers:F.tableData.headers,rows:F.tableData.rows,terminalWidth:Y-w},void 0,!1,void 0,this):F.type==="heading"?g(uZ,{content:F.content,level:F.level||1},void 0,!1,void 0,this):F.type==="list"?g(SQ,{type:F.listType||"ul",marker:F.marker||"-",itemText:F.content,leadingWhitespace:" ".repeat(F.indentation||0)},void 0,!1,void 0,this):F.type==="hr"?g(lZ,{terminalWidth:Y-w},void 0,!1,void 0,this):F.type==="diff"&&F.diffData?g(fQ,{patch:F.diffData.patch,startLine:F.diffData.startLine,matchLine:F.diffData.matchLine,terminalWidth:Y-w},void 0,!1,void 0,this):F.type==="command-message"?g(rZ,{content:F.content},void 0,!1,void 0,this):F.type==="blockquote"&&F.blockquoteLines?g(W9,{lines:F.blockquoteLines,level:F.blockquoteLevel||1},void 0,!1,void 0,this):g(dZ,{content:F.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},S,!0,void 0,this)}),l&&g(z0,{flexDirection:"row",flexShrink:0,children:[M.length===0&&!K?g(z0,{marginRight:1,flexShrink:0,children:g(M0,{color:f,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:g(M0,{wrap:"wrap",children:l},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C&&g(z0,{flexDirection:"row",flexShrink:0,children:[g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[g(M0,{color:A.colors.text.muted,children:["Subtask"," ",typeof C.agentType==="string"?`@${C.agentType}`:"",typeof C.status==="string"?` · ${C.status}`:""]},void 0,!0,void 0,this),typeof C.summary==="string"&&C.summary.trim()!==""&&g(M0,{wrap:"wrap",children:C.summary},void 0,!1,void 0,this),typeof C.childSessionId==="string"&&g(M0,{color:A.colors.text.muted,children:["Session ",C.childSessionId]},void 0,!0,void 0,this),typeof C.resumedFrom==="string"&&g(M0,{color:A.colors.text.muted,children:["Resumed from ",C.resumedFrom,typeof C.resumeDepth==="number"?` · depth ${C.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 f0,Fragment as Q5}from"react/jsx-dev-runtime";var sZ=hQ.memo(({label:$,isSelected:Q})=>f0(f1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),eZ=hQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>f0(Q5,{children:[f0(F1,{marginBottom:1,children:f0(f1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&f0(F1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[f0(f1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),f0(F1,{marginTop:1,children:f0(I1,{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&&f0(F1,{flexDirection:"column",marginBottom:1,children:f0(I1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&f0(F1,{flexDirection:"column",marginBottom:1,children:[f0(f1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,K)=>f0(F1,{marginLeft:2,children:f0(f1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&f0(F1,{flexDirection:"column",marginBottom:1,children:[f0(f1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,K)=>f0(F1,{marginLeft:2,children:f0(f1,{children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this)),$.affectedFiles.length>3&&f0(F1,{marginLeft:2,children:f0(f1,{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 $5($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var j9=hQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=nZ(),J=Y.columns||80,X=e0()==="confirmation-prompt",K=S0(!1),U=$.type==="exitPlanMode",G=$.type==="enterPlanMode",q=$.type==="maxTurnsExceeded",L=$.type==="mcpSampling";iZ((z,b)=>{if(b.ctrl&&z==="c"||b.meta&&z==="c"){K();return}if(b.escape){Q({approved:!1,reason:"用户取消"});return}let N=z.toLowerCase();if(U){if(N==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(N==="s"){Q({approved:!0,targetMode:"default"});return}if(N==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(G){if(N==="y"){Q({approved:!0});return}if(N==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(q){if(N==="y"){Q({approved:!0});return}if(N==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(L){if(N==="y"){Q({approved:!0,scope:"once"});return}if(N==="n"){Q({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(N==="y"){Q({approved:!0,scope:"once"});return}if(N==="s"){Q({approved:!0,scope:"session"});return}if(N==="p"){Q({approved:!0,scope:"project"});return}if(N==="n"){Q({approved:!1,reason:"用户拒绝"});return}}},{isActive:X});let O=V9(()=>{if(U)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(G)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(q)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(L)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(本次会话)",value:{approved:!0,scope:"session"}},{key:"approve-project",label:"[P] 允许并记住(本项目)",value:{approved:!0,scope:"project"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[U,G,q,L]),W=V9(()=>{if(U)return{color:"cyan",title:"方案审核"};if(G)return{color:"magenta",title:"进入规划模式"};if(q)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[U,G,q,$.title]);return f0(F1,{flexDirection:"column",borderStyle:"round",borderColor:X?W.color:"gray",padding:1,children:[f0(F1,{marginBottom:1,children:f0(f1,{bold:!0,color:W.color,children:W.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),f0(eZ,{details:$,headerColor:W.color,isPlanModeExit:U,isPlanModeEnter:G,terminalWidth:J},void 0,!1,void 0,this),f0(F1,{flexDirection:"column",children:[f0(f1,{color:"gray",children:$5(U,G,q,L)},void 0,!1,void 0,this),f0(tZ,{items:O,isFocused:X,itemComponent:sZ,onSelect:(z)=>{Q(z.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as w0,Text as U0,useInput as J5}from"ink";import h9 from"ink-text-input";import{useState as p1}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var A2=[{action:"add",description:"Add a new hook"},{action:"status",description:"Show hooks status"},{action:"list",description:"List all configured hooks"},{action:"enable",description:"Enable hooks for this session"},{action:"disable",description:"Disable hooks for this session"},{action:"trust",description:"Trust the current project hook digest"},{action:"revoke",description:"Revoke project hook trust"}],B8=[{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"}],w8=[{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"}],Y5=[`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"],E9=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=a0.getTheme(),[X,K]=p1("action"),[U,G]=p1(0),[q,L]=p1(0),[O,W]=p1(0),[z,b]=p1(""),[N,A]=p1(""),[T,_]=p1(null),[f,P]=p1(!1),[w,C]=p1(null),B=A2[U],y=w8[q],I=B8[O],R=()=>{if(w){C(null);return}switch(X){case"action":Y();break;case"event":K("action");break;case"matcher":K("event");break;case"command":K("matcher");break;case"location":K("command");break;case"confirm":K("location");break}};J5((M,F)=>{if(F.escape){R();return}if(X==="action"){if(F.upArrow)G((S)=>S>0?S-1:A2.length-1);else if(F.downArrow)G((S)=>S<A2.length-1?S+1:0);else if(F.return)H()}else if(X==="event"){if(F.upArrow)L((S)=>S>0?S-1:w8.length-1);else if(F.downArrow)L((S)=>S<w8.length-1?S+1:0);else if(F.return)K("matcher")}else if(X==="location"){if(F.upArrow)W((S)=>S>0?S-1:B8.length-1);else if(F.downArrow)W((S)=>S<B8.length-1?S+1:0);else if(F.return)K("confirm")}else if(X==="confirm"){if(F.return)p()}});let H=()=>{let M=A2[U].action;if(M==="add")K("event");else if(M==="status")k();else if(M==="list")d();else if(M==="enable")q1.getInstance().enableSession(Q,$),C("Hooks enabled for this session");else if(M==="disable")q1.getInstance().disableSession(Q,$),C("Hooks disabled for this session");else if(M==="trust")E();else if(M==="revoke")n()},k=async()=>{let M=q1.getInstance(),F=M.isEnabled($,Q),S=M.getConfig($),D=await M.getTrustStatus($),v={};for(let m of Object.values(gQ)){let Q0=S[m];if(Q0&&Array.isArray(Q0)){let o=Q0.reduce((F0,y0)=>F0+(y0.hooks?.length||0),0);if(o>0)v[m]=o}}let h=[`Status: ${F?"Enabled":"Disabled"}`,`Trust: ${D.state}`,`Digest: ${D.currentDigest??"none"}`,""];if(Object.keys(v).length>0){h.push("Configured hooks:");for(let[m,Q0]of Object.entries(v))h.push(` ${m}: ${Q0} hook(s)`)}else h.push("No hooks configured");C(h.join(`
144
- `))},E=async()=>{try{let M=await q1.getInstance().trustProject($);C(`Trust: ${M.state}
145
- Digest: ${M.currentDigest??"none"}`)}catch(M){_(M instanceof Error?M.message:"Failed to trust hooks")}},n=async()=>{try{let M=await q1.getInstance().revokeProjectTrust($);C(`Trust: ${M.state}`)}catch(M){_(M instanceof Error?M.message:"Failed to revoke hook trust")}},d=()=>{let F=q1.getInstance().getConfig($),S=[],D=!1;for(let v of Object.values(gQ)){let h=F[v];if(!h||!Array.isArray(h)||h.length===0)continue;D=!0,S.push(`${v}:`);for(let m of h){let Q0=m.matcher,o="all";if(Q0?.tools)o=`tools: ${Array.isArray(Q0.tools)?Q0.tools.join(", "):Q0.tools}`;S.push(` [${o}]`);for(let F0 of m.hooks||[])if(F0.type==="command")S.push(` -> ${F0.command}`)}S.push("")}if(!D)S.push("No hooks configured"),S.push(""),S.push("Configure hooks in .blade/settings.local.json");C(S.join(`
146
- `))},a=()=>{K("command")},l=()=>{if(!N.trim()){_("Command cannot be empty");return}_(null),K("location")},p=async()=>{P(!0),_(null);try{let M=q1.getInstance(),F=await import("node:fs/promises"),S=await import("node:path"),D=await import("node:os"),v={matcher:z.trim()?{tools:z.trim()}:{},hooks:[{type:"command",command:N.trim()}]},h;switch(I.location){case"local":h=S.join($,".blade","settings.local.json");break;case"project":h=S.join($,".blade","settings.json");break;case"user":h=S.join(D.homedir(),".blade","settings.json");break}await F.mkdir(S.dirname(h),{recursive:!0});let m={};try{let y0=await F.readFile(h,"utf-8");m=JSON.parse(y0)}catch{}let Q0=m.hooks||{},o=Q0[y.event]||[],F0={...Q0,enabled:!0,[y.event]:[...o,v]};if(m.hooks=F0,await F.writeFile(h,JSON.stringify(m,null,2),"utf-8"),await M.reloadConfig($),J)J({event:y.event,matcher:z.trim(),command:N.trim()});Y()}catch(M){_(`Failed to save hook: ${M instanceof Error?M.message:"Unknown error"}`),P(!1)}};return c(w0,{flexDirection:"column",padding:1,children:[c(w0,{marginBottom:1,children:c(U0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginBottom:1,children:c(U0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),w&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(U0,{children:w},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="action"&&!w&&c(w0,{flexDirection:"column",children:[c(w0,{flexDirection:"column",marginTop:1,children:A2.map((M,F)=>c(w0,{children:[c(U0,{color:F===U?Z.colors.primary:void 0,bold:F===U,children:[F===U?"> ":" ",M.action]},void 0,!0,void 0,this),c(U0,{color:Z.colors.muted,children:[" - ",M.description]},void 0,!0,void 0,this)]},M.action,!0,void 0,this))},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="event"&&c(w0,{flexDirection:"column",children:[c(U0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),c(w0,{flexDirection:"column",marginTop:1,children:w8.map((M,F)=>c(w0,{children:[c(U0,{color:F===q?Z.colors.primary:void 0,bold:F===q,children:[F===q?"> ":" ",M.event]},void 0,!0,void 0,this),c(U0,{color:Z.colors.muted,children:[" - ",M.description]},void 0,!0,void 0,this)]},M.event,!0,void 0,this))},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X!=="event"&&c(w0,{marginBottom:1,children:c(U0,{children:["Event:"," ",c(U0,{bold:!0,color:Z.colors.primary,children:y.event},void 0,!1,void 0,this),c(U0,{color:Z.colors.muted,children:[" - ",y.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(X==="matcher"||X==="command"||X==="confirm")&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(U0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),c(U0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),c(U0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),c(U0,{color:Z.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="matcher"&&c(w0,{flexDirection:"column",children:[c(w0,{children:[c(U0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),c(h9,{value:z,onChange:b,onSubmit:a,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(X==="command"||X==="confirm")&&c(w0,{marginBottom:1,children:c(U0,{children:["Matcher: ",c(U0,{bold:!0,children:z||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X==="command"&&c(w0,{flexDirection:"column",children:[c(w0,{children:c(U0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:c(h9,{value:N,onChange:A,onSubmit:l,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{flexDirection:"column",marginTop:1,children:[c(U0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),Y5.map((M,F)=>c(U0,{color:Z.colors.muted,children:["• ",M]},F,!0,void 0,this))]},void 0,!0,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="location"&&c(w0,{flexDirection:"column",children:[c(w0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[c(U0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),c(U0,{children:" "},void 0,!1,void 0,this),c(U0,{children:[" ","Event: ",y.event," - ",y.description]},void 0,!0,void 0,this),c(U0,{children:[" Matcher: ",z||"(all)"]},void 0,!0,void 0,this),c(U0,{children:[" Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(U0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),c(w0,{flexDirection:"column",marginTop:1,children:B8.map((M,F)=>c(w0,{children:[c(U0,{color:F===O?Z.colors.primary:void 0,bold:F===O,children:[F===O?"> ":" ",F+1,". ",M.name]},void 0,!0,void 0,this),c(U0,{color:Z.colors.muted,children:[" ",M.description]},void 0,!0,void 0,this)]},M.location,!0,void 0,this))},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="confirm"&&c(w0,{flexDirection:"column",children:[c(w0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[c(U0,{bold:!0,children:["Saving hook to ",I.description,"..."]},void 0,!0,void 0,this),c(U0,{children:" "},void 0,!1,void 0,this),c(U0,{children:["Event: ",y.event]},void 0,!0,void 0,this),c(U0,{children:["Matcher: ",z||"(all tools)"]},void 0,!0,void 0,this),c(U0,{children:["Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:f?"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),T&&c(w0,{marginTop:1,children:c(U0,{color:Z.colors.error,children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as QJ}from"ahooks";import{Box as b5,Text as A5}from"ink";import P5 from"react";import{useMemoizedFn as A8}from"ahooks";import y$ from"chalk";import{Text as W5,useInput as H5}from"ink";import{useEffect as s9,useRef as P8}from"react";var b8={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var P$="\x1B",Z5=`${P$}[200~`,X5=`${P$}[201~`,K5="[200~",G5="[201~",U5=[`${P$}[I`,`${P$}[O`,"[I","[O"],p9=`${P$}[?2004h`,c9=`${P$}[?2004l`,pQ=`${P$}[?1004l`,q5=[Z5,K5],O5=[X5,G5];function x9(){return{pasteBuffer:null,pasteOverflowed:!1}}function g9($,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 m9($){return U5.some((Q)=>$===Q)}function u9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,K=[];while(Y.length>0){if(J!==null){let q=g9(Y,O5);if(!q){if(J.length+Y.length>mQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+q.index>mQ)Z=!0;else if(!Z)J+=Y.slice(0,q.index),K.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length);continue}let U=g9(Y,q5);if(!U){if(m9(Y))X=!0;else K.push({kind:"text",text:Y});Y="";break}let G=Y.slice(0,U.index);if(G&&!m9(G))K.push({kind:"text",text:G});J="",Z=!1,X=!0,Y=Y.slice(U.index+U.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:K}}import{execSync as n$}from"node:child_process";import{existsSync as z5,readFileSync as cQ}from"node:fs";import{basename as l9,isAbsolute as _5}from"node:path";function d9($){try{let Q=Buffer.from($,"base64");if(Q.length<4)return"image/png";if(Q[0]===137&&Q[1]===80&&Q[2]===78&&Q[3]===71)return"image/png";if(Q[0]===255&&Q[1]===216&&Q[2]===255)return"image/jpeg";if(Q[0]===71&&Q[1]===73&&Q[2]===70)return"image/gif";if(Q[0]===82&&Q[1]===73&&Q[2]===70&&Q[3]===70){if(Q.length>=12&&Q[8]===87&&Q[9]===69&&Q[10]===66&&Q[11]===80)return"image/webp"}return"image/png"}catch{return"image/png"}}function r9(){let $=process.platform,Q={darwin:"/tmp/blade_cli_latest_screenshot.png",linux:"/tmp/blade_cli_latest_screenshot.png",win32:process.env.TEMP?`${process.env.TEMP}\\blade_cli_latest_screenshot.png`:"C:\\Temp\\blade_cli_latest_screenshot.png"},Y={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(J)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${J}" with write permission' -e 'write png_data to fp' -e 'close access fp'`,getPath:"osascript -e 'get POSIX path of (the clipboard as «class furl»)'",deleteFile:(J)=>`rm -f "${J}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(J)=>`xclip -selection clipboard -t image/png -o > "${J}" || wl-paste --type image/png > "${J}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(J)=>`rm -f "${J}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(J)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${J.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(J)=>`del /f "${J}"`}};return{commands:Y[$]||Y.linux,screenshotPath:Q[$]||Q.linux}}function N5(){let{commands:$}=r9();try{return n$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function a9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function o9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function xQ($){let Q=a9($.trim()),Y=o9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function F5($){let Q=a9($.trim()),Y=o9(Q);if(xQ(Y))return Y;return null}async function i9($){let Q=F5($);if(!Q)return null;let Y;try{if(_5(Q))Y=cQ(Q);else{let K=N5();if(K&&Q===l9(K))Y=cQ(K);else return null}}catch(K){return console.error("Failed to read image file:",K),null}let J=Y.toString("base64"),Z=d9(J),X=l9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function n9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return n$(Y,{encoding:"utf-8"})||null}catch{return null}}async function t9(){let{commands:$,screenshotPath:Q}=r9();try{if(n$($.checkImage,{stdio:"ignore"}),n$($.saveImage(Q),{stdio:"ignore"}),!z5(Q))return null;let J=cQ(Q).toString("base64"),Z=d9(J);return n$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{n$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as w5}from"react/jsx-dev-runtime";var L5=/\r\n/g,B5=/\r/g;function uQ($){if(!$.includes("\r"))return $;return $.replace(L5,`
147
- `).replace(B5,`
148
- `)}function e9($,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 $J({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:K,onImagePaste:U,disabledKeys:G=[]}){let q=P8(x9()),L=P8($),O=P8(Z),W=P8(null);s9(()=>{L.current=$,O.current=Z},[$,Z]),s9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let z=A8((P,w)=>{let C=L.current,B=O.current;if(L.current=P,O.current=w,P!==C)J(P);if(w!==B)X(w)}),b=A8((P)=>{if(!P)return;let{newValue:w,newCursorPosition:C}=e9(uQ(P),L.current,O.current);z(w,C)}),N=A8(async(P)=>{let w=uQ(P);if(!w)return;if(U&&xQ(w))try{let B=await i9(w);if(B){let y=await U(B.base64,B.mediaType,B.filename);if(y?.prompt)b(y.prompt);return}}catch(B){console.error("Failed to process image path:",B)}if((w.length>b8.LARGE_INPUT_THRESHOLD||w.includes(`
149
- `))&&K){let B=await K(w);if(B?.prompt){b(B.prompt);return}}b(w)}),A=A8((P)=>{let w=W.current;if(!w){try{let B=P();if(!B)return;let y=B.catch(()=>{return});W.current=y,y.finally(()=>{if(W.current===y)W.current=null})}catch{}return}let C=w.then(P).then(()=>{return}).catch(()=>{return});W.current=C,C.finally(()=>{if(W.current===C)W.current=null})});H5((P,w)=>{A(()=>{let C=uQ(P),B=u9(q.current,C);if(q.current=B.state,B.handled)return(async()=>{for(let E of B.segments)if(E.kind==="paste")await N(E.text);else b(E.text)})();if(G.some((E)=>w[E])||w.ctrl&&P==="c"||w.ctrl&&P==="l"||w.ctrl&&P==="t"||w.ctrl&&P==="o"||w.meta&&P==="l"||w.meta&&P==="t"||w.meta&&P==="o"||w.shift&&w.tab||C==="?"&&L.current==="")return;let I=L.current,R=O.current,H=R,k=I;if(w.leftArrow)H--;else if(w.rightArrow)H++;else if(w.backspace||w.delete){if(P===""){if(R>0)k=I.slice(0,R-1)+I.slice(R,I.length),H--}else if(R<I.length)k=I.slice(0,R)+I.slice(R+1,I.length)}else if(w.ctrl&&C==="a")H=0;else if(w.ctrl&&C==="e")H=I.length;else if(w.ctrl&&C==="k")k=I.slice(0,R);else if(w.ctrl&&C==="u")k=I.slice(R),H=0;else if(w.ctrl&&C==="w"){let n=I.slice(0,R).match(/\s*\S+\s*$/);if(n){let d=n[0].length;k=I.slice(0,R-d)+I.slice(R),H-=d}}else if(w.ctrl&&C==="v"){let E=process.platform==="darwin";return(async()=>{if(U){let d=await t9();if(d){let a=await U(d.base64,d.mediaType,"clipboard.png");if(a?.prompt)b(a.prompt);return}}if(E)return;let n=await n9();if(n)await N(n)})()}else if(w.pageUp)H=0;else if(w.pageDown)H=I.length;else if(C===`
150
- `&&(w.shift||w.meta)){let{newValue:E,newCursorPosition:n}=e9(C,I,R);z(E,n);return}else if(!w.ctrl&&!w.meta){if(K&&(C.length>b8.LARGE_INPUT_THRESHOLD||C.includes(`
151
- `)))return N(C);k=I.slice(0,R)+C+I.slice(R,I.length),H+=C.length}if(H<0)H=0;if(H>k.length)H=k.length;z(k,H)})},{isActive:Y});let T=Y,_=$,f=Q?y$.grey(Q):void 0;if(T)if(f=Q.length>0?y$.inverse(Q[0])+y$.grey(Q.slice(1)):y$.inverse(" "),$.length===0)_=y$.inverse(" ");else{_="";for(let P=0;P<$.length;P++)if(P===Z&&Z<$.length)_+=y$.inverse($[P]);else _+=$[P];if(Z>=$.length)_+=y$.inverse(" ")}return w5(W5,{children:Q?$.length>0?_:f:_},void 0,!1,void 0,this)}import{jsxDEV as lQ}from"react/jsx-dev-runtime";var JJ=P5.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let U=e0()==="main-input",G=$.trimStart().startsWith("!"),q=QJ((O)=>{let W=O.split(`
152
- `).length,z=O.length,b=500,N=10;if(z>500||W>10){let A=Z(O),T=O.slice(0,30).replace(/\n/g," "),_=`${z} chars, ${W} lines: ${T}...`;return{prompt:`${X8(A)}${_}${JQ()}`}}return{}}),L=QJ(async(O,W,z)=>{try{let b=X(O,W);return{prompt:`${X8(b)}[Image #${b}]${JQ()}`}}catch(b){return console.error("[Image Paste] Failed to process image:",b),{prompt:`[Image paste failed: ${b instanceof Error?b.message:"Unknown error"}] `}}});return lQ(b5,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[lQ(A5,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),lQ($J,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:q,onImagePaste:L,placeholder:" 输入命令...",focus:U,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as y8,Text as A1}from"ink";import C5,{useEffect as I5,useState as f5}from"react";import{useEffect as T5,useState as KJ}from"react";import{useEffect as y5,useState as R5}from"react";var M5=15000,YJ=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],ZJ=["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 XJ($,Q,Y=!1){let[J,Z]=R5("");return y5(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let q=Math.floor(Math.random()*ZJ.length);return ZJ[q]}let G=Math.floor(Math.random()*YJ.length);return YJ[G]};Z(X());let K=setInterval(()=>{Z(X())},M5);return()=>{clearInterval(K)}},[$,Q,Y]),J}function GJ($,Q=!1,Y=!1){let[J,Z]=KJ(0),[X,K]=KJ(null),U=XJ($,Q,Y);return T5(()=>{if(!$){Z(0),K(null);return}if(Y)return;if(X===null)K(Date.now());let G=setInterval(()=>{if(X!==null){let q=Math.floor((Date.now()-X)/1000);Z(q)}},1000);return()=>{clearInterval(G)}},[$,X,Y]),{currentPhrase:U,elapsedTime:J}}import{jsxDEV as $1,Fragment as S5}from"react/jsx-dev-runtime";var dQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],k5=80;function t$($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var UJ=C5.memo(({message:$,paused:Q=!1})=>{let Y=E$(),J=j2(),Z=R4(),X=y4(),K=M4(),U=T4(),G=C4(),q=Y||!J,[L,O]=f5(0),W=b0(),b=$$()>=k5,{currentPhrase:N,elapsedTime:A}=GJ(q,!1,Q);if(I5(()=>{if(!q||Q){O(0);return}let B=setInterval(()=>{O((y)=>(y+1)%dQ.length)},150);return()=>clearInterval(B)},[q,Q]),!q)return null;let T=K?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${K.attempt}/${K.maxRetries}),剩余约 ${t$(Math.max(0,Math.ceil((K.recoveryRemainingMs??0)/1000)))}`:K?.phase==="scheduled"?`Provider 暂时不可用,${K.attempt}/${K.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((K.delayMs??0)/1000))}s 后开始`:K?.phase==="attempt"?`正在重试 Provider (${K.attempt}/${K.maxRetries})`:null,_=X?X.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${X.retryAfterMs!==void 0?` (${t$(Math.max(0,Math.ceil(X.retryAfterMs/1000)))})`:""}${X.recoveryRemainingMs!==void 0?`,剩余预算 ${t$(Math.max(0,Math.ceil(X.recoveryRemainingMs/1000)))}`:""}`:null,f=Z?`等待 Provider 容量(${Z.scope},队列 ${Z.queuePosition}/${Math.max(Z.queueDepth,Z.queuePosition)},已等待 ${t$(Math.max(0,Math.ceil(Z.waitMs/1000)))})`:null,P=U?U.outputStarted?`Provider 流已暂停 ${Math.ceil(U.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(U.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(U.durationMs/1000)}s(空闲超时上限 ${Math.ceil(U.timeoutMs/1000)}s)`:null,C=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||_||f||T||P||$||N||"正在思考中...";if(b)return $1(y8,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[$1(A1,{color:W.colors.warning,bold:!0,children:dQ[L]},void 0,!1,void 0,this),$1(A1,{color:W.colors.text.primary,children:C},void 0,!1,void 0,this),A>0&&$1(S5,{children:[$1(A1,{color:W.colors.muted,children:"|"},void 0,!1,void 0,this),$1(A1,{color:W.colors.info,children:["已用时: ",t$(A)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$1(A1,{color:W.colors.muted,children:"|"},void 0,!1,void 0,this),$1(A1,{color:W.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $1(y8,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[$1(y8,{flexDirection:"row",gap:1,children:[$1(A1,{color:W.colors.warning,bold:!0,children:dQ[L]},void 0,!1,void 0,this),$1(A1,{color:W.colors.text.primary,children:C},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A>0&&$1(y8,{marginLeft:2,flexDirection:"row",gap:1,children:[$1(A1,{color:W.colors.info,children:["已用时: ",t$(A)]},void 0,!0,void 0,this),$1(A1,{color:W.colors.muted,children:"|"},void 0,!1,void 0,this),$1(A1,{color:W.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 T8,Text as D0,useInput as v5,useStdout as D5}from"ink";import V5 from"ink-text-input";import j5,{useCallback as R8,useEffect as h5,useMemo as E5,useState as R$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var _J=j5.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=D5(),J=Y.columns||80,Z=e0()==="confirmation-prompt",X=S0(!1),K=$.fields??[],[U,G]=R$("field"),[q,L]=R$(0),[O,W]=R$(()=>qJ($)),[z,b]=R$(""),[N,A]=R$(0),[T,_]=R$([]),[f,P]=R$(),w=K[q],C=E5(()=>g5(w),[w]);h5(()=>{if(!w)return;let H=O[w.name];b(typeof H==="string"||typeof H==="number"?String(H):""),_(Array.isArray(H)?[...H]:[]);let k=C.findIndex((E)=>E.value===String(H));A(k>=0?k:0),P(void 0)},[O,w,C]);let B=R8((H)=>{if(W(H),q<K.length-1){L((k)=>k+1);return}G("review")},[q,K.length]),y=R8((H)=>{if(!w)return;let k={...O};if(H===void 0)delete k[w.name];else k[w.name]=H;B(k)},[O,w,B]),I=R8((H)=>{if(!w)return;try{y(OJ(w,H))}catch(k){P(k instanceof Error?k.message:String(k))}},[w,y]),R=R8(()=>{try{let H=zJ($,{action:"accept",content:O});Q({action:H.action,...H.content?{content:H.content}:{}})}catch(H){P(H instanceof Error?H.message:String(H))}},[O,$,Q]);if(v5((H,k)=>{if(k.ctrl&&H==="c"||k.meta&&H==="c"){X();return}if(k.escape){Q({action:"cancel"});return}if($.mode==="url"){if(H.toLowerCase()==="y")Q({action:"accept"},!0);else if(H.toLowerCase()==="n")Q({action:"decline"});return}if(U==="review"){if(H.toLowerCase()==="y"||k.return)R();else if(H.toLowerCase()==="e")L(0),G("field");else if(H.toLowerCase()==="d")Q({action:"decline"});return}if(!w){if(k.return)R();return}if(rQ(w))return;if(H.toLowerCase()==="d"){Q({action:"decline"});return}if(k.upArrow){A((E)=>E>0?E-1:Math.max(C.length-1,0));return}if(k.downArrow||k.tab){A((E)=>E<C.length-1?E+1:0);return}if(H===" "&&w.type==="multi-select"){let E=C[N];if(E)_((n)=>n.includes(E.value)?n.filter((d)=>d!==E.value):[...n,E.value]);return}if(k.return)if(w.type==="multi-select")y(T);else{let E=C[N];if(E)y(E.typedValue)}},{isActive:Z}),$.mode==="url")return W0(M8,{width:J,color:"yellow",children:[W0(D0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),W0(D0,{children:$.message},void 0,!1,void 0,this),W0(D0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),W0(D0,{children:["Domain: ",W0(D0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(D0,{wrap:"wrap",children:["URL: ",W0(D0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(D0,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(U==="review")return W0(M8,{width:J,color:"green",children:[W0(D0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),W0(D0,{children:$.message},void 0,!1,void 0,this),K.map((H)=>W0(D0,{children:[H.title,": ",p5(O[H.name])]},H.name,!0,void 0,this)),f&&W0(D0,{color:"red",children:f},void 0,!1,void 0,this),W0(D0,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!w)return W0(M8,{width:J,color:"cyan",children:[W0(D0,{children:$.message},void 0,!1,void 0,this),W0(D0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),W0(D0,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return W0(M8,{width:J,color:"cyan",children:[W0(D0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),W0(D0,{children:$.message},void 0,!1,void 0,this),W0(T8,{flexDirection:"column",marginTop:1,children:[W0(D0,{bold:!0,children:[w.title,w.required?" *":""]},void 0,!0,void 0,this),w.description&&W0(D0,{color:"gray",children:w.description},void 0,!1,void 0,this),W0(D0,{color:"gray",children:m5(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),rQ(w)?W0(T8,{children:[W0(D0,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0(V5,{value:z,onChange:b,onSubmit:I,focus:Z,placeholder:w.defaultValue===void 0?w.required?"Required":"Optional":String(w.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):W0(T8,{flexDirection:"column",children:C.map((H,k)=>{let E=w.type==="multi-select"&&T.includes(H.value);return W0(D0,{color:N===k?"yellow":void 0,children:[N===k?"> ":" ",w.type==="multi-select"?E?"(*) ":"( ) ":"",H.label]},H.value,!0,void 0,this)})},void 0,!1,void 0,this),f&&W0(D0,{color:"red",children:f},void 0,!1,void 0,this),W0(D0,{color:"gray",children:[rQ(w)?"Enter to continue":w.type==="multi-select"?"Space to toggle · Enter to continue":"Up/Down to select · Enter to continue"," · [D] Decline · Esc Cancel"]},void 0,!0,void 0,this),W0(D0,{color:"gray",children:["Field ",q+1," of ",K.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function M8({children:$,width:Q,color:Y}){return W0(T8,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function rQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function g5($){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 m5($){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 p5($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import k8 from"ansi-escapes";import{Box as Y$,Static as QX,useStdout as JX}from"ink";import YX,{useEffect as u1,useMemo as eQ,useRef as Z$,useState as $4}from"react";import{useStdout as c5}from"ink";import{debounce as x5}from"lodash-es";import{useEffect as u5,useState as l5}from"react";function NJ($=200){let{stdout:Q}=c5(),[Y,J]=l5(Q.rows||24);return u5(()=>{let Z=x5(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import M$ from"chalk";import d5 from"string-width";var N0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},I8="\x1B",aQ=`${I8}[2K`,C8=($)=>$>0?`${I8}[${$}A`:"",FJ=`${I8}[?25l`,WJ=`${I8}[?25h`;function HJ($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function LJ($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function BJ($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),K=[],U=a0.getTheme(),G=" ".repeat(N0.prefixIndent),q=M$.dim.hex(U.colors.border.light);if(Q>0)K.push(`${G}${M$.dim.hex(U.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let L=Y==="code",O=Y==="diff",W="",z=$;if(L&&$.length>0)W=$[0].match(/^```(\w+)?/)?.[1]||"",z=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")z=$.slice(1);let b=z.slice(-X);if(L&&Q===0){let A=W?` ${M$.hex(U.colors.text.secondary)(W)}`:"";K.push(`${G}${q("╭─")}${A}`)}for(let A=0;A<b.length;A++){let T=b[A],_=G;if(A===0&&!J&&N0.isFirstRender&&!L&&!O)_=M$.bold.hex(U.colors.success)("• ")+" ",N0.isFirstRender=!1;let f=L?4:0,P=N0.terminalWidth-N0.prefixIndent-2-f,w=T;if(d5(T)>P)w=T.slice(0,P);if(L)K.push(`${G}${q("│")} ${w}`);else if(O){let C=w;if(C.startsWith("+"))K.push(`${_}${M$.green(w)}`);else if(C.startsWith("-"))K.push(`${_}${M$.red(w)}`);else if(C.startsWith("@@"))K.push(`${_}${M$.dim(w)}`);else K.push(`${_}${w}`)}else K.push(`${_}${w}`);if(A===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let N=[];if(N.push(FJ),N0.renderedLineCount>0)N.push(C8(N0.renderedLineCount)),N.push("\r");for(let A=0;A<K.length;A++){let T=K[A],_=N0.lastRenderedLines[A];if(T!==_)N.push(aQ),N.push(T);if(A<K.length-1)N.push(`
153
- `)}if(K.length<N0.renderedLineCount){for(let T=K.length;T<N0.renderedLineCount;T++)N.push(`
154
- `),N.push(aQ);let A=N0.renderedLineCount-K.length;N.push(C8(A))}N.push(WJ),process.stdout.write(N.join("")),N0.renderedLineCount=K.length,N0.lastRenderedLines=K}function c1(){if(!N0.active)return;if(N0.renderedLineCount>0){let $=[];$.push(FJ),$.push(C8(N0.renderedLineCount)),$.push("\r");for(let Q=0;Q<N0.renderedLineCount;Q++)if($.push(aQ),Q<N0.renderedLineCount-1)$.push(`
155
- `);if(N0.renderedLineCount>1)$.push(C8(N0.renderedLineCount-1)),$.push("\r");$.push(WJ),process.stdout.write($.join(""))}N0.active=!1,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.isFirstRender=!0}function k1(){return N0.active}import{Box as r5,Text as wJ}from"ink";import a5 from"react";import{jsxDEV as oQ}from"react/jsx-dev-runtime";var iQ=a5.memo(({collapsedCount:$})=>{let Q=b0();if($<=0)return null;let Y=Q.colors.text.muted;return oQ(r5,{flexDirection:"row",marginBottom:1,children:[oQ(wJ,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),oQ(wJ,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});iQ.displayName="CollapsedHistorySummary";import{Box as P2,Text as y2}from"ink";import o5 from"ink-big-text";import i5 from"ink-gradient";import n5 from"react";import{jsxDEV as W1}from"react/jsx-dev-runtime";var AJ=n5.memo(()=>{return W1(P2,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[W1(P2,{flexDirection:"column",children:W1(i5,{name:"pastel",children:W1(o5,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),W1(P2,{marginBottom:1,children:W1(y2,{color:"white",dimColor:!0,children:bJ()},void 0,!1,void 0,this)},void 0,!1,void 0,this),W1(P2,{flexDirection:"column",marginBottom:1,children:[W1(P2,{marginBottom:1,children:W1(y2,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W1(y2,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),W1(y2,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),W1(y2,{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 f8,Text as nQ}from"ink";import PJ from"react";import{jsxDEV as J$}from"react/jsx-dev-runtime";var yJ=PJ.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 J$(f8,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[J$(f8,{marginBottom:Y?0:1,children:[J$(nQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),J$(nQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J$(f8,{flexDirection:"column",children:$.map((X,K)=>J$(t5,{task:X,compact:Y},X.id||K,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),t5=PJ.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 J$(f8,{paddingY:Q?0:0,children:J$(nQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as tQ,Text as s$}from"ink";import s5,{useMemo as RJ}from"react";import{jsxDEV as x1}from"react/jsx-dev-runtime";function e5($,Q=60){if(!$)return"";let Y=$.split(`
156
- `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function $X($){if(!$)return 0;return $.split(`
157
- `).length}var sQ=s5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=b0(),Z=RJ(()=>$X($),[$]),X=RJ(()=>e5($),[$]),K=J.colors.info,U=J.colors.muted;return x1(tQ,{flexDirection:"column",marginBottom:1,children:[x1(tQ,{flexDirection:"row",children:[x1(s$,{color:K,children:Y?"v":">"},void 0,!1,void 0,this),x1(s$,{children:" "},void 0,!1,void 0,this),x1(s$,{color:U,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&x1(s$,{color:U,children:[" - ",X]},void 0,!0,void 0,this),x1(s$,{color:U,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&x1(tQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:x1(s$,{color:U,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});sQ.displayName="ThinkingBlock";import{jsxDEV as i0}from"react/jsx-dev-runtime";var TJ=YX.memo(()=>{let $=B4(),Q=d4(),Y=r4(),J=a4(),Z=E$(),X=S4(),K=h4(),U=g2(),G=u4(),q=l4(),L=w4(),O=i4(),W=o4(),z=$$(),b=NJ(),{stdout:N}=JX(),A=i1(),[T,_]=$4(null),[f,P]=$4([]),[w,C]=$4(new Set),B=Z$(W),y=Z$(null),I=Z$(0),R=Z$(0),H=Z$(new Set),k=Z$(new Set),E=Z$([]),n=Z$(null);u1(()=>{if(B.current!==W){if(k1())c1();if(N)N.write(k8.clearTerminal);A.incrementClearCount(),B.current=W}},[W,N,A]);let d=$,a=J;u1(()=>{if(!J||Z){n.current=null;return}if(n.current===J)return;if(n.current=J,k1())c1();if(N)N.write(k8.eraseScreen+k8.cursorTo(0,0));H.current=new Set,k.current=new Set(d.filter((v)=>v.role==="tool").map((v)=>v.id)),y.current=null,I.current=0,R.current=0,E.current=[],P([]),C(new Set),A.incrementClearCount(),A.clearFinalizingStreamingMessageId()},[J,Z,N,A,d]);let l=Q??J;u1(()=>{if(k1())c1();y.current=null,I.current=0,R.current=0,H.current=new Set,k.current=new Set(d.filter((v)=>v.role==="tool").map((v)=>v.id)),E.current=[],P([]),C(new Set)},[L]),u1(()=>{if(!l)return;if(y.current===l)return;y.current=l,I.current=0,R.current=0,k.current=new Set(d.filter((v)=>v.role==="tool").map((v)=>v.id)),E.current=[],P([])},[l,d]),u1(()=>{if(!l)return;let v=Q4(l);if(!v||v.length<=I.current)return;let h=v.slice(I.current);I.current=v.length;let m=h,Q0=E.current;if(Q0.length>0)if(m.some((m0)=>m0.type!=="empty"))m=[...Q0,...m],E.current=[];else{E.current=[...Q0,...m];return}let o=m.length;while(o>0&&m[o-1].type==="empty")o-=1;if(o!==m.length)E.current=m.slice(o),m=m.slice(0,o);if(m.length===0)return;let F0=R.current;R.current+=1;let y0=F0>0;if(k1())c1();C((m0)=>{if(!l||m0.has(l))return m0;let E0=new Set(m0);return E0.add(l),E0}),P((m0)=>[...m0,i0(Y$,{flexDirection:"column",children:i0(I1,{content:"",role:"assistant",terminalWidth:z,isPending:!1,hidePrefix:y0,noMargin:!0,blocksOverride:m,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${l}-${F0}`,!1,void 0,this)])},[l,Y.version,z,L]),u1(()=>{if(!l)return;let v=k.current,h=d.filter((m)=>m.role==="tool"&&!v.has(m.id)&&!H.current.has(m.id));if(h.length===0)return;if(k1())c1();for(let m of h)H.current.add(m.id);P((m)=>[...m,...h.map((Q0)=>i0(Y$,{flexDirection:"column",children:i0(I1,{content:Q0.content,role:Q0.role,terminalWidth:z,metadata:Q0.metadata,isPending:!1,messageId:Q0.id},void 0,!1,void 0,this)},`streaming-tool-${Q0.id}`,!1,void 0,this))])},[l,d,z]),u1(()=>{if(!l){if(k1())c1();return}if(!k1())HJ(z,b);else LJ(z,b);let v=MJ(l);if(!v||v.lines.length===0)return;let m=Math.max(1,b-8),Q0=Math.max(0,v.lines.length-m),o=v.lines.slice(-m),F0=(Q4(l)?.length??0)>0;BJ(o,Q0,v.mode,F0)},[l,Y.version,b,z]),u1(()=>{if(!l&&k1())c1()},[l]),u1(()=>{if(T===null&&d.length>O){if(_(d.length),k1())c1();if(N)N.write(k8.clearTerminal);A.incrementClearCount()}},[d.length,O,T,N,A]);let p=eQ(()=>{return X.some((v)=>v.status==="pending"||v.status==="in_progress")},[X]),M=W?0:T??0,F=M,S=eQ(()=>{let v=[];if(v.push(i0(AJ,{},"header",!1,void 0,this)),F>0)v.push(i0(iQ,{collapsedCount:F},"collapsed-summary",!1,void 0,this));for(let h=M;h<d.length;h++){let m=d[h];if(a&&m.id===a)continue;if(m.role==="tool"&&H.current.has(m.id))continue;if(m.role==="assistant"&&w.has(m.id))continue;v.push(i0(Y$,{flexDirection:"column",children:i0(I1,{content:m.content,role:m.role,terminalWidth:z,metadata:m.metadata,isPending:!1,messageId:m.id},void 0,!1,void 0,this)},m.id,!1,void 0,this))}return v},[d,M,F,z,a,w]),D=eQ(()=>f.length>0?[...S,...f]:S,[S,f]);return i0(Y$,{flexDirection:"column",paddingX:2,children:i0(Y$,{flexDirection:"column",children:[i0(QX,{items:D,children:(v)=>v},L,!1,void 0,this),G&&i0(Y$,{marginBottom:1,children:i0(sQ,{content:G,isStreaming:Z,isExpanded:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&p&&i0(Y$,{marginTop:1,children:i0(yJ,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.map((v,h)=>i0(Y$,{flexDirection:"column",children:i0(I1,{content:v.displayText,role:"user",terminalWidth:z},void 0,!1,void 0,this)},`pending-${h}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as S8,useMount as ZX}from"ahooks";import{Box as H1,Text as H0,useFocus as XX,useFocusManager as KX,useInput as GX}from"ink";import UX from"ink-select-input";import{memo as qX,useMemo as OX,useState as v8}from"react";import{jsxDEV as Y0,Fragment as NX}from"react/jsx-dev-runtime";var zX=({isSelected:$})=>Y0(H1,{marginRight:1,children:Y0(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),_X=({isSelected:$,label:Q})=>Y0(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),CJ=qX(({onClose:$,onEdit:Q})=>{let Y=E4(),J=E2()??"",{isFocused:Z}=XX({id:"model-selector"}),X=KX(),[K,U]=v8(""),[G,q]=v8(!1),[L,O]=v8(null),W=S0(!1),[z]=v8(()=>{let B=process.stdout?.columns||80;return Math.max(20,B-8)});ZX(()=>{if(X?.focus("model-selector"),Y.length>0)U(Y[0].id)}),GX((B,y)=>{if(G)return;if(y.ctrl&&B==="c"||y.meta&&B==="c"){W();return}if(y.escape){$();return}if(!Z)return;if(B==="d"||B==="D"){N();return}if((B==="e"||B==="E")&&Q)A()},{isActive:!0});let b=S8(async(B)=>{if(G)return;let y=B.value;if(y===J){$();return}q(!0),O(null);try{await p0().setCurrentModel(y),$()}catch(I){O(I.message),q(!1)}}),N=S8(async()=>{if(G||K===J)return;q(!0),O(null);try{if(await p0().removeModel(K),Y.length<=1)$()}catch(B){O(B.message)}finally{q(!1)}}),A=S8(()=>{if(G||!Q)return;let B=Y.find((y)=>y.id===K);if(!B)return;Q(B)}),T=S8((B)=>{U(B.value)}),_=OX(()=>{return Y.find((B)=>B.id===K)},[Y,K]),f=_?D8()?.modelProviders[_.provider]:void 0,P=Y.map((B)=>{let y=B.id===J?" (当前)":"";return{label:J4(B)+y,value:B.id}}),w=K===J;return Y0(H1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[Y0(H1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[Y0(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),Y0(H0,{dimColor:!0,children:[G?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y0(H1,{flexDirection:"row",children:[Y0(H1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[Y0(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),Y0(H1,{marginTop:1,children:Y0(UX,{items:P,onSelect:b,onHighlight:T,indicatorComponent:zX,itemComponent:_X},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(H1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[Y0(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),Y0(H1,{marginY:1,children:Y0(H0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_?Y0(H1,{flexDirection:"column",children:[Y0(H0,{children:[Y0(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),Y0(H0,{bold:!0,color:"cyan",children:J4(_)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(H0,{children:[Y0(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),Y0(H0,{bold:!0,children:f?.name??_.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f&&Y0(NX,{children:[Y0(H0,{children:[Y0(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),Y0(H0,{children:_.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(H0,{children:[Y0(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),Y0(H0,{children:f.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(H0,{children:[Y0(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),Y0(H0,{color:"blueBright",children:f.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y0(H0,{children:[Y0(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),Y0(H0,{bold:!0,children:_.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.overrides?.baseUrl&&Y0(H0,{children:[Y0(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),Y0(H0,{color:"blueBright",children:_.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(H0,{children:[Y0(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),Y0(H0,{children:h1().resolveConfig(_).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):Y0(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L&&Y0(H1,{marginTop:1,children:Y0(H0,{color:"red",children:L},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(H1,{justifyContent:"center",marginTop:1,children:Y0(H0,{dimColor:!0,children:"─".repeat(z)},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(H1,{justifyContent:"center",children:Y0(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 Y4}from"ahooks";import{Box as VX,Text as Z4,useInput as jX}from"ink";import{useState as I$}from"react";import{Box as T$,Text as l1,useInput as FX}from"ink";import WX from"ink-text-input";import{jsxDEV as n0}from"react/jsx-dev-runtime";var IJ=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return FX((K,U)=>{if(U.escape)Z()}),n0(T$,{flexDirection:"column",children:[n0(T$,{marginBottom:1,children:n0(l1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(T$,{marginBottom:1,children:n0(l1,{children:["Provider: ",n0(l1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),n0(T$,{marginBottom:1,children:n0(l1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(T$,{children:[n0(l1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),n0(WX,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&n0(T$,{marginTop:1,children:n0(l1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(T$,{marginTop:1,children:n0(l1,{dimColor:!0,children:["输入完成后按 ",n0(l1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",n0(l1,{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 V8,Text as X$,useInput as HX}from"ink";import LX from"ink-text-input";import{useState as j8}from"react";import{jsxDEV as z1}from"react/jsx-dev-runtime";var h8=["id","name","baseUrl","model"];function fJ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function BX($,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 wX($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=SJ(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 vJ=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,K]=j8(Q?3:0),[U,G]=j8(Q?.model??""),[q,L]=j8(Z),[O,W]=j8(),z=h8[X];HX((N,A)=>{if(!A.escape)return;if(W(void 0),X===0){J();return}let T=X-1,_=h8[T];K(T),G(q[_])});let b=(N)=>{let A=N.trim();if(z==="id"&&!kJ.test(A)){W("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(z==="baseUrl")try{let _=new URL(A);if(!["http:","https:"].includes(_.protocol))throw Error()}catch{W("Base URL 必须是绝对 HTTP(S) URL");return}if(z==="model"&&!A){W("Model ID 不能为空");return}let T={...q,[z]:z==="name"&&!A?q.id:A};if(L(T),W(void 0),X===h8.length-1){try{Y(wX(T,$))}catch(_){W(_ instanceof Error?_.message:"渠道配置无效")}return}K(X+1),G("")};return z1(V8,{flexDirection:"column",children:[z1(V8,{marginBottom:1,children:z1(X$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z1(X$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),h8.slice(0,X).map((N)=>z1(X$,{children:[fJ(N),": ",z1(X$,{color:"cyan",children:q[N]},void 0,!1,void 0,this)]},N,!0,void 0,this)),z1(V8,{marginTop:1,children:[z1(X$,{bold:!0,children:[fJ(z),": "]},void 0,!0,void 0,this),z1(LX,{value:U,onChange:(N)=>{G(N),W(void 0)},onSubmit:b,placeholder:BX(z,$,q.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z==="name"&&z1(X$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&z1(X$,{color:"red",children:O},void 0,!1,void 0,this),z1(V8,{marginTop:1,children:z1(X$,{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 jJ,useState as e$}from"react";var hJ=()=>{let[$,Q]=e$([]),[Y,J]=e$(!0),[Z,X]=e$(null);return jJ(()=>{(async()=>{try{Q(await DJ())}catch(U){X(U instanceof Error?U.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},EJ=($)=>{let[Q,Y]=e$([]),[J,Z]=e$(!1),[X,K]=e$(null);return jJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),K(null);try{Y(await VJ($))}catch(G){K(G instanceof Error?G.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as d1,Text as P1,useInput as bX}from"ink";import AX from"ink-select-input";import PX from"ink-text-input";import{useMemo as gJ,useState as yX}from"react";import{jsxDEV as g0,Fragment as CX}from"react/jsx-dev-runtime";var RX=({isSelected:$})=>g0(d1,{marginRight:1,children:g0(P1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),MX=($)=>{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(" ")},TX=({isSelected:$,label:Q})=>g0(P1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),mJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[K,U]=yX("");bX((L,O)=>{if(O.escape)if(K)U("");else X()});let G=gJ(()=>{if(!K)return Q;let L=K.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(L)||O.id.toLowerCase().includes(L))},[Q,K]),q=gJ(()=>G.map((L)=>({key:L.id,label:MX(L),value:L})),[G]);if(Y)return g0(d1,{flexDirection:"column",children:g0(P1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return g0(d1,{flexDirection:"column",children:[g0(P1,{color:"red",children:J},void 0,!1,void 0,this),g0(P1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return g0(d1,{flexDirection:"column",children:[g0(d1,{marginBottom:1,children:g0(P1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g0(d1,{marginBottom:1,children:g0(P1,{children:["Provider: ",g0(P1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),g0(CX,{children:[g0(d1,{marginBottom:1,children:[g0(P1,{color:"cyan",children:"> "},void 0,!1,void 0,this),g0(PX,{value:K,onChange:U,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g0(d1,{marginBottom:1,children:g0(P1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g0(d1,{flexDirection:"column",height:12,children:g0(AX,{items:q,onSelect:(L)=>Z(L.value),indicatorComponent:RX,itemComponent:TX,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&g0(P1,{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 C$,Text as K$,useInput as IX}from"ink";import fX from"ink-select-input";import kX from"ink-text-input";import{useMemo as pJ,useState as SX}from"react";import{jsxDEV as t0}from"react/jsx-dev-runtime";var vX=({isSelected:$})=>t0(C$,{marginRight:1,children:t0(K$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),DX=({isSelected:$,label:Q})=>t0(K$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),cJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,K]=SX("");IX((q,L)=>{if(L.escape)if(X)K("");else Z()});let U=pJ(()=>{if(!X)return $;let q=X.toLowerCase();return $.filter((L)=>L.name.toLowerCase().includes(q)||L.id.toLowerCase().includes(q))},[$,X]),G=pJ(()=>U.map((q)=>({key:q.id,label:`${q.name} - ${q.modelCount} models${q.configured?" [configured]":""}`,value:q})),[U]);if(Q)return t0(C$,{flexDirection:"column",children:t0(K$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return t0(C$,{flexDirection:"column",children:[t0(K$,{color:"red",children:Y},void 0,!1,void 0,this),t0(K$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return t0(C$,{flexDirection:"column",children:[t0(C$,{marginBottom:1,children:t0(K$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t0(C$,{marginBottom:1,children:[t0(K$,{color:"cyan",children:"> "},void 0,!1,void 0,this),t0(kX,{value:X,onChange:K,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t0(C$,{flexDirection:"column",height:12,children:t0(fX,{items:G,onSelect:(q)=>J(q.value),indicatorComponent:vX,itemComponent:DX,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.length===0&&t0(K$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function xJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as G$}from"react/jsx-dev-runtime";var X4=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,K]=I$("provider"),[U,G]=I$(),[q,L]=I$(),[O,W]=I$(),[z,b]=I$(""),[N,A]=I$(),[T,_]=I$(!1),f=hJ(),P=EJ(U?.id),w=S0(!1);jX((I,R)=>{if(R.ctrl&&I==="c"||R.meta&&I==="c")$==="setup"?w():Z()});let C=Y4(async(I)=>{if(!U)return;let R=O??(q?{provider:U.id,model:q.id,displayName:Q?.displayName}:void 0);if(!R)return;_(!0),A(void 0);try{if(R.modelProvider)h1().registerModelProvider(R.provider,R.modelProvider,[R.model]);if(I?.trim())await h1().setApiKey(R.provider,I.trim());let H={displayName:R.displayName,provider:R.provider,model:R.model,overrides:R.overrides};if($==="setup")await J(R);else if($==="add"){let k=R.modelProvider?await p0().addModelWithProvider(H,R.modelProvider):await p0().addModel(H);await p0().setCurrentModel(k.id),await J(R)}else if(Y){if(R.modelProvider)await p0().updateModelWithProvider(Y,H,R.modelProvider);else await p0().updateModel(Y,H);await J(R)}}catch(H){if(R.modelProvider){await h1().credentials.delete(R.provider);let k=D8();h1().configureModelProviders(k?.modelProviders??{},k?.models??[])}A(H instanceof Error?H.message:"保存配置失败"),_(!1)}}),B=Y4((I)=>{if(L(I),U?.configured)C();else if(U?.supportsApiKey)K("credential");else A(`${U?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),y=Y4(()=>{if(A(void 0),X==="credential"&&O){K("custom");return}let I=xJ(X);if(I)K(I)});return G$(VX,{flexDirection:"column",padding:1,children:[G$(Z4,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&G$(cJ,{...f,onSelect:(I)=>{G(I),L(void 0),W(void 0),K(I.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&U?.factoryWireApi&&G$(vJ,{wireApi:U.factoryWireApi,initialConfig:O,onSubmit:(I)=>{W(I),K("credential")},onCancel:y},void 0,!1,void 0,this),X==="model"&&U&&G$(mJ,{provider:U,...P,onSelect:B,onCancel:y},void 0,!1,void 0,this),X==="credential"&&U&&G$(IJ,{provider:U,value:z,onChange:b,onSubmit:()=>void C(z),onCancel:y,error:N},void 0,!1,void 0,this),T&&G$(Z4,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),N&&X!=="credential"&&G$(Z4,{color:"red",children:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as R2}from"ahooks";import{promises as rJ}from"fs";import{Box as _1,Text as j0,useInput as hX}from"ink";import uJ from"ink-select-input";import EX from"ink-text-input";import gX from"os";import E8 from"path";import{useEffect as mX,useMemo as g8,useRef as pX,useState as U$}from"react";import{jsxDEV as q0}from"react/jsx-dev-runtime";var M2=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],cX={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},xX={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},lJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},uX=["project","global","local"],lX={allow:[],ask:[],deny:[]},dX={localExists:!1,projectExists:!1,globalExists:!1},dJ={allow:[],ask:[],deny:[]};function rX($){let Q=(J)=>Array.isArray(J)?J.filter((Z)=>typeof Z==="string"):[],Y=$?.permissions??{};return{allow:Q(Y?.allow),ask:Q(Y?.ask),deny:Q(Y?.deny)}}async function aX($){try{let Q=await rJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:rX(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...dJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...dJ}}}}function oX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${lJ[Q]} <- 可删除`:lJ[Q];return`${Y} ${J}`}var aJ=({onClose:$})=>{let Y=e0()==="permissions-manager",J=S0(!1),[Z,X]=U$(0),K=M2[Z].key,[U,G]=U$(lX),[q,L]=U$(dX),[O,W]=U$(!0),[z,b]=U$("list"),[N,A]=U$(""),[T,_]=U$(null),[f,P]=U$(null),w=pX(!1),C=g8(()=>E8.join(d0(),".blade","settings.local.json"),[]),B=g8(()=>E8.join(d0(),".blade","settings.json"),[]),y=g8(()=>E8.join(gX.homedir(),".blade","settings.json"),[]),I=R2(async()=>{W(!0);let v=await Promise.all([{source:"local",path:C},{source:"project",path:B},{source:"global",path:y}].map(async({source:o,path:F0})=>{let y0=await aX(F0);return{source:o,path:F0,...y0}})),h={localExists:v.find((o)=>o.source==="local")?.exists??!1,projectExists:v.find((o)=>o.source==="project")?.exists??!1,globalExists:v.find((o)=>o.source==="global")?.exists??!1};L(h);let m={allow:[],ask:[],deny:[]},Q0=Object.fromEntries(v.map((o)=>[o.source,o]));["allow","ask","deny"].forEach((o)=>{uX.forEach((F0)=>{(Q0[F0]?.permissions[o]??[]).forEach((m0,E0)=>{let F$={key:`${F0}:${E0}:${m0}`,rule:m0,source:F0};m[o].push(F$)})})}),G(m),W(!1)});mX(()=>{I()},[I]);let R=R2(async(D,v)=>{try{let h=E8.join(d0(),".blade","settings.local.json"),m={allow:[],ask:[],deny:[]};try{let o=await rJ.readFile(h,"utf-8"),y0=JSON.parse(o).permissions||{};m={allow:Array.isArray(y0.allow)?y0.allow:[],ask:Array.isArray(y0.ask)?y0.ask:[],deny:Array.isArray(y0.deny)?y0.deny:[]}}catch(o){}let Q0=v(m);await p0().updateConfig({permissions:Q0},{scope:"local",immediate:!0}),await I()}catch(h){throw console.error("[PermissionsManager] 修改权限规则失败:",h),h}});hX((D,v)=>{if(v.ctrl&&D==="c"||v.meta&&D==="c"){J();return}if(z==="locked"){if(w.current){w.current=!1;return}b("list"),_(null),P(null);return}if(v.escape){if(z==="list"||K==="info")$();else b("list"),A(""),_(null),P(null);return}if(z==="list"){if(v.tab&&v.shift)X((h)=>(h-1+M2.length)%M2.length);else if(v.tab)X((h)=>(h+1)%M2.length);else if(D?.toLowerCase()==="q")$()}},{isActive:Y});let H=R2((D)=>{let v=D.value;if(K==="info")return;if(v.type==="add"){b("add"),A(""),P(null);return}if(v.entry.source!=="local"){b("locked"),w.current=!0,_({tab:K,entry:v.entry}),P({type:"error",text:v.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}b("confirm-delete"),_({tab:K,entry:v.entry}),P(null)}),k=R2(async()=>{if(K==="info")return;let D=N.trim();if(!D){P({type:"error",text:"Permission rule 不能为空"});return}if(U[K].map((h)=>h.rule).includes(D)){P({type:"error",text:"该规则已存在"});return}try{await R(K,(h)=>{let m={allow:[...h.allow],ask:[...h.ask],deny:[...h.deny]};return m[K]=[...new Set([...h[K],D])],m}),b("list"),A(""),P({type:"success",text:"已添加本地权限规则"})}catch(h){P({type:"error",text:`保存失败: ${h instanceof Error?h.message:"未知错误"}`})}}),E=R2(async()=>{if(!T)return;let{tab:D,entry:v}=T;try{await R(D,(h)=>{let m={allow:[...h.allow],ask:[...h.ask],deny:[...h.deny]};return m[D]=h[D].filter((Q0)=>Q0!==v.rule),m}),b("list"),_(null),P({type:"success",text:"已删除本地权限规则"})}catch(h){P({type:"error",text:`删除失败: ${h instanceof Error?h.message:"未知错误"}`})}}),n=g8(()=>{if(K==="info")return[];let D=K;return[{key:"add-new-rule",label:`› ${cX[D]}`,value:{type:"add"}},...U[D].map((h)=>({key:h.key,label:oX(h.rule,h.source),value:{type:"rule",entry:h}}))]},[K,U]),d=()=>q0(_1,{marginBottom:1,children:M2.map((D,v)=>q0(_1,{marginRight:2,children:q0(j0,{color:v===Z?"yellow":"gray",children:["[",D.label,"]"]},void 0,!0,void 0,this)},D.key,!1,void 0,this))},void 0,!1,void 0,this),a=()=>q0(_1,{flexDirection:"column",gap:1,children:[q0(j0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),q0(_1,{flexDirection:"column",marginLeft:2,children:[q0(j0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",q.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),q0(j0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",q.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),q0(j0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",q.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q0(j0,{children:"说明:"},void 0,!1,void 0,this),q0(_1,{flexDirection:"column",marginLeft:2,children:[q0(j0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),q0(j0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),q0(j0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l=(D)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(j0,{bold:!0,children:xX[D]},void 0,!1,void 0,this),q0(j0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),q0(j0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),q0(_1,{marginTop:1,children:q0(EX,{value:N,onChange:A,onSubmit:k},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(j0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p=(D,v)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(j0,{bold:!0,children:["Delete ",D," permission rule?"]},void 0,!0,void 0,this),q0(j0,{children:v.rule},void 0,!1,void 0,this),q0(j0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),q0(j0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),q0(uJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(h)=>{if(h.value==="yes")E();else b("list"),_(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M=(D)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(j0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),q0(j0,{children:D.rule},void 0,!1,void 0,this),q0(j0,{color:"gray",children:D.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),q0(j0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F=(D)=>q0(uJ,{items:n,isFocused:z==="list",onSelect:H},void 0,!1,void 0,this),S=()=>{if(O)return q0(j0,{children:"加载中..."},void 0,!1,void 0,this);if(K==="info")return a();if(z==="add")return l(K);if(z==="confirm-delete"&&T)return p(T.tab,T.entry);if(z==="locked"&&T)return M(T.entry);return F(K)};return q0(_1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[q0(j0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),d(),q0(_1,{flexDirection:"column",gap:1,children:S()},void 0,!1,void 0,this),f&&q0(_1,{marginTop:1,children:q0(j0,{color:f.type==="success"?"green":"red",children:f.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(_1,{marginTop:1,children:q0(j0,{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 K0,useInput as iX}from"ink";import{useEffect as nX,useState as f$}from"react";import{jsxDEV as x}from"react/jsx-dev-runtime";var K4=["local","project","global"];function $Y({workspaceRoot:$,onCancel:Q}){let Y=iJ($),J=Y.getAll(),[Z,X]=f$(0),[K,U]=f$(!1),[G,q]=f$(""),[L,O]=f$(null),[W,z]=f$("local"),[b,N]=f$(null),[A,T]=f$(0),_=Y.getBySource(),f=Y.getStats(),P=Y.getSourcePolicy(),w=S0(!1,Q);nX(()=>{let H=!0;return oJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((k)=>{if(H)N(k.settings)}).catch((k)=>{if(H)q(k instanceof Error?k.message:"无法读取插件作用域配置")}),()=>{H=!1}},[Y,A]);let C=()=>{z((H)=>{let k=K4.indexOf(H);return K4[(k+1)%K4.length]}),O(null)},B=async()=>{let H=J[Z];if(!H||K)return;if(H.source==="cli"){q(`${H.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(H.status==="error"){q(H.error??`${H.manifest.name} 当前不可用`);return}U(!0),q("");try{let k=await nJ(Y.getWorkspaceRoot(),H.manifest.name,H.status!=="active",W);q(k.effectiveEnabled?`已启用 ${H.manifest.name} · 生效层级 ${k.effectiveScope}`:`已禁用 ${H.manifest.name} · 生效层级 ${k.effectiveScope}`),T((E)=>E+1)}catch(k){q(k instanceof Error?k.message:String(k))}finally{U(!1)}},y=async()=>{if(K)return;U(!0),q("");try{await tJ(Y.getWorkspaceRoot()),X(0),q("插件列表已刷新"),T((H)=>H+1)}catch(H){q(H instanceof Error?H.message:String(H))}finally{U(!1)}},I=async()=>{let H=J[Z];if(!H||K)return;if(!H.installation){q(`${H.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}U(!0),O(null),q("");try{let{result:k}=await sJ(Y.getWorkspaceRoot(),H.manifest.name,{trusted:!0});if(!k.success)throw Error(k.error);q(k.changed?`已更新 ${H.manifest.name} 到 ${k.installation?.revision}`:`${H.manifest.name} 已是最新版本`),T((E)=>E+1)}catch(k){q(k instanceof Error?k.message:String(k))}finally{U(!1)}},R=async()=>{let H=J[Z];if(!H||K)return;if(!H.installation){q(`${H.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(L!==H.manifest.name){O(H.manifest.name),q(`再次按 x 确认卸载 ${H.manifest.name}`);return}U(!0),q("");try{let{result:k}=await eJ(Y.getWorkspaceRoot(),H.manifest.name,!0);if(!k.success)throw Error(k.error);O(null),X(0),q(`已卸载 ${H.manifest.name}`),T((E)=>E+1)}catch(k){q(k instanceof Error?k.message:String(k))}finally{U(!1)}};if(iX((H,k)=>{if(k.escape)Q?.();else if(k.ctrl&&H==="c"||k.meta&&H==="c")w();else if((k.upArrow||H==="k")&&J.length>0)O(null),X((E)=>(E-1+J.length)%J.length);else if((k.downArrow||H==="j")&&J.length>0)O(null),X((E)=>(E+1)%J.length);else if(H===" "||k.return)B();else if(H==="r")y();else if(H==="s")C();else if(H==="u")I();else if(H==="x")R()}),J.length===0)return x(P0,{flexDirection:"column",paddingY:1,children:[x(P0,{marginBottom:1,children:x(K0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{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(K0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),x(K0,{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(K0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{marginTop:1,children:x(K0,{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(K0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),x(K0,{color:"gray",children:[" (共 ",f.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,marginBottom:1,children:x(K0,{color:"gray",children:["启用: ",f.active," | 禁用: ",f.inactive," | 命令: ",f.commands," | 技能:"," ",f.skills," | 代理: ",f.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,marginBottom:1,children:x(K0,{color:"gray",children:["来源策略: ",P.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",P.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,marginBottom:1,children:x(K0,{color:"gray",children:["写入层级: ",x(K0,{color:"cyan",children:W},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_.cli.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(K0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),x(K0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.cli.map((H)=>{let k=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(K0,{children:[x(K0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",k," ",H.manifest.name]},void 0,!0,void 0,this),x(K0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&x(P0,{paddingLeft:2,children:x(K0,{color:"blue",children:["命令:"," ",H.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),_.project.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(K0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),x(K0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.project.map((H)=>{let k=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(K0,{children:[x(K0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",k," ",H.manifest.name]},void 0,!0,void 0,this),x(K0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",dimColor:!0,children:["生效层级:"," ",b?.[H.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&x(P0,{paddingLeft:2,children:x(K0,{color:"blue",children:["命令:"," ",H.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),_.user.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(K0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),x(K0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.user.map((H)=>{let k=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(K0,{children:[x(K0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",k," ",H.manifest.name]},void 0,!0,void 0,this),x(K0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",dimColor:!0,children:["生效层级:"," ",b?.[H.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&x(P0,{paddingLeft:2,children:x(K0,{color:"blue",children:["命令:"," ",H.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),x(P0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(K0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),x(K0,{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(K0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&x(P0,{marginTop:1,children:x(K0,{color:G.includes("失败")?"red":"cyan",children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&x(K0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as Q1,Text as J1,useInput as QY,useStdout as tX}from"ink";import sX from"ink-text-input";import G4,{useCallback as T2,useMemo as eX,useState as q$}from"react";import{jsxDEV as L0}from"react/jsx-dev-runtime";var $7=G4.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>L0(Q1,{flexDirection:"column",marginBottom:1,children:[L0(J1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),L0(Q1,{marginLeft:4,children:L0(J1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),Q7=G4.memo(({questions:$,answers:Q})=>L0(Q1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return L0(Q1,{marginBottom:1,children:[L0(J1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),L0(J1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),JY=G4.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=tX(),Z=J.columns||80,K=e0()==="confirmation-prompt",U=S0(!1),[G,q]=q$("answering"),[L,O]=q$(0),[W,z]=q$({}),[b,N]=q$(0),[A,T]=q$([]),[_,f]=q$(!1),[P,w]=q$(""),[C,B]=q$(0),y=$[L],I=eX(()=>{if(!y)return[];return[...y.options.map((d)=>({label:d.label,value:d.label,description:d.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[y]),R=T2((d)=>{let a={...W,[y.header]:d};if(z(a),L<$.length-1)O(L+1),N(0),T([]),f(!1),w("");else q("submit"),B(0)},[W,y?.header,L,$.length]),H=T2((d)=>{let a=I[d];if(!a)return;if(a.value==="__other__"){f(!0);return}if(y.multiSelect)T((l)=>l.includes(a.value)?l.filter((p)=>p!==a.value):[...l,a.value]);else R(a.value)},[I,y?.multiSelect,R]),k=T2((d)=>{if(d.trim())R(d.trim())},[R]),E=T2(()=>{q("answering"),O(0),N(0),T([]),f(!1)},[]),n=T2(()=>{Q(W)},[W,Q]);if(QY((d,a)=>{if(a.ctrl&&d==="c"||a.meta&&d==="c"){U();return}if(_){if(a.escape)f(!1),w("");return}if(a.escape){Y();return}let l=parseInt(d);if(l>=1&&l<=I.length){H(l-1);return}if(a.upArrow){N((p)=>p>0?p-1:I.length-1);return}if(a.downArrow||a.tab){N((p)=>p<I.length-1?p+1:0);return}if(a.return){if(y.multiSelect&&A.length>0)R(A);else H(b);return}if(d===" "&&y.multiSelect){let p=I[b];if(p&&p.value!=="__other__")T((M)=>M.includes(p.value)?M.filter((F)=>F!==p.value):[...M,p.value]);return}},{isActive:K&&G==="answering"&&!_}),QY((d,a)=>{if(a.ctrl&&d==="c"||a.meta&&d==="c"){U();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){B((l)=>l===0?1:0);return}if(a.return){if(C===0)n();else E();return}if(d.toLowerCase()==="y"){n();return}if(d.toLowerCase()==="e"){E();return}},{isActive:K&&G==="submit"}),G==="submit")return L0(Q1,{flexDirection:"column",borderStyle:"round",borderColor:K?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[L0(Q1,{marginBottom:1,children:L0(J1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(Q7,{questions:$,answers:W},void 0,!1,void 0,this),L0(Q1,{flexDirection:"column",marginTop:1,children:[L0(J1,{color:C===0?"yellow":void 0,bold:C===0,children:[C===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),L0(J1,{color:C===1?"yellow":void 0,bold:C===1,children:[C===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L0(Q1,{marginTop:1,children:L0(J1,{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(!y)return null;return L0(Q1,{flexDirection:"column",borderStyle:"round",borderColor:K?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[L0(Q1,{marginBottom:1,children:[L0(J1,{backgroundColor:"blue",color:"white",children:[" ",y.header," "]},void 0,!0,void 0,this),L0(J1,{children:[" ",y.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_?L0(Q1,{flexDirection:"column",marginTop:1,children:[L0(J1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),L0(Q1,{marginTop:1,children:[L0(J1,{color:"cyan",children:"> "},void 0,!1,void 0,this),L0(sX,{value:P,onChange:w,onSubmit:k,focus:K},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(Q1,{marginTop:1,children:L0(J1,{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):L0(Q1,{flexDirection:"column",children:I.map((d,a)=>L0($7,{option:d,index:a,isSelected:A.includes(d.value),isMultiSelect:y.multiSelect,isHighlighted:b===a},d.value,!1,void 0,this))},void 0,!1,void 0,this),!_&&L0(Q1,{marginTop:1,flexDirection:"column",children:[L0(J1,{color:"gray",children:y.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),y.multiSelect&&A.length>0&&L0(J1,{color:"green",children:["Selected: ",A.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&L0(Q1,{marginTop:1,children:L0(J1,{color:"gray",children:["Question ",L+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as J7}from"node:path";import{Box as Q2,Text as L1,useInput as Y7}from"ink";import Z7 from"ink-select-input";import{useEffect as U4,useMemo as $2,useRef as UY,useState as m8}from"react";function YY($){return`${$.projectPath}\x00${$.sessionId}`}function ZY($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function XY($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function KY($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function GY($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as r0}from"react/jsx-dev-runtime";function X7($){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 K7($){return J7($)}function G7($){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 U7=({isSelected:$})=>r0(Q2,{marginRight:1,children:r0(L1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),q7=({isSelected:$,label:Q})=>r0(L1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),C2=20,qY=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=m8([]),[K,U]=m8(!1),[G,q]=m8(0),[L,O]=m8(!1),W=UY(!1),z=UY(!0);U4(()=>{return z.current=!0,()=>{z.current=!1}},[]);let N=e0()==="session-selector",A=S0(!1);Y7((y,I)=>{if(I.ctrl&&y==="c"||I.meta&&y==="c"){A();return}if(W.current)return;if(I.escape&&J){J();return}if(I.leftArrow||y==="h"||y==="H"){if(G>0)q((R)=>R-1);return}if(I.rightArrow||y==="l"||y==="L"){if(G<P-1)q((R)=>R+1);return}},{isActive:N}),U4(()=>{if(Q){X(Q);return}(async()=>{U(!0);try{let I=await C0.listSessions({includeSubagents:!1});X(I)}catch(I){console.error("[SessionSelector] Failed to load sessions:",I),X([])}finally{U(!1)}})()},[Q]);let T=$2(()=>KY(Q||Z,$),[$,Q,Z]),_=$2(()=>GY($),[$]),f=$2(()=>{return T.map((y)=>{let I=K7(y.taskSourceProjectPath??y.projectPath),R=X7(y.lastMessageTime),H=ZY(y),k=`[${G7(y.taskStatus)}]`,E=y.gitBranch?` (${y.gitBranch})`:"",n=y.hasErrors?" [!]":"",d=y.taskRetriedFrom?` ↻ retry:${y.taskRetriedFrom.sessionId.slice(0,6)}`:y.relationType==="subagent"?" ↳ subagent":y.relationType==="fork"?" ↳ fork":"",a=y.taskIsolation==="worktree"?` | wt:${y.taskWorktreeBranch??"managed"}`:y.taskIsolation==="local"?" | local":"",l=y.taskDiffStat?` | ${y.taskDiffStat.changedFiles} files +${y.taskDiffStat.additions} -${y.taskDiffStat.deletions}`:"",p=y.taskStatus==="queued"&&y.taskQueuePosition?` | queue:${y.taskQueuePosition}/${y.taskQueueDepth??y.taskQueuePosition}`:"",M=XY(y);return{key:YY(y),label:`${k} ${H} · ${R} | ${I}${E} | ${y.messageCount} 条消息${a}${p}${l}${M}${n}${d}`,value:y}})},[T]),P=$2(()=>Math.max(1,Math.ceil(f.length/C2)),[f.length]),w=$2(()=>{let y=G*C2;return f.slice(y,y+C2)},[f,G]),C=$2(()=>({start:G*C2+1,end:Math.min((G+1)*C2,f.length)}),[G,f.length]);U4(()=>{q(0)},[T.length]);let B=(y)=>{if(W.current)return;W.current=!0,O(!0);let I=()=>{if(!z.current)return;W.current=!1,O(!1)};Promise.resolve().then(()=>Y(y.value)).then(I,I)};if(K)return r0(Q2,{flexDirection:"column",paddingX:2,paddingY:1,children:r0(L1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(T.length===0)return r0(Q2,{flexDirection:"column",paddingX:2,paddingY:1,children:[r0(L1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),r0(L1,{dimColor:!0,children:[`
158
- `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return r0(Q2,{flexDirection:"column",paddingX:2,paddingY:1,children:[r0(L1,{bold:!0,color:"cyan",children:_.title},void 0,!1,void 0,this),r0(L1,{dimColor:!0,children:[`
159
- `,_.instructions,`
160
- `]},void 0,!0,void 0,this),r0(Z7,{items:w,onSelect:B,isFocused:N&&!L,indicatorComponent:U7,itemComponent:q7},void 0,!1,void 0,this),L&&r0(L1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),r0(Q2,{marginTop:1,flexDirection:"column",children:[r0(L1,{dimColor:!0,children:["第 ",G+1,"/",P," 页 · 共 ",T.length," 个会话 · 显示"," ",C.start,"-",C.end]},void 0,!0,void 0,this),P>1&&r0(Q2,{marginTop:1,children:[r0(L1,{color:G>0?"cyan":"gray",children:G>0?"<< 上一页":" "},void 0,!1,void 0,this),r0(L1,{children:" "},void 0,!1,void 0,this),r0(L1,{color:G<P-1?"cyan":"gray",children:G<P-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 OY,Text as I2}from"ink";import O7,{useEffect as z7,useState as _7}from"react";import{jsxDEV as O$}from"react/jsx-dev-runtime";var zY=["|","/","-","\\"],q4=O7.memo(()=>{let $=V2(),Q=b0(),Y=$$(),[J,Z]=_7(0);if(z7(()=>{if($?.status!=="loading"){Z(0);return}let X=setInterval(()=>{Z((K)=>(K+1)%zY.length)},100);return()=>clearInterval(X)},[$?.status]),!$)return null;return O$(OY,{flexDirection:"column",borderStyle:"single",borderColor:Q.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[O$(OY,{children:[O$(I2,{bold:!0,color:Q.colors.info,children:"BTW"},void 0,!1,void 0,this),O$(I2,{color:Q.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&O$(I2,{color:Q.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&O$(I2,{color:Q.colors.text.secondary,children:[zY[J]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&O$(I2,{color:Q.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this),$.status==="completed"&&$.response&&O$(I1,{content:$.response,role:"assistant",terminalWidth:Math.max(20,Y-8),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});q4.displayName="SideConversationPanel";import{Box as c0,Text as k0,useInput as N7}from"ink";import{jsxDEV as Z0}from"react/jsx-dev-runtime";function NY({onCancel:$}){let Q=T1(),J=_Y({cwd:Q}).getAll(),Z=J.filter((G)=>G.source==="builtin"),X=J.filter((G)=>G.source==="user"),K=J.filter((G)=>G.source==="project"),U=S0(!1,$);if(N7((G,q)=>{if(q.escape)$?.();else if(q.ctrl&&G==="c"||q.meta&&G==="c")U()}),J.length===0)return Z0(c0,{flexDirection:"column",paddingY:1,children:[Z0(c0,{marginBottom:1,children:Z0(k0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z0(c0,{paddingLeft:2,children:Z0(k0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z0(c0,{marginTop:1,paddingLeft:2,children:Z0(k0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z0(c0,{marginTop:1,children:Z0(k0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Z0(c0,{flexDirection:"column",paddingY:1,children:[Z0(c0,{marginBottom:1,children:[Z0(k0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),Z0(k0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.length>0&&Z0(c0,{flexDirection:"column",marginBottom:1,children:[Z0(c0,{paddingLeft:1,children:[Z0(k0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),Z0(k0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.map((G)=>{let L=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Z0(c0,{flexDirection:"column",paddingLeft:2,children:[Z0(k0,{children:[Z0(k0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Z0(k0,{color:"gray",children:[" - ",L]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&Z0(c0,{paddingLeft:2,children:Z0(k0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Z0(c0,{paddingLeft:2,children:Z0(k0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&Z0(c0,{flexDirection:"column",marginBottom:1,children:[Z0(c0,{paddingLeft:1,children:[Z0(k0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),Z0(k0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((G)=>{let L=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Z0(c0,{flexDirection:"column",paddingLeft:2,children:[Z0(k0,{children:[Z0(k0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Z0(k0,{color:"gray",children:[" - ",L]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&Z0(c0,{paddingLeft:2,children:Z0(k0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Z0(c0,{paddingLeft:2,children:Z0(k0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&Z0(c0,{flexDirection:"column",marginBottom:1,children:[Z0(c0,{paddingLeft:1,children:[Z0(k0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),Z0(k0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((G)=>{let L=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Z0(c0,{flexDirection:"column",paddingLeft:2,children:[Z0(k0,{children:[Z0(k0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Z0(k0,{color:"gray",children:[" - ",L]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.userInvocable&&Z0(c0,{paddingLeft:2,children:Z0(k0,{color:"blue",children:["命令: /",G.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z0(c0,{marginTop:1,children:Z0(k0,{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 FY,Text as y1}from"ink";import F7,{useEffect as W7,useMemo as H7,useState as WY}from"react";import{jsxDEV as Y1,Fragment as O4}from"react/jsx-dev-runtime";var HY=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function L7($){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 LY=F7.memo(()=>{let $=t((q)=>q.app.subagentProgresses),Q=t((q)=>q.app.subagentProgress),Y=b0(),[J,Z]=WY(0),[X,K]=WY(()=>Date.now()),U=H7(()=>{let q=Object.values($);return q.length>0?q:Q?[Q]:[]},[Q,$]),G=U.some((q)=>q.status==="running");if(W7(()=>{if(!G){Z(0);return}let q=setInterval(()=>{Z((O)=>(O+1)%HY.length)},80),L=setInterval(()=>{K(Date.now())},1000);return()=>{clearInterval(q),clearInterval(L)}},[G]),U.length===0)return null;return Y1(FY,{paddingX:2,paddingY:0,flexDirection:"column",children:U.map((q)=>{let L=q.status==="running"?HY[J]:q.status==="completed"?"[OK]":"[X]",O=q.status==="running"?Y.colors.info:q.status==="completed"?Y.colors.success:Y.colors.error,W=Math.max(0,X-q.startTime);return Y1(FY,{flexDirection:"row",gap:1,children:[Y1(y1,{color:O,bold:!0,children:L},void 0,!1,void 0,this),Y1(y1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),Y1(y1,{color:Y.colors.text.primary,bold:!0,children:q.type},void 0,!1,void 0,this),Y1(y1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(y1,{color:Y.colors.text.secondary,children:q.description},void 0,!1,void 0,this),q.currentTool&&Y1(O4,{children:[Y1(y1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(y1,{color:Y.colors.warning,children:q.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="running"&&W>0&&Y1(O4,{children:[Y1(y1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(y1,{color:Y.colors.info,children:L7(W)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="failed"&&q.terminalSummary&&Y1(O4,{children:[Y1(y1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(y1,{color:Y.colors.error,children:q.terminalSummary},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{Box as J2,Text as r1}from"ink";import B7 from"react";import{jsxDEV as G1}from"react/jsx-dev-runtime";var z4={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},_4=B7.memo(()=>{let $=j4().filter((Y)=>Y.status!=="deleted"),Q=b0();if($.length===0)return null;return G1(J2,{flexDirection:"column",paddingX:2,children:$.map((Y)=>{let J=Y.tasks.filter((Z)=>Z.status==="completed").length;return G1(J2,{flexDirection:"column",marginBottom:1,children:[G1(J2,{gap:1,children:[G1(r1,{bold:!0,color:Y.status==="failed"?Q.colors.error:Y.status==="completed"?Q.colors.success:Q.colors.info,children:[z4[Y.status]," Team"]},void 0,!0,void 0,this),G1(r1,{bold:!0,color:Q.colors.text.primary,children:Y.name},void 0,!1,void 0,this),G1(r1,{color:Q.colors.muted,children:["| ",Y.members.length-1," members | ",J,"/",Y.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G1(J2,{flexDirection:"column",paddingLeft:2,children:[Y.members.filter((Z)=>Z.status!=="leader").map((Z)=>G1(J2,{gap:1,children:[G1(r1,{color:Q.colors.muted,children:z4[Z.status]},void 0,!1,void 0,this),G1(r1,{color:Q.colors.text.secondary,children:Z.name},void 0,!1,void 0,this),G1(r1,{color:Q.colors.muted,children:["(",Z.subagentType,", ",Z.status,Z.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this)),Y.tasks.map((Z)=>G1(J2,{gap:1,children:[G1(r1,{color:Q.colors.muted,children:z4[Z.status]},void 0,!1,void 0,this),G1(r1,{color:Q.colors.text.secondary,children:["#",Z.id," ",Z.subject]},void 0,!0,void 0,this),G1(r1,{color:Q.colors.muted,children:["(",Z.status,Z.owner?`, ${Z.owner}`:"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this))]},void 0,!0,void 0,this)]},Y.name,!0,void 0,this)})},void 0,!1,void 0,this)});_4.displayName="TeamProgress";import{useMemoizedFn as w7}from"ahooks";import{Box as S1,Text as r,useInput as b7}from"ink";import A7 from"ink-select-input";import{useState as BY}from"react";import{jsxDEV as u}from"react/jsx-dev-runtime";var wY=k$.map(($)=>({label:$.label,value:$.id})),P7=({theme:$})=>{let{colors:Q}=$;return u(S1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(r,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),u(r,{children:" "},void 0,!1,void 0,this),u(r,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),u(r,{children:[u(r,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),u(r,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(r,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(r,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[" ",u(r,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(r,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),u(r,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[" ",u(r,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),u(r,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(r,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(r,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[" ",u(r,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(r,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),u(r,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[" ",u(r,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:" "},void 0,!1,void 0,this),u(r,{color:Q.error,children:["- print(",u(r,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),u(r,{color:Q.success,children:["+ print(",u(r,{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)},y7=({theme:$})=>{let{colors:Q}=$;return u(S1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(r,{children:" "},void 0,!1,void 0,this),u(r,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),u(r,{children:" "},void 0,!1,void 0,this),u(r,{children:[u(r,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),u(r,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[u(r,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),u(r,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[u(r,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),u(r,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[u(r,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),u(r,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[u(r,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),u(r,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},bY=()=>{let $=n1(),Q=a0.getCurrentThemeName(),Y=k$.findIndex((b)=>b.label===Q),J=Y>=0?k$[Y].theme:k$[0].theme,[Z,X]=BY(J),[K,U]=BY(!1),G=w7(async(b)=>{if(K)return;U(!0);try{await p0().setTheme(b.value),$.closeModal()}catch(N){console.error("主题切换失败:",N instanceof Error?N.message:N)}finally{U(!1)}}),q=(b)=>{let N=k$.find((A)=>A.id===b.value);if(N)X(N.theme)},O=e0()==="theme-selector",W=S0(!1);b7((b,N)=>{if(N.ctrl&&b==="c"||N.meta&&b==="c"){W();return}if(N.escape&&!K)$.closeModal()},{isActive:O});let z=(b)=>{let{isSelected:N,label:A}=b,_=A===Q?"[OK]":" ";return u(r,{color:N?Z.colors.primary:Z.colors.text.primary,children:[_," ",A]},void 0,!0,void 0,this)};return u(S1,{flexDirection:"column",height:"100%",children:[u(S1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(r,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(S1,{flexDirection:"row",flexGrow:1,children:[u(S1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:u(S1,{flexDirection:"column",children:[u(S1,{paddingTop:1,paddingBottom:1,children:u(r,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",wY.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(A7,{items:wY,initialIndex:Y>=0?Y:0,onSelect:G,onHighlight:q,itemComponent:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(S1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[u(P7,{theme:Z},void 0,!1,void 0,this),u(y7,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u(S1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(r,{color:Z.colors.text.muted,children:K?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as T0}from"react/jsx-dev-runtime";var U1=t1("UI"),yY=({debug:$,continue:Q,...Y})=>{if($)U1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=p8(!1),Z=p8(!1),X=p8(!1),K=p8(null),U=f4(),G=k4(),q=D2(),L=D4(),O=v4(),W=n1(),z=i1(),b=j$(),N=T1(),A=p4(),T=h$(),_=m4();_$(()=>{if(a0.getCurrentThemeName()!==_)try{a0.setTheme(_)}catch{}},[_]);let f=U==="ready",P=U==="needsSetup",w=U==="idle",C=R7(()=>Y.agents?PY(Y.agents):void 0,[Y.agents]),{confirmationState:B,confirmationHandler:y,handleResponse:I,dismissAll:R}=I6(),{executeCommand:H,handleAbort:k,isProcessing:E,cleanupAgent:n}=R6(Y.systemPrompt,Y.appendSystemPrompt,y,Y.maxTurns,R,C),{getPreviousCommand:d,getNextCommand:a,addToHistory:l}=T6();l6();let p=k6("",0),M=s0(async()=>{let V=T,$0;if(V==="default")$0="autoEdit";else if(V==="autoEdit")$0="plan";else if(V==="plan")$0="default";else $0="default";try{await C0.setSessionPermissionMode(b,N,$0),await p0().setPermissionMode($0)}catch(B0){U1.error("权限模式切换失败:",B0 instanceof Error?B0.message:B0)}}),F=s0(async(V)=>{try{let $0={displayName:V.displayName,provider:V.provider,model:V.model,overrides:V.overrides};if(V.modelProvider)await p0().addModelWithProvider($0,V.modelProvider);else await p0().addModel($0);W.setInitializationStatus("ready")}catch($0){throw U1.error("初始化配置保存失败:",$0 instanceof Error?$0.message:$0),$0}}),S=s0(()=>{if(q==="shortcuts")W.closeModal();else W.setActiveModal("shortcuts")}),D=s0(async(V,$0,B0)=>{return n2({intent:$0,session:V,newSessionId:B0?.newSessionId,announceFork:B0?.announceFork,permissionModeOverride:Y.permissionMode},N,z,n)}),v=s0(async(V,$0)=>{let H$=(await i2($0,N)).filter((L$)=>L$.sessionId===V);if(H$.length===0)throw Error(`Session not found: ${V}`);if(H$.length>1)throw Error(`Multiple workspaces contain session ${V}; use the session selector`);return H$[0]}),{showSuggestions:h,suggestions:m,selectedSuggestionIndex:Q0}=u6(p,H,d,a,l,k,E,M,S,q==="shortcuts");_$(()=>{if(p.value&&q==="shortcuts")W.closeModal()},[p.value,q,W]);let o=s0(async()=>{X.current=!0;try{let V=Y.forkSession?"fork":"resume",$0=await i2(V,N);if($0.length===0){if(Y.forkSession){U1.error("没有可供 fork 的历史会话"),C1(1);return}z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let B0=$0[0];await D(B0,V,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(V){if(U1.error("[BladeInterface] 继续会话失败:",V),Y.forkSession){C1(1);return}z.addAssistantMessage("继续会话失败,开始新对话。")}}),F0=s0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let B0=Y.forkSession?"fork":"resume",V0=await v(Y.resume,B0);await D(V0,B0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let V=Y.forkSession?"fork":"resume",$0=await i2(V,N);if($0.length===0)U1.error("没有找到历史会话"),C1(1);W.showSessionSelector($0,V)}catch(V){U1.error("[BladeInterface] 加载会话失败:",V),C1(1)}});_$(()=>{if(J.current)return;if(Q){J.current=!0,o();return}if(Y.resume)J.current=!0,F0()},[Q,Y.resume,o,F0]);let y0=s0(async(V)=>{let $0=B.details?.type;if($0==="enterPlanMode"&&V.approved)try{await C0.setSessionPermissionMode(b,N,"plan"),await p0().setPermissionMode("plan"),U1.debug("[BladeInterface] Entered Plan mode")}catch(B0){U1.error("[BladeInterface] Failed to enter Plan mode:",B0)}if($0==="exitPlanMode"&&V.approved)U1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");I(V)}),m0=s0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),C1(0)}),E0=s0(()=>{W.closeModal()}),F$=s0(async(V)=>{try{await D(V,L?.intent??"resume"),W.closeModal()}catch($0){U1.error("[BladeInterface] Failed to restore session:",$0),z.addAssistantMessage(`会话操作失败: ${$0 instanceof Error?$0.message:"未知错误"}`),W.closeModal()}}),X2=s0(()=>{if(Y.resume)C1(0);else W.closeModal()}),K2=s0((V)=>{W.showModelEditWizard(V)}),D1=s0((V)=>{z.addAssistantMessage(`已添加模型配置: ${V.displayName??V.model},并已切换到该模型`),E0()}),v$=s0((V)=>{z.addAssistantMessage(`已更新模型配置: ${V.displayName??V.model}`),E0()});_$(()=>{if(P){A.setFocus("model-config-wizard");return}if(B.isVisible)A.setFocus("confirmation-prompt");else if(q==="sessionSelector")A.setFocus("session-selector");else if(q==="themeSelector")A.setFocus("theme-selector");else if(q==="modelSelector")A.setFocus("model-selector");else if(q==="modelAddWizard"||q==="modelEditWizard")A.setFocus("model-config-wizard");else if(q==="permissionsManager")A.setFocus("permissions-manager");else if(q==="agentsManager")A.setFocus("agents-manager");else if(q==="agentCreationWizard")A.setFocus("agent-creation-wizard");else if(q==="hooksManager")A.setFocus("hooks-manager");else if(q==="shortcuts")A.setFocus("main-input");else A.setFocus("main-input")},[P,B.isVisible,q,A.setFocus]),_$(()=>{if(!f||X.current)return;if(AY().length>0){X.current=!0;return}X.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[f]),_$(()=>{if(!G)return;if(K.current===G)return;if(K.current=G,U==="error")z.addAssistantMessage(`初始化失败: ${G}`);else z.addAssistantMessage(`${G}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[G,U,z.addAssistantMessage]);let x0=s0(async(V)=>{try{await H({displayText:V,text:V,images:[],parts:[{type:"text",text:V}]})}catch($0){let B0=$0 instanceof Error?$0.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${B0}`)}});_$(()=>{let V=Y.initialMessage?.trim();if(!V||Z.current||!f||P)return;Z.current=!0,l(V),x0(V)},[Y.initialMessage,f,P,H,l]);let D$=s0(async(V)=>{try{await p0().setPermissionMode(V)}catch($0){U1.error("权限模式初始化失败:",$0 instanceof Error?$0.message:$0)}});if(_$(()=>{let V=Y.permissionMode;if($)U1.debug("[Debug] permissionMode from CLI:",V),U1.debug("[Debug] current permissionMode:",T);if(!V||V===T)return;D$(V)},[Y.permissionMode,T]),w)return null;if(P)return T0(X4,{mode:"setup",onComplete:F,onCancel:m0},void 0,!1,void 0,this);if($)U1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:B.isVisible,activeModal:q});let G2=q==="modelSelector",V1=O,W$=q==="modelAddWizard"?"add":q==="modelEditWizard"&&V1?"edit":null,k2=G2||Boolean(W$),d8=q==="agentsManager",R1=q==="agentCreationWizard",r8=q==="skillsManager",X0=q==="pluginsManager",A0=V1?{displayName:V1.displayName,provider:V1.provider,model:V1.model,overrides:V1.overrides}:void 0,_0=B.isVisible&&B.details?B.details.type==="mcpElicitation"&&B.details.mcpElicitation?T0(_J,{details:B.details.mcpElicitation,onComplete:(V,$0)=>y0({approved:V.action==="accept",elicitation:V,...$0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):B.details.type==="askUserQuestion"&&B.details.questions?T0(JY,{questions:B.details.questions,onComplete:(V)=>y0({approved:!0,answers:V}),onCancel:()=>y0({approved:!1})},void 0,!1,void 0,this):T0(j9,{details:B.details,onResponse:y0},void 0,!1,void 0,this):q==="themeSelector"?T0(bY,{},void 0,!1,void 0,this):q==="permissionsManager"?T0(aJ,{onClose:E0},void 0,!1,void 0,this):q==="sessionSelector"?T0(qY,{intent:L?.intent??"resume",sessions:L?.sessions,onSelect:F$,onCancel:X2},void 0,!1,void 0,this):q==="hooksManager"?T0(E9,{workspaceRoot:N,sessionId:b,onClose:E0},void 0,!1,void 0,this):null,e=Boolean(_0);return T0(z$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[_0,T0(z$,{flexDirection:"column",display:e?"none":"flex",children:[T0(TJ,{},void 0,!1,void 0,this),T0(LY,{},void 0,!1,void 0,this),T0(_4,{},void 0,!1,void 0,this),T0(q4,{},void 0,!1,void 0,this),T0(UJ,{paused:e},void 0,!1,void 0,this),T0(JJ,{input:p.value,cursorPosition:p.cursorPosition,onChange:p.setValue,onChangeCursorPosition:p.setCursorPosition,onAddPasteMapping:p.addPasteMapping,onAddImagePasteMapping:p.addImagePasteMapping},void 0,!1,void 0,this),G2&&T0(z$,{marginTop:1,paddingX:2,children:T0(CJ,{onClose:E0,onEdit:K2},void 0,!1,void 0,this)},void 0,!1,void 0,this),W$&&T0(z$,{marginTop:1,paddingX:2,children:T0(X4,{mode:W$,modelId:V1?.id,initialConfig:W$==="edit"?A0:void 0,onComplete:W$==="edit"?v$:D1,onCancel:E0},void 0,!1,void 0,this)},void 0,!1,void 0,this),d8&&T0(z$,{marginTop:1,paddingX:2,children:T0(i6,{workspaceRoot:N,onComplete:E0,onCancel:E0},void 0,!1,void 0,this)},void 0,!1,void 0,this),R1&&T0(z$,{marginTop:1,paddingX:2,children:T0(B2,{onComplete:E0,onCancel:E0},void 0,!1,void 0,this)},void 0,!1,void 0,this),r8&&T0(z$,{marginTop:1,paddingX:2,children:T0(NY,{onComplete:E0,onCancel:E0},void 0,!1,void 0,this)},void 0,!1,void 0,this),X0&&T0(z$,{marginTop:1,paddingX:2,children:T0($Y,{workspaceRoot:N,onComplete:E0,onCancel:E0},void 0,!1,void 0,this)},void 0,!1,void 0,this),T0(J9,{suggestions:m,selectedIndex:Q0,visible:h&&!k2},void 0,!1,void 0,this),T0(Q9,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as M7,Text as N$}from"ink";import T7 from"react";import{jsxDEV as a1}from"react/jsx-dev-runtime";class f2 extends T7.Component{constructor($){super($);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError($){return{hasError:!0,error:$,errorInfo:null}}componentDidCatch($,Q){this.setState({error:$,errorInfo:Q}),console.error("未捕获的错误:",$,Q)}render(){if(this.state.hasError)return a1(M7,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[a1(N$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),a1(N$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as S$,Text as o1,useInput as C7}from"ink";import{useState as N4}from"react";import{jsxDEV as Z1}from"react/jsx-dev-runtime";var c8=[{key:"update",label:"Update now",description:`runs \`${MY()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],CY=({versionInfo:$,onComplete:Q})=>{let[Y,J]=N4(0),[Z,X]=N4(!1),[K,U]=N4(null);C7((q,L)=>{if(L.ctrl&&q==="c"){H2().shutdown("SIGINT",0);return}if(Z||K)return;if(L.upArrow||q==="k")J((O)=>O>0?O-1:c8.length-1);else if(L.downArrow||q==="j")J((O)=>O<c8.length-1?O+1:0);else if(L.return)G(c8[Y].key);else if(q==="1")G("update");else if(q==="2")G("skip");else if(q==="3")G("skip_until_next")});let G=async(q)=>{switch(q){case"update":{X(!0);let L=await TY();U(L.message),setTimeout(()=>{H2().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await RY($.latestVersion);Q();break}};if(K)return Z1(S$,{flexDirection:"column",marginY:1,children:Z1(o1,{children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return Z1(S$,{flexDirection:"column",marginY:1,children:Z1(o1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return Z1(S$,{flexDirection:"column",marginY:1,children:[Z1(o1,{color:"yellow",bold:!0,children:["Update available! ",Z1(o1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z1(S$,{marginTop:1,children:Z1(o1,{color:"gray",children:["Release notes:"," ",Z1(o1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Z1(S$,{flexDirection:"column",marginTop:1,children:c8.map((q,L)=>{let O=L===Y,W=O?"› ":" ",z=`${L+1}. `;return Z1(S$,{children:Z1(o1,{color:O?"cyan":void 0,children:[W,z,q.label,q.description&&Z1(o1,{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),Z1(S$,{marginTop:1,children:Z1(o1,{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 x8,Text as Y2,useInput as I7}from"ink";import{useState as IY}from"react";import{jsxDEV as v1}from"react/jsx-dev-runtime";var fY=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=a0.getTheme(),[Z,X]=IY(!1),[K,U]=IY(null);return I7((G,q)=>{if(Z)return;if(q.return||G.toLowerCase()==="t"){X(!0),U(null),Q().catch((L)=>{U(L instanceof Error?L.message:"Failed to trust workspace"),X(!1)});return}if(G.toLowerCase()==="s"||q.escape)X(!0),U(null),Y().catch((L)=>{U(L instanceof Error?L.message:"Failed to continue safely"),X(!1)})}),v1(x8,{flexDirection:"column",paddingX:1,children:[v1(Y2,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),v1(Y2,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),v1(x8,{marginTop:1,flexDirection:"column",children:[v1(Y2,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((G)=>v1(Y2,{children:[" ",G.path," · ",G.effects.length," effect(s)"]},`${G.kind}:${G.path}`,!0,void 0,this))]},void 0,!0,void 0,this),K&&v1(x8,{marginTop:1,children:v1(Y2,{color:J.colors.error,children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),v1(x8,{marginTop:1,children:v1(Y2,{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 f7}from"ink";import{useEffect as k7}from"react";function kY(){let{stdout:$}=f7();k7(()=>{if(!$.isTTY)return;return $.write(p9),$.write(pQ),()=>{$.write(c9),$.write(pQ)}},[$])}function SY($){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 Z2}from"react/jsx-dev-runtime";function v7($){if(l0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");o0().setInitializationStatus("ready")}var wH=($)=>{kY();let[Q,Y]=l8(!1),[J,Z]=l8(null),[X,K]=l8(!1),[U,G]=l8(null),q=u8((z,b)=>{let N=z instanceof Error?z.message:String(z);if(o0().setInitializationError(N),o0().setInitializationStatus("error"),Y(!0),b)console.error("[FAIL] 应用初始化失败:",N)}),L=u8(async()=>{try{let z=l0().config.config??DY,b=VY(z,$);if(v7(b),b.resumeSessionId)jY().restoreSession(b.resumeSessionId,[]);if(b.debug)console.error("[Debug] 运行时配置:",b);let N=b.codeTheme;if(N&&a0.hasTheme(N)){if(a0.setTheme(N),$.debug)console.log(`[OK] 已加载主题: ${N}`)}try{q1.getInstance().loadConfig(b.hooks||{},d0());let T=await hY(d0());if($.debug&&b.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${T.subagents.getAllNames().length} agents, ${T.skills.size} skills, ${T.commands.getCommandCount()+T.commands.getPluginCommandCount()} commands, ${T.plugins.getAll().length} plugins`);let f=l0().session.sessionId;vY(f)}catch(A){if($.debug)console.warn("Hooks 初始化失败:",SY(A))}e2(async()=>{await gY.getInstance().killAll(),await EY.getInstance().disconnectAll(),q1.getInstance().cleanup()}),Y(!0)}catch(z){q(z,!!$.debug)}}),O=u8(async()=>{let z=await F4.getInstance().getStatus(d0());if(z.state==="untrusted"||z.state==="error"){G(z);return}await L()}),W=u8(async()=>{if($.versionCheckPromise){let z=await $.versionCheckPromise;if(z){Z(z),K(!0);return}}await O()});if(S7(()=>{W()},[]),X&&J)return Z2(f2,{children:Z2(CY,{versionInfo:J,onComplete:()=>{K(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(U)return Z2(f2,{children:Z2(fY,{status:U,onTrust:async()=>{await F4.getInstance().trust(d0()),await mY(),G(null),await L()},onContinueSafely:async()=>{G(null),await L()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return Z2(f2,{children:Z2(yY,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{wH as AppWrapper};