blade-code 0.10.24 → 0.10.26

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 (112) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-01n8k1jj.js +1 -0
  3. package/dist/{chunk-1gkpjhts.js → chunk-0q4jbbm5.js} +1 -1
  4. package/dist/{chunk-9c3jjbgd.js → chunk-1g5h4zv6.js} +1 -1
  5. package/dist/{chunk-xzdpdwhz.js → chunk-1hzj6s0f.js} +2 -2
  6. package/dist/chunk-1mh2285d.js +200 -0
  7. package/dist/{chunk-26zhy301.js → chunk-20kg90zt.js} +2 -2
  8. package/dist/{chunk-18n15nn8.js → chunk-35d5gdgw.js} +1 -1
  9. package/dist/{chunk-f8zz4se0.js → chunk-46yg6dfr.js} +2 -2
  10. package/dist/{chunk-f4ksxskk.js → chunk-4aem0m2n.js} +1 -1
  11. package/dist/chunk-58tpe6nx.js +44 -0
  12. package/dist/{chunk-phzy5kqq.js → chunk-58yqrbey.js} +1 -1
  13. package/dist/{chunk-5xph8r1k.js → chunk-5mtryjjc.js} +1 -1
  14. package/dist/chunk-5yr2c8gz.js +25 -0
  15. package/dist/chunk-6axhk4r7.js +2 -0
  16. package/dist/chunk-6k74z0eb.js +2 -0
  17. package/dist/{chunk-yac1ga9w.js → chunk-6srz3q5d.js} +1 -1
  18. package/dist/{chunk-d2kzet1k.js → chunk-7jv8thn1.js} +2 -2
  19. package/dist/{chunk-3fkj59nv.js → chunk-89gswfb2.js} +1 -1
  20. package/dist/{chunk-w56y2pvk.js → chunk-8htfb5zn.js} +2 -2
  21. package/dist/{chunk-hpmxmkzc.js → chunk-9ka0bdry.js} +1 -1
  22. package/dist/{chunk-m13jrgp9.js → chunk-a4cyec1y.js} +2 -2
  23. package/dist/chunk-aa28p37g.js +2 -0
  24. package/dist/chunk-acf5v2fv.js +2 -0
  25. package/dist/chunk-b5fegjt7.js +6 -0
  26. package/dist/chunk-bbjtt28z.js +1 -0
  27. package/dist/{chunk-6vfe3409.js → chunk-ct2x59pr.js} +1 -1
  28. package/dist/chunk-d9jz1edf.js +100 -0
  29. package/dist/chunk-dxgzyy09.js +1 -0
  30. package/dist/{chunk-j8ggq1z4.js → chunk-ebffhjma.js} +2 -2
  31. package/dist/{chunk-bp886b8j.js → chunk-edyxa2jw.js} +1 -1
  32. package/dist/{chunk-k2b95m2p.js → chunk-eqa706gn.js} +2 -2
  33. package/dist/chunk-f88wkyfm.js +1 -0
  34. package/dist/{chunk-aw8s1sej.js → chunk-fbc5zfq7.js} +1 -1
  35. package/dist/chunk-fkwqgqsw.js +1 -0
  36. package/dist/{chunk-m27w377p.js → chunk-fnt1z0y8.js} +1 -1
  37. package/dist/chunk-gahvpbbs.js +1 -0
  38. package/dist/{chunk-57q5wn4g.js → chunk-gn37wxwg.js} +1 -1
  39. package/dist/chunk-h2npwqz9.js +10 -0
  40. package/dist/{chunk-c674mmtj.js → chunk-jt55ct49.js} +2 -2
  41. package/dist/{chunk-xjqcc0nt.js → chunk-k99rbzqw.js} +1 -1
  42. package/dist/{chunk-wjqctwyr.js → chunk-kskg7crs.js} +26 -41
  43. package/dist/{chunk-p1dp2xgq.js → chunk-kvd5nexw.js} +1 -1
  44. package/dist/chunk-kwe0a3xw.js +1 -0
  45. package/dist/chunk-m7x4ya6m.js +1 -0
  46. package/dist/chunk-mqsxghqb.js +1 -0
  47. package/dist/chunk-nar8qz5t.js +1 -0
  48. package/dist/{chunk-5sw8j9ae.js → chunk-nt6xmzk0.js} +1 -1
  49. package/dist/chunk-p6nhdbdw.js +116 -0
  50. package/dist/{chunk-67ekta7b.js → chunk-pja0tttq.js} +1 -1
  51. package/dist/{chunk-my2jwz6y.js → chunk-px3t1rxa.js} +2 -2
  52. package/dist/chunk-pyfag66h.js +1 -0
  53. package/dist/chunk-q1papzdc.js +1 -0
  54. package/dist/{chunk-pccn8ndq.js → chunk-r46ws0q8.js} +2 -2
  55. package/dist/{chunk-bw7vknjr.js → chunk-rgafk34p.js} +1 -1
  56. package/dist/chunk-rth3jfdq.js +2 -0
  57. package/dist/{chunk-nqpcwa0k.js → chunk-rtktz9v1.js} +233 -231
  58. package/dist/{chunk-s14wmzm3.js → chunk-s1khjfye.js} +2 -2
  59. package/dist/{chunk-vns8g2rv.js → chunk-sprjrvn6.js} +1 -1
  60. package/dist/chunk-ss449b56.js +1 -0
  61. package/dist/{chunk-yaxapgbm.js → chunk-tg1mf1tf.js} +1 -1
  62. package/dist/{chunk-x6tns9d8.js → chunk-tnrrnzzv.js} +1 -1
  63. package/dist/chunk-v508x7cg.js +0 -0
  64. package/dist/chunk-vc2c8wkx.js +2 -0
  65. package/dist/chunk-vp50e95n.js +3 -0
  66. package/dist/chunk-wg8p9g0z.js +1 -0
  67. package/dist/chunk-xkb48pvz.js +1 -0
  68. package/dist/{chunk-t327cwnb.js → chunk-xp44jtsd.js} +1 -1
  69. package/dist/chunk-y2en7qvs.js +6 -0
  70. package/dist/{chunk-86zsjamb.js → chunk-zs9mwd17.js} +3 -3
  71. package/dist/web/assets/{ChatView-CCxjYDmJ.js → ChatView-Crna6-ID.js} +2 -2
  72. package/dist/web/assets/{CodeBlockHighlighter-D9MqsrZP.js → CodeBlockHighlighter-coWjWCyT.js} +1 -1
  73. package/dist/web/assets/{FilePreview-Cn5HOlPw.js → FilePreview-BKcCbpvz.js} +2 -2
  74. package/dist/web/assets/{MarkdownRenderer-ALTOCdfi.js → MarkdownRenderer-BqV1nvf1.js} +3 -3
  75. package/dist/web/assets/{SettingsModal-Dk69F1bS.js → SettingsModal-BOMswk9P.js} +2 -2
  76. package/dist/web/assets/{TaskSwitcher-DRZZocE1.js → TaskSwitcher-BEW2DhW3.js} +1 -1
  77. package/dist/web/assets/{TerminalPanel-ByAqKZ47.js → TerminalPanel-BXzypTz6.js} +1 -1
  78. package/dist/web/assets/index-DqXKkjcp.js +11 -0
  79. package/dist/web/index.html +1 -1
  80. package/package.json +2 -1
  81. package/dist/chunk-014rwj5b.js +0 -1
  82. package/dist/chunk-0568ndm9.js +0 -200
  83. package/dist/chunk-1pkca2km.js +0 -3
  84. package/dist/chunk-2wpnzjme.js +0 -1
  85. package/dist/chunk-3ak60ndt.js +0 -1
  86. package/dist/chunk-3qmwt188.js +0 -100
  87. package/dist/chunk-4a02yjg9.js +0 -2
  88. package/dist/chunk-6pb6zs96.js +0 -2
  89. package/dist/chunk-7dqc10sc.js +0 -1
  90. package/dist/chunk-ag07wwer.js +0 -2
  91. package/dist/chunk-bpz0g8ej.js +0 -2
  92. package/dist/chunk-bvwq5wth.js +0 -6
  93. package/dist/chunk-c29y2s8g.js +0 -2
  94. package/dist/chunk-d70mtcp4.js +0 -1
  95. package/dist/chunk-e71qm105.js +0 -1
  96. package/dist/chunk-edqtngzr.js +0 -44
  97. package/dist/chunk-f0mt91sr.js +0 -1
  98. package/dist/chunk-gwe547ww.js +0 -1
  99. package/dist/chunk-m486vmtn.js +0 -1
  100. package/dist/chunk-n00mknme.js +0 -25
  101. package/dist/chunk-n54tp9wr.js +0 -1
  102. package/dist/chunk-pq7tk058.js +0 -6
  103. package/dist/chunk-q5sewfn5.js +0 -1
  104. package/dist/chunk-qg87zezq.js +0 -1
  105. package/dist/chunk-r14bz8va.js +0 -1
  106. package/dist/chunk-rtkhyp1g.js +0 -1
  107. package/dist/chunk-s4mqw4wa.js +0 -116
  108. package/dist/chunk-sgnjekfb.js +0 -1
  109. package/dist/chunk-tetxqw28.js +0 -1
  110. package/dist/chunk-vmzf4nvh.js +0 -2
  111. package/dist/chunk-zm3zn23k.js +0 -10
  112. 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-aa28p37g.js";import{j as e9,k as $J}from"./chunk-gn37wxwg.js";import{r as p8}from"./chunk-1g5h4zv6.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-rtktz9v1.js";import{fa as I9,ga as T9,ha as f9,ka as JY}from"./chunk-tg1mf1tf.js";import"./chunk-89gswfb2.js";import{$a as l4,ib as u2}from"./chunk-1mh2285d.js";import{tb as X8}from"./chunk-4dnvydyv.js";import{Lb as m4,Vb as k4,Wb as x2,Xb as v4,Zb as D8,fc as Q8,ic as P0}from"./chunk-d9jz1edf.js";import"./chunk-p6nhdbdw.js";import{Gc as cJ}from"./chunk-6k74z0eb.js";import{Hc as G8,Ic as c8,Kc as T1}from"./chunk-px3t1rxa.js";import"./chunk-ebffhjma.js";import{$c as r0,Oc as C$,Pc as d0,Qc as s1,Rc as RQ,Sc as D$,Tc as V8,Uc as o6,Vc as uQ,Wc as d9,Xc as n6,Yc as k$,Zc as Q1,_c as $Y,ad as pJ,bd as b2,cd as Y8,fd as j4,md as g0}from"./chunk-5yr2c8gz.js";import"./chunk-v508x7cg.js";import"./chunk-k99rbzqw.js";import"./chunk-46yg6dfr.js";import{xd as lQ}from"./chunk-1hzj6s0f.js";import"./chunk-fnt1z0y8.js";import"./chunk-7jv8thn1.js";import{Id as W6,Ld as kJ,Rd as HJ,Xd as QY}from"./chunk-kskg7crs.js";import"./chunk-5mtryjjc.js";import"./chunk-nt6xmzk0.js";import"./chunk-35d5gdgw.js";import{je as IQ,le as U1}from"./chunk-zs9mwd17.js";import"./chunk-rth3jfdq.js";import{Te as sJ,cf as FJ,df as eJ}from"./chunk-58tpe6nx.js";import"./chunk-6axhk4r7.js";import"./chunk-9ka0bdry.js";import{lf as V$,mf as j8,nf as TQ}from"./chunk-vc2c8wkx.js";import{rf as x0}from"./chunk-kvd5nexw.js";import{sf as tJ,vf as n1}from"./chunk-8htfb5zn.js";import{Bf as V1,xf as n9,yf as t9}from"./chunk-jt55ct49.js";import"./chunk-0q4jbbm5.js";import{Nf as g9}from"./chunk-acf5v2fv.js";import{Of as sQ}from"./chunk-r46ws0q8.js";import"./chunk-tnrrnzzv.js";import"./chunk-s1khjfye.js";import{_f as CQ}from"./chunk-sprjrvn6.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
