blade-code 0.10.71 → 0.10.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-fcv8b6ny.js → chunk-06y3rada.js} +2 -2
  3. package/dist/{chunk-k0pa8874.js → chunk-0kat01bw.js} +1 -1
  4. package/dist/{chunk-th4jjfgm.js → chunk-0qj8jfj1.js} +1 -1
  5. package/dist/{chunk-ahg9vjb6.js → chunk-11gdqmbm.js} +1 -1
  6. package/dist/chunk-139s7p91.js +1 -0
  7. package/dist/{chunk-zvz2cnt4.js → chunk-18atvz38.js} +1 -1
  8. package/dist/{chunk-9hchc346.js → chunk-28wsyv32.js} +1 -1
  9. package/dist/{chunk-rm9hbew3.js → chunk-2d2bcyn1.js} +1 -1
  10. package/dist/{chunk-0tm20v38.js → chunk-2fd5trh8.js} +2 -2
  11. package/dist/{chunk-cdy9efgm.js → chunk-2sdnmxts.js} +1 -1
  12. package/dist/chunk-2vkzwqv0.js +1 -0
  13. package/dist/chunk-41smvqs8.js +1 -0
  14. package/dist/{chunk-hat9v5c5.js → chunk-4wvsg8cc.js} +1 -1
  15. package/dist/{chunk-6pyktfa4.js → chunk-4xpj0d6y.js} +1 -1
  16. package/dist/{chunk-byqxaa9v.js → chunk-5va3hhfp.js} +1 -1
  17. package/dist/chunk-61arrvhp.js +1 -0
  18. package/dist/{chunk-yn51162x.js → chunk-6j3k4v08.js} +1 -1
  19. package/dist/{chunk-s7jsadnc.js → chunk-6j9t1xbh.js} +2 -2
  20. package/dist/{chunk-nx31fkkf.js → chunk-6v7f2cv9.js} +53 -53
  21. package/dist/{chunk-j9q1wyxg.js → chunk-7am1z065.js} +1 -1
  22. package/dist/{chunk-2428hhvj.js → chunk-7hf1k2c9.js} +2 -2
  23. package/dist/chunk-8geywf8q.js +1 -0
  24. package/dist/{chunk-wrfay5r3.js → chunk-91qsjpm6.js} +2 -2
  25. package/dist/{chunk-1je1xw6v.js → chunk-a38chc6z.js} +18 -18
  26. package/dist/{chunk-0vrgrw71.js → chunk-awj9aqjy.js} +2 -2
  27. package/dist/chunk-bqz8wera.js +1 -0
  28. package/dist/chunk-brm24s69.js +2 -0
  29. package/dist/{chunk-r9d4mjxj.js → chunk-bs77d8hn.js} +1 -1
  30. package/dist/{chunk-mtphps19.js → chunk-c4j2anbm.js} +2 -2
  31. package/dist/{chunk-82htkvz8.js → chunk-ccgq8nrm.js} +2 -2
  32. package/dist/{chunk-be30r8an.js → chunk-cqeqjtxn.js} +1 -1
  33. package/dist/{chunk-93tvxmqg.js → chunk-cyjnza5n.js} +4 -4
  34. package/dist/chunk-d9a0g85f.js +1 -0
  35. package/dist/{chunk-1pjkgfez.js → chunk-e0hf1317.js} +1 -1
  36. package/dist/chunk-e4ynb9qf.js +1 -0
  37. package/dist/chunk-e6ezndyf.js +22 -0
  38. package/dist/{chunk-jzntxp7f.js → chunk-eh4h7fmr.js} +2 -2
  39. package/dist/chunk-eh9gdzk5.js +160 -0
  40. package/dist/chunk-emqbb5xh.js +1 -0
  41. package/dist/{chunk-h0ft81a3.js → chunk-g8425xh4.js} +1 -1
  42. package/dist/{chunk-t2wgf9tq.js → chunk-gv3ed5gw.js} +2 -2
  43. package/dist/chunk-gzysna9c.js +1 -0
  44. package/dist/{chunk-axtzde5k.js → chunk-hhk5ecpv.js} +2 -2
  45. package/dist/{chunk-gtcxybv5.js → chunk-hhvkzn6m.js} +1 -1
  46. package/dist/{chunk-d3ttqmyt.js → chunk-hryhnmwv.js} +277 -262
  47. package/dist/{chunk-2px6hzdc.js → chunk-hwjmm2br.js} +2 -2
  48. package/dist/{chunk-9q852bsc.js → chunk-j0yvwrd7.js} +2 -2
  49. package/dist/{chunk-m57w4p91.js → chunk-jyds9m8p.js} +1 -1
  50. package/dist/{chunk-v0rsz1rt.js → chunk-m6qgme8k.js} +1 -1
  51. package/dist/{chunk-97aywyzn.js → chunk-mhyat4mq.js} +2 -2
  52. package/dist/{chunk-qgrq04hb.js → chunk-mp4bfn57.js} +1 -1
  53. package/dist/chunk-mrh3vs01.js +2 -0
  54. package/dist/chunk-ph5rn44j.js +1 -0
  55. package/dist/chunk-pqhjrdnq.js +10 -0
  56. package/dist/{chunk-0j22w4wh.js → chunk-q6daf441.js} +1 -1
  57. package/dist/{chunk-0wxkymqv.js → chunk-s9brgcgs.js} +1 -1
  58. package/dist/{chunk-trn6r1g3.js → chunk-ss1znmv0.js} +1 -1
  59. package/dist/{chunk-3hy06st1.js → chunk-tms0pr01.js} +2 -2
  60. package/dist/chunk-v7phc78b.js +1 -0
  61. package/dist/{chunk-t8xmh4w2.js → chunk-wvg81sd9.js} +1 -1
  62. package/dist/{chunk-x9tvjkjv.js → chunk-x4hh8yqg.js} +1 -1
  63. package/dist/{chunk-dwb2nmms.js → chunk-xahapj98.js} +1 -1
  64. package/dist/{chunk-s77sbxr7.js → chunk-xszsveq1.js} +1 -1
  65. package/dist/{chunk-azw0jckv.js → chunk-y858e8pb.js} +2 -2
  66. package/dist/{chunk-bjqjdw34.js → chunk-yhnr8vdb.js} +2 -2
  67. package/dist/{chunk-cff9gphh.js → chunk-yjj7q7hy.js} +1 -1
  68. package/dist/{chunk-zdnk7qtn.js → chunk-ypwjzw5x.js} +2 -2
  69. package/dist/{chunk-4ke8k0xw.js → chunk-z7vj2xrg.js} +3 -3
  70. package/dist/{chunk-5te2jqt3.js → chunk-zac26wwd.js} +1 -1
  71. package/dist/{chunk-wfy851et.js → chunk-zf96d5we.js} +1 -1
  72. package/dist/chunk-zqxj65xc.js +1 -0
  73. package/dist/chunk-zssys78z.js +1 -0
  74. package/dist/web/assets/ChatView-CgUC5rxo.js +18 -0
  75. package/dist/web/assets/{CodeBlockHighlighter-Dy7QpAmC.js → CodeBlockHighlighter-B5DRAEhB.js} +1 -1
  76. package/dist/web/assets/{FilePreview-BI3nkxz1.js → FilePreview-DSpvLsjW.js} +1 -1
  77. package/dist/web/assets/{KanbanBoard-D5dYOyPH.js → KanbanBoard-6K7IeCXi.js} +1 -1
  78. package/dist/web/assets/{MarkdownRenderer-Da1vB81L.js → MarkdownRenderer-D6LiW9kF.js} +3 -3
  79. package/dist/web/assets/{SettingsModal-jcCFqLqS.js → SettingsModal-CFHxLfuL.js} +1 -1
  80. package/dist/web/assets/{TaskSwitcher-CQ--jOLB.js → TaskSwitcher-Bng9nDed.js} +1 -1
  81. package/dist/web/assets/{TerminalPanel-CWzjEXOb.js → TerminalPanel-BnyQZwkN.js} +1 -1
  82. package/dist/web/assets/index-CDdYV8kB.css +1 -0
  83. package/dist/web/assets/index-DId2GJVO.js +11 -0
  84. package/dist/web/assets/{vendor-icons-B63aW_OM.js → vendor-icons-C927DZlr.js} +41 -36
  85. package/dist/web/index.html +3 -3
  86. package/package.json +1 -1
  87. package/dist/chunk-1w83z8j0.js +0 -1
  88. package/dist/chunk-3as0bkqy.js +0 -1
  89. package/dist/chunk-4pexpa3h.js +0 -160
  90. package/dist/chunk-8j568nm6.js +0 -1
  91. package/dist/chunk-92x15fzx.js +0 -2
  92. package/dist/chunk-ckqpt15b.js +0 -1
  93. package/dist/chunk-fcmgwzrj.js +0 -10
  94. package/dist/chunk-gvbx0t4j.js +0 -1
  95. package/dist/chunk-j0p54tqt.js +0 -1
  96. package/dist/chunk-n827nys9.js +0 -1
  97. package/dist/chunk-nwzpnx7m.js +0 -22
  98. package/dist/chunk-qnsvae10.js +0 -1
  99. package/dist/chunk-sp3bn8qh.js +0 -1
  100. package/dist/chunk-v7p533ff.js +0 -1
  101. package/dist/chunk-vthgpdbd.js +0 -1
  102. package/dist/chunk-wneeq8cr.js +0 -1
  103. package/dist/chunk-xdz5zrjt.js +0 -1
  104. package/dist/chunk-xz6y0w4n.js +0 -2
  105. package/dist/chunk-xzz69esf.js +0 -1
  106. package/dist/web/assets/ChatView-BVrhnE2j.js +0 -18
  107. package/dist/web/assets/index-BOgOL4hG.js +0 -11
  108. package/dist/web/assets/index-DbWgTuT3.css +0 -1
