blade-code 0.10.24 → 0.10.25

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 (102) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-0qayfsc9.js +2 -0
  3. package/dist/{chunk-f8zz4se0.js → chunk-0t0dsepx.js} +1 -1
  4. package/dist/{chunk-nqpcwa0k.js → chunk-10yas08a.js} +5 -4
  5. package/dist/{chunk-bp886b8j.js → chunk-15edqtyv.js} +1 -1
  6. package/dist/chunk-37bxrzq5.js +1 -0
  7. package/dist/chunk-38pr3rjg.js +1 -0
  8. package/dist/chunk-3mgfa96q.js +1 -0
  9. package/dist/chunk-4vwyhhjt.js +6 -0
  10. package/dist/chunk-565weg3f.js +44 -0
  11. package/dist/chunk-584eewzf.js +1 -0
  12. package/dist/chunk-58wxa5cj.js +2 -0
  13. package/dist/{chunk-3fkj59nv.js → chunk-5dr18jzd.js} +1 -1
  14. package/dist/{chunk-m13jrgp9.js → chunk-5k02rk0f.js} +2 -2
  15. package/dist/{chunk-67ekta7b.js → chunk-5tb28pxt.js} +1 -1
  16. package/dist/{chunk-9c3jjbgd.js → chunk-65pe5x3a.js} +1 -1
  17. package/dist/{chunk-pccn8ndq.js → chunk-6vhc5gdf.js} +2 -2
  18. package/dist/{chunk-xzdpdwhz.js → chunk-763aam58.js} +1 -1
  19. package/dist/chunk-7cgbnp1m.js +1 -0
  20. package/dist/{chunk-c674mmtj.js → chunk-7tea6e9y.js} +2 -2
  21. package/dist/{chunk-vns8g2rv.js → chunk-86g3xxx7.js} +1 -1
  22. package/dist/chunk-9e244cxx.js +1 -0
  23. package/dist/chunk-9gtc0kd2.js +2 -0
  24. package/dist/{chunk-1gkpjhts.js → chunk-9tp00s2z.js} +1 -1
  25. package/dist/{chunk-0568ndm9.js → chunk-a0ga35qv.js} +43 -43
  26. package/dist/{chunk-w56y2pvk.js → chunk-awwe1rqb.js} +2 -2
  27. package/dist/chunk-axrwmx6e.js +1 -0
  28. package/dist/{chunk-yaxapgbm.js → chunk-b22x3h7k.js} +1 -1
  29. package/dist/{chunk-zm3zn23k.js → chunk-bt6xqnbx.js} +1 -1
  30. package/dist/chunk-d6qktf17.js +1 -0
  31. package/dist/{chunk-p1dp2xgq.js → chunk-dbb20rxh.js} +1 -1
  32. package/dist/{chunk-bw7vknjr.js → chunk-eeet612j.js} +1 -1
  33. package/dist/chunk-eh8gdgfb.js +1 -0
  34. package/dist/chunk-f769xhg0.js +1 -0
  35. package/dist/{chunk-57q5wn4g.js → chunk-fg1t369y.js} +1 -1
  36. package/dist/chunk-fgy8pbk6.js +1 -0
  37. package/dist/{chunk-my2jwz6y.js → chunk-h61xsxmy.js} +2 -2
  38. package/dist/{chunk-6vfe3409.js → chunk-jx1q1f88.js} +1 -1
  39. package/dist/{chunk-t327cwnb.js → chunk-k89zf5h1.js} +1 -1
  40. package/dist/{chunk-yac1ga9w.js → chunk-kjwc997q.js} +1 -1
  41. package/dist/chunk-kmf716yy.js +1 -0
  42. package/dist/chunk-m3ya6rtr.js +2 -0
  43. package/dist/chunk-mbxffehd.js +1 -0
  44. package/dist/{chunk-d2kzet1k.js → chunk-mmw7jbxg.js} +1 -1
  45. package/dist/chunk-nwg0bpex.js +116 -0
  46. package/dist/{chunk-rtkhyp1g.js → chunk-pserj9y9.js} +1 -1
  47. package/dist/{chunk-x6tns9d8.js → chunk-qdngw7h1.js} +1 -1
  48. package/dist/chunk-qnsj1pp3.js +3 -0
  49. package/dist/{chunk-26zhy301.js → chunk-qvthjzt5.js} +2 -2
  50. package/dist/{chunk-k2b95m2p.js → chunk-qy36y9xc.js} +2 -2
  51. package/dist/{chunk-hpmxmkzc.js → chunk-r561wfcz.js} +1 -1
  52. package/dist/{chunk-wjqctwyr.js → chunk-rb7aayp5.js} +6 -5
  53. package/dist/{chunk-aw8s1sej.js → chunk-rc9rfrws.js} +1 -1
  54. package/dist/chunk-rhcts0qe.js +2 -0
  55. package/dist/{chunk-phzy5kqq.js → chunk-saneyjmy.js} +1 -1
  56. package/dist/chunk-v508x7cg.js +0 -0
  57. package/dist/chunk-vbsk6mjn.js +100 -0
  58. package/dist/{chunk-f4ksxskk.js → chunk-ve4wkta1.js} +1 -1
  59. package/dist/{chunk-s14wmzm3.js → chunk-vjrn667c.js} +2 -2
  60. package/dist/chunk-w0z7cn13.js +1 -0
  61. package/dist/chunk-wbvs2tv5.js +25 -0
  62. package/dist/chunk-whxmvh0n.js +6 -0
  63. package/dist/{chunk-86zsjamb.js → chunk-wyq21fev.js} +2 -2
  64. package/dist/{chunk-j8ggq1z4.js → chunk-xjq1htyt.js} +2 -2
  65. package/dist/web/assets/{ChatView-CCxjYDmJ.js → ChatView-Crna6-ID.js} +2 -2
  66. package/dist/web/assets/{CodeBlockHighlighter-D9MqsrZP.js → CodeBlockHighlighter-coWjWCyT.js} +1 -1
  67. package/dist/web/assets/{FilePreview-Cn5HOlPw.js → FilePreview-BKcCbpvz.js} +2 -2
  68. package/dist/web/assets/{MarkdownRenderer-ALTOCdfi.js → MarkdownRenderer-BqV1nvf1.js} +3 -3
  69. package/dist/web/assets/{SettingsModal-Dk69F1bS.js → SettingsModal-BOMswk9P.js} +2 -2
  70. package/dist/web/assets/{TaskSwitcher-DRZZocE1.js → TaskSwitcher-BEW2DhW3.js} +1 -1
  71. package/dist/web/assets/{TerminalPanel-ByAqKZ47.js → TerminalPanel-BXzypTz6.js} +1 -1
  72. package/dist/web/assets/index-DqXKkjcp.js +11 -0
  73. package/dist/web/index.html +1 -1
  74. package/package.json +2 -1
  75. package/dist/chunk-014rwj5b.js +0 -1
  76. package/dist/chunk-1pkca2km.js +0 -3
  77. package/dist/chunk-2wpnzjme.js +0 -1
  78. package/dist/chunk-3ak60ndt.js +0 -1
  79. package/dist/chunk-3qmwt188.js +0 -100
  80. package/dist/chunk-4a02yjg9.js +0 -2
  81. package/dist/chunk-7dqc10sc.js +0 -1
  82. package/dist/chunk-ag07wwer.js +0 -2
  83. package/dist/chunk-bpz0g8ej.js +0 -2
  84. package/dist/chunk-bvwq5wth.js +0 -6
  85. package/dist/chunk-c29y2s8g.js +0 -2
  86. package/dist/chunk-d70mtcp4.js +0 -1
  87. package/dist/chunk-e71qm105.js +0 -1
  88. package/dist/chunk-edqtngzr.js +0 -44
  89. package/dist/chunk-f0mt91sr.js +0 -1
  90. package/dist/chunk-gwe547ww.js +0 -1
  91. package/dist/chunk-m486vmtn.js +0 -1
  92. package/dist/chunk-n00mknme.js +0 -25
  93. package/dist/chunk-n54tp9wr.js +0 -1
  94. package/dist/chunk-pq7tk058.js +0 -6
  95. package/dist/chunk-q5sewfn5.js +0 -1
  96. package/dist/chunk-qg87zezq.js +0 -1
  97. package/dist/chunk-r14bz8va.js +0 -1
  98. package/dist/chunk-s4mqw4wa.js +0 -116
  99. package/dist/chunk-sgnjekfb.js +0 -1
  100. package/dist/chunk-tetxqw28.js +0 -1
  101. package/dist/chunk-vmzf4nvh.js +0 -2
  102. package/dist/web/assets/index-CRCirUK7.js +0 -11