1
  function v(b){switch(b){case"default":case"ignore":case void 0:return"default";case"acceptEdits":return"autoEdit";case"dontAsk":case"bypassPermissions":return"yolo";case"plan":return"plan";default:return"default"}}
2
- export{v as ee};
2
+ export{v as ie};
@@ -1,5 +1,5 @@
1
- import{pe as R}from"./chunk-w56y2pvk.js";import{wf as q,yf as _}from"./chunk-c674mmtj.js";import{Bf as K}from"./chunk-1gkpjhts.js";var ie={openrouter:{"HTTP-Referer":"https://github.com/echoVic/blade-code","X-Title":"Blade"},cerebras:{"X-Cerebras-3rd-Party-Integration":"blade"}},N=(e)=>ie[e]||{};var se=new Set(["user-cancel","interrupt","sibling-error","timeout"]);function A(e){return typeof e==="string"&&se.has(e)}function Ne(e){if(!e.aborted)return;if(A(e.reason))return e.reason;return"user-cancel"}function je(e){if(A(e))return!0;if(!(e instanceof Error))return!1;if(e.name==="AbortError")return!0;if(e instanceof DOMException&&e.name==="AbortError")return!0;if(e.message.includes("aborted"))return!0;return!1}function U(...e){let t=e.filter(Boolean);if(t.length===0)return new AbortController().signal;if(t.length===1)return t[0];let o=AbortSignal;if(typeof o.any==="function")return o.any(t);for(let i of t)if(i.aborted)return i;let r=new AbortController,n=new Map;for(let i of t){let a=()=>{r.abort(i.reason);for(let[u,s]of n)u.removeEventListener("abort",s)};n.set(i,a)}for(let[i,a]of n)i.addEventListener("abort",a,{once:!0});return r.signal}function P(e,t,o){let r=o?.throwOnAbort??!1;if(t?.aborted){if(r)return Promise.reject(new DOMException("Aborted","AbortError"));return Promise.resolve()}return new Promise((n,i)=>{let a,u=setTimeout(()=>{if(t&&a)t.removeEventListener("abort",a);n()},e);if(t)a=()=>{if(clearTimeout(u),r)i(new DOMException("Aborted","AbortError"));else n()},t.addEventListener("abort",a,{once:!0})})}var ae=R("Chat"),ue={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};function E(e){if(typeof e==="string")return e;return e.filter((t)=>t.type==="text").map((t)=>t.text).join(`
1
+ import{vf as R}from"./chunk-8htfb5zn.js";import{Bf as _,zf as q}from"./chunk-jt55ct49.js";import{Ef as K}from"./chunk-0q4jbbm5.js";var ie={openrouter:{"HTTP-Referer":"https://github.com/echoVic/blade-code","X-Title":"Blade"},cerebras:{"X-Cerebras-3rd-Party-Integration":"blade"}},N=(e)=>ie[e]||{};var se=new Set(["user-cancel","interrupt","sibling-error","timeout"]);function A(e){return typeof e==="string"&&se.has(e)}function Ne(e){if(!e.aborted)return;if(A(e.reason))return e.reason;return"user-cancel"}function je(e){if(A(e))return!0;if(!(e instanceof Error))return!1;if(e.name==="AbortError")return!0;if(e instanceof DOMException&&e.name==="AbortError")return!0;if(e.message.includes("aborted"))return!0;return!1}function U(...e){let t=e.filter(Boolean);if(t.length===0)return new AbortController().signal;if(t.length===1)return t[0];let o=AbortSignal;if(typeof o.any==="function")return o.any(t);for(let i of t)if(i.aborted)return i;let r=new AbortController,n=new Map;for(let i of t){let a=()=>{r.abort(i.reason);for(let[u,s]of n)u.removeEventListener("abort",s)};n.set(i,a)}for(let[i,a]of n)i.addEventListener("abort",a,{once:!0});return r.signal}function P(e,t,o){let r=o?.throwOnAbort??!1;if(t?.aborted){if(r)return Promise.reject(new DOMException("Aborted","AbortError"));return Promise.resolve()}return new Promise((n,i)=>{let a,u=setTimeout(()=>{if(t&&a)t.removeEventListener("abort",a);n()},e);if(t)a=()=>{if(clearTimeout(u),r)i(new DOMException("Aborted","AbortError"));else n()},t.addEventListener("abort",a,{once:!0})})}var ae=R("Chat"),ue={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};function E(e){if(typeof e==="string")return e;return e.filter((t)=>t.type==="text").map((t)=>t.text).join(`
2
2
  `)}function de(e){if(!e)return{};try{let t=JSON.parse(e);return t&&typeof t==="object"&&!Array.isArray(t)?t:{}}catch{return ae.warn("[PiAIChatService] Invalid historical tool arguments",{value:e}),{}}}function ce(e){let t=e.match(/^data:([^;,]+);base64,(.+)$/s);return t?{mimeType:t[1],data:t[2]}:void 0}async function le(e,t){let o=ce(e);if(o)return{type:"image",...o};if(!/^https?:\/\//i.test(e))return{type:"text",text:`[Unsupported image source: ${e}]`};let r=await fetch(e,{signal:t});if(!r.ok)throw Error(`Failed to load image ${e}: HTTP ${r.status}`);return{type:"image",mimeType:r.headers.get("content-type")?.split(";")[0]??"image/png",data:Buffer.from(await r.arrayBuffer()).toString("base64")}}async function j(e,t,o,r,n){let i=e.filter((s)=>s.role==="system").map((s)=>E(s.content)).filter(Boolean).join(`
3
3
 
4
4
  `),a=[];for(let s of e){if(s.role==="system")continue;if(s.role==="user"){let c=t.input.includes("image"),d=typeof s.content==="string"?s.content:await Promise.all(s.content.map((l)=>l.type==="text"?Promise.resolve({type:"text",text:l.text}):c?le(l.image_url.url,r):Promise.resolve({type:"text",text:"[Image omitted: current model does not support image input]"})));a.push({role:"user",content:d,timestamp:Date.now()});continue}if(s.role==="assistant"){let c=[];if(s.reasoningContent?.trim())c.push({type:"thinking",thinking:s.reasoningContent});let d=E(s.content);if(d)c.push({type:"text",text:d});for(let l of s.tool_calls??[]){if(!("function"in l))continue;c.push({type:"toolCall",id:l.id,name:l.function.name,arguments:de(l.function.arguments)})}a.push({role:"assistant",content:c,api:t.api,provider:t.provider,model:t.id,usage:ue,stopReason:s.tool_calls?.length?"toolUse":"stop",timestamp:Date.now()});continue}a.push({role:"toolResult",toolCallId:s.tool_call_id??"",toolName:s.name??"unknown",content:[{type:"text",text:E(s.content)}],isError:!1,timestamp:Date.now()})}let u=o?.filter((s)=>!n||s.name===n).map((s)=>({name:s.name,description:s.description,parameters:s.parameters,constrainedSampling:s.constrainedSampling}));return{...i?{systemPrompt:i}:{},messages:a,...u?.length?{tools:u}:{}}}function B(e){let t=[];for(let o=0;o<e.length;o++){let r=e[o];if(r.role==="tool")continue;let n=r.role==="assistant"&&r.tool_calls?.length?r.tool_calls:void 0;if(!n){t.push(r);continue}let i=[],a=o+1;while(a<e.length&&e[a].role==="tool")i.push(e[a++]);let u=new Set(n.map((d)=>d.id)),s=i.filter((d)=>d.tool_call_id&&u.has(d.tool_call_id)),c=new Set(s.map((d)=>d.tool_call_id));if(u.size===n.length&&s.length===u.size&&c.size===u.size)t.push(r,...s);o=a-1}return t}function F(e){return e.some((t)=>t.role==="assistant"&&Boolean(t.tool_calls?.length)&&!t.reasoningContent?.trim())}function z(e,t){return{...e,...t.baseUrl?{baseUrl:q(e.api,t.baseUrl)}:{},...t.maxOutputTokens?{maxTokens:t.maxOutputTokens}:{}}}function S(e){let t=e.modelCatalog??_();return{models:t.models,model:z(t.getModel(e.provider,e.model),e)}}function V(e,t){let o=e.modelCatalog??_();return z(o.getModel(t.provider,t.model),e)}var Y=new WeakSet,me=["gousagelimiterror","freeusagelimiterror","monthly usage limit reached","available balance","insufficient_quota","out of budget","quota exceeded","billing"],pe=["prompt_too_long","prompt is too long","maximum context length","context length exceeded","context_length_exceeded","request too large"],fe=["econnreset","econnrefused","enotfound","eai_again","etimedout","fetch failed","network error","connection error","connection refused","connection lost","other side closed","socket hang up","socket connection was closed","upstream connect","reset before headers","websocket closed","websocket error","http2 request did not get a response"];function H(e){return(e instanceof Error?e.message:String(e)).toLowerCase()}function he(e){let t=H(e);return pe.some((o)=>t.includes(o))}function X(e){if(e!==null&&typeof e==="object")Y.add(e)}function Xe(e){return e!==null&&typeof e==="object"&&Y.has(e)}function ye(e){return e!==null&&typeof e==="object"&&"code"in e?e.code:void 0}function ge(e){if(e===null||typeof e!=="object")return;let t=e;for(let o of["status","statusCode"]){let r=t[o];if(typeof r==="number"&&Number.isInteger(r))return r}return}function be(e){let t=e.match(/^(?:error:\s*)?(\d{3})\b/),o=e.match(/\b(?:status(?:\s+code)?|http)[:\s]+(\d{3})\b/),r=Number(t?.[1]??o?.[1]);return Number.isInteger(r)?r:void 0}function T(e,t){let o=H(e),r=ye(e);if(r==="STREAM_IDLE_TIMEOUT"||e instanceof Error&&e.name==="AbortError"||o.includes("request aborted")||o==="aborted")return{retryable:!1};if(me.some((i)=>o.includes(i))||he(e))return{retryable:!1};if(t?.shouldRetry==="false")return{retryable:!1,statusCode:t.statusCode};let n=t?.statusCode??ge(e)??be(o);if(t?.shouldRetry==="true")return{retryable:!0,reason:n===429?"rate_limit":n===408||n===409?"timeout":"server_error",statusCode:n};if(n===429)return{retryable:!0,reason:"rate_limit",statusCode:n};if(n===408||n===409)return{retryable:!0,reason:"timeout",statusCode:n};if(n!==void 0&&n>=500&&n<=599)return{retryable:!0,reason:"server_error",statusCode:n};if(r==="PROVIDER_STREAM_CLOSED"||o.includes("stream closed before completion")||o.includes("ended without")||o.includes("stream ended before"))return{retryable:!0,reason:"stream_closed",statusCode:n};if(fe.some((i)=>o.includes(i)))return{retryable:!0,reason:"transport",statusCode:n};if(o.includes("timeout")||o.includes("timed out")||o.includes("temporarily unavailable")||o.includes("upstream_error")||o.includes("overloaded")||o.includes("rate limit")||o.includes("too many requests")||o.includes("service unavailable")||o.includes("server error")||o.includes("internal error")||o.includes("please retry")||o.includes("try your request again"))return{retryable:!0,reason:o.includes("rate")||o.includes("too many")?"rate_limit":o.includes("timeout")||o.includes("timed out")?"timeout":"server_error",statusCode:n};return{retryable:!1,statusCode:n}}function Ce(e,t){if(!e)return;if(e.retryAfterMs!==void 0){let n=Number.parseFloat(e.retryAfterMs);if(Number.isFinite(n))return Math.max(0,n)}if(e.retryAfter===void 0)return;let o=Number.parseFloat(e.retryAfter);if(Number.isFinite(o))return Math.max(0,o*1000);let r=Date.parse(e.retryAfter);return Number.isFinite(r)?Math.max(0,r-t):void 0}function G(e,t,o={}){let r=o.now??Date.now(),n=o.maxDelayMs??60000,i=Ce(t,r);if(i!==void 0)return Math.min(Math.ceil(i),n);let a=Math.max(0,e-1),u=Math.min(500*2**a,8000),s=Math.max(0,Math.min(1,o.random??Math.random())),c=u*(0.75+s*0.25);return Math.min(Math.round(c),n)}function J(e,t){let o=e.onPayload;e.onPayload=async(r,n)=>{let i=o?await o(r,n):r;return t(i===void 0?r:i,n)}}function Me(e){if(!e.reasoningEnabled)return;return e.reasoningEffort??e.reasoningLevel??"high"}function Re(e){switch(e){case"minimal":return"MINIMAL";case"low":return"LOW";case"medium":return"MEDIUM";default:return"HIGH"}}function xe(e,t,o,r){let n=r?void 0:Me(o);if(!n){if(t.api==="anthropic-messages")e.thinkingEnabled=!1;if(t.api==="google-generative-ai"||t.api==="google-vertex")e.thinking={enabled:!1};return}switch(t.api){case"anthropic-messages":e.thinkingEnabled=!0,e.effort=n;break;case"google-generative-ai":case"google-vertex":e.thinking={enabled:!0,level:Re(n)};break;case"mistral-conversations":e.reasoningEffort="high";break;case"bedrock-converse-stream":case"pi-messages":e.reasoning=n;break;default:e.reasoningEffort=n}}function ve(e,t,o){if(!o)return;switch(t){case"anthropic-messages":case"bedrock-converse-stream":e.toolChoice={type:"tool",name:o};break;case"openai-completions":case"mistral-conversations":case"pi-messages":e.toolChoice={type:"function",function:{name:o}};break;case"openai-responses":case"openai-codex-responses":case"azure-openai-responses":e.toolChoice={type:"function",name:o};break;case"google-generative-ai":case"google-vertex":e.toolChoice="any";break}}function Te(e,t,o){let r=o.serviceTier;if(!r)return;if(t.api==="openai-responses"||t.api==="openai-codex-responses"||t.api==="azure-openai-responses"){e.serviceTier=r;return}if(t.api!=="openai-completions"&&!(t.api==="anthropic-messages"&&r==="fast"))return;J(e,(n)=>{if(!n||typeof n!=="object"||Array.isArray(n))return n;return t.api==="anthropic-messages"?{...n,speed:"fast"}:{...n,service_tier:r}})}function ke(e,t,o){let r=o.responseVerbosity;if(!r)return;if(K(t,r),t.api==="openai-codex-responses"){e.textVerbosity=r;return}J(e,(n)=>{if(!n||typeof n!=="object"||Array.isArray(n))return n;if(t.api==="openai-completions")return{...n,verbosity:r};let i="text"in n&&n.text&&typeof n.text==="object"&&!Array.isArray(n.text)?n.text:{};return{...n,text:{...i,verbosity:r}}})}function Z(e,t,o,r,n=!1){let i={apiKey:e.apiKey,headers:e.customHeaders,signal:o,temperature:r?.temperature??e.temperature??0,maxTokens:r?.maxOutputTokens??e.maxOutputTokens,timeoutMs:e.timeout,maxRetries:0,cacheRetention:e.enablePromptCaching?"short":"none"};if(xe(i,t,e,n),ve(i,t.api,r?.toolChoice?.toolName),Te(i,t,e),ke(i,t,e),t.api==="azure-openai-responses")i.azureBaseUrl=e.baseUrl,i.azureApiVersion=e.apiVersion,i.azureDeploymentName=t.id;return i}function $(e,t){let o=t.get("x-should-retry");return{statusCode:e,...t.get("retry-after")!==null?{retryAfter:t.get("retry-after")??void 0}:{},...t.get("retry-after-ms")!==null?{retryAfterMs:t.get("retry-after-ms")??void 0}:{},...o==="true"||o==="false"?{shouldRetry:o}:{}}}var we=new Set(["anthropic-messages","openai-completions","openai-responses","openai-codex-responses","azure-openai-responses","pi-messages"]);function Q(e,t,o){let r=e.onResponse;if(e.onResponse=async(i,a)=>{let u=new Headers(i.headers);o($(i.status,u)),await r?.(i,a)},!we.has(t.api)||typeof globalThis.fetch!=="function")return;let n=typeof e.fetch==="function"?e.fetch:globalThis.fetch.bind(globalThis);e.fetch=async(i,a)=>{let u=await n(i,a);return o($(u.status,u.headers)),u}}function ee(e){return{promptTokens:e.input+e.cacheRead+e.cacheWrite,completionTokens:e.output,totalTokens:e.totalTokens,costUsd:e.cost.total,...e.reasoning!==void 0?{reasoningTokens:e.reasoning}:{},...e.cacheWrite>0?{cacheCreationInputTokens:e.cacheWrite}:{},...e.cacheRead>0?{cacheReadInputTokens:e.cacheRead}:{}}}var O=300000,Ae=30000;class te extends Error{timeoutMs;code="STREAM_IDLE_TIMEOUT";constructor(e){super(`Provider stream idle timeout after ${e}ms without an event`);this.timeoutMs=e;this.name="StreamIdleTimeoutError"}}class oe extends Error{code="PROVIDER_STREAM_CLOSED";constructor(){super("Provider stream closed before completion");this.name="ProviderStreamClosedError"}}function I(e){return e.reason instanceof Error?e.reason:new DOMException("Aborted","AbortError")}function Pe(e){return e.idleTimeoutMs&&e.idleTimeoutMs>0?e.idleTimeoutMs:O}function Ee(e,t){if(t===0)return;let o=t!==void 0&&t>0?t:Ae;return Math.max(1,Math.min(o,Math.floor(e/2)))}function _e(e,t,o){if(o?.aborted)return Promise.reject(I(o));return new Promise((r,n)=>{let i=!1,a=()=>{clearTimeout(d),o?.removeEventListener("abort",c)},u=(l)=>{if(i)return;i=!0,a(),r(l)},s=(l)=>{if(i)return;i=!0,a(),n(l instanceof Error?l:Error(String(l)))},c=()=>{if(o)s(I(o))},d=setTimeout(()=>u({kind:"timer"}),Math.max(0,t));if(o?.addEventListener("abort",c,{once:!0}),o?.aborted){c();return}e.then((l)=>u({kind:"next",result:l}),s)})}async function*Se(e,t,o){let r=Pe(t),n=Ee(r,t.stallWarningMs);if(t.signal?.aborted)throw I(t.signal);let i=Date.now(),a=Promise.resolve().then(()=>e.next()),u;for(;;){let c=await _e(a,(u?r:n??r)-(Date.now()-i),t.signal);if(c.kind==="next"){if(u)yield{...u,phase:"recovered",durationMs:Math.max(u.durationMs,Date.now()-i)};return c.result}if(!u&&n!==void 0){o.stallCount++,u={phase:"detected",stallCount:o.stallCount,durationMs:n,warningAfterMs:n,timeoutMs:r,outputStarted:o.outputStarted},yield u;continue}let d=new te(r);throw t.abort?.(d),d}}async function*ne(e,t,o,r,n={}){let a=e.stream(t,o,r)[Symbol.asyncIterator](),u=0,s=!1,c={stallCount:0,outputStarted:!1};try{while(!0){let d=Se(a,n,c),l=await d.next();while(!l.done)yield{providerStall:l.value},l=await d.next();let x=l.value;if(x.done)throw new oe;let f=x.value;switch(f.type){case"text_delta":c.outputStarted=!0,yield{content:f.delta};break;case"thinking_delta":c.outputStarted=!0,yield{reasoningContent:f.delta};break;case"toolcall_end":c.outputStarted=!0,yield{toolCalls:[{index:u++,id:f.toolCall.id,type:"function",function:{name:f.toolCall.name,arguments:JSON.stringify(f.toolCall.arguments)}}]};break;case"done":s=!0,yield{finishReason:f.reason,usage:ee(f.message.usage)};return;case"error":throw Error(f.error.errorMessage??`Request ${f.reason==="aborted"?"aborted":"failed"}`)}}}finally{if(!s)Promise.resolve(a.return?.()).catch(()=>{return})}}var re=R("Chat");function Ie(e){return Boolean(e&&e.role==="user"&&Array.isArray(e.content)&&e.content.some((t)=>t.type==="image_url"))}class D{config;models;model;constructor(e){let t=S(e);this.config={...e,maxContextTokens:t.model.contextWindow,maxOutputTokens:e.maxOutputTokens??t.model.maxTokens},this.models=t.models,this.model=t.model,re.debug("[PiAIChatService] Initialized",{provider:this.model.provider,model:this.model.id,api:this.model.api})}async chat(e,t,o,r){let n="",i="",a=[],u,s;for await(let c of this.streamChat(e,t,o,r)){n+=c.content??"",i+=c.reasoningContent??"";for(let d of c.toolCalls??[])if(d.id&&d.type==="function"&&d.function?.name)a.push(d);u=c.usage??u,s=c.finishReason??s}return{content:n,...i?{reasoningContent:i}:{},...a.length>0?{toolCalls:a}:{},usage:u,finishReason:s}}async*streamChat(e,t,o,r){let n=r?.toolChoice?.toolName;if(n&&!t?.some((m)=>m.name===n))throw Error(`Required tool is unavailable: ${n}`);let i=B(e);if(i.some((m)=>Ie(m))&&!this.model.input.includes("image"))throw Error(`${this.model.name} does not support image input`);let a=Boolean(n)||F(i),u=await j(i,this.model,t,o,n),s,c=(m)=>{s=void 0;let C=new AbortController,h=o?U(o,C.signal):C.signal,M=Z(this.config,m,h,r,a);return Q(M,m,(y)=>{s=y}),ne(this.models,m,u,M,{idleTimeoutMs:this.config.streamIdleTimeout??O,signal:h,abort:(y)=>C.abort(y)})},d=this.config.maxRetries??2,l=this,x=async function*(m,C){let h,M=!1,y,v;for(let g=0;g<=d;g++)try{let b=!1;for await(let p of c(m)){if(p.providerStall){yield p;continue}if(g>0&&y&&!b)b=!0,yield{providerRetry:{phase:"recovered",attempt:g,maxRetries:d,reason:y,...v!==void 0?{statusCode:v}:{}}};M=!0,C(),yield p}return}catch(b){h=b,l.logIdleTimeout(b,M,m),await l.handleAbort(o);let p=T(b,s);if(M)throw X(b),b;if(!p.retryable||!p.reason){if(g>0&&y)yield{providerRetry:{phase:"exhausted",attempt:g,maxRetries:d,reason:y,...v!==void 0?{statusCode:v}:{}}};throw b}if(y=p.reason,v=p.statusCode,g<d){let k=g+1,w=G(k,s);yield{providerRetry:{phase:"scheduled",attempt:k,maxRetries:d,reason:p.reason,...p.statusCode!==void 0?{statusCode:p.statusCode}:{},delayMs:w,nextRetryAt:Date.now()+w}},await P(w,o,{throwOnAbort:!0}),yield{providerRetry:{phase:"attempt",attempt:k,maxRetries:d,reason:p.reason,...p.statusCode!==void 0?{statusCode:p.statusCode}:{}}}}else yield{providerRetry:{phase:"exhausted",attempt:g,maxRetries:d,reason:p.reason,...p.statusCode!==void 0?{statusCode:p.statusCode}:{}}}}throw h},f,L=!1;try{for await(let m of x(this.model,()=>{L=!0}))yield m;return}catch(m){if(f=m,L||!T(m,s).retryable)throw m}for(let m of this.config.fallbackModels??[]){yield{modelFallback:!0};let C=!1;try{let h=V(this.config,m);for await(let M of x(h,()=>{C=!0}))yield M;return}catch(h){if(f=h,C||!T(h,s).retryable)throw h}}throw f}async handleAbort(e){if(e?.aborted)await P(0,e,{throwOnAbort:!0})}logIdleTimeout(e,t,o){if(e===null||typeof e!=="object"||!("code"in e)||e.code!=="STREAM_IDLE_TIMEOUT"||!("timeoutMs"in e)||typeof e.timeoutMs!=="number")return;re.warn("[PiAIChatService] Provider stream idle timeout",{provider:o.provider,model:o.id,timeoutMs:e.timeoutMs,replayBoundaryCrossed:t})}getConfig(){return{...this.config}}updateConfig(e){let t={...this.config,...e},o=S(t);this.config={...t,maxContextTokens:o.model.contextWindow,maxOutputTokens:t.maxOutputTokens??o.model.maxTokens},this.models=o.models,this.model=o.model}}var Oe=R("Service");async function mt(e){let t=e;if(t.provider){let o=N(t.provider);if(Object.keys(o).length>0)t={...t,customHeaders:{...o,...t.customHeaders}},Oe.debug(`Injected ${t.provider} specific headers:`,Object.keys(o))}return De(t)}function De(e){return new D(e)}
5
- export{Ne as md,je as nd,U as od,he as pd,Xe as qd,D as rd,mt as sd};
5
+ export{Ne as od,je as pd,U as qd,he as rd,Xe as sd,D as td,mt as ud};
@@ -1,4 +1,4 @@
1
- import{m as R,n as I,o as C,p as v,q as S}from"./chunk-t327cwnb.js";import{F as y,L as w}from"./chunk-nqpcwa0k.js";import"./chunk-yaxapgbm.js";import"./chunk-3fkj59nv.js";import{$a as x,ib as U}from"./chunk-0568ndm9.js";import"./chunk-4dnvydyv.js";import{Ub as k,fc as b}from"./chunk-3qmwt188.js";import"./chunk-s4mqw4wa.js";import{yc as P}from"./chunk-k2b95m2p.js";import{Ac as h,Bc as O,Cc as M}from"./chunk-bvwq5wth.js";import{Dc as z}from"./chunk-ag07wwer.js";import"./chunk-j8ggq1z4.js";import{_c as N}from"./chunk-n00mknme.js";import"./chunk-qg87zezq.js";import"./chunk-xjqcc0nt.js";import"./chunk-f8zz4se0.js";import"./chunk-xzdpdwhz.js";import"./chunk-m27w377p.js";import"./chunk-d2kzet1k.js";import"./chunk-wjqctwyr.js";import"./chunk-5xph8r1k.js";import"./chunk-5sw8j9ae.js";import"./chunk-18n15nn8.js";import"./chunk-86zsjamb.js";import"./chunk-6pb6zs96.js";import"./chunk-w56y2pvk.js";import"./chunk-edqtngzr.js";import{df as D}from"./chunk-vmzf4nvh.js";import"./chunk-hpmxmkzc.js";import"./chunk-bpz0g8ej.js";import{tf as E}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 g from"yargs";import{hideBin as c}from"yargs/helpers";var m=new Set(Object.values(D));function d(j){if(j&&m.has(j))return j;return}function l(j){return j.command("* [message]","Print response and exit (useful for pipes)",(q)=>q.positional("message",{describe:"Message to process",type:"string"}).option("p",{alias:"print",describe:"Print response and exit (useful for pipes)",type:"boolean"}).option("output-format",{describe:'Output format: "text", "json", "stream-json"',type:"string",default:"text"}).option("include-partial-messages",{describe:"Include partial message chunks as they arrive",type:"boolean"}).option("input-format",{describe:'Input format: "text", "stream-json"',type:"string",default:"text"}).option("json-schema",{alias:["jsonSchema"],describe:"Inline JSON Schema for the structured final response",type:"string"}).option("output-schema",{alias:["outputSchema"],describe:"Path to a JSON Schema file for the structured final response",type:"string"}).option("model",{describe:"Model for the current session",type:"string"}).option("append-system-prompt",{describe:"Append a system prompt to the default system prompt",type:"string"}).option("system-prompt",{describe:"Replace the default system prompt",type:"string"}).option("max-turns",{alias:["maxTurns"],describe:"Maximum conversation turns (-1: unlimited, N>0: limit to N turns)",type:"number"}),async(q)=>{if(!q.p)return;let B=await u(q);process.exit(B)})}async function u(j,q=process){let B;try{await R();let T=await I({message:j.message,_:j._,defaultMessage:"Hello"}),J=await C(T);if(J.mode==="output"){if(J.content)q.stdout.write(`${J.content}
1
+ import{m as R,n as I,o as C,p as v,q as S}from"./chunk-xp44jtsd.js";import{F as y,L as w}from"./chunk-rtktz9v1.js";import"./chunk-tg1mf1tf.js";import"./chunk-89gswfb2.js";import{$a as x,ib as U}from"./chunk-1mh2285d.js";import"./chunk-4dnvydyv.js";import{Wb as k,ic as b}from"./chunk-d9jz1edf.js";import"./chunk-p6nhdbdw.js";import{Bc as P}from"./chunk-eqa706gn.js";import{Dc as h,Ec as O,Fc as M}from"./chunk-y2en7qvs.js";import{Gc as z}from"./chunk-6k74z0eb.js";import"./chunk-ebffhjma.js";import{bd as N}from"./chunk-5yr2c8gz.js";import"./chunk-v508x7cg.js";import"./chunk-k99rbzqw.js";import"./chunk-46yg6dfr.js";import"./chunk-1hzj6s0f.js";import"./chunk-fnt1z0y8.js";import"./chunk-7jv8thn1.js";import"./chunk-kskg7crs.js";import"./chunk-5mtryjjc.js";import"./chunk-nt6xmzk0.js";import"./chunk-35d5gdgw.js";import"./chunk-zs9mwd17.js";import"./chunk-rth3jfdq.js";import"./chunk-58tpe6nx.js";import{ef as D}from"./chunk-6axhk4r7.js";import"./chunk-9ka0bdry.js";import"./chunk-vc2c8wkx.js";import{rf as E}from"./chunk-kvd5nexw.js";import"./chunk-8htfb5zn.js";import"./chunk-jt55ct49.js";import"./chunk-0q4jbbm5.js";import"./chunk-acf5v2fv.js";import"./chunk-r46ws0q8.js";import"./chunk-tnrrnzzv.js";import"./chunk-s1khjfye.js";import"./chunk-sprjrvn6.js";import g from"yargs";import{hideBin as c}from"yargs/helpers";var m=new Set(Object.values(D));function d(j){if(j&&m.has(j))return j;return}function l(j){return j.command("* [message]","Print response and exit (useful for pipes)",(q)=>q.positional("message",{describe:"Message to process",type:"string"}).option("p",{alias:"print",describe:"Print response and exit (useful for pipes)",type:"boolean"}).option("output-format",{describe:'Output format: "text", "json", "stream-json"',type:"string",default:"text"}).option("include-partial-messages",{describe:"Include partial message chunks as they arrive",type:"boolean"}).option("input-format",{describe:'Input format: "text", "stream-json"',type:"string",default:"text"}).option("json-schema",{alias:["jsonSchema"],describe:"Inline JSON Schema for the structured final response",type:"string"}).option("output-schema",{alias:["outputSchema"],describe:"Path to a JSON Schema file for the structured final response",type:"string"}).option("model",{describe:"Model for the current session",type:"string"}).option("append-system-prompt",{describe:"Append a system prompt to the default system prompt",type:"string"}).option("system-prompt",{describe:"Replace the default system prompt",type:"string"}).option("max-turns",{alias:["maxTurns"],describe:"Maximum conversation turns (-1: unlimited, N>0: limit to N turns)",type:"number"}),async(q)=>{if(!q.p)return;let B=await u(q);process.exit(B)})}async function u(j,q=process){let B;try{await R();let T=await I({message:j.message,_:j._,defaultMessage:"Hello"}),J=await C(T);if(J.mode==="output"){if(J.content)q.stdout.write(`${J.content}
2
2
  `);return J.exitCode??0}let K=J.content,X=await v(j),Y=K.trimStart().startsWith("!")?K.trimStart().slice(1).trim():void 0;if(Y!==void 0&&X)throw Error("Output schemas cannot be combined with user shell commands");let{sessionId:G,messages:F,metadata:V}=await S({sessionId:j.sessionId,continue:j.continue,resume:j.resume,forkSession:j.forkSession,fallbackSessionPrefix:"print"}),W=V?.projectPath??E(),Z=d(j.permissionMode)??V?.permissionMode??N()?.permissionMode??"default";await b.setSessionPermissionMode(G,W,Z);let _=await U.cancelPendingNonInteractive(W,G)?await b.loadSessionModelContext(G,W):F;if(B=await y.create({sessionId:G,workspaceRoot:W,modelId:j.model,permissionMode:Z,mcpConfig:j.mcpConfig,strictMcpConfig:j.strictMcpConfig,agents:j.agents?z(j.agents):void 0,..._.length>0?{sessionStart:{isResume:!0,resumeSessionId:G}}:{}}),Y!==void 0){let H=await B.executeUserShellCommand(Y);if(j.outputFormat==="json")q.stdout.write(`${JSON.stringify(H,null,2)}
3
3
  `);else if(j.outputFormat==="stream-json")q.stdout.write(`${JSON.stringify({type:"user_shell_completed",executionId:H.executionId,record:H.record})}
4
4
  `);else q.stdout.write(`${k(H.record)}