@@ -1,4 +1,4 @@
1
- import{tg as L,wg as _}from"./chunk-k0pa8874.js";import{execSync as F}from"child_process";import{existsSync as Q,readFileSync as O,realpathSync as b}from"fs";import*as V from"os";import*as H from"path";import{basename as J,isAbsolute as j,resolve as R}from"path";function G(z=_()){let q=z,M=f(q);return{workingDirectory:q,projectRoot:M,platform:`${V.platform()} (${V.arch()})`,nodeVersion:process.version,currentDate:new Date().toISOString().split("T")[0],homeDirectory:V.homedir()}}function Y(z,q){try{return F(q,{cwd:z,encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim()}catch{return null}}function v(z={}){let{includeGitSnapshot:q=!0,includeDirectoryListing:M=!0,workingDirectory:W}=z,B=G(W),$=Q(H.join(B.projectRoot,".git")),T=J(process.env.SHELL||"unknown"),A=["package.json","tsconfig.json","BLADE.md",".env.example"].filter((K)=>Q(H.join(B.projectRoot,K))).map((K)=>`- \`${H.join(B.projectRoot,K)}\``),N=`# Environment
1
+ import{Bg as _,yg as L}from"./chunk-0kat01bw.js";import{execSync as F}from"child_process";import{existsSync as Q,readFileSync as O,realpathSync as b}from"fs";import*as V from"os";import*as H from"path";import{basename as J,isAbsolute as j,resolve as R}from"path";function G(z=_()){let q=z,M=f(q);return{workingDirectory:q,projectRoot:M,platform:`${V.platform()} (${V.arch()})`,nodeVersion:process.version,currentDate:new Date().toISOString().split("T")[0],homeDirectory:V.homedir()}}function Y(z,q){try{return F(q,{cwd:z,encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim()}catch{return null}}function v(z={}){let{includeGitSnapshot:q=!0,includeDirectoryListing:M=!0,workingDirectory:W}=z,B=G(W),$=Q(H.join(B.projectRoot,".git")),T=J(process.env.SHELL||"unknown"),A=["package.json","tsconfig.json","BLADE.md",".env.example"].filter((K)=>Q(H.join(B.projectRoot,K))).map((K)=>`- \`${H.join(B.projectRoot,K)}\``),N=`# Environment
2
2
  You have been invoked in the following environment:
3
3
  - Primary working directory: ${B.workingDirectory}
4
4
  - Is a git repository: ${$?"true":"false"}
@@ -25,4 +25,4 @@ ${I.join(`
25
25
 
26
26
  Project root directory listing:
27
27
  ${K}`}return N}function f(z){let q=z,M=null;while(q!==H.dirname(q)){if(Q(H.join(q,".git")))return q;if(Q(H.join(q,".blade")))return q;if(Q(H.join(q,".claude")))return q;if(!M&&Q(H.join(q,"package.json")))M=q;q=H.dirname(q)}return M??z}function x(z,q){let M=j(z)?z:R(q||process.cwd(),z),W;try{W=b(M)}catch{W=M}L(W)}
28
- export{v as td,f as ud,x as vd};
28
+ export{v as yd,f as zd,x as Ad};
@@ -1,4 +1,4 @@
1
- import{m as R,n as c,o as g,p as d,q as m,r as l}from"./chunk-gtcxybv5.js";import{N as M,V as y}from"./chunk-d3ttqmyt.js";import"./chunk-qgrq04hb.js";import"./chunk-92x15fzx.js";import{pb as h,yb as A}from"./chunk-nx31fkkf.js";import"./chunk-th4jjfgm.js";import{Nc as U,zc as w}from"./chunk-97aywyzn.js";import"./chunk-0wxkymqv.js";import"./chunk-mtphps19.js";import{jd as C}from"./chunk-3hy06st1.js";import{ld as I,md as S,nd as v}from"./chunk-2428hhvj.js";import{od as O}from"./chunk-s7jsadnc.js";import"./chunk-bjqjdw34.js";import{Ld as P}from"./chunk-1je1xw6v.js";import"./chunk-v508x7cg.js";import"./chunk-0j22w4wh.js";import"./chunk-zdnk7qtn.js";import"./chunk-wrfay5r3.js";import"./chunk-yn51162x.js";import"./chunk-fcv8b6ny.js";import"./chunk-axtzde5k.js";import"./chunk-hat9v5c5.js";import"./chunk-cdy9efgm.js";import"./chunk-zvz2cnt4.js";import"./chunk-4ke8k0xw.js";import"./chunk-m57w4p91.js";import"./chunk-82htkvz8.js";import{ig as F}from"./chunk-h0ft81a3.js";import"./chunk-v0rsz1rt.js";import"./chunk-xz6y0w4n.js";import{wg as z}from"./chunk-k0pa8874.js";import"./chunk-6pyktfa4.js";import"./chunk-t2wgf9tq.js";import"./chunk-2px6hzdc.js";import"./chunk-t8xmh4w2.js";import"./chunk-azw0jckv.js";import"./chunk-jzntxp7f.js";import"./chunk-r9d4mjxj.js";import"./chunk-9q852bsc.js";import"./chunk-wfy851et.js";import p from"yargs";import{hideBin as e}from"yargs/helpers";var s=new Set(Object.values(F));function t(j){if(j&&s.has(j))return j;return}function x(j){if(j.options.outputFormat==="json")j.io.stdout.write(`${JSON.stringify({response:j.response,...j.structuredOutput?{structured_output:j.structuredOutput,output_schema_digest:j.structuredOutputSchemaDigest}:{},input:j.requestInput,model:j.options.model,timestamp:new Date().toISOString()},null,2)}
1
+ import{m as R,n as c,o as g,p as d,q as m,r as l}from"./chunk-hhvkzn6m.js";import{O as M,V as y}from"./chunk-hryhnmwv.js";import"./chunk-mp4bfn57.js";import"./chunk-brm24s69.js";import{Bb as A,sb as h}from"./chunk-6v7f2cv9.js";import"./chunk-0qj8jfj1.js";import{Ec as w,Sc as U}from"./chunk-mhyat4mq.js";import"./chunk-s9brgcgs.js";import"./chunk-c4j2anbm.js";import{od as C}from"./chunk-tms0pr01.js";import{qd as I,rd as S,sd as v}from"./chunk-7hf1k2c9.js";import{td as O}from"./chunk-6j9t1xbh.js";import"./chunk-yhnr8vdb.js";import{Qd as P}from"./chunk-a38chc6z.js";import"./chunk-v508x7cg.js";import"./chunk-q6daf441.js";import"./chunk-ypwjzw5x.js";import"./chunk-91qsjpm6.js";import"./chunk-6j3k4v08.js";import"./chunk-06y3rada.js";import"./chunk-hhk5ecpv.js";import"./chunk-4wvsg8cc.js";import"./chunk-2sdnmxts.js";import"./chunk-18atvz38.js";import"./chunk-z7vj2xrg.js";import"./chunk-jyds9m8p.js";import"./chunk-ccgq8nrm.js";import{ng as F}from"./chunk-g8425xh4.js";import"./chunk-m6qgme8k.js";import"./chunk-mrh3vs01.js";import{Bg as z}from"./chunk-0kat01bw.js";import"./chunk-4xpj0d6y.js";import"./chunk-gv3ed5gw.js";import"./chunk-hwjmm2br.js";import"./chunk-wvg81sd9.js";import"./chunk-y858e8pb.js";import"./chunk-eh4h7fmr.js";import"./chunk-bs77d8hn.js";import"./chunk-j0yvwrd7.js";import"./chunk-zf96d5we.js";import p from"yargs";import{hideBin as e}from"yargs/helpers";var s=new Set(Object.values(F));function t(j){if(j&&s.has(j))return j;return}function x(j){if(j.options.outputFormat==="json")j.io.stdout.write(`${JSON.stringify({response:j.response,...j.structuredOutput?{structured_output:j.structuredOutput,output_schema_digest:j.structuredOutputSchemaDigest}:{},input:j.requestInput,model:j.options.model,timestamp:new Date().toISOString()},null,2)}
2
2
  `);else if(j.options.outputFormat==="stream-json")j.io.stdout.write(`${JSON.stringify(j.structuredOutput?{type:"structured_output",output:j.structuredOutput,schema_digest:j.structuredOutputSchemaDigest}:{type:"response",content:j.response})}
3
3
  `);else j.io.stdout.write(`${j.response}
4
4
  `)}function i(j){return j.command("* [message]","Print response and exit (useful for pipes)",(B)=>B.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(B)=>{if(!B.p)return;let q=await n(B);process.exit(q)})}async function n(j,B=process){let q;try{await R();let _=j.forkSession!==!0&&(j.continue===!0||typeof j.resume==="string"&&j.resume.length>0)?await g({message:j.message,_:j._}):await c({message:j.message,_:j._,defaultMessage:"Hello"}),J=_===void 0,T=J?{mode:"agent",content:""}:await d(_);if(T.mode==="output"){if(T.content)B.stdout.write(`${T.content}
@@ -1,5 +1,5 @@
1
- import{Ag as TE,Bg as gf,Cg as lf,Dg as xE,Eg as Wf,Gg as $f,Ig as Kf,Jg as If,Kg as uf,Lg as Cf,Ng as Df,Og as Ff,Qg as s}from"./chunk-6pyktfa4.js";import{Xg as g}from"./chunk-t2wgf9tq.js";import{$g as P_,bh as Xf}from"./chunk-2px6hzdc.js";import{eh as e_}from"./chunk-t8xmh4w2.js";var YE={openrouter:{"HTTP-Referer":"https://github.com/echoVic/blade-code","X-Title":"Blade"},cerebras:{"X-Cerebras-3rd-Party-Integration":"blade"}},T_=(f)=>YE[f]||{};var cE=new Set(["user-cancel","interrupt","sibling-error","timeout"]);function Vf(f){return typeof f==="string"&&cE.has(f)}function Xh(f){if(!f.aborted)return;if(Vf(f.reason))return f.reason;return"user-cancel"}function Wh(f){if(Vf(f))return!0;if(!(f instanceof Error))return!1;if(f.name==="AbortError")return!0;if(f instanceof DOMException&&f.name==="AbortError")return!0;if(f.message.includes("aborted"))return!0;return!1}function x_(...f){let _=f.filter(Boolean);if(_.length===0)return new AbortController().signal;if(_.length===1)return _[0];let E=AbortSignal;if(typeof E.any==="function")return E.any(_);for(let x of _)if(x.aborted)return x;let h=new AbortController,T=new Map;for(let x of _){let S=()=>{h.abort(x.reason);for(let[P,t]of T)P.removeEventListener("abort",t)};T.set(x,S)}for(let[x,S]of T)x.addEventListener("abort",S,{once:!0});return h.signal}function i(f,_,E){let h=E?.throwOnAbort??!1;if(_?.aborted){if(h)return Promise.reject(new DOMException("Aborted","AbortError"));return Promise.resolve()}return new Promise((T,x)=>{let S,P=setTimeout(()=>{if(_&&S)_.removeEventListener("abort",S);T()},f);if(_)S=()=>{if(clearTimeout(P),h)x(new DOMException("Aborted","AbortError"));else T()},_.addEventListener("abort",S,{once:!0})})}var bE=g("Chat"),OE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};function jf(f){if(typeof f==="string")return f;return f.filter((_)=>_.type==="text").map((_)=>_.text).join(`
1
+ import{Fg as TE,Gg as gf,Hg as lf,Ig as xE,Jg as Wf,Lg as $f,Ng as Kf,Og as If,Pg as uf,Qg as Cf,Sg as Df,Tg as Ff,Vg as s}from"./chunk-4xpj0d6y.js";import{ah as g}from"./chunk-gv3ed5gw.js";import{eh as P_,gh as Xf}from"./chunk-hwjmm2br.js";import{jh as e_}from"./chunk-wvg81sd9.js";var YE={openrouter:{"HTTP-Referer":"https://github.com/echoVic/blade-code","X-Title":"Blade"},cerebras:{"X-Cerebras-3rd-Party-Integration":"blade"}},T_=(f)=>YE[f]||{};var cE=new Set(["user-cancel","interrupt","sibling-error","timeout"]);function Vf(f){return typeof f==="string"&&cE.has(f)}function Xh(f){if(!f.aborted)return;if(Vf(f.reason))return f.reason;return"user-cancel"}function Wh(f){if(Vf(f))return!0;if(!(f instanceof Error))return!1;if(f.name==="AbortError")return!0;if(f instanceof DOMException&&f.name==="AbortError")return!0;if(f.message.includes("aborted"))return!0;return!1}function x_(...f){let _=f.filter(Boolean);if(_.length===0)return new AbortController().signal;if(_.length===1)return _[0];let E=AbortSignal;if(typeof E.any==="function")return E.any(_);for(let x of _)if(x.aborted)return x;let h=new AbortController,T=new Map;for(let x of _){let S=()=>{h.abort(x.reason);for(let[P,t]of T)P.removeEventListener("abort",t)};T.set(x,S)}for(let[x,S]of T)x.addEventListener("abort",S,{once:!0});return h.signal}function i(f,_,E){let h=E?.throwOnAbort??!1;if(_?.aborted){if(h)return Promise.reject(new DOMException("Aborted","AbortError"));return Promise.resolve()}return new Promise((T,x)=>{let S,P=setTimeout(()=>{if(_&&S)_.removeEventListener("abort",S);T()},f);if(_)S=()=>{if(clearTimeout(P),h)x(new DOMException("Aborted","AbortError"));else T()},_.addEventListener("abort",S,{once:!0})})}var bE=g("Chat"),OE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};function jf(f){if(typeof f==="string")return f;return f.filter((_)=>_.type==="text").map((_)=>_.text).join(`
2
2
  `)}function BE(f){if(!f)return{};try{let _=JSON.parse(f);return _&&typeof _==="object"&&!Array.isArray(_)?_:{}}catch{return bE.warn("[PiAIChatService] Invalid historical tool arguments",{value:f}),{}}}function VE(f){let _=f.match(/^data:([^;,]+);base64,(.+)$/s);return _?{mimeType:_[1],data:_[2]}:void 0}async function jE(f,_){let E=VE(f);if(E)return{type:"image",...E};if(!/^https?:\/\//i.test(f))return{type:"text",text:`[Unsupported image source: ${f}]`};let h=await fetch(f,{signal:_});if(!h.ok)throw Error(`Failed to load image ${f}: HTTP ${h.status}`);return{type:"image",mimeType:h.headers.get("content-type")?.split(";")[0]??"image/png",data:Buffer.from(await h.arrayBuffer()).toString("base64")}}async function M_(f,_,E,h,T){let x=f.filter((t)=>t.role==="system").map((t)=>jf(t.content)).filter(Boolean).join(`
3
3
 
4
4
  `),S=[];for(let t of f){if(t.role==="system")continue;if(t.role==="user"){let N=_.input.includes("image"),M=typeof t.content==="string"?t.content:await Promise.all(t.content.map((R)=>R.type==="text"?Promise.resolve({type:"text",text:R.text}):N?jE(R.image_url.url,h):Promise.resolve({type:"text",text:"[Image omitted: current model does not support image input]"})));S.push({role:"user",content:M,timestamp:Date.now()});continue}if(t.role==="assistant"){let N=[];if(t.reasoningContent?.trim())N.push({type:"thinking",thinking:t.reasoningContent});let M=jf(t.content);if(M)N.push({type:"text",text:M});for(let R of t.tool_calls??[]){if(!("function"in R))continue;N.push({type:"toolCall",id:R.id,name:R.function.name,arguments:BE(R.function.arguments)})}S.push({role:"assistant",content:N,api:_.api,provider:_.provider,model:_.id,usage:OE,stopReason:t.tool_calls?.length?"toolUse":"stop",timestamp:Date.now()});continue}S.push({role:"toolResult",toolCallId:t.tool_call_id??"",toolName:t.name??"unknown",content:[{type:"text",text:jf(t.content)}],isError:!1,timestamp:Date.now()})}let P=E?.filter((t)=>!T||t.name===T).map((t)=>({name:t.name,description:t.description,parameters:t.parameters,constrainedSampling:t.constrainedSampling})).sort((t,N)=>t.name<N.name?-1:t.name>N.name?1:0);return{...x?{systemPrompt:x}:{},messages:S,...P?.length?{tools:P}:{}}}function R_(f){let _=[];for(let E=0;E<f.length;E++){let h=f[E];if(h.role==="tool")continue;let T=h.role==="assistant"&&h.tool_calls?.length?h.tool_calls:void 0;if(!T){_.push(h);continue}let x=[],S=E+1;while(S<f.length&&f[S].role==="tool")x.push(f[S++]);let P=new Set(T.map((M)=>M.id)),t=x.filter((M)=>M.tool_call_id&&P.has(M.tool_call_id)),N=new Set(t.map((M)=>M.tool_call_id));if(P.size===T.length&&t.length===P.size&&N.size===P.size)_.push(h,...t);E=S-1}return _}function A_(f){return f.some((_)=>_.role==="assistant"&&Boolean(_.tool_calls?.length)&&!_.reasoningContent?.trim())}function S_(f,_){return{...f,..._.baseUrl?{baseUrl:P_(f.api,_.baseUrl)}:{},..._.maxOutputTokens?{maxTokens:_.maxOutputTokens}:{}}}function zf(f){let _=f.modelCatalog??Xf();return{models:_.models,model:S_(_.getModel(f.provider,f.model),f)}}function N_(f,_){let E=f.modelCatalog??Xf();return S_(E.getModel(_.provider,_.model),f)}import{createHash as XE}from"node:crypto";var zE=32,JE=1000,WE=512,$E=2000,kE=0.1,LE=0.05,GE=0.9,ZE=300000,QE=3600000;class Jf{sessions=new Map;observe(f){if(f.retention==="none"){this.sessions.delete(f.sessionId);return}let _=f.now??Date.now(),E=KE(f,_),h=this.sessions.get(f.sessionId);if(E.callCount=(h?.callCount??0)+1,this.touch(f.sessionId,E),h&&E.contextEpoch!==h.contextEpoch)return;if(!h||h.cacheReadTokens<JE)return;let T=h.cacheReadTokens-E.cacheReadTokens,x=Math.min($E,Math.max(WE,h.cacheReadTokens*kE));if(T<x||E.cacheReadTokens>=h.cacheReadTokens*(1-LE))return;let S=E.modelIdentity!==h.modelIdentity,P=E.systemHash!==h.systemHash,t=E.toolsHash!==h.toolsHash,N=E.policyHash!==h.policyHash;if(!(S||P||t||N)&&E.promptTokens<h.promptTokens*GE)return;let R=Math.max(0,_-h.recordedAt),u=h.retention==="long"?QE:ZE,Y=S?"model_changed":P?"system_prompt_changed":t?"tools_changed":N?"request_policy_changed":R>=u?"ttl_expired":"server_side",$=CE(h,E);return{reason:Y,previousCacheReadTokens:h.cacheReadTokens,cacheReadTokens:E.cacheReadTokens,cacheWriteTokens:Math.max(0,f.usage.cacheCreationInputTokens??0),tokenDrop:T,elapsedMs:R,callNumber:E.callCount,systemPromptChanged:P,systemCharDelta:E.systemChars-h.systemChars,toolsChanged:t,addedToolCount:$.added,removedToolCount:$.removed,changedToolCount:$.changed,modelChanged:S,requestPolicyChanged:N}}clear(f){if(f)this.sessions.delete(f);else this.sessions.clear()}statsForTests(){return{sessions:this.sessions.size}}touch(f,_){this.sessions.delete(f),this.sessions.set(f,_);while(this.sessions.size>zE){let E=this.sessions.keys().next().value;if(E===void 0)break;this.sessions.delete(E)}}}function KE(f,_){let E=[...f.tools??f.context.tools??[]].map((h)=>({identityHash:ff(h.name),contractHash:ff(_f(h))})).sort((h,T)=>h.identityHash<T.identityHash?-1:h.identityHash>T.identityHash?1:0);return{modelIdentity:f.modelIdentity,systemHash:ff(f.context.systemPrompt??""),systemChars:f.context.systemPrompt?.length??0,toolsHash:ff(_f(E)),toolFingerprints:E,policyHash:ff(_f(f.policy)),contextEpoch:f.contextEpoch??"",retention:f.retention,promptTokens:Number.isFinite(f.usage.promptTokens)?Math.max(0,f.usage.promptTokens):0,cacheReadTokens:Math.max(0,f.usage.cacheReadInputTokens??0),recordedAt:_,callCount:1}}function CE(f,_){let E=new Map(f.toolFingerprints.map((T)=>[T.identityHash,T.contractHash])),h=new Map(_.toolFingerprints.map((T)=>[T.identityHash,T.contractHash]));return{added:[...h.keys()].filter((T)=>!E.has(T)).length,removed:[...E.keys()].filter((T)=>!h.has(T)).length,changed:[...h].filter(([T,x])=>E.has(T)&&E.get(T)!==x).length}}function _f(f){if(f===null||typeof f!=="object")return JSON.stringify(f)??"undefined";if(Array.isArray(f))return`[${f.map(_f).join(",")}]`;let _=f;return`{${Object.keys(_).sort().map((E)=>`${JSON.stringify(E)}:${_f(_[E])}`).join(",")}}`}function ff(f){return XE("sha256").update(f).digest("hex")}import{randomBytes as vE}from"node:crypto";import{createHmac as FE}from"node:crypto";function oE(f){try{let _=new URL(f);if(_.hash="",_.hostname=_.hostname.toLowerCase(),_.searchParams.sort(),_.pathname!=="/")_.pathname=_.pathname.replace(/\/+$/,"");return _.toString()}catch{return f.trim().replace(/\/+$/,"")}}function sE(f){if(!f)return[];return Object.entries(f).map(([_,E])=>[_.trim().toLowerCase(),E.trim()]).sort(([_],[E])=>_.localeCompare(E))}function Pf(f,_,E){let h=JSON.stringify([f.provider.trim(),String(f.api).trim(),oE(f.baseUrl),f.model.trim(),f.serviceTier?.trim()??"",f.apiVersion?.trim()??"",f.apiKey??"",sE(f.customHeaders),E]);return FE("sha256",Buffer.from(_)).update(h).digest("hex")}var wE=60000,pE=4,mE=0.8;var Nf=300000,kf=600000;var I_=128,u_=256,qE=1800000,Sf=50;class hf extends Error{circuit;code="PROVIDER_CIRCUIT_OPEN";constructor(f){super(`Provider circuit open; retry after ${f.retryAfterMs??0}ms`);this.circuit=f;this.name="ProviderCircuitOpenError"}}function Lf(f){return f instanceof hf||f!==null&&typeof f==="object"&&"code"in f&&f.code==="PROVIDER_CIRCUIT_OPEN"}function l(f,_){return f!==void 0&&Number.isSafeInteger(f)&&f>0?f:_}function gE(f,_){return f!==void 0&&Number.isFinite(f)&&f>0&&f<=1?f:_}function lE(f,_){return Pf(f,_,{providerCircuitOpenDurationMs:f.openDurationMs})}function Ef(f){let _=0;for(let E of f)if(E.failure)_++;return _}function D_(f){return f!==void 0&&Number.isInteger(f)&&f>=100&&f<=599?f:void 0}function H_(f){if(f===void 0||!Number.isFinite(f)||f<0)return;return Math.min(Math.ceil(f),$f)}class Y_{#x=new Map;#t=new WeakMap;#f;#E;#T;#h;constructor(f={}){this.#f=f.processSecret?new Uint8Array(f.processSecret):vE(32),this.#E=f.now??(()=>performance.now()),this.#T=f.wallNow??f.now??Date.now,this.#h={maxEntries:Math.min(l(f.maxEntries,I_),I_),maxWindowEntries:Math.min(l(f.maxWindowEntries,u_),u_),windowMs:l(f.windowMs,wE),minSamples:l(f.minSamples,pE),errorRateThreshold:gE(f.errorRateThreshold,mE),idleTtlMs:l(f.idleTtlMs,qE)}}get size(){return this.#x.size}get(f){if(f.openDurationMs===0)return this.#R();let _=this.#E();this.#c(_);let E=lE(f,this.#f),h=this.#x.get(E);if(h)return h.lastTouchedAt=_,this.#_(h,f.probeLeaseMs);if(this.#x.size>=this.#h.maxEntries)this.#D();if(this.#x.size>=this.#h.maxEntries)return this.#R();let T={key:E,state:"closed",samples:[],generation:0,nextAttemptId:1,nextProbeLeaseId:1,configuredOpenDurationMs:f.openDurationMs,effectiveOpenDurationMs:f.openDurationMs,lastTouchedAt:_,detached:!1};return this.#x.set(E,T),this.#_(T,f.probeLeaseMs)}#_(f,_){let E=this,h=Math.max(Nf,Math.min(l(_,Nf),kf));return{preflight:()=>E.#A(f),check:()=>E.#b(f,h),recordSuccess:(T)=>E.#M(T,"success"),recordFailure:(T,x)=>E.#M(T,"failure",x),recordNeutral:(T)=>E.#M(T,"neutral"),abandon:(T)=>E.#N(T),snapshot:()=>E.#j(f)}}#R(){let f=this;return{preflight:()=>({eligible:!0}),check:()=>{let _=Object.freeze({kind:"noop"});return f.#t.set(_,{generation:0,attemptId:0,kind:"noop",settled:!1}),{allowed:!0,probe:!1,token:_}},recordSuccess:(_)=>f.#S(_),recordFailure:(_)=>f.#S(_),recordNeutral:(_)=>f.#S(_),abandon:(_)=>f.#N(_),snapshot:()=>({state:"closed",sampleCount:0,failureCount:0,noop:!0,detached:!1})}}#S(f){let _=this.#t.get(f);if(_?.kind==="noop")_.settled=!0;return}#A(f){let _=this.#E();if(f.detached)return{eligible:!0};if(f.lastTouchedAt=_,this.#I(f,_),f.state==="closed")return{eligible:!0};if(f.state==="open"){let h=f.nextProbeAt??_;return _<h?this.#U(f,h-_):{eligible:!0}}if(f.probeLeaseId===void 0||f.probeLeaseExpiresAt!==void 0&&_>=f.probeLeaseExpiresAt)return{eligible:!0};let E=Math.max(1,(f.probeLeaseExpiresAt??_+Sf)-_);return this.#U(f,Math.min(Sf,E))}#U(f,_){let{allowed:E,...h}=this.#P(f,_);return{eligible:!1,...h}}#b(f,_){let E=this.#E();if(f.detached)return this.#R().check();if(f.lastTouchedAt=E,this.#I(f,E),f.state==="closed")return this.#Y(f,"regular");if(f.state==="open"){let T=f.nextProbeAt??E;if(E<T)return this.#P(f,T-E);f.state="half_open",f.generation++,f.probeLeaseId=void 0,f.probeLeaseExpiresAt=void 0}if(f.probeLeaseId===void 0||f.probeLeaseExpiresAt!==void 0&&E>=f.probeLeaseExpiresAt)return this.#O(f,E,_);let h=Math.max(1,(f.probeLeaseExpiresAt??E+Sf)-E);return this.#P(f,Math.min(Sf,h))}#Y(f,_,E){let h=Object.freeze({kind:_});return this.#t.set(h,{entry:f,generation:f.generation,attemptId:f.nextAttemptId++,kind:_,...E!==void 0?{probeLeaseId:E}:{},settled:!1}),{allowed:!0,probe:_==="probe",token:h}}#O(f,_,E){let h=f.nextProbeLeaseId++;f.probeLeaseId=h,f.probeLeaseExpiresAt=_+E,f.lastTouchedAt=_;let T=this.#Y(f,"probe",h),x=f.lastFailure??{reason:"server_error"};return{...T,reason:x.reason,...x.statusCode!==void 0?{statusCode:x.statusCode}:{},openDurationMs:f.effectiveOpenDurationMs,sampleCount:f.samples.length,failureCount:Ef(f.samples)}}#P(f,_){let E=f.lastFailure??{reason:"server_error"};return{allowed:!1,state:f.state==="open"?"open":"half_open",reason:E.reason,...E.statusCode!==void 0?{statusCode:E.statusCode}:{},retryAfterMs:Math.max(0,Math.ceil(_)),nextProbeAt:this.#T()+Math.max(0,Math.ceil(_)),openDurationMs:f.effectiveOpenDurationMs,sampleCount:f.samples.length,failureCount:Ef(f.samples)}}#M(f,_,E){let h=this.#t.get(f);if(!h||h.settled)return;if(h.settled=!0,h.kind==="noop"||!h.entry)return;let T=h.entry;if(T.detached||h.generation!==T.generation||h.kind==="regular"&&T.state!=="closed"||h.kind==="probe"&&(T.state!=="half_open"||h.probeLeaseId!==T.probeLeaseId))return;let x=this.#E();if(T.lastTouchedAt=x,h.kind==="probe"){if(_==="failure"&&E)return this.#u(T,E,x,"reopened");return this.#B(T)}if(_==="neutral")return;if(this.#V(T,_==="failure",x),_!=="failure"||!E)return;let S=Ef(T.samples),P=T.samples.length===0?0:S/T.samples.length;if(T.samples.length>=this.#h.minSamples&&P>=this.#h.errorRateThreshold)return this.#u(T,E,x,"opened");return}#u(f,_,E,h){let T={reason:_.reason,...D_(_.statusCode)!==void 0?{statusCode:D_(_.statusCode)}:{},...H_(_.retryAfterMs)!==void 0?{retryAfterMs:H_(_.retryAfterMs)}:{}},x=T.retryAfterMs??0,S=Math.max(f.configuredOpenDurationMs,x);return f.state="open",f.generation++,f.probeLeaseId=void 0,f.probeLeaseExpiresAt=void 0,f.effectiveOpenDurationMs=S,f.nextProbeAt=E+S,f.lastFailure=T,{phase:h,reason:T.reason,...T.statusCode!==void 0?{statusCode:T.statusCode}:{},retryAfterMs:S,nextProbeAt:this.#T()+S,openDurationMs:S,sampleCount:f.samples.length,failureCount:Ef(f.samples)}}#B(f){let _=f.lastFailure??{reason:"server_error"};return f.state="closed",f.generation++,f.samples=[],f.probeLeaseId=void 0,f.probeLeaseExpiresAt=void 0,f.nextProbeAt=void 0,f.effectiveOpenDurationMs=f.configuredOpenDurationMs,{phase:"closed",reason:_.reason,..._.statusCode!==void 0?{statusCode:_.statusCode}:{},openDurationMs:f.effectiveOpenDurationMs,sampleCount:0,failureCount:0}}#N(f){let _=this.#t.get(f);if(!_||_.settled)return!1;if(_.settled=!0,_.kind==="noop")return!0;let E=_.entry;if(!E||E.detached||_.kind!=="probe"||_.generation!==E.generation||_.probeLeaseId!==E.probeLeaseId)return!1;return E.probeLeaseId=void 0,E.probeLeaseExpiresAt=void 0,E.lastTouchedAt=this.#E(),!0}#V(f,_,E){if(this.#I(f,E),f.samples.length>=this.#h.maxWindowEntries)f.samples.shift();f.samples.push({at:E,failure:_})}#I(f,_){let E=_-this.#h.windowMs,h=0;while(h<f.samples.length&&f.samples[h].at<E)h++;if(h>0)f.samples.splice(0,h)}#j(f){if(!f.detached)this.#I(f,this.#E());return{state:f.state,sampleCount:f.samples.length,failureCount:Ef(f.samples),...f.nextProbeAt!==void 0?{nextProbeAt:f.nextProbeAt}:{},noop:!1,detached:f.detached}}#c(f){for(let[_,E]of this.#x)if(E.state==="closed"&&f-E.lastTouchedAt>this.#h.idleTtlMs)this.#H(_,E)}#D(){let f;for(let _ of this.#x.values())if(_.state==="closed"&&(!f||_.lastTouchedAt<f.lastTouchedAt))f=_;if(f)this.#H(f.key,f)}#H(f,_){_.detached=!0,this.#x.delete(f)}}var U_;function c_(){return U_??=new Y_,U_}import{randomBytes as aE}from"node:crypto";var b_=16,O_=128,B_=32,V_=3,j_=16,X_=96,z_=24,J_=12,W_=16,$_=4,k_=4,L_=67108864,G_=33554432,Z_=12,Q_=2,K_=2,C_=1,w_=15000,F_=30000;function Gf(){return{foreground:0,background:0,internal:0}}function Zf(){return{inFlight:Gf(),queued:Gf(),pendingBytes:Gf()}}function U(f){return f.foreground+f.background+f.internal}function W(f){return f.background+f.internal}function o_(f){return f.inFlight.foreground===0&&f.inFlight.background===0&&f.inFlight.internal===0&&f.queued.foreground===0&&f.queued.background===0&&f.queued.internal===0&&f.pendingBytes.foreground===0&&f.pendingBytes.background===0&&f.pendingBytes.internal===0}class Tf extends Error{reason;scope;requestClass;resource;inFlight;limit;queued;maxWaitMs;code="PROVIDER_ADMISSION_BUSY";retryable;constructor(f,_,E,h,T,x,S,P){super(f==="queue_full"?`Provider request admission ${_} ${h} queue is full`:f==="wait_timeout"?`Provider request admission timed out waiting for ${_} capacity`:"Provider request admission scheduler is closed");this.reason=f;this.scope=_;this.requestClass=E;this.resource=h;this.inFlight=T;this.limit=x;this.queued=S;this.maxWaitMs=P;this.name="ProviderAdmissionError",this.retryable=f!=="closed"}}function xf(f){return f instanceof Tf||f!==null&&typeof f==="object"&&"code"in f&&f.code==="PROVIDER_ADMISSION_BUSY"}function z(f,_,E){if(f===void 0||!Number.isSafeInteger(f)||f<=0)return _;return Math.min(f,E)}function yE(f){let _=z(f.globalMaxInFlight,b_,b_),E=z(f.globalMaxPending,O_,O_),h=z(f.domainMaxPending,B_,B_),T=Math.min(z(f.ownerMaxInFlight,V_,V_),_),x=Math.min(z(f.ownerMaxPending,j_,j_),E),S=Math.min(z(f.nonForegroundGlobalMaxPending,Math.min(X_,Math.max(1,Math.floor(E*3/4))),X_),E),P=Math.min(z(f.nonForegroundDomainMaxPending,Math.min(z_,Math.max(1,Math.floor(h*3/4))),z_),h),t=Math.min(z(f.nonForegroundOwnerMaxPending,Math.min(J_,Math.max(1,Math.floor(x*3/4))),J_),x),N=Math.min(z(f.internalGlobalMaxPending,Math.min(W_,Math.max(1,Math.floor(E/8))),W_),S),M=Math.min(z(f.internalDomainMaxPending,Math.min($_,Math.max(1,Math.floor(h/8))),$_),P),R=Math.min(z(f.internalOwnerMaxPending,Math.min(k_,Math.max(1,Math.floor(x/4))),k_),t),u=z(f.globalMaxPendingBytes,s,s),Y=Math.min(z(f.domainMaxPendingBytes,L_,L_),u),$=Math.min(z(f.ownerMaxPendingBytes,G_,G_),u),Q=Math.min(z(f.nonForegroundGlobalMaxInFlight,Math.min(Z_,_),Z_),_),K=Math.min(z(f.nonForegroundOwnerMaxInFlight,Math.min(Q_,T),Q_),T),o=Math.min(z(f.internalGlobalMaxInFlight,Math.min(K_,_),K_),_),Uf=z(f.internalDomainMaxInFlight,C_,C_),tf=z(f.agingMs,F_,F_);return{globalMaxInFlight:_,globalMaxPending:E,domainMaxPending:h,ownerMaxInFlight:T,ownerMaxPending:x,nonForegroundGlobalMaxPending:S,nonForegroundDomainMaxPending:P,nonForegroundOwnerMaxPending:t,internalGlobalMaxPending:N,internalDomainMaxPending:M,internalOwnerMaxPending:R,globalMaxPendingBytes:u,domainMaxPendingBytes:Y,ownerMaxPendingBytes:$,nonForegroundGlobalMaxInFlight:Q,nonForegroundOwnerMaxInFlight:K,internalGlobalMaxInFlight:o,internalDomainMaxInFlight:Uf,agingMs:tf}}function s_(f,_){if(!f.trim())throw Error(`${_} must not be blank`)}function dE(f){if(s_(f.sessionId,"sessionId"),s_(f.ownerId,"ownerId"),!Number.isSafeInteger(f.scope.maxConcurrent)||f.scope.maxConcurrent<If||f.scope.maxConcurrent>uf)throw Error(`maxConcurrent must be between ${If} and ${uf}`);if(!Number.isSafeInteger(f.scope.maxPendingBytes)||f.scope.maxPendingBytes<=0||f.scope.maxPendingBytes>s)throw Error(`maxPendingBytes must be between 1 and ${s}`);if(!Number.isSafeInteger(f.pendingBytes)||f.pendingBytes<=0||f.pendingBytes>s+1)throw Error(`pendingBytes must be between 1 and ${s+1}`);if(!Number.isSafeInteger(f.maxWaitMs)||f.maxWaitMs<0||f.maxWaitMs>Df)throw Error(`maxWaitMs must be 0-${Df}`)}function Qf(f,_){if(_!==void 0)return _;if(f?.reason!==void 0)return f.reason;return new DOMException("Provider request admission cancelled","AbortError")}function eE(f,_){return Pf(f,_,{providerRequestConcurrency:f.maxConcurrent,providerRequestPendingBytes:f.maxPendingBytes})}class p_{#x;#t;#f;#E=[];#T=new Map;#h=new Map;#_=Zf();#R=1;#S=0;#A=!1;constructor(f={}){this.#x=f.processSecret?new Uint8Array(f.processSecret):aE(32),this.#t=f.now??(()=>performance.now()),this.#f=yE(f)}admit(f){if(dE(f),this.#A)throw this.#X("closed",f,{scope:"global",resource:"stream",inFlight:U(this.#_.inFlight),limit:this.#f.globalMaxInFlight},this.#E.length);if(f.signal?.aborted)throw Qf(f.signal);let _=eE(f.scope,this.#x),E=this.#T.get(_),h=this.#h.get(f.ownerId),T=E??this.#Y(f.scope.maxConcurrent),x=h??this.#O();if(this.#E.length===0&&this.#P(T,x,f.requestClass)){if(!E)this.#T.set(_,T);if(!h)this.#h.set(f.ownerId,x),this.#R++;let u=this.#u(_,f.ownerId,f.requestClass),Y=this.#k(f,0);return{ready:Promise.resolve(u),getSnapshot:()=>({...Y}),cancel:()=>{Y={...Y}}}}let S=this.#U(f,T,x);if(S)throw this.#X("queue_full",f,S,this.#E.length);let P=this.#M(T,x,f.requestClass);if(f.maxWaitMs===0)throw this.#X("wait_timeout",f,P,this.#E.length);if(!E)this.#T.set(_,T);if(!h)this.#h.set(f.ownerId,x),this.#R++;let t,N,M=new Promise((u,Y)=>{t=u,N=Y});M.catch(()=>{return});let R={domainKey:_,sessionId:f.sessionId,ownerId:f.ownerId,requestClass:f.requestClass,maxWaitMs:f.maxWaitMs,pendingBytes:f.pendingBytes,enqueuedAt:this.#t(),signal:f.signal,resolve:t,reject:N,settled:!1,admitted:!1};if(f.signal)R.abortListener=()=>this.#c(R,Qf(f.signal)),f.signal.addEventListener("abort",R.abortListener,{once:!0});return R.timer=setTimeout(()=>this.#j(R),f.maxWaitMs),R.timer.unref?.(),this.#E.push(R),this.#b(T,x,R),this.#N(),{ready:M,getSnapshot:()=>this.#$(R),cancel:(u)=>this.#c(R,Qf(f.signal,u))}}close(){if(this.#A)return;this.#A=!0;for(let f of[...this.#E]){let _=this.#T.get(f.domainKey),E=this.#h.get(f.ownerId),h=_&&E?this.#M(_,E,f.requestClass):{scope:"global",resource:"stream",inFlight:U(this.#_.inFlight),limit:this.#f.globalMaxInFlight};this.#D(f,new Tf("closed",h.scope,f.requestClass,h.resource,h.inFlight,h.limit,this.#E.length,f.maxWaitMs))}}getStats(){return{inFlight:U(this.#_.inFlight),queued:this.#E.length,pendingBytes:U(this.#_.pendingBytes),nonForegroundInFlight:W(this.#_.inFlight),internalInFlight:this.#_.inFlight.internal,nonForegroundQueued:W(this.#_.queued),internalQueued:this.#_.queued.internal,nonForegroundPendingBytes:W(this.#_.pendingBytes),internalPendingBytes:this.#_.pendingBytes.internal,domainCount:this.#T.size,ownerCount:this.#h.size,closed:this.#A}}#U(f,_,E){let h=(M,R,u)=>R>=u?{scope:M,resource:"pending_count",inFlight:R,limit:u}:void 0;if(f.requestClass==="internal"){let M=h("class",this.#_.queued.internal,this.#f.internalGlobalMaxPending)??h("class",E.counters.queued.internal,this.#f.internalOwnerMaxPending)??h("class",_.counters.queued.internal,this.#f.internalDomainMaxPending);if(M)return M}if(f.requestClass!=="foreground"){let M=h("class",W(this.#_.queued),this.#f.nonForegroundGlobalMaxPending)??h("class",W(E.counters.queued),this.#f.nonForegroundOwnerMaxPending)??h("class",W(_.counters.queued),this.#f.nonForegroundDomainMaxPending);if(M)return M}let T=h("global",this.#E.length,this.#f.globalMaxPending)??h("owner",U(E.counters.queued),this.#f.ownerMaxPending)??h("domain",U(_.counters.queued),this.#f.domainMaxPending);if(T)return T;let x=Math.min(f.scope.maxPendingBytes,this.#f.globalMaxPendingBytes),S=Math.min(x,this.#f.domainMaxPendingBytes),P=Math.min(x,this.#f.ownerMaxPendingBytes),t=(M,R)=>f.pendingBytes>R-M,N=(M)=>{if(M==="owner")return{scope:M,resource:"pending_bytes",inFlight:U(E.counters.inFlight),limit:this.#f.ownerMaxInFlight};if(M==="domain")return{scope:M,resource:"pending_bytes",inFlight:U(_.counters.inFlight),limit:_.maxConcurrent};return{scope:M,resource:"pending_bytes",inFlight:U(this.#_.inFlight),limit:this.#f.globalMaxInFlight}};if(f.requestClass==="internal"){let M=Math.max(1,Math.floor(x/8)),R=Math.max(1,Math.floor(S/4)),u=Math.max(1,Math.floor(P/4));if(t(this.#_.pendingBytes.internal,M)||t(E.counters.pendingBytes.internal,u)||t(_.counters.pendingBytes.internal,R))return N("class")}if(f.requestClass!=="foreground"){let M=Math.max(1,Math.floor(x*3/4)),R=Math.max(1,Math.floor(S*3/4)),u=Math.max(1,Math.floor(P/2));if(t(W(this.#_.pendingBytes),M)||t(W(E.counters.pendingBytes),u)||t(W(_.counters.pendingBytes),R))return N("class")}if(t(U(this.#_.pendingBytes),x))return N("global");if(t(U(E.counters.pendingBytes),P))return N("owner");if(t(U(_.counters.pendingBytes),S))return N("domain");return}#b(f,_,E){let{requestClass:h,pendingBytes:T}=E;this.#_.queued[h]++,f.counters.queued[h]++,_.counters.queued[h]++,this.#_.pendingBytes[h]+=T,f.counters.pendingBytes[h]+=T,_.counters.pendingBytes[h]+=T}#Y(f){return{maxConcurrent:f,counters:Zf()}}#O(){return{order:this.#R,counters:Zf()}}#P(f,_,E){if(U(this.#_.inFlight)>=this.#f.globalMaxInFlight)return!1;if(U(f.counters.inFlight)>=f.maxConcurrent)return!1;if(U(_.counters.inFlight)>=this.#f.ownerMaxInFlight)return!1;if(E==="foreground")return!0;if(W(this.#_.inFlight)>=this.#f.nonForegroundGlobalMaxInFlight)return!1;if(W(_.counters.inFlight)>=this.#f.nonForegroundOwnerMaxInFlight)return!1;let h=Math.max(1,f.maxConcurrent-1);if(W(f.counters.inFlight)>=h)return!1;if(E!=="internal")return!0;return this.#_.inFlight.internal<this.#f.internalGlobalMaxInFlight&&f.counters.inFlight.internal<this.#f.internalDomainMaxInFlight}#M(f,_,E){if(U(_.counters.inFlight)>=this.#f.ownerMaxInFlight)return{scope:"owner",resource:"stream",inFlight:U(_.counters.inFlight),limit:this.#f.ownerMaxInFlight};if(E!=="foreground"&&W(_.counters.inFlight)>=this.#f.nonForegroundOwnerMaxInFlight)return{scope:"class",resource:"stream",inFlight:W(_.counters.inFlight),limit:this.#f.nonForegroundOwnerMaxInFlight};if(U(f.counters.inFlight)>=f.maxConcurrent)return{scope:"domain",resource:"stream",inFlight:U(f.counters.inFlight),limit:f.maxConcurrent};if(E!=="foreground"){let h=Math.max(1,f.maxConcurrent-1);if(W(f.counters.inFlight)>=h)return{scope:"class",resource:"stream",inFlight:W(f.counters.inFlight),limit:h}}if(E==="internal"&&f.counters.inFlight.internal>=this.#f.internalDomainMaxInFlight)return{scope:"class",resource:"stream",inFlight:f.counters.inFlight.internal,limit:this.#f.internalDomainMaxInFlight};if(U(this.#_.inFlight)>=this.#f.globalMaxInFlight)return{scope:"global",resource:"stream",inFlight:U(this.#_.inFlight),limit:this.#f.globalMaxInFlight};if(E!=="foreground"&&W(this.#_.inFlight)>=this.#f.nonForegroundGlobalMaxInFlight)return{scope:"class",resource:"stream",inFlight:W(this.#_.inFlight),limit:this.#f.nonForegroundGlobalMaxInFlight};if(E==="internal"&&this.#_.inFlight.internal>=this.#f.internalGlobalMaxInFlight)return{scope:"class",resource:"stream",inFlight:this.#_.inFlight.internal,limit:this.#f.internalGlobalMaxInFlight};return{scope:"domain",resource:"stream",inFlight:U(f.counters.inFlight),limit:f.maxConcurrent}}#u(f,_,E){let h=this.#T.get(f),T=this.#h.get(_);if(!h||!T)throw Error("Provider admission accounting state is unavailable");this.#_.inFlight[E]++,h.counters.inFlight[E]++,T.counters.inFlight[E]++;let x=!1;return{release:()=>{if(x)return;x=!0,this.#B(f,_,E)}}}#B(f,_,E){let h=this.#T.get(f),T=this.#h.get(_);if(this.#_.inFlight[E]--,h)h.counters.inFlight[E]--;if(T)T.counters.inFlight[E]--;this.#z(f,_),this.#N()}#N(){if(this.#A)return;while(this.#E.length>0){let f=this.#t(),_=new Map;for(let[P,t]of this.#E.entries()){let N=this.#T.get(t.domainKey),M=this.#h.get(t.ownerId);if(N===void 0||M===void 0||!this.#P(N,M,t.requestClass))continue;let R=this.#V(t,f),u=_.get(t.ownerId);if(!u||R<u.rank||R===u.rank&&P<u.index)_.set(t.ownerId,{pending:t,rank:R,index:P})}let E=[..._.values()].filter(({pending:P})=>{let t=this.#T.get(P.domainKey),N=this.#h.get(P.ownerId);return t!==void 0&&N!==void 0&&this.#P(t,N,P.requestClass)}).map(({pending:P,rank:t})=>({pending:P,rank:t,order:this.#h.get(P.ownerId).order}));if(E.length===0)return;let h=Math.min(...E.map((P)=>P.rank)),T=E.filter((P)=>P.rank===h),S=T.filter((P)=>P.order>this.#S).sort((P,t)=>P.order-t.order)[0]??T.sort((P,t)=>P.order-t.order)[0];this.#I(S.pending,S.order)}}#V(f,_){let E=f.requestClass==="foreground"?0:f.requestClass==="background"?1:2,h=Math.floor(Math.max(0,_-f.enqueuedAt)/this.#f.agingMs);return Math.max(0,E-h)}#I(f,_){if(!this.#H(f,!1))return;f.settled=!0,f.admitted=!0,this.#S=_;let E=this.#u(f.domainKey,f.ownerId,f.requestClass);f.permit=E,f.resolve(E)}#j(f){let _=this.#T.get(f.domainKey),E=this.#h.get(f.ownerId),h=_&&E?this.#M(_,E,f.requestClass):{scope:"global",resource:"stream",inFlight:U(this.#_.inFlight),limit:this.#f.globalMaxInFlight};this.#D(f,new Tf("wait_timeout",h.scope,f.requestClass,h.resource,h.inFlight,h.limit,this.#E.length,f.maxWaitMs))}#c(f,_){this.#D(f,_)}#D(f,_){if(!this.#H(f))return;f.settled=!0,f.reject(_),this.#N()}#H(f,_=!0){if(f.settled||f.admitted)return!1;let E=this.#E.indexOf(f);if(E<0)return!1;this.#E.splice(E,1);let h=this.#T.get(f.domainKey),T=this.#h.get(f.ownerId);if(h&&T)this.#J(h,T,f);if(this.#W(f),_)this.#z(f.domainKey,f.ownerId);return!0}#J(f,_,E){let{requestClass:h,pendingBytes:T}=E;this.#_.queued[h]--,f.counters.queued[h]--,_.counters.queued[h]--,this.#_.pendingBytes[h]-=T,f.counters.pendingBytes[h]-=T,_.counters.pendingBytes[h]-=T}#W(f){if(f.timer)clearTimeout(f.timer);if(f.timer=void 0,f.signal&&f.abortListener)f.signal.removeEventListener("abort",f.abortListener);f.abortListener=void 0,f.signal=void 0}#z(f,_){let E=this.#T.get(f);if(E&&o_(E.counters))this.#T.delete(f);let h=this.#h.get(_);if(h&&o_(h.counters))this.#h.delete(_)}#$(f){let _=Math.max(0,Math.floor(this.#t()-f.enqueuedAt));if(f.admitted)return{state:"admitted",requestClass:f.requestClass,resource:"stream",scope:"domain",queuePosition:0,queueDepth:this.#E.length,inFlight:U(this.#_.inFlight),limit:this.#f.globalMaxInFlight,waitMs:_,maxWaitMs:f.maxWaitMs};let E=this.#T.get(f.domainKey),h=this.#h.get(f.ownerId),T=E&&h?this.#M(E,h,f.requestClass):{scope:"global",resource:"stream",inFlight:U(this.#_.inFlight),limit:this.#f.globalMaxInFlight};return{state:"queued",requestClass:f.requestClass,resource:T.resource,scope:T.scope,reason:"capacity",queuePosition:this.#L(f,T.scope),queueDepth:this.#E.length,inFlight:T.inFlight,limit:T.limit,waitMs:_,maxWaitMs:f.maxWaitMs}}#k(f,_){return{state:"admitted",requestClass:f.requestClass,resource:"stream",scope:"domain",queuePosition:0,queueDepth:this.#E.length,inFlight:U(this.#_.inFlight),limit:this.#f.globalMaxInFlight,waitMs:_,maxWaitMs:f.maxWaitMs}}#L(f,_){let E=this.#E.filter((h)=>{switch(_){case"owner":return h.ownerId===f.ownerId;case"domain":return h.domainKey===f.domainKey;case"class":return h.requestClass===f.requestClass;case"global":return!0}});return Math.max(1,E.indexOf(f)+1)}#X(f,_,E,h){return new Tf(f,E.scope,_.requestClass,E.resource,E.inFlight,E.limit,h,_.maxWaitMs)}}var v_;function m_(){return v_??=new p_,v_}function q_(f,_={}){let E=_.maxBytes??134217728,h=_.maxNodes??1e5;if(!Number.isSafeInteger(E)||E<=0||E>=Number.MAX_SAFE_INTEGER)throw Error("maxBytes must be a positive safe integer");if(!Number.isSafeInteger(h)||h<=0)throw Error("maxNodes must be a positive safe integer");let T=new WeakSet,x=0,S=0,P=!1,t=(M)=>{if(P||M<=0)return;if(!Number.isSafeInteger(M)||M>E-x){x=E+1,P=!0;return}x+=M},N=(M)=>{if(P)return;if(S+=1,S>h){t(E+1);return}if(M===null){t(4);return}switch(typeof M){case"string":t(Buffer.byteLength(M,"utf8"));return;case"number":case"bigint":t(8);return;case"boolean":t(4);return;case"undefined":case"function":case"symbol":return;case"object":break}if(T.has(M))return;if(T.add(M),ArrayBuffer.isView(M)){t(32+M.byteLength);return}if(M instanceof ArrayBuffer){t(32+M.byteLength);return}if(M instanceof Date){t(40);return}if(M instanceof RegExp){t(32+Buffer.byteLength(M.source,"utf8"));return}if(M instanceof Map){t(32);for(let[R,u]of M)if(N(R),N(u),P)return;return}if(M instanceof Set){t(32);for(let R of M)if(N(R),P)return;return}if(M instanceof WeakMap||M instanceof WeakSet){t(32);return}if(Array.isArray(M)){t(16);for(let R of M)if(N(R),P)return;return}t(32);for(let R of Reflect.ownKeys(M)){if(typeof R!=="string")continue;let u=Object.getOwnPropertyDescriptor(M,R);if(!u?.enumerable||!("value"in u))continue;if(t(8+Buffer.byteLength(R,"utf8")),N(u.value),P)return}};return N(f),x}function g_(f){return q_([f.messages,f.context,f.tools,f.requestOptions],{maxBytes:s})}var l_=new WeakSet;class a extends Error{budgetMs;elapsedMs;code="PROVIDER_RECOVERY_BUDGET_EXCEEDED";constructor(f,_){super(`Provider recovery budget exhausted after ${f}ms`);this.budgetMs=f;this.elapsedMs=_;this.name="ProviderRecoveryBudgetExceededError"}}class of extends Error{timeoutMs;code="PROVIDER_REQUEST_DEADLINE_EXCEEDED";constructor(f){super(`Provider request deadline exceeded after ${f}ms`);this.timeoutMs=f;this.name="ProviderRequestDeadlineExceededError"}}var nE=["gousagelimiterror","freeusagelimiterror","monthly usage limit reached","available balance","insufficient_quota","out of budget","quota exceeded","billing"],rE=["prompt_too_long","prompt is too long","maximum context length","context length exceeded","context_length_exceeded","request too large"],iE=["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 a_(f){return(f instanceof Error?f.message:String(f)).toLowerCase()}function fh(f){let _=a_(f);return rE.some((E)=>_.includes(E))}function sf(f){if(f!==null&&typeof f==="object")l_.add(f)}function RT(f){return f!==null&&typeof f==="object"&&l_.has(f)}function _h(f){return f!==null&&typeof f==="object"&&"code"in f?f.code:void 0}function Eh(f){if(f===null||typeof f!=="object")return;let _=f;for(let E of["status","statusCode"]){let h=_[E];if(typeof h==="number"&&Number.isInteger(h))return h}return}function hh(f){let _=f.match(/^(?:error:\s*)?(\d{3})\b/),E=f.match(/\b(?:status(?:\s+code)?|http)[:\s]+(\d{3})\b/),h=Number(_?.[1]??E?.[1]);return Number.isInteger(h)?h:void 0}function y(f,_){let E=a_(f),h=_h(f);if(h==="STREAM_IDLE_TIMEOUT"||h==="PROVIDER_RECOVERY_BUDGET_EXCEEDED"||f instanceof Error&&f.name==="AbortError"||E.includes("request aborted")||E==="aborted")return{retryable:!1};if(nE.some((x)=>E.includes(x))||fh(f))return{retryable:!1};if(_?.shouldRetry==="false")return{retryable:!1,statusCode:_.statusCode};if(h==="PROVIDER_REQUEST_DEADLINE_EXCEEDED")return{retryable:!0,reason:"timeout"};let T=_?.statusCode??Eh(f)??hh(E);if(_?.shouldRetry==="true")return{retryable:!0,reason:T===429?"rate_limit":T===408||T===409?"timeout":"server_error",statusCode:T};if(T===429)return{retryable:!0,reason:"rate_limit",statusCode:T};if(T===408||T===409)return{retryable:!0,reason:"timeout",statusCode:T};if(T!==void 0&&T>=500&&T<=599)return{retryable:!0,reason:"server_error",statusCode:T};if(h==="PROVIDER_STREAM_CLOSED"||E.includes("stream closed before completion")||E.includes("ended without")||E.includes("stream ended before"))return{retryable:!0,reason:"stream_closed",statusCode:T};if(iE.some((x)=>E.includes(x)))return{retryable:!0,reason:"transport",statusCode:T};if(E.includes("timeout")||E.includes("timed out")||E.includes("temporarily unavailable")||E.includes("upstream_error")||E.includes("overloaded")||E.includes("rate limit")||E.includes("too many requests")||E.includes("service unavailable")||E.includes("server error")||E.includes("internal error")||E.includes("please retry")||E.includes("try your request again"))return{retryable:!0,reason:E.includes("rate")||E.includes("too many")?"rate_limit":E.includes("timeout")||E.includes("timed out")?"timeout":"server_error",statusCode:T};return{retryable:!1,statusCode:T}}function vf(f,_){if(!f)return;if(f.retryAfterMs!==void 0){let T=Number.parseFloat(f.retryAfterMs);if(Number.isFinite(T))return Math.max(0,T)}if(f.retryAfter===void 0)return;let E=Number.parseFloat(f.retryAfter);if(Number.isFinite(E))return Math.max(0,E*1000);let h=Date.parse(f.retryAfter);return Number.isFinite(h)?Math.max(0,h-_):void 0}function y_(f,_,E={}){let h=E.now??Date.now(),T=E.maxDelayMs??60000,x=vf(_,h);if(x!==void 0)return Math.min(Math.ceil(x),T);let S=Math.max(0,f-1),P=E.maxExponentialDelayMs??8000,t=Math.min(500*2**S,P),N=Math.max(0,Math.min(1,E.random??Math.random())),M=t*(0.75+N*0.25);return Math.min(Math.round(M),T)}function n_(f,_){let E=f.onPayload;f.onPayload=async(h,T)=>{let x=E?await E(h,T):h;return _(x===void 0?h:x,T)}}function Th(f){if(!f.reasoningEnabled)return;return f.reasoningEffort??f.reasoningLevel??"high"}function wf(f,_,E){if(!f.enablePromptCaching)return"none";if(E&&_.api==="openai-completions"&&!_.baseUrl.includes("api.openai.com"))return"long";return"short"}function xh(f){switch(f){case"minimal":return"MINIMAL";case"low":return"LOW";case"medium":return"MEDIUM";default:return"HIGH"}}function th(f,_,E,h){let T=h?void 0:Th(E);if(!T){if(_.api==="anthropic-messages")f.thinkingEnabled=!1;if(_.api==="google-generative-ai"||_.api==="google-vertex")f.thinking={enabled:!1};return}switch(_.api){case"anthropic-messages":f.thinkingEnabled=!0,f.effort=T;break;case"google-generative-ai":case"google-vertex":f.thinking={enabled:!0,level:xh(T)};break;case"mistral-conversations":f.reasoningEffort="high";break;case"bedrock-converse-stream":case"pi-messages":f.reasoning=T;break;default:f.reasoningEffort=T}}function Mh(f,_,E){if(!E)return;switch(_){case"anthropic-messages":case"bedrock-converse-stream":f.toolChoice={type:"tool",name:E};break;case"openai-completions":case"mistral-conversations":case"pi-messages":f.toolChoice={type:"function",function:{name:E}};break;case"openai-responses":case"openai-codex-responses":case"azure-openai-responses":f.toolChoice={type:"function",name:E};break;case"google-generative-ai":case"google-vertex":f.toolChoice="any";break}}function Rh(f,_,E){let h=E.serviceTier;if(!h)return;if(_.api==="openai-responses"||_.api==="openai-codex-responses"||_.api==="azure-openai-responses"){f.serviceTier=h;return}if(_.api!=="openai-completions"&&!(_.api==="anthropic-messages"&&h==="fast"))return;n_(f,(T)=>{if(!T||typeof T!=="object"||Array.isArray(T))return T;return _.api==="anthropic-messages"?{...T,speed:"fast"}:{...T,service_tier:h}})}function Ah(f,_,E){let h=E.responseVerbosity;if(!h)return;if(e_(_,h),_.api==="openai-codex-responses"){f.textVerbosity=h;return}n_(f,(T)=>{if(!T||typeof T!=="object"||Array.isArray(T))return T;if(_.api==="openai-completions")return{...T,verbosity:h};let x="text"in T&&T.text&&typeof T.text==="object"&&!Array.isArray(T.text)?T.text:{};return{...T,text:{...x,verbosity:h}}})}function r_(f,_,E,h,T=!1){let x={apiKey:f.apiKey,headers:f.customHeaders,signal:E,temperature:h?.temperature??f.temperature??0,maxTokens:h?.maxOutputTokens??f.maxOutputTokens,timeoutMs:f.timeout,maxRetries:0,cacheRetention:wf(f,_,h?.providerSessionId),sessionId:h?.providerSessionId};if(th(x,_,f,T),Mh(x,_.api,h?.toolChoice?.toolName),Rh(x,_,f),Ah(x,_,f),_.api==="azure-openai-responses")x.azureBaseUrl=f.baseUrl,x.azureApiVersion=f.apiVersion,x.azureDeploymentName=_.id;return x}function d_(f,_){let E=_.get("x-should-retry");return{statusCode:f,..._.get("retry-after")!==null?{retryAfter:_.get("retry-after")??void 0}:{},..._.get("retry-after-ms")!==null?{retryAfterMs:_.get("retry-after-ms")??void 0}:{},...E==="true"||E==="false"?{shouldRetry:E}:{}}}var Ph=new Set(["anthropic-messages","openai-completions","openai-responses","openai-codex-responses","azure-openai-responses","pi-messages"]);function i_(f,_,E){let h=f.onResponse;if(f.onResponse=async(x,S)=>{let P=new Headers(x.headers);E(d_(x.status,P)),await h?.(x,S)},!Ph.has(_.api)||typeof globalThis.fetch!=="function")return;let T=typeof f.fetch==="function"?f.fetch:globalThis.fetch.bind(globalThis);f.fetch=async(x,S)=>{let P=await T(x,S);return E(d_(P.status,P.headers)),P}}function fE(f){return{promptTokens:f.input+f.cacheRead+f.cacheWrite,completionTokens:f.output,totalTokens:f.totalTokens,costUsd:f.cost.total,...f.reasoning!==void 0?{reasoningTokens:f.reasoning}:{},...f.cacheWrite>0?{cacheCreationInputTokens:f.cacheWrite}:{},...f.cacheRead>0?{cacheReadInputTokens:f.cacheRead}:{}}}var Hf=300000,Sh=30000;class _E extends Error{timeoutMs;code="STREAM_IDLE_TIMEOUT";constructor(f){super(`Provider stream idle timeout after ${f}ms without an event`);this.timeoutMs=f;this.name="StreamIdleTimeoutError"}}class EE extends Error{code="PROVIDER_STREAM_CLOSED";constructor(){super("Provider stream closed before completion");this.name="ProviderStreamClosedError"}}function pf(f){return f.reason instanceof Error?f.reason:new DOMException("Aborted","AbortError")}function Nh(f){return f.idleTimeoutMs&&f.idleTimeoutMs>0?f.idleTimeoutMs:Hf}function Ih(f,_){if(_===0)return;let E=_!==void 0&&_>0?_:Sh;return Math.max(1,Math.min(E,Math.floor(f/2)))}function uh(f,_,E){if(E?.aborted)return Promise.reject(pf(E));return new Promise((h,T)=>{let x=!1,S=()=>{clearTimeout(M),E?.removeEventListener("abort",N)},P=(R)=>{if(x)return;x=!0,S(),h(R)},t=(R)=>{if(x)return;x=!0,S(),T(R instanceof Error?R:Error(String(R)))},N=()=>{if(E)t(pf(E))},M=setTimeout(()=>P({kind:"timer"}),Math.max(0,_));if(E?.addEventListener("abort",N,{once:!0}),E?.aborted){N();return}f.then((R)=>P({kind:"next",result:R}),t)})}async function*Dh(f,_,E){let h=Nh(_),T=Ih(h,_.stallWarningMs);if(_.signal?.aborted)throw pf(_.signal);let x=Date.now(),S=Promise.resolve().then(()=>f.next()),P;for(;;){let N=await uh(S,(P?h:T??h)-(Date.now()-x),_.signal);if(N.kind==="next"){if(P)yield{...P,phase:"recovered",durationMs:Math.max(P.durationMs,Date.now()-x)};return N.result}if(!P&&T!==void 0){E.stallCount++,P={phase:"detected",stallCount:E.stallCount,durationMs:T,warningAfterMs:T,timeoutMs:h,outputStarted:E.outputStarted},yield P;continue}let M=new _E(h);throw _.abort?.(M),M}}async function*hE(f,_,E,h,T={}){let S=f.stream(_,E,h)[Symbol.asyncIterator](),P=0,t=!1,N={stallCount:0,outputStarted:!1};try{while(!0){let M=Dh(S,T,N),R=await M.next();while(!R.done)yield{providerStall:R.value},R=await M.next();let u=R.value;if(u.done)throw new EE;let Y=u.value;switch(Y.type){case"text_delta":N.outputStarted=!0,yield{content:Y.delta};break;case"thinking_delta":N.outputStarted=!0,yield{reasoningContent:Y.delta};break;case"toolcall_end":N.outputStarted=!0,yield{toolCalls:[{index:P++,id:Y.toolCall.id,type:"function",function:{name:Y.toolCall.name,arguments:JSON.stringify(Y.toolCall.arguments)}}]};break;case"done":t=!0,yield{finishReason:Y.reason,usage:fE(Y.message.usage)};return;case"error":throw Error(Y.error.errorMessage??`Request ${Y.reason==="aborted"?"aborted":"failed"}`)}}}finally{if(!t)Promise.resolve(S.return?.()).catch(()=>{return})}}var mf=g("Chat"),Hh=1;function Uh(f,_){let E=_.provider===f.provider,h=E&&_.channel===void 0,T=_.channel;return{...f,provider:_.provider,model:_.model,apiKey:T?.apiKey??(h?f.apiKey:void 0),baseUrl:T?.baseUrl??(h?f.baseUrl:void 0),temperature:T?.temperature??f.temperature,maxOutputTokens:T?.maxOutputTokens??(h?f.maxOutputTokens:void 0),timeout:T?.timeout??f.timeout,streamIdleTimeout:T?.streamIdleTimeout??f.streamIdleTimeout,apiVersion:T?.apiVersion??(h?f.apiVersion:void 0),customHeaders:T?.customHeaders??(h?f.customHeaders:void 0),enablePromptCaching:T?.enablePromptCaching??(h?f.enablePromptCaching:void 0),serviceTier:E?f.serviceTier:void 0,responseVerbosity:E?f.responseVerbosity:void 0,fallbackModels:void 0}}function Yh(f){return Boolean(f&&f.role==="user"&&Array.isArray(f.content)&&f.content.some((_)=>_.type==="image_url"))}function ch(f){let E=f.findLast((h)=>{let T=h.metadata;return T!==null&&typeof T==="object"&&!Array.isArray(T)&&T.isCompactSummary===!0})?.metadata;return E!==null&&typeof E==="object"&&!Array.isArray(E)&&typeof E.parentId==="string"?E.parentId:""}function bh(f,_){let E=y(f,_);if(!E.retryable||!E.reason)return;let h=E.statusCode;switch(E.reason){case"rate_limit":if(h!==429)return;break;case"server_error":if(h===void 0||h<500||h>599)return;break;case"transport":case"stream_closed":break;case"timeout":return}let T=vf(_,Date.now());return{reason:E.reason,...h!==void 0?{statusCode:h}:{},...T!==void 0?{retryAfterMs:T}:{}}}function qf(f){return f!==null&&typeof f==="object"&&"code"in f&&f.code==="STREAM_IDLE_TIMEOUT"}class af{config;models;model;promptCacheBreakMonitor=new Jf;admissionFallbackOwnerId=`pi-service-${process.pid}-${Hh++}`;constructor(f){let _=zf(f);this.config={...f,maxContextTokens:_.model.contextWindow,maxOutputTokens:f.maxOutputTokens??_.model.maxTokens},this.models=_.models,this.model=_.model,mf.debug("[PiAIChatService] Initialized",{provider:this.model.provider,model:this.model.id,api:this.model.api})}async chat(f,_,E,h){let T="",x="",S=[],P,t;for await(let N of this.streamChat(f,_,E,h)){T+=N.content??"",x+=N.reasoningContent??"";for(let M of N.toolCalls??[])if(M.id&&M.type==="function"&&M.function?.name)S.push(M);P=N.usage??P,t=N.finishReason??t}return{content:T,...x?{reasoningContent:x}:{},...S.length>0?{toolCalls:S}:{},usage:P,finishReason:t}}async*streamChat(f,_,E,h){let T=h?.toolChoice?.toolName;if(T&&!_?.some((A)=>A.name===T))throw Error(`Required tool is unavailable: ${T}`);let x=R_(f);if(x.some((A)=>Yh(A))&&!this.model.input.includes("image"))throw Error(`${this.model.name} does not support image input`);let S=Boolean(T)||A_(x),P=await M_(x,this.model,_,E,T),t=(A,I)=>{let B=h?.providerSessionId;if(!B||!A.usage)return A;if(!this.config.enablePromptCaching)return this.promptCacheBreakMonitor.clear(B),A;let c=wf(this.config,I,B),H=this.promptCacheBreakMonitor.observe({sessionId:B,modelIdentity:`${I.provider}\x00${I.api}\x00${I.id}`,context:P,retention:c,contextEpoch:ch(x),policy:{baseUrl:I.baseUrl??this.config.baseUrl??"",retention:c,requiredTool:T??"",reasoningEnabled:this.config.reasoningEnabled??!1,reasoningEffort:this.config.reasoningEffort??this.config.reasoningLevel??"",serviceTier:this.config.serviceTier??"",responseVerbosity:this.config.responseVerbosity??"",temperature:h?.temperature??this.config.temperature??0,maxOutputTokens:h?.maxOutputTokens??this.config.maxOutputTokens??0,customHeaders:this.config.customHeaders??{}},usage:A.usage});if(!H)return A;return mf.warn("[PiAIChatService] Prompt cache break detected",{reason:H.reason,previousCacheReadTokens:H.previousCacheReadTokens,cacheReadTokens:H.cacheReadTokens,tokenDrop:H.tokenDrop,callNumber:H.callNumber}),{...A,usage:{...A.usage,promptCacheBreak:H}}},N=g_({messages:x,context:P,tools:_,requestOptions:h}),M=h?.providerRecovery;if(M&&!xE(M.budgetMs))throw Error("Invalid bounded foreground Provider recovery budget");let R=M?.mode==="bounded_foreground"&&M.budgetMs>0?{budgetMs:M.budgetMs,startedAt:void 0}:void 0,u=R?"bounded_foreground":"standard",Y=this.config.maxRetries??2,$=this.config.maxRetries??(R?TE:2),Q=R!==void 0&&this.config.maxRetries===void 0,K=0,o,Uf=this.config.providerCircuitRegistry??c_(),tf=this.config.providerCircuitBreakerOpenMs??Wf,tE=Math.max(Nf,Math.min(this.config.streamIdleTimeout??Hf,kf)),ME=this.config.providerRequestAdmissionScheduler??m_(),RE=this.config.providerRequestConcurrency??Kf,yf=this.config.providerRequestAdmissionMs??Cf,AE=this.config.providerRequestPendingBytes??Ff,Yf=h?.providerAdmission??{sessionId:this.admissionFallbackOwnerId,ownerId:this.admissionFallbackOwnerId,requestClass:"internal"},PE=(A,I)=>Uf.get({provider:A.provider,api:A.api,baseUrl:A.baseUrl??I.baseUrl??"",model:A.id,serviceTier:I.serviceTier,apiVersion:I.apiVersion,apiKey:I.apiKey,customHeaders:I.customHeaders,openDurationMs:tf,probeLeaseMs:tE}),SE=(A,I)=>({provider:A.provider,api:A.api,baseUrl:A.baseUrl??I.baseUrl??"",model:A.id,serviceTier:I.serviceTier,apiVersion:I.apiVersion,apiKey:I.apiKey,customHeaders:I.customHeaders,maxConcurrent:RE,maxPendingBytes:AE}),j=(A=Date.now())=>{if(!R)return;let I=R.startedAt===void 0?0:Math.min(R.budgetMs,Math.max(0,A-R.startedAt));return{recoveryBudgetMs:R.budgetMs,recoveryElapsedMs:I,recoveryRemainingMs:Math.max(0,R.budgetMs-I)}},v=()=>({mode:u,...j()??{}}),df=()=>{if(R&&R.startedAt===void 0)R.startedAt=Date.now()},w=()=>{let A=j();return new a(R?.budgetMs??0,A?.recoveryElapsedMs??0)},d=()=>!Q||K<$+1,cf=(A,I)=>{let{state:B,...c}=I;return{phase:A,...c,...j()?{recoveryRemainingMs:j()?.recoveryRemainingMs}:{}}},ef=(A)=>({phase:"rejected",requestClass:A.requestClass,resource:A.resource,scope:A.scope,reason:A.reason,queuePosition:0,queueDepth:Math.max(0,A.queued),inFlight:Math.max(0,A.inFlight),limit:Math.max(0,A.limit),waitMs:A.reason==="wait_timeout"?A.maxWaitMs:0,maxWaitMs:A.maxWaitMs,...j()?{recoveryRemainingMs:j()?.recoveryRemainingMs}:{}}),NE=async function*(A,I){let B=j()?.recoveryRemainingMs,c=B!==void 0&&R?.startedAt!==void 0?Math.min(yf,B):yf,H;try{H=ME.admit({scope:SE(A,I),sessionId:Yf.sessionId,ownerId:Yf.ownerId,requestClass:Yf.requestClass,maxWaitMs:c,pendingBytes:N,signal:E})}catch(b){if(xf(b)){if(b.reason==="wait_timeout"&&R?.startedAt!==void 0&&(j()?.recoveryRemainingMs??0)<=0)throw w();yield{providerAdmission:ef(b)}}throw b}let L=H.getSnapshot();if(L.state==="admitted")return await H.ready;yield{providerAdmission:cf("queued",L)};let F=H.ready.then((b)=>({kind:"ready",permit:b}),(b)=>({kind:"error",error:b}));while(!0){let b=H.getSnapshot(),O=Math.max(1,Math.min(w_,Math.max(1,c-b.waitMs))),J,X=new Promise((p)=>{J=setTimeout(()=>p({kind:"heartbeat"}),O),J.unref?.()}),G=await Promise.race([F,X]);if(J)clearTimeout(J);if(G.kind==="heartbeat"){yield{providerAdmission:cf("queued",H.getSnapshot())};continue}if(G.kind==="error"){if(xf(G.error)){if(G.error.reason==="wait_timeout"&&R?.startedAt!==void 0&&(j()?.recoveryRemainingMs??0)<=0)throw w();yield{providerAdmission:ef(G.error)}}throw G.error}return yield{providerAdmission:cf("admitted",H.getSnapshot())},G.permit}},IE=(A,I)=>{if(!d())throw w();if(Q)K++;o=void 0;let B=new AbortController,c=E?x_(E,B.signal):B.signal,H=typeof I.timeout==="number"&&Number.isFinite(I.timeout)&&I.timeout>0?Math.max(1,Math.floor(I.timeout)):void 0,L;if(R?.startedAt!==void 0){let O=j()?.recoveryRemainingMs??0;if(O<=0)throw w();L={remainingMs:O,error:new a(R.budgetMs,R.budgetMs)}}let F=r_(I,A,c,h,S);i_(F,A,(O)=>{o=O});let b=hE(this.models,A,P,F,{idleTimeoutMs:I.streamIdleTimeout??Hf,signal:c,abort:(O)=>B.abort(O)});return async function*(){let O,J;try{if(H!==void 0&&(L===void 0||H<L.remainingMs)){let X=new of(H);O=setTimeout(()=>B.abort(X),H),O.unref?.()}if(L){let X=L;J=setTimeout(()=>B.abort(X.error),X.remainingMs),J.unref?.()}yield*b}finally{if(O)clearTimeout(O);if(J)clearTimeout(J)}}()},nf=this,q=(A)=>({phase:A.phase,reason:A.reason,...A.statusCode!==void 0?{statusCode:A.statusCode}:{},...A.retryAfterMs!==void 0?{retryAfterMs:A.retryAfterMs}:{},...A.nextProbeAt!==void 0?{nextProbeAt:A.nextProbeAt}:{},openDurationMs:A.openDurationMs,sampleCount:A.sampleCount,failureCount:A.failureCount,...j()?{recoveryRemainingMs:j()?.recoveryRemainingMs}:{}}),rf=(A,I)=>({phase:A,reason:I.reason,...I.statusCode!==void 0?{statusCode:I.statusCode}:{},retryAfterMs:I.retryAfterMs,...I.nextProbeAt!==void 0?{nextProbeAt:I.nextProbeAt}:{},openDurationMs:I.openDurationMs,sampleCount:I.sampleCount,failureCount:I.failureCount,...j()?{recoveryRemainingMs:j()?.recoveryRemainingMs}:{}}),uE=(A)=>({phase:"probe",reason:A.reason??"server_error",...A.statusCode!==void 0?{statusCode:A.statusCode}:{},openDurationMs:A.openDurationMs??tf,...A.sampleCount!==void 0?{sampleCount:A.sampleCount}:{},...A.failureCount!==void 0?{failureCount:A.failureCount}:{},...j()?{recoveryRemainingMs:j()?.recoveryRemainingMs}:{}}),bf=(A,I,B)=>({providerRetry:{phase:"exhausted",attempt:A,maxRetries:$,reason:I,...B!==void 0?{statusCode:B}:{},...v(),exhaustedBy:"recovery_budget"}}),f_=async function*(A,I,B,c,H){let L,F=!1,b,O,J=PE(A,I);for(let X=0;X<=c;X++){if(!d())break;let G,p;while(!G){let D=J.preflight();while(!D.eligible){if(b=D.reason,O=D.statusCode,!R||!H){let C=rf("rejected",D);throw yield{providerCircuit:C},new hf(C)}df();let V=j()?.recoveryRemainingMs??0;if(V<=0){let C=w();throw yield bf(Q?Math.max(0,K-1):X,D.reason,D.statusCode),C}yield{providerCircuit:rf("waiting",D)};let m=Math.min(Math.max(1,D.retryAfterMs),gf,V);if(await i(m,E,{throwOnAbort:!0}),(j()?.recoveryRemainingMs??0)<=0){let C=w();throw yield bf(Q?Math.max(0,K-1):X,D.reason,D.statusCode),C}D=J.preflight()}try{p=yield*NE(A,I)}catch(Z){if(Z instanceof a)yield bf(Q?Math.max(0,K-1):X,b??"timeout",O);throw Z}let k=J.check();if(k.allowed)G=k;else p.release(),p=void 0}let e=G.token;if(G.probe)yield{providerCircuit:uE(G)};try{let D=!1,k=!1;for await(let Z of IE(A,I)){if(Z.providerStall){yield Z;continue}let V=Q?K-1:X;if(V>0&&b&&!D)D=!0,yield{providerRetry:{phase:"recovered",attempt:V,maxRetries:$,reason:b,...O!==void 0?{statusCode:O}:{},...v()}};if(!k){k=!0;let m=J.recordSuccess(e);if(m)yield{providerCircuit:q(m)}}F=!0,B(),yield t(Z,A)}if(!k){let Z=J.recordSuccess(e);if(Z)yield{providerCircuit:q(Z)}}return}catch(D){if(p?.release(),L=D,nf.logIdleTimeout(D,F,A),await nf.handleAbort(E),D instanceof a){if(F)throw sf(D),D;throw yield{providerRetry:{phase:"exhausted",attempt:Q?Math.max(0,K-1):X,maxRetries:$,reason:b??"timeout",...O!==void 0?{statusCode:O}:{},...v(),exhaustedBy:"recovery_budget"}},D}let k=y(D,o);if(F)throw sf(D),D;let Z=bh(D,o),V=Z?J.recordFailure(e,Z):o&&!qf(D)?J.recordNeutral(e):void 0;if(V)yield{providerCircuit:q(V)};if(!k.retryable||!k.reason){if(X>0&&b)yield{providerRetry:{phase:"exhausted",attempt:Q?Math.max(0,K-1):X,maxRetries:$,reason:b,...O!==void 0?{statusCode:O}:{},...v()}};throw D}b=k.reason,O=k.statusCode;let m=X<c&&d();if(V&&V.phase!=="closed"&&m&&(!R||!H)){let C={...q(V),phase:"rejected"};throw yield{providerCircuit:C},new hf(C)}if(m){df();let C=Q?K:X+1,HE=y_(C,o,R?{maxDelayMs:lf,maxExponentialDelayMs:lf}:void 0),E_=V&&V.phase!=="closed"?V.retryAfterMs??0:0;if(R&&E_>0&&V)yield{providerCircuit:{...q(V),phase:"waiting"}};let UE=j(),Bf=Math.max(HE,E_),n=R?Math.min(Bf,UE?.recoveryRemainingMs??Bf):Bf,Rf={attempt:C,maxRetries:$,reason:k.reason,...k.statusCode!==void 0?{statusCode:k.statusCode}:{}};if(yield{providerRetry:{phase:"scheduled",...Rf,delayMs:n,nextRetryAt:Date.now()+n,...v()}},R){let r=n;while(r>0){let h_=Math.min(r,gf);if(await i(h_,E,{throwOnAbort:!0}),r-=h_,(j()?.recoveryRemainingMs??0)<=0){let Af=w();throw yield{providerRetry:{phase:"exhausted",...Rf,...v(),exhaustedBy:"recovery_budget"}},Af}if(r>0){if(V&&V.phase!=="closed"&&V.nextProbeAt!==void 0){let Af=Math.max(0,V.nextProbeAt-Date.now());if(Af>0)yield{providerCircuit:{...q(V),phase:"waiting",retryAfterMs:Af}}}yield{providerRetry:{phase:"waiting",...Rf,delayMs:n,nextRetryAt:Date.now()+r,...v()}}}}}else await i(n,E,{throwOnAbort:!0});yield{providerRetry:{phase:"attempt",...Rf,...v()}}}else yield{providerRetry:{phase:"exhausted",attempt:Q?Math.max(0,K-1):X,maxRetries:$,reason:k.reason,...k.statusCode!==void 0?{statusCode:k.statusCode}:{},...v(),...R&&(H||!d())?{exhaustedBy:"attempt_limit"}:{}}}}finally{J.abandon(e),p?.release()}}throw L},Of,__=!1,Mf=this.config.fallbackModels??[],DE=R&&Mf.length>0?Math.min(Y,$):$;try{for await(let A of f_(this.model,this.config,()=>{__=!0},DE,Mf.length===0))yield A;return}catch(A){if(Of=A,__||!xf(A)&&!Lf(A)&&!qf(A)&&!y(A,o).retryable)throw A}for(let[A,I]of Mf.entries()){if(!d())break;yield{modelFallback:!0};let B=!1;try{let c=Uh(this.config,I),H=N_(c,I),L=A===Mf.length-1,F=R&&!L?Math.min(Y,$):$;for await(let b of f_(H,c,()=>{B=!0},F,L))yield b;return}catch(c){if(Of=c,B||!xf(c)&&!Lf(c)&&!qf(c)&&!y(c,o).retryable)throw c}}throw Of}async handleAbort(f){if(f?.aborted)await i(0,f,{throwOnAbort:!0})}logIdleTimeout(f,_,E){if(f===null||typeof f!=="object"||!("code"in f)||f.code!=="STREAM_IDLE_TIMEOUT"||!("timeoutMs"in f)||typeof f.timeoutMs!=="number")return;mf.warn("[PiAIChatService] Provider stream idle timeout",{provider:E.provider,model:E.id,timeoutMs:f.timeoutMs,replayBoundaryCrossed:_})}getConfig(){return{...this.config}}updateConfig(f){let _={...this.config,...f},E=zf(_);this.config={..._,maxContextTokens:E.model.contextWindow,maxOutputTokens:_.maxOutputTokens??E.model.maxTokens},this.models=E.models,this.model=E.model}}var Oh=g("Service");async function GT(f){let _=f;if(_.provider){let E=T_(_.provider);if(Object.keys(E).length>0)_={..._,customHeaders:{...E,..._.customHeaders}},Oh.debug(`Injected ${_.provider} specific headers:`,Object.keys(E))}return Bh(_)}function Bh(f){return new af(f)}
5
- export{Xh as Yd,Wh as Zd,x_ as _d,xf as $d,q_ as ae,fh as be,RT as ce,af as de,GT as ee};
5
+ export{Xh as be,Wh as ce,x_ as de,xf as ee,q_ as fe,fh as ge,RT as he,af as ie,GT as je};
@@ -1,4 +1,4 @@
1
- import{df as YO}from"./chunk-m57w4p91.js";import{kg as qO,mg as S,pg as y}from"./chunk-v0rsz1rt.js";import{wg as P}from"./chunk-k0pa8874.js";import{Xg as XO}from"./chunk-t2wgf9tq.js";import{rh as n}from"./chunk-r9d4mjxj.js";import{Bh as r}from"./chunk-9q852bsc.js";import{Dh as w}from"./chunk-wfy851et.js";var b;((V)=>{V.PreToolUse="PreToolUse";V.PostToolUse="PostToolUse";V.PostToolUseFailure="PostToolUseFailure";V.PermissionRequest="PermissionRequest";V.Elicitation="Elicitation";V.ElicitationResult="ElicitationResult";V.UserPromptSubmit="UserPromptSubmit";V.SessionStart="SessionStart";V.SessionEnd="SessionEnd";V.Stop="Stop";V.SubagentStop="SubagentStop";V.Notification="Notification";V.Compaction="Compaction"})(b||={});var v;((Z)=>{Z.Approve="approve";Z.Block="block";Z.Async="async"})(v||={});var m;((Z)=>{Z.Allow="allow";Z.Deny="deny";Z.Ask="ask"})(m||={});import C from"node:path";import{LRUCache as fO}from"lru-cache";import{nanoid as R}from"nanoid";var N={enabled:!1,defaultTimeout:60,timeoutBehavior:"ignore",failureBehavior:"ignore",maxConcurrentHooks:5,httpPolicy:{},PreToolUse:[],PostToolUse:[{name:"builtin:code-review-sensor",matcher:{tools:"Edit|Write"},hooks:[{type:"prompt",prompt:"审查此代码变更,重点检查:"+"1) 安全漏洞(命令注入、XSS、SQL 注入、硬编码密钥/密码)"+"2) 明显的逻辑错误(无限循环、off-by-one、空引用)"+"3) 类型安全问题。"+"如果发现严重问题,将问题描述放在 hookSpecificOutput.additionalContext 中。"+"如果没有严重问题,返回 approve。",model:void 0,timeout:15}]}],PostToolUseFailure:[],PermissionRequest:[],Elicitation:[],ElicitationResult:[],UserPromptSubmit:[],SessionStart:[],SessionEnd:[],Stop:[],SubagentStop:[],Notification:[],Compaction:[]};function E(O,q){return{...O,...q,PreToolUse:q.PreToolUse??O.PreToolUse,PostToolUse:q.PostToolUse??O.PostToolUse,PostToolUseFailure:q.PostToolUseFailure??O.PostToolUseFailure,PermissionRequest:q.PermissionRequest??O.PermissionRequest,Elicitation:q.Elicitation??O.Elicitation,ElicitationResult:q.ElicitationResult??O.ElicitationResult,UserPromptSubmit:q.UserPromptSubmit??O.UserPromptSubmit,SessionStart:q.SessionStart??O.SessionStart,SessionEnd:q.SessionEnd??O.SessionEnd,Stop:q.Stop??O.Stop,SubagentStop:q.SubagentStop??O.SubagentStop,Notification:q.Notification??O.Notification,Compaction:q.Compaction??O.Compaction}}function c(){let O={};if(process.env.BLADE_DISABLE_HOOKS==="true")O.enabled=!1;if(process.env.BLADE_HOOK_TIMEOUT){let q=parseInt(process.env.BLADE_HOOK_TIMEOUT,10);if(!isNaN(q)&&q>0)O.defaultTimeout=q}return O}class d{executedHooks=new Map;canExecute(O,q){if(!this.executedHooks.has(O))this.executedHooks.set(O,new Set);if(this.executedHooks.get(O).has(q))return console.warn(`[HookGuard] Hook ${q} for tool ${O} already executed, skipping`),!1;return!0}markExecuted(O,q){let Q=this.executedHooks.get(O);if(Q)Q.add(q)}cleanup(O){this.executedHooks.delete(O)}cleanupAll(){this.executedHooks.clear()}}import DO from"node:path";import{createHash as JO}from"node:crypto";import{constants as s,promises as j}from"node:fs";import k from"node:path";import{Mutex as SO}from"async-mutex";import GO from"write-file-atomic";var h=1,VO=1048576,LO=/^sha256:[0-9a-f]{64}$/;class o extends Error{constructor(){super("Hook configuration changed after review; reload before trusting");this.name="HookTrustDigestMismatchError"}}function D(O){return O!==null&&typeof O==="object"&&!Array.isArray(O)}function M(O){if(O===void 0||typeof O==="function")return;if(Array.isArray(O))return O.map(M).filter((Q)=>Q!==void 0);if(!D(O))return O;if(O.type==="function")return;let q={};for(let Q of Object.keys(O).sort()){let Z=M(O[Q]);if(Z!==void 0)q[Q]=Z}return q}function zO(O){let q={};for(let Q of Object.values(b)){let Y=(O[Q]??[]).map(($)=>M({...$,hooks:$.hooks.map((X)=>X.source?{...X,source:{kind:X.source.kind,pluginName:X.source.pluginName,pluginSource:X.source.pluginSource}}:X)})).filter(($)=>$!==void 0);if(Y.length>0)q[Q]=Y}return{defaultTimeout:O.defaultTimeout,timeoutBehavior:O.timeoutBehavior,failureBehavior:O.failureBehavior,maxConcurrentHooks:O.maxConcurrentHooks,httpPolicy:M(O.httpPolicy??{}),events:q}}function FO(O){if(O.type==="command")return O.command.slice(0,2048);if(O.type==="prompt")return O.prompt.slice(0,512);if(O.type==="http")try{let q=new URL(O.url);return`${q.origin}${q.pathname}`.slice(0,2048)}catch{return O.url.slice(0,2048)}return"in-process function"}function t(O){let q=[];for(let Q of Object.values(b))for(let Z of O[Q]??[]){let Y=Z.matcher?JSON.stringify(M(Z.matcher)):void 0;for(let $ of Z.hooks){if($.type==="function")continue;q.push({event:Q,matcher:Y,name:Z.name,type:$.type,target:FO($),...$.source?{pluginName:$.source.pluginName,pluginSource:$.source.pluginSource}:{}})}}return q}function RO(O){if(t(O).length===0)return null;let q=JSON.stringify(M(zO(O)));return`sha256:${JO("sha256").update(q).digest("hex")}`}class A{static instance=null;mutex=new SO;filePath;constructor(O=k.join(r(),"hook-trust.json")){this.filePath=O}static getInstance(){if(!A.instance)A.instance=new A;return A.instance}static resetInstance(){A.instance=null}async getStatus(O,q){let{projectPath:Q,trustRoot:Z}=await n(O),Y=t(q),$=RO(q),X={projectPath:Q,trustRoot:Z,enabled:q.enabled===!0,configuredHooks:Y.length,currentDigest:$,definitions:Y};if(!q.enabled)return{...X,state:"disabled"};if(!$)return{...X,state:"not_required"};let W;try{W=await this.readStore()}catch(G){return{...X,state:"error",error:G instanceof Error?G.message:"Hook trust store is unavailable"}}let J=W.projects[Z];if(!J)return{...X,state:"untrusted"};return{...X,state:J.digest===$?"trusted":"modified",trustedDigest:J.digest,trustedAt:J.trustedAt}}async trust(O,q,Q){return this.mutex.runExclusive(async()=>{let Z=await this.getStatus(O,q);if(!Z.currentDigest)throw Error("No configured external hooks require trust");if(Q!==void 0&&Q!==Z.currentDigest)throw new o;let Y=await this.readStore();return Y.projects[Z.trustRoot]={digest:Z.currentDigest,trustedAt:new Date().toISOString()},await this.writeStore(Y),this.getStatus(O,q)})}async revoke(O,q){return this.mutex.runExclusive(async()=>{let Q=await this.getStatus(O,q),Z=await this.readStore();if(Q.trustRoot in Z.projects)delete Z.projects[Q.trustRoot],await this.writeStore(Z);return this.getStatus(O,q)})}async readStore(){let O;try{O=await j.open(this.filePath,s.O_RDONLY|s.O_NOFOLLOW)}catch(Y){if(Y.code==="ENOENT")return{version:h,projects:{}};throw Error("Hook trust store must be a regular file")}let q;try{let Y=await O.stat();if(!Y.isFile())throw Error("Hook trust store must be a regular file");if(Y.size>VO)throw Error("Hook trust store exceeds the maximum supported size");if(process.getuid&&Y.uid!==process.getuid())throw Error("Hook trust store must be owned by the current user");if((Y.mode&511)!==384)throw Error("Hook trust store permissions must be 0600");q=await O.readFile("utf8")}finally{await O.close()}let Q=JSON.parse(q);if(!D(Q)||Q.version!==h)throw Error("Hook trust store version must be 1");if(Object.keys(Q).some((Y)=>Y!=="version"&&Y!=="projects")||!D(Q.projects))throw Error("Hook trust store contains unsupported fields");let Z={};for(let[Y,$]of Object.entries(Q.projects)){if(!k.isAbsolute(Y)||!D($)||typeof $.digest!=="string"||!LO.test($.digest)||typeof $.trustedAt!=="string"||!Number.isFinite(Date.parse($.trustedAt))||Object.keys($).some((X)=>X!=="digest"&&X!=="trustedAt"))throw Error("Hook trust store contains an invalid project entry");Z[Y]={digest:$.digest,trustedAt:$.trustedAt}}return{version:h,projects:Z}}async writeStore(O){let q=k.dirname(this.filePath);await j.mkdir(q,{recursive:!0,mode:448}),await j.chmod(q,448),await GO(this.filePath,`${JSON.stringify(O,null,2)}
1
+ import{if as YO}from"./chunk-jyds9m8p.js";import{pg as qO,rg as S,ug as y}from"./chunk-m6qgme8k.js";import{Bg as P}from"./chunk-0kat01bw.js";import{ah as XO}from"./chunk-gv3ed5gw.js";import{wh as n}from"./chunk-bs77d8hn.js";import{Gh as r}from"./chunk-j0yvwrd7.js";import{Ih as w}from"./chunk-zf96d5we.js";var b;((V)=>{V.PreToolUse="PreToolUse";V.PostToolUse="PostToolUse";V.PostToolUseFailure="PostToolUseFailure";V.PermissionRequest="PermissionRequest";V.Elicitation="Elicitation";V.ElicitationResult="ElicitationResult";V.UserPromptSubmit="UserPromptSubmit";V.SessionStart="SessionStart";V.SessionEnd="SessionEnd";V.Stop="Stop";V.SubagentStop="SubagentStop";V.Notification="Notification";V.Compaction="Compaction"})(b||={});var v;((Z)=>{Z.Approve="approve";Z.Block="block";Z.Async="async"})(v||={});var m;((Z)=>{Z.Allow="allow";Z.Deny="deny";Z.Ask="ask"})(m||={});import C from"node:path";import{LRUCache as fO}from"lru-cache";import{nanoid as R}from"nanoid";var N={enabled:!1,defaultTimeout:60,timeoutBehavior:"ignore",failureBehavior:"ignore",maxConcurrentHooks:5,httpPolicy:{},PreToolUse:[],PostToolUse:[{name:"builtin:code-review-sensor",matcher:{tools:"Edit|Write"},hooks:[{type:"prompt",prompt:"审查此代码变更,重点检查:"+"1) 安全漏洞(命令注入、XSS、SQL 注入、硬编码密钥/密码)"+"2) 明显的逻辑错误(无限循环、off-by-one、空引用)"+"3) 类型安全问题。"+"如果发现严重问题,将问题描述放在 hookSpecificOutput.additionalContext 中。"+"如果没有严重问题,返回 approve。",model:void 0,timeout:15}]}],PostToolUseFailure:[],PermissionRequest:[],Elicitation:[],ElicitationResult:[],UserPromptSubmit:[],SessionStart:[],SessionEnd:[],Stop:[],SubagentStop:[],Notification:[],Compaction:[]};function E(O,q){return{...O,...q,PreToolUse:q.PreToolUse??O.PreToolUse,PostToolUse:q.PostToolUse??O.PostToolUse,PostToolUseFailure:q.PostToolUseFailure??O.PostToolUseFailure,PermissionRequest:q.PermissionRequest??O.PermissionRequest,Elicitation:q.Elicitation??O.Elicitation,ElicitationResult:q.ElicitationResult??O.ElicitationResult,UserPromptSubmit:q.UserPromptSubmit??O.UserPromptSubmit,SessionStart:q.SessionStart??O.SessionStart,SessionEnd:q.SessionEnd??O.SessionEnd,Stop:q.Stop??O.Stop,SubagentStop:q.SubagentStop??O.SubagentStop,Notification:q.Notification??O.Notification,Compaction:q.Compaction??O.Compaction}}function c(){let O={};if(process.env.BLADE_DISABLE_HOOKS==="true")O.enabled=!1;if(process.env.BLADE_HOOK_TIMEOUT){let q=parseInt(process.env.BLADE_HOOK_TIMEOUT,10);if(!isNaN(q)&&q>0)O.defaultTimeout=q}return O}class d{executedHooks=new Map;canExecute(O,q){if(!this.executedHooks.has(O))this.executedHooks.set(O,new Set);if(this.executedHooks.get(O).has(q))return console.warn(`[HookGuard] Hook ${q} for tool ${O} already executed, skipping`),!1;return!0}markExecuted(O,q){let Q=this.executedHooks.get(O);if(Q)Q.add(q)}cleanup(O){this.executedHooks.delete(O)}cleanupAll(){this.executedHooks.clear()}}import DO from"node:path";import{createHash as JO}from"node:crypto";import{constants as s,promises as j}from"node:fs";import k from"node:path";import{Mutex as SO}from"async-mutex";import GO from"write-file-atomic";var h=1,VO=1048576,LO=/^sha256:[0-9a-f]{64}$/;class o extends Error{constructor(){super("Hook configuration changed after review; reload before trusting");this.name="HookTrustDigestMismatchError"}}function D(O){return O!==null&&typeof O==="object"&&!Array.isArray(O)}function M(O){if(O===void 0||typeof O==="function")return;if(Array.isArray(O))return O.map(M).filter((Q)=>Q!==void 0);if(!D(O))return O;if(O.type==="function")return;let q={};for(let Q of Object.keys(O).sort()){let Z=M(O[Q]);if(Z!==void 0)q[Q]=Z}return q}function zO(O){let q={};for(let Q of Object.values(b)){let Y=(O[Q]??[]).map(($)=>M({...$,hooks:$.hooks.map((X)=>X.source?{...X,source:{kind:X.source.kind,pluginName:X.source.pluginName,pluginSource:X.source.pluginSource}}:X)})).filter(($)=>$!==void 0);if(Y.length>0)q[Q]=Y}return{defaultTimeout:O.defaultTimeout,timeoutBehavior:O.timeoutBehavior,failureBehavior:O.failureBehavior,maxConcurrentHooks:O.maxConcurrentHooks,httpPolicy:M(O.httpPolicy??{}),events:q}}function FO(O){if(O.type==="command")return O.command.slice(0,2048);if(O.type==="prompt")return O.prompt.slice(0,512);if(O.type==="http")try{let q=new URL(O.url);return`${q.origin}${q.pathname}`.slice(0,2048)}catch{return O.url.slice(0,2048)}return"in-process function"}function t(O){let q=[];for(let Q of Object.values(b))for(let Z of O[Q]??[]){let Y=Z.matcher?JSON.stringify(M(Z.matcher)):void 0;for(let $ of Z.hooks){if($.type==="function")continue;q.push({event:Q,matcher:Y,name:Z.name,type:$.type,target:FO($),...$.source?{pluginName:$.source.pluginName,pluginSource:$.source.pluginSource}:{}})}}return q}function RO(O){if(t(O).length===0)return null;let q=JSON.stringify(M(zO(O)));return`sha256:${JO("sha256").update(q).digest("hex")}`}class A{static instance=null;mutex=new SO;filePath;constructor(O=k.join(r(),"hook-trust.json")){this.filePath=O}static getInstance(){if(!A.instance)A.instance=new A;return A.instance}static resetInstance(){A.instance=null}async getStatus(O,q){let{projectPath:Q,trustRoot:Z}=await n(O),Y=t(q),$=RO(q),X={projectPath:Q,trustRoot:Z,enabled:q.enabled===!0,configuredHooks:Y.length,currentDigest:$,definitions:Y};if(!q.enabled)return{...X,state:"disabled"};if(!$)return{...X,state:"not_required"};let W;try{W=await this.readStore()}catch(G){return{...X,state:"error",error:G instanceof Error?G.message:"Hook trust store is unavailable"}}let J=W.projects[Z];if(!J)return{...X,state:"untrusted"};return{...X,state:J.digest===$?"trusted":"modified",trustedDigest:J.digest,trustedAt:J.trustedAt}}async trust(O,q,Q){return this.mutex.runExclusive(async()=>{let Z=await this.getStatus(O,q);if(!Z.currentDigest)throw Error("No configured external hooks require trust");if(Q!==void 0&&Q!==Z.currentDigest)throw new o;let Y=await this.readStore();return Y.projects[Z.trustRoot]={digest:Z.currentDigest,trustedAt:new Date().toISOString()},await this.writeStore(Y),this.getStatus(O,q)})}async revoke(O,q){return this.mutex.runExclusive(async()=>{let Q=await this.getStatus(O,q),Z=await this.readStore();if(Q.trustRoot in Z.projects)delete Z.projects[Q.trustRoot],await this.writeStore(Z);return this.getStatus(O,q)})}async readStore(){let O;try{O=await j.open(this.filePath,s.O_RDONLY|s.O_NOFOLLOW)}catch(Y){if(Y.code==="ENOENT")return{version:h,projects:{}};throw Error("Hook trust store must be a regular file")}let q;try{let Y=await O.stat();if(!Y.isFile())throw Error("Hook trust store must be a regular file");if(Y.size>VO)throw Error("Hook trust store exceeds the maximum supported size");if(process.getuid&&Y.uid!==process.getuid())throw Error("Hook trust store must be owned by the current user");if((Y.mode&511)!==384)throw Error("Hook trust store permissions must be 0600");q=await O.readFile("utf8")}finally{await O.close()}let Q=JSON.parse(q);if(!D(Q)||Q.version!==h)throw Error("Hook trust store version must be 1");if(Object.keys(Q).some((Y)=>Y!=="version"&&Y!=="projects")||!D(Q.projects))throw Error("Hook trust store contains unsupported fields");let Z={};for(let[Y,$]of Object.entries(Q.projects)){if(!k.isAbsolute(Y)||!D($)||typeof $.digest!=="string"||!LO.test($.digest)||typeof $.trustedAt!=="string"||!Number.isFinite(Date.parse($.trustedAt))||Object.keys($).some((X)=>X!=="digest"&&X!=="trustedAt"))throw Error("Hook trust store contains an invalid project entry");Z[Y]={digest:$.digest,trustedAt:$.trustedAt}}return{version:h,projects:Z}}async writeStore(O){let q=k.dirname(this.filePath);await j.mkdir(q,{recursive:!0,mode:448}),await j.chmod(q,448),await GO(this.filePath,`${JSON.stringify(O,null,2)}
2
2
  `,{mode:384}),await j.chmod(this.filePath,384)}}class T extends Error{constructor(O){super(O);this.name="HttpHookSecurityError"}}function e(O,q={}){let Q;try{Q=new URL(O)}catch{throw new T(`Invalid URL: ${O}`)}if(Q.protocol!=="https:"&&Q.protocol!=="http:")throw new T(`Only http/https supported, got: ${Q.protocol}`);let Z=Q.hostname.toLowerCase();if(BO(Z,q.allowedHosts))return;if(Q.protocol==="http:"&&!q.allowHttp)throw new T(`HTTP (non-TLS) blocked for ${Z}; use https:// or add to allowedHosts`);if(AO(Z)&&!q.allowLoopback)throw new T(`Loopback address blocked: ${Z}; enable policy.allowLoopback or add to allowedHosts`);if(PO(Z)&&!q.allowPrivateRanges)throw new T(`Private/link-local address blocked: ${Z}; enable policy.allowPrivateRanges or add to allowedHosts`)}function BO(O,q){if(!q||q.length===0)return!1;return q.some((Q)=>{let Z=Q.toLowerCase();if(Z===O)return!0;if(Z.startsWith("*.")){let Y=Z.slice(1);return O.endsWith(Y)&&O.length>Y.length}return!1})}function AO(O){if(O==="localhost")return!0;if(O==="::1"||O==="[::1]")return!0;if(/^127\.\d+\.\d+\.\d+$/.test(O))return!0;return!1}function PO(O){let q=O.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);if(!q)return!1;let[Q,Z]=q.slice(1).map(Number);if(Q===10)return!0;if(Q===172&&Z>=16&&Z<=31)return!0;if(Q===192&&Z===168)return!0;if(Q===169&&Z===254)return!0;return!1}function OO(O){if(!O)return{};let q={};for(let[Q,Z]of Object.entries(O))q[Q]=Z.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/gi,(Y,$)=>{return process.env[$]??`\${${$}}`});return q}var UO=S.Object({hookEventName:S.Literal("PreToolUse"),permissionDecision:S.Optional(S.Enum(m)),permissionDecisionReason:S.Optional(S.String()),updatedInput:S.Optional(S.Record(S.String(),S.Unknown()))}),_O=S.Object({hookEventName:S.Literal("PostToolUse"),additionalContext:S.Optional(S.String()),updatedOutput:S.Optional(S.Unknown())}),KO=S.Object({hookEventName:S.Literal("Stop"),continue:S.Optional(S.Boolean()),continueReason:S.Optional(S.String())}),bO=S.Object({hookEventName:S.Literal("SubagentStop"),continue:S.Optional(S.Boolean()),continueReason:S.Optional(S.String()),additionalContext:S.Optional(S.String())}),NO=S.Object({hookEventName:S.Literal("PermissionRequest"),permissionDecision:S.Optional(y(["approve","deny","ask"])),permissionDecisionReason:S.Optional(S.String())}),QO=S.Record(S.String(),S.Union([S.String(),S.Number(),S.Boolean(),S.Array(S.String(),{maxItems:100})]),{maxProperties:32}),MO=S.Object({hookEventName:S.Literal("Elicitation"),action:S.Optional(y(["accept","decline","cancel"])),content:S.Optional(QO)}),TO=S.Object({hookEventName:S.Literal("ElicitationResult"),action:S.Optional(y(["accept","decline","cancel"])),content:S.Optional(QO)}),wO=S.Object({hookEventName:S.Literal("UserPromptSubmit"),updatedPrompt:S.Optional(S.String()),contextInjection:S.Optional(S.String())}),CO=S.Object({hookEventName:S.Literal("SessionStart"),env:S.Optional(S.Record(S.String(),S.String()))}),EO=S.Object({hookEventName:S.Literal("Compaction"),blockCompaction:S.Optional(S.Boolean()),blockReason:S.Optional(S.String())}),jO=S.Object({decision:S.Optional(S.Object({behavior:S.Enum(v)})),systemMessage:S.Optional(S.String()),hookSpecificOutput:S.Optional(S.Union([UO,_O,KO,bO,NO,MO,TO,wO,CO,EO])),suppressOutput:S.Optional(S.Boolean())});function ZO(O){return qO(jO,O)}class p{parse(O,q,Q){if(O.timedOut){let Y=Q?.timeoutBehavior||"ignore",$="Hook timeout";if(Y==="deny")return{success:!1,blocking:!0,error:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:q};else if(Y==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:"Hook timeout. Continue?",stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:q};else return{success:!1,blocking:!1,warning:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:q}}let Z=this.tryParseJSON(O.stdout);if(Z){let Y=ZO(Z);if(!Y.success){let X="error"in Y?Y.error.message:"Unknown validation error",W=Q?.failureBehavior||"ignore",J=`Invalid hook output JSON: ${X}`;if(W==="deny")return{success:!1,blocking:!0,error:J,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:q};else if(W==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:`${J}. Continue?`,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:q};else return{success:!1,blocking:!1,warning:J,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:q}}let $=Y.data;if($.decision?.behavior==="block")return{success:!1,blocking:!0,error:$.systemMessage||"Hook blocked execution",output:$,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:q};if($.decision?.behavior==="async")return{success:!0,output:$,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:q};return{success:!0,output:$,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:q}}return this.parseByExitCode(O,q,Q)}parseByExitCode(O,q,Q){let Z=O.exitCode;switch(Z){case 0:return{success:!0,stdout:O.stdout,stderr:O.stderr,exitCode:Z,hook:q};case 2:return{success:!1,blocking:!0,error:O.stderr||O.stdout||"Hook returned exit code 2",stdout:O.stdout,stderr:O.stderr,exitCode:Z,hook:q};case 124:{let Y=Q?.timeoutBehavior||"ignore",$="Hook timeout";if(Y==="deny")return{success:!1,blocking:!0,error:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:Z,hook:q};else if(Y==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:"Hook timeout. Continue?",stdout:O.stdout,stderr:O.stderr,exitCode:Z,hook:q};else return{success:!1,blocking:!1,warning:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:Z,hook:q}}default:{let Y=Q?.failureBehavior||"ignore",$=O.stderr||O.stdout||`Hook failed with exit code ${Z}`;if(Y==="deny")return{success:!1,blocking:!0,error:$,stdout:O.stdout,stderr:O.stderr,exitCode:Z,hook:q};else if(Y==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:`${$}. Continue?`,stdout:O.stdout,stderr:O.stderr,exitCode:Z,hook:q};else return{success:!1,blocking:!1,warning:$,stdout:O.stdout,stderr:O.stderr,exitCode:Z,hook:q}}}}tryParseJSON(O){try{let q=O.trim();if(!q)return null;let Q=q.match(/^\s*(\{[\s\S]*\})\s*$/);if(!Q)return null;return JSON.parse(Q[1])}catch{return null}}}class u{content="";maxSize;constructor(O){this.maxSize=O}append(O){if(this.content.length<this.maxSize){let q=this.maxSize-this.content.length;this.content+=O.substring(0,q)}}getContent(){return this.content}isFull(){return this.content.length>=this.maxSize}}class l{MAX_STDOUT_SIZE=1048576;MAX_STDERR_SIZE=1048576;MAX_INPUT_SIZE=102400;async execute(O,q,Q,Z){let Y=JSON.stringify(q);if(Y.length>this.MAX_INPUT_SIZE)throw Error(`Hook input too large: ${Y.length} bytes (max ${this.MAX_INPUT_SIZE})`);let $=this.createSafeEnv(q,Q.environment),{child:X,processTree:W}=YO(O,[],{shell:!0,env:$,cwd:Q.projectDir}),J=new u(this.MAX_STDOUT_SIZE),G=new u(this.MAX_STDERR_SIZE);X.stdout?.setEncoding("utf8"),X.stderr?.setEncoding("utf8"),X.stdout?.on("data",(L)=>{J.append(L)}),X.stderr?.on("data",(L)=>{G.append(L)});try{X.stdin?.write(Y),X.stdin?.end()}catch(L){throw await W.terminate(),Error(`Failed to write hook input: ${L}`)}return new Promise((L,F)=>{let z=!1,V=!1,B,U=()=>{return B??=W.terminate(),B},K=null,H=()=>{if(K&&Q.abortSignal)Q.abortSignal.removeEventListener("abort",K),K=null},I=setTimeout(()=>{z=!0,U()},Z);if(X.on("close",async(f)=>{if(V)return;if(V=!0,clearTimeout(I),H(),z)await U();L({stdout:J.getContent(),stderr:G.getContent(),exitCode:z?124:f??1,timedOut:z})}),X.on("error",(f)=>{if(V)return;V=!0,clearTimeout(I),H(),F(f)}),Q.abortSignal){if(K=()=>{if(V)return;V=!0,clearTimeout(I),H(),U().then(()=>{L({stdout:J.getContent(),stderr:"Hook cancelled by abort signal",exitCode:1,timedOut:!1})})},Q.abortSignal.addEventListener("abort",K),Q.abortSignal.aborted)K()}})}createSafeEnv(O,q={}){return{...q,PATH:q.PATH??process.env.PATH??"",HOME:q.HOME??process.env.HOME??"",USER:q.USER??process.env.USER??"",SHELL:q.SHELL??process.env.SHELL??"/bin/sh",BLADE_PROJECT_DIR:O.project_dir,BLADE_SESSION_ID:O.session_id,BLADE_HOOK_EVENT:O.hook_event_name,BLADE_TOOL_NAME:"tool_name"in O?O.tool_name:"",BLADE_TOOL_USE_ID:"tool_use_id"in O?O.tool_use_id:""}}}var $O=XO("Execution"),yO={PreToolUse:'{ "permissionDecision": "approve" | "deny" | "ask", "permissionDecisionReason": "...", "updatedInput": { ... } }',PostToolUse:'{ "additionalContext": "注入到工具结果的额外信息", "updatedOutput": "修改后的工具输出" }',Stop:'{ "continue": true, "continueReason": "继续执行的原因" } // continue: true 表示阻止停止',SubagentStop:'{ "continue": true, "continueReason": "...", "additionalContext": "..." }',PermissionRequest:'{ "permissionDecision": "approve" | "deny" | "ask", "permissionDecisionReason": "..." }',Elicitation:'{ "action": "accept" | "decline" | "cancel", "content": { "field": "value" } }',ElicitationResult:'{ "action": "accept" | "decline" | "cancel", "content": { "field": "value" } }',UserPromptSubmit:'{ "updatedPrompt": "修改后的提示词", "contextInjection": "注入的上下文" }',Compaction:'{ "blockCompaction": true, "blockReason": "阻止压缩的原因" }'};class x{processExecutor=new l;outputParser=new p;chatServiceCache=new Map;sessionModelResources=new Map;sessionEnvironments=new Map;trustWarnings=new Set;bindSessionModelResources(O,q,Q){for(let Z of q)this.sessionModelResources.set(this.sessionResourceKey(O,Z),Q),this.sessionEnvironments.set(this.sessionResourceKey(O,Z),Q.config.env)}bindSessionEnvironment(O,q,Q){for(let Z of q)this.sessionEnvironments.set(this.sessionResourceKey(O,Z),Q)}async unbindSessionModelResources(O,q){for(let Q of q){let Z=this.sessionResourceKey(O,Q);this.sessionModelResources.delete(Z),this.sessionEnvironments.delete(Z);let Y=`${Z}\x00`;for(let[$,X]of this.chatServiceCache){if(!$.startsWith(Y))continue;this.chatServiceCache.delete($),await X.dispose?.()}}}async executePreToolHooks(O,q,Q){if(O.length===0)return{decision:"allow"};let Z="tool_input"in q?q.tool_input:{},Y=[];for(let $ of O)try{let X={...q,...Z&&{tool_input:Z}},W=await this.executeHook($,X,Q);if(!W.success){if(W.blocking)return{decision:"deny",reason:W.error};if(W.needsConfirmation)return{decision:"ask",reason:W.warning||W.error};if(W.warning)Y.push(W.warning);continue}let J=W.output?.hookSpecificOutput;if(J&&"permissionDecision"in J){switch(J.permissionDecision){case"deny":return{decision:"deny",reason:J.permissionDecisionReason};case"ask":return{decision:"ask",reason:J.permissionDecisionReason};case"allow":break}if("updatedInput"in J&&J.updatedInput)Z={...Z,...J.updatedInput}}}catch(X){let W=X instanceof Error?X.message:String(X);if(Y.push(`Hook failed: ${W}`),Q.config.failureBehavior==="deny")return{decision:"deny",reason:W};else if(Q.config.failureBehavior==="ask")return{decision:"ask",reason:`Hook failed: ${W}. Continue?`}}return{decision:"allow",modifiedInput:Z,warning:Y.length>0?Y.join(`
3
3
  `):void 0}}async executePostToolHooks(O,q,Q){if(O.length===0)return{};let Z=Q.config.maxConcurrentHooks||5,Y=await this.executeHooksConcurrently(O,q,Q,Z),$=[],X=void 0,W=[];for(let J of Y){if(!J.success&&J.warning){W.push(J.warning);continue}let G=J.output?.hookSpecificOutput;if(G&&"additionalContext"in G){if(G.additionalContext)$.push(G.additionalContext);if("updatedOutput"in G&&G.updatedOutput!==void 0)X=G.updatedOutput}}return{additionalContext:$.length>0?$.join(`
4
4
 
@@ -25,7 +25,7 @@ import{df as YO}from"./chunk-m57w4p91.js";import{kg as qO,mg as S,pg as y}from".
25
25
  `):void 0}}async executeNotificationHooks(O,q,Q){let Z="message"in q?q.message:"";if(O.length===0)return{suppress:!1,message:Z};let Y=[],$=!1,X=Z;for(let W of O)try{let J=await this.executeHook(W,q,Q);if(!J.success){if(J.warning)Y.push(J.warning);continue}if(J.output?.suppressOutput){$=!0;break}if(J.stdout&&J.stdout.trim())X=J.stdout.trim()}catch(J){let G=J instanceof Error?J.message:String(J);Y.push(`Hook failed: ${G}`)}return{suppress:$,message:X,warning:Y.length>0?Y.join(`
26
26
  `):void 0}}async executeCompactionHooks(O,q,Q){if(O.length===0)return{blockCompaction:!1};let Z=[];for(let Y of O)try{let $=await this.executeHook(Y,q,Q);if(!$.success){if($.warning)Z.push($.warning);continue}let X=$.output?.hookSpecificOutput;if(X&&"blockCompaction"in X&&X.blockCompaction)return{blockCompaction:!0,blockReason:X.blockReason,warning:Z.length>0?Z.join(`
27
27
  `):void 0}}catch($){let X=$ instanceof Error?$.message:String($);Z.push(`Hook failed: ${X}`)}return{blockCompaction:!1,warning:Z.length>0?Z.join(`
28
- `):void 0}}async executeHook(O,q,Q){if(O.type!=="function"){let Y=await A.getInstance().getStatus(Q.projectDir,Q.config);if(Y.state!=="trusted"){let $=`${Y.trustRoot}:${Y.currentDigest}:${Y.state}`;if(!this.trustWarnings.has($)){if(this.trustWarnings.size>=512)this.trustWarnings.clear();this.trustWarnings.add($),$O.warn(`[HookTrust] Skipping configured hooks for ${Y.trustRoot}: ${Y.state}`)}return{success:!0,hook:O,warning:`Hook skipped: project hook trust is ${Y.state}`}}}let Z=this.withHookEnvironment(Q,O);if(O.type==="command")return this.executeCommandHook(O,q,Z);if(O.type==="prompt")return this.executePromptHook(O,q,Z);if(O.type==="function")return this.executeFunctionHook(O,q,Z);if(O.type==="http")return this.executeHttpHook(O,q,Z);throw Error(`Hook type ${O.type} not supported`)}async executeCommandHook(O,q,Q){let Z=(O.timeout??Q.config.defaultTimeout??60)*1000;try{let Y=await this.processExecutor.execute(O.command,q,Q,Z);return this.outputParser.parse(Y,O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior})}catch(Y){return{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}async executePromptHook(O,q,Q){let Z=(O.timeout??Q.config.defaultTimeout??60)*1000;try{let Y=await this.getOrCreateChatService(O.model,Q),$="hook_event_name"in q?String(q.hook_event_name):"Unknown",X=this.buildPromptHookSystemMessage(O,$),W=JSON.stringify(q,null,2),J=new AbortController,G=setTimeout(()=>J.abort(),Z),L;try{L=(await Y.chat([{role:"system",content:X},{role:"user",content:W}],void 0,J.signal,{providerAdmission:{sessionId:Q.sessionId,ownerId:Q.sessionId,requestClass:"background"}})).content}catch(z){if(J.signal.aborted||z instanceof Error&&z.name==="AbortError")return this.outputParser.parse({stdout:"",stderr:"",exitCode:0,timedOut:!0},O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior});throw z}finally{clearTimeout(G)}let F=this.extractJsonFromLLMResponse(L);return this.outputParser.parse({stdout:F,stderr:"",exitCode:0,timedOut:!1},O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior})}catch(Y){return $O.warn(`[PromptHook] 执行失败: ${Y instanceof Error?Y.message:String(Y)}`),{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}async executeFunctionHook(O,q,Q){let Z=(O.timeout??10)*1000;try{let Y=await this.runFunctionWithTimeout(O.handler,q,Q,Z);if(Y===void 0||Y===null)return{success:!0,hook:O};let $={stdout:JSON.stringify(Y),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse($,O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior})}catch(Y){if(Y.isTimeout){let $={stdout:"",stderr:`Function hook timeout after ${Z}ms`,exitCode:124,timedOut:!0};return this.outputParser.parse($,O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior})}return{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}runFunctionWithTimeout(O,q,Q,Z){return new Promise((Y,$)=>{let X=!1,W=setTimeout(()=>{if(X)return;X=!0;let G=Object.assign(Error(`Function hook timed out after ${Z}ms`),{isTimeout:!0});$(G)},Z),J=()=>{if(X)return;X=!0,clearTimeout(W),$(Error("Function hook aborted"))};Q.abortSignal?.addEventListener("abort",J,{once:!0}),Promise.resolve().then(()=>O(q,Q)).then((G)=>{if(X)return;X=!0,clearTimeout(W),Q.abortSignal?.removeEventListener("abort",J),Y(G)},(G)=>{if(X)return;X=!0,clearTimeout(W),Q.abortSignal?.removeEventListener("abort",J),$(G)})})}async executeHttpHook(O,q,Q){let Z=(O.timeout??10)*1000,Y=O.maxResponseBytes??262144,$=Math.max(1,(O.retries??0)+1);try{e(O.url,Q.config.httpPolicy)}catch(G){return{success:!1,blocking:!0,error:G instanceof Error?G.message:String(G),hook:O}}let X={"Content-Type":"application/json",...OO(O.headers)},W=JSON.stringify(q),J;for(let G=0;G<$;G++){if(G>0){let V=Math.min(2**G*200,5000);await new Promise((B)=>setTimeout(B,V))}let L=new AbortController,F=setTimeout(()=>L.abort(),Z),z=()=>L.abort();Q.abortSignal?.addEventListener("abort",z,{once:!0});try{let V=await fetch(O.url,{method:"POST",headers:X,body:W,redirect:"manual",signal:L.signal});if(V.status>=300&&V.status<400){J=Error(`HTTP hook received redirect (${V.status}); redirects are disabled`);continue}if(!V.ok){if(J=Error(`HTTP hook returned ${V.status} ${V.statusText}`),V.status>=400&&V.status<500)break;continue}let U={stdout:await HO(V,Y),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse(U,O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior})}catch(V){let B=V.name==="AbortError"||V.code==="ABORT_ERR";if(B&&Q.abortSignal?.aborted){J=Error("HTTP hook aborted by caller");break}if(B){let U={stdout:"",stderr:`HTTP hook timeout after ${Z}ms`,exitCode:124,timedOut:!0};if(G===$-1)return this.outputParser.parse(U,O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior});J=Error(`HTTP hook timeout attempt ${G+1}`);continue}J=V}finally{clearTimeout(F),Q.abortSignal?.removeEventListener("abort",z)}}return{success:!1,blocking:!1,error:J?.message??"HTTP hook failed",hook:O}}async getOrCreateChatService(O,q){let Q=this.sessionResourceKey(q.sessionId,q.projectDir),Z=`${Q}\x00${O||"__default__"}`,Y=this.chatServiceCache.get(Z);if(Y)return Y;let{ensureStoreInitialized:$,getConfig:X}=await import("./chunk-xdz5zrjt.js"),{createChatServiceAsync:W}=await import("./chunk-wneeq8cr.js"),{resolveModelConfig:J}=await import("./chunk-xzz69esf.js"),{resolveWorkspaceModelResources:G}=await import("./chunk-3as0bkqy.js");await $();let L=X();if(!L)throw Error("PromptHook: 配置未初始化");let F=this.sessionModelResources.get(Q)??await G(q.projectDir,L),z=O?F.config.models.find((B)=>B.id===O):F.config.models.find((B)=>B.id===F.config.currentModelId)??F.config.models[0];if(!z)throw Error("PromptHook: 无法获取模型配置。请确保至少配置了一个模型。");let V=await W(J(z,F.config,"off",F.catalog).chat);return this.chatServiceCache.set(Z,V),V}sessionResourceKey(O,q){return`${O}\x00${DO.resolve(q)}`}withSessionEnvironment(O){let q=this.sessionEnvironments.get(this.sessionResourceKey(O.sessionId,O.projectDir));return q?{...O,environment:q}:O}withHookEnvironment(O,q){let Q=this.withSessionEnvironment(O);if(!q.source)return Q;return{...Q,environment:{...Q.environment,BLADE_PLUGIN_ROOT:q.source.pluginRoot,CLAUDE_PLUGIN_ROOT:q.source.pluginRoot,BLADE_PLUGIN_NAME:q.source.pluginName}}}buildPromptHookSystemMessage(O,q){let Q=yO[q]||"{ ... 根据事件类型返回相应字段 }";return`你是一个代码质量评估器,作为 Hook 在 ${q} 事件中被触发。
28
+ `):void 0}}async executeHook(O,q,Q){if(O.type!=="function"){let Y=await A.getInstance().getStatus(Q.projectDir,Q.config);if(Y.state!=="trusted"){let $=`${Y.trustRoot}:${Y.currentDigest}:${Y.state}`;if(!this.trustWarnings.has($)){if(this.trustWarnings.size>=512)this.trustWarnings.clear();this.trustWarnings.add($),$O.warn(`[HookTrust] Skipping configured hooks for ${Y.trustRoot}: ${Y.state}`)}return{success:!0,hook:O,warning:`Hook skipped: project hook trust is ${Y.state}`}}}let Z=this.withHookEnvironment(Q,O);if(O.type==="command")return this.executeCommandHook(O,q,Z);if(O.type==="prompt")return this.executePromptHook(O,q,Z);if(O.type==="function")return this.executeFunctionHook(O,q,Z);if(O.type==="http")return this.executeHttpHook(O,q,Z);throw Error(`Hook type ${O.type} not supported`)}async executeCommandHook(O,q,Q){let Z=(O.timeout??Q.config.defaultTimeout??60)*1000;try{let Y=await this.processExecutor.execute(O.command,q,Q,Z);return this.outputParser.parse(Y,O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior})}catch(Y){return{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}async executePromptHook(O,q,Q){let Z=(O.timeout??Q.config.defaultTimeout??60)*1000;try{let Y=await this.getOrCreateChatService(O.model,Q),$="hook_event_name"in q?String(q.hook_event_name):"Unknown",X=this.buildPromptHookSystemMessage(O,$),W=JSON.stringify(q,null,2),J=new AbortController,G=setTimeout(()=>J.abort(),Z),L;try{L=(await Y.chat([{role:"system",content:X},{role:"user",content:W}],void 0,J.signal,{providerAdmission:{sessionId:Q.sessionId,ownerId:Q.sessionId,requestClass:"background"}})).content}catch(z){if(J.signal.aborted||z instanceof Error&&z.name==="AbortError")return this.outputParser.parse({stdout:"",stderr:"",exitCode:0,timedOut:!0},O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior});throw z}finally{clearTimeout(G)}let F=this.extractJsonFromLLMResponse(L);return this.outputParser.parse({stdout:F,stderr:"",exitCode:0,timedOut:!1},O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior})}catch(Y){return $O.warn(`[PromptHook] 执行失败: ${Y instanceof Error?Y.message:String(Y)}`),{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}async executeFunctionHook(O,q,Q){let Z=(O.timeout??10)*1000;try{let Y=await this.runFunctionWithTimeout(O.handler,q,Q,Z);if(Y===void 0||Y===null)return{success:!0,hook:O};let $={stdout:JSON.stringify(Y),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse($,O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior})}catch(Y){if(Y.isTimeout){let $={stdout:"",stderr:`Function hook timeout after ${Z}ms`,exitCode:124,timedOut:!0};return this.outputParser.parse($,O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior})}return{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}runFunctionWithTimeout(O,q,Q,Z){return new Promise((Y,$)=>{let X=!1,W=setTimeout(()=>{if(X)return;X=!0;let G=Object.assign(Error(`Function hook timed out after ${Z}ms`),{isTimeout:!0});$(G)},Z),J=()=>{if(X)return;X=!0,clearTimeout(W),$(Error("Function hook aborted"))};Q.abortSignal?.addEventListener("abort",J,{once:!0}),Promise.resolve().then(()=>O(q,Q)).then((G)=>{if(X)return;X=!0,clearTimeout(W),Q.abortSignal?.removeEventListener("abort",J),Y(G)},(G)=>{if(X)return;X=!0,clearTimeout(W),Q.abortSignal?.removeEventListener("abort",J),$(G)})})}async executeHttpHook(O,q,Q){let Z=(O.timeout??10)*1000,Y=O.maxResponseBytes??262144,$=Math.max(1,(O.retries??0)+1);try{e(O.url,Q.config.httpPolicy)}catch(G){return{success:!1,blocking:!0,error:G instanceof Error?G.message:String(G),hook:O}}let X={"Content-Type":"application/json",...OO(O.headers)},W=JSON.stringify(q),J;for(let G=0;G<$;G++){if(G>0){let V=Math.min(2**G*200,5000);await new Promise((B)=>setTimeout(B,V))}let L=new AbortController,F=setTimeout(()=>L.abort(),Z),z=()=>L.abort();Q.abortSignal?.addEventListener("abort",z,{once:!0});try{let V=await fetch(O.url,{method:"POST",headers:X,body:W,redirect:"manual",signal:L.signal});if(V.status>=300&&V.status<400){J=Error(`HTTP hook received redirect (${V.status}); redirects are disabled`);continue}if(!V.ok){if(J=Error(`HTTP hook returned ${V.status} ${V.statusText}`),V.status>=400&&V.status<500)break;continue}let U={stdout:await HO(V,Y),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse(U,O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior})}catch(V){let B=V.name==="AbortError"||V.code==="ABORT_ERR";if(B&&Q.abortSignal?.aborted){J=Error("HTTP hook aborted by caller");break}if(B){let U={stdout:"",stderr:`HTTP hook timeout after ${Z}ms`,exitCode:124,timedOut:!0};if(G===$-1)return this.outputParser.parse(U,O,{timeoutBehavior:Q.config.timeoutBehavior,failureBehavior:Q.config.failureBehavior});J=Error(`HTTP hook timeout attempt ${G+1}`);continue}J=V}finally{clearTimeout(F),Q.abortSignal?.removeEventListener("abort",z)}}return{success:!1,blocking:!1,error:J?.message??"HTTP hook failed",hook:O}}async getOrCreateChatService(O,q){let Q=this.sessionResourceKey(q.sessionId,q.projectDir),Z=`${Q}\x00${O||"__default__"}`,Y=this.chatServiceCache.get(Z);if(Y)return Y;let{ensureStoreInitialized:$,getConfig:X}=await import("./chunk-emqbb5xh.js"),{createChatServiceAsync:W}=await import("./chunk-ph5rn44j.js"),{resolveModelConfig:J}=await import("./chunk-8geywf8q.js"),{resolveWorkspaceModelResources:G}=await import("./chunk-zqxj65xc.js");await $();let L=X();if(!L)throw Error("PromptHook: 配置未初始化");let F=this.sessionModelResources.get(Q)??await G(q.projectDir,L),z=O?F.config.models.find((B)=>B.id===O):F.config.models.find((B)=>B.id===F.config.currentModelId)??F.config.models[0];if(!z)throw Error("PromptHook: 无法获取模型配置。请确保至少配置了一个模型。");let V=await W(J(z,F.config,"off",F.catalog).chat);return this.chatServiceCache.set(Z,V),V}sessionResourceKey(O,q){return`${O}\x00${DO.resolve(q)}`}withSessionEnvironment(O){let q=this.sessionEnvironments.get(this.sessionResourceKey(O.sessionId,O.projectDir));return q?{...O,environment:q}:O}withHookEnvironment(O,q){let Q=this.withSessionEnvironment(O);if(!q.source)return Q;return{...Q,environment:{...Q.environment,BLADE_PLUGIN_ROOT:q.source.pluginRoot,CLAUDE_PLUGIN_ROOT:q.source.pluginRoot,BLADE_PLUGIN_NAME:q.source.pluginName}}}buildPromptHookSystemMessage(O,q){let Q=yO[q]||"{ ... 根据事件类型返回相应字段 }";return`你是一个代码质量评估器,作为 Hook 在 ${q} 事件中被触发。
29
29
 
30
30
  `+`## 评估指令
31
31
  ${O.prompt}
@@ -42,4 +42,4 @@ ${O.prompt}
42
42
  `+`- 只输出 JSON,不要包含 markdown 代码块或其他文本
43
43
  `+`- 如果没有发现问题,使用 "approve"
44
44
  `+'- 只在发现严重问题时使用 "block"'}extractJsonFromLLMResponse(O){let q=O.trim(),Q=q.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/);if(Q)return Q[1].trim();return q}async executeHooksConcurrently(O,q,Q,Z){let Y=[],$=new Set;for(let X of O){if($.size>=Z)await Promise.race($);let W=this.executeHook(X,q,Q).catch((G)=>({success:!1,blocking:!1,error:G instanceof Error?G.message:String(G),hook:X})),J=W.then(()=>{$.delete(J)}).catch(()=>{$.delete(J)});$.add(J),Y.push(W)}return Promise.all(Y)}}async function HO(O,q){let Q=O.body?.getReader();if(!Q)return"";let Z=new TextDecoder,Y=0,$="";while(!0){let{value:X,done:W}=await Q.read();if(W)break;if(Y+=X.byteLength,Y>q){try{Q.cancel()}catch{}$+=Z.decode(X.slice(0,q-(Y-X.byteLength)));break}$+=Z.decode(X,{stream:!0})}return $+=Z.decode(),$}import a from"picomatch";var IO=/^([A-Za-z0-9_|]+)\((.+)\)$/;class i{matches(O,q){if(!O)return!0;if(O.tools&&q.toolName){if(!this.matchTools(O.tools,q))return!1}if(O.paths){let Q=q.filePaths??(q.filePath?[q.filePath]:[]);if(Q.length===0||!Q.some((Z)=>this.matchPaths(O.paths,Z)))return!1}if(O.commands&&q.command){if(!this.matchCommands(O.commands,q.command))return!1}return!0}matchTools(O,q){if(Array.isArray(O))return O.some((Q)=>this.matchToolWithParams(Q,q));return this.matchToolWithParams(O,q)}matchPaths(O,q){if(Array.isArray(O))return O.some((Z)=>{return a(Z)(q)});return a(O)(q)}matchCommands(O,q){if(Array.isArray(O))return O.some((Q)=>this.matchPattern(q,Q));return this.matchPattern(q,O)}matchToolWithParams(O,q){let{toolName:Q,command:Z,filePath:Y}=q,$=IO.exec(O);if(!$)return this.matchPattern(Q,O);let[,X,W]=$;if(!this.matchPattern(Q,X))return!1;let J=this.getArgValues(Q,Z,q.filePaths??(Y?[Y]:[]));if(J.length===0)return!1;return J.some((G)=>this.matchGlobOrPattern(G,W))}getArgValues(O,q,Q=[]){if(O==="Bash"||O==="BashTool")return q?[q]:[];if(["Read","Edit","Write","ApplyPatch","Glob","Grep"].includes(O))return Q;return q?[q]:Q}matchGlobOrPattern(O,q){if(/[*?[\]{}!]/.test(q))try{return a(q,{bash:!0,dot:!0})(O)}catch{}if(q.endsWith("*")){let Q=q.slice(0,-1);return O.startsWith(Q)}return O===q}matchPattern(O,q){if(q==="*")return!0;if(!q.includes("|")&&!/[.*+?^${}()|[\]\\]/.test(q))return O===q;if(q.includes("|"))return q.split("|").map((Z)=>Z.trim()).includes(O);try{return new RegExp(q).test(O)}catch{return O===q}}}var WO=64;class _{static instance=null;config=N;executor=new x;guard=new d;matcher=new i;processDisabled=!1;disabledSessions=new Set;sessionStateAliases=new Map;projectConfigs=new fO({max:WO});sessionConfigs=new Map;managedFunctionMatchers={};constructor(){}static getInstance(){if(!_.instance)_.instance=new _;return _.instance}bindSessionModelResources(O,q,Q){this.executor.bindSessionModelResources(O,q,Q)}bindSessionEnvironment(O,q,Q){this.executor.bindSessionEnvironment(O,q,Q)}bindSessionConfig(O,q,Q){let Z=this.sessionConfigKey(O,q[0]??P()),Y=this.disabledSessions.has(Z);for(let $ of q){let X=this.sessionConfigKey(O,$);if(Y||=this.disabledSessions.has(X),this.sessionStateAliases.set(X,Z),this.sessionConfigs.set(X,this.snapshotConfig(Q)),X!==Z)this.disabledSessions.delete(X)}if(Y)this.disabledSessions.add(Z)}async unbindSessionModelResources(O,q){let Q=`${O}\x00`;for(let Z of this.sessionConfigs.keys()){if(!Z.startsWith(Q))continue;this.sessionConfigs.delete(Z)}for(let Z of this.sessionStateAliases.keys()){if(!Z.startsWith(Q))continue;this.sessionStateAliases.delete(Z)}for(let Z of this.disabledSessions){if(!Z.startsWith(Q))continue;this.disabledSessions.delete(Z)}await this.executor.unbindSessionModelResources(O,q)}static resetInstance(){_.instance?.cleanup(),_.instance=null}loadConfig(O,q=P()){let Q=E(N,O),Z=c();Q=E(Q,Z),this.storeProjectConfig(q,Q)}isEnabled(O=P(),q){if(!(q?this.getExecutionConfig(q,O):this.getConfig(O)).enabled)return!1;if(this.processDisabled)return!1;if(q&&this.disabledSessions.has(this.sessionStateKey(q,O)))return!1;return!0}disable(){this.processDisabled=!0,console.log("[HookManager] Hooks disabled for this process")}enable(){this.processDisabled=!1,console.log("[HookManager] Hooks enabled for this process")}disableSession(O,q){this.disabledSessions.add(this.sessionStateKey(O,q))}enableSession(O,q){this.disabledSessions.delete(this.sessionStateKey(O,q))}isSessionEnabled(O,q){return this.isEnabled(q,O)}isSessionPaused(O,q){return this.disabledSessions.has(this.sessionStateKey(O,q))}getConfig(O=P()){let q=C.resolve(O),Q=this.projectConfigs.get(q);if(Q)return Q;if(q===C.resolve(P()))return this.config;return{...N,enabled:!1}}getExecutionConfig(O,q){return this.sessionConfigs.get(this.sessionConfigKey(O,q))??this.getConfig(q)}isExecutionEnabled(O,q,Q){return O.enabled===!0&&!this.processDisabled&&!this.disabledSessions.has(this.sessionStateKey(q,Q))}sessionStateKey(O,q){let Q=this.sessionConfigKey(O,q);return this.sessionStateAliases.get(Q)??Q}sessionConfigKey(O,q){return`${O}\x00${C.resolve(q)}`}snapshotConfig(O){let q=E(N,O);for(let Q of Object.values(b))q[Q]=(O[Q]??[]).map((Z)=>({...Z,matcher:Z.matcher?{...Z.matcher}:void 0,hooks:Z.hooks.map((Y)=>({...Y}))}));return q}storeProjectConfig(O,q){let Q=C.resolve(O);if(Q===C.resolve(P())){this.config=q,this.projectConfigs.delete(Q);return}this.projectConfigs.set(Q,q)}inheritProjectConfig(O,q,Q){let Z=Q?this.getExecutionConfig(Q,O):this.getConfig(O);if(this.storeProjectConfig(q,this.snapshotConfig(Z)),!Q)return;let Y=this.sessionConfigKey(Q,O),$=this.sessionConfigKey(Q,q),X=this.sessionStateAliases.get(Y)??Y,W=this.disabledSessions.has(X)||this.disabledSessions.has($);if(this.sessionConfigs.set($,this.snapshotConfig(Z)),this.sessionStateAliases.set($,X),$!==X)this.disabledSessions.delete($);if(W)this.disabledSessions.add(X)}getResidencyStats(){return{projectCapacity:WO,projectConfigs:this.projectConfigs.size,sessionConfigs:this.sessionConfigs.size,sessionAliases:this.sessionStateAliases.size}}getTrustStatus(O=P()){return A.getInstance().getStatus(O,this.getConfig(O))}trustProject(O=P(),q){return A.getInstance().trust(O,this.getConfig(O),q)}revokeProjectTrust(O=P()){return A.getInstance().revoke(O,this.getConfig(O))}registerFunction(O,q,Q,Z){let Y={type:"function",handler:Q,timeout:Z?.timeout},$={name:Z?.name??`inline-${O}-${Date.now()}`,matcher:q,hooks:[Y]};if(Z?.projectDir){let W=C.resolve(Z.projectDir),J=this.getConfig(W),G=J[O]??[];return J[O]=[...G,$],this.storeProjectConfig(W,J),()=>{let L=J[O];if(!L)return;J[O]=L.filter((F)=>F!==$)}}let X=this.managedFunctionMatchers[O]??[];return this.managedFunctionMatchers[O]=[...X,$],()=>{let W=this.managedFunctionMatchers[O]??[];this.managedFunctionMatchers[O]=W.filter((J)=>J!==$)}}async reloadConfig(O=P()){let q=await import("node:fs/promises"),Q=await import("node:path");try{let Z=Q.join(O,".blade","settings.local.json"),Y=await q.readFile(Z,"utf-8"),$=JSON.parse(Y);if($.hooks)this.loadConfig($.hooks,O)}catch{}}async executePreToolHooks(O,q,Q,Z){let Y=this.getExecutionConfig(Z.sessionId,Z.projectDir);if(!this.isExecutionEnabled(Y,Z.sessionId,Z.projectDir))return{decision:"allow"};if(Z.permissionMode==="plan")return{decision:"allow"};if(!this.guard.canExecute(q,"PreToolUse"))return{decision:"allow"};let $={hook_event_name:"PreToolUse",hook_execution_id:R(),timestamp:new Date().toISOString(),tool_name:O,tool_use_id:q,tool_input:Q,project_dir:Z.projectDir,session_id:Z.sessionId,permission_mode:Z.permissionMode},X=this.getMatchingHooks("PreToolUse",{toolName:O,filePath:this.extractFilePaths(Q)[0],filePaths:this.extractFilePaths(Q),command:this.extractCommand(O,Q)},Y);if(X.length===0)return{decision:"allow"};let W={projectDir:Z.projectDir,sessionId:Z.sessionId,permissionMode:Z.permissionMode,config:Y,abortSignal:Z.abortSignal};try{let J=await this.executor.executePreToolHooks(X,$,W);if(this.guard.markExecuted(q,"PreToolUse"),Z.permissionMode==="yolo"){if(J.decision==="deny")return J;return{decision:"allow",modifiedInput:J.modifiedInput,warning:J.warning,reason:J.reason}}return J}catch(J){return console.error("[HookManager] Error executing PreToolUse hooks:",J),{decision:"allow",warning:`Hook execution failed: ${J instanceof Error?J.message:String(J)}`}}}async executePostToolHooks(O,q,Q,Z,Y){let $=this.getExecutionConfig(Y.sessionId,Y.projectDir);if(!this.isExecutionEnabled($,Y.sessionId,Y.projectDir))return{};if(Y.permissionMode==="plan")return{};if(!this.guard.canExecute(q,"PostToolUse"))return{};let X={hook_event_name:"PostToolUse",hook_execution_id:R(),timestamp:new Date().toISOString(),tool_name:O,tool_use_id:q,tool_input:Q,tool_response:Z,project_dir:Y.projectDir,session_id:Y.sessionId,permission_mode:Y.permissionMode},W=this.getMatchingHooks("PostToolUse",{toolName:O,filePath:this.extractFilePaths(Q)[0],filePaths:this.extractFilePaths(Q),command:this.extractCommand(O,Q)},$);if(W.length===0)return{};let J={projectDir:Y.projectDir,sessionId:Y.sessionId,permissionMode:Y.permissionMode,config:$,abortSignal:Y.abortSignal};try{let G=await this.executor.executePostToolHooks(W,X,J);return this.guard.markExecuted(q,"PostToolUse"),G}catch(G){return console.error("[HookManager] Error executing PostToolUse hooks:",G),{warning:`Hook execution failed: ${G instanceof Error?G.message:String(G)}`}}finally{this.guard.cleanup(q)}}async executeStopHooks(O){let q=this.getExecutionConfig(O.sessionId,O.projectDir);if(!this.isExecutionEnabled(q,O.sessionId,O.projectDir))return{shouldStop:!0};let Q={hook_event_name:"Stop",hook_execution_id:R(),timestamp:new Date().toISOString(),project_dir:O.projectDir,session_id:O.sessionId,permission_mode:O.permissionMode,reason:O.reason},Z=this.getMatchingHooks("Stop",{},q);if(Z.length===0)return{shouldStop:!0};let Y={projectDir:O.projectDir,sessionId:O.sessionId,permissionMode:O.permissionMode,config:q,abortSignal:O.abortSignal};try{return await this.executor.executeStopHooks(Z,Q,Y)}catch($){return console.error("[HookManager] Error executing Stop hooks:",$),{shouldStop:!0,warning:`Hook execution failed: ${$ instanceof Error?$.message:String($)}`}}}async executeSubagentStopHooks(O,q){let Q=this.getExecutionConfig(q.sessionId,q.projectDir);if(!this.isExecutionEnabled(Q,q.sessionId,q.projectDir))return{shouldStop:!0};let Z={hook_event_name:"SubagentStop",hook_execution_id:R(),timestamp:new Date().toISOString(),project_dir:q.projectDir,session_id:q.sessionId,permission_mode:q.permissionMode,agent_type:O,task_description:q.taskDescription,success:q.success,result_summary:q.resultSummary,error:q.error},Y=this.getMatchingHooks("SubagentStop",{},Q);if(Y.length===0)return{shouldStop:!0};let $={projectDir:q.projectDir,sessionId:q.sessionId,permissionMode:q.permissionMode,config:Q,abortSignal:q.abortSignal};try{return await this.executor.executeSubagentStopHooks(Y,Z,$)}catch(X){return console.error("[HookManager] Error executing SubagentStop hooks:",X),{shouldStop:!0,warning:`Hook execution failed: ${X instanceof Error?X.message:String(X)}`}}}async executePermissionRequestHooks(O,q,Q,Z){let Y=this.getExecutionConfig(Z.sessionId,Z.projectDir);if(!this.isExecutionEnabled(Y,Z.sessionId,Z.projectDir))return{decision:"ask"};let $={hook_event_name:"PermissionRequest",hook_execution_id:R(),timestamp:new Date().toISOString(),tool_name:O,tool_use_id:q,tool_input:Q,project_dir:Z.projectDir,session_id:Z.sessionId,permission_mode:Z.permissionMode},X=this.getMatchingHooks("PermissionRequest",{toolName:O,filePath:this.extractFilePaths(Q)[0],filePaths:this.extractFilePaths(Q),command:this.extractCommand(O,Q)},Y);if(X.length===0)return{decision:"ask"};let W={projectDir:Z.projectDir,sessionId:Z.sessionId,permissionMode:Z.permissionMode,config:Y,abortSignal:Z.abortSignal};try{return await this.executor.executePermissionRequestHooks(X,$,W)}catch(J){return console.error("[HookManager] Error executing PermissionRequest hooks:",J),{decision:"ask",warning:`Hook execution failed: ${J instanceof Error?J.message:String(J)}`}}}async executeUserPromptSubmitHooks(O,q){let Q=this.getExecutionConfig(q.sessionId,q.projectDir);if(!this.isExecutionEnabled(Q,q.sessionId,q.projectDir))return{proceed:!0};let Z={hook_event_name:"UserPromptSubmit",hook_execution_id:R(),timestamp:new Date().toISOString(),user_prompt:O,has_images:q.hasImages,image_count:q.imageCount,project_dir:q.projectDir,session_id:q.sessionId,permission_mode:q.permissionMode},Y=this.getMatchingHooks("UserPromptSubmit",{},Q);if(Y.length===0)return{proceed:!0};let $={projectDir:q.projectDir,sessionId:q.sessionId,permissionMode:q.permissionMode,config:Q,abortSignal:q.abortSignal};try{return await this.executor.executeUserPromptSubmitHooks(Y,Z,$)}catch(X){return console.error("[HookManager] Error executing UserPromptSubmit hooks:",X),{proceed:!0,warning:`Hook execution failed: ${X instanceof Error?X.message:String(X)}`}}}async executeSessionStartHooks(O){let q=this.getExecutionConfig(O.sessionId,O.projectDir);if(!this.isExecutionEnabled(q,O.sessionId,O.projectDir))return{proceed:!0};let Q={hook_event_name:"SessionStart",hook_execution_id:R(),timestamp:new Date().toISOString(),project_dir:O.projectDir,session_id:O.sessionId,permission_mode:O.permissionMode,is_resume:O.isResume,resume_session_id:O.resumeSessionId},Z=this.getMatchingHooks("SessionStart",{},q);if(Z.length===0)return{proceed:!0};let Y={projectDir:O.projectDir,sessionId:O.sessionId,permissionMode:O.permissionMode,config:q,abortSignal:O.abortSignal};try{return await this.executor.executeSessionStartHooks(Z,Q,Y)}catch($){return console.error("[HookManager] Error executing SessionStart hooks:",$),{proceed:!0,warning:`Hook execution failed: ${$ instanceof Error?$.message:String($)}`}}}async executeSessionEndHooks(O,q){let Q=this.getExecutionConfig(q.sessionId,q.projectDir);if(!this.isExecutionEnabled(Q,q.sessionId,q.projectDir))return{};let Z={hook_event_name:"SessionEnd",hook_execution_id:R(),timestamp:new Date().toISOString(),project_dir:q.projectDir,session_id:q.sessionId,permission_mode:q.permissionMode,reason:O},Y=this.getMatchingHooks("SessionEnd",{},Q);if(Y.length===0)return{};let $={projectDir:q.projectDir,sessionId:q.sessionId,permissionMode:q.permissionMode,config:Q,abortSignal:q.abortSignal};try{return await this.executor.executeSessionEndHooks(Y,Z,$),{}}catch(X){return console.error("[HookManager] Error executing SessionEnd hooks:",X),{warning:`Hook execution failed: ${X instanceof Error?X.message:String(X)}`}}}async executePostToolUseFailureHooks(O,q,Q,Z,Y){let $=this.getExecutionConfig(Y.sessionId,Y.projectDir);if(!this.isExecutionEnabled($,Y.sessionId,Y.projectDir))return{};let X={hook_event_name:"PostToolUseFailure",hook_execution_id:R(),timestamp:new Date().toISOString(),tool_name:O,tool_use_id:q,tool_input:Q,error:Z,error_type:Y.errorType,is_interrupt:Y.isInterrupt,is_timeout:Y.isTimeout,project_dir:Y.projectDir,session_id:Y.sessionId,permission_mode:Y.permissionMode},W=this.getMatchingHooks("PostToolUseFailure",{toolName:O,filePath:this.extractFilePaths(Q)[0],filePaths:this.extractFilePaths(Q),command:this.extractCommand(O,Q)},$);if(W.length===0)return{};let J={projectDir:Y.projectDir,sessionId:Y.sessionId,permissionMode:Y.permissionMode,config:$,abortSignal:Y.abortSignal};try{return await this.executor.executePostToolUseFailureHooks(W,X,J)}catch(G){return console.error("[HookManager] Error executing PostToolUseFailure hooks:",G),{warning:`Hook execution failed: ${G instanceof Error?G.message:String(G)}`}}}async executeNotificationHooks(O,q,Q){let Z=this.getExecutionConfig(Q.sessionId,Q.projectDir);if(!this.isExecutionEnabled(Z,Q.sessionId,Q.projectDir))return{suppress:!1,message:q};let Y={hook_event_name:"Notification",hook_execution_id:R(),timestamp:new Date().toISOString(),project_dir:Q.projectDir,session_id:Q.sessionId,permission_mode:Q.permissionMode,notification_type:O,title:Q.title,message:q},$=this.getMatchingHooks("Notification",{},Z);if($.length===0)return{suppress:!1,message:q};let X={projectDir:Q.projectDir,sessionId:Q.sessionId,permissionMode:Q.permissionMode,config:Z,abortSignal:Q.abortSignal};try{return await this.executor.executeNotificationHooks($,Y,X)}catch(W){return console.error("[HookManager] Error executing Notification hooks:",W),{suppress:!1,message:q,warning:`Hook execution failed: ${W instanceof Error?W.message:String(W)}`}}}async executeElicitationHooks(O,q){let Q=this.getExecutionConfig(q.sessionId,q.projectDir);if(!this.isExecutionEnabled(Q,q.sessionId,q.projectDir))return{};let Z={hook_event_name:"Elicitation",hook_execution_id:R(),timestamp:new Date().toISOString(),project_dir:q.projectDir,session_id:q.sessionId,permission_mode:q.permissionMode,server_name:O.serverName,mode:O.mode,message:O.message,requested_schema:O.requestedSchema,url:O.url,elicitation_id:O.elicitationId};return this.executeElicitationHookChain("Elicitation",Z,q,Q)}async executeElicitationResultHooks(O,q,Q){let Z=this.getExecutionConfig(Q.sessionId,Q.projectDir);if(!this.isExecutionEnabled(Z,Q.sessionId,Q.projectDir))return{};let Y={hook_event_name:"ElicitationResult",hook_execution_id:R(),timestamp:new Date().toISOString(),project_dir:Q.projectDir,session_id:Q.sessionId,permission_mode:Q.permissionMode,server_name:O.serverName,mode:O.mode,elicitation_id:O.elicitationId,action:q.action,content:q.content};return this.executeElicitationHookChain("ElicitationResult",Y,Q,Z)}async executeElicitationHookChain(O,q,Q,Z){let Y=this.getMatchingHooks(O,{},Z);if(Y.length===0)return{};let $={projectDir:Q.projectDir,sessionId:Q.sessionId,permissionMode:Q.permissionMode,config:Z,abortSignal:Q.abortSignal};try{return await this.executor.executeElicitationHooks(Y,q,$)}catch(X){return{warning:`Hook execution failed: ${X instanceof Error?X.message:String(X)}`}}}async executeCompactionHooks(O,q){let Q=this.getExecutionConfig(q.sessionId,q.projectDir);if(!this.isExecutionEnabled(Q,q.sessionId,q.projectDir))return{blockCompaction:!1};let Z={hook_event_name:"Compaction",hook_execution_id:R(),timestamp:new Date().toISOString(),project_dir:q.projectDir,session_id:q.sessionId,permission_mode:q.permissionMode,trigger:O,messages_before:q.messagesBefore,tokens_before:q.tokensBefore},Y=this.getMatchingHooks("Compaction",{},Q);if(Y.length===0)return{blockCompaction:!1};let $={projectDir:q.projectDir,sessionId:q.sessionId,permissionMode:q.permissionMode,config:Q,abortSignal:q.abortSignal};try{return await this.executor.executeCompactionHooks(Y,Z,$)}catch(X){return console.error("[HookManager] Error executing Compaction hooks:",X),{blockCompaction:!1,warning:`Hook execution failed: ${X instanceof Error?X.message:String(X)}`}}}getMatchingHooks(O,q,Q){let Z=[...Q[O]??[],...this.managedFunctionMatchers[O]??[]],Y=[];for(let $ of Z)if(this.matcher.matches($.matcher,q))Y.push(...$.hooks);return Y}extractFilePaths(O){let q=[],Q=["file_path","path","filePath","source","target"];for(let Z of Q){let Y=O[Z];if(typeof Y==="string")q.push(Y)}if(typeof O.patch==="string"){for(let Z of O.patch.matchAll(/^\*\*\* (?:Add|Delete|Update) File: (.+)$/gm))if(Z[1])q.push(Z[1]);for(let Z of O.patch.matchAll(/^\*\*\* Move to: (.+)$/gm))if(Z[1])q.push(Z[1])}return[...new Set(q)]}extractCommand(O,q){if(O==="Bash"||O==="BashTool"){let Q=q.command;if(typeof Q==="string")return Q}return}cleanup(){this.guard.cleanupAll(),this.config=N,this.processDisabled=!1,this.disabledSessions.clear(),this.sessionStateAliases.clear(),this.projectConfigs.clear(),this.sessionConfigs.clear(),this.managedFunctionMatchers={}}}
45
- export{b as Ze,o as _e,_ as $e};
45
+ export{b as cf,o as df,_ as ef};
@@ -1 +1 @@
1
- import{Aa as O,Ra as J,xa as V,za as W}from"./chunk-92x15fzx.js";import"./chunk-v0rsz1rt.js";import"./chunk-xz6y0w4n.js";import{wg as Q}from"./chunk-k0pa8874.js";import"./chunk-t2wgf9tq.js";import"./chunk-9q852bsc.js";import"./chunk-wfy851et.js";import F from"chalk";var K=(f)=>typeof f==="string"&&f.length>0?f:void 0;function X(f){let z=K(f.cron),G=K(f.every),H=K(f.at);if([z,G,H].filter(Boolean).length!==1)throw Error("Provide exactly one of --cron, --every, or --at");if(z)return{kind:"cron",cron:z};if(G){let P=V(G);if(!P)throw Error(`Invalid --every value "${G}" (use e.g. 30m, 2h, 1d)`);return{kind:"interval",intervalMs:P}}let N=new Date(H);if(Number.isNaN(N.getTime()))throw Error(`Invalid --at value "${H}" (use an ISO timestamp)`);return{kind:"once",runAt:N.toISOString()}}var Y={command:"create <prompt>",describe:"创建定时任务",builder:(f)=>f.positional("prompt",{type:"string",describe:"定时任务运行时发送给 Agent 的提示词",demandOption:!0}).option("cron",{type:"string",describe:"5 段 cron 表达式(本地时区)"}).option("every",{type:"string",describe:"间隔(如 30m、2h、1d)"}).option("at",{type:"string",describe:"一次性运行的 ISO 时间点"}).option("project-path",{alias:["projectPath","project"],type:"string",describe:"目标项目路径(默认当前目录)"}).option("title",{type:"string",describe:"定时任务标题"}).option("model",{alias:"m",type:"string",describe:"模型 ID"}).option("permission-mode",{type:"string",choices:["default","autoEdit","yolo","plan"],default:"default",describe:"权限模式"}).option("isolation",{type:"string",choices:["local","worktree"],default:"worktree",describe:"执行隔离方式"}).example([['$0 schedule create "跑测试并汇报失败" --every 1h',"每小时运行一次"],['$0 schedule create "生成每日站会摘要" --cron "0 9 * * 1-5"',"工作日 9 点运行"]]),handler:async(f)=>{try{let z=X(f),G=W(z);if(G)throw Error(G);let H={prompt:f.prompt,projectPath:K(f.projectPath)??Q(),title:K(f.title),trigger:z,modelId:K(f.model),isolation:K(f.isolation)??"worktree",permissionMode:K(f.permissionMode)??"default",enabled:!0},B=await J.create(H);console.log(F.green(`✓ 已创建定时任务 ${B.id}`)),console.log(` ${O(B.trigger)}`),console.log(` 项目: ${B.projectPath}`),console.log(` 下次运行: ${B.nextRunAt?new Date(B.nextRunAt).toLocaleString():"(无)"}`),process.exit(0)}catch(z){console.error(F.red(`创建定时任务失败: ${z instanceof Error?z.message:z}`)),process.exit(1)}}},Z={command:"list",aliases:["ls"],describe:"列出所有定时任务",handler:async()=>{let f=await J.list();if(f.length===0)console.log(F.dim("尚无定时任务。使用 `blade schedule create` 创建。")),process.exit(0);for(let z of f){let G=z.enabled?F.green("启用"):F.dim("停用"),H=z.nextRunAt?new Date(z.nextRunAt).toLocaleString():"—",B=z.lastRunAt?`${new Date(z.lastRunAt).toLocaleString()} (${z.lastStatus??"?"})`:"从未";console.log(`${F.cyan(z.id)} [${G}] ${z.title??z.prompt.slice(0,40)}`),console.log(` ${O(z.trigger)} · 下次: ${H} · 上次: ${B} · 运行 ${z.runCount} 次`),console.log(F.dim(` 项目: ${z.projectPath}`))}process.exit(0)}},_={command:"show <id>",describe:"查看定时任务详情",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{let z=await J.get(f.id);if(!z)console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(JSON.stringify(z,null,2)),process.exit(0)}},$={command:"remove <id>",aliases:["rm"],describe:"删除定时任务",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{if(!await J.remove(f.id))console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(F.green(`✓ 已删除定时任务 ${f.id}`)),process.exit(0)}},q={command:"enable <id>",describe:"启用定时任务",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{if(!await J.setEnabled(f.id,!0))console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(F.green(`✓ 已启用定时任务 ${f.id}`)),process.exit(0)}},x={command:"disable <id>",describe:"停用定时任务",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{if(!await J.setEnabled(f.id,!1))console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(F.green(`✓ 已停用定时任务 ${f.id}`)),process.exit(0)}},D={command:"run <id>",describe:"立即运行定时任务(需要 blade serve)",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}).option("server",{type:"string",default:process.env.BLADE_SERVER_URL??"http://127.0.0.1:4097",describe:"Blade server 地址"}),handler:async(f)=>{let z=f.id,G=(K(f.server)??"http://127.0.0.1:4097").replace(/\/$/,""),H={};if(process.env.BLADE_SERVER_PASSWORD){let B=process.env.BLADE_SERVER_USERNAME??"blade";H.Authorization=`Basic ${Buffer.from(`${B}:${process.env.BLADE_SERVER_PASSWORD}`).toString("base64")}`}try{let B=await fetch(`${G}/schedules/${encodeURIComponent(z)}/run`,{method:"POST",headers:H});if(!B.ok){let N=await B.json().catch(()=>{return});throw Error(N?.error?.message??`Schedule run failed (${B.status})`)}console.log(F.green(`✓ 已触发定时任务 ${z}`)),process.exit(0)}catch(B){console.error(F.red(`运行定时任务失败: ${B instanceof Error?B.message:B}`)),process.exit(1)}}},R={command:"schedule",describe:"管理定时任务",builder:(f)=>f.command(Y).command(Z).command(_).command($).command(q).command(x).command(D).demandCommand(1,"请提供子命令:create | list | show | remove | enable | disable | run"),handler:()=>{}};export{R as scheduleCommands};
1
+ import{Ba as W,Ca as O,Ua as J,za as V}from"./chunk-brm24s69.js";import"./chunk-m6qgme8k.js";import"./chunk-mrh3vs01.js";import{Bg as Q}from"./chunk-0kat01bw.js";import"./chunk-gv3ed5gw.js";import"./chunk-j0yvwrd7.js";import"./chunk-zf96d5we.js";import F from"chalk";var K=(f)=>typeof f==="string"&&f.length>0?f:void 0;function X(f){let z=K(f.cron),G=K(f.every),H=K(f.at);if([z,G,H].filter(Boolean).length!==1)throw Error("Provide exactly one of --cron, --every, or --at");if(z)return{kind:"cron",cron:z};if(G){let P=V(G);if(!P)throw Error(`Invalid --every value "${G}" (use e.g. 30m, 2h, 1d)`);return{kind:"interval",intervalMs:P}}let N=new Date(H);if(Number.isNaN(N.getTime()))throw Error(`Invalid --at value "${H}" (use an ISO timestamp)`);return{kind:"once",runAt:N.toISOString()}}var Y={command:"create <prompt>",describe:"创建定时任务",builder:(f)=>f.positional("prompt",{type:"string",describe:"定时任务运行时发送给 Agent 的提示词",demandOption:!0}).option("cron",{type:"string",describe:"5 段 cron 表达式(本地时区)"}).option("every",{type:"string",describe:"间隔(如 30m、2h、1d)"}).option("at",{type:"string",describe:"一次性运行的 ISO 时间点"}).option("project-path",{alias:["projectPath","project"],type:"string",describe:"目标项目路径(默认当前目录)"}).option("title",{type:"string",describe:"定时任务标题"}).option("model",{alias:"m",type:"string",describe:"模型 ID"}).option("permission-mode",{type:"string",choices:["default","autoEdit","yolo","plan"],default:"default",describe:"权限模式"}).option("isolation",{type:"string",choices:["local","worktree"],default:"worktree",describe:"执行隔离方式"}).example([['$0 schedule create "跑测试并汇报失败" --every 1h',"每小时运行一次"],['$0 schedule create "生成每日站会摘要" --cron "0 9 * * 1-5"',"工作日 9 点运行"]]),handler:async(f)=>{try{let z=X(f),G=W(z);if(G)throw Error(G);let H={prompt:f.prompt,projectPath:K(f.projectPath)??Q(),title:K(f.title),trigger:z,modelId:K(f.model),isolation:K(f.isolation)??"worktree",permissionMode:K(f.permissionMode)??"default",enabled:!0},B=await J.create(H);console.log(F.green(`✓ 已创建定时任务 ${B.id}`)),console.log(` ${O(B.trigger)}`),console.log(` 项目: ${B.projectPath}`),console.log(` 下次运行: ${B.nextRunAt?new Date(B.nextRunAt).toLocaleString():"(无)"}`),process.exit(0)}catch(z){console.error(F.red(`创建定时任务失败: ${z instanceof Error?z.message:z}`)),process.exit(1)}}},Z={command:"list",aliases:["ls"],describe:"列出所有定时任务",handler:async()=>{let f=await J.list();if(f.length===0)console.log(F.dim("尚无定时任务。使用 `blade schedule create` 创建。")),process.exit(0);for(let z of f){let G=z.enabled?F.green("启用"):F.dim("停用"),H=z.nextRunAt?new Date(z.nextRunAt).toLocaleString():"—",B=z.lastRunAt?`${new Date(z.lastRunAt).toLocaleString()} (${z.lastStatus??"?"})`:"从未";console.log(`${F.cyan(z.id)} [${G}] ${z.title??z.prompt.slice(0,40)}`),console.log(` ${O(z.trigger)} · 下次: ${H} · 上次: ${B} · 运行 ${z.runCount} 次`),console.log(F.dim(` 项目: ${z.projectPath}`))}process.exit(0)}},_={command:"show <id>",describe:"查看定时任务详情",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{let z=await J.get(f.id);if(!z)console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(JSON.stringify(z,null,2)),process.exit(0)}},$={command:"remove <id>",aliases:["rm"],describe:"删除定时任务",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{if(!await J.remove(f.id))console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(F.green(`✓ 已删除定时任务 ${f.id}`)),process.exit(0)}},q={command:"enable <id>",describe:"启用定时任务",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{if(!await J.setEnabled(f.id,!0))console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(F.green(`✓ 已启用定时任务 ${f.id}`)),process.exit(0)}},x={command:"disable <id>",describe:"停用定时任务",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{if(!await J.setEnabled(f.id,!1))console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(F.green(`✓ 已停用定时任务 ${f.id}`)),process.exit(0)}},D={command:"run <id>",describe:"立即运行定时任务(需要 blade serve)",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}).option("server",{type:"string",default:process.env.BLADE_SERVER_URL??"http://127.0.0.1:4097",describe:"Blade server 地址"}),handler:async(f)=>{let z=f.id,G=(K(f.server)??"http://127.0.0.1:4097").replace(/\/$/,""),H={};if(process.env.BLADE_SERVER_PASSWORD){let B=process.env.BLADE_SERVER_USERNAME??"blade";H.Authorization=`Basic ${Buffer.from(`${B}:${process.env.BLADE_SERVER_PASSWORD}`).toString("base64")}`}try{let B=await fetch(`${G}/schedules/${encodeURIComponent(z)}/run`,{method:"POST",headers:H});if(!B.ok){let N=await B.json().catch(()=>{return});throw Error(N?.error?.message??`Schedule run failed (${B.status})`)}console.log(F.green(`✓ 已触发定时任务 ${z}`)),process.exit(0)}catch(B){console.error(F.red(`运行定时任务失败: ${B instanceof Error?B.message:B}`)),process.exit(1)}}},R={command:"schedule",describe:"管理定时任务",builder:(f)=>f.command(Y).command(Z).command(_).command($).command(q).command(x).command(D).demandCommand(1,"请提供子命令:create | list | show | remove | enable | disable | run"),handler:()=>{}};export{R as scheduleCommands};
@@ -1,2 +1,2 @@
1
1
  import{createRequire as a}from"node:module";var c=a(import.meta.url);
2
- export{c as Dh};
2
+ export{c as Ih};
@@ -0,0 +1 @@
1
+ import{pe as a,qe as b,re as c}from"./chunk-06y3rada.js";import"./chunk-ccgq8nrm.js";import"./chunk-g8425xh4.js";import"./chunk-m6qgme8k.js";import"./chunk-mrh3vs01.js";import"./chunk-0kat01bw.js";import"./chunk-4xpj0d6y.js";import"./chunk-gv3ed5gw.js";import"./chunk-hwjmm2br.js";import"./chunk-wvg81sd9.js";import"./chunk-y858e8pb.js";import"./chunk-eh4h7fmr.js";import"./chunk-bs77d8hn.js";import"./chunk-j0yvwrd7.js";import"./chunk-zf96d5we.js";export{c as snapshotWorkspaceModelResources,b as resolveWorkspaceModelResources,a as cloneWorkspaceModelConfig};
@@ -0,0 +1 @@
1
+ import{th as a,uh as b,vh as c}from"./chunk-eh4h7fmr.js";import"./chunk-bs77d8hn.js";import"./chunk-j0yvwrd7.js";import"./chunk-zf96d5we.js";export{b as isWorkspaceTrusted,c as WorkspaceTrustService,a as MAX_RESIDENT_WORKSPACE_TRUST_STATUSES};