@@ -1,4 +1,4 @@
1
- import{b as uJ,c as lJ,d as dJ}from"./chunk-4a02yjg9.js";import{j as e9,k as $J}from"./chunk-57q5wn4g.js";import{r as p8}from"./chunk-9c3jjbgd.js";import{$ as g4,F as _$,H as C4,I as I4,L as J8,M as WJ,N as LJ,Q as BJ,R as wJ,W as w6,X as b6,Y as ZY,Z as E4,ba as U6,t as q6,w as s2,x as a2,y as e4,z as YY}from"./chunk-nqpcwa0k.js";import{fa as I9,ga as T9,ha as f9,ka as JY}from"./chunk-yaxapgbm.js";import"./chunk-3fkj59nv.js";import{$a as l4,ib as u2}from"./chunk-0568ndm9.js";import{tb as X8}from"./chunk-4dnvydyv.js";import{Lb as m4,Tb as k4,Ub as x2,Vb as v4,Xb as D8,cc as Q8,fc as P0}from"./chunk-3qmwt188.js";import"./chunk-s4mqw4wa.js";import{Dc as cJ}from"./chunk-ag07wwer.js";import{Ec as G8,Fc as c8,Hc as T1}from"./chunk-my2jwz6y.js";import"./chunk-j8ggq1z4.js";import{$c as Y8,Lc as C$,Mc as d0,Nc as s1,Oc as RQ,Pc as D$,Qc as V8,Rc as o6,Sc as uQ,Tc as d9,Uc as n6,Vc as k$,Wc as Q1,Xc as $Y,Yc as r0,Zc as pJ,_c as b2,cd as j4,jd as g0}from"./chunk-n00mknme.js";import"./chunk-qg87zezq.js";import"./chunk-xjqcc0nt.js";import"./chunk-f8zz4se0.js";import{vd as lQ}from"./chunk-xzdpdwhz.js";import"./chunk-m27w377p.js";import"./chunk-d2kzet1k.js";import{Ed as W6,Hd as kJ,Nd as HJ,Td as QY}from"./chunk-wjqctwyr.js";import"./chunk-5xph8r1k.js";import"./chunk-5sw8j9ae.js";import"./chunk-18n15nn8.js";import{fe as IQ,he as U1}from"./chunk-86zsjamb.js";import"./chunk-6pb6zs96.js";import{me as tJ,pe as n1}from"./chunk-w56y2pvk.js";import{Te as sJ,bf as FJ,cf as eJ}from"./chunk-edqtngzr.js";import"./chunk-vmzf4nvh.js";import"./chunk-hpmxmkzc.js";import{nf as V$,of as j8,pf as TQ}from"./chunk-bpz0g8ej.js";import{tf as x0}from"./chunk-p1dp2xgq.js";import{uf as n9,vf as t9,yf as V1}from"./chunk-c674mmtj.js";import"./chunk-1gkpjhts.js";import{Kf as g9}from"./chunk-c29y2s8g.js";import{Lf as sQ}from"./chunk-pccn8ndq.js";import"./chunk-x6tns9d8.js";import"./chunk-s14wmzm3.js";import{Xf as CQ}from"./chunk-vns8g2rv.js";import{useMemoizedFn as k2}from"ahooks";import{useEffect as jX,useState as v2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as q$}from"ink";import{useEffect as U$,useMemo as TX,useRef as I2}from"react";import{useShallow as GY}from"zustand/react/shallow";import{useStore as XY}from"zustand";function s($){return XY(k$,$)}var KY=[],v$=()=>s(($)=>$.session.sessionId),I1=()=>s(($)=>$.session.workspaceRoot),eQ=()=>s(($)=>$.session.messages),$4=()=>s(($)=>$.session.clearCount),Q4=()=>s(($)=>$.session.isCompacting),J4=()=>s(($)=>$.session.tokenUsage.estimatedCostUsd),Y4=()=>s(($)=>$.session.providerRetry),Z4=()=>s(($)=>$.session.providerStall),a1=()=>s(($)=>$.session.actions),X4=()=>s(($)=>{let{inputTokens:Q,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Q/Y*100);return Math.round(J)}),G4=()=>s(($)=>$.app.initializationStatus),K4=()=>s(($)=>$.app.initializationError),P8=()=>s(($)=>$.app.activeModal),q4=()=>s(($)=>$.app.tasks),U4=()=>s(($)=>$.app.modelEditorTarget),z4=()=>s(($)=>$.app.sessionSelectorData),O4=()=>s(($)=>$.app.awaitingSecondCtrlC),i1=()=>s(($)=>$.app.actions),y8=()=>s(($)=>$.app.initializationStatus==="ready"),_4=()=>s(($)=>$.app.tasks.length>0),S$=()=>s(($)=>$.config.config?.permissionMode||"default"),N4=()=>s(($)=>$.config.config?.models??KY),R8=()=>s(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),M8=()=>s(($)=>$.config.config?.currentModelId),A0=()=>s(($)=>{return d0.getTheme()}),F4=()=>s(($)=>$.config.config?.theme??"default"),$1=()=>s(($)=>$.focus.currentFocus),H4=()=>s(($)=>$.focus.actions),o1=()=>s(($)=>$.command.isProcessing),W4=()=>s(($)=>$.command.actions),C8=()=>s(($)=>$.command.pendingCommands),L4=()=>s(($)=>$.command.recoveredSteeringCount),I8=()=>s(($)=>$.app.thinkingModeEnabled),T8=()=>s(($)=>$.app.reasoningEffort),f8=()=>s(($)=>$.app.serviceTier),k8=()=>s(($)=>$.app.responseVerbosity),v8=()=>s(($)=>$.app.communicationStyle),B4=()=>s(($)=>$.session.currentThinkingContent),w4=()=>s(($)=>$.session.thinkingExpanded),b4=()=>s(($)=>$.session.currentStreamingMessageId),A4=()=>s(GY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),P4=()=>s(($)=>$.session.finalizingStreamingMessageId),y4=()=>s(($)=>$.session.historyExpanded),R4=()=>s(($)=>$.session.expandedMessageCount);import{useMemoizedFn as h$}from"ahooks";import{useEffect as p2,useRef as u4}from"react";function qY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let G=JSON.parse(J.responseBody)?.error?.message;if(G){let q=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${G}${q}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function UY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function zY($){if(!($ instanceof Error))return!1;let Q=$.message;return Q.includes("can only concatenate str")||Q.includes("image_url")||Q.includes("multimodal")||Q.includes("vision")||Q.includes("does not support images")}function S8($){let Q=UY($),Y=zY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=qY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as OY,mkdirSync as _Y,writeFileSync as NY}from"node:fs";import FY from"node:os";import j2 from"node:path";var M4=null;function HY(){let $=process.env.BLADE_STORAGE_ROOT||j2.join(FY.homedir(),".blade");return j2.join($,"logs","stream-debug.log")}function WY($){if(M4===$)return;let Q=j2.dirname($);_Y(Q,{recursive:!0,mode:493}),NY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
1
+ import{b as uJ,c as lJ,d as dJ}from"./chunk-rhcts0qe.js";import{j as e9,k as $J}from"./chunk-fg1t369y.js";import{r as p8}from"./chunk-65pe5x3a.js";import{$ as g4,F as _$,H as C4,I as I4,L as J8,M as WJ,N as LJ,Q as BJ,R as wJ,W as w6,X as b6,Y as ZY,Z as E4,ba as U6,t as q6,w as s2,x as a2,y as e4,z as YY}from"./chunk-10yas08a.js";import{fa as I9,ga as T9,ha as f9,ka as JY}from"./chunk-b22x3h7k.js";import"./chunk-5dr18jzd.js";import{$a as l4,ib as u2}from"./chunk-a0ga35qv.js";import{tb as X8}from"./chunk-4dnvydyv.js";import{Lb as m4,Tb as k4,Ub as x2,Vb as v4,Xb as D8,dc as Q8,gc as P0}from"./chunk-vbsk6mjn.js";import"./chunk-nwg0bpex.js";import{Ec as cJ}from"./chunk-m3ya6rtr.js";import{Fc as G8,Gc as c8,Ic as T1}from"./chunk-h61xsxmy.js";import"./chunk-xjq1htyt.js";import{$c as b2,Mc as C$,Nc as d0,Oc as s1,Pc as RQ,Qc as D$,Rc as V8,Sc as o6,Tc as uQ,Uc as d9,Vc as n6,Wc as k$,Xc as Q1,Yc as $Y,Zc as r0,_c as pJ,ad as Y8,dd as j4,kd as g0}from"./chunk-wbvs2tv5.js";import"./chunk-v508x7cg.js";import"./chunk-xjqcc0nt.js";import"./chunk-0t0dsepx.js";import{vd as lQ}from"./chunk-763aam58.js";import"./chunk-m27w377p.js";import"./chunk-mmw7jbxg.js";import{Ed as W6,Hd as kJ,Nd as HJ,Td as QY}from"./chunk-rb7aayp5.js";import"./chunk-5xph8r1k.js";import"./chunk-5sw8j9ae.js";import"./chunk-18n15nn8.js";import{fe as IQ,he as U1}from"./chunk-wyq21fev.js";import"./chunk-6pb6zs96.js";import{$e as eJ,Pe as sJ,_e as FJ}from"./chunk-565weg3f.js";import"./chunk-58wxa5cj.js";import"./chunk-r561wfcz.js";import{hf as V$,if as j8,jf as TQ}from"./chunk-0qayfsc9.js";import{nf as x0}from"./chunk-dbb20rxh.js";import{of as tJ,rf as n1}from"./chunk-awwe1rqb.js";import{tf as n9,uf as t9,xf as V1}from"./chunk-7tea6e9y.js";import"./chunk-9tp00s2z.js";import{Jf as g9}from"./chunk-9gtc0kd2.js";import{Kf as sQ}from"./chunk-6vhc5gdf.js";import"./chunk-qdngw7h1.js";import"./chunk-vjrn667c.js";import{Wf as CQ}from"./chunk-86g3xxx7.js";import{useMemoizedFn as k2}from"ahooks";import{useEffect as jX,useState as v2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as q$}from"ink";import{useEffect as U$,useMemo as TX,useRef as I2}from"react";import{useShallow as GY}from"zustand/react/shallow";import{useStore as XY}from"zustand";function s($){return XY(k$,$)}var KY=[],v$=()=>s(($)=>$.session.sessionId),I1=()=>s(($)=>$.session.workspaceRoot),eQ=()=>s(($)=>$.session.messages),$4=()=>s(($)=>$.session.clearCount),Q4=()=>s(($)=>$.session.isCompacting),J4=()=>s(($)=>$.session.tokenUsage.estimatedCostUsd),Y4=()=>s(($)=>$.session.providerRetry),Z4=()=>s(($)=>$.session.providerStall),a1=()=>s(($)=>$.session.actions),X4=()=>s(($)=>{let{inputTokens:Q,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Q/Y*100);return Math.round(J)}),G4=()=>s(($)=>$.app.initializationStatus),K4=()=>s(($)=>$.app.initializationError),P8=()=>s(($)=>$.app.activeModal),q4=()=>s(($)=>$.app.tasks),U4=()=>s(($)=>$.app.modelEditorTarget),z4=()=>s(($)=>$.app.sessionSelectorData),O4=()=>s(($)=>$.app.awaitingSecondCtrlC),i1=()=>s(($)=>$.app.actions),y8=()=>s(($)=>$.app.initializationStatus==="ready"),_4=()=>s(($)=>$.app.tasks.length>0),S$=()=>s(($)=>$.config.config?.permissionMode||"default"),N4=()=>s(($)=>$.config.config?.models??KY),R8=()=>s(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),M8=()=>s(($)=>$.config.config?.currentModelId),A0=()=>s(($)=>{return d0.getTheme()}),F4=()=>s(($)=>$.config.config?.codeTheme??"default"),$1=()=>s(($)=>$.focus.currentFocus),H4=()=>s(($)=>$.focus.actions),o1=()=>s(($)=>$.command.isProcessing),W4=()=>s(($)=>$.command.actions),C8=()=>s(($)=>$.command.pendingCommands),L4=()=>s(($)=>$.command.recoveredSteeringCount),I8=()=>s(($)=>$.app.thinkingModeEnabled),T8=()=>s(($)=>$.app.reasoningEffort),f8=()=>s(($)=>$.app.serviceTier),k8=()=>s(($)=>$.app.responseVerbosity),v8=()=>s(($)=>$.app.communicationStyle),B4=()=>s(($)=>$.session.currentThinkingContent),w4=()=>s(($)=>$.session.thinkingExpanded),b4=()=>s(($)=>$.session.currentStreamingMessageId),A4=()=>s(GY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),P4=()=>s(($)=>$.session.finalizingStreamingMessageId),y4=()=>s(($)=>$.session.historyExpanded),R4=()=>s(($)=>$.session.expandedMessageCount);import{useMemoizedFn as h$}from"ahooks";import{useEffect as p2,useRef as u4}from"react";function qY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let G=JSON.parse(J.responseBody)?.error?.message;if(G){let q=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${G}${q}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function UY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function zY($){if(!($ instanceof Error))return!1;let Q=$.message;return Q.includes("can only concatenate str")||Q.includes("image_url")||Q.includes("multimodal")||Q.includes("vision")||Q.includes("does not support images")}function S8($){let Q=UY($),Y=zY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=qY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as OY,mkdirSync as _Y,writeFileSync as NY}from"node:fs";import FY from"node:os";import j2 from"node:path";var M4=null;function HY(){let $=process.env.BLADE_STORAGE_ROOT||j2.join(FY.homedir(),".blade");return j2.join($,"logs","stream-debug.log")}function WY($){if(M4===$)return;let Q=j2.dirname($);_Y(Q,{recursive:!0,mode:493}),NY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
2
  `),M4=$}function h2($,Q,Y){try{let J=HY();WY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",G=`[${Z}] [${$}] ${Q}${X}
3
3
  `;OY(J,G)}catch{}}var $8=n1("UI");function T4($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,h2("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.setProviderRetry(null),$.sessionActions.setProviderStall(null),$8.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),h2("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(),G=$.getStreamingMessageId();if(G){if(Z)D$(G,Z);V8(G)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"provider_retry":{let{kind:Z,...X}=J;$.sessionActions.setProviderRetry(J.phase==="scheduled"||J.phase==="attempt"?X:null);break}case"provider_stall":{let{kind:Z,...X}=J;$.sessionActions.setProviderStall(J.phase==="detected"?X:null);break}case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===D8)break;if($8.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),G=C4(Z.function.name,X);$.sessionActions.addToolMessage(G,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:G,params:X})}catch(X){$8.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===D8)break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",G=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(G,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:G});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===D8)break;$8.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=I4(Z.function.name,J.result);$.sessionActions.addToolMessage(X.summary,{toolCallId:Z.id,toolName:Z.function.name,phase:"complete",summary:X.summary,detail:X.detail});break}case"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":$8.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),$.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
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(`
@@ -157,4 +157,4 @@ Digest: ${D.currentDigest??"none"}`)}catch(D){N(D instanceof Error?D.message:"Fa
157
157
  `).length}var cQ=K5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=x9(()=>U5($),[$]),X=x9(()=>q5($),[$]),G=J.colors.info,q=J.colors.muted;return p1(pQ,{flexDirection:"column",marginBottom:1,children:[p1(pQ,{flexDirection:"row",children:[p1(a$,{color:G,children:Y?"v":">"},void 0,!1,void 0,this),p1(a$,{children:" "},void 0,!1,void 0,this),p1(a$,{color:q,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&p1(a$,{color:q,children:[" - ",X]},void 0,!0,void 0,this),p1(a$,{color:q,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&p1(pQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:p1(a$,{color:q,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});cQ.displayName="ThinkingBlock";import{jsxDEV as a0}from"react/jsx-dev-runtime";var r9=O5.memo(()=>{let $=eQ(),Q=b4(),Y=A4(),J=P4(),Z=o1(),X=q4(),G=_4(),q=C8(),K=B4(),U=w4(),H=$4(),z=R4(),W=y4(),O=g$(),B=v9(),{stdout:_}=z5(),F=a1(),[M,N]=xQ(null),[v,C]=xQ([]),[w,f]=xQ(new Set),P=J$(W),A=J$(null),T=J$(0),R=J$(0),L=J$(new Set),k=J$(new Set),E=J$([]),t=J$(null);c1(()=>{if(P.current!==W){if(k1())m1();if(_)_.write(L2.clearTerminal);F.incrementClearCount(),P.current=W}},[W,_,F]);let u=$,a=J;c1(()=>{if(!J||Z){t.current=null;return}if(t.current===J)return;if(t.current=J,k1())m1();if(_)_.write(L2.eraseScreen+L2.cursorTo(0,0));L.current=new Set,k.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),A.current=null,T.current=0,R.current=0,E.current=[],C([]),f(new Set),F.incrementClearCount(),F.clearFinalizingStreamingMessageId()},[J,Z,_,F,u]);let I=Q??J;c1(()=>{if(k1())m1();A.current=null,T.current=0,R.current=0,L.current=new Set,k.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),E.current=[],C([]),f(new Set)},[H]),c1(()=>{if(!I)return;if(A.current===I)return;A.current=I,T.current=0,R.current=0,k.current=new Set(u.filter((S)=>S.role==="tool").map((S)=>S.id)),E.current=[],C([])},[I,u]),c1(()=>{if(!I)return;let S=uQ(I);if(!S||S.length<=T.current)return;let x=S.slice(T.current);T.current=S.length;let V=x,l=E.current;if(l.length>0)if(V.some((B0)=>B0.type!=="empty"))V=[...l,...V],E.current=[];else{E.current=[...l,...V];return}let K0=V.length;while(K0>0&&V[K0-1].type==="empty")K0-=1;if(K0!==V.length)E.current=V.slice(K0),V=V.slice(0,K0);if(V.length===0)return;let Z0=R.current;R.current+=1;let y0=Z0>0;if(k1())m1();f((B0)=>{if(!I||B0.has(I))return B0;let s0=new Set(B0);return s0.add(I),s0}),C((B0)=>[...B0,a0(Q$,{flexDirection:"column",children:a0(e1,{content:"",role:"assistant",terminalWidth:O,isPending:!1,hidePrefix:y0,noMargin:!0,blocksOverride:V,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${Z0}`,!1,void 0,this)])},[I,Y.version,O,H]),c1(()=>{if(!I)return;let S=k.current,x=u.filter((V)=>V.role==="tool"&&!S.has(V.id)&&!L.current.has(V.id));if(x.length===0)return;if(k1())m1();for(let V of x)L.current.add(V.id);C((V)=>[...V,...x.map((l)=>a0(Q$,{flexDirection:"column",children:a0(e1,{content:l.content,role:l.role,terminalWidth:O,metadata:l.metadata,isPending:!1,messageId:l.id},void 0,!1,void 0,this)},`streaming-tool-${l.id}`,!1,void 0,this))])},[I,u,O]),c1(()=>{if(!I){if(k1())m1();return}if(!k1())V9(O,B);else j9(O,B);let S=d9(I);if(!S||S.lines.length===0)return;let V=Math.max(1,B-8),l=Math.max(0,S.lines.length-V),K0=S.lines.slice(-V),Z0=(uQ(I)?.length??0)>0;h9(K0,l,S.mode,Z0)},[I,Y.version,B,O]),c1(()=>{if(!I&&k1())m1()},[I]),c1(()=>{if(M===null&&u.length>z){if(N(u.length),k1())m1();if(_)_.write(L2.clearTerminal);F.incrementClearCount()}},[u.length,z,M,_,F]);let y=l9(()=>{return X.some((S)=>S.status==="pending"||S.status==="in_progress")},[X]),D=W?0:M??0,b=D,h=l9(()=>{let S=[];if(S.push(a0(m9,{},"header",!1,void 0,this)),b>0)S.push(a0(gQ,{collapsedCount:b},"collapsed-summary",!1,void 0,this));for(let x=D;x<u.length;x++){let V=u[x];if(a&&V.id===a)continue;if(V.role==="tool"&&L.current.has(V.id))continue;if(V.role==="assistant"&&w.has(V.id))continue;S.push(a0(Q$,{flexDirection:"column",children:a0(e1,{content:V.content,role:V.role,terminalWidth:O,metadata:V.metadata,isPending:!1,messageId:V.id},void 0,!1,void 0,this)},V.id,!1,void 0,this))}return S},[u,D,b,O,a,w]);return a0(Q$,{flexDirection:"column",paddingX:2,children:a0(Q$,{flexDirection:"column",children:[a0(u9,{items:h,children:(S)=>S},H,!1,void 0,this),K&&a0(Q$,{marginBottom:1,children:a0(cQ,{content:K,isStreaming:Z,isExpanded:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),v.length>0&&a0(u9,{items:v,children:(S)=>S},`streaming-${H}`,!1,void 0,this),G&&y&&a0(Q$,{marginTop:1,children:a0(c9,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.map((S,x)=>a0(Q$,{flexDirection:"column",children:a0(e1,{content:S.displayText,role:"user",terminalWidth:O},void 0,!1,void 0,this)},`pending-${x}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as B2,useMount as _5}from"ahooks";import{Box as B1,Text as H0,useFocus as N5,useFocusManager as F5,useInput as H5}from"ink";import W5 from"ink-select-input";import{memo as L5,useMemo as B5,useState as w2}from"react";import{jsxDEV as e,Fragment as A5}from"react/jsx-dev-runtime";var w5=({isSelected:$})=>e(B1,{marginRight:1,children:e(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),b5=({isSelected:$,label:Q})=>e(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),a9=L5(({onClose:$,onEdit:Q})=>{let Y=N4(),J=M8()??"",{isFocused:Z}=N5({id:"model-selector"}),X=F5(),[G,q]=w2(""),[K,U]=w2(!1),[H,z]=w2(null),W=v0(!1),[O]=w2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});_5(()=>{if(X?.focus("model-selector"),Y.length>0)q(Y[0].id)}),H5((P,A)=>{if(K)return;if(A.ctrl&&P==="c"||A.meta&&P==="c"){W();return}if(A.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){_();return}if((P==="e"||P==="E")&&Q)F()},{isActive:!0});let B=B2(async(P)=>{if(K)return;let A=P.value;if(A===J){$();return}U(!0),z(null);try{await g0().setCurrentModel(A),$()}catch(T){z(T.message),U(!1)}}),_=B2(async()=>{if(K||G===J)return;U(!0),z(null);try{if(await g0().removeModel(G),Y.length<=1)$()}catch(P){z(P.message)}finally{U(!1)}}),F=B2(()=>{if(K||!Q)return;let P=Y.find((A)=>A.id===G);if(!P)return;Q(P)}),M=B2((P)=>{q(P.value)}),N=B5(()=>{return Y.find((P)=>P.id===G)},[Y,G]),v=N?b2()?.modelProviders[N.provider]:void 0,C=Y.map((P)=>{let A=P.id===J?" (当前)":"";return{label:lQ(P)+A,value:P.id}}),w=G===J;return e(B1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[e(B1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[e(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),e(H0,{dimColor:!0,children:[K?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(B1,{flexDirection:"row",children:[e(B1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),e(B1,{marginTop:1,children:e(W5,{items:C,onSelect:B,onHighlight:M,indicatorComponent:w5,itemComponent:b5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(B1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),e(B1,{marginY:1,children:e(H0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N?e(B1,{flexDirection:"column",children:[e(H0,{children:[e(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),e(H0,{bold:!0,color:"cyan",children:lQ(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:v?.name??N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v&&e(A5,{children:[e(H0,{children:[e(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),e(H0,{children:N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),e(H0,{children:v.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:v.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:N.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.overrides?.baseUrl&&e(H0,{children:[e(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:N.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),e(H0,{children:V1().resolveConfig(N).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):e(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H&&e(B1,{marginTop:1,children:e(H0,{color:"red",children:H},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(B1,{justifyContent:"center",marginTop:1,children:e(H0,{dimColor:!0,children:"─".repeat(O)},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(B1,{justifyContent:"center",children:e(H0,{dimColor:!0,children:"提示:D=删除 * E=编辑 * Up/Down=移动 * Enter/ESC=确认"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as dQ}from"ahooks";import{Box as x5,Text as rQ,useInput as u5}from"ink";import{useState as R$}from"react";import{Box as P$,Text as x1,useInput as P5}from"ink";import y5 from"ink-text-input";import{jsxDEV as o0}from"react/jsx-dev-runtime";var i9=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return P5((G,q)=>{if(q.escape)Z()}),o0(P$,{flexDirection:"column",children:[o0(P$,{marginBottom:1,children:o0(x1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(x1,{children:["Provider: ",o0(x1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(x1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{children:[o0(x1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),o0(y5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&o0(P$,{marginTop:1,children:o0(x1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginTop:1,children:o0(x1,{dimColor:!0,children:["输入完成后按 ",o0(x1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",o0(x1,{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 A2,Text as Y$,useInput as R5}from"ink";import M5 from"ink-text-input";import{useState as P2}from"react";import{jsxDEV as O1}from"react/jsx-dev-runtime";var y2=["id","name","baseUrl","model"];function o9($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function C5($,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 I5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=t9(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 s9=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,G]=P2(Q?3:0),[q,K]=P2(Q?.model??""),[U,H]=P2(Z),[z,W]=P2(),O=y2[X];R5((_,F)=>{if(!F.escape)return;if(W(void 0),X===0){J();return}let M=X-1,N=y2[M];G(M),K(U[N])});let B=(_)=>{let F=_.trim();if(O==="id"&&!n9.test(F)){W("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(O==="baseUrl")try{let N=new URL(F);if(!["http:","https:"].includes(N.protocol))throw Error()}catch{W("Base URL 必须是绝对 HTTP(S) URL");return}if(O==="model"&&!F){W("Model ID 不能为空");return}let M={...U,[O]:O==="name"&&!F?U.id:F};if(H(M),W(void 0),X===y2.length-1){try{Y(I5(M,$))}catch(N){W(N instanceof Error?N.message:"渠道配置无效")}return}G(X+1),K("")};return O1(A2,{flexDirection:"column",children:[O1(A2,{marginBottom:1,children:O1(Y$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O1(Y$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),y2.slice(0,X).map((_)=>O1(Y$,{children:[o9(_),": ",O1(Y$,{color:"cyan",children:U[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),O1(A2,{marginTop:1,children:[O1(Y$,{bold:!0,children:[o9(O),": "]},void 0,!0,void 0,this),O1(M5,{value:q,onChange:(_)=>{K(_),W(void 0)},onSubmit:B,placeholder:C5(O,$,U.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O==="name"&&O1(Y$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),z&&O1(Y$,{color:"red",children:z},void 0,!1,void 0,this),O1(A2,{marginTop:1,children:O1(Y$,{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 QJ,useState as i$}from"react";var JJ=()=>{let[$,Q]=i$([]),[Y,J]=i$(!0),[Z,X]=i$(null);return QJ(()=>{(async()=>{try{Q(await e9())}catch(q){X(q instanceof Error?q.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},YJ=($)=>{let[Q,Y]=i$([]),[J,Z]=i$(!1),[X,G]=i$(null);return QJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),G(null);try{Y(await $J($))}catch(K){G(K instanceof Error?K.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as u1,Text as M1,useInput as T5}from"ink";import f5 from"ink-select-input";import k5 from"ink-text-input";import{useMemo as ZJ,useState as v5}from"react";import{jsxDEV as h0,Fragment as j5}from"react/jsx-dev-runtime";var S5=({isSelected:$})=>h0(u1,{marginRight:1,children:h0(M1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),D5=($)=>{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(" ")},V5=({isSelected:$,label:Q})=>h0(M1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),XJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[G,q]=v5("");T5((H,z)=>{if(z.escape)if(G)q("");else X()});let K=ZJ(()=>{if(!G)return Q;let H=G.toLowerCase();return Q.filter((z)=>z.name.toLowerCase().includes(H)||z.id.toLowerCase().includes(H))},[Q,G]),U=ZJ(()=>K.map((H)=>({key:H.id,label:D5(H),value:H})),[K]);if(Y)return h0(u1,{flexDirection:"column",children:h0(M1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return h0(u1,{flexDirection:"column",children:[h0(M1,{color:"red",children:J},void 0,!1,void 0,this),h0(M1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return h0(u1,{flexDirection:"column",children:[h0(u1,{marginBottom:1,children:h0(M1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(u1,{marginBottom:1,children:h0(M1,{children:["Provider: ",h0(M1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),h0(j5,{children:[h0(u1,{marginBottom:1,children:[h0(M1,{color:"cyan",children:"> "},void 0,!1,void 0,this),h0(k5,{value:G,onChange:q,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h0(u1,{marginBottom:1,children:h0(M1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(u1,{flexDirection:"column",height:12,children:h0(f5,{items:U,onSelect:(H)=>Z(H.value),indicatorComponent:S5,itemComponent:V5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&h0(M1,{color:"yellow",children:"内置 catalog 中没有匹配模型"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as y$,Text as Z$,useInput as h5}from"ink";import E5 from"ink-select-input";import g5 from"ink-text-input";import{useMemo as GJ,useState as m5}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var p5=({isSelected:$})=>n0(y$,{marginRight:1,children:n0(Z$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c5=({isSelected:$,label:Q})=>n0(Z$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),KJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,G]=m5("");h5((U,H)=>{if(H.escape)if(X)G("");else Z()});let q=GJ(()=>{if(!X)return $;let U=X.toLowerCase();return $.filter((H)=>H.name.toLowerCase().includes(U)||H.id.toLowerCase().includes(U))},[$,X]),K=GJ(()=>q.map((U)=>({key:U.id,label:`${U.name} - ${U.modelCount} models${U.configured?" [configured]":""}`,value:U})),[q]);if(Q)return n0(y$,{flexDirection:"column",children:n0(Z$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(y$,{flexDirection:"column",children:[n0(Z$,{color:"red",children:Y},void 0,!1,void 0,this),n0(Z$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(y$,{flexDirection:"column",children:[n0(y$,{marginBottom:1,children:n0(Z$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(y$,{marginBottom:1,children:[n0(Z$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(g5,{value:X,onChange:G,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(y$,{flexDirection:"column",height:12,children:n0(E5,{items:K,onSelect:(U)=>J(U.value),indicatorComponent:p5,itemComponent:c5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.length===0&&n0(Z$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function qJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as X$}from"react/jsx-dev-runtime";var aQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,G]=R$("provider"),[q,K]=R$(),[U,H]=R$(),[z,W]=R$(),[O,B]=R$(""),[_,F]=R$(),[M,N]=R$(!1),v=JJ(),C=YJ(q?.id),w=v0(!1);u5((T,R)=>{if(R.ctrl&&T==="c"||R.meta&&T==="c")$==="setup"?w():Z()});let f=dQ(async(T)=>{if(!q)return;let R=z??(U?{provider:q.id,model:U.id,displayName:Q?.displayName}:void 0);if(!R)return;N(!0),F(void 0);try{if(R.modelProvider)V1().registerModelProvider(R.provider,R.modelProvider,[R.model]);if(T?.trim())await V1().setApiKey(R.provider,T.trim());let L={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 g0().addModelWithProvider(L,R.modelProvider):await g0().addModel(L);await g0().setCurrentModel(k.id),await J(R)}else if(Y){if(R.modelProvider)await g0().updateModelWithProvider(Y,L,R.modelProvider);else await g0().updateModel(Y,L);await J(R)}}catch(L){if(R.modelProvider){await V1().credentials.delete(R.provider);let k=b2();V1().configureModelProviders(k?.modelProviders??{},k?.models??[])}F(L instanceof Error?L.message:"保存配置失败"),N(!1)}}),P=dQ((T)=>{if(H(T),q?.configured)f();else if(q?.supportsApiKey)G("credential");else F(`${q?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),A=dQ(()=>{if(F(void 0),X==="credential"&&z){G("custom");return}let T=qJ(X);if(T)G(T)});return X$(x5,{flexDirection:"column",padding:1,children:[X$(rQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&X$(KJ,{...v,onSelect:(T)=>{K(T),H(void 0),W(void 0),G(T.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&q?.factoryWireApi&&X$(s9,{wireApi:q.factoryWireApi,initialConfig:z,onSubmit:(T)=>{W(T),G("credential")},onCancel:A},void 0,!1,void 0,this),X==="model"&&q&&X$(XJ,{provider:q,...C,onSelect:P,onCancel:A},void 0,!1,void 0,this),X==="credential"&&q&&X$(i9,{provider:q,value:O,onChange:B,onSubmit:()=>void f(O),onCancel:A,error:_},void 0,!1,void 0,this),M&&X$(rQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&X$(rQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as F8}from"ahooks";import{promises as _J}from"fs";import{Box as _1,Text as V0,useInput as l5}from"ink";import UJ from"ink-select-input";import d5 from"ink-text-input";import r5 from"os";import R2 from"path";import{useEffect as a5,useMemo as M2,useRef as i5,useState as G$}from"react";import{jsxDEV as U0}from"react/jsx-dev-runtime";var H8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],o5={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},n5={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},zJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},t5=["project","global","local"],s5={allow:[],ask:[],deny:[]},e5={localExists:!1,projectExists:!1,globalExists:!1},OJ={allow:[],ask:[],deny:[]};function $X($){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 QX($){try{let Q=await _J.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:$X(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...OJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...OJ}}}}function JX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${zJ[Q]} <- 可删除`:zJ[Q];return`${Y} ${J}`}var NJ=({onClose:$})=>{let Y=$1()==="permissions-manager",J=v0(!1),[Z,X]=G$(0),G=H8[Z].key,[q,K]=G$(s5),[U,H]=G$(e5),[z,W]=G$(!0),[O,B]=G$("list"),[_,F]=G$(""),[M,N]=G$(null),[v,C]=G$(null),w=i5(!1),f=M2(()=>R2.join(x0(),".blade","settings.local.json"),[]),P=M2(()=>R2.join(x0(),".blade","settings.json"),[]),A=M2(()=>R2.join(r5.homedir(),".blade","settings.json"),[]),T=F8(async()=>{W(!0);let x=await Promise.all([{source:"local",path:f},{source:"project",path:P},{source:"global",path:A}].map(async({source:Z0,path:y0})=>{let B0=await QX(y0);return{source:Z0,path:y0,...B0}})),V={localExists:x.find((Z0)=>Z0.source==="local")?.exists??!1,projectExists:x.find((Z0)=>Z0.source==="project")?.exists??!1,globalExists:x.find((Z0)=>Z0.source==="global")?.exists??!1};H(V);let l={allow:[],ask:[],deny:[]},K0=Object.fromEntries(x.map((Z0)=>[Z0.source,Z0]));["allow","ask","deny"].forEach((Z0)=>{t5.forEach((y0)=>{(K0[y0]?.permissions[Z0]??[]).forEach((s0,p0)=>{let F1={key:`${y0}:${p0}:${s0}`,rule:s0,source:y0};l[Z0].push(F1)})})}),K(l),W(!1)});a5(()=>{T()},[T]);let R=F8(async(S,x)=>{try{let V=R2.join(x0(),".blade","settings.local.json"),l={allow:[],ask:[],deny:[]};try{let Z0=await _J.readFile(V,"utf-8"),B0=JSON.parse(Z0).permissions||{};l={allow:Array.isArray(B0.allow)?B0.allow:[],ask:Array.isArray(B0.ask)?B0.ask:[],deny:Array.isArray(B0.deny)?B0.deny:[]}}catch(Z0){}let K0=x(l);await g0().updateConfig({permissions:K0},{scope:"local",immediate:!0}),await T()}catch(V){throw console.error("[PermissionsManager] 修改权限规则失败:",V),V}});l5((S,x)=>{if(x.ctrl&&S==="c"||x.meta&&S==="c"){J();return}if(O==="locked"){if(w.current){w.current=!1;return}B("list"),N(null),C(null);return}if(x.escape){if(O==="list"||G==="info")$();else B("list"),F(""),N(null),C(null);return}if(O==="list"){if(x.tab&&x.shift)X((V)=>(V-1+H8.length)%H8.length);else if(x.tab)X((V)=>(V+1)%H8.length);else if(S?.toLowerCase()==="q")$()}},{isActive:Y});let L=F8((S)=>{let x=S.value;if(G==="info")return;if(x.type==="add"){B("add"),F(""),C(null);return}if(x.entry.source!=="local"){B("locked"),w.current=!0,N({tab:G,entry:x.entry}),C({type:"error",text:x.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}B("confirm-delete"),N({tab:G,entry:x.entry}),C(null)}),k=F8(async()=>{if(G==="info")return;let S=_.trim();if(!S){C({type:"error",text:"Permission rule 不能为空"});return}if(q[G].map((V)=>V.rule).includes(S)){C({type:"error",text:"该规则已存在"});return}try{await R(G,(V)=>{let l={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return l[G]=[...new Set([...V[G],S])],l}),B("list"),F(""),C({type:"success",text:"已添加本地权限规则"})}catch(V){C({type:"error",text:`保存失败: ${V instanceof Error?V.message:"未知错误"}`})}}),E=F8(async()=>{if(!M)return;let{tab:S,entry:x}=M;try{await R(S,(V)=>{let l={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return l[S]=V[S].filter((K0)=>K0!==x.rule),l}),B("list"),N(null),C({type:"success",text:"已删除本地权限规则"})}catch(V){C({type:"error",text:`删除失败: ${V instanceof Error?V.message:"未知错误"}`})}}),t=M2(()=>{if(G==="info")return[];let S=G;return[{key:"add-new-rule",label:`› ${o5[S]}`,value:{type:"add"}},...q[S].map((V)=>({key:V.key,label:JX(V.rule,V.source),value:{type:"rule",entry:V}}))]},[G,q]),u=()=>U0(_1,{marginBottom:1,children:H8.map((S,x)=>U0(_1,{marginRight:2,children:U0(V0,{color:x===Z?"yellow":"gray",children:["[",S.label,"]"]},void 0,!0,void 0,this)},S.key,!1,void 0,this))},void 0,!1,void 0,this),a=()=>U0(_1,{flexDirection:"column",gap:1,children:[U0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),U0(_1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",U.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",U.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",U.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U0(V0,{children:"说明:"},void 0,!1,void 0,this),U0(_1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),U0(V0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),U0(V0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),I=(S)=>U0(_1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:n5[S]},void 0,!1,void 0,this),U0(V0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),U0(_1,{marginTop:1,children:U0(d5,{value:_,onChange:F,onSubmit:k},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y=(S,x)=>U0(_1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:["Delete ",S," permission rule?"]},void 0,!0,void 0,this),U0(V0,{children:x.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),U0(V0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),U0(UJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(V)=>{if(V.value==="yes")E();else B("list"),N(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D=(S)=>U0(_1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),U0(V0,{children:S.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:S.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b=(S)=>U0(UJ,{items:t,isFocused:O==="list",onSelect:L},void 0,!1,void 0,this),h=()=>{if(z)return U0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(G==="info")return a();if(O==="add")return I(G);if(O==="confirm-delete"&&M)return y(M.tab,M.entry);if(O==="locked"&&M)return D(M.entry);return b(G)};return U0(_1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[U0(V0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),u(),U0(_1,{flexDirection:"column",gap:1,children:h()},void 0,!1,void 0,this),v&&U0(_1,{marginTop:1,children:U0(V0,{color:v.type==="success"?"green":"red",children:v.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(_1,{marginTop:1,children:U0(V0,{color:"gray",children:"Tab 切换视图 · Esc 关闭 · Q 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as w0,Text as J0,useInput as YX}from"ink";import{useEffect as ZX,useState as M$}from"react";import{jsxDEV as p}from"react/jsx-dev-runtime";var iQ=["local","project","global"];function bJ({workspaceRoot:$,onCancel:Q}){let Y=HJ($),J=Y.getAll(),[Z,X]=M$(0),[G,q]=M$(!1),[K,U]=M$(""),[H,z]=M$(null),[W,O]=M$("local"),[B,_]=M$(null),[F,M]=M$(0),N=Y.getBySource(),v=Y.getStats(),C=Y.getSourcePolicy(),w=v0(!1,Q);ZX(()=>{let L=!0;return FJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((k)=>{if(L)_(k.settings)}).catch((k)=>{if(L)U(k instanceof Error?k.message:"无法读取插件作用域配置")}),()=>{L=!1}},[Y,F]);let f=()=>{O((L)=>{let k=iQ.indexOf(L);return iQ[(k+1)%iQ.length]}),z(null)},P=async()=>{let L=J[Z];if(!L||G)return;if(L.source==="cli"){U(`${L.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(L.status==="error"){U(L.error??`${L.manifest.name} 当前不可用`);return}q(!0),U("");try{let k=await WJ(Y.getWorkspaceRoot(),L.manifest.name,L.status!=="active",W);U(k.effectiveEnabled?`已启用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`:`已禁用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`),M((E)=>E+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}},A=async()=>{if(G)return;q(!0),U("");try{await LJ(Y.getWorkspaceRoot()),X(0),U("插件列表已刷新"),M((L)=>L+1)}catch(L){U(L instanceof Error?L.message:String(L))}finally{q(!1)}},T=async()=>{let L=J[Z];if(!L||G)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}q(!0),z(null),U("");try{let{result:k}=await BJ(Y.getWorkspaceRoot(),L.manifest.name,{trusted:!0});if(!k.success)throw Error(k.error);U(k.changed?`已更新 ${L.manifest.name} 到 ${k.installation?.revision}`:`${L.manifest.name} 已是最新版本`),M((E)=>E+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}},R=async()=>{let L=J[Z];if(!L||G)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(H!==L.manifest.name){z(L.manifest.name),U(`再次按 x 确认卸载 ${L.manifest.name}`);return}q(!0),U("");try{let{result:k}=await wJ(Y.getWorkspaceRoot(),L.manifest.name,!0);if(!k.success)throw Error(k.error);z(null),X(0),U(`已卸载 ${L.manifest.name}`),M((E)=>E+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}};if(YX((L,k)=>{if(k.escape)Q?.();else if(k.ctrl&&L==="c"||k.meta&&L==="c")w();else if((k.upArrow||L==="k")&&J.length>0)z(null),X((E)=>(E-1+J.length)%J.length);else if((k.downArrow||L==="j")&&J.length>0)z(null),X((E)=>(E+1)%J.length);else if(L===" "||k.return)P();else if(L==="r")A();else if(L==="s")f();else if(L==="u")T();else if(L==="x")R()}),J.length===0)return p(w0,{flexDirection:"column",paddingY:1,children:[p(w0,{marginBottom:1,children:p(J0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[p(J0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{marginTop:1,paddingLeft:2,children:p(J0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{marginTop:1,children:p(J0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return p(w0,{flexDirection:"column",paddingY:1,children:[p(w0,{marginBottom:1,children:[p(J0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),p(J0,{color:"gray",children:[" (共 ",v.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,marginBottom:1,children:p(J0,{color:"gray",children:["启用: ",v.active," | 禁用: ",v.inactive," | 命令: ",v.commands," | 技能:"," ",v.skills," | 代理: ",v.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,marginBottom:1,children:p(J0,{color:"gray",children:["来源策略: ",C.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",C.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,marginBottom:1,children:p(J0,{color:"gray",children:["写入层级: ",p(J0,{color:"cyan",children:W},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),N.cli.length>0&&p(w0,{flexDirection:"column",marginBottom:1,children:[p(w0,{paddingLeft:1,children:[p(J0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),p(J0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.cli.map((L)=>{let k=L.status==="active"?"[on]":"[off]",E=J.indexOf(L)===Z;return p(w0,{flexDirection:"column",paddingLeft:2,children:[p(J0,{children:[p(J0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),p(J0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&p(w0,{paddingLeft:2,children:p(J0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.project.length>0&&p(w0,{flexDirection:"column",marginBottom:1,children:[p(w0,{paddingLeft:1,children:[p(J0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),p(J0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.project.map((L)=>{let k=L.status==="active"?"[on]":"[off]",E=J.indexOf(L)===Z;return p(w0,{flexDirection:"column",paddingLeft:2,children:[p(J0,{children:[p(J0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),p(J0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&p(w0,{paddingLeft:2,children:p(J0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.user.length>0&&p(w0,{flexDirection:"column",marginBottom:1,children:[p(w0,{paddingLeft:1,children:[p(J0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),p(J0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.user.map((L)=>{let k=L.status==="active"?"[on]":"[off]",E=J.indexOf(L)===Z;return p(w0,{flexDirection:"column",paddingLeft:2,children:[p(J0,{children:[p(J0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),p(J0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),p(w0,{paddingLeft:2,children:p(J0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&p(w0,{paddingLeft:2,children:p(J0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),p(w0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[p(J0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),p(J0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),p(w0,{marginTop:1,children:p(J0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&p(w0,{marginTop:1,children:p(J0,{color:K.includes("失败")?"red":"cyan",children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&p(J0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as Y1,Text as Z1,useInput as AJ,useStdout as XX}from"ink";import GX from"ink-text-input";import oQ,{useCallback as W8,useMemo as KX,useState as K$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var qX=oQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>W0(Y1,{flexDirection:"column",marginBottom:1,children:[W0(Z1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),W0(Y1,{marginLeft:4,children:W0(Z1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),UX=oQ.memo(({questions:$,answers:Q})=>W0(Y1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return W0(Y1,{marginBottom:1,children:[W0(Z1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),W0(Z1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),PJ=oQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=XX(),Z=J.columns||80,G=$1()==="confirmation-prompt",q=v0(!1),[K,U]=K$("answering"),[H,z]=K$(0),[W,O]=K$({}),[B,_]=K$(0),[F,M]=K$([]),[N,v]=K$(!1),[C,w]=K$(""),[f,P]=K$(0),A=$[H],T=KX(()=>{if(!A)return[];return[...A.options.map((u)=>({label:u.label,value:u.label,description:u.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[A]),R=W8((u)=>{let a={...W,[A.header]:u};if(O(a),H<$.length-1)z(H+1),_(0),M([]),v(!1),w("");else U("submit"),P(0)},[W,A?.header,H,$.length]),L=W8((u)=>{let a=T[u];if(!a)return;if(a.value==="__other__"){v(!0);return}if(A.multiSelect)M((I)=>I.includes(a.value)?I.filter((y)=>y!==a.value):[...I,a.value]);else R(a.value)},[T,A?.multiSelect,R]),k=W8((u)=>{if(u.trim())R(u.trim())},[R]),E=W8(()=>{U("answering"),z(0),_(0),M([]),v(!1)},[]),t=W8(()=>{Q(W)},[W,Q]);if(AJ((u,a)=>{if(a.ctrl&&u==="c"||a.meta&&u==="c"){q();return}if(N){if(a.escape)v(!1),w("");return}if(a.escape){Y();return}let I=parseInt(u);if(I>=1&&I<=T.length){L(I-1);return}if(a.upArrow){_((y)=>y>0?y-1:T.length-1);return}if(a.downArrow||a.tab){_((y)=>y<T.length-1?y+1:0);return}if(a.return){if(A.multiSelect&&F.length>0)R(F);else L(B);return}if(u===" "&&A.multiSelect){let y=T[B];if(y&&y.value!=="__other__")M((D)=>D.includes(y.value)?D.filter((b)=>b!==y.value):[...D,y.value]);return}},{isActive:G&&K==="answering"&&!N}),AJ((u,a)=>{if(a.ctrl&&u==="c"||a.meta&&u==="c"){q();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){P((I)=>I===0?1:0);return}if(a.return){if(f===0)t();else E();return}if(u.toLowerCase()==="y"){t();return}if(u.toLowerCase()==="e"){E();return}},{isActive:G&&K==="submit"}),K==="submit")return W0(Y1,{flexDirection:"column",borderStyle:"round",borderColor:G?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(Y1,{marginBottom:1,children:W0(Z1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W0(UX,{questions:$,answers:W},void 0,!1,void 0,this),W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:f===0?"yellow":void 0,bold:f===0,children:[f===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Z1,{color:f===1?"yellow":void 0,bold:f===1,children:[f===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(Y1,{marginTop:1,children:W0(Z1,{color:"gray",children:"Enter to confirm · Up/Down to navigate · Y/E for quick select"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!A)return null;return W0(Y1,{flexDirection:"column",borderStyle:"round",borderColor:G?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(Y1,{marginBottom:1,children:[W0(Z1,{backgroundColor:"blue",color:"white",children:[" ",A.header," "]},void 0,!0,void 0,this),W0(Z1,{children:[" ",A.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N?W0(Y1,{flexDirection:"column",marginTop:1,children:[W0(Z1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),W0(Y1,{marginTop:1,children:[W0(Z1,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0(GX,{value:C,onChange:w,onSubmit:k,focus:G},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(Y1,{marginTop:1,children:W0(Z1,{color:"gray",children:"(Press Enter to submit, ESC to go back)"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):W0(Y1,{flexDirection:"column",children:T.map((u,a)=>W0(qX,{option:u,index:a,isSelected:F.includes(u.value),isMultiSelect:A.multiSelect,isHighlighted:B===a},u.value,!1,void 0,this))},void 0,!1,void 0,this),!N&&W0(Y1,{marginTop:1,flexDirection:"column",children:[W0(Z1,{color:"gray",children:A.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),A.multiSelect&&F.length>0&&W0(Z1,{color:"green",children:["Selected: ",F.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&W0(Y1,{marginTop:1,children:W0(Z1,{color:"gray",children:["Question ",H+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as zX}from"node:path";import{Box as n$,Text as w1,useInput as OX}from"ink";import _X from"ink-select-input";import{useEffect as nQ,useMemo as o$,useRef as TJ,useState as C2}from"react";function yJ($){return`${$.projectPath}\x00${$.sessionId}`}function RJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function MJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function CJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function IJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as u0}from"react/jsx-dev-runtime";function NX($){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 FX($){return zX($)}function HX($){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 WX=({isSelected:$})=>u0(n$,{marginRight:1,children:u0(w1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),LX=({isSelected:$,label:Q})=>u0(w1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),L8=20,fJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=C2([]),[G,q]=C2(!1),[K,U]=C2(0),[H,z]=C2(!1),W=TJ(!1),O=TJ(!0);nQ(()=>{return O.current=!0,()=>{O.current=!1}},[]);let _=$1()==="session-selector",F=v0(!1);OX((A,T)=>{if(T.ctrl&&A==="c"||T.meta&&A==="c"){F();return}if(W.current)return;if(T.escape&&J){J();return}if(T.leftArrow||A==="h"||A==="H"){if(K>0)U((R)=>R-1);return}if(T.rightArrow||A==="l"||A==="L"){if(K<C-1)U((R)=>R+1);return}},{isActive:_}),nQ(()=>{if(Q){X(Q);return}(async()=>{q(!0);try{let T=await P0.listSessions({includeSubagents:!1});X(T)}catch(T){console.error("[SessionSelector] Failed to load sessions:",T),X([])}finally{q(!1)}})()},[Q]);let M=o$(()=>CJ(Q||Z,$),[$,Q,Z]),N=o$(()=>IJ($),[$]),v=o$(()=>{return M.map((A)=>{let T=FX(A.taskSourceProjectPath??A.projectPath),R=NX(A.lastMessageTime),L=RJ(A),k=`[${HX(A.taskStatus)}]`,E=A.gitBranch?` (${A.gitBranch})`:"",t=A.hasErrors?" [!]":"",u=A.taskRetriedFrom?` ↻ retry:${A.taskRetriedFrom.sessionId.slice(0,6)}`:A.relationType==="subagent"?" ↳ subagent":A.relationType==="fork"?" ↳ fork":"",a=A.taskIsolation==="worktree"?` | wt:${A.taskWorktreeBranch??"managed"}`:A.taskIsolation==="local"?" | local":"",I=A.taskDiffStat?` | ${A.taskDiffStat.changedFiles} files +${A.taskDiffStat.additions} -${A.taskDiffStat.deletions}`:"",y=A.taskStatus==="queued"&&A.taskQueuePosition?` | queue:${A.taskQueuePosition}/${A.taskQueueDepth??A.taskQueuePosition}`:"",D=MJ(A);return{key:yJ(A),label:`${k} ${L} · ${R} | ${T}${E} | ${A.messageCount} 条消息${a}${y}${I}${D}${t}${u}`,value:A}})},[M]),C=o$(()=>Math.max(1,Math.ceil(v.length/L8)),[v.length]),w=o$(()=>{let A=K*L8;return v.slice(A,A+L8)},[v,K]),f=o$(()=>({start:K*L8+1,end:Math.min((K+1)*L8,v.length)}),[K,v.length]);nQ(()=>{U(0)},[M.length]);let P=(A)=>{if(W.current)return;W.current=!0,z(!0);let T=()=>{if(!O.current)return;W.current=!1,z(!1)};Promise.resolve().then(()=>Y(A.value)).then(T,T)};if(G)return u0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:u0(w1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(M.length===0)return u0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[u0(w1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),u0(w1,{dimColor:!0,children:[`
158
158
  `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return u0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[u0(w1,{bold:!0,color:"cyan",children:N.title},void 0,!1,void 0,this),u0(w1,{dimColor:!0,children:[`
159
159
  `,N.instructions,`
160
- `]},void 0,!0,void 0,this),u0(_X,{items:w,onSelect:P,isFocused:_&&!H,indicatorComponent:WX,itemComponent:LX},void 0,!1,void 0,this),H&&u0(w1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),u0(n$,{marginTop:1,flexDirection:"column",children:[u0(w1,{dimColor:!0,children:["第 ",K+1,"/",C," 页 · 共 ",M.length," 个会话 · 显示"," ",f.start,"-",f.end]},void 0,!0,void 0,this),C>1&&u0(n$,{marginTop:1,children:[u0(w1,{color:K>0?"cyan":"gray",children:K>0?"<< 上一页":" "},void 0,!1,void 0,this),u0(w1,{children:" "},void 0,!1,void 0,this),u0(w1,{color:K<C-1?"cyan":"gray",children:K<C-1?"下一页 >>":""},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as m0,Text as T0,useInput as BX}from"ink";import{jsxDEV as $0}from"react/jsx-dev-runtime";function vJ({onCancel:$}){let Q=I1(),J=kJ({cwd:Q}).getAll(),Z=J.filter((K)=>K.source==="builtin"),X=J.filter((K)=>K.source==="user"),G=J.filter((K)=>K.source==="project"),q=v0(!1,$);if(BX((K,U)=>{if(U.escape)$?.();else if(U.ctrl&&K==="c"||U.meta&&K==="c")q()}),J.length===0)return $0(m0,{flexDirection:"column",paddingY:1,children:[$0(m0,{marginBottom:1,children:$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{marginTop:1,paddingLeft:2,children:$0(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $0(m0,{flexDirection:"column",paddingY:1,children:[$0(m0,{marginBottom:1,children:[$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&$0(m0,{paddingLeft:2,children:$0(T0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),$0(m0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as SJ,Text as l1}from"ink";import wX,{useEffect as bX,useMemo as AX,useState as DJ}from"react";import{jsxDEV as N1,Fragment as jJ}from"react/jsx-dev-runtime";var VJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function PX($){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 hJ=wX.memo(()=>{let $=s((U)=>U.app.subagentProgresses),Q=s((U)=>U.app.subagentProgress),Y=A0(),[J,Z]=DJ(0),[X,G]=DJ(()=>Date.now()),q=AX(()=>{let U=Object.values($);return U.length>0?U:Q?[Q]:[]},[Q,$]),K=q.some((U)=>U.status==="running");if(bX(()=>{if(!K){Z(0);return}let U=setInterval(()=>{Z((z)=>(z+1)%VJ.length)},80),H=setInterval(()=>{G(Date.now())},1000);return()=>{clearInterval(U),clearInterval(H)}},[K]),q.length===0)return null;return N1(SJ,{paddingX:2,paddingY:0,flexDirection:"column",children:q.map((U)=>{let H=U.status==="running"?VJ[J]:U.status==="completed"?"[OK]":"[X]",z=U.status==="running"?Y.colors.info:U.status==="completed"?Y.colors.success:Y.colors.error,W=Math.max(0,X-U.startTime);return N1(SJ,{flexDirection:"row",gap:1,children:[N1(l1,{color:z,bold:!0,children:H},void 0,!1,void 0,this),N1(l1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.text.primary,bold:!0,children:U.type},void 0,!1,void 0,this),N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.text.secondary,children:U.description},void 0,!1,void 0,this),U.currentTool&&N1(jJ,{children:[N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.warning,children:U.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="running"&&W>0&&N1(jJ,{children:[N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.info,children:PX(W)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},U.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as yX}from"ahooks";import{Box as v1,Text as d,useInput as RX}from"ink";import MX from"ink-select-input";import{useState as EJ}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var gJ=C$.map(($)=>({label:$.label,value:$.id})),CX=({theme:$})=>{let{colors:Q}=$;return c(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(d,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),c(d,{children:[c(d,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),c(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),c(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{color:Q.error,children:["- print(",c(d,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),c(d,{color:Q.success,children:["+ print(",c(d,{color:Q.syntax.string,children:['f"Hello, ',"{","name","}",'"']},void 0,!0,void 0,this),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},IX=({theme:$})=>{let{colors:Q}=$;return c(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(d,{children:" "},void 0,!1,void 0,this),c(d,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),c(d,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),c(d,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),c(d,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),c(d,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),c(d,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},mJ=()=>{let $=i1(),Q=d0.getCurrentThemeName(),Y=C$.findIndex((B)=>B.label===Q),J=Y>=0?C$[Y].theme:C$[0].theme,[Z,X]=EJ(J),[G,q]=EJ(!1),K=yX(async(B)=>{if(G)return;q(!0);try{await g0().setTheme(B.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{q(!1)}}),U=(B)=>{let _=C$.find((F)=>F.id===B.value);if(_)X(_.theme)},z=$1()==="theme-selector",W=v0(!1);RX((B,_)=>{if(_.ctrl&&B==="c"||_.meta&&B==="c"){W();return}if(_.escape&&!G)$.closeModal()},{isActive:z});let O=(B)=>{let{isSelected:_,label:F}=B,N=F===Q?"[OK]":" ";return c(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[N," ",F]},void 0,!0,void 0,this)};return c(v1,{flexDirection:"column",height:"100%",children:[c(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:c(d,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(v1,{flexDirection:"row",flexGrow:1,children:[c(v1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:c(v1,{flexDirection:"column",children:[c(v1,{paddingTop:1,paddingBottom:1,children:c(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",gJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(MX,{items:gJ,initialIndex:Y>=0?Y:0,onSelect:K,onHighlight:U,itemComponent:O},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(v1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[c(CX,{theme:Z},void 0,!1,void 0,this),c(IX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:c(d,{color:Z.colors.text.muted,children:G?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as M0}from"react/jsx-dev-runtime";var q1=n1("UI"),xJ=({debug:$,continue:Q,...Y})=>{if($)q1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=I2(!1),Z=I2(!1),X=I2(!1),G=I2(null),q=G4(),K=K4(),U=P8(),H=z4(),z=U4(),W=i1(),O=a1(),B=v$(),_=I1(),F=H4(),M=S$(),N=o1(),v=F4();U$(()=>{if(d0.getCurrentThemeName()!==v)try{d0.setTheme(v)}catch{}},[v]);let C=q==="ready",w=q==="needsSetup",f=q==="idle",P=TX(()=>Y.agents?cJ(Y.agents):void 0,[Y.agents]),{confirmationState:A,confirmationHandler:T,handleResponse:R,dismissAll:L}=o4(),{executeCommand:k,handleAbort:E,cleanupAgent:t}=d4(Y.systemPrompt,Y.appendSystemPrompt,T,Y.maxTurns,L,P),{getPreviousCommand:u,getNextCommand:a,addToHistory:I}=a4();O6();let y=t4("",0),D=t0(async()=>{let r=M,X0;if(r==="default")X0="autoEdit";else if(r==="autoEdit")X0="plan";else if(r==="plan")X0="default";else X0="default";try{await P0.setSessionPermissionMode(B,_,X0),await g0().setPermissionMode(X0)}catch(k0){q1.error("权限模式切换失败:",k0 instanceof Error?k0.message:k0)}}),b=t0(async(r)=>{try{let X0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await g0().addModelWithProvider(X0,r.modelProvider);else await g0().addModel(X0);W.setInitializationStatus("ready")}catch(X0){throw q1.error("初始化配置保存失败:",X0 instanceof Error?X0.message:X0),X0}}),h=t0(()=>{if(U==="shortcuts")W.closeModal();else W.setActiveModal("shortcuts")}),S=t0(async(r,X0,k0)=>{return g8({intent:X0,session:r,newSessionId:k0?.newSessionId,announceFork:k0?.announceFork,permissionModeOverride:Y.permissionMode},_,O,t)}),x=t0(async(r,X0)=>{let D1=(await E8(X0,_)).filter((E0)=>E0.sessionId===r);if(D1.length===0)throw Error(`Session not found: ${r}`);if(D1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return D1[0]}),{showSuggestions:V,suggestions:l,selectedSuggestionIndex:K0}=z6(y,k,u,a,I,E,N,D,h,U==="shortcuts");U$(()=>{if(y.value&&U==="shortcuts")W.closeModal()},[y.value,U,W]);let Z0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",X0=await E8(r,_);if(X0.length===0){if(Y.forkSession){q1.error("没有可供 fork 的历史会话"),T1(1);return}O.addAssistantMessage("没有找到历史会话,开始新对话。");return}let k0=X0[0];await S(k0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(q1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){T1(1);return}O.addAssistantMessage("继续会话失败,开始新对话。")}}),y0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let k0=Y.forkSession?"fork":"resume",e$=await x(Y.resume,k0);await S(e$,k0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",X0=await E8(r,_);if(X0.length===0)q1.error("没有找到历史会话"),T1(1);W.showSessionSelector(X0,r)}catch(r){q1.error("[BladeInterface] 加载会话失败:",r),T1(1)}});U$(()=>{if(J.current)return;if(Q){J.current=!0,Z0();return}if(Y.resume)J.current=!0,y0()},[Q,Y.resume,Z0,y0]);let B0=t0(async(r)=>{let X0=A.details?.type;if(X0==="enterPlanMode"&&r.approved)try{await P0.setSessionPermissionMode(B,_,"plan"),await g0().setPermissionMode("plan"),q1.debug("[BladeInterface] Entered Plan mode")}catch(k0){q1.error("[BladeInterface] Failed to enter Plan mode:",k0)}if(X0==="exitPlanMode"&&r.approved)q1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");R(r)}),s0=t0(()=>{O.addAssistantMessage("设置已取消"),O.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),O.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),T1(0)}),p0=t0(()=>{W.closeModal()}),F1=t0(async(r)=>{try{await S(r,H?.intent??"resume"),W.closeModal()}catch(X0){q1.error("[BladeInterface] Failed to restore session:",X0),O.addAssistantMessage(`会话操作失败: ${X0 instanceof Error?X0.message:"未知错误"}`),W.closeModal()}}),C1=t0(()=>{if(Y.resume)T1(0);else W.closeModal()}),T$=t0((r)=>{W.showModelEditWizard(r)}),e0=t0((r)=>{O.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),p0()}),S2=t0((r)=>{O.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),p0()});U$(()=>{if(w){F.setFocus("model-config-wizard");return}if(A.isVisible)F.setFocus("confirmation-prompt");else if(U==="sessionSelector")F.setFocus("session-selector");else if(U==="themeSelector")F.setFocus("theme-selector");else if(U==="modelSelector")F.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")F.setFocus("model-config-wizard");else if(U==="permissionsManager")F.setFocus("permissions-manager");else if(U==="agentsManager")F.setFocus("agents-manager");else if(U==="agentCreationWizard")F.setFocus("agent-creation-wizard");else if(U==="hooksManager")F.setFocus("hooks-manager");else if(U==="shortcuts")F.setFocus("main-input");else F.setFocus("main-input")},[w,A.isVisible,U,F.setFocus]),U$(()=>{if(!C||X.current)return;if(pJ().length>0){X.current=!0;return}X.current=!0,O.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[C]),U$(()=>{if(!K)return;if(G.current===K)return;if(G.current=K,q==="error")O.addAssistantMessage(`初始化失败: ${K}`);else O.addAssistantMessage(`${K}`),O.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,q,O.addAssistantMessage]);let O$=t0(async(r)=>{try{await k({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(X0){let k0=X0 instanceof Error?X0.message:"无法发送初始消息";O.addAssistantMessage(`初始消息发送失败:${k0}`)}});U$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!C||w)return;Z.current=!0,I(r),O$(r)},[Y.initialMessage,C,w,k,I]);let D2=t0(async(r)=>{try{await g0().setPermissionMode(r)}catch(X0){q1.error("权限模式初始化失败:",X0 instanceof Error?X0.message:X0)}});if(U$(()=>{let r=Y.permissionMode;if($)q1.debug("[Debug] permissionMode from CLI:",r),q1.debug("[Debug] current permissionMode:",M);if(!r||r===M)return;D2(r)},[Y.permissionMode,M]),f)return null;if(w)return M0(aQ,{mode:"setup",onComplete:b,onCancel:s0},void 0,!1,void 0,this);if($)q1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:A.isVisible,activeModal:U});let q0=U==="modelSelector",f0=z,Q0=U==="modelAddWizard"?"add":U==="modelEditWizard"&&f0?"edit":null,_0=q0||Boolean(Q0),c0=U==="agentsManager",i0=U==="agentCreationWizard",l0=U==="skillsManager",b1=U==="pluginsManager",V2=f0?{displayName:f0.displayName,provider:f0.provider,model:f0.model,overrides:f0.overrides}:void 0,f$=A.isVisible&&A.details?A.details.type==="mcpElicitation"&&A.details.mcpElicitation?M0(k9,{details:A.details.mcpElicitation,onComplete:(r,X0)=>B0({approved:r.action==="accept",elicitation:r,...X0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):A.details.type==="askUserQuestion"&&A.details.questions?M0(PJ,{questions:A.details.questions,onComplete:(r)=>B0({approved:!0,answers:r}),onCancel:()=>B0({approved:!1})},void 0,!1,void 0,this):M0(s6,{details:A.details,onResponse:B0},void 0,!1,void 0,this):U==="themeSelector"?M0(mJ,{},void 0,!1,void 0,this):U==="permissionsManager"?M0(NJ,{onClose:p0},void 0,!1,void 0,this):U==="sessionSelector"?M0(fJ,{intent:H?.intent??"resume",sessions:H?.sessions,onSelect:F1,onCancel:C1},void 0,!1,void 0,this):U==="hooksManager"?M0($9,{workspaceRoot:_,sessionId:B,onClose:p0},void 0,!1,void 0,this):null,w8=Boolean(f$);return M0(q$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[f$,M0(q$,{flexDirection:"column",display:w8?"none":"flex",children:[M0(r9,{},void 0,!1,void 0,this),M0(hJ,{},void 0,!1,void 0,this),M0(C9,{paused:w8},void 0,!1,void 0,this),M0(w9,{input:y.value,cursorPosition:y.cursorPosition,onChange:y.setValue,onChangeCursorPosition:y.setCursorPosition,onAddPasteMapping:y.addPasteMapping,onAddImagePasteMapping:y.addImagePasteMapping},void 0,!1,void 0,this),q0&&M0(q$,{marginTop:1,paddingX:2,children:M0(a9,{onClose:p0,onEdit:T$},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0&&M0(q$,{marginTop:1,paddingX:2,children:M0(aQ,{mode:Q0,modelId:f0?.id,initialConfig:Q0==="edit"?V2:void 0,onComplete:Q0==="edit"?S2:e0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),c0&&M0(q$,{marginTop:1,paddingX:2,children:M0(L6,{workspaceRoot:_,onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0&&M0(q$,{marginTop:1,paddingX:2,children:M0(q8,{onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),l0&&M0(q$,{marginTop:1,paddingX:2,children:M0(vJ,{onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),b1&&M0(q$,{marginTop:1,paddingX:2,children:M0(bJ,{workspaceRoot:_,onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(y6,{suggestions:l,selectedIndex:K0,visible:V&&!_0},void 0,!1,void 0,this),M0(P6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as fX,Text as z$}from"ink";import kX from"react";import{jsxDEV as d1}from"react/jsx-dev-runtime";class B8 extends kX.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 d1(fX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[d1(z$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),d1(z$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as I$,Text as r1,useInput as vX}from"ink";import{useState as tQ}from"react";import{jsxDEV as X1}from"react/jsx-dev-runtime";var T2=[{key:"update",label:"Update now",description:`runs \`${lJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],rJ=({versionInfo:$,onComplete:Q})=>{let[Y,J]=tQ(0),[Z,X]=tQ(!1),[G,q]=tQ(null);vX((U,H)=>{if(H.ctrl&&U==="c"){G8().shutdown("SIGINT",0);return}if(Z||G)return;if(H.upArrow||U==="k")J((z)=>z>0?z-1:T2.length-1);else if(H.downArrow||U==="j")J((z)=>z<T2.length-1?z+1:0);else if(H.return)K(T2[Y].key);else if(U==="1")K("update");else if(U==="2")K("skip");else if(U==="3")K("skip_until_next")});let K=async(U)=>{switch(U){case"update":{X(!0);let H=await dJ();q(H.message),setTimeout(()=>{G8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await uJ($.latestVersion);Q();break}};if(G)return X1(I$,{flexDirection:"column",marginY:1,children:X1(r1,{children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return X1(I$,{flexDirection:"column",marginY:1,children:X1(r1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X1(I$,{flexDirection:"column",marginY:1,children:[X1(r1,{color:"yellow",bold:!0,children:["Update available! ",X1(r1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X1(I$,{marginTop:1,children:X1(r1,{color:"gray",children:["Release notes:"," ",X1(r1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(I$,{flexDirection:"column",marginTop:1,children:T2.map((U,H)=>{let z=H===Y,W=z?"› ":" ",O=`${H+1}. `;return X1(I$,{children:X1(r1,{color:z?"cyan":void 0,children:[W,O,U.label,U.description&&X1(r1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),X1(I$,{marginTop:1,children:X1(r1,{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 f2,Text as t$,useInput as SX}from"ink";import{useState as aJ}from"react";import{jsxDEV as S1}from"react/jsx-dev-runtime";var iJ=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=d0.getTheme(),[Z,X]=aJ(!1),[G,q]=aJ(null);return SX((K,U)=>{if(Z)return;if(U.return||K.toLowerCase()==="t"){X(!0),q(null),Q().catch((H)=>{q(H instanceof Error?H.message:"Failed to trust workspace"),X(!1)});return}if(K.toLowerCase()==="s"||U.escape)X(!0),q(null),Y().catch((H)=>{q(H instanceof Error?H.message:"Failed to continue safely"),X(!1)})}),S1(f2,{flexDirection:"column",paddingX:1,children:[S1(t$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),S1(t$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),S1(f2,{marginTop:1,flexDirection:"column",children:[S1(t$,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((K)=>S1(t$,{children:[" ",K.path," · ",K.effects.length," effect(s)"]},`${K.kind}:${K.path}`,!0,void 0,this))]},void 0,!0,void 0,this),G&&S1(f2,{marginTop:1,children:S1(t$,{color:J.colors.error,children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),S1(f2,{marginTop:1,children:S1(t$,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as DX}from"ink";import{useEffect as VX}from"react";function oJ(){let{stdout:$}=DX();VX(()=>{if(!$.isTTY)return;return $.write(Y9),$.write(fQ),()=>{$.write(Z9),$.write(fQ)}},[$])}function nJ($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}import{jsxDEV as s$}from"react/jsx-dev-runtime";function hX($){if(Q1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");r0().setInitializationStatus("ready")}var tF=($)=>{oJ();let[Q,Y]=v2(!1),[J,Z]=v2(null),[X,G]=v2(!1),[q,K]=v2(null),U=k2((O,B)=>{let _=O instanceof Error?O.message:String(O);if(r0().setInitializationError(_),r0().setInitializationStatus("error"),Y(!0),B)console.error("[FAIL] 应用初始化失败:",_)}),H=k2(async()=>{try{let O=Q1().config.config??sJ,B=eJ(O,$);if(hX(B),B.resumeSessionId)$Y().restoreSession(B.resumeSessionId,[]);if(B.debug)console.error("[Debug] 运行时配置:",B);let _=B.theme;if(_&&d0.hasTheme(_)){if(d0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{U1.getInstance().loadConfig(B.hooks||{},x0());let M=await QY(x0());if($.debug&&B.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${M.subagents.getAllNames().length} agents, ${M.skills.size} skills, ${M.commands.getCommandCount()+M.commands.getPluginCommandCount()} commands, ${M.plugins.getAll().length} plugins`);let v=Q1().session.sessionId;tJ(v)}catch(F){if($.debug)console.warn("Hooks 初始化失败:",nJ(F))}c8(async()=>{await YY.getInstance().killAll(),await JY.getInstance().disconnectAll(),U1.getInstance().cleanup()}),Y(!0)}catch(O){U(O,!!$.debug)}}),z=k2(async()=>{let O=await sQ.getInstance().getStatus(x0());if(O.state==="untrusted"||O.state==="error"){K(O);return}await H()}),W=k2(async()=>{if($.versionCheckPromise){let O=await $.versionCheckPromise;if(O){Z(O),G(!0);return}}await z()});if(jX(()=>{W()},[]),X&&J)return s$(B8,{children:s$(rJ,{versionInfo:J,onComplete:()=>{G(!1),z()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(q)return s$(B8,{children:s$(iJ,{status:q,onTrust:async()=>{await sQ.getInstance().trust(x0()),await ZY(),K(null),await H()},onContinueSafely:async()=>{K(null),await H()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return s$(B8,{children:s$(xJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{tF as AppWrapper};
160
+ `]},void 0,!0,void 0,this),u0(_X,{items:w,onSelect:P,isFocused:_&&!H,indicatorComponent:WX,itemComponent:LX},void 0,!1,void 0,this),H&&u0(w1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),u0(n$,{marginTop:1,flexDirection:"column",children:[u0(w1,{dimColor:!0,children:["第 ",K+1,"/",C," 页 · 共 ",M.length," 个会话 · 显示"," ",f.start,"-",f.end]},void 0,!0,void 0,this),C>1&&u0(n$,{marginTop:1,children:[u0(w1,{color:K>0?"cyan":"gray",children:K>0?"<< 上一页":" "},void 0,!1,void 0,this),u0(w1,{children:" "},void 0,!1,void 0,this),u0(w1,{color:K<C-1?"cyan":"gray",children:K<C-1?"下一页 >>":""},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as m0,Text as T0,useInput as BX}from"ink";import{jsxDEV as $0}from"react/jsx-dev-runtime";function vJ({onCancel:$}){let Q=I1(),J=kJ({cwd:Q}).getAll(),Z=J.filter((K)=>K.source==="builtin"),X=J.filter((K)=>K.source==="user"),G=J.filter((K)=>K.source==="project"),q=v0(!1,$);if(BX((K,U)=>{if(U.escape)$?.();else if(U.ctrl&&K==="c"||U.meta&&K==="c")q()}),J.length===0)return $0(m0,{flexDirection:"column",paddingY:1,children:[$0(m0,{marginBottom:1,children:$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{marginTop:1,paddingLeft:2,children:$0(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(m0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $0(m0,{flexDirection:"column",paddingY:1,children:[$0(m0,{marginBottom:1,children:[$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(m0,{paddingLeft:2,children:$0(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&$0(m0,{flexDirection:"column",marginBottom:1,children:[$0(m0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((K)=>{let H=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(m0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&$0(m0,{paddingLeft:2,children:$0(T0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),$0(m0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as SJ,Text as l1}from"ink";import wX,{useEffect as bX,useMemo as AX,useState as DJ}from"react";import{jsxDEV as N1,Fragment as jJ}from"react/jsx-dev-runtime";var VJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function PX($){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 hJ=wX.memo(()=>{let $=s((U)=>U.app.subagentProgresses),Q=s((U)=>U.app.subagentProgress),Y=A0(),[J,Z]=DJ(0),[X,G]=DJ(()=>Date.now()),q=AX(()=>{let U=Object.values($);return U.length>0?U:Q?[Q]:[]},[Q,$]),K=q.some((U)=>U.status==="running");if(bX(()=>{if(!K){Z(0);return}let U=setInterval(()=>{Z((z)=>(z+1)%VJ.length)},80),H=setInterval(()=>{G(Date.now())},1000);return()=>{clearInterval(U),clearInterval(H)}},[K]),q.length===0)return null;return N1(SJ,{paddingX:2,paddingY:0,flexDirection:"column",children:q.map((U)=>{let H=U.status==="running"?VJ[J]:U.status==="completed"?"[OK]":"[X]",z=U.status==="running"?Y.colors.info:U.status==="completed"?Y.colors.success:Y.colors.error,W=Math.max(0,X-U.startTime);return N1(SJ,{flexDirection:"row",gap:1,children:[N1(l1,{color:z,bold:!0,children:H},void 0,!1,void 0,this),N1(l1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.text.primary,bold:!0,children:U.type},void 0,!1,void 0,this),N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.text.secondary,children:U.description},void 0,!1,void 0,this),U.currentTool&&N1(jJ,{children:[N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.warning,children:U.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="running"&&W>0&&N1(jJ,{children:[N1(l1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),N1(l1,{color:Y.colors.info,children:PX(W)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},U.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as yX}from"ahooks";import{Box as v1,Text as d,useInput as RX}from"ink";import MX from"ink-select-input";import{useState as EJ}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var gJ=C$.map(($)=>({label:$.label,value:$.id})),CX=({theme:$})=>{let{colors:Q}=$;return c(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(d,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),c(d,{children:[c(d,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),c(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),c(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),c(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),c(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[" ",c(d,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",c(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{color:Q.error,children:["- print(",c(d,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),c(d,{color:Q.success,children:["+ print(",c(d,{color:Q.syntax.string,children:['f"Hello, ',"{","name","}",'"']},void 0,!0,void 0,this),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},IX=({theme:$})=>{let{colors:Q}=$;return c(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(d,{children:" "},void 0,!1,void 0,this),c(d,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),c(d,{children:" "},void 0,!1,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),c(d,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),c(d,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),c(d,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),c(d,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(d,{children:[c(d,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),c(d,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},mJ=()=>{let $=i1(),Q=d0.getCurrentThemeName(),Y=C$.findIndex((B)=>B.label===Q),J=Y>=0?C$[Y].theme:C$[0].theme,[Z,X]=EJ(J),[G,q]=EJ(!1),K=yX(async(B)=>{if(G)return;q(!0);try{await g0().setTheme(B.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{q(!1)}}),U=(B)=>{let _=C$.find((F)=>F.id===B.value);if(_)X(_.theme)},z=$1()==="theme-selector",W=v0(!1);RX((B,_)=>{if(_.ctrl&&B==="c"||_.meta&&B==="c"){W();return}if(_.escape&&!G)$.closeModal()},{isActive:z});let O=(B)=>{let{isSelected:_,label:F}=B,N=F===Q?"[OK]":" ";return c(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[N," ",F]},void 0,!0,void 0,this)};return c(v1,{flexDirection:"column",height:"100%",children:[c(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:c(d,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(v1,{flexDirection:"row",flexGrow:1,children:[c(v1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:c(v1,{flexDirection:"column",children:[c(v1,{paddingTop:1,paddingBottom:1,children:c(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",gJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(MX,{items:gJ,initialIndex:Y>=0?Y:0,onSelect:K,onHighlight:U,itemComponent:O},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(v1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[c(CX,{theme:Z},void 0,!1,void 0,this),c(IX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:c(d,{color:Z.colors.text.muted,children:G?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as M0}from"react/jsx-dev-runtime";var q1=n1("UI"),xJ=({debug:$,continue:Q,...Y})=>{if($)q1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=I2(!1),Z=I2(!1),X=I2(!1),G=I2(null),q=G4(),K=K4(),U=P8(),H=z4(),z=U4(),W=i1(),O=a1(),B=v$(),_=I1(),F=H4(),M=S$(),N=o1(),v=F4();U$(()=>{if(d0.getCurrentThemeName()!==v)try{d0.setTheme(v)}catch{}},[v]);let C=q==="ready",w=q==="needsSetup",f=q==="idle",P=TX(()=>Y.agents?cJ(Y.agents):void 0,[Y.agents]),{confirmationState:A,confirmationHandler:T,handleResponse:R,dismissAll:L}=o4(),{executeCommand:k,handleAbort:E,cleanupAgent:t}=d4(Y.systemPrompt,Y.appendSystemPrompt,T,Y.maxTurns,L,P),{getPreviousCommand:u,getNextCommand:a,addToHistory:I}=a4();O6();let y=t4("",0),D=t0(async()=>{let r=M,X0;if(r==="default")X0="autoEdit";else if(r==="autoEdit")X0="plan";else if(r==="plan")X0="default";else X0="default";try{await P0.setSessionPermissionMode(B,_,X0),await g0().setPermissionMode(X0)}catch(k0){q1.error("权限模式切换失败:",k0 instanceof Error?k0.message:k0)}}),b=t0(async(r)=>{try{let X0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await g0().addModelWithProvider(X0,r.modelProvider);else await g0().addModel(X0);W.setInitializationStatus("ready")}catch(X0){throw q1.error("初始化配置保存失败:",X0 instanceof Error?X0.message:X0),X0}}),h=t0(()=>{if(U==="shortcuts")W.closeModal();else W.setActiveModal("shortcuts")}),S=t0(async(r,X0,k0)=>{return g8({intent:X0,session:r,newSessionId:k0?.newSessionId,announceFork:k0?.announceFork,permissionModeOverride:Y.permissionMode},_,O,t)}),x=t0(async(r,X0)=>{let D1=(await E8(X0,_)).filter((E0)=>E0.sessionId===r);if(D1.length===0)throw Error(`Session not found: ${r}`);if(D1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return D1[0]}),{showSuggestions:V,suggestions:l,selectedSuggestionIndex:K0}=z6(y,k,u,a,I,E,N,D,h,U==="shortcuts");U$(()=>{if(y.value&&U==="shortcuts")W.closeModal()},[y.value,U,W]);let Z0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",X0=await E8(r,_);if(X0.length===0){if(Y.forkSession){q1.error("没有可供 fork 的历史会话"),T1(1);return}O.addAssistantMessage("没有找到历史会话,开始新对话。");return}let k0=X0[0];await S(k0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(q1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){T1(1);return}O.addAssistantMessage("继续会话失败,开始新对话。")}}),y0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let k0=Y.forkSession?"fork":"resume",e$=await x(Y.resume,k0);await S(e$,k0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",X0=await E8(r,_);if(X0.length===0)q1.error("没有找到历史会话"),T1(1);W.showSessionSelector(X0,r)}catch(r){q1.error("[BladeInterface] 加载会话失败:",r),T1(1)}});U$(()=>{if(J.current)return;if(Q){J.current=!0,Z0();return}if(Y.resume)J.current=!0,y0()},[Q,Y.resume,Z0,y0]);let B0=t0(async(r)=>{let X0=A.details?.type;if(X0==="enterPlanMode"&&r.approved)try{await P0.setSessionPermissionMode(B,_,"plan"),await g0().setPermissionMode("plan"),q1.debug("[BladeInterface] Entered Plan mode")}catch(k0){q1.error("[BladeInterface] Failed to enter Plan mode:",k0)}if(X0==="exitPlanMode"&&r.approved)q1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");R(r)}),s0=t0(()=>{O.addAssistantMessage("设置已取消"),O.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),O.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),T1(0)}),p0=t0(()=>{W.closeModal()}),F1=t0(async(r)=>{try{await S(r,H?.intent??"resume"),W.closeModal()}catch(X0){q1.error("[BladeInterface] Failed to restore session:",X0),O.addAssistantMessage(`会话操作失败: ${X0 instanceof Error?X0.message:"未知错误"}`),W.closeModal()}}),C1=t0(()=>{if(Y.resume)T1(0);else W.closeModal()}),T$=t0((r)=>{W.showModelEditWizard(r)}),e0=t0((r)=>{O.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),p0()}),S2=t0((r)=>{O.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),p0()});U$(()=>{if(w){F.setFocus("model-config-wizard");return}if(A.isVisible)F.setFocus("confirmation-prompt");else if(U==="sessionSelector")F.setFocus("session-selector");else if(U==="themeSelector")F.setFocus("theme-selector");else if(U==="modelSelector")F.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")F.setFocus("model-config-wizard");else if(U==="permissionsManager")F.setFocus("permissions-manager");else if(U==="agentsManager")F.setFocus("agents-manager");else if(U==="agentCreationWizard")F.setFocus("agent-creation-wizard");else if(U==="hooksManager")F.setFocus("hooks-manager");else if(U==="shortcuts")F.setFocus("main-input");else F.setFocus("main-input")},[w,A.isVisible,U,F.setFocus]),U$(()=>{if(!C||X.current)return;if(pJ().length>0){X.current=!0;return}X.current=!0,O.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[C]),U$(()=>{if(!K)return;if(G.current===K)return;if(G.current=K,q==="error")O.addAssistantMessage(`初始化失败: ${K}`);else O.addAssistantMessage(`${K}`),O.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,q,O.addAssistantMessage]);let O$=t0(async(r)=>{try{await k({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(X0){let k0=X0 instanceof Error?X0.message:"无法发送初始消息";O.addAssistantMessage(`初始消息发送失败:${k0}`)}});U$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!C||w)return;Z.current=!0,I(r),O$(r)},[Y.initialMessage,C,w,k,I]);let D2=t0(async(r)=>{try{await g0().setPermissionMode(r)}catch(X0){q1.error("权限模式初始化失败:",X0 instanceof Error?X0.message:X0)}});if(U$(()=>{let r=Y.permissionMode;if($)q1.debug("[Debug] permissionMode from CLI:",r),q1.debug("[Debug] current permissionMode:",M);if(!r||r===M)return;D2(r)},[Y.permissionMode,M]),f)return null;if(w)return M0(aQ,{mode:"setup",onComplete:b,onCancel:s0},void 0,!1,void 0,this);if($)q1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:A.isVisible,activeModal:U});let q0=U==="modelSelector",f0=z,Q0=U==="modelAddWizard"?"add":U==="modelEditWizard"&&f0?"edit":null,_0=q0||Boolean(Q0),c0=U==="agentsManager",i0=U==="agentCreationWizard",l0=U==="skillsManager",b1=U==="pluginsManager",V2=f0?{displayName:f0.displayName,provider:f0.provider,model:f0.model,overrides:f0.overrides}:void 0,f$=A.isVisible&&A.details?A.details.type==="mcpElicitation"&&A.details.mcpElicitation?M0(k9,{details:A.details.mcpElicitation,onComplete:(r,X0)=>B0({approved:r.action==="accept",elicitation:r,...X0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):A.details.type==="askUserQuestion"&&A.details.questions?M0(PJ,{questions:A.details.questions,onComplete:(r)=>B0({approved:!0,answers:r}),onCancel:()=>B0({approved:!1})},void 0,!1,void 0,this):M0(s6,{details:A.details,onResponse:B0},void 0,!1,void 0,this):U==="themeSelector"?M0(mJ,{},void 0,!1,void 0,this):U==="permissionsManager"?M0(NJ,{onClose:p0},void 0,!1,void 0,this):U==="sessionSelector"?M0(fJ,{intent:H?.intent??"resume",sessions:H?.sessions,onSelect:F1,onCancel:C1},void 0,!1,void 0,this):U==="hooksManager"?M0($9,{workspaceRoot:_,sessionId:B,onClose:p0},void 0,!1,void 0,this):null,w8=Boolean(f$);return M0(q$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[f$,M0(q$,{flexDirection:"column",display:w8?"none":"flex",children:[M0(r9,{},void 0,!1,void 0,this),M0(hJ,{},void 0,!1,void 0,this),M0(C9,{paused:w8},void 0,!1,void 0,this),M0(w9,{input:y.value,cursorPosition:y.cursorPosition,onChange:y.setValue,onChangeCursorPosition:y.setCursorPosition,onAddPasteMapping:y.addPasteMapping,onAddImagePasteMapping:y.addImagePasteMapping},void 0,!1,void 0,this),q0&&M0(q$,{marginTop:1,paddingX:2,children:M0(a9,{onClose:p0,onEdit:T$},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0&&M0(q$,{marginTop:1,paddingX:2,children:M0(aQ,{mode:Q0,modelId:f0?.id,initialConfig:Q0==="edit"?V2:void 0,onComplete:Q0==="edit"?S2:e0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),c0&&M0(q$,{marginTop:1,paddingX:2,children:M0(L6,{workspaceRoot:_,onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0&&M0(q$,{marginTop:1,paddingX:2,children:M0(q8,{onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),l0&&M0(q$,{marginTop:1,paddingX:2,children:M0(vJ,{onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),b1&&M0(q$,{marginTop:1,paddingX:2,children:M0(bJ,{workspaceRoot:_,onComplete:p0,onCancel:p0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(y6,{suggestions:l,selectedIndex:K0,visible:V&&!_0},void 0,!1,void 0,this),M0(P6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as fX,Text as z$}from"ink";import kX from"react";import{jsxDEV as d1}from"react/jsx-dev-runtime";class B8 extends kX.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 d1(fX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[d1(z$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),d1(z$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),d1(z$,{children:" "},void 0,!1,void 0,this),d1(z$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as I$,Text as r1,useInput as vX}from"ink";import{useState as tQ}from"react";import{jsxDEV as X1}from"react/jsx-dev-runtime";var T2=[{key:"update",label:"Update now",description:`runs \`${lJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],rJ=({versionInfo:$,onComplete:Q})=>{let[Y,J]=tQ(0),[Z,X]=tQ(!1),[G,q]=tQ(null);vX((U,H)=>{if(H.ctrl&&U==="c"){G8().shutdown("SIGINT",0);return}if(Z||G)return;if(H.upArrow||U==="k")J((z)=>z>0?z-1:T2.length-1);else if(H.downArrow||U==="j")J((z)=>z<T2.length-1?z+1:0);else if(H.return)K(T2[Y].key);else if(U==="1")K("update");else if(U==="2")K("skip");else if(U==="3")K("skip_until_next")});let K=async(U)=>{switch(U){case"update":{X(!0);let H=await dJ();q(H.message),setTimeout(()=>{G8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await uJ($.latestVersion);Q();break}};if(G)return X1(I$,{flexDirection:"column",marginY:1,children:X1(r1,{children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return X1(I$,{flexDirection:"column",marginY:1,children:X1(r1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X1(I$,{flexDirection:"column",marginY:1,children:[X1(r1,{color:"yellow",bold:!0,children:["Update available! ",X1(r1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X1(I$,{marginTop:1,children:X1(r1,{color:"gray",children:["Release notes:"," ",X1(r1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(I$,{flexDirection:"column",marginTop:1,children:T2.map((U,H)=>{let z=H===Y,W=z?"› ":" ",O=`${H+1}. `;return X1(I$,{children:X1(r1,{color:z?"cyan":void 0,children:[W,O,U.label,U.description&&X1(r1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),X1(I$,{marginTop:1,children:X1(r1,{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 f2,Text as t$,useInput as SX}from"ink";import{useState as aJ}from"react";import{jsxDEV as S1}from"react/jsx-dev-runtime";var iJ=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=d0.getTheme(),[Z,X]=aJ(!1),[G,q]=aJ(null);return SX((K,U)=>{if(Z)return;if(U.return||K.toLowerCase()==="t"){X(!0),q(null),Q().catch((H)=>{q(H instanceof Error?H.message:"Failed to trust workspace"),X(!1)});return}if(K.toLowerCase()==="s"||U.escape)X(!0),q(null),Y().catch((H)=>{q(H instanceof Error?H.message:"Failed to continue safely"),X(!1)})}),S1(f2,{flexDirection:"column",paddingX:1,children:[S1(t$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),S1(t$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),S1(f2,{marginTop:1,flexDirection:"column",children:[S1(t$,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((K)=>S1(t$,{children:[" ",K.path," · ",K.effects.length," effect(s)"]},`${K.kind}:${K.path}`,!0,void 0,this))]},void 0,!0,void 0,this),G&&S1(f2,{marginTop:1,children:S1(t$,{color:J.colors.error,children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),S1(f2,{marginTop:1,children:S1(t$,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as DX}from"ink";import{useEffect as VX}from"react";function oJ(){let{stdout:$}=DX();VX(()=>{if(!$.isTTY)return;return $.write(Y9),$.write(fQ),()=>{$.write(Z9),$.write(fQ)}},[$])}function nJ($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}import{jsxDEV as s$}from"react/jsx-dev-runtime";function hX($){if(Q1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");r0().setInitializationStatus("ready")}var tF=($)=>{oJ();let[Q,Y]=v2(!1),[J,Z]=v2(null),[X,G]=v2(!1),[q,K]=v2(null),U=k2((O,B)=>{let _=O instanceof Error?O.message:String(O);if(r0().setInitializationError(_),r0().setInitializationStatus("error"),Y(!0),B)console.error("[FAIL] 应用初始化失败:",_)}),H=k2(async()=>{try{let O=Q1().config.config??sJ,B=eJ(O,$);if(hX(B),B.resumeSessionId)$Y().restoreSession(B.resumeSessionId,[]);if(B.debug)console.error("[Debug] 运行时配置:",B);let _=B.codeTheme;if(_&&d0.hasTheme(_)){if(d0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{U1.getInstance().loadConfig(B.hooks||{},x0());let M=await QY(x0());if($.debug&&B.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${M.subagents.getAllNames().length} agents, ${M.skills.size} skills, ${M.commands.getCommandCount()+M.commands.getPluginCommandCount()} commands, ${M.plugins.getAll().length} plugins`);let v=Q1().session.sessionId;tJ(v)}catch(F){if($.debug)console.warn("Hooks 初始化失败:",nJ(F))}c8(async()=>{await YY.getInstance().killAll(),await JY.getInstance().disconnectAll(),U1.getInstance().cleanup()}),Y(!0)}catch(O){U(O,!!$.debug)}}),z=k2(async()=>{let O=await sQ.getInstance().getStatus(x0());if(O.state==="untrusted"||O.state==="error"){K(O);return}await H()}),W=k2(async()=>{if($.versionCheckPromise){let O=await $.versionCheckPromise;if(O){Z(O),G(!0);return}}await z()});if(jX(()=>{W()},[]),X&&J)return s$(B8,{children:s$(rJ,{versionInfo:J,onComplete:()=>{G(!1),z()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(q)return s$(B8,{children:s$(iJ,{status:q,onTrust:async()=>{await sQ.getInstance().trust(x0()),await ZY(),K(null),await H()},onContinueSafely:async()=>{K(null),await H()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return s$(B8,{children:s$(xJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{tF as AppWrapper};
@@ -1,2 +1,2 @@
1
- import{Gf as d,If as h}from"./chunk-c29y2s8g.js";var q={debug:{alias:"d",type:"string",describe:'Enable debug mode with optional category filtering (e.g., "agent,ui" or "!chat,!loop")',group:"Debug Options:"},model:{type:"string",describe:"Override the current run model using a model config ID (TUI / print / headless)",group:"AI Options:"},print:{alias:"p",type:"boolean",describe:"Print response and exit (useful for pipes)",group:"Output Options:"},headless:{type:"boolean",describe:"Run full agent loop without Ink UI and print all events to the terminal",group:"Output Options:"},"output-format":{alias:["outputFormat"],type:"string",choices:["text","json","stream-json","jsonl"],default:"text",describe:"Output format: --print supports text|json|stream-json; --headless supports text|jsonl",group:"Output Options:"},"json-schema":{alias:["jsonSchema"],type:"string",describe:"Inline JSON Schema for the turn-scoped structured final response",group:"Output Options:"},"output-schema":{alias:["outputSchema"],type:"string",describe:"Path to a JSON Schema file for the structured final response",group:"Output Options:"},"include-partial-messages":{alias:["includePartialMessages"],type:"boolean",describe:"Include partial message chunks as they arrive",group:"Output Options:"},"input-format":{alias:["inputFormat"],type:"string",choices:["text","stream-json"],default:"text",describe:"Input format",group:"Input Options:"},"replay-user-messages":{alias:["replayUserMessages"],type:"boolean",describe:"Re-emit user messages from stdin",group:"Input Options:"},"allowed-tools":{alias:["allowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to allow",group:"Security Options:"},"disallowed-tools":{alias:["disallowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to deny",group:"Security Options:"},"mcp-config":{alias:["mcpConfig"],type:"array",string:!0,describe:"Load MCP servers from JSON files or strings",group:"MCP Options:"},"system-prompt":{alias:["systemPrompt"],type:"string",describe:"System prompt to use for the session (replaces default)",group:"AI Options:"},"append-system-prompt":{alias:["appendSystemPrompt"],type:"string",describe:"Append a system prompt to the default system prompt",group:"AI Options:"},"max-turns":{alias:["maxTurns"],type:"number",describe:"Maximum conversation turns (-1: unlimited, 0: disable chat, N>0: limit to N turns)",group:"AI Options:",default:void 0},"max-concurrent-tasks":{alias:["maxConcurrentTasks"],type:"number",describe:"Maximum top-level tasks running concurrently in this process",group:"AI Options:",default:void 0},"max-queued-tasks":{alias:["maxQueuedTasks"],type:"number",describe:"Maximum top-level tasks waiting for an admission slot",group:"AI Options:",default:void 0},"permission-mode":{alias:["permissionMode"],type:"string",choices:["default","autoEdit","yolo","plan"],describe:"Permission mode (default: ask for non-read tools, autoEdit: auto-approve edits, yolo: auto-approve all, plan: reserved)",group:"Security Options:"},yolo:{type:"boolean",describe:"Auto-approve all tools (shortcut for --permission-mode=yolo)",group:"Security Options:"},"trust-workspace":{alias:["trustWorkspace"],type:"boolean",describe:"Trust the current workspace before loading project models, MCP, LSP, permissions, or plugins",group:"Security Options:"},continue:{alias:"c",type:"boolean",describe:"Continue the most recent conversation",group:"Session Options:"},resume:{alias:"r",describe:"Resume a conversation - provide a session ID or interactively select a conversation to resume",group:"Session Options:",coerce:(b)=>{if(b===void 0||b===!0||b==="")return"true";return String(b)}},"fork-session":{alias:["forkSession"],type:"boolean",describe:"Create a new session ID when resuming",group:"Session Options:"},settings:{type:"string",describe:"Path to a settings JSON file or JSON string",group:"Configuration:"},"add-dir":{alias:["addDir"],type:"array",string:!0,describe:"Additional directories to allow tool access to",group:"Security Options:"},ide:{type:"boolean",describe:"Automatically connect to IDE on startup",group:"Integration:"},acp:{type:"boolean",describe:"Run in ACP (Agent Client Protocol) mode for IDE integration",group:"Integration:"},"strict-mcp-config":{alias:["strictMcpConfig"],type:"boolean",describe:"Only use MCP servers from --mcp-config",group:"MCP Options:"},"session-id":{alias:["sessionId"],type:"string",describe:"Use a specific session ID for the conversation",group:"Session Options:"},agents:{type:"string",describe:"JSON object defining custom agents",group:"AI Options:"},"setting-sources":{alias:["settingSources"],type:"string",describe:"Comma-separated list of setting sources to load",group:"Configuration:"},"plugin-dir":{alias:["pluginDir"],type:"array",string:!0,describe:"Load plugins from specified directories",group:"Plugin Options:"}},w={scriptName:"blade",usage:"$0 [command] [options]",description:h(),version:d(),locale:"en",showHelpOnFail:!0,demandCommand:!1,recommendCommands:!0,strict:!1};
2
- export{q as yc,w as zc};
1
+ import{Ff as d,Hf as h}from"./chunk-9gtc0kd2.js";var q={debug:{alias:"d",type:"string",describe:'Enable debug mode with optional category filtering (e.g., "agent,ui" or "!chat,!loop")',group:"Debug Options:"},model:{type:"string",describe:"Override the current run model using a model config ID (TUI / print / headless)",group:"AI Options:"},print:{alias:"p",type:"boolean",describe:"Print response and exit (useful for pipes)",group:"Output Options:"},headless:{type:"boolean",describe:"Run full agent loop without Ink UI and print all events to the terminal",group:"Output Options:"},"output-format":{alias:["outputFormat"],type:"string",choices:["text","json","stream-json","jsonl"],default:"text",describe:"Output format: --print supports text|json|stream-json; --headless supports text|jsonl",group:"Output Options:"},"json-schema":{alias:["jsonSchema"],type:"string",describe:"Inline JSON Schema for the turn-scoped structured final response",group:"Output Options:"},"output-schema":{alias:["outputSchema"],type:"string",describe:"Path to a JSON Schema file for the structured final response",group:"Output Options:"},"include-partial-messages":{alias:["includePartialMessages"],type:"boolean",describe:"Include partial message chunks as they arrive",group:"Output Options:"},"input-format":{alias:["inputFormat"],type:"string",choices:["text","stream-json"],default:"text",describe:"Input format",group:"Input Options:"},"replay-user-messages":{alias:["replayUserMessages"],type:"boolean",describe:"Re-emit user messages from stdin",group:"Input Options:"},"allowed-tools":{alias:["allowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to allow",group:"Security Options:"},"disallowed-tools":{alias:["disallowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to deny",group:"Security Options:"},"mcp-config":{alias:["mcpConfig"],type:"array",string:!0,describe:"Load MCP servers from JSON files or strings",group:"MCP Options:"},"system-prompt":{alias:["systemPrompt"],type:"string",describe:"System prompt to use for the session (replaces default)",group:"AI Options:"},"append-system-prompt":{alias:["appendSystemPrompt"],type:"string",describe:"Append a system prompt to the default system prompt",group:"AI Options:"},"max-turns":{alias:["maxTurns"],type:"number",describe:"Maximum conversation turns (-1: unlimited, 0: disable chat, N>0: limit to N turns)",group:"AI Options:",default:void 0},"max-concurrent-tasks":{alias:["maxConcurrentTasks"],type:"number",describe:"Maximum top-level tasks running concurrently in this process",group:"AI Options:",default:void 0},"max-queued-tasks":{alias:["maxQueuedTasks"],type:"number",describe:"Maximum top-level tasks waiting for an admission slot",group:"AI Options:",default:void 0},"permission-mode":{alias:["permissionMode"],type:"string",choices:["default","autoEdit","yolo","plan"],describe:"Permission mode (default: ask for non-read tools, autoEdit: auto-approve edits, yolo: auto-approve all, plan: reserved)",group:"Security Options:"},yolo:{type:"boolean",describe:"Auto-approve all tools (shortcut for --permission-mode=yolo)",group:"Security Options:"},"trust-workspace":{alias:["trustWorkspace"],type:"boolean",describe:"Trust the current workspace before loading project models, MCP, LSP, permissions, or plugins",group:"Security Options:"},continue:{alias:"c",type:"boolean",describe:"Continue the most recent conversation",group:"Session Options:"},resume:{alias:"r",describe:"Resume a conversation - provide a session ID or interactively select a conversation to resume",group:"Session Options:",coerce:(b)=>{if(b===void 0||b===!0||b==="")return"true";return String(b)}},"fork-session":{alias:["forkSession"],type:"boolean",describe:"Create a new session ID when resuming",group:"Session Options:"},settings:{type:"string",describe:"Path to a settings JSON file or JSON string",group:"Configuration:"},"add-dir":{alias:["addDir"],type:"array",string:!0,describe:"Additional directories to allow tool access to",group:"Security Options:"},ide:{type:"boolean",describe:"Automatically connect to IDE on startup",group:"Integration:"},acp:{type:"boolean",describe:"Run in ACP (Agent Client Protocol) mode for IDE integration",group:"Integration:"},"strict-mcp-config":{alias:["strictMcpConfig"],type:"boolean",describe:"Only use MCP servers from --mcp-config",group:"MCP Options:"},"session-id":{alias:["sessionId"],type:"string",describe:"Use a specific session ID for the conversation",group:"Session Options:"},agents:{type:"string",describe:"JSON object defining custom agents",group:"AI Options:"},"setting-sources":{alias:["settingSources"],type:"string",describe:"Comma-separated list of setting sources to load",group:"Configuration:"},"plugin-dir":{alias:["pluginDir"],type:"array",string:!0,describe:"Load plugins from specified directories",group:"Plugin Options:"}},w={scriptName:"blade",usage:"$0 [command] [options]",description:h(),version:d(),locale:"en",showHelpOnFail:!0,demandCommand:!1,recommendCommands:!0,strict:!1};
2
+ export{q as zc,w as Ac};
@@ -1,2 +1,2 @@
1
1
  import d from"typebox/schema";import o from"typebox/value";class u extends Error{issues;constructor(r){super(r.map((t)=>{return`${t.path.length>0?t.path.join("."):"root"}: ${t.message}`}).join("; "));this.issues=r;this.name="SchemaValidationError"}}function p(r){if(!r)return[];return r.split("/").slice(1).map((t)=>t.replace(/~1/g,"/").replace(/~0/g,"~")).map((t)=>/^(0|[1-9]\d*)$/.test(t)?Number(t):t)}function g(r,t){let n=r;for(let e of t){if(n===null||typeof n!=="object")return;n=n[e]}return n}function i(r,t){let[,n]=d.Errors(r,t);return n.map((e)=>{let s=p(e.instancePath);return{code:e.keyword,path:s,message:e.message,value:g(t,s)}})}function a(r,t){let n=o.Default(r,o.Clone(t)),e=i(r,n);if(e.length>0)return{success:!1,error:new u(e)};let s=o.Clean(r,n),c=i(r,s);if(c.length>0)return{success:!1,error:new u(c)};return{success:!0,data:s}}function f(r,t){let n=a(r,t);if(!n.success)throw n.error;return n.data}import l from"typebox";function x(r){return Object.defineProperties(r,{parse:{value:(t)=>f(r,t),enumerable:!1},safeParse:{value:(t)=>a(r,t),enumerable:!1}}),r}function b(r,t){return l.Optional({...r,default:t})}function V(r,t={}){return l.Unsafe({type:"string",enum:[...r],...t})}
2
- export{a as hf,f as if,l as jf,x as kf,b as lf,V as mf};
2
+ export{a as bf,f as cf,l as df,x as ef,b as ff,V as gf};
@@ -1,4 +1,4 @@
1
- import{Wd as L1,Xd as Z0,Yd as G1}from"./chunk-5xph8r1k.js";import{ae as $O,be as HO}from"./chunk-5sw8j9ae.js";import{ee as Y1}from"./chunk-18n15nn8.js";import{fe as B0,he as M0}from"./chunk-86zsjamb.js";import{pe as h,qe as z}from"./chunk-w56y2pvk.js";import{Te as V0,Ue as o1,bf as j0}from"./chunk-edqtngzr.js";import{hf as u,jf as W,mf as R1}from"./chunk-hpmxmkzc.js";import{tf as b}from"./chunk-p1dp2xgq.js";import{Gf as d0}from"./chunk-c29y2s8g.js";import{Lf as T}from"./chunk-pccn8ndq.js";import J1 from"node:path";import L$ from"node:path";import C0 from"node:fs";import J0 from"node:os";import R from"node:path";import jO from"yaml";var g$={type:"object",properties:{verdict:{type:"string",enum:["pass","fail","partial"]},summary:{type:"string",minLength:1,maxLength:2000},findings:{type:"array",maxItems:50,items:{type:"string",minLength:1,maxLength:1000}}},required:["verdict","summary","findings"],additionalProperties:!1};function u$(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let $=O.verdict;return $==="pass"||$==="fail"||$==="partial"?$:void 0}var UO=`# Goal Completion Verifier
1
+ import{Wd as L1,Xd as Z0,Yd as G1}from"./chunk-5xph8r1k.js";import{ae as $O,be as HO}from"./chunk-5sw8j9ae.js";import{ee as Y1}from"./chunk-18n15nn8.js";import{fe as B0,he as M0}from"./chunk-wyq21fev.js";import{Pe as V0,Qe as o1,_e as j0}from"./chunk-565weg3f.js";import{bf as u,df as W,gf as R1}from"./chunk-r561wfcz.js";import{nf as b}from"./chunk-dbb20rxh.js";import{rf as h,sf as z}from"./chunk-awwe1rqb.js";import{Ff as d0}from"./chunk-9gtc0kd2.js";import{Kf as T}from"./chunk-6vhc5gdf.js";import J1 from"node:path";import L$ from"node:path";import C0 from"node:fs";import J0 from"node:os";import R from"node:path";import jO from"yaml";var g$={type:"object",properties:{verdict:{type:"string",enum:["pass","fail","partial"]},summary:{type:"string",minLength:1,maxLength:2000},findings:{type:"array",maxItems:50,items:{type:"string",minLength:1,maxLength:1000}}},required:["verdict","summary","findings"],additionalProperties:!1};function u$(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let $=O.verdict;return $==="pass"||$==="fail"||$==="partial"?$:void 0}var UO=`# Goal Completion Verifier
2
2
 
3
3
  You are a fresh, independent, adversarial verifier. The parent Agent has claimed
4
4
  that a persisted goal is complete. Your job is to refute that claim unless the
@@ -87,7 +87,7 @@ Your final response must be exactly one JSON object and no Markdown fence:
87
87
 
88
88
  Use workspace-relative paths. Keep line ranges within 10 lines and overlapping
89
89
  the reviewed diff. Return an empty findings array when no qualifying defect is
90
- found.`,W1={name:G1,description:"Independent read-only code reviewer for uncommitted changes, base branches, and commits.",tools:["Read","Glob","Grep","Bash"],disallowedTools:["Task","WebFetch","WebSearch"],permissionMode:"default",maxTurns:24,systemPrompt:SO,source:"builtin"};var X1={name:"verification",description:"Independent verification agent that validates implementation by running builds, tests, linters, and adversarial"+" probes. Strictly read-only — cannot modify code. Use"+" after completing implementation to get an independent quality assessment.",tools:["Read","Glob","Grep","Bash"],systemPrompt:`# Verification Agent
90
+ found.`,W1={name:G1,description:"Independent read-only code reviewer for uncommitted changes, base branches, and commits.",tools:["Read","Glob","Grep","Bash"],disallowedTools:["Task","WebFetch","WebSearch"],permissionMode:"default",maxTurns:24,systemPrompt:SO,source:"builtin"};var X1={name:"verification",description:"Independent verification agent that validates implementation by running builds, tests, linters, and adversarial"+" probes. Strictly read-only — cannot modify code. Use"+" after completing implementation to get an independent quality assessment.",tools:["Read","Glob","Grep","Bash"],maxTurns:12,systemPrompt:`# Verification Agent
91
91
 
92
92
  You are an **independent verification engineer**. Your sole purpose is to find problems — not to praise or reassure. You are the last line of defense before code ships.
93
93
 
@@ -97,6 +97,7 @@ You are an **independent verification engineer**. Your sole purpose is to find p
97
97
  2. **NO SUB-AGENTS**: You must not delegate to other agents or use the Task tool. Execute all verification steps yourself using your tools directly.
98
98
  3. **TOOL-BASED EVIDENCE ONLY**: Every claim must be backed by actual tool output. Never say "looks correct" or "should work" — run the command and prove it.
99
99
  4. **NO ASSUMPTIONS**: Do not assume tests pass. Do not assume types are correct. Run the checks.
100
+ 5. **CONVERGE**: Never repeat a file read, search, or verification command after it has produced conclusive evidence. Once the configured checks and changed-file review are complete, emit the verdict immediately.
100
101
 
101
102
  ## Verification Workflow
102
103
 
@@ -445,7 +446,7 @@ Blade 采用三层配置,优先级从低到高:
445
446
  | Local | \`.blade/settings.local.json\` | 本地覆盖,.gitignore | \`local\` |
446
447
 
447
448
  **选择原则:**
448
- - 个人偏好(theme, language, fontSize)→ \`global\`
449
+ - 个人偏好(codeTheme, language, fontSize)→ \`global\`
449
450
  - 团队共享(hooks, permissions, env)→ \`project\`
450
451
  - 临时调试(debug, maxTurns)→ \`local\`
451
452
 
@@ -504,7 +505,7 @@ ConfigTool({ operation: "list" })
504
505
  | maxContextTokens | number | 上下文窗口大小 |
505
506
  | maxOutputTokens | number | 输出 token 限制 |
506
507
  | timeout | number | HTTP 请求超时(毫秒)|
507
- | theme | string | 终端主题 |
508
+ | codeTheme | string | 代码与终端主题 |
508
509
  | uiTheme | string | Web UI 主题 |
509
510
  | language | string | 界面语言 |
510
511
  | fontSize | number | 字体大小 |
@@ -702,7 +703,7 @@ ConfigTool({
702
703
  1. **hooks 字段使用 deep-merge 策略**:设置新的 hook 不会覆盖已有的 hook。但如果同一事件下设置新的 matcher 数组,会替换该事件的整个 matcher 列表
703
704
  2. **permissions 字段使用 replace 策略**:设置 permissions 会完全替换现有值。如果只想添加规则,先 GET 当前值,合并后再 SET
704
705
  3. **env 字段使用 deep-merge 策略**:可以逐个添加环境变量
705
- 4. **scope 默认值**:不指定 scope 时,根据字段路由表决定(hooks/permissions/env 默认 local,temperature/theme 等默认 global)
706
+ 4. **scope 默认值**:不指定 scope 时,根据字段路由表决定(hooks/permissions/env 默认 local,temperature/codeTheme 等默认 global)
706
707
  `}}import{exec as zO}from"node:child_process";import*as U from"node:fs/promises";import{homedir as BO}from"node:os";import*as I from"node:path";import{promisify as MO}from"node:util";var X0=MO(zO),x=h("General"),R0={url:"https://github.com/anthropics/skills.git",branch:"main",defaultSkills:["skill-creator"]};class V1{skillsDir;constructor(O){this.skillsDir=O||I.join(BO(),".blade","skills")}async isInstalled(O){let $=I.join(this.skillsDir,O,"SKILL.md");try{return await U.access($),!0}catch{return!1}}async isGitAvailable(){try{return await X0("git --version"),!0}catch{return!1}}async installOfficialSkill(O){let{url:$,branch:Q}=R0,q=I.join(this.skillsDir,O),Z=I.join(this.skillsDir,`.tmp-${O}-${Date.now()}`);try{if(!await this.isGitAvailable())return x.warn("Git not available, skipping skill installation"),!1;x.info(`Installing official skill: ${O}...`),await U.mkdir(this.skillsDir,{recursive:!0,mode:493}),await X0(`git clone --depth 1 --branch ${Q} --single-branch ${$} "${Z}"`,{timeout:30000});let J=I.join(Z,"skills",O);try{await U.access(J)}catch{return x.warn(`Skill ${O} not found in official repository`),await U.rm(Z,{recursive:!0,force:!0}),!1}try{await U.rm(q,{recursive:!0,force:!0})}catch{}return await U.cp(J,q,{recursive:!0}),await U.rm(Z,{recursive:!0,force:!0}),x.info(`Successfully installed: ${O}`),!0}catch(J){try{await U.rm(Z,{recursive:!0,force:!0})}catch{}return x.warn(`Failed to install ${O}: ${J instanceof Error?J.message:"Unknown error"}`),!1}}async ensureDefaultSkillsInstalled(){await U.mkdir(this.skillsDir,{recursive:!0,mode:493});for(let O of R0.defaultSkills)if(!await this.isInstalled(O))await this.installOfficialSkill(O)}async installFromRepo(O,$){let Q=$||this.extractRepoName(O),q=I.join(this.skillsDir,Q),Z=I.join(this.skillsDir,`.tmp-repo-${Q}-${Date.now()}`);try{if(!await this.isGitAvailable())return x.warn("Git not available, cannot install from repo"),!1;x.info(`Installing skill from repo: ${O}...`),await U.mkdir(this.skillsDir,{recursive:!0,mode:493}),await X0(`git clone --depth 1 "${O}" "${Z}"`,{timeout:60000});let J=I.join(Z,"SKILL.md");try{await U.access(J)}catch{return x.warn(`No SKILL.md found in repository ${O}`),await U.rm(Z,{recursive:!0,force:!0}),!1}await U.rm(q,{recursive:!0,force:!0}),await U.rename(Z,q);try{await U.rm(I.join(q,".git"),{recursive:!0,force:!0})}catch{}return x.info(`Successfully installed skill from repo: ${Q}`),!0}catch(J){try{await U.rm(Z,{recursive:!0,force:!0})}catch{}return x.warn(`Failed to install from repo ${O}: ${J instanceof Error?J.message:"Unknown error"}`),!1}}async installFromLocal(O,$,Q=!0){let q=$||I.basename(O),Z=I.join(this.skillsDir,q);try{let J=I.resolve(O);try{await U.access(J)}catch{return x.warn(`Local path does not exist: ${J}`),!1}let K=I.join(J,"SKILL.md");try{await U.access(K)}catch{return x.warn(`No SKILL.md found in local path: ${J}`),!1}if(x.info(`Installing skill from local path: ${J}...`),await U.mkdir(this.skillsDir,{recursive:!0,mode:493}),await U.rm(Z,{recursive:!0,force:!0}),Q)await U.symlink(J,Z,"dir"),x.info(`Created symlink for skill: ${q}`);else await U.cp(J,Z,{recursive:!0}),x.info(`Copied skill to: ${q}`);return!0}catch(J){return x.warn(`Failed to install from local path ${O}: ${J instanceof Error?J.message:"Unknown error"}`),!1}}extractRepoName(O){return O.match(/\/([^/]+?)(\.git)?$/)?.[1]||"unknown-skill"}async installAllOfficialSkills(){let{url:O,branch:$}=R0,Q=I.join(this.skillsDir,`.tmp-all-${Date.now()}`),q=[],Z=[];try{if(!await this.isGitAvailable())return x.warn("Git not available, skipping skill installation"),{installed:q,failed:Z};await U.mkdir(this.skillsDir,{recursive:!0,mode:493}),x.info("Cloning official skills repository..."),await X0(`git clone --depth 1 --branch ${$} --single-branch ${O} "${Q}"`,{timeout:60000});let J=I.join(Q,"skills"),K=await U.readdir(J,{withFileTypes:!0});for(let X of K){if(!X.isDirectory())continue;let G=X.name,L=I.join(J,G),Y=I.join(this.skillsDir,G);try{await U.access(I.join(L,"SKILL.md")),await U.rm(Y,{recursive:!0,force:!0}),await U.cp(L,Y,{recursive:!0}),x.info(`Installed: ${G}`),q.push(G)}catch(V){x.warn(`Failed to install ${G}`),Z.push(G)}}await U.rm(Q,{recursive:!0,force:!0})}catch(J){try{await U.rm(Q,{recursive:!0,force:!0})}catch{}x.warn(`Failed to install skills: ${J instanceof Error?J.message:"Unknown error"}`)}return{installed:q,failed:Z}}}var v0=null;function U1(O){if(!v0)v0=new V1(O);return v0}import*as t from"node:fs/promises";import*as L0 from"node:path";import{parse as xO}from"yaml";var IO=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,bO=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]?$/,S1=1024;function AO(O){if(!O)return;if(typeof O==="string")return O.split(",").map(($)=>$.trim()).filter(Boolean);if(Array.isArray(O))return O.map(($)=>String($).trim()).filter(Boolean);return}function j1(O){if(O===void 0)return;if(typeof O==="boolean")return O;if(typeof O==="string"){let $=O.toLowerCase().trim();if($==="true"||$==="yes"||$==="1")return!0;if($==="false"||$==="no"||$==="0")return!1}return}function _O(O,$){if(!O.name)return{valid:!1,error:"Missing required field: name"};if(!bO.test(O.name))return{valid:!1,error:`Invalid name "${O.name}": must be lowercase letters, numbers, and hyphens only, 1-64 characters`};if(!O.description)return{valid:!1,error:"Missing required field: description"};if(O.description.length>S1)return{valid:!1,error:`Description too long: ${O.description.length} characters (max ${S1})`};let Q;if(O.model)Q=O.model==="inherit"?"inherit":O.model;return{valid:!0,metadata:{name:O.name,description:O.description.trim(),allowedTools:AO(O["allowed-tools"]),version:O.version,argumentHint:O["argument-hint"]?.trim(),userInvocable:j1(O["user-invocable"]),disableModelInvocation:j1(O["disable-model-invocation"]),model:Q,whenToUse:O.when_to_use?.trim()}}}function z1(O,$,Q){let q=O.match(IO);if(!q)return{success:!1,error:"Invalid SKILL.md format: missing YAML frontmatter (must start with ---)"};let[,Z,J]=q,K;try{K=xO(Z)}catch(L){return{success:!1,error:`Failed to parse YAML frontmatter: ${L instanceof Error?L.message:String(L)}`}}let X=_O(K,$);if(!X.valid)return{success:!1,error:X.error};let G=L0.dirname($);return{success:!0,content:{metadata:{...X.metadata,path:$,basePath:G,source:Q},instructions:J.trim()}}}async function Y0(O,$){try{let Q=await t.readFile(O,"utf-8");return z1(Q,O,$)}catch(Q){if(Q.code==="ENOENT")return{success:!1,error:`File not found: ${O}`};return{success:!1,error:`Failed to read file: ${Q instanceof Error?Q.message:String(Q)}`}}}async function B1(O){try{let $=await t.readFile(O.path,"utf-8"),Q=z1($,O.path,O.source);return Q.success?Q.content:null}catch{return null}}async function M1(O){try{return await t.access(L0.join(O,"SKILL.md")),!0}catch{return!1}}var TO={userSkillsDir:_.join(x1(),".blade","skills"),projectSkillsDir:".blade/skills",claudeUserSkillsDir:_.join(x1(),".claude","skills"),claudeProjectSkillsDir:".claude/skills"},y0=new Map;function wO(O){return _.resolve(O?.cwd??b())}class k{skills=new Map;pluginSkills=new Map;config;initialized=!1;constructor(O){this.config={...TO,cwd:b(),...O}}static getInstance(O){let $=wO(O),Q=y0.get($);if(!Q)Q=new k({...O,cwd:_.resolve(O?.cwd??b())}),y0.set($,Q);return Q}static resetInstance(){y0.clear()}async initialize(){if(this.initialized)return{skills:Array.from(this.skills.values()),errors:[]};let O=[],$=[];try{await U1(this.config.userSkillsDir).ensureDefaultSkillsInstalled()}catch(J){O.push({path:"SkillInstaller",error:`Failed to install default skills: ${J instanceof Error?J.message:"Unknown error"}`})}this.loadBuiltinSkills();let Q=await this.scanDirectory(this.config.claudeUserSkillsDir,"user");$.push(...Q.skills),O.push(...Q.errors);let q=await this.scanDirectory(this.config.userSkillsDir,"user");if($.push(...q.skills),O.push(...q.errors),(await T.getInstance().getStatus(this.config.cwd)).state==="trusted"){let J=_.isAbsolute(this.config.claudeProjectSkillsDir)?this.config.claudeProjectSkillsDir:_.join(this.config.cwd,this.config.claudeProjectSkillsDir),K=await this.scanDirectory(J,"project");$.push(...K.skills),O.push(...K.errors);let X=_.isAbsolute(this.config.projectSkillsDir)?this.config.projectSkillsDir:_.join(this.config.cwd,this.config.projectSkillsDir),G=await this.scanDirectory(X,"project");$.push(...G.skills),O.push(...G.errors)}for(let J of $)this.skills.set(J.name,J);return this.initialized=!0,{skills:Array.from(this.skills.values()),errors:O}}loadBuiltinSkills(){this.skills.set(G0.name,G0),this.skills.set(W0.name,W0)}async scanDirectory(O,$){let Q=[],q=[];try{await H0.access(O)}catch{return{skills:Q,errors:q}}try{let Z=await H0.readdir(O,{withFileTypes:!0});for(let J of Z){if(!J.isDirectory())continue;let K=_.join(O,J.name),X=_.join(K,"SKILL.md");if(!await M1(K))continue;let G=await Y0(X,$);if(G.success&&G.content)Q.push(G.content.metadata);else q.push({path:X,error:G.error||"Unknown error"})}}catch(Z){q.push({path:O,error:`Failed to scan directory: ${Z instanceof Error?Z.message:String(Z)}`})}return{skills:Q,errors:q}}getAll(){return Array.from(this.skills.values())}get(O){return this.skills.get(O)}has(O){return this.skills.has(O)}async loadContent(O){let $=this.skills.get(O);if(!$)return null;if($.source==="builtin")return this.loadBuiltinContent(O);return B1($)}loadBuiltinContent(O){switch(O){case"skill-creator":return H1();case"update-config":return F1();default:return null}}getModelInvocableSkills(){return Array.from(this.skills.values()).filter((O)=>!O.disableModelInvocation)}getUserInvocableSkills(){return Array.from(this.skills.values()).filter((O)=>O.userInvocable===!0)}generateAvailableSkillsList(){let O=this.getModelInvocableSkills();if(O.length===0)return"";let $=[];for(let Q of O){let q=Q.description.length>100?`${Q.description.substring(0,97)}...`:Q.description,Z=Q.argumentHint?`${Q.name} ${Q.argumentHint}`:Q.name;$.push(`- ${Z}: ${q}`)}return $.join(`
707
708
  `)}get size(){return this.skills.size}async refresh(){return this.skills.clear(),this.pluginSkills.clear(),this.initialized=!1,this.initialize()}snapshot(){let O=new k({...this.config});return O.skills=new Map(Array.from(this.skills,([$,Q])=>[$,{...Q,...Q.allowedTools?{allowedTools:[...Q.allowedTools]}:{}}])),O.pluginSkills=new Map(Array.from(this.pluginSkills,([$,Q])=>[$,{...Q,metadata:{...Q.metadata,...Q.metadata.allowedTools?{allowedTools:[...Q.metadata.allowedTools]}:{}}}])),O.initialized=this.initialized,O}registerPluginSkill(O){this.pluginSkills.set(O.namespacedName,O),this.skills.set(O.namespacedName,O.metadata)}findPluginSkill(O){let $=this.pluginSkills.get(O);if($)return $;let Q=[];for(let q of this.pluginSkills.values())if(q.originalName===O)Q.push(q);if(Q.length===1)return Q[0];return}getAllPluginSkills(){return Array.from(this.pluginSkills.values())}clearPluginSkills(){for(let O of this.pluginSkills.values())this.skills.delete(O.namespacedName);this.pluginSkills.clear()}getPluginSkillCount(){return this.pluginSkills.size}}function P(O){return k.getInstance(O)}async function CO(O){return P(O).initialize()}import vO from"node:path";import{execSync as DO}from"node:child_process";import I1 from"node:fs";import b1 from"node:path";class E0{async execute(O,$){let Q=O.content;if($.signal?.aborted)throw Error("Command execution aborted");return Q=this.interpolateArgs(Q,$.args),Q=await this.executeBashEmbeds(Q,$),Q=await this.resolveFileReferences(Q,$.workspaceRoot),Q}interpolateArgs(O,$){O=O.replace(/\$ARGUMENTS/g,$.join(" "));for(let Q=9;Q>=1;Q--){let q=`$${Q}`,Z=$[Q-1]??"";O=O.split(q).join(Z)}return O}async executeBashEmbeds(O,$){let Q=/!`([^`]+)`/g,q=[];for(let J of O.matchAll(Q))q.push({match:J[0],command:J[1]});let Z=O;for(let{match:J,command:K}of q){if($.signal?.aborted){Z=Z.replace(J,"[Execution aborted]");continue}try{let X=DO(K,{cwd:$.workspaceRoot,encoding:"utf-8",timeout:30000,maxBuffer:1048576,stdio:["pipe","pipe","pipe"]}).trim();Z=Z.replace(J,X)}catch(X){let G=X instanceof Error?X.message:String(X);Z=Z.replace(J,`[Error executing '${K}': ${G}]`)}}return Z}async resolveFileReferences(O,$){let Q=/@([\w./-]+(?:\/[\w./-]+|\.[\w]+))/g,q=[];for(let J of O.matchAll(Q))q.push({match:J[0],relativePath:J[1]});let Z=O;for(let{match:J,relativePath:K}of q){let X=b1.resolve($,K);try{if(I1.statSync(X).isFile()){let L=I1.readFileSync(X,"utf-8"),V=`\`\`\`${b1.extname(K).slice(1)||"text"}
708
709
  ${L}
@@ -1,4 +1,4 @@
1
- import{ka as H}from"./chunk-yaxapgbm.js";import"./chunk-4dnvydyv.js";import{dd as $,jd as T}from"./chunk-n00mknme.js";import"./chunk-qg87zezq.js";import"./chunk-xjqcc0nt.js";import"./chunk-86zsjamb.js";import"./chunk-6pb6zs96.js";import"./chunk-w56y2pvk.js";import"./chunk-edqtngzr.js";import"./chunk-vmzf4nvh.js";import"./chunk-hpmxmkzc.js";import"./chunk-bpz0g8ej.js";import{tf as k}from"./chunk-p1dp2xgq.js";import"./chunk-c674mmtj.js";import"./chunk-1gkpjhts.js";import"./chunk-c29y2s8g.js";import"./chunk-pccn8ndq.js";import"./chunk-x6tns9d8.js";import"./chunk-s14wmzm3.js";import"./chunk-vns8g2rv.js";import U from"os";import J from"path";function X(z){return typeof z==="string"?z:void 0}function N(z){if(!Array.isArray(z))return;let q=[];for(let K of z)if(typeof K==="string")q.push(K);else if(K!=null)q.push(String(K));return q}function b(){console.log(`
1
+ import{ka as H}from"./chunk-b22x3h7k.js";import"./chunk-4dnvydyv.js";import{ed as $,kd as T}from"./chunk-wbvs2tv5.js";import"./chunk-v508x7cg.js";import"./chunk-xjqcc0nt.js";import"./chunk-wyq21fev.js";import"./chunk-6pb6zs96.js";import"./chunk-565weg3f.js";import"./chunk-58wxa5cj.js";import"./chunk-r561wfcz.js";import"./chunk-0qayfsc9.js";import{nf as k}from"./chunk-dbb20rxh.js";import"./chunk-awwe1rqb.js";import"./chunk-7tea6e9y.js";import"./chunk-9tp00s2z.js";import"./chunk-9gtc0kd2.js";import"./chunk-6vhc5gdf.js";import"./chunk-qdngw7h1.js";import"./chunk-vjrn667c.js";import"./chunk-86g3xxx7.js";import U from"os";import J from"path";function X(z){return typeof z==="string"?z:void 0}function N(z){if(!Array.isArray(z))return;let q=[];for(let K of z)if(typeof K==="string")q.push(K);else if(K!=null)q.push(String(K));return q}function b(){console.log(`
2
2
  blade mcp
3
3
  `),console.log(`管理 MCP 服务器
4
4
  `),console.log("Commands:"),console.log(" blade mcp add <name> <commandOrUrl> [args...] 添加 MCP 服务器"),console.log(" blade mcp remove <name> 删除 MCP 服务器 [aliases: rm]"),console.log(" blade mcp list 列出所有 MCP 服务器并检查健康状态 [aliases: ls]"),console.log(" blade mcp get <name> 获取服务器详情"),console.log(" blade mcp login <name> 登录远程 MCP OAuth"),console.log(" blade mcp logout <name> 清除远程 MCP OAuth 凭证"),console.log(` blade mcp add-json <name> <json> 从 JSON 字符串添加服务器
@@ -0,0 +1,2 @@
1
+ import{Ff as S}from"./chunk-9gtc0kd2.js";import{Wf as f}from"./chunk-86g3xxx7.js";import*as $ from"fs/promises";import*as K from"path";import j from"semver";import{ProxyAgent as H,fetch as I}from"undici";function R(){return process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy}function N(){let q=R();if(q)try{return new H(q)}catch(z){console.warn(`[proxyFetch] Invalid proxy URL: ${q}`)}return}async function M(q,z={}){let{timeout:W=30000,signal:Q,...B}=z;if(Q?.aborted)throw new DOMException("The operation was aborted.","AbortError");let J=N(),X=new AbortController,Y=!1,F=setTimeout(()=>{Y=!0,X.abort()},W),b=()=>X.abort();Q?.addEventListener("abort",b);try{let Z={method:B.method,headers:B.headers,body:B.body,signal:X.signal,dispatcher:J};return await I(q.toString(),Z)}catch(Z){if(Z instanceof Error&&Z.name==="AbortError"){if(Y)throw Error(`Request timeout after ${W}ms`);throw Z}throw Z}finally{clearTimeout(F),Q?.removeEventListener("abort",b)}}var w="blade-code",y="https://cdn.jsdelivr.net/npm/blade-code@latest/CHANGELOG.md",G=K.join(process.env.HOME||process.env.USERPROFILE||".",".blade"),O=K.join(G,"version-cache.json"),P=3600000,k=`https://registry.npmjs.org/${w}/latest`;async function L(){try{if(process.env.BLADE_VERSION)return process.env.BLADE_VERSION;return S()}catch{return"unknown"}}async function T(){try{let q=await $.readFile(O,"utf-8"),z=JSON.parse(q);if(Date.now()-z.checkedAt<P)return z;return{...z,checkedAt:0}}catch{return null}}async function D(q){try{await $.mkdir(G,{recursive:!0,mode:493}),await $.writeFile(O,JSON.stringify(q,null,2))}catch{}}async function x(){try{let q=await M(k,{timeout:5000,headers:{Accept:"application/json"}});if(!q.ok)return null;return(await q.json()).version||null}catch{return null}}async function _(q=!1){let z=await L(),W=y;if(z==="unknown")return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to determine current version"};let Q=await T(),B=Q?.skipUntilVersion,J=null;if(!q&&Q?.latestVersion&&Q.checkedAt>0)J=Q.latestVersion;else if(J=await x(),J)await D({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});else if(Q?.latestVersion)await D({checkedAt:0,skipUntilVersion:B});if(!J||!j.valid(J))return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to check for updates"};if(j.lt(J,z))J=z,await D({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});let X=j.gt(J,z),Y=X;if(X&&B)Y=j.gt(J,B);return{currentVersion:z,latestVersion:J,hasUpdate:X,shouldPrompt:Y,releaseNotesUrl:W}}async function u(q){let z=await T();await D({latestVersion:z?.latestVersion??q,checkedAt:z?.checkedAt||Date.now(),skipUntilVersion:q})}function g(){return`npm install -g ${w}@latest --registry https://registry.npmjs.org`}async function C(){let{spawn:q}=await import("child_process");return new Promise((z)=>{let W=g(),Q=q(W,{stdio:"inherit",shell:!0});Q.on("close",(B)=>{if(B===0)z({success:!0,message:"Upgrade successful! Please restart blade."});else z({success:!1,message:`Upgrade failed (exit code: ${B})`})}),Q.on("error",(B)=>{z({success:!1,message:`Upgrade failed: ${B.message}`})})})}async function V(){try{let q=await _();return q.shouldPrompt?q:null}catch{return null}}
2
+ export{_ as a,u as b,g as c,C as d,V as e};
@@ -1,2 +1,2 @@
1
- import{C as o}from"./chunk-nqpcwa0k.js";import{fc as i}from"./chunk-3qmwt188.js";import a from"node:path";function n(e){let s=e.replace(/\s+/g," ").trim();return s.length<=72?s:`${s.slice(0,69)}...`}function c(e){let s=e.replace(/\s+/g," ").trim();return s.length<=500?s:`${s.slice(0,497)}...`}function d(e){return`task/${e.replace(/[^a-zA-Z0-9_-]/g,"-").slice(0,40)}`}class m{static async createSessionTask(e){if(!e.prompt.trim())throw Error("Task prompt must not be blank");if(!a.isAbsolute(e.sourceProjectPath))throw Error("Task source project path must be absolute");let s=a.resolve(e.sourceProjectPath),t;try{return t=e.isolation==="worktree"?await o.enter({sessionId:e.sessionId,workspaceRoot:s,name:d(e.sessionId)}):void 0,{metadata:await i.createSessionMetadata(e.sessionId,t?.workspaceRoot??s,{title:e.title?.trim()||n(e.prompt),taskPromptSummary:c(e.prompt),taskDispatch:e.dispatch,taskModelId:e.dispatch?.modelId,selectedModelId:e.dispatch?.modelId,permissionMode:e.dispatch?.permissionMode,reasoningEffort:e.dispatch?.reasoningEffort,serviceTier:e.dispatch?.serviceTier,responseVerbosity:e.dispatch?.responseVerbosity,communicationStyle:e.dispatch?.communicationStyle,communicationStyleDigest:e.dispatch?.communicationStyleDigest,projectInstructionsDigest:e.dispatch?.projectInstructionsDigest,taskRetriedFrom:e.retriedFrom,taskIsolation:e.isolation,taskSourceProjectPath:s,taskWorktree:t}),taskWorktree:t}}catch(r){if(t)await o.exit({sessionId:e.sessionId,action:"remove",discardChanges:!0}).catch(()=>{return});throw r}}}
1
+ import{C as o}from"./chunk-10yas08a.js";import{gc as i}from"./chunk-vbsk6mjn.js";import a from"node:path";function n(e){let s=e.replace(/\s+/g," ").trim();return s.length<=72?s:`${s.slice(0,69)}...`}function c(e){let s=e.replace(/\s+/g," ").trim();return s.length<=500?s:`${s.slice(0,497)}...`}function d(e){return`task/${e.replace(/[^a-zA-Z0-9_-]/g,"-").slice(0,40)}`}class m{static async createSessionTask(e){if(!e.prompt.trim())throw Error("Task prompt must not be blank");if(!a.isAbsolute(e.sourceProjectPath))throw Error("Task source project path must be absolute");let s=a.resolve(e.sourceProjectPath),t;try{return t=e.isolation==="worktree"?await o.enter({sessionId:e.sessionId,workspaceRoot:s,name:d(e.sessionId)}):void 0,{metadata:await i.createSessionMetadata(e.sessionId,t?.workspaceRoot??s,{title:e.title?.trim()||n(e.prompt),taskPromptSummary:c(e.prompt),taskDispatch:e.dispatch,taskModelId:e.dispatch?.modelId,selectedModelId:e.dispatch?.modelId,permissionMode:e.dispatch?.permissionMode,reasoningEffort:e.dispatch?.reasoningEffort,serviceTier:e.dispatch?.serviceTier,responseVerbosity:e.dispatch?.responseVerbosity,communicationStyle:e.dispatch?.communicationStyle,communicationStyleDigest:e.dispatch?.communicationStyleDigest,projectInstructionsDigest:e.dispatch?.projectInstructionsDigest,taskRetriedFrom:e.retriedFrom,taskIsolation:e.isolation,taskSourceProjectPath:s,taskWorktree:t}),taskWorktree:t}}catch(r){if(t)await o.exit({sessionId:e.sessionId,action:"remove",discardChanges:!0}).catch(()=>{return});throw r}}}
2
2
  export{m as s};
File without changes