blade-code 0.10.204 → 0.10.206

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 (146) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-09kqfdpa.js +3 -0
  3. package/dist/{chunk-p6586ftx.js → chunk-0ef47wgr.js} +2 -2
  4. package/dist/chunk-1j39te3t.js +23 -0
  5. package/dist/{chunk-fdr4fcrf.js → chunk-1n4v80hy.js} +1 -1
  6. package/dist/{chunk-4fbpydtn.js → chunk-28n945me.js} +2 -2
  7. package/dist/{chunk-ys8gysg8.js → chunk-28tzj187.js} +1 -1
  8. package/dist/{chunk-j89qk7bp.js → chunk-3crwyd2r.js} +3 -3
  9. package/dist/{chunk-zfxcef0z.js → chunk-50vwafn5.js} +1 -1
  10. package/dist/chunk-514va7ce.js +2 -0
  11. package/dist/{chunk-kkzznz4w.js → chunk-53vh6vpt.js} +1 -1
  12. package/dist/chunk-5k8k56f2.js +731 -0
  13. package/dist/{chunk-f4d8312x.js → chunk-65wc1h38.js} +1 -1
  14. package/dist/{chunk-bx2s02mt.js → chunk-67wy9mm7.js} +2 -2
  15. package/dist/chunk-6p0hkf4f.js +1 -0
  16. package/dist/{chunk-qdbbke8f.js → chunk-6xzk4hsg.js} +1 -1
  17. package/dist/chunk-793wjhvz.js +332 -0
  18. package/dist/chunk-826xegd8.js +6 -0
  19. package/dist/chunk-867bpjzg.js +1 -0
  20. package/dist/{chunk-hnvvve5d.js → chunk-870szc6v.js} +1 -1
  21. package/dist/chunk-983hqzat.js +1 -0
  22. package/dist/{chunk-0eajnhrj.js → chunk-9kj19a8t.js} +1 -1
  23. package/dist/{chunk-55n8ppxf.js → chunk-9sf1t8gw.js} +1 -1
  24. package/dist/chunk-9tpzmy8v.js +4 -0
  25. package/dist/chunk-af0m5227.js +1 -0
  26. package/dist/chunk-asgmmaec.js +3 -0
  27. package/dist/{chunk-m640mr36.js → chunk-av799ng5.js} +2 -2
  28. package/dist/{chunk-rwm71p4g.js → chunk-az3rehz9.js} +360 -360
  29. package/dist/{chunk-p0wyhp5a.js → chunk-dnpkf5mv.js} +2 -2
  30. package/dist/chunk-dpg006xj.js +1 -0
  31. package/dist/{chunk-0xf70s5c.js → chunk-e0ft3vwg.js} +1 -1
  32. package/dist/chunk-e45r1a8r.js +25 -0
  33. package/dist/{chunk-vzdsext4.js → chunk-ebpg1srd.js} +2 -2
  34. package/dist/{chunk-n52n2w5v.js → chunk-ed2hdrwe.js} +1 -1
  35. package/dist/{chunk-7ajvrtb3.js → chunk-erhaedch.js} +1 -1
  36. package/dist/{chunk-kehgewqh.js → chunk-ewwrss2w.js} +1 -1
  37. package/dist/{chunk-9fyjyk2f.js → chunk-fc1gz532.js} +2 -2
  38. package/dist/{chunk-vgf07dhy.js → chunk-fd0a8h55.js} +2 -2
  39. package/dist/{chunk-6dw3pk3c.js → chunk-fnmqxhv1.js} +2 -2
  40. package/dist/chunk-g7tphxme.js +6 -0
  41. package/dist/{chunk-cjfb4kjp.js → chunk-gmpsfkgg.js} +1 -1
  42. package/dist/chunk-gpnkxh4c.js +1 -0
  43. package/dist/{chunk-8j0z248z.js → chunk-gz84aewr.js} +1 -1
  44. package/dist/{chunk-2xpjy0ef.js → chunk-h4k69z1b.js} +1 -1
  45. package/dist/{chunk-dhxx5mwe.js → chunk-h6ahwwpa.js} +2 -2
  46. package/dist/chunk-hpge30p8.js +8 -0
  47. package/dist/{chunk-1cy4ab77.js → chunk-hv8nt7wj.js} +1 -1
  48. package/dist/chunk-mtvbm7xe.js +1 -0
  49. package/dist/chunk-mys9mmcp.js +1 -0
  50. package/dist/{chunk-wezr6wfq.js → chunk-n34qsnks.js} +1 -1
  51. package/dist/chunk-n5jzmwhy.js +25 -0
  52. package/dist/chunk-new78c3h.js +1 -0
  53. package/dist/{chunk-je908ygr.js → chunk-nj6kpdte.js} +2 -2
  54. package/dist/chunk-nng1xbsm.js +10 -0
  55. package/dist/{chunk-pqsjy31p.js → chunk-p2y1zqsb.js} +2 -2
  56. package/dist/chunk-p8vpvx07.js +12 -0
  57. package/dist/{chunk-3cas6rv5.js → chunk-pdna2qvv.js} +2 -2
  58. package/dist/{chunk-gzdk86fm.js → chunk-pga8gxtf.js} +1 -1
  59. package/dist/chunk-pt0y4zrg.js +14 -0
  60. package/dist/{chunk-w4bedq0m.js → chunk-q6abav45.js} +51 -51
  61. package/dist/chunk-r4em0ha7.js +1 -0
  62. package/dist/chunk-rdzbd5vk.js +1 -0
  63. package/dist/chunk-sbfe9vh3.js +94 -0
  64. package/dist/chunk-sqk8cnej.js +44 -0
  65. package/dist/{chunk-5yyp6njq.js → chunk-t0gm0pn1.js} +1 -1
  66. package/dist/{chunk-egss0m1x.js → chunk-tsm8rhmd.js} +1 -1
  67. package/dist/chunk-tzvb0nd2.js +2 -0
  68. package/dist/{chunk-wk869s65.js → chunk-v4cxk10d.js} +1 -1
  69. package/dist/{chunk-g383afnv.js → chunk-v5vx6nz9.js} +1 -1
  70. package/dist/{chunk-x49bw41v.js → chunk-vx2g1faw.js} +1 -1
  71. package/dist/chunk-w6zat4v4.js +1 -0
  72. package/dist/chunk-wsd3rn0q.js +1 -0
  73. package/dist/{chunk-smxdn7kq.js → chunk-xcq0cehr.js} +5 -6
  74. package/dist/chunk-yjjxv7fn.js +352 -0
  75. package/dist/{chunk-z0m9j0e2.js → chunk-yzf2jpam.js} +2 -2
  76. package/dist/web/assets/{ChatView-BF6HUrBw.js → ChatView-lUD-61n0.js} +4 -4
  77. package/dist/web/assets/{CodeBlockHighlighter-C4CgCiRf.js → CodeBlockHighlighter--TbfcBxW.js} +1 -1
  78. package/dist/web/assets/FilePreview-R6OKQPf2.js +55 -0
  79. package/dist/web/assets/{KanbanBoard-DDXB-yq1.js → KanbanBoard-BHOKtiv5.js} +1 -1
  80. package/dist/web/assets/{MarkdownRenderer-DS7RznBE.js → MarkdownRenderer-DqxNq8pa.js} +3 -3
  81. package/dist/web/assets/{ScrollArea-BM9NzGZM.js → ScrollArea-Dhu0B-zB.js} +1 -1
  82. package/dist/web/assets/{SessionHistorySurface-DnRySeLE.js → SessionHistorySurface-aZvoj3ma.js} +1 -1
  83. package/dist/web/assets/{SettingsModal-D5YLUtIo.js → SettingsModal-C7QBnIqa.js} +1 -1
  84. package/dist/web/assets/{Sidebar-BZC6OkDJ.js → Sidebar-Bznnq91x.js} +1 -1
  85. package/dist/web/assets/{TaskSwitcher-WewOkw5m.js → TaskSwitcher-DJczhDRp.js} +1 -1
  86. package/dist/web/assets/{TerminalPanel-C5SGdRNr.js → TerminalPanel-Vk4p0V3p.js} +1 -1
  87. package/dist/web/assets/{archive-DkczUU08.js → archive-0hLYBKQf.js} +1 -1
  88. package/dist/web/assets/{arrow-left-9pBiQwu7.js → arrow-left-CXb6Gqf3.js} +1 -1
  89. package/dist/web/assets/{calendar-clock-BFnUlxrU.js → calendar-clock-DiaFI9Jk.js} +1 -1
  90. package/dist/web/assets/{chevron-right-yCVkAEcj.js → chevron-right-CcPXH37D.js} +1 -1
  91. package/dist/web/assets/{clock-3-CcoWoRQs.js → clock-3-D6VR6gJc.js} +1 -1
  92. package/dist/web/assets/{copy-HJF0oQBS.js → copy-C3eUAQgp.js} +1 -1
  93. package/dist/web/assets/{download-DSBCIqk3.js → download-DHvS9tI3.js} +1 -1
  94. package/dist/web/assets/{external-link-zIgEO0KB.js → external-link-BDVaEuqY.js} +1 -1
  95. package/dist/web/assets/{folder-BdRo64o3.js → folder-B80Ac6rr.js} +1 -1
  96. package/dist/web/assets/index-VwIiNjc8.css +1 -0
  97. package/dist/web/assets/{index-BVDkKudh.js → index-YqughEZk.js} +4 -4
  98. package/dist/web/assets/{message-square-plus-3klTXO0S.js → message-square-plus-D15quyPH.js} +1 -1
  99. package/dist/web/assets/{pause-B9Q5JWvH.js → pause-BjMlj6Bx.js} +1 -1
  100. package/dist/web/assets/{pencil-CbYIz1b1.js → pencil-BMoJvcB7.js} +1 -1
  101. package/dist/web/assets/{play-CZMTj43e.js → play-BHh4py3p.js} +1 -1
  102. package/dist/web/assets/{plus-Cc7I8fhb.js → plus-DeFz_gQq.js} +1 -1
  103. package/dist/web/assets/session-events-DCHBz9We.js +25 -0
  104. package/dist/web/assets/{settings-DSF3exX2.js → settings-CI8xbId2.js} +1 -1
  105. package/dist/web/assets/{team-qfeJHL9s.js → team-zZ803hH9.js} +1 -1
  106. package/dist/web/assets/{teamService-Bs9qBKI8.js → teamService-CgLBXgmv.js} +1 -1
  107. package/dist/web/assets/{terminal-DQLqe-Ed.js → terminal-1WxSJ47E.js} +1 -1
  108. package/dist/web/index.html +2 -2
  109. package/package.json +1 -1
  110. package/dist/chunk-1b8qjgm6.js +0 -181
  111. package/dist/chunk-1vq22245.js +0 -10
  112. package/dist/chunk-3den8b7b.js +0 -1
  113. package/dist/chunk-42vt2eqq.js +0 -1
  114. package/dist/chunk-4ts2s9mz.js +0 -94
  115. package/dist/chunk-5dcsrs7e.js +0 -2
  116. package/dist/chunk-5j94j64z.js +0 -25
  117. package/dist/chunk-6ax5dpd3.js +0 -1
  118. package/dist/chunk-7atwbngw.js +0 -1
  119. package/dist/chunk-7d3msqg3.js +0 -14
  120. package/dist/chunk-81py03y4.js +0 -44
  121. package/dist/chunk-8cncpfhd.js +0 -6
  122. package/dist/chunk-8ej7w92s.js +0 -1
  123. package/dist/chunk-ae0fafmv.js +0 -1
  124. package/dist/chunk-ayvx3h91.js +0 -1
  125. package/dist/chunk-b50smz3h.js +0 -1
  126. package/dist/chunk-bx3b61xw.js +0 -1
  127. package/dist/chunk-d256m8rb.js +0 -1
  128. package/dist/chunk-e49ctwmg.js +0 -1
  129. package/dist/chunk-egc2f1ye.js +0 -733
  130. package/dist/chunk-ggdgk3gy.js +0 -3
  131. package/dist/chunk-h78hhhgt.js +0 -1
  132. package/dist/chunk-hkk83qt6.js +0 -23
  133. package/dist/chunk-ky592ay9.js +0 -2
  134. package/dist/chunk-m0t26vkj.js +0 -4
  135. package/dist/chunk-myvt7yjm.js +0 -8
  136. package/dist/chunk-nsb3cj6t.js +0 -6
  137. package/dist/chunk-p8cmxhbr.js +0 -25
  138. package/dist/chunk-qpmvp4q2.js +0 -2
  139. package/dist/chunk-rmfzym94.js +0 -3
  140. package/dist/chunk-rnt2fejc.js +0 -1
  141. package/dist/chunk-tm3789m3.js +0 -2
  142. package/dist/chunk-vtssm7r5.js +0 -12
  143. package/dist/chunk-ztreczac.js +0 -353
  144. package/dist/web/assets/FilePreview-BS4PgFKb.js +0 -55
  145. package/dist/web/assets/index-CaCifsSK.css +0 -1
  146. package/dist/web/assets/session-events-NEjosinC.js +0 -31
@@ -1,4 +1,4 @@
1
- import{$i as L,cj as _}from"./chunk-qdbbke8f.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{Zi as L,aj as _}from"./chunk-6xzk4hsg.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 Cf,f as Df,x as Ef};
28
+ export{v as Ff,f as Gf,x as Hf};
@@ -0,0 +1 @@
1
+ import{vf as a,wf as b}from"./chunk-fd0a8h55.js";import"./chunk-yzf2jpam.js";import"./chunk-gmpsfkgg.js";export{a as globalOptions,b as cliConfig};
@@ -1 +1 @@
1
- import"./chunk-cjfb4kjp.js";var d={command:"install [target]",describe:"Install Blade native build. Use [target] to specify version (stable, latest, or specific version)",builder:(b)=>{return b.positional("target",{describe:"Version to install",type:"string",default:"stable",choices:["stable","latest"]}).option("force",{type:"boolean",describe:"Force reinstall",default:!1}).example([["$0 install","Install stable version"],["$0 install latest","Install latest version"],["$0 install --force","Force reinstall stable version"]])},handler:async(b)=>{console.log(`Installing Blade ${b.target}...`);try{if(b.force)console.log("Force reinstall enabled");console.log("Downloading..."),console.log("Installing..."),console.log("Installation completed successfully")}catch(c){console.error(`Error: Installation failed: ${c instanceof Error?c.message:"未知错误"}`),process.exit(1)}}};export{d as installCommands};
1
+ import"./chunk-gmpsfkgg.js";var d={command:"install [target]",describe:"Install Blade native build. Use [target] to specify version (stable, latest, or specific version)",builder:(b)=>{return b.positional("target",{describe:"Version to install",type:"string",default:"stable",choices:["stable","latest"]}).option("force",{type:"boolean",describe:"Force reinstall",default:!1}).example([["$0 install","Install stable version"],["$0 install latest","Install latest version"],["$0 install --force","Force reinstall stable version"]])},handler:async(b)=>{console.log(`Installing Blade ${b.target}...`);try{if(b.force)console.log("Force reinstall enabled");console.log("Downloading..."),console.log("Installing..."),console.log("Installation completed successfully")}catch(c){console.error(`Error: Installation failed: ${c instanceof Error?c.message:"未知错误"}`),process.exit(1)}}};export{d as installCommands};
@@ -0,0 +1,25 @@
1
+ import{wc as Ut,xc as fn,yc as yn,zc as En}from"./chunk-1n4v80hy.js";import{yh as xt}from"./chunk-xcq0cehr.js";import{Eh as Ot,Fh as vi,Hh as en,Ih as Bt,Jh as U,Kh as sn,Lh as St,Mh as gt,Oh as rn,Ph as Tn,Qh as B,Rh as on,Sh as dn,Th as pn,Uh as Lt,Vh as cn,Wh as un,Xh as Mn,Zh as S,ai as wn,bi as Vt,ci as lt,di as h,ei as jt}from"./chunk-sqk8cnej.js";import{aj as Zt}from"./chunk-6xzk4hsg.js";import{Ej as X,Gj as g}from"./chunk-09kqfdpa.js";import{Wj as tn,Xj as nn}from"./chunk-yzf2jpam.js";import{Jk as ne}from"./chunk-gmpsfkgg.js";import{EventEmitter as be}from"events";import Un from"node:path";function hn(t){if(t===void 0)return"undefined";if(typeof t==="string")return t;try{let i=JSON.stringify(t);return i===void 0?String(t):i}catch{return String(t)}}function An(t){let i=t;switch(t.code){case"type":return`类型错误:${t.message}`;case"required":return"缺少必需参数";case"minLength":return`字符串过短:${t.message}`;case"maxLength":return`字符串过长:${t.message}`;case"minimum":case"exclusiveMinimum":return`数值太小:${t.message}`;case"maximum":case"exclusiveMaximum":return`数值太大:${t.message}`;case"minItems":return`数组元素过少:${t.message}`;case"maxItems":return`数组元素过多:${t.message}`;case"format":return`格式错误:${t.message}`;case"enum":return`必须是枚举允许的值之一:${t.message}`;case"const":return`必须是指定的字面量值:${t.message}`;case"additionalProperties":case"unevaluatedProperties":return`包含未知参数:${t.message}`;case"anyOf":case"oneOf":return"不符合任何有效的类型定义";case"~refine":return t.message||"自定义验证失败";default:return t.message||`验证失败:${hn(i)}`}}class Yt extends Error{issues;type;constructor(t,i,n="validation_error"){super(t);this.issues=i;this.type=n;this.name="ToolValidationError"}}function Ft(t,i){let n=X(t,i);if(n.success)return n.data;let e=n.error.issues.map((r)=>({field:r.path.length>0?r.path.join("."):"root",message:An(r),value:r.value})),s=e.length===1?`参数验证失败 [${e[0].field}]: ${e[0].message}`:`参数验证失败 (${e.length} 个错误):
2
+ ${e.map((r)=>` - ${r.field}: ${r.message}`).join(`
3
+ `)}`;throw new Yt(s,e)}function et(t){if(!t||typeof t!=="object")return;let i=t;if(i.type==="object"&&i.properties)i.required??=[],i.additionalProperties??=!1;for(let n of Object.values(i))if(Array.isArray(n))for(let e of n)et(e);else et(n)}function st(t){let i=JSON.parse(JSON.stringify(t,(n,e)=>n.startsWith("~")?void 0:e));return et(i),i}class rt{toolName;params;executeFn;descriptionFn;affectedPathsFn;isRetrySafe;constructor(t,i,n,e,s,r=!1){this.toolName=t;this.params=i;this.executeFn=n;this.descriptionFn=e;this.affectedPathsFn=s;this.isRetrySafe=r}getDescription(){if(this.descriptionFn)return this.descriptionFn(this.params);return`执行工具: ${this.toolName}`}getAffectedPaths(){if(this.affectedPathsFn)return this.affectedPathsFn(this.params);return[]}async execute(t,i,n){let e={signal:t,updateOutput:i,...n};return this.executeFn(this.params,e)}}function Jt(t){return{name:t.name,displayName:t.displayName,kind:t.kind,isConcurrencySafe:t.isConcurrencySafe??!1,isRetrySafe:t.isRetrySafe??!1,parallelism:t.parallelism??(t.isConcurrencySafe?"shared":"exclusive"),strict:t.strict??!1,description:t.description,version:t.version||"1.0.0",category:t.category,tags:t.tags||[],getFunctionDeclaration(){let i=st(t.schema),n=t.description.short;if(t.description.long)n+=`
4
+
5
+ ${t.description.long}`;if(t.description.usageNotes&&t.description.usageNotes.length>0)n+=`
6
+
7
+ Usage Notes:
8
+ ${t.description.usageNotes.map((e)=>`- ${e}`).join(`
9
+ `)}`;if(t.description.important&&t.description.important.length>0)n+=`
10
+
11
+ Important:
12
+ ${t.description.important.map((e)=>`[WARN] ${e}`).join(`
13
+ `)}`;return{name:t.name,description:n,parameters:i}},getMetadata(){return{name:t.name,displayName:t.displayName,kind:t.kind,version:t.version||"1.0.0",category:t.category,tags:t.tags||[],isRetrySafe:t.isRetrySafe??!1,parallelism:t.parallelism??(t.isConcurrencySafe?"shared":"exclusive"),description:t.description,schema:st(t.schema)}},build(i){let n=Ft(t.schema,i);return new rt(t.name,n,t.execute,void 0,t.affectedPaths,t.isRetrySafe??!1)},async execute(i,n,e){return this.build(i).execute(n||new AbortController().signal,void 0,e)},extractSignatureContent:t.extractSignatureContent?(i)=>t.extractSignatureContent(i):void 0,abstractPermissionRule:t.abstractPermissionRule?(i)=>t.abstractPermissionRule(i):void 0}}import{randomUUID as an}from"node:crypto";import{EventEmitter as _n}from"node:events";import Pn from"node:path";class T extends _n{static instance;tasks=new Map;revision=0;static getInstance(){if(!T.instance)T.instance=new T;return T.instance}static resetForTests(){T.instance?.removeAllListeners(),T.instance=void 0}async start(t){let i=z(t.owner),n=t.client.tasks;if(!n.enabled)throw Error(`MCP tasks are disabled for server "${t.serverName}"`);if(this.evictTerminalTasks(i,n.maxTasksPerSession),this.list(i).length>=n.maxTasksPerSession)throw Error(`MCP task limit reached for Session (${n.maxTasksPerSession})`);if(this.tasks.size>=S)throw Error(`Global MCP task limit reached (${S})`);let s=Vt(t.ttlMs,n),r=new AbortController,d=()=>r.abort(t.signal?.reason??"MCP task creation cancelled");t.signal?.addEventListener("abort",d,{once:!0});let c;try{c=await t.client.createToolTask(t.toolName,t.arguments,t.interactionContext,r.signal,s)}finally{t.signal?.removeEventListener("abort",d)}let o=Date.now(),p=`mcp_task_${an()}`,u={taskId:p,serverName:t.serverName,toolName:t.toolName,owner:i,client:t.client,serverTaskId:c.taskId,serverCreatedAt:c.createdAt,serverUpdatedAt:c.lastUpdatedAt,status:c.status,statusMessage:c.statusMessage,createdAt:o,updatedAt:o,hasResult:!1,pollIntervalMs:c.pollIntervalMs,deadline:o+Math.min(s,n.maxLifetimeMs),controller:r};return this.tasks.set(p,u),this.publish(u),u.promise=this.poll(u),u.promise.catch(()=>{return}),this.snapshot(u)}get(t,i){let n=this.getOwnedRecord(t,i);return n?this.snapshot(n):void 0}list(t,i){let n=z(t);return[...this.tasks.values()].filter((e)=>ot(e.owner,n)&&(!i||e.serverName===i)).sort((e,s)=>e.createdAt-s.createdAt).map((e)=>this.snapshot(e))}hasActive(t){return this.ownedRecords(t).some((i)=>!h(i.status))}async wait(t,i,n,e){let s=this.getOwnedRecord(t,i);if(!s)return;if(!s.promise||h(s.status))return this.snapshot(s);let r,d,c=new Promise((o)=>{if(r=setTimeout(o,Math.max(0,n)),r.unref(),e){if(d=o,e.addEventListener("abort",d,{once:!0}),e.aborted)o()}});if(await Promise.race([s.promise,c]),r)clearTimeout(r);if(e&&d)e.removeEventListener("abort",d);return this.snapshot(s)}async cancel(t,i,n){let e=this.getOwnedRecord(t,i);if(!e)return;if(h(e.status))return this.snapshot(e);let s;try{await e.client.cancelToolTask(e.serverTaskId,n)}catch(r){s=dt(r,e.serverTaskId)}return e.controller.abort("MCP task cancelled"),this.update(e,{status:"cancelled",statusMessage:s?`Local cancellation completed; server acknowledgement failed: ${s}`:"Task cancelled",completedAt:Date.now()}),e.client.releaseTaskInteraction(e.serverTaskId),this.snapshot(e)}async cancelSession(t){let i=this.ownedRecords(t);await Promise.all(i.filter((n)=>!h(n.status)).map((n)=>this.cancel(n.taskId,t))),await Promise.allSettled(i.map((n)=>n.promise).filter((n)=>n!==void 0));for(let n of i)n.client.releaseTaskInteraction(n.serverTaskId),this.tasks.delete(n.taskId)}async cancelClient(t){let i=[...this.tasks.values()].filter((n)=>n.client===t&&!h(n.status));await Promise.all(i.map((n)=>this.cancel(n.taskId,n.owner)))}async poll(t){try{while(!t.controller.signal.aborted){let i=t.deadline-Date.now();if(i<=0){if(await this.cancel(t.taskId,t.owner),t.status==="cancelled")this.update(t,{status:"failed",statusMessage:"MCP task exceeded its local lifetime budget",error:"MCP task timed out",completedAt:Date.now()});return}let n;try{n=await t.client.getToolTask(t.serverTaskId,t.serverCreatedAt,t.controller.signal)}catch(e){if(t.controller.signal.aborted)return;if(t.client.connectionStatus==="connected")throw e;this.update(t,{status:"interrupted",statusMessage:"Waiting for MCP connection recovery"}),await t.client.waitUntilConnected(t.controller.signal,i);continue}if(this.applyServerState(t,n),n.status==="completed"||n.status==="input_required"){let e=t.deadline-Date.now();if(e<=0)continue;let s;try{s=await t.client.getToolTaskResult(t.serverTaskId,t.controller.signal,e)}catch(o){if(t.controller.signal.aborted)return;if(t.client.connectionStatus==="connected")throw o;this.update(t,{status:"interrupted",statusMessage:"Waiting for MCP connection recovery"}),await t.client.waitUntilConnected(t.controller.signal,e);continue}let r=await t.client.normalizeToolTaskResult(s),d=r.llmContent.replaceAll(t.serverTaskId,"[redacted-task-id]"),c=r.isError?{...r,llmContent:dt(d,t.serverTaskId)}:{...r,llmContent:d};this.update(t,{status:r.isError?"failed":"completed",hasResult:!0,result:c,...r.isError?{error:c.llmContent,statusMessage:"MCP task returned an error result"}:{},completedAt:Date.now()});return}if(n.status==="failed"||n.status==="cancelled"){this.update(t,{status:n.status,error:n.status==="failed"?n.statusMessage??"MCP task failed":void 0,completedAt:Date.now()});return}await Rn(t.pollIntervalMs,t.controller.signal)}}catch(i){if(!t.controller.signal.aborted)this.update(t,{status:"failed",statusMessage:"MCP task lifecycle failed",error:dt(i,t.serverTaskId),completedAt:Date.now()})}finally{t.client.releaseTaskInteraction(t.serverTaskId)}}applyServerState(t,i){t.pollIntervalMs=i.pollIntervalMs,this.update(t,{status:i.status,statusMessage:i.statusMessage,serverUpdatedAt:i.lastUpdatedAt})}update(t,i){let n=JSON.stringify({status:t.status,statusMessage:t.statusMessage,serverUpdatedAt:t.serverUpdatedAt,hasResult:t.hasResult,error:t.error});Object.assign(t,i);let e=JSON.stringify({status:t.status,statusMessage:t.statusMessage,serverUpdatedAt:t.serverUpdatedAt,hasResult:t.hasResult,error:t.error});if(n!==e||i.completedAt!==void 0)t.updatedAt=Date.now(),this.publish(t)}publish(t){let i={revision:++this.revision,owner:{...t.owner},...this.snapshot(t)};this.emit("taskChanged",i)}snapshot(t){return structuredClone({taskId:t.taskId,serverName:t.serverName,toolName:t.toolName,status:t.status,...t.statusMessage?{statusMessage:t.statusMessage}:{},createdAt:t.createdAt,updatedAt:t.updatedAt,...t.completedAt?{completedAt:t.completedAt}:{},hasResult:t.hasResult,...t.result?{result:t.result}:{},...t.error?{error:t.error}:{}})}getOwnedRecord(t,i){let n=this.tasks.get(t);return n&&ot(n.owner,z(i))?n:void 0}ownedRecords(t){let i=z(t);return[...this.tasks.values()].filter((n)=>ot(n.owner,i))}evictTerminalTasks(t,i){let n=this.ownedRecords(t).filter((e)=>h(e.status)).sort((e,s)=>e.updatedAt-s.updatedAt);while(this.list(t).length>=i&&n.length>0){let e=n.shift();if(e)this.tasks.delete(e.taskId)}if(this.tasks.size>=S){let e=[...this.tasks.values()].filter((s)=>h(s.status)).sort((s,r)=>s.updatedAt-r.updatedAt);while(this.tasks.size>=S&&e.length>0){let s=e.shift();if(s)this.tasks.delete(s.taskId)}}}}function z(t){if(!t.sessionId)throw Error("MCP task owner requires a Session ID");return{sessionId:t.sessionId,projectPath:Pn.resolve(t.projectPath)}}function ot(t,i){return t.sessionId===i.sessionId&&t.projectPath===i.projectPath}async function Rn(t,i){await new Promise((n,e)=>{let s=()=>i.removeEventListener("abort",d),r=setTimeout(()=>{s(),n()},t);r.unref();let d=()=>{clearTimeout(r),s(),e(new DOMException(String(i.reason||"MCP task cancelled"),"AbortError"))};if(i.addEventListener("abort",d,{once:!0}),i.aborted)d()})}function dt(t,i){let n=t instanceof Error?t.message:String(t);return jt(n.replaceAll(i,"[redacted-task-id]"))}import{createHash as Cn}from"node:crypto";var Nt=64,J=1048576,V=4194304,Gt=4194304,pt=8388608,D=16777216,qt=102400,$n=4096,Ht=8192,kn=256,mn=16384,ct=256,On=8192,Sn=2048;function Y(t){return t!==null&&typeof t==="object"&&!Array.isArray(t)}function gn(t){return[...t].some((i)=>{let n=i.charCodeAt(0);return n===0||n>=1&&n<=8||n===11||n===12||n>=14&&n<=31||n===127})}function Ln(t){return[...t].filter((i)=>{let n=i.charCodeAt(0);return!(n===0||n>=1&&n<=8||n===11||n===12||n>=14&&n<=31||n===127)}).join("")}function F(t,i,n){if(typeof t!=="string")throw Error(`MCP tool ${i} must be a string`);if(gn(t))throw Error(`MCP tool ${i} contains unsafe control characters`);if(Buffer.byteLength(t)>n)throw Error(`MCP tool ${i} exceeds ${n} bytes`);return t}function C(t,i,n){let e=F(t,i,n*4).trim();if(!e||e.length>n)throw Error(`MCP tool ${i} is invalid`);return e}function Kt(t,i,n){let e=Buffer.byteLength(i);if(e>J)throw Error(`MCP tool ${n} exceeds ${J} bytes`);if(t.textBytes+=e,t.textBytes>V)throw Error(`MCP tool text exceeds ${V} total bytes`)}function wt(t,i,n=!1){let e=Buffer.from(t);if(e.length<=i)return t;let r=(n?e.subarray(e.length-i):e.subarray(0,i)).toString("utf8");while(Buffer.byteLength(r)>i)r=n?r.slice(1):r.slice(0,-1);return r.replace(n?/^\uFFFD/:/\uFFFD$/,"")}function Wt(t,i){if(typeof t!=="string")throw Error(`MCP tool ${i} must contain base64 data`);let n=Math.ceil(pt*4/3)+4;if(t.length>n||t.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(t))throw Error(`MCP tool ${i} contains invalid or oversized base64`);let e=Buffer.from(t,"base64");if(e.length>pt)throw Error(`MCP tool ${i} exceeds ${pt} decoded bytes`);return e}async function ut(t,i){let n=Cn("sha256").update(t.bytes).digest("hex"),e={id:n,kind:t.kind,size:t.bytes.length,sha256:n,persisted:!1,...t.mimeType?{mimeType:t.mimeType}:{},...t.sourceUri?{sourceUri:t.sourceUri}:{}};if(!i)return e;try{let s=await i.write(t);return{...e,...s,id:n,sha256:n,size:t.bytes.length}}catch{return e}}function Mt(t){let i=t.path?` path=${JSON.stringify(t.path)}`:t.persisted?` artifact_id=${t.id}`:" content_omitted=true";return`[${t.kind} artifact: size=${t.size} sha256=${t.sha256}${t.mimeType?` mime_type=${JSON.stringify(t.mimeType)}`:""}${t.sourceUri?` uri=${JSON.stringify(t.sourceUri)}`:""}${i}]`}function ln(t){if(t===void 0)return;if(!Y(t))throw Error("MCP tool structuredContent must be an object");let i;try{i=JSON.stringify(t,null,2)}catch{throw Error("MCP tool structuredContent is not serializable")}let n=Buffer.byteLength(i);if(n>Gt)throw Error(`MCP tool structuredContent exceeds ${Gt} bytes`);return{text:i,bytes:n}}async function j(t,i){if(!Y(t)||!Array.isArray(t.content))throw Error("MCP tool result is malformed");if(t.content.length>Nt)throw Error(`MCP tool result exceeds ${Nt} content parts`);let n={textBytes:0,binaryBytes:0},e=[],s=[];for(let[o,p]of t.content.entries()){if(!Y(p))throw Error(`MCP tool content[${o}] is malformed`);if(p.type==="text"){let u=F(p.text,`content[${o}] text`,J);Kt(n,u,`content[${o}] text`),e.push(u);continue}if(p.type==="image"||p.type==="audio"){let u=C(p.mimeType,`content[${o}] MIME type`,ct),M=Wt(p.data,`content[${o}] ${p.type}`);if(n.binaryBytes+=M.length,n.binaryBytes>D)throw Error(`MCP tool binary content exceeds ${D} total bytes`);let w=await ut({kind:p.type,bytes:M,mimeType:u},i);s.push(w),e.push(Mt(w));continue}if(p.type==="resource_link"){let u=C(p.uri,`content[${o}] resource link URI`,Ht),M=C(p.name,`content[${o}] resource link name`,kn),w=p.description===void 0?void 0:F(p.description,`content[${o}] resource link description`,mn),y=p.mimeType===void 0?void 0:C(p.mimeType,`content[${o}] MIME type`,ct);e.push(`[resource link: name=${JSON.stringify(M)} uri=${JSON.stringify(u)}${y?` mime_type=${JSON.stringify(y)}`:""}${w?` description=${JSON.stringify(w)}`:""}]`);continue}if(p.type==="resource"&&Y(p.resource)){let u=p.resource,M=C(u.uri,`content[${o}] resource URI`,Ht),w=u.mimeType===void 0?void 0:C(u.mimeType,`content[${o}] resource MIME type`,ct);if(typeof u.text==="string"){let R=F(u.text,`content[${o}] resource text`,J);Kt(n,R,`content[${o}] resource text`),e.push(`[resource: uri=${JSON.stringify(M)}${w?` mime_type=${JSON.stringify(w)}`:""}]
14
+ ${R}`);continue}let y=Wt(u.blob,`content[${o}] resource blob`);if(n.binaryBytes+=y.length,n.binaryBytes>D)throw Error(`MCP tool binary content exceeds ${D} total bytes`);let f=await ut({kind:"resource",bytes:y,mimeType:w,sourceUri:M},i);s.push(f),e.push(Mt(f));continue}throw Error(`Unsupported MCP tool content type: ${String(p.type)}`)}let r=ln(t.structuredContent);if(r)e.push(`[structuredContent]
15
+ ${r.text}`);let d=e.join(`
16
+
17
+ `)||"MCP tool returned no content.";if(Buffer.byteLength(d)>V)throw Error(`MCP tool normalized result exceeds ${V} bytes`);let c=!1;if(Buffer.byteLength(d)>qt){let o=Buffer.from(d),p=await ut({kind:"text",bytes:o,mimeType:"text/plain"},i);s.push(p);let u=wt(d,On),M=wt(d,Sn,!0);d=`MCP tool result exceeded the ${qt}-byte inline budget.
18
+ ${Mt(p)}
19
+
20
+ Preview (head):
21
+ ${u}
22
+
23
+ Preview (tail):
24
+ ${M}`,c=!0}return{isError:t.isError===!0,llmContent:d,metadata:{contentCount:t.content.length,textBytes:n.textBytes,structuredBytes:r?.bytes??0,artifactCount:s.length,truncated:c,binaryOmitted:n.binaryBytes>0,artifacts:s}}}function yt(t){let i=t instanceof Error?t.message:String(t),n=Ln(i.replace(/\bhttps?:\/\/[^\s"'`]+/gi,"[redacted-url]").replace(/\bBearer\s+\S+/gi,"Bearer [redacted]").replace(/\bsk-[A-Za-z0-9_-]{8,}\b/g,"[redacted]")).trim();return wt(n||"MCP tool execution failed",$n)}function Qt(t,i,n,e,s){let r=n.inputSchema&&typeof n.inputSchema==="object"?g.Unsafe(n.inputSchema):g.Any(),d=e||n.name;return Jt({name:d,displayName:`${i}: ${n.name}`,kind:"execute",schema:r,description:{short:n.description||`MCP Tool: ${n.name}`,important:[`From MCP server: ${i}`,"Executes external tools; user confirmation required",...n.taskSupport==="required"?["This tool requires MCP task execution and returns an opaque task ID.","Use TaskOutput to retrieve the eventual result."]:[]]},category:"MCP tool",tags:["mcp","external",i],async execute(c,o){try{let p={...o.confirmationHandler?{confirmationHandler:o.confirmationHandler}:{},...o.mcpSamplingHandler?{samplingHandler:o.mcpSamplingHandler}:{},...o.onProgressUpdate?{progressHandler:o.onProgressUpdate}:{},...o.sessionId?{sessionId:o.sessionId}:{},...o.workspaceRoot?{workspaceRoot:o.workspaceRoot}:{},...o.permissionMode?{permissionMode:o.permissionMode}:{}};if(n.taskSupport==="required"){if(!o.sessionId)throw Error("MCP tasks require an active Session");let y=await T.getInstance().start({client:t,serverName:i,toolName:n.name,arguments:c,owner:{sessionId:o.sessionId,projectPath:Un.resolve(o.workspaceRoot||Zt())},interactionContext:p,signal:o.signal});return{success:!0,llmContent:{task_id:y.taskId,type:"mcp",status:y.status,message:`MCP task started. Use TaskOutput(task_id: "${y.taskId}") to retrieve its result.`},metadata:{summary:`Started MCP task ${y.taskId}`,serverName:i,toolName:n.name,task_id:y.taskId,taskType:"mcp",taskStatus:y.status,background:!0}}}let u=await t.callTool(n.name,c,{...o.signal?{signal:o.signal}:{},...p}),M=await j(u,s),w={summary:`MCP ${n.name} 执行${M.isError?"失败":"成功"}`,serverName:i,toolName:n.name,mcpResult:{isError:M.isError,...M.metadata}};if(M.isError){let y=yt(M.llmContent);return{success:!1,llmContent:y,error:{type:"execution_error",message:y},metadata:w}}return{success:!0,llmContent:M.llmContent,metadata:w}}catch(p){let u=yt(p);return{success:!1,llmContent:`MCP tool execution failed: ${u}`,error:{type:"execution_error",message:u},metadata:{summary:`MCP ${n.name} 执行失败`,serverName:i,toolName:n.name}}}}})}import{realpathSync as ee}from"node:fs";import Qi from"node:path";import{pathToFileURL as se}from"node:url";import{Client as re}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as oe}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as de}from"@modelcontextprotocol/sdk/client/stdio.js";import{CallToolResultSchema as mt,CreateMessageRequestSchema as pe,ElicitationCompleteNotificationSchema as ce,ElicitRequestSchema as ue,ErrorCode as _,ListRootsRequestSchema as Me,LoggingMessageNotificationSchema as we,McpError as P,ResourceUpdatedNotificationSchema as ye,TaskStatusNotificationSchema as Te}from"@modelcontextprotocol/sdk/types.js";import{EventEmitter as fe}from"events";import Ee from"open";import{EventEmitter as Bn}from"events";function Tt(t,i,n,e,s){if(t===void 0)return i;if(typeof t!=="number"||!Number.isFinite(t)||!Number.isInteger(t)||t<e||t>s)throw Error(`${n} must be an integer between ${e} and ${s}`);return t}class ft extends Bn{client;config;checkTimer=null;isChecking=!1;running=!1;consecutiveFailures=0;lastCheckTime=0;currentStatus="healthy";constructor(t,i={}){super();if(this.client=t,i.enabled!==void 0&&typeof i.enabled!=="boolean")throw Error("MCP health check enabled must be a boolean");this.config={interval:Tt(i.interval,30000,"MCP health check interval",10,300000),timeout:Tt(i.timeout,1e4,"MCP health check timeout",10,60000),enabled:i.enabled??!1,failureThreshold:Tt(i.failureThreshold,3,"MCP health check failureThreshold",1,10)}}start(){if(this.running||!this.config.enabled)return;this.running=!0,this.scheduleNextCheck()}stop(){if(this.running=!1,this.checkTimer)clearTimeout(this.checkTimer),this.checkTimer=null}scheduleNextCheck(){if(!this.running)return;this.checkTimer=setTimeout(async()=>{this.checkTimer=null,await this.performHealthCheck().catch(()=>{return}),this.scheduleNextCheck()},this.config.interval),this.checkTimer.unref()}async performHealthCheck(){if(this.isChecking)return this.getLastResult();this.isChecking=!0,this.lastCheckTime=Date.now(),this.setStatus("checking");try{let t=this.client.connectionStatus;if(t==="connected"){await this.client.ping(this.config.timeout),this.consecutiveFailures=0,this.setStatus("healthy");let i={status:"healthy",timestamp:Date.now(),consecutiveFailures:0};return this.emit("healthCheck",i),i}else throw Error(`连接状态异常: ${t}`)}catch(t){this.consecutiveFailures++;let i=t,n;if(this.consecutiveFailures>=this.config.failureThreshold)n="unhealthy",this.emit("unhealthy",this.consecutiveFailures,i),this.client.requestRecovery(i,"health_check");else n="degraded";this.setStatus(n);let e={status:n,timestamp:Date.now(),consecutiveFailures:this.consecutiveFailures,lastError:i};return this.emit("healthCheck",e),e}finally{this.isChecking=!1}}setStatus(t){if(this.currentStatus!==t){let i=this.currentStatus;this.currentStatus=t,this.emit("statusChanged",t,i)}}getLastResult(){return{status:this.currentStatus,timestamp:this.lastCheckTime,consecutiveFailures:this.consecutiveFailures}}async checkNow(){return this.performHealthCheck()}resetFailureCount(){if(this.consecutiveFailures=0,this.currentStatus!=="checking")this.setStatus("healthy")}}import{createHash as Xn}from"node:crypto";import{UriTemplate as zn}from"@modelcontextprotocol/sdk/shared/uriTemplate.js";var vt=100,Dn=4096,Yn=65536,Et=1048576,ti=32,ii=65536,oi=4,bt=15000,ni=256,ei=16384,Fn=256,Jn=8192,Vn=/[\p{Cf}\p{Co}\p{Cn}]/u;function jn(t){return[...new Set(new zn(t).variableNames)]}function di(t,i){let n=N(t.argument.name,"completion argument name",ni),e=si(t.argument.value,"completion argument value",ei),s,r;if(t.reference.type==="prompt"){let p=N(t.reference.name,"completion prompt name",Fn),u=i.prompts.find((M)=>M.name===p);if(!u)throw Error(`MCP prompt "${p}" is not present in the current catalog`);s=new Set(u.arguments.map((M)=>M.name)),r={type:"ref/prompt",name:p}}else{let p=N(t.reference.uri,"completion resource template URI",Jn);if(!i.resourceTemplates.find((w)=>w.uriTemplate===p))throw Error(`MCP resource template "${p}" is not present in the current catalog`);let M;try{M=jn(p)}catch{throw Error(`MCP resource template "${p}" is invalid`)}s=new Set(M),r={type:"ref/resource",uri:p}}if(!s.has(n))throw Error(`MCP ${t.reference.type} completion argument "${n}" is not declared`);let d=Object.entries(t.context??{});if(d.length>ti)throw Error(`MCP completion context exceeds ${ti} arguments`);let c=Object.create(null),o=0;for(let[p,u]of d){let M=N(p,"completion context argument name",ni);if(Mi(M))throw Error(`Unsafe MCP completion context argument "${M}"`);if(!s.has(M))throw Error(`Unknown MCP completion context argument "${M}"`);let w=si(u,`completion context argument "${M}"`,ei);if(o+=Buffer.byteLength(M)+Buffer.byteLength(w),o>ii)throw Error(`MCP completion context exceeds ${ii} bytes`);c[M]=w}return{ref:r,argument:{name:n,value:e},...d.length>0?{context:{arguments:c}}:{}}}function pi(t){let i=t.completion,n=JSON.stringify(i),e=Buffer.byteLength(n),s=Xn("sha256").update(n).digest("hex"),r=i.values.length,d=[],c=new Set,o=0,p=0,u=r>vt||e>Et;for(let w of i.values.slice(0,vt)){let y=Buffer.byteLength(w),f=Math.max(0,Et-p);if(f===0){u=!0;break}let R=ri(w,Math.min(Et,f));if(p+=Buffer.byteLength(R),y>Buffer.byteLength(R))u=!0;let zt=ci(R),O=ri(zt,Dn);if(Buffer.byteLength(O)<Buffer.byteLength(zt))u=!0;if(c.has(O))continue;let Dt=Buffer.byteLength(O);if(o+Dt>Yn){u=!0;break}c.add(O),d.push(O),o+=Dt}if(d.length<r)u=!0;let M=i.total!==void 0&&Number.isSafeInteger(i.total)&&i.total>=0?i.total:void 0;return{values:d,...M!==void 0?{total:M}:{},hasMore:i.hasMore===!0||u||M!==void 0&&M>d.length,sourceValueCount:r,sourceBytes:e,projectedBytes:o,sha256:s,truncated:u}}function ci(t){return[...t.normalize("NFKC")].filter((i)=>{let n=i.codePointAt(0)??0;if(n<32||n===127)return!1;return!Vn.test(i)}).join("")}function N(t,i,n){if(typeof t!=="string"||!t||Buffer.byteLength(t)>n)throw Error(`MCP ${i} is invalid`);if(ci(t)!==t||ui(t))throw Error(`MCP ${i} contains unsafe characters`);if(Mi(t))throw Error(`MCP ${i} is unsafe`);return t}function si(t,i,n){if(typeof t!=="string"||Buffer.byteLength(t)>n)throw Error(`MCP ${i} exceeds ${n} bytes`);if(ui(t))throw Error(`MCP ${i} contains control characters`);return t}function ui(t){return[...t].some((i)=>{let n=i.codePointAt(0)??0;return n<32||n===127})}function Mi(t){return["__proto__","constructor","prototype"].includes(t)}function ri(t,i){let n=Buffer.from(t);if(n.length<=i)return t;let e=n.subarray(0,Math.max(0,i)).toString("utf8");while(Buffer.byteLength(e)>i)e=e.slice(0,-1);return e}var ht=20,At=300000;function wi(t,i,n,e,s){if(t===void 0)return i;if(typeof t!=="number"||!Number.isFinite(t))throw Error(`${n} must be a finite number`);if(t<e||t>s)throw Error(`${n} must be between ${e} and ${s}`);return t}function G(t,i,n,e,s){let r=wi(t,i,n,e,s);if(!Number.isInteger(r))throw Error(`${n} must be an integer`);return r}function yi(t){let i=t.recovery;if(i!==void 0&&(i===null||typeof i!=="object"||Array.isArray(i)))throw Error("MCP recovery configuration must be an object");let n=i?.enabled??!0;if(typeof n!=="boolean")throw Error("MCP recovery enabled must be a boolean");let e=G(i?.maxAttempts,5,"MCP recovery maxAttempts",0,20),s=G(i?.initialDelayMs,1000,"MCP recovery initialDelayMs",10,300000),r=G(i?.maxDelayMs,30000,"MCP recovery maxDelayMs",s,300000),d=wi(i?.jitterRatio,0.2,"MCP recovery jitterRatio",0,1),c=G(i?.terminalErrorThreshold,3,"MCP recovery terminalErrorThreshold",1,10);return{enabled:n,maxAttempts:e,initialDelayMs:s,maxDelayMs:r,jitterRatio:d,terminalErrorThreshold:c}}function Ti(t,i,n=Math.random){let e=Math.max(0,i-1),s=Math.min(t.initialDelayMs*2**e,t.maxDelayMs);if(t.jitterRatio===0)return s;let r=Math.min(1,Math.max(0,n())),d=1-t.jitterRatio+2*t.jitterRatio*r;return Math.max(0,Math.round(s*d))}function k(t){let n=(t instanceof Error?t.message:String(t)).replace(/\bhttps?:\/\/[^\s"'`]+/gi,"[redacted-url]").replace(/\bBearer\s+\S+/gi,"Bearer [redacted]").replace(/\bsk-[A-Za-z0-9_-]{8,}\b/g,"[redacted]").replace(/[\r\n\t]+/g," ").trim();if(Buffer.byteLength(n)<=512)return n;let e=Buffer.from(n).subarray(0,512).toString("utf8");while(Buffer.byteLength(e)>512)e=e.slice(0,-1);return e}function fi(t){let n=(t instanceof Error?t.message:String(t)).toLowerCase();return(n.includes("404")||n.includes("-32001"))&&(n.includes("session")||n.includes("not found"))}function Ei(t){let n=(t instanceof Error?t.message:String(t)).toLowerCase();return["econnreset","etimedout","epipe","ehostunreach","econnrefused","body timeout error","socket hang up","connection closed","connection terminated","sse stream disconnected","failed to reconnect sse stream","maximum reconnection attempts"].some((e)=>n.includes(e))}function $(t){return new DOMException(String(t||"MCP connection recovery cancelled"),"AbortError")}async function at(t,i,n=!0){if(i.aborted)throw $(i.reason);await new Promise((e,s)=>{let d=setTimeout(()=>{i.removeEventListener("abort",c),e()},t);if(n)d.unref();let c=()=>{clearTimeout(d),i.removeEventListener("abort",c),s($(i.reason))};i.addEventListener("abort",c,{once:!0})})}import{createHash as Pi}from"node:crypto";var _t=100,q=1000,H=1000,K=1000,Pt=100,bi=64,W=1048576,a=4194304,A=256,Q=8192,L=256,l=16384,hi=64,Nn=4096,Ai=4194304,ai=128;function Ri(t){return[...t].some((i)=>{let n=i.charCodeAt(0);return n<=31||n===127})}function Gn(t){return[...t].some((i)=>{let n=i.charCodeAt(0);return n===0||n>=1&&n<=8||n===11||n===12||n>=14&&n<=31||n===127})}function E(t,i,n){if(t===void 0)return;if(i==="description"?Gn(t):Ri(t))throw Error(`MCP ${i} contains control characters`);if(Buffer.byteLength(t)>n)throw Error(`MCP ${i} exceeds ${n} bytes`);return t}function b(t,i,n){let e=t.trim();if(!e||e.length>n||Ri(e))throw Error(`MCP ${i} is invalid`);return e}function Rt(t){return Buffer.byteLength(JSON.stringify(t))}function Ct(t,i){if(Rt(t)>Ai)throw Error(`MCP ${i} catalog exceeds ${Ai} bytes`)}function Z(t,i){let n=new Set;for(let e of t){if(n.has(e))throw Error(`MCP ${i} catalog contains duplicate "${e}"`);n.add(e)}}function Ci(t){if(t.length>q)throw Error(`MCP resource catalog exceeds ${q} entries`);let i=t.map((n)=>({uri:b(n.uri,"resource URI",Q),name:b(n.name,"resource name",A),...E(n.title,"resource title",A)?{title:n.title}:{},...E(n.description,"description",l)?{description:n.description}:{},...E(n.mimeType,"resource MIME type",L)?{mimeType:n.mimeType}:{},...n.size!==void 0&&Number.isSafeInteger(n.size)&&n.size>=0?{size:n.size}:{}}));return Z(i.map((n)=>n.uri),"resource"),Ct(i,"resource"),i}function $i(t){if(t.length>H)throw Error(`MCP resource template catalog exceeds ${H} entries`);let i=t.map((n)=>({uriTemplate:b(n.uriTemplate,"resource template URI",Q),name:b(n.name,"resource template name",A),...E(n.title,"resource template title",A)?{title:n.title}:{},...E(n.description,"description",l)?{description:n.description}:{},...E(n.mimeType,"resource template MIME type",L)?{mimeType:n.mimeType}:{}}));return Z(i.map((n)=>n.uriTemplate),"resource template"),Ct(i,"resource template"),i}function ki(t){if(t.length>K)throw Error(`MCP prompt catalog exceeds ${K} entries`);let i=t.map((n)=>{if((n.arguments?.length??0)>hi)throw Error(`MCP prompt "${n.name}" exceeds ${hi} arguments`);let e=(n.arguments??[]).map((s)=>{let r=b(s.name,"prompt argument name",A);if(["__proto__","constructor","prototype"].includes(r))throw Error(`MCP prompt argument name "${r}" is unsafe`);return{name:r,...E(s.description,"description",Nn)?{description:s.description}:{},required:s.required===!0}});return Z(e.map((s)=>s.name),`prompt "${n.name}" argument`),{name:b(n.name,"prompt name",A),...E(n.title,"prompt title",A)?{title:n.title}:{},...E(n.description,"description",l)?{description:n.description}:{},arguments:e}});return Z(i.map((n)=>n.name),"prompt"),Ct(i,"prompt"),i}function _i(t){return Pi("sha256").update(JSON.stringify(t)).digest("hex")}function I(t,i,n){let e=new Map(t.map((r)=>[n(r),_i(r)])),s=new Map(i.map((r)=>[n(r),_i(r)]));return{added:[...s.keys()].filter((r)=>!e.has(r)).sort(),removed:[...e.keys()].filter((r)=>!s.has(r)).sort(),updated:[...s.keys()].filter((r)=>e.has(r)&&e.get(r)!==s.get(r)).sort()}}function mi(t){return t.added.length>0||t.removed.length>0||t.updated.length>0}function $t(t,i,n){if(t.bytes+=i,t.bytes>a)throw Error(`MCP ${n} exceeds ${a} total bytes`)}function Oi(t,i,n){if(t.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(t))throw Error(`MCP ${i} contains invalid base64`);let e=Buffer.from(t,"base64");if(e.length>a)throw Error(`MCP ${i} exceeds ${a} decoded bytes`);return $t(n,e.length,i),{size:e.length,sha256:Pi("sha256").update(e).digest("hex"),omitted:!0}}function Si(t,i){let n=b(typeof t.uri==="string"?t.uri:"","resource content URI",Q),e=typeof t.mimeType==="string"?E(t.mimeType,"resource MIME type",L):void 0;if(typeof t.text==="string"){let s=Buffer.byteLength(t.text);if(s>W)throw Error(`MCP resource text exceeds ${W} bytes`);return $t(i,s,"resource result"),{uri:n,...e?{mimeType:e}:{},text:t.text}}if(typeof t.blob==="string")return{uri:n,...e?{mimeType:e}:{},binary:Oi(t.blob,"resource blob",i)};throw Error("MCP resource content has neither text nor blob data")}function gi(t){let i=t&&typeof t==="object"&&Array.isArray(t.contents)?t.contents:[];if(i.length>bi)throw Error(`MCP resource result exceeds ${bi} contents`);let n={bytes:0},e=i.map((s)=>{if(!s||typeof s!=="object"||Array.isArray(s))throw Error("MCP resource content is malformed");return Si(s,n)});if(Rt(e)>a)throw Error(`MCP resource result exceeds ${a} bytes`);return{contents:e}}function Li(t){if(!t||typeof t!=="object"||Array.isArray(t))throw Error("MCP prompt result is malformed");let i=t,n=Array.isArray(i.messages)?i.messages:[];if(n.length>ai)throw Error(`MCP prompt exceeds ${ai} messages`);let e={bytes:0},s=n.map((r)=>{if(!r||typeof r!=="object"||Array.isArray(r))throw Error("MCP prompt message is malformed");let d=r,c=d.role;if(c!=="user"&&c!=="assistant")throw Error("MCP prompt message has an invalid role");let o=d.content;if(!o||typeof o!=="object"||Array.isArray(o))throw Error("MCP prompt message content is malformed");let p=o;if(p.type==="text"&&typeof p.text==="string"){let u=Buffer.byteLength(p.text);if(u>W)throw Error(`MCP prompt text exceeds ${W} bytes`);return $t(e,u,"prompt result"),{role:c,content:{type:"text",text:p.text}}}if((p.type==="image"||p.type==="audio")&&typeof p.data==="string"&&typeof p.mimeType==="string")return{role:c,content:{type:p.type,mimeType:b(p.mimeType,"prompt content MIME type",L),binary:Oi(p.data,`prompt ${p.type}`,e)}};if(p.type==="resource"&&p.resource&&typeof p.resource==="object"&&!Array.isArray(p.resource))return{role:c,content:{type:"resource",resource:Si(p.resource,e)}};if(p.type==="resource_link"&&typeof p.uri==="string"&&typeof p.name==="string")return{role:c,content:{type:"resource_link",uri:b(p.uri,"prompt resource link URI",Q),name:b(p.name,"prompt resource link name",A),...typeof p.mimeType==="string"?{mimeType:b(p.mimeType,"prompt resource link MIME type",L)}:{},...typeof p.description==="string"?{description:E(p.description,"description",l)}:{}}};throw Error(`Unsupported MCP prompt content type: ${String(p.type)}`)});if(Rt(s)>a)throw Error(`MCP prompt result exceeds ${a} bytes`);return{...typeof i.description==="string"?{description:E(i.description,"description",l)}:{},messages:s}}var li=4000,xi=4096,Ui=32,qn=128,Bi=1000,Xi=100,zi=65536,Hn=new Set(["__proto__","constructor","prototype"]);function Di(t,i){if(!t.trim())throw Error("MCP elicitation server name is empty");if(!i.message.trim())throw Error("MCP elicitation message is empty");if(i.message.length>li)throw Error(`MCP elicitation message exceeds ${li} characters`);if(i.mode==="url"){let s=Qn(i.url);if(!i.elicitationId.trim())throw Error("MCP URL elicitation ID is empty");return{serverName:t,mode:"url",message:i.message,url:s.toString(),domain:s.hostname,elicitationId:i.elicitationId}}let n=Object.entries(i.requestedSchema.properties);if(n.length>Ui)throw Error(`MCP elicitation exceeds the ${Ui} field limit`);let e=new Set(i.requestedSchema.required??[]);for(let s of e)if(!Object.hasOwn(i.requestedSchema.properties,s))throw Error(`MCP elicitation requires an unknown field: ${s}`);return{serverName:t,mode:"form",message:i.message,fields:n.map(([s,r])=>Kn(s,r,e.has(s))),requestedSchema:structuredClone(i.requestedSchema)}}function ve(t){let i=Object.create(null);for(let n of t.fields??[])if(n.defaultValue!==void 0)i[n.name]=Array.isArray(n.defaultValue)?[...n.defaultValue]:n.defaultValue;return i}function ts(t,i){let n=i.trim();if(!n){if(t.defaultValue!==void 0)return t.defaultValue;if(!t.required)return;throw Error(`${t.title} is required`)}if(t.type==="number"||t.type==="integer"){let e=Number(n);if(!Number.isFinite(e))throw Error(`${t.title} must be a finite number`);if(t.type==="integer"&&!Number.isSafeInteger(e))throw Error(`${t.title} must be a safe integer`);return e}if(t.type==="boolean"){if(["true","yes","y","1"].includes(n.toLowerCase()))return!0;if(["false","no","n","0"].includes(n.toLowerCase()))return!1;throw Error(`${t.title} must be true or false`)}return n}function Yi(t,i){if(i.action!=="accept")return{action:i.action};if(t.mode==="url")return{action:"accept"};if(!t.requestedSchema)throw Error("MCP form elicitation schema is unavailable");let n=i.content??{};if(Buffer.byteLength(JSON.stringify(n),"utf8")>zi)throw Error(`MCP elicitation response exceeds ${zi} bytes`);for(let r of Object.keys(n))Fi(r);for(let r of Object.values(n))if(typeof r==="number"&&(!Number.isFinite(r)||Number.isInteger(r)&&!Number.isSafeInteger(r)))throw Error("MCP elicitation response contains an unsafe number");let e=g.Unsafe({...t.requestedSchema,additionalProperties:!1}),s=X(e,n);if(!s.success)throw Error(`Invalid MCP elicitation response: ${s.error.message}`);return{action:"accept",content:s.data}}function Kn(t,i,n){Fi(t);let e=tt(i.title?.trim()||t,"field title"),s=i.description?tt(i.description,"field description"):void 0,r={name:t,title:e,description:s,required:n};if(i.type==="boolean")return{...r,type:"boolean",...typeof i.default==="boolean"?{defaultValue:i.default}:{}};if(i.type==="number"||i.type==="integer")return{...r,type:i.type,...typeof i.default==="number"?{defaultValue:i.default}:{},...i.minimum!==void 0?{minimum:i.minimum}:{},...i.maximum!==void 0?{maximum:i.maximum}:{}};if(i.type==="array"){let c=Zn(i);return{...r,type:"multi-select",options:c,...Array.isArray(i.default)&&i.default.every((o)=>typeof o==="string")?{defaultValue:[...i.default]}:{},...i.minItems!==void 0?{minItems:i.minItems}:{},...i.maxItems!==void 0?{maxItems:i.maxItems}:{}}}let d=Wn(i);if(d)return{...r,type:"select",options:d,...typeof i.default==="string"?{defaultValue:i.default}:{}};return{...r,type:"string",...typeof i.default==="string"?{defaultValue:i.default}:{},...i.format?{format:i.format}:{},...i.minLength!==void 0?{minLength:i.minLength}:{},...i.maxLength!==void 0?{maxLength:i.maxLength}:{}}}function Wn(t){if(t.oneOf)return v(t.oneOf.map((i)=>({value:i.const,label:i.title})));if(!t.enum)return;return v(t.enum.map((i,n)=>({value:i,label:t.enumNames?.[n]??i})))}function Zn(t){if(t.items?.anyOf)return v(t.items.anyOf.map((i)=>({value:i.const,label:i.title})));if(t.items?.enum)return v(t.items.enum.map((i)=>({value:i,label:i})));throw Error("MCP multi-select elicitation is missing enum options")}function v(t){if(t.length===0||t.length>Xi)throw Error(`MCP elicitation options must contain 1-${Xi} items`);let i=new Set;return t.map((n)=>{if(i.has(n.value))throw Error(`MCP elicitation contains duplicate option: ${n.value}`);return i.add(n.value),{value:tt(n.value,"option value"),label:tt(n.label,"option label")}})}function Fi(t){if(!t||t.length>qn||Hn.has(t))throw Error(`Unsafe MCP elicitation field name: ${t||"(empty)"}`)}function tt(t,i){if(t.length>Bi)throw Error(`MCP elicitation ${i} exceeds ${Bi} characters`);return t}function Qn(t){if(t.length>xi)throw Error(`MCP elicitation URL exceeds ${xi} characters`);let i;try{i=new URL(t)}catch{throw Error("MCP elicitation URL is invalid")}if(!["http:","https:"].includes(i.protocol))throw Error(`MCP elicitation URL protocol is not allowed: ${i.protocol}`);if(i.username||i.password)throw Error("MCP elicitation URL must not contain credentials");return i}import{createHash as qi}from"node:crypto";var x=1000,it=100,In=256,Ji=16384,Vi=262144,ji=4194304,Ni=24;function vn(t,i=10){return qi("sha256").update(t).digest("hex").slice(0,i)}function kt(t){if(Array.isArray(t))return t.map(kt);if(!t||typeof t!=="object")return t;let i=t;return Object.fromEntries(Object.keys(i).sort().map((n)=>[n,kt(i[n])]))}function Hi(t){let i=t.normalize("NFKC"),n=i.replace(/[^A-Za-z0-9_-]/g,"_");if(n&&n===i&&n.length<=Ni)return n;return`${(n||"unnamed").slice(0,Ni-11)}_${vn(i)}`}function Ki(t,i){return`${te(t)}${Hi(i)}`}function te(t){return`mcp__${Hi(t)}__`}function Gi(t){return qi("sha256").update(JSON.stringify(kt({name:t.name,description:t.description,inputSchema:t.inputSchema,taskSupport:t.taskSupport}))).digest("hex")}function ie(t){return[...t].some((i)=>{let n=i.charCodeAt(0);return n<=31||n===127})}function Wi(t){if(t.length>x)throw Error(`MCP tool catalog exceeds ${x} tools`);let i=new Set,n=[],e=0;for(let s of t){let r=s.name.trim();if(!r||r.length>In||ie(r))throw Error("MCP tool catalog contains an invalid tool name");if(i.has(r))throw Error(`MCP tool catalog contains duplicate tool "${r}"`);i.add(r);let d=s.description??"";if(Buffer.byteLength(d)>Ji)throw Error(`MCP tool "${r}" description exceeds ${Ji} bytes`);let c=JSON.stringify(s.inputSchema),o=Buffer.byteLength(c);if(o>Vi)throw Error(`MCP tool "${r}" schema exceeds ${Vi} bytes`);if(e+=Buffer.byteLength(r)+Buffer.byteLength(d)+o,e>ji)throw Error(`MCP tool catalog exceeds ${ji} bytes`);n.push({name:r,description:d,inputSchema:JSON.parse(c),...s.execution?.taskSupport?{taskSupport:s.execution.taskSupport}:{}})}return n}function Zi(t,i){let n=new Map(t.map((s)=>[s.name,Gi(s)])),e=new Map(i.map((s)=>[s.name,Gi(s)]));return{added:[...e.keys()].filter((s)=>!n.has(s)).sort(),removed:[...n.keys()].filter((s)=>!e.has(s)).sort(),updated:[...e.keys()].filter((s)=>n.has(s)&&n.get(s)!==e.get(s)).sort()}}function nt(t){return t.added.length>0||t.removed.length>0||t.updated.length>0}function Ii(t){if(t instanceof Bt||t instanceof U)return{type:"auth_error",isRetryable:!1,originalError:t};if(!(t instanceof Error))return{type:"unknown",isRetryable:!1,originalError:Error(String(t))};let i=t.message.toLowerCase();if(["command not found","no such file","permission denied","invalid configuration","malformed","syntax error"].some((s)=>i.includes(s)))return{type:"config_error",isRetryable:!1,originalError:t};if(i.includes("unauthorized")||i.includes("401")||i.includes("authentication failed"))return{type:"auth_error",isRetryable:!1,originalError:t};if(["timeout","connection refused","network error","temporary","try again","rate limit","too many requests","service unavailable","socket hang up","econnreset","enotfound","econnrefused","etimedout","503","429"].some((s)=>i.includes(s)))return{type:"network_temporary",isRetryable:!0,originalError:t};return{type:"unknown",isRetryable:!0,originalError:t}}class Xt extends fe{config;runtimeOptions;status="disconnected";sdkClient=null;tools=new Map;toolCatalogRevision=0;toolRefreshPromise;toolRefreshRequested=!1;resources=[];resourceTemplates=[];prompts=[];contentCatalogRevision=0;contentRefreshPromise;requestedContentCatalogs=new Set;contentRefreshReason="manual";catalogGeneration=0;desiredResourceSubscriptions=new Set;activeResourceSubscriptions=new Set;serverInfo=null;serverInstructions;completionCallsInFlight=0;loggingPolicy;logWindowStartedAt=0;logEventsInWindow=0;logRateWarningEmitted=!1;recoveryPolicy;desiredConnected=!1;connectionGeneration=0;connectPromise;connectAbortController;recoveryPromise;recoveryAbortController;recoveryState;consecutiveTerminalErrors=0;oauthProvider=null;serverName;healthMonitor=null;activeInteraction;taskInteractions=new Map;taskPolicy;roots;constructor(t,i,n,e={}){super();this.config=t;this.runtimeOptions=e;this.serverName=i||"default",this.recoveryPolicy=yi(t),this.loggingPolicy=on(t),this.taskPolicy=wn(t.tasks),this.roots=(e.roots??[]).map((r)=>{let d=ee.native(Qi.resolve(r));return{uri:se(d).href,name:Qi.basename(d)||d}});let s=vi(t);if(this.config={...t,...s?{oauth:s}:{}},s?.enabled&&t.url&&e.oauthCredentialAccess!==!1)this.oauthProvider=new sn(this.serverName,t.url,s,e.oauthStorageRoot?{tokenStorage:new en(e.oauthStorageRoot)}:{});if(n?.enabled)this.healthMonitor=new ft(this,n),this.healthMonitor.on("unhealthy",(r,d)=>{this.emit("unhealthy",r,d)})}get connectionStatus(){return this.status}get availableTools(){return Array.from(this.tools.values())}get contentCatalog(){return{resources:structuredClone(this.resources),resourceTemplates:structuredClone(this.resourceTemplates),prompts:structuredClone(this.prompts)}}get completionSupported(){return Boolean(this.sdkClient?.getServerCapabilities()?.completions)}get tasks(){return{...this.taskPolicy}}get instructions(){return this.serverInstructions?structuredClone(this.serverInstructions):void 0}get logging(){return{...this.loggingPolicy}}get oauthEnabled(){return this.config.oauth?.enabled===!0}async getOAuthStatus(){if(!this.oauthEnabled)return"disabled";if(this.runtimeOptions.oauthCredentialAccess===!1)return"unavailable";return this.oauthProvider?.getStatus()??"error"}async beginOAuthLogin(t={}){if(!this.oauthEnabled)throw Error(`MCP server "${this.serverName}" does not enable OAuth`);if(this.runtimeOptions.oauthCredentialAccess===!1||!this.oauthProvider)throw new U(this.serverName);return t.openBrowser?this.oauthProvider.openAuthorization():this.oauthProvider.beginAuthorization()}async logoutOAuth(){if(!this.oauthEnabled)throw Error(`MCP server "${this.serverName}" does not enable OAuth`);if(this.runtimeOptions.oauthCredentialAccess===!1||!this.oauthProvider)throw new U(this.serverName);if(this.status!=="disconnected")await this.disconnect();await this.oauthProvider.logout()}async connect(){return this.connectWithRetry(3,1000)}async connectWithRetry(t=3,i=1000){if(!Number.isInteger(t)||t<1||t>ht)throw Error(`MCP connection maxRetries must be an integer between 1 and ${ht}`);if(!Number.isFinite(i)||i<0||i>At)throw Error(`MCP connection initialDelay must be between 0 and ${At}`);if(this.status==="connected")return;if(this.recoveryPromise)return this.recoveryPromise;if(this.connectPromise)return this.connectPromise;this.desiredConnected=!0;let n=++this.connectionGeneration,e=new AbortController;this.connectAbortController=e;let s=this.runInitialConnection(Math.max(1,t),Math.max(0,i),n,e.signal).finally(()=>{if(this.connectPromise===s)this.connectPromise=void 0;if(this.connectAbortController===e)this.connectAbortController=void 0});return this.connectPromise=s,s}async runInitialConnection(t,i,n,e){let s;for(let d=1;d<=t;d++){this.assertConnectionGeneration(n,e);try{await this.doConnect(n,!1);return}catch(c){if(!this.isConnectionGenerationCurrent(n)||e.aborted)throw $(e.reason);if(s=c instanceof Error?c:Error(String(c)),!Ii(s).isRetryable||d===t)break;await at(i*2**Math.max(0,d-1),e,!1)}}let r=s??Error("MCP connection failed");if(this.isConnectionGenerationCurrent(n))this.invalidateLiveConnection(!1),this.setStatus("error"),this.emitClientError(r);throw r}async doConnect(t,i){let n;try{this.assertConnectionGeneration(t),this.setStatus(i?"reconnecting":"connecting");let e=un(this.config.sampling),s={...e,enabled:e.enabled&&this.runtimeOptions.samplingAvailable===!0};n=new re({name:nn(),version:tn()},{capabilities:{roots:{listChanged:!1},elicitation:{form:{applyDefaults:!1},url:{}},...s.enabled?{sampling:{}}:{}},listChanged:{tools:{autoRefresh:!1,debounceMs:0,onChanged:()=>{this.refreshTools("notification")}},resources:{autoRefresh:!1,debounceMs:0,onChanged:()=>{this.refreshContentCatalogs("notification",["resources"])}},prompts:{autoRefresh:!1,debounceMs:0,onChanged:()=>{this.refreshContentCatalogs("notification",["prompts"])}}}});let r=n;if(this.sdkClient=r,this.resetCatalogRefreshState(),this.registerElicitationHandlers(r),this.registerRootHandler(r),s.enabled)this.registerSamplingHandler(r,s);if(this.registerResourceNotificationHandler(r),this.registerLoggingHandler(r),this.taskPolicy.enabled)this.registerTaskStatusHandler(r);r.onclose=()=>{this.handleUnexpectedClose(r,t)},r.onerror=(o)=>{this.handleTransportError(r,t,o)};let d=await this.createTransport();this.assertConnectionGeneration(t),await r.connect(d),this.assertConnectionGeneration(t);let c=r.getServerVersion();this.serverInfo={name:c?.name||"Unknown",version:c?.version||"0.0.0"},this.serverInstructions=yn(r.getInstructions(),{exposeDetails:this.runtimeOptions.exposeInstructions}),await this.configureLogging(r),await this.refreshTools("initial"),await this.refreshContentCatalogs("initial").catch(()=>{return}),await this.reconcileResourceSubscriptions(r),this.assertConnectionGeneration(t),this.consecutiveTerminalErrors=0,this.setStatus("connected"),this.emit("connected",this.serverInfo),this.healthMonitor?.resetFailureCount(),this.healthMonitor?.start()}catch(e){if(n&&this.sdkClient===n)this.sdkClient=null;if(n)n.onclose=void 0,n.onerror=void 0,await n.close().catch(()=>{return});throw e}}handleUnexpectedClose(t,i){if(this.sdkClient!==t||!this.isConnectionGenerationCurrent(i)||this.status!=="connected")return;this.startRecovery(Error(`MCP server "${this.serverName}" connection closed`),"transport_closed",!1)}handleTransportError(t,i,n){if(this.sdkClient!==t||!this.isConnectionGenerationCurrent(i)||this.status!=="connected")return;if(this.emit("transportError",{serverName:this.serverName,error:k(n)}),fi(n)){this.startRecovery(n,"session_expired",!0);return}if(!Ei(n)){this.consecutiveTerminalErrors=0;return}if(this.consecutiveTerminalErrors++,n.message.toLowerCase().includes("maximum reconnection attempts")||this.consecutiveTerminalErrors>=this.recoveryPolicy.terminalErrorThreshold)this.startRecovery(n,"transport_error",!0)}requestRecovery(t,i){if(!this.desiredConnected||this.status!=="connected"||this.recoveryPromise)return;this.startRecovery(t,i,!0)}startRecovery(t,i,n){if(!this.desiredConnected||this.recoveryPromise)return;let e=this.sdkClient;if(this.sdkClient=null,e)e.onclose=void 0,e.onerror=void 0;this.healthMonitor?.stop(),this.invalidateLiveConnection(!0);let s=++this.connectionGeneration,r=new AbortController;if(this.recoveryAbortController=r,this.setStatus("reconnecting"),n&&e)e.close().catch(()=>{return});let d=Promise.resolve().then(()=>this.runRecoveryLoop(t,i,s,r.signal)).finally(()=>{if(this.recoveryPromise===d)this.recoveryPromise=void 0;if(this.recoveryAbortController===r)this.recoveryAbortController=void 0});this.recoveryPromise=d,d.catch(()=>{return})}async runRecoveryLoop(t,i,n,e){let s=t;if(!this.recoveryPolicy.enabled||this.recoveryPolicy.maxAttempts===0){this.failRecovery(s,i,0,n);return}for(let r=1;r<=this.recoveryPolicy.maxAttempts;r++){this.assertConnectionGeneration(n,e);let d=Ti(this.recoveryPolicy,r,this.runtimeOptions.recoveryRandom),c=Date.now()+d;this.publishConnectionLifecycle({phase:"reconnecting",reason:i,attempt:r,maxAttempts:this.recoveryPolicy.maxAttempts,nextRetryAt:c,error:k(s)}),await at(d,e),this.assertConnectionGeneration(n,e);try{await this.doConnect(n,!0),this.healthMonitor?.resetFailureCount(),this.publishConnectionLifecycle({phase:"recovered",reason:i,attempt:r,maxAttempts:this.recoveryPolicy.maxAttempts}),this.emit("reconnected");return}catch(o){if(!this.isConnectionGenerationCurrent(n)||e.aborted)throw $(e.reason);if(s=o instanceof Error?o:Error(String(o)),!Ii(s).isRetryable){this.failRecovery(s,i,r,n);return}}}this.failRecovery(s,i,this.recoveryPolicy.maxAttempts,n)}failRecovery(t,i,n,e){if(!this.isConnectionGenerationCurrent(e))return;this.setStatus("error"),this.publishConnectionLifecycle({phase:"failed",reason:i,attempt:n,maxAttempts:this.recoveryPolicy.maxAttempts,error:k(t)}),this.emit("reconnectFailed",t)}publishConnectionLifecycle(t){this.recoveryState=structuredClone(t),this.emit("connectionLifecycleChanged",structuredClone(t))}isConnectionGenerationCurrent(t){return this.desiredConnected&&this.connectionGeneration===t}assertConnectionGeneration(t,i){if(i?.aborted||!this.desiredConnected||this.connectionGeneration!==t)throw $(i?.reason)}invalidateLiveConnection(t){if(this.resetCatalogRefreshState(),this.tools.clear(),this.resources=[],this.resourceTemplates=[],this.prompts=[],this.activeResourceSubscriptions.clear(),!t)this.desiredResourceSubscriptions.clear();if(!t)this.taskInteractions.clear();this.serverInfo=null,this.serverInstructions=void 0,this.consecutiveTerminalErrors=0}resetCatalogRefreshState(){this.catalogGeneration++,this.toolRefreshPromise=void 0,this.toolRefreshRequested=!1,this.contentRefreshPromise=void 0,this.requestedContentCatalogs.clear(),this.contentRefreshReason="manual"}emitClientError(t){if(this.listenerCount("error")>0)this.emit("error",t)}async ping(t=1e4){let i=this.sdkClient;if(!i||this.status!=="connected")throw Error(`MCP server "${this.serverName}" is not connected`);let n=new AbortController,e=setTimeout(()=>n.abort("MCP health check timeout"),t);e.unref();try{await i.ping({signal:n.signal,timeout:t,maxTotalTimeout:t})}catch(s){if(n.signal.aborted)throw Error(`MCP server "${this.serverName}" health check timed out after ${t}ms`);throw s}finally{clearTimeout(e)}}async disconnect(){this.desiredConnected=!1,this.connectionGeneration++,this.connectAbortController?.abort("MCP client disconnected"),this.recoveryAbortController?.abort("MCP client disconnected"),this.healthMonitor?.stop();let t=this.sdkClient;if(this.sdkClient=null,t)t.onclose=void 0,t.onerror=void 0,await t.close().catch(()=>{return});await Promise.allSettled([this.connectPromise,this.recoveryPromise].filter((i)=>i!==void 0)),this.invalidateLiveConnection(!1),this.recoveryState=void 0,await this.oauthProvider?.dispose(),this.setStatus("disconnected"),this.emit("disconnected")}async callTool(t,i={},n={}){let e=this.sdkClient;if(!e||this.status!=="connected")throw Error("客户端未连接到服务器");if(!this.tools.has(t))throw Error(`工具 "${t}" 不存在`);if(this.activeInteraction)throw Error(`MCP server "${this.serverName}" does not allow overlapping interactive tool calls`);let s=St(this.config),r=Symbol(t);this.activeInteraction={token:r,context:n,samplingRequests:0,samplingInFlight:!1};let d=new AbortController,c=setTimeout(()=>d.abort("mcp-tool-timeout"),s.totalTimeoutMs);c.unref();let o=n.signal?AbortSignal.any([n.signal,d.signal]):d.signal,p={count:0};try{return await e.callTool({name:t,arguments:i},mt,{signal:o,timeout:s.idleTimeoutMs,resetTimeoutOnProgress:!0,maxTotalTimeout:s.totalTimeoutMs,onprogress:(M)=>{let w=gt(M,p,s);if(w&&!o.aborted&&this.activeInteraction?.token===r)n.progressHandler?.(w),this.emit("toolProgress",{serverName:this.serverName,toolName:t,...w})}})}catch(u){if(n.signal?.aborted)throw new DOMException(String(n.signal.reason||"MCP tool call cancelled"),"AbortError");if(d.signal.aborted&&!n.signal?.aborted)throw new P(_.RequestTimeout,`MCP server "${this.serverName}" tool "${t}" timed out after ${s.totalTimeoutMs}ms`);throw console.error(`[McpClient] 调用工具 "${t}" 失败:`,u),u}finally{if(clearTimeout(c),this.activeInteraction?.token===r)this.activeInteraction=void 0}}getToolTaskSupport(t){return this.tools.get(t)?.taskSupport}async createToolTask(t,i,n,e,s){let r=this.sdkClient;if(!r||this.status!=="connected")throw Error("MCP client is not connected");if(!this.taskPolicy.enabled)throw Error(`MCP tasks are disabled for server "${this.serverName}"`);if(!r.getServerCapabilities()?.tasks?.requests?.tools?.call)throw Error(`MCP server "${this.serverName}" does not support task-augmented tools/call`);let d=this.getToolTaskSupport(t);if(d!=="required"&&d!=="optional")throw Error(`MCP tool "${t}" does not support task execution`);if(this.activeInteraction)throw Error(`MCP server "${this.serverName}" does not allow overlapping interactive task creation`);let c=St(this.config),o=Symbol(t),p={token:o,context:{...n,signal:e},samplingRequests:0,samplingInFlight:!1};this.activeInteraction=p;let u={count:0},M=r.experimental.tasks.callToolStream({name:t,arguments:i},mt,{signal:e,task:{ttl:s??this.taskPolicy.defaultTtlMs,pollInterval:this.taskPolicy.pollIntervalMs},timeout:c.idleTimeoutMs,maxTotalTimeout:c.totalTimeoutMs,resetTimeoutOnProgress:!0,onprogress:(y)=>{let f=gt(y,u,c);if(f&&!e.aborted&&this.hasInteractionToken(o))n.progressHandler?.(f),this.emit("toolProgress",{serverName:this.serverName,toolName:t,...f})}}),w=!1;try{let y=await M.next();if(await M.return(void 0),y.done||y.value.type!=="taskCreated"){if(!y.done&&y.value.type==="error")throw y.value.error;throw Error(`MCP tool "${t}" did not create a task`)}if(this.sdkClient!==r)throw Error("MCP client changed while creating a task");let f=lt(y.value.task,this.taskPolicy);return this.taskInteractions.set(f.taskId,p),w=!0,this.emit("taskCreated",{serverName:this.serverName,toolName:t,task:f}),f}finally{if(this.activeInteraction?.token===o)this.activeInteraction=void 0;if(!w){for(let[y,f]of this.taskInteractions)if(f.token===o)this.taskInteractions.delete(y)}}}async getToolTask(t,i,n){let e=this.requireTaskClient(),s=await e.experimental.tasks.getTask(t,{signal:n,timeout:this.taskPolicy.pollIntervalMs+1e4,maxTotalTimeout:this.taskPolicy.pollIntervalMs+1e4});if(this.sdkClient!==e)throw Error("MCP client changed while reading a task");return lt(s,this.taskPolicy,{taskId:t,createdAt:i})}async getToolTaskResult(t,i,n=this.taskPolicy.maxLifetimeMs){let e=this.requireTaskClient(),s=Math.max(1,Math.min(n,this.taskPolicy.maxLifetimeMs)),r=await e.experimental.tasks.getTaskResult(t,mt,{signal:i,timeout:s,maxTotalTimeout:s});if(this.sdkClient!==e)throw Error("MCP client changed while reading a task result");return r}async cancelToolTask(t,i){let n=this.requireTaskClient();if(!n.getServerCapabilities()?.tasks?.cancel)throw Error(`MCP server "${this.serverName}" does not support task cancellation`);if(await n.experimental.tasks.cancelTask(t,{signal:i,timeout:15000,maxTotalTimeout:15000}),this.sdkClient!==n)throw Error("MCP client changed while cancelling a task")}async normalizeToolTaskResult(t){return j(t,this.runtimeOptions.artifactWriter)}releaseTaskInteraction(t){this.taskInteractions.delete(t)}async waitUntilConnected(t,i){if(this.status==="connected"&&this.sdkClient)return;if(!this.desiredConnected)throw Error(`MCP server "${this.serverName}" is disconnected`);await new Promise((n,e)=>{let s=setTimeout(()=>{o(),e(Error(`MCP server "${this.serverName}" recovery timed out`))},i);s.unref();let r=()=>{o(),n()},d=()=>{if(this.desiredConnected)return;o(),e(Error(`MCP server "${this.serverName}" was disconnected`))},c=()=>{o(),e(new DOMException(String(t.reason||"MCP task recovery cancelled"),"AbortError"))},o=()=>{clearTimeout(s),this.off("connected",r),this.off("disconnected",d),t.removeEventListener("abort",c)};if(this.on("connected",r),this.on("disconnected",d),t.addEventListener("abort",c,{once:!0}),t.aborted)c()})}requireTaskClient(){let t=this.sdkClient;if(!t||this.status!=="connected"||!this.taskPolicy.enabled)throw Error(`MCP server "${this.serverName}" task client is unavailable`);if(!t.getServerCapabilities()?.tasks?.requests?.tools?.call)throw Error(`MCP server "${this.serverName}" does not support task-augmented tools/call`);return t}hasInteractionToken(t){if(this.activeInteraction?.token===t)return!0;return[...this.taskInteractions.values()].some((i)=>i.token===t)}registerRootHandler(t){t.setRequestHandler(Me,async()=>({roots:this.roots.map((i)=>({...i}))}))}resolveInteraction(t){let i=t._meta?.["io.modelcontextprotocol/related-task"]?.taskId;return i?this.taskInteractions.get(i):this.activeInteraction}registerTaskStatusHandler(t){t.setNotificationHandler(Te,(i)=>{this.emit("taskStatus",i.params)})}registerSamplingHandler(t,i){t.setRequestHandler(pe,async(n,e)=>{let s=this.resolveInteraction(n.params);if(!s?.context.confirmationHandler||!s.context.samplingHandler)throw new P(_.InvalidRequest,"MCP sampling requires an active interactive Session");if(s.samplingInFlight)throw new P(_.InvalidRequest,"MCP server does not allow overlapping sampling requests");s.samplingInFlight=!0;try{if(s.samplingRequests++,s.samplingRequests>i.maxRequestsPerToolCall)throw new P(_.InvalidRequest,`MCP sampling exceeded ${i.maxRequestsPerToolCall} requests for one tool call`);let r=s.context.signal?AbortSignal.any([s.context.signal,e.signal]):e.signal;if(r.aborted)throw new P(_.InvalidRequest,"MCP sampling was cancelled");let d;try{d=Mn(n.params,i)}catch(p){throw new P(_.InvalidRequest,p instanceof Error?p.message:String(p))}let c=await s.context.confirmationHandler.requestConfirmation({type:"mcpSampling",kind:"execute",toolName:`MCP sampling: ${this.serverName}`,title:"MCP model sampling request",message:`MCP server "${this.serverName}" wants to call the current Session model with up to ${d.maxTokens} output tokens.`,details:d.preview,risks:[`May consume up to ${d.maxTokens} output tokens`,"The model response will be returned to the MCP server"]},r);if(r.aborted||c.reason===Ut||c.reason==="timeout")throw new P(_.InvalidRequest,"MCP sampling was cancelled");if(!c.approved)throw new P(_.InvalidRequest,"MCP sampling was denied");let o=await s.context.samplingHandler(d,r);return this.emit("samplingCompleted",{serverName:this.serverName,model:o.model,maxTokens:d.maxTokens}),o}finally{s.samplingInFlight=!1}})}registerElicitationHandlers(t){t.setRequestHandler(ue,async(i,n)=>{let e=this.resolveInteraction(i.params)?.context;if(!e?.confirmationHandler)return this.emit("elicitationCancelled",{serverName:this.serverName,reason:"no-interaction-handler"}),{action:"cancel"};let s=e.signal?AbortSignal.any([e.signal,n.signal]):n.signal;if(s.aborted)return{action:"cancel"};let r;try{r=Di(this.serverName,i.params)}catch(d){return this.emit("elicitationRejected",{serverName:this.serverName,reason:d instanceof Error?d.message:String(d)}),{action:"decline"}}try{let d=e.sessionId&&e.workspaceRoot&&e.permissionMode?{projectDir:e.workspaceRoot,sessionId:e.sessionId,permissionMode:e.permissionMode,abortSignal:s}:void 0,c=d?await xt.getInstance().executeElicitationHooks(r,d):{},o;if(c.blockedReason)o={action:"decline"};else if(c.response)o=c.response;else{let M=await e.confirmationHandler.requestConfirmation({type:"mcpElicitation",message:r.message,title:`MCP input requested by ${this.serverName}`,mcpElicitation:r},s),w=this.resolveElicitationAction(M,s);if(o=M.elicitation??{action:w},w==="accept"&&r.mode==="url"&&M.openExternalUrl&&r.url)await Ee(r.url,{wait:!1})}let p=d?await xt.getInstance().executeElicitationResultHooks(r,o,d):{};if(p.blockedReason)o={action:"cancel"};else if(p.response)o=p.response;let u=Yi(r,o);return this.emit("elicitationResolved",{serverName:this.serverName,mode:r.mode,action:u.action,elicitationId:r.elicitationId}),u}catch(d){return this.emit("elicitationCancelled",{serverName:this.serverName,reason:d instanceof Error?d.message:String(d)}),{action:"cancel"}}}),t.setNotificationHandler(ce,(i)=>{this.emit("elicitationCompleted",{serverName:this.serverName,elicitationId:i.params.elicitationId})})}resolveElicitationAction(t,i){if(i.aborted||t.reason===Ut||t.reason==="timeout")return"cancel";if(t.elicitation)return t.elicitation.action;return t.approved?"accept":"decline"}async createTransport(){let{type:t,command:i,args:n,env:e,cwd:s,url:r,headers:d,oauth:c}=this.config,o;if(c?.enabled){if(this.runtimeOptions.oauthCredentialAccess===!1||!this.oauthProvider)throw new U(this.serverName);if(!await this.oauthProvider.hasUsableCredentials())throw new Bt(this.serverName);o=this.oauthProvider}if(t==="stdio"){if(!i)throw Error("stdio 传输需要 command 参数");let p={};for(let[u,M]of Object.entries(process.env))if(M!==void 0)p[u]=M;return new de({command:i,args:n||[],env:{...p,...e},cwd:s,stderr:"ignore"})}else if(t==="sse"){if(!r)throw Error("sse 传输需要 url 参数");return new oe(new URL(r),{requestInit:{headers:d},...c?.enabled?{fetch:Ot}:{},...o?{authProvider:o}:{}})}else if(t==="http"){if(!r)throw Error("http 传输需要 url 参数");let{StreamableHTTPClientTransport:p}=await import("@modelcontextprotocol/sdk/client/streamableHttp.js");return new p(new URL(r),{requestInit:{headers:d},...c?.enabled?{fetch:Ot}:{},...o?{authProvider:o}:{}})}throw Error(`不支持的传输类型: ${t}`)}async refreshTools(t="manual"){if(this.toolRefreshRequested=!0,this.toolRefreshPromise)return this.toolRefreshPromise;let i=this.catalogGeneration,n=(t==="notification"?new Promise((e)=>{setTimeout(e,25).unref()}):Promise.resolve()).then(()=>this.runToolRefresh(t)).finally(()=>{if(i!==this.catalogGeneration||this.toolRefreshPromise!==n)return;let e=this.toolRefreshRequested;if(this.toolRefreshPromise=void 0,this.toolRefreshRequested=!1,e&&this.sdkClient)this.refreshTools("notification")});return this.toolRefreshPromise=n,n}async runToolRefresh(t){let i=t;for(let n=0;n<3&&this.toolRefreshRequested;n++){this.toolRefreshRequested=!1;try{await this.fetchAndPublishTools(i)}catch(e){if(this.emit("toolsRefreshFailed",{serverName:this.serverName,reason:i,error:e instanceof Error?e:Error(String(e))}),i!=="notification")throw e;return}i="notification"}}async fetchAndPublishTools(t){let i=this.sdkClient;if(!i)throw Error("MCP client is not connected");let n=[],e=new Set,s;for(let p=0;p<it;p++){let u=await i.listTools(s?{cursor:s}:void 0);if(n.push(...u.tools),n.length>x)throw Error(`MCP tool catalog exceeds ${x} tools`);if(s=u.nextCursor,!s)break;if(e.has(s))throw Error("MCP tool catalog returned a repeated cursor");if(e.add(s),p===it-1)throw Error(`MCP tool catalog exceeds ${it} pages`)}let r=Wi(n);if(this.sdkClient!==i)throw Error("MCP client changed while refreshing tools");let d=this.availableTools,c=Zi(d,r);if(this.tools=new Map(r.map((p)=>[p.name,p])),!nt(c))return;this.toolCatalogRevision++;let o={revision:this.toolCatalogRevision,reason:t,...c};this.emit("toolsUpdated",this.availableTools,o)}async refreshContentCatalogs(t="manual",i=["resources","prompts"]){let n=this.sdkClient?.getServerCapabilities();for(let r of i){if(r==="resources"&&n?.resources)this.requestedContentCatalogs.add(r);if(r==="prompts"&&n?.prompts)this.requestedContentCatalogs.add(r)}if(this.requestedContentCatalogs.size===0)return;if(this.contentRefreshPromise){if(t!=="notification")this.contentRefreshReason=t;return this.contentRefreshPromise}this.contentRefreshReason=t;let e=this.catalogGeneration,s=(t==="notification"?new Promise((r)=>{setTimeout(r,25).unref()}):Promise.resolve()).then(()=>this.runContentCatalogRefresh()).finally(()=>{if(e!==this.catalogGeneration||this.contentRefreshPromise!==s)return;let r=this.requestedContentCatalogs.size>0;if(this.contentRefreshPromise=void 0,this.contentRefreshReason="manual",r&&this.sdkClient)this.refreshContentCatalogs("notification")});return this.contentRefreshPromise=s,s}async waitForCatalogRefresh(){while(this.toolRefreshPromise||this.contentRefreshPromise)await Promise.all([this.toolRefreshPromise??Promise.resolve(),this.contentRefreshPromise??Promise.resolve()])}async runContentCatalogRefresh(){for(let t=0;t<3&&this.requestedContentCatalogs.size>0;t++){let i=[...this.requestedContentCatalogs];this.requestedContentCatalogs.clear();let n=this.contentRefreshReason;this.contentRefreshReason="notification";let e=[];for(let s of i)try{if(s==="resources")await this.fetchAndPublishResourceCatalog(n);else await this.fetchAndPublishPromptCatalog(n)}catch(r){let d=r instanceof Error?r:Error(String(r));e.push(d),this.emit("contentCatalogRefreshFailed",{serverName:this.serverName,catalog:s,reason:n,error:d})}if(e.length>0&&n!=="notification")throw AggregateError(e,`Failed to refresh MCP content catalogs for "${this.serverName}"`)}}async fetchAndPublishResourceCatalog(t){let i=this.sdkClient;if(!i)throw Error("MCP client is not connected");let n=await this.fetchContentPages("resource",q,(o)=>i.listResources(o?{cursor:o}:void 0),(o)=>o.resources),e=await this.fetchContentPages("resource template",H,(o)=>i.listResourceTemplates(o?{cursor:o}:void 0),(o)=>o.resourceTemplates),s=Ci(n),r=$i(e);if(this.sdkClient!==i)throw Error("MCP client changed while refreshing resource catalogs");let d=I(this.resources,s,(o)=>o.uri),c=I(this.resourceTemplates,r,(o)=>o.uriTemplate);this.resources=s,this.resourceTemplates=r,await this.reconcileResourceSubscriptions(i),this.publishContentCatalogDelta("resources",t,d),this.publishContentCatalogDelta("resourceTemplates",t,c)}async fetchAndPublishPromptCatalog(t){let i=this.sdkClient;if(!i)throw Error("MCP client is not connected");let n=await this.fetchContentPages("prompt",K,(r)=>i.listPrompts(r?{cursor:r}:void 0),(r)=>r.prompts),e=ki(n);if(this.sdkClient!==i)throw Error("MCP client changed while refreshing prompts");let s=I(this.prompts,e,(r)=>r.name);this.prompts=e,this.publishContentCatalogDelta("prompts",t,s)}async fetchContentPages(t,i,n,e){let s=[],r=new Set,d;for(let c=0;c<_t;c++){let o=await n(d);if(s.push(...e(o)),s.length>i)throw Error(`MCP ${t} catalog exceeds ${i} entries`);if(d=o.nextCursor,!d)return s;if(r.has(d))throw Error(`MCP ${t} catalog returned a repeated cursor`);r.add(d)}throw Error(`MCP ${t} catalog exceeds ${_t} pages`)}publishContentCatalogDelta(t,i,n){if(!mi(n))return;this.contentCatalogRevision++;let e={revision:this.contentCatalogRevision,kind:t,reason:i,...n};this.emit("contentCatalogUpdated",this.contentCatalog,e)}registerResourceNotificationHandler(t){t.setNotificationHandler(ye,(i)=>{let n=i.params.uri;if(this.sdkClient!==t||!this.activeResourceSubscriptions.has(n))return;this.contentCatalogRevision++,this.emit("resourceUpdated",{revision:this.contentCatalogRevision,serverName:this.serverName,uri:n})})}registerLoggingHandler(t){t.setNotificationHandler(we,(i)=>{if(this.sdkClient!==t||!this.loggingPolicy.enabled||!pn(i.params.level,this.loggingPolicy.level))return;let n=Date.now();if(n-this.logWindowStartedAt>=1000)this.logWindowStartedAt=n,this.logEventsInWindow=0,this.logRateWarningEmitted=!1;if(this.logEventsInWindow>=rn){if(!this.logRateWarningEmitted)this.logRateWarningEmitted=!0,this.emit("log",cn(1,{now:n}));return}this.logEventsInWindow++;let e=Lt({level:i.params.level,logger:i.params.logger,data:i.params.data},{exposeDetails:this.runtimeOptions.exposeLogDetails,now:n});this.emit("log",e)})}async configureLogging(t){if(this.logWindowStartedAt=Date.now(),this.logEventsInWindow=0,this.logRateWarningEmitted=!1,!this.loggingPolicy.enabled||!t.getServerCapabilities()?.logging)return;try{await t.setLoggingLevel(this.loggingPolicy.level)}catch(i){if(this.sdkClient!==t)return;let n={serverName:this.serverName,level:this.loggingPolicy.level,error:k(i)};this.emit("loggingSetupFailed",n),this.emit("log",{...Lt({level:"warning",logger:"blade.mcp.logging",data:`Failed to set MCP logging level: ${n.error}`},{exposeDetails:this.runtimeOptions.exposeLogDetails}),synthetic:!0})}}async setLoggingLevel(t){if(!dn(t))throw Error("Invalid MCP logging level");let i=this.sdkClient;if(!i)throw Error("MCP client is not connected");if(!i.getServerCapabilities()?.logging)throw Error(`MCP server "${this.serverName}" does not support logging`);if(await i.setLoggingLevel(t),this.sdkClient!==i)throw Error("MCP client changed while setting logging level");this.loggingPolicy={enabled:!0,level:t},this.emit("loggingLevelChanged",{serverName:this.serverName,level:t})}async complete(t,i){let n=this.sdkClient;if(!n||this.status!=="connected")throw Error("MCP client is not connected");if(!n.getServerCapabilities()?.completions)throw Error(`MCP server "${this.serverName}" does not support completions`);if(this.completionCallsInFlight>=oi)throw Error(`MCP server "${this.serverName}" has too many completion requests`);let e=di(t,this.contentCatalog);this.completionCallsInFlight++;try{let s=await n.complete(e,{signal:i,timeout:bt,maxTotalTimeout:bt});if(this.sdkClient!==n)throw Error("MCP client changed while completing an argument");return pi(s)}catch(s){if(i?.aborted)throw new DOMException(String(i.reason||"MCP completion cancelled"),"AbortError");throw s}finally{this.completionCallsInFlight--}}async readResource(t){let i=this.sdkClient;if(!i)throw Error("MCP client is not connected");if(!this.resources.some((n)=>n.uri===t))throw Error(`MCP resource "${t}" is not present in server "${this.serverName}" catalog`);return gi(await i.readResource({uri:t}))}async getPrompt(t,i={}){let n=this.sdkClient;if(!n)throw Error("MCP client is not connected");let e=this.prompts.find((r)=>r.name===t);if(!e)throw Error(`MCP prompt "${t}" is not present in server "${this.serverName}" catalog`);let s=new Set(e.arguments.map((r)=>r.name));for(let[r,d]of Object.entries(i)){if(["__proto__","constructor","prototype"].includes(r))throw Error(`Unsafe argument "${r}" for MCP prompt "${t}"`);if(!s.has(r))throw Error(`Unknown argument "${r}" for MCP prompt "${t}"`);if(Buffer.byteLength(d)>16384)throw Error(`Argument "${r}" for MCP prompt "${t}" is too large`)}for(let r of e.arguments)if(r.required&&i[r.name]===void 0)throw Error(`Required argument "${r.name}" is missing for MCP prompt "${t}"`);return Li(await n.getPrompt({name:t,arguments:i}))}async setResourceSubscription(t,i){let n=this.sdkClient;if(!n)throw Error("MCP client is not connected");if(i){if(!this.resources.some((e)=>e.uri===t))throw Error(`MCP resource "${t}" is not present in server "${this.serverName}" catalog`);if(this.desiredResourceSubscriptions.has(t)&&this.activeResourceSubscriptions.has(t))return;if(!this.desiredResourceSubscriptions.has(t)&&this.desiredResourceSubscriptions.size>=Pt)throw Error(`MCP resource subscriptions exceed ${Pt}`);if(!n.getServerCapabilities()?.resources?.subscribe)throw Error(`MCP server "${this.serverName}" does not support resource subscriptions`);if(await n.subscribeResource({uri:t}),this.sdkClient!==n)throw Error("MCP client changed while subscribing to resource");this.desiredResourceSubscriptions.add(t),this.activeResourceSubscriptions.add(t);return}if(!this.desiredResourceSubscriptions.has(t))return;if(this.activeResourceSubscriptions.has(t)){if(await n.unsubscribeResource({uri:t}),this.sdkClient!==n)throw Error("MCP client changed while unsubscribing from resource")}this.activeResourceSubscriptions.delete(t),this.desiredResourceSubscriptions.delete(t)}async reconcileResourceSubscriptions(t){if(this.sdkClient!==t)return;let i=new Set(this.resources.map((n)=>n.uri));for(let n of this.activeResourceSubscriptions)if(!i.has(n))this.activeResourceSubscriptions.delete(n);if(!t.getServerCapabilities()?.resources?.subscribe){this.activeResourceSubscriptions.clear();return}for(let n of this.desiredResourceSubscriptions){if(!i.has(n)||this.activeResourceSubscriptions.has(n))continue;try{if(await t.subscribeResource({uri:n}),this.sdkClient!==t)return;this.activeResourceSubscriptions.add(n)}catch(e){this.emit("resourceSubscriptionRestoreFailed",{serverName:this.serverName,uri:n,error:k(e)})}}}setStatus(t){let i=this.status;if(i===t)return;this.status=t,this.emit("statusChanged",t,i)}}class m extends be{runtimeOptions;static instance=null;servers=new Map;catalogRevision=0;contentCatalogRevision=0;connectionRevision=0;logRevision=0;instructionsRevision=0;logEntries=[];projectedTools=new Map;constructor(t={}){super();this.runtimeOptions=t}static getInstance(){if(!m.instance)m.instance=new m;return m.instance}static createIsolated(t={}){return new m(t)}async registerServer(t,i,n={}){if(this.servers.has(t))throw Error(`MCP服务器 "${t}" 已经注册`);let e=new Xt(i,t,i.healthCheck,this.runtimeOptions),s={config:i,client:e,status:"disconnected",tools:[],contentCatalog:{resources:[],resourceTemplates:[],prompts:[]},logging:e.logging};if(this.setupClientEventHandlers(e,s,t),this.servers.set(t,s),this.emit("serverRegistered",t,s),n.connect===!1)return;try{await this.connectServer(t)}catch(r){console.warn(`MCP服务器 "${t}" 连接失败:`,r)}}async unregisterServer(t){let i=this.servers.get(t);if(!i)return;try{await T.getInstance().cancelClient(i.client),await i.client.disconnect()}catch(n){console.warn(`断开MCP服务器 "${t}" 时出错:`,n)}this.servers.delete(t),this.logEntries=this.logEntries.filter((n)=>n.serverName!==t),this.emit("serverUnregistered",t)}async connectServer(t){let i=this.servers.get(t);if(!i)throw Error(`MCP服务器 "${t}" 未注册`);if(i.status==="connected")return;try{i.status="connecting",await i.client.connect(),i.connectedAt=new Date,i.lastError=void 0,i.tools=i.client.availableTools}catch(n){throw i.lastError=n,i.status="error",n}}async disconnectServer(t){let i=this.servers.get(t);if(!i)return;await T.getInstance().cancelClient(i.client),await i.client.disconnect(),i.connectedAt=void 0}async reconnectServer(t){let i=this.servers.get(t);if(!i)throw Error(`MCP服务器 "${t}" 未注册`);await T.getInstance().cancelClient(i.client),await i.client.disconnect();try{i.status="connecting",await i.client.connect(),i.connectedAt=new Date,i.lastError=void 0,i.tools=i.client.availableTools}catch(n){throw i.lastError=n,i.status="error",n}}getCatalogSnapshot(){return{revision:this.catalogRevision,tools:[...this.projectedTools.values()]}}async waitForCatalogIdle(){await Promise.all([...this.servers.values()].map((t)=>t.client.waitForCatalogRefresh()))}getContentCatalogSnapshot(){let t=[],i=[],n=[];for(let[e,s]of this.servers){if(s.status!=="connected")continue;t.push(...s.contentCatalog.resources.map((r)=>({server:e,...structuredClone(r)}))),i.push(...s.contentCatalog.resourceTemplates.map((r)=>({server:e,...structuredClone(r)}))),n.push(...s.contentCatalog.prompts.map((r)=>({server:e,...structuredClone(r)})))}return{revision:this.contentCatalogRevision,resources:t,resourceTemplates:i,prompts:n}}getLogSnapshot(t,i={}){let n=Number.isSafeInteger(i.afterRevision)&&(i.afterRevision??0)>=0?i.afterRevision??0:0,e=Number.isSafeInteger(i.limit)&&(i.limit??0)>=1&&(i.limit??0)<=B?i.limit??B:B,s=this.logEntries.filter((r)=>r.revision>n&&(!t||r.serverName===t)).slice(-e).map((r)=>structuredClone(r));return{revision:this.logRevision,entries:s}}getInstructionsSnapshot(){let t=[];for(let[i,n]of this.servers){if(n.status!=="connected"||!n.instructions)continue;t.push({serverName:i,...structuredClone(n.instructions)})}return t.sort((i,n)=>i.serverName.localeCompare(n.serverName)),{revision:this.instructionsRevision,instructions:t}}async refreshContentCatalogs(t){if(t){await this.requireConnectedServer(t).client.refreshContentCatalogs("manual");return}await Promise.all([...this.servers.values()].filter((i)=>i.status==="connected").map((i)=>i.client.refreshContentCatalogs("manual")))}async readResource(t,i){return this.requireConnectedServer(t).client.readResource(i)}async getPrompt(t,i,n={}){return this.requireConnectedServer(t).client.getPrompt(i,n)}async complete(t,i,n){return this.requireConnectedServer(t).client.complete(i,n)}async startTask(t,i,n,e,s,r,d){let c=this.requireConnectedServer(t);if(!c.tools.some((o)=>o.name===i))throw Error(`MCP tool "${i}" is not present in server "${t}" catalog`);return T.getInstance().start({client:c.client,serverName:t,toolName:i,arguments:n,owner:e,interactionContext:s,signal:r,ttlMs:d})}listTasks(t,i){return T.getInstance().list(t,i)}cancelTask(t,i,n){return T.getInstance().cancel(t,i,n)}async setResourceSubscription(t,i,n){await this.requireConnectedServer(t).client.setResourceSubscription(i,n)}async setServerLoggingLevel(t,i){let n=this.requireConnectedServer(t);await n.client.setLoggingLevel(i),n.logging=n.client.logging}async findTool(t){return this.projectedTools.get(t)??null}getServerStatus(t){return this.servers.get(t)||null}getAllServers(){return new Map(this.servers)}async beginOAuthLogin(t,i={}){let n=this.servers.get(t);if(!n)throw Error(`MCP服务器 "${t}" 未注册`);let e=await n.client.beginOAuthLogin(i);this.emit("serverOAuthStatusChanged",t,"authorizing");let s=e.completion.then(async()=>{this.emit("serverOAuthCompleted",t),this.emit("serverOAuthStatusChanged",t,"authenticated");try{await this.reconnectServer(t)}catch(r){n.lastError=r instanceof Error?r:Error(String(r)),n.status="error",this.emit("serverError",t,n.lastError)}},(r)=>{throw n.lastError=r instanceof Error?r:Error(String(r)),this.emit("serverOAuthError",t,n.lastError),this.emit("serverOAuthStatusChanged",t,"error"),n.lastError});return s.catch(()=>{return}),{...e,completion:s}}async logoutOAuth(t){let i=this.servers.get(t);if(!i)throw Error(`MCP服务器 "${t}" 未注册`);await i.client.logoutOAuth(),i.status="disconnected",i.connectedAt=void 0,i.lastError=void 0,i.tools=[],this.emit("serverOAuthStatusChanged",t,"unauthenticated")}setupClientEventHandlers(t,i,n){t.on("connected",(e)=>{if(i.status="connected",i.connectedAt=new Date,i.lastError=void 0,i.tools=t.availableTools,i.contentCatalog=t.contentCatalog,i.logging=t.logging,i.instructions=this.fitInstructionBudget(n,t.instructions),this.publishCatalog(n,"connection"),this.publishInitialContentCatalog(n,i.contentCatalog),i.instructions)this.publishInstructions(n,"added","connection",i.instructions);this.emit("serverConnected",n,e)}),t.on("disconnected",()=>{i.status="disconnected",i.connectedAt=void 0,i.lastError=void 0,i.recovery=void 0,this.invalidateServerProjection(n,i),this.emit("serverDisconnected",n)}),t.on("error",(e)=>{i.status="error",i.lastError=e,this.invalidateServerProjection(n,i),this.emit("serverError",n,e)}),t.on("connectionLifecycleChanged",(e)=>{if(i.recovery=structuredClone(e),e.phase==="reconnecting")i.status="reconnecting",i.connectedAt=void 0,i.lastError=e.error?Error(e.error):i.lastError,this.invalidateServerProjection(n,i);else if(e.phase==="recovered")i.status="connected",i.lastError=void 0;else i.status="error",i.connectedAt=void 0,i.lastError=e.error?Error(e.error):i.lastError;this.publishConnectionLifecycle(n,e)}),t.on("toolsUpdated",(e,s)=>{let r=i.tools.length;if(i.tools=e,i.status==="connected"&&s)this.publishCatalog(n,s.reason);this.emit("toolsUpdated",n,e,r)}),t.on("toolsRefreshFailed",(e)=>{this.emit("catalogRefreshFailed",{serverName:n,...e})}),t.on("contentCatalogUpdated",(e,s)=>{if(i.contentCatalog=e,i.status!=="connected")return;this.publishContentCatalogChange(n,s.kind,s.reason,{added:s.added,removed:s.removed,updated:s.updated})}),t.on("contentCatalogRefreshFailed",(e)=>{this.emit("contentCatalogRefreshFailed",{serverName:n,...e})}),t.on("resourceUpdated",(e)=>{if(i.status!=="connected")return;this.contentCatalogRevision++;let s={revision:this.contentCatalogRevision,serverName:n,uri:e.uri};this.emit("resourceUpdated",s)}),t.on("statusChanged",(e,s)=>{if(i.status=e,e==="reconnecting"&&s==="connected")i.connectedAt=void 0,this.invalidateServerProjection(n,i);this.emit("serverStatusChanged",n,e,s)}),t.on("loggingLevelChanged",()=>{i.logging=t.logging,this.emit("serverLoggingLevelChanged",n,i.logging.level)}),t.on("log",(e)=>{this.publishLog(n,e)})}publishLog(t,i){this.logRevision++;let n={revision:this.logRevision,serverName:t,...structuredClone(i)};this.logEntries.push(n);let e=0;for(let s=this.logEntries.length-1;s>=0;s--){if(this.logEntries[s]?.serverName!==t)continue;if(e++,e>Tn)this.logEntries.splice(s,1)}while(this.logEntries.length>B)this.logEntries.shift();this.emit("log",structuredClone(n))}invalidateServerProjection(t,i){let n=i.contentCatalog,e=i.instructions!==void 0;if(i.tools=[],i.contentCatalog={resources:[],resourceTemplates:[],prompts:[]},i.instructions=void 0,this.publishCatalog(t,"disconnection"),this.publishRemovedContentCatalog(t,n),e)this.publishInstructions(t,"removed","disconnection")}fitInstructionBudget(t,i){if(!i)return;let n=0;for(let[e,s]of this.servers){if(e===t)continue;n+=s.instructions?.projectedBytes??0}return En(i,Math.max(0,fn-n))}publishInstructions(t,i,n,e){this.instructionsRevision++;let s={revision:this.instructionsRevision,serverName:t,action:i,reason:n,...e?{instruction:structuredClone(e)}:{}};this.emit("instructionsChanged",s)}publishConnectionLifecycle(t,i){this.connectionRevision++;let n={revision:this.connectionRevision,serverName:t,...structuredClone(i)};this.emit("connectionLifecycleChanged",n)}publishCatalog(t,i){let n=new Map;for(let[c,o]of this.servers){if(o.status!=="connected")continue;for(let p of o.tools){let u=Ki(c,p.name);if(n.has(u))throw Error(`Duplicate projected MCP tool "${u}"`);n.set(u,Qt(o.client,c,p,u,this.runtimeOptions.artifactWriter))}}let e=new Map([...this.projectedTools].map(([c,o])=>[c,JSON.stringify(o.getFunctionDeclaration())])),s=new Map([...n].map(([c,o])=>[c,JSON.stringify(o.getFunctionDeclaration())])),r={added:[...n.keys()].filter((c)=>!this.projectedTools.has(c)).sort(),removed:[...this.projectedTools.keys()].filter((c)=>!n.has(c)).sort(),updated:[...n.keys()].filter((c)=>this.projectedTools.has(c)&&e.get(c)!==s.get(c)).sort()};if(this.projectedTools=n,!nt(r))return;this.catalogRevision++;let d={revision:this.catalogRevision,serverName:t,reason:i,tools:[...n.values()],...r};this.emit("catalogChanged",d)}publishInitialContentCatalog(t,i){this.publishContentCatalogChange(t,"resources","connection",{added:i.resources.map((n)=>n.uri).sort(),removed:[],updated:[]}),this.publishContentCatalogChange(t,"resourceTemplates","connection",{added:i.resourceTemplates.map((n)=>n.uriTemplate).sort(),removed:[],updated:[]}),this.publishContentCatalogChange(t,"prompts","connection",{added:i.prompts.map((n)=>n.name).sort(),removed:[],updated:[]})}publishRemovedContentCatalog(t,i){this.publishContentCatalogChange(t,"resources","disconnection",{added:[],removed:i.resources.map((n)=>n.uri).sort(),updated:[]}),this.publishContentCatalogChange(t,"resourceTemplates","disconnection",{added:[],removed:i.resourceTemplates.map((n)=>n.uriTemplate).sort(),updated:[]}),this.publishContentCatalogChange(t,"prompts","disconnection",{added:[],removed:i.prompts.map((n)=>n.name).sort(),updated:[]})}publishContentCatalogChange(t,i,n,e){if(e.added.length===0&&e.removed.length===0&&e.updated.length===0)return;this.contentCatalogRevision++;let s={revision:this.contentCatalogRevision,serverName:t,kind:i,reason:n,...e};this.emit("contentCatalogChanged",s)}requireConnectedServer(t){let i=this.servers.get(t);if(!i)throw Error(`MCP服务器 "${t}" 未注册`);if(i.status!=="connected")throw Error(`MCP服务器 "${t}" 未连接`);return i}async disconnectAll(){let t=[];for(let[i,n]of this.servers)t.push(T.getInstance().cancelClient(n.client).then(()=>n.client.disconnect()).catch((e)=>{console.warn(`断开 MCP 服务器 "${i}" 时出错:`,e)}));await Promise.allSettled(t),this.servers.clear(),this.projectedTools.clear(),this.logEntries=[]}}
25
+ export{Jt as Ma,T as Na,jn as Oa,ve as Pa,ts as Qa,Yi as Ra,Ki as Sa,te as Ta,m as Ua};
@@ -1,2 +1,2 @@
1
- import{Nk as K}from"./chunk-cjfb4kjp.js";import{spawn as Y}from"node:child_process";import{constants as j}from"node:fs";import{access as x,readFile as B}from"node:fs/promises";import{createRequire as L}from"node:module";import C from"node:path";var P="blade browser install";var D=["PATH","Path","PATHEXT","HOME","USERPROFILE","LOCALAPPDATA","PROGRAMDATA","TMPDIR","TMP","TEMP","LANG","LC_ALL","LC_CTYPE","TZ","SystemRoot","SYSTEMROOT","WINDIR","COMSPEC","XDG_RUNTIME_DIR","CHROME_DEVEL_SANDBOX"],A=[...D,"PLAYWRIGHT_BROWSERS_PATH","PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT","PLAYWRIGHT_DOWNLOAD_HOST","PLAYWRIGHT_CHROMIUM_DOWNLOAD_HOST","HTTP_PROXY","HTTPS_PROXY","NO_PROXY","http_proxy","https_proxy","no_proxy","NODE_EXTRA_CA_CERTS","SSL_CERT_FILE","SSL_CERT_DIR"],J=32768,M=4096;function U(f,F){let $={};for(let Z of F){let q=f[Z];if(q!==void 0&&q.length<=J)$[Z]=q}return $}function V(f=process.env){return U(f,D)}function S(f=process.env){return U(f,A)}function W(){return L(import.meta.url).resolve("playwright/package.json")}function y(f=W){return C.join(C.dirname(f()),"cli.js")}async function T(){return await import("playwright")}async function m(f){let F=JSON.parse(await B(f,"utf8"));if(typeof F.version!=="string"||F.version.length===0)throw Error("Playwright package version is invalid");return F.version}function I(f){return(f instanceof Error?f.message:String(f)).replace(/[\r\n]+/g," ").slice(0,M)}async function R(f={}){let $=(f.resolvePackageJson??W)(),Z=await m($),q=await(f.loadPlaywright??T)(),G=q.chromium.executablePath(),H=f.access??x,z;try{await H(G,j.X_OK),z=await q.chromium.launch({executablePath:G,headless:!0,chromiumSandbox:!0,env:V(f.environment)});let Q=z.version();return await z.close(),z=void 0,{playwrightVersion:Z,executablePath:G,installed:!0,browserVersion:Q}}catch(Q){return{playwrightVersion:Z,executablePath:G,installed:!1,error:I(Q)}}finally{await z?.close().catch(()=>{return})}}async function N(f={}){let F=f.resolvePackageJson??W,$=y(F),Z=f.spawn??((q,G,H)=>Y(q,[...G],H));await new Promise((q,G)=>{let H=Z(f.execPath??process.execPath,[$,"install","chromium"],{env:S(f.environment),shell:!1,stdio:"inherit"}),z=!1;H.once("error",(Q)=>{if(z)return;z=!0,G(Q)}),H.once("close",(Q,X)=>{if(z)return;if(z=!0,Q===0){q();return}G(Error(X?`Playwright browser installer stopped by ${X}`:`Playwright browser installer exited with code ${Q??1}`))})})}
2
- export{P as Fa,V as Ga,R as Ha,N as Ia};
1
+ import{Jk as K}from"./chunk-gmpsfkgg.js";import{spawn as Y}from"node:child_process";import{constants as j}from"node:fs";import{access as x,readFile as B}from"node:fs/promises";import{createRequire as L}from"node:module";import C from"node:path";var P="blade browser install";var D=["PATH","Path","PATHEXT","HOME","USERPROFILE","LOCALAPPDATA","PROGRAMDATA","TMPDIR","TMP","TEMP","LANG","LC_ALL","LC_CTYPE","TZ","SystemRoot","SYSTEMROOT","WINDIR","COMSPEC","XDG_RUNTIME_DIR","CHROME_DEVEL_SANDBOX"],A=[...D,"PLAYWRIGHT_BROWSERS_PATH","PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT","PLAYWRIGHT_DOWNLOAD_HOST","PLAYWRIGHT_CHROMIUM_DOWNLOAD_HOST","HTTP_PROXY","HTTPS_PROXY","NO_PROXY","http_proxy","https_proxy","no_proxy","NODE_EXTRA_CA_CERTS","SSL_CERT_FILE","SSL_CERT_DIR"],J=32768,M=4096;function U(f,F){let $={};for(let Z of F){let q=f[Z];if(q!==void 0&&q.length<=J)$[Z]=q}return $}function V(f=process.env){return U(f,D)}function S(f=process.env){return U(f,A)}function W(){return L(import.meta.url).resolve("playwright/package.json")}function y(f=W){return C.join(C.dirname(f()),"cli.js")}async function T(){return await import("playwright")}async function m(f){let F=JSON.parse(await B(f,"utf8"));if(typeof F.version!=="string"||F.version.length===0)throw Error("Playwright package version is invalid");return F.version}function I(f){return(f instanceof Error?f.message:String(f)).replace(/[\r\n]+/g," ").slice(0,M)}async function R(f={}){let $=(f.resolvePackageJson??W)(),Z=await m($),q=await(f.loadPlaywright??T)(),G=q.chromium.executablePath(),H=f.access??x,z;try{await H(G,j.X_OK),z=await q.chromium.launch({executablePath:G,headless:!0,chromiumSandbox:!0,env:V(f.environment)});let Q=z.version();return await z.close(),z=void 0,{playwrightVersion:Z,executablePath:G,installed:!0,browserVersion:Q}}catch(Q){return{playwrightVersion:Z,executablePath:G,installed:!1,error:I(Q)}}finally{await z?.close().catch(()=>{return})}}async function N(f={}){let F=f.resolvePackageJson??W,$=y(F),Z=f.spawn??((q,G,H)=>Y(q,[...G],H));await new Promise((q,G)=>{let H=Z(f.execPath??process.execPath,[$,"install","chromium"],{env:S(f.environment),shell:!1,stdio:"inherit"}),z=!1;H.once("error",(Q)=>{if(z)return;z=!0,G(Q)}),H.once("close",(Q,X)=>{if(z)return;if(z=!0,Q===0){q();return}G(Error(X?`Playwright browser installer stopped by ${X}`:`Playwright browser installer exited with code ${Q??1}`))})})}
2
+ export{P as Ia,V as Ja,R as Ka,N as La};
@@ -1,2 +1,2 @@
1
1
  import*as z from"node:os";import*as x from"node:path";function F(){return process.env.BLADE_STORAGE_ROOT||x.join(z.homedir(),".blade")}import{AsyncLocalStorage as Lq}from"node:async_hooks";import{createHash as Vq}from"node:crypto";import{lstat as L,mkdir as Cq,readdir as bq,realpath as N}from"node:fs/promises";import Z from"node:path";import{createHash as Gq}from"node:crypto";var E=new WeakSet,j=new WeakSet,Jq={"not-absolute":"ACP remote file path must be absolute","style-mismatch":"ACP remote file path does not match the expected style","drive-relative":"ACP remote file path cannot be drive-relative","root-relative":"ACP remote file path cannot be root-relative","unc-not-supported":"ACP remote file path must be absolute; UNC paths are not supported","device-namespace-not-supported":"ACP remote file path device namespaces are not supported","trailing-dot-or-space":"ACP remote file path components cannot end with a dot or space","alternate-data-stream":"ACP remote file path alternate data streams are not supported","reserved-device-name":"ACP remote file path reserved device names are not supported","short-name-alias":"ACP remote file path short-name aliases are not supported","invalid-character":"ACP remote file path contains characters that are not supported"},Oq=new Set(["CON","PRN","AUX","NUL","CONIN$","CONOUT$","COM1","COM2","COM3","COM4","COM5","COM6","COM7","COM8","COM9","LPT1","LPT2","LPT3","LPT4","LPT5","LPT6","LPT7","LPT8","LPT9","COM¹","COM²","COM³","LPT¹","LPT²","LPT³"]);class _ extends Error{reason;style;name="AcpRemotePathError";code="acp_remote_path_invalid";constructor(q,G){super(Jq[q]);this.reason=q;this.style=G;Object.setPrototypeOf(this,new.target.prototype)}toJSON(){return{name:this.name,code:this.code,reason:this.reason,style:this.style,message:this.message}}}class V extends Error{name="AcpRemotePathIdentityError";code="acp_remote_path_identity_invalid";constructor(){super("ACP remote path identity is invalid");Object.setPrototypeOf(this,new.target.prototype)}}function Qq(q){if(!E.has(q))throw new V}function Uq(q){if(!j.has(q))throw new V;if(Qq(q.workspace),q.style!==q.workspace.style)throw new V}function gq(q){Uq(q);let G=Object.freeze({style:q.style,workspace:q.workspace});return j.add(G),G}function Rq(q){let G=C(q),J=Object.freeze({style:G.style,workspace:G});return j.add(J),J}function C(q,G){let J=W(q,G);if(J.kind==="error")throw new _(J.reason,J.style);let O=J.style==="win32"?Yq(q):Xq(q);return k(J.style,O)}function Sq(q,G){let J=C(q),O=J.style==="win32"?Fq(J.wirePath,G):_q(J.wirePath,G);return k(J.style,O)}function W(q,G){if(R(q))return{kind:"error",reason:"device-namespace-not-supported",style:"win32"};if(g(q))return{kind:"error",reason:"unc-not-supported",style:G==="posix"?"posix":"win32"};if(S(q))return{kind:"error",reason:"unc-not-supported",style:"win32"};if(P(q)){if(G==="posix")return{kind:"error",reason:"style-mismatch",style:"posix"};return{kind:"absolute",style:"win32"}}if(Mq(q))return{kind:"error",reason:"drive-relative",style:"win32"};if(q.startsWith("\\"))return{kind:"error",reason:"root-relative",style:"win32"};if(q.startsWith("/")){if(G==="win32")return{kind:"error",reason:"style-mismatch",style:"win32"};return{kind:"absolute",style:"posix"}}return{kind:"error",reason:"not-absolute",style:"unknown"}}function k(q,G){let J=q==="win32"?G.toUpperCase():G,O=Object.freeze({style:q,wirePath:G,exactIdentity:I("acp-remote-exact-path",q,G),collisionIdentity:I("acp-remote-collision-path",q,J)});return E.add(O),O}function I(q,G,J){return`${q}:${Gq("sha256").update(`${G}\x00${J}`).digest("hex")}`}function Xq(q){let G=q.split("/"),J=[];for(let O of G.slice(1)){if(O.length===0||O===".")continue;if(O===".."){if(J.length>0)J.pop();continue}A(O),J.push(O)}return J.length===0?"/":`/${J.join("/")}`}function Yq(q){let G=q[0].toUpperCase(),J=Bq(q),O=[],Q="";for(let U of q.slice(2)){if(m(U)){if(Q.length>0)v(O,Q),Q="";continue}Q+=U}if(Q.length>0)v(O,Q);if(J&&O.length>0)throw new _("trailing-dot-or-space","win32");if(O.length===0)return`${G}:\\`;return`${G}:\\${O.join("\\")}`}function Zq(q,G){let J=q==="/"?[]:q.slice(1).split("/"),O=[...J];for(let Q of G.split("/")){if(Q.length===0||Q===".")continue;if(Q===".."){if(O.length===J.length)throw new _("not-absolute","posix");O.pop();continue}A(Q),O.push(Q)}return O.length===0?"/":`/${O.join("/")}`}function _q(q,G){if(R(G))throw new _("device-namespace-not-supported","win32");if(g(G))throw new _("unc-not-supported","posix");if(S(G))throw new _("unc-not-supported","win32");if(P(G)||G.startsWith("/"))throw new _("style-mismatch","posix");return Zq(q,G)}function $q(q,G){let J=q.indexOf("\\"),O=J===q.length-1?[]:q.slice(J+1).split("\\"),Q=[...O],U="";for(let K of G){if(m(K)){if(U.length>0)y(O.length,Q,U),U="";continue}U+=K}if(U.length>0)y(O.length,Q,U);let $=q.slice(0,J+1);if(Q.length===0)return $;return`${$}${Q.join("\\")}`}function Fq(q,G){let J=W(G,"win32");if(J.kind==="absolute")throw new _("style-mismatch","win32");if(J.reason!=="not-absolute")throw new _(J.reason,J.style);return $q(q,G)}function y(q,G,J){if(J===".")return;if(J===".."){if(G.length===q)throw new _("not-absolute","win32");G.pop();return}f(J),G.push(J)}function v(q,G){if(G===".")return;if(G===".."){if(q.length>0)q.pop();return}f(G),q.push(G)}function A(q){if(q.includes("\x00"))throw new _("invalid-character","posix")}function f(q){let G=Hq(q),J=Kq(G);if(J!==void 0&&Oq.has(J.toUpperCase()))throw new _("reserved-device-name","win32");if(G!==q)throw new _("trailing-dot-or-space","win32");if(q.includes(":"))throw new _("alternate-data-stream","win32");if(/~\d/u.test(q))throw new _("short-name-alias","win32");for(let O of q){let Q=O.codePointAt(0);if(Q===void 0||Q===0||Q>=1&&Q<=31||'<>"|?*'.includes(O))throw new _("invalid-character","win32")}}function Hq(q){let G=q.length;while(G>0){let J=q[G-1];if(J!=="."&&J!==" ")break;G-=1}return q.slice(0,G)}function Kq(q){if(q.length===0)return;let G=q.indexOf(".");return G===-1?q:q.slice(0,G)}function g(q){return q.startsWith("//")||q.startsWith("/\\")}function R(q){return/^([\\/]){2}[?.][\\/]/u.test(q)}function S(q){return/^[\\/]{2}/u.test(q)}function P(q){return/^[A-Za-z]:[\\/]/u.test(q)}function Mq(q){return/^[A-Za-z]:(?![\\/])/u.test(q)}function m(q){return q==="\\"||q==="/"}function Bq(q){if(q.length<=3)return!1;let G=q[q.length-1];return G==="\\"||G==="/"}var H="acp-remote-workspaces",d=/^[a-f0-9]{64}$/,b=new Map,h=new Lq,Nq;class X extends Error{name="AcpRemoteWorkspaceStateError";code="acp_remote_workspace_state_invalid";constructor(q){super(`ACP remote workspace durable state is invalid (${q})`);Object.setPrototypeOf(this,new.target.prototype)}}function iq(q){return{version:1,kind:"acp-remote",style:q.style,wirePath:q.workspace.wirePath,exactIdentity:q.workspace.exactIdentity,collisionIdentity:q.workspace.collisionIdentity}}function Tq(q){if(!q||typeof q!=="object"||Array.isArray(q))throw new X("descriptor-shape");let G=q;if(G.version!==1)throw new X("descriptor-version");if(G.kind!=="acp-remote")throw new X("descriptor-kind");if(G.style!=="posix"&&G.style!=="win32")throw new X("descriptor-style");if(typeof G.wirePath!=="string"||typeof G.exactIdentity!=="string"||typeof G.collisionIdentity!=="string")throw new X("descriptor-shape");let J;try{J=C(G.wirePath,G.style)}catch{throw new X("descriptor-wire-path")}if(J.exactIdentity!==G.exactIdentity||J.collisionIdentity!==G.collisionIdentity)throw new X("descriptor-identity");return{version:1,kind:"acp-remote",style:G.style,wirePath:J.wirePath,exactIdentity:J.exactIdentity,collisionIdentity:J.collisionIdentity}}function cq(q,G=F()){if(typeof q!=="string"||!/^acp-remote-collision-path:[a-f0-9]{64}$/.test(q))throw new X("descriptor-collision-identity");let J=Z.resolve(G),O=Vq("sha256").update(`acp-remote-host-state\x00${q}`).digest("hex");return Z.join(J,H,O)}async function sq(q){let G=Z.resolve(F());await jq(q,G)}async function rq(q,G){let J=Z.resolve(F());return s(q,J,G)}async function oq(q,G){let J=String(q);if(Z.dirname(G)!==J)throw new X("state-file-path");let O=await L(G);if(O.isSymbolicLink()||!O.isFile())throw new X("state-file-type");if(typeof process.getuid==="function"&&O.uid!==process.getuid())throw new X("state-file-owner");let Q=typeof O.mode==="bigint"?Number(O.mode&BigInt(511)):O.mode&511;if(process.platform!=="win32"&&Q!==384)throw new X("state-file-mode");await M(G,J,Z.basename(G))}async function aq(q,G,J){let O=String(q);if(Z.dirname(G)!==O)throw new X("state-file-path");let[Q,U]=await Promise.all([J.stat({bigint:!0}),L(G,{bigint:!0})]);if(U.isSymbolicLink()||!U.isFile()||!Q.isFile()||U.dev!==Q.dev||U.ino!==Q.ino)throw new X("state-file-replaced");if(typeof process.getuid==="function"&&(Number(U.uid)!==process.getuid()||Number(Q.uid)!==process.getuid()))throw new X("state-file-owner");let $=Number(U.mode&BigInt(511)),K=Number(Q.mode&BigInt(511));if(process.platform!=="win32"&&($!==384||K!==384))throw new X("state-file-mode");await M(G,O,Z.basename(G))}function tq(q,G,J,O){let Q=q[0];if(Q?.type!=="session_created"||Q.sessionId!==G||Q.data.sessionId!==G||Q.cwd!==J||Q.projectPath!==J)throw new X("remote-session-identity");if(O){let U=Tq(Q.data.remoteWorkspace);if(U.version!==O.version||U.kind!==O.kind||U.style!==O.style||U.wirePath!==O.wirePath||U.exactIdentity!==O.exactIdentity||U.collisionIdentity!==O.collisionIdentity)throw new X("remote-session-workspace")}for(let U of q)if(U.sessionId!==G||U.cwd!==J||U.projectPath!==J)throw new X("remote-session-event-identity");return Q}function n(q){return d.test(q)}async function p(q=F()){let G=Z.resolve(q);return u(`${G}\x00${H}`,async()=>{let J=Z.join(G,H),O;try{O=await c(G,(U)=>bq(U,{withFileTypes:!0}))}catch(U){if(U.code==="ENOENT")return[];throw U}await Nq?.();let Q=[];for(let U of O){if(!n(U.name))continue;let $=Z.join(J,U.name);try{let K=await s($,G,async(qq)=>qq);Q.push(K)}catch(K){if(K.code==="ENOENT")throw new X("protected-root-missing");throw K}}return Q.sort((U,$)=>U.localeCompare($))})}function i(q,G){if(typeof q!=="string"||!Z.isAbsolute(q))throw new X("protected-root-shape");let J=Z.resolve(q);if(J!==q)throw new X("protected-root-shape");let O=Z.relative(G,J),Q=`${H}${Z.sep}`;if(O===""||O===H||!O.startsWith(Q)||O.includes(`${Z.sep}..`)||O.startsWith(`..${Z.sep}`)||Z.isAbsolute(O))throw new X("protected-root-shape");let U=O.split(Z.sep);if(U.length!==2||U[0]!==H)throw new X("protected-root-shape");if(!d.test(U[1]??""))throw new X("protected-root-digest");return{storageRoot:G,digest:U[1]}}async function c(q,G){await r(q,q);let J=Z.join(q,H);try{await D(J,q),await M(J,q,H)}catch(O){if(O.code==="ENOENT")throw O;throw O}return G(J)}async function jq(q,G){await u(q,async()=>{let J=i(q,G);if(J.storageRoot!==G)throw new X("storage-root-mismatch");await r(J.storageRoot,G);let O=Z.join(J.storageRoot,H);await l(O,J.storageRoot),await M(O,G,H);let Q=Z.join(O,J.digest);await l(Q,O),await M(Q,O,J.digest)})}async function s(q,G,J){return u(q,async()=>{let O=i(q,G);if(O.storageRoot!==G)throw new X("storage-root-mismatch");let Q=Z.join(O.storageRoot,H);await c(G,async($)=>{if($!==Q)throw new X("protected-root-shape")});let U=Z.join(Q,O.digest);return await D(U,Q),await M(U,Q,O.digest),J(U)})}async function l(q,G){try{let J=await L(q);o(J,q)}catch(J){if(J.code!=="ENOENT")throw J;await Cq(q,{recursive:!1,mode:448})}await D(q,G)}async function D(q,G){let J=await L(q);o(J,q),await M(q,G,Z.basename(q))}async function r(q,G){let J=await L(q);Dq(J,q),await uq(q,G)}function Dq(q,G){a(q,G);let J=t(q);if(process.platform!=="win32"&&((J&448)!==448||(J&18)!==0))throw new X("protected-root-mode")}function o(q,G){a(q,G);let J=t(q);if(process.platform!=="win32"&&J!==448)throw new X("protected-root-mode")}function a(q,G){if(q.isSymbolicLink()||!q.isDirectory())throw new X("protected-root-symlink");if(typeof process.getuid==="function"&&q.uid!==process.getuid())throw new X("protected-root-owner");if(G.includes(`..${Z.sep}`))throw new X("protected-root-shape")}function t(q){return typeof q.mode==="bigint"?Number(q.mode&BigInt(511)):q.mode&511}async function M(q,G,J){let O=await N(q),Q=await N(G),U=Z.join(Q,J);if(O!==U)throw new X("protected-root-realpath")}async function uq(q,G){let J=await N(q),O=await N(G);if(J!==O)throw new X("protected-root-realpath")}async function u(q,G){let J=h.getStore();if(J?.has(q))throw new X("state-root-reentry");let O=b.get(q)??Promise.resolve(),Q=new Set(J??[]);Q.add(q);let U=O.catch(()=>{return}).then(()=>h.run(Q,G)),$=U.then(()=>{return},()=>{return});b.set(q,$);try{return await U}finally{if(b.get(q)===$)b.delete(q)}}import{execSync as wq}from"node:child_process";import{createHash as zq}from"node:crypto";import{realpathSync as xq}from"node:fs";import{readdir as Iq}from"node:fs/promises";import*as Y from"node:path";function yq(q){return Y.resolve(q).replace(/[/\\]/g,"-").replace(/:/g,"_")}function vq(q){let G=q.replace(/_/g,":");if(G.startsWith("-"))G="/"+G.slice(1);return G.replace(/-/g,"/")}function Eq(q){let G=yq(q);return Y.join(F(),"projects",G)}function e(q){let G=Y.resolve(q),J=[];while(!0)try{return Y.resolve(xq.native(G),...J.reverse())}catch(O){let Q=O.code;if(Q!=="ENOENT"&&Q!=="ENOTDIR")throw O;let U=Y.dirname(G);if(U===G)return Y.resolve(q);J.push(Y.basename(G)),G=U}}function XG(q,G="projectPath"){if(!Y.isAbsolute(q))throw Error(`${G} must be absolute`);let J=Y.resolve(q),O=e(J),Q=Y.join(e(F()),"acp-remote-workspaces"),U=Y.relative(Q,O),$=U.split(Y.sep)[0];if(U===""||U!==".."&&!Y.isAbsolute(U)&&!U.startsWith(`..${Y.sep}`)&&$!==void 0&&/^[a-f0-9]{64}$/i.test($))throw Error(`${G} must reference a local workspace`);return J}function w(q){return Eq(q)}function T(q){return String(q)}function Wq(q){return typeof q==="string"&&q!=="."&&q!==".."&&/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,199}$/.test(q)}function B(q){if(!Wq(q))throw Error(`Invalid session ID: ${q}`)}function YG(q,G){return B(G),Y.join(w(q),`${G}.jsonl`)}function ZG(q,G){return B(G),Y.join(T(q),`${G}.jsonl`)}function _G(q,G){return B(G),Y.join(w(q),`${G}.inbox.json`)}function $G(q,G){return B(G),Y.join(T(q),`${G}.inbox.json`)}function FG(q,G){return B(G),Y.join(w(q),`${G}.goal.json`)}function HG(q,G){return B(G),Y.join(T(q),`${G}.goal.json`)}function KG(q,G){B(G);let J=zq("sha256").update(G).digest("hex");return Y.join(T(q),`.session-lease-${J}.lock`)}function MG(q){try{return wq("git rev-parse --abbrev-ref HEAD",{cwd:q,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}async function kq(){try{let q=Y.join(F(),"projects");return(await Iq(q,{withFileTypes:!0})).filter((J)=>J.isDirectory()).map((J)=>J.name)}catch{return[]}}async function BG(){let q=Y.resolve(F()),G=await kq().then((O)=>O.map((Q)=>({storagePath:Y.join(q,"projects",Q),projectPath:vq(Q),kind:"local"}))).catch(()=>[]),J=await p().then((O)=>O.map((Q)=>({storagePath:String(Q),projectPath:String(Q),kind:"acp-remote"})));return[...G,...J]}
2
- export{F as gk,_ as hk,Qq as ik,Uq as jk,gq as kk,Rq as lk,C as mk,Sq as nk,X as ok,iq as pk,Tq as qk,cq as rk,sq as sk,rq as tk,oq as uk,aq as vk,tq as wk,p as xk,vq as yk,Eq as zk,XG as Ak,Wq as Bk,B as Ck,YG as Dk,ZG as Ek,_G as Fk,$G as Gk,FG as Hk,HG as Ik,KG as Jk,MG as Kk,kq as Lk,BG as Mk};
2
+ export{F as dk,_ as ek,Qq as fk,Uq as gk,gq as hk,Rq as ik,C as jk,Sq as kk,X as lk,iq as mk,Tq as nk,cq as ok,sq as pk,rq as qk,oq as rk,aq as sk,tq as tk,p as uk,vq as vk,Eq as wk,XG as xk,Wq as yk,B as zk,YG as Ak,ZG as Bk,_G as Ck,$G as Dk,FG as Ek,HG as Fk,KG as Gk,MG as Hk,BG as Ik};
@@ -1,2 +1,2 @@
1
1
  function v(b){switch(b){case"default":case"ignore":case void 0:return"default";case"acceptEdits":return"autoEdit";case"dontAsk":case"bypassPermissions":return"yolo";case"plan":return"plan";default:return"default"}}
2
- export{v as xh};
2
+ export{v as vh};
@@ -1,2 +1,2 @@
1
1
  var i="verification",E="goal-verification",e="review";function t(n){return n==="verification"||n==="goal-verification"}function o(n){return t(n)||n==="review"}
2
- export{i as ch,E as dh,e as eh,t as fh,o as gh};
2
+ export{i as ah,E as bh,e as ch,t as dh,o as eh};
@@ -1,2 +1,2 @@
1
- import{ih as U,ph as a}from"./chunk-kkzznz4w.js";import{Wi as A,Xi as o,Zi as s}from"./chunk-tm3789m3.js";import{Ej as J1,Ij as $,Jj as Z,Kj as b,Lj as K}from"./chunk-rmfzym94.js";import{gk as $1}from"./chunk-n52n2w5v.js";var w=[{min:0,max:59},{min:0,max:23},{min:1,max:31},{min:1,max:12},{min:0,max:7}],K1={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6},u=new Map;function I(J,B,j){let Y=new Set;for(let H of J.split(",")){let[k,G]=H.split("/"),V=G?Number.parseInt(G,10):1;if(!Number.isInteger(V)||V<1)throw Error(`Invalid cron step in "${J}"`);let X=B,Q=j;if(k!=="*"&&k!=="")if(k.includes("-")){let[W,B1]=k.split("-");X=Number.parseInt(W,10),Q=Number.parseInt(B1,10)}else X=Number.parseInt(k,10),Q=X;if(!Number.isInteger(X)||!Number.isInteger(Q)||X<B||Q>j||X>Q)throw Error(`Invalid cron range "${k}" in field "${J}"`);for(let W=X;W<=Q;W+=V)Y.add(W)}return Y}function d(J){let B=J.trim().split(/\s+/);if(B.length!==5)throw Error(`Cron expression must have 5 fields (min hour dom mon dow), got ${B.length}`);let[j,Y,H,k,G]=B,V=I(G,w[4].min,w[4].max),X=new Set([...V].map((Q)=>Q===7?0:Q));return{minutes:I(j,w[0].min,w[0].max),hours:I(Y,w[1].min,w[1].max),daysOfMonth:I(H,w[2].min,w[2].max),months:I(k,w[3].min,w[3].max),daysOfWeek:X,domRestricted:H.trim()!=="*",dowRestricted:G.trim()!=="*"}}function Y1(J,B){if(!B)return{minute:J.getMinutes(),hour:J.getHours(),dayOfMonth:J.getDate(),month:J.getMonth()+1,dayOfWeek:J.getDay()};let j=u.get(B);if(!j)j=new Intl.DateTimeFormat("en-US",{timeZone:B,month:"numeric",day:"numeric",hour:"numeric",minute:"numeric",weekday:"short",hourCycle:"h23"}),u.set(B,j);let Y=Object.fromEntries(j.formatToParts(J).filter((H)=>H.type!=="literal").map((H)=>[H.type,H.value]));return{minute:Number(Y.minute),hour:Number(Y.hour),dayOfMonth:Number(Y.day),month:Number(Y.month),dayOfWeek:K1[Y.weekday]??-1}}function j1(J,B,j){let Y=Y1(B,j);if(!J.minutes.has(Y.minute))return!1;if(!J.hours.has(Y.hour))return!1;if(!J.months.has(Y.month))return!1;let H=J.daysOfMonth.has(Y.dayOfMonth),k=J.daysOfWeek.has(Y.dayOfWeek);if(J.domRestricted&&J.dowRestricted)return H||k;if(J.domRestricted)return H;if(J.dowRestricted)return k;return!0}function H1(J,B,j){let Y=d(J),H=new Date(B.getTime());H.setSeconds(0,0),H.setMinutes(H.getMinutes()+1);let k=new Date(B.getTime());k.setFullYear(k.getFullYear()+4);while(H.getTime()<=k.getTime()){if(j1(Y,H,j))return new Date(H.getTime());H.setMinutes(H.getMinutes()+1)}return null}var m={s:1000,m:60000,h:3600000,d:86400000};function e1(J){let j=J.trim().toLowerCase().match(/^(\d+)\s*([smhd]?)$/);if(!j)return null;let Y=Number.parseInt(j[1],10);if(!Number.isInteger(Y)||Y<=0)return null;let H=j[2]||"m";return Y*m[H]}function k1(J){for(let B of["d","h","m","s"]){let j=m[B];if(J%j===0)return`${J/j}${B}`}return`${Math.round(J/1000)}s`}function F(J,B,j){switch(J.kind){case"cron":{if(!J.cron)return null;try{return H1(J.cron,B,J.timezone)}catch{return null}}case"interval":{if(!J.intervalMs||J.intervalMs<=0)return null;let H=new Date((j??B).getTime()+J.intervalMs);return H.getTime()<=B.getTime()?new Date(B.getTime()+1000):H}case"once":{if(!J.runAt)return null;let Y=new Date(J.runAt);if(Number.isNaN(Y.getTime()))return null;return Y.getTime()>B.getTime()?Y:null}default:return null}}function L(J){switch(J.kind){case"cron":if(!J.cron)return"cron trigger requires a cron expression";try{if(d(J.cron),J.timezone)new Intl.DateTimeFormat("en-US",{timeZone:J.timezone}).format();return null}catch(B){return B instanceof Error?B.message:"invalid cron expression"}case"interval":if(!J.intervalMs||J.intervalMs<60000)return"interval trigger requires intervalMs >= 60000 (1 minute)";return null;case"once":{if(!J.runAt)return"once trigger requires runAt timestamp";let B=new Date(J.runAt);if(Number.isNaN(B.getTime()))return"once trigger runAt is not a valid date";return null}default:return"unknown trigger kind"}}function $0(J){switch(J.kind){case"cron":return`cron: ${J.cron??"?"}`;case"interval":return`every ${J.intervalMs?k1(J.intervalMs):"?"}`;case"once":return`once at ${J.runAt??"?"}`;default:return"unknown"}}import{mkdir as a1,readFile as t1}from"node:fs/promises";import Z1 from"node:path";import{nanoid as r1}from"nanoid";import y1 from"write-file-atomic";var x=160,Q1=240,h=$.String({pattern:"^[a-f0-9]{64}$"}),X1=Z($.Object({id:$.String({minLength:1,maxLength:128}),position:$.Integer({minimum:0,maximum:x-1}),queuedAt:$.String({minLength:20,maxLength:32}),kind:K(["user","internal"]),state:K(["pending","locked"]),delivery:K(["current_turn","next_turn","recovery"]),mutable:$.Boolean(),preview:$.Optional($.String({maxLength:Q1})),previewTruncated:$.Boolean(),attachmentCount:$.Integer({minimum:0,maximum:20})},{additionalProperties:!1})),c=Z($.Object({version:h,pending:$.Integer({minimum:0,maximum:x}),mutable:$.Integer({minimum:0,maximum:x}),locked:$.Integer({minimum:0,maximum:x}),internal:$.Integer({minimum:0,maximum:x}),items:$.Array(X1,{maxItems:x})},{additionalProperties:!1})),b1=$.Union([$.Object({type:$.Literal("remove"),messageId:$.String({minLength:1,maxLength:128})},{additionalProperties:!1}),$.Object({type:$.Literal("move"),messageId:$.String({minLength:1,maxLength:128}),toPosition:$.Integer({minimum:0,maximum:x-1})},{additionalProperties:!1})]),B0=Z($.Object({expectedVersion:h,operation:b1},{additionalProperties:!1})),K0=Z($.Object({snapshot:c},{additionalProperties:!1})),W1=K(["revision_conflict","already_claimed","immutable_origin","immutable_boundary","not_found","runtime_unavailable","invalid_mutation","storage_unavailable"]),Y0=Z($.Object({error:$.Object({code:W1,message:$.String({minLength:1,maxLength:256})},{additionalProperties:!1}),snapshot:c},{additionalProperties:!1}));var G1=K(["preferences","conventions","lessons","debugging"]),V1=$.Object({outcome:K(["nothing_to_store","disabled","failed"]),entries:$.Literal(0),topics:$.Tuple([])},{additionalProperties:!1}),w1=$.Object({outcome:$.Literal("written"),entries:$.Integer({minimum:1,maximum:20}),topics:$.Array(G1,{minItems:1,maxItems:4,uniqueItems:!0})},{additionalProperties:!1}),k0=Z($.Union([w1,V1]));var g=128,D1=128,z1=8,x1=1e6,O1=8640000000000000,D=$.Integer({minimum:0,maximum:x1}),M=$.Integer({minimum:0,maximum:O1}),q1=$.String({minLength:1,maxLength:g,pattern:"^[^\x00-\x1F]+$"}),v1=K(["starting","thinking","responding","executing_tools","compacting","continuing"]),P1=$.Refine($.Object({name:q1,kind:$.Optional(K(["readonly","write","execute"])),startedAt:M,progress:$.Optional(D),total:$.Optional(D)},{additionalProperties:!1}),(J)=>J.progress===void 0&&J.total===void 0||J.progress!==void 0&&J.total!==void 0&&J.progress<=J.total,()=>"progress and total must be present together with progress <= total"),f1=$.Refine($.Object({phase:v1,startedAt:M,updatedAt:M,turn:D,maxTurns:$.Union([D,$.Null()]),outputStarted:$.Boolean(),toolCallsStarted:D,toolCallsCompleted:D,activeTools:$.Array(P1,{maxItems:z1}),activeToolOverflow:D},{additionalProperties:!1}),(J)=>J.startedAt<=J.updatedAt&&J.toolCallsCompleted<=J.toolCallsStarted&&J.activeTools.length+J.activeToolOverflow<=J.toolCallsStarted-J.toolCallsCompleted,()=>"turn activity snapshot counters and timestamps are inconsistent"),b0=Z($.Object({version:$.Literal(1),generation:$.String({minLength:1,maxLength:D1,pattern:"^[^\x00-\x1F]+$"}),revision:D,snapshot:$.Union([f1,$.Null()])},{additionalProperties:!1}));function W0(J){let B=[...J].filter((j)=>{let Y=j.codePointAt(0)??0;return Y>31&&Y!==127}).join("").trim().slice(0,g);if(!B)throw Error("Turn activity tool name is empty");return B}var n=16384;function V0(J){let B=/^\s*\/btw(?:\s+([\s\S]*))?\s*$/iu.exec(J);if(!B)return;return{question:(B[1]??"").trim()}}var O=Z(K(["default","autoEdit","yolo","plan"]));var R=Z(K(["user","assistant","system","tool"])),I1=Z($.Union([$.Object({type:$.Literal("text"),text:$.String()}),$.Object({type:$.Literal("image_url"),image_url:$.Object({url:$.String()})})])),t=$.Union([$.String(),$.Array(I1)]),v0=Z($.Object({id:$.String(),role:R,content:t,timestamp:$.Number(),metadata:$.Optional($.Record($.String(),$.Unknown())),thinkingContent:$.Optional($.String()),tool_call_id:$.Optional($.String()),name:$.Optional($.String()),tool_calls:$.Optional($.Unknown())})),N1=Z(K(["queued","running","completed","failed","cancelled","interrupted"])),N=Z(K(["local","worktree"])),E=Z(K(["high","medium","low"])),_=Z(K(["feature","bug","maintenance","research"])),C1=Z(K(["applied","discarded","conflicted"])),U1=Z($.Object({status:C1,updatedAt:$.String(),sourceCommit:$.Optional($.String()),changedFiles:$.Optional($.Integer({minimum:0})),message:$.Optional($.String())})),F1=Z($.Object({changedFiles:$.Integer({minimum:0}),additions:$.Integer({minimum:0}),deletions:$.Integer({minimum:0}),commits:$.Integer({minimum:0})})),L1=Z($.Object({path:$.String({minLength:1}),patch:$.String({maxLength:2097152}),additions:$.Integer({minimum:0}),deletions:$.Integer({minimum:0}),binary:$.Boolean(),truncated:$.Boolean()})),P0=Z($.Object({sessionId:$.String(),projectPath:$.String(),baseCommit:$.String(),files:$.Array(L1,{maxItems:100}),truncated:$.Boolean()})),M1=$.Union([$.String(),$.Number(),$.Boolean(),$.Array($.String())]),A1=Z($.Object({name:$.String(),type:K(["string","number","integer","boolean","select","multi-select"]),title:$.String(),description:$.Optional($.String()),required:$.Boolean(),defaultValue:$.Optional(M1),options:$.Optional($.Array($.Object({value:$.String(),label:$.String()}))),format:$.Optional(K(["date","uri","email","date-time"])),minimum:$.Optional($.Number()),maximum:$.Optional($.Number()),minLength:$.Optional($.Number()),maxLength:$.Optional($.Number()),minItems:$.Optional($.Number()),maxItems:$.Optional($.Number())})),f0=Z($.Object({serverName:$.String(),mode:K(["form","url"]),message:$.String(),fields:$.Optional($.Array(A1)),requestedSchema:$.Optional($.Record($.String(),$.Unknown())),url:$.Optional($.String()),domain:$.Optional($.String()),elicitationId:$.Optional($.String())})),R1=Z($.Object({type:K(["permission","question","elicitation"]),requestId:$.String()})),E1=Z($.Object({code:K(["authentication","permission","rate_limit","timeout","network","model_unavailable","context_limit","unsupported_input","workspace_unavailable","capacity","runtime"]),message:$.String({minLength:1,maxLength:500}),retryable:$.Boolean(),resource:$.Optional(K(["pending_count","pending_bytes","resident_runtimes"]))})),q=Z(K(["auto","off","minimal","low","medium","high","xhigh","max"])),v=Z(K(["auto","standard","fast","flex"])),P=Z(K(["auto","low","medium","high"])),z=Z($.Union([K(["auto","pragmatic","friendly","explanatory"]),$.String({minLength:7,maxLength:300,pattern:"^(?:(?:user|project):[a-z0-9][a-z0-9._-]{0,63}(?::[a-z0-9][a-z0-9._-]{0,63}){0,3}|plugin:[a-z0-9][a-z0-9._-]{0,63}:[a-z0-9][a-z0-9._-]{0,63}(?::[a-z0-9][a-z0-9._-]{0,63}){0,3})$"})])),C=Z($.Object({sessionId:$.String(),projectPath:$.String(),title:$.Optional($.String()),gitBranch:$.Optional($.String()),rootId:$.String(),parentId:$.Optional($.String()),relationType:$.Optional(K(["subagent","fork"])),resumedFrom:$.Optional($.String()),rootAgentId:$.Optional($.String()),resumeDepth:$.Optional($.Integer({minimum:0})),taskStatus:b(N1,"completed"),taskStatusReason:$.Optional($.String()),taskFailure:$.Optional(E1),taskStartedAt:$.Optional($.String()),taskCompletedAt:$.Optional($.String()),taskPromptSummary:$.Optional($.String()),taskPriority:$.Optional(E),taskKind:$.Optional(_),taskDueAt:$.Optional($.String()),taskModelId:$.Optional($.String()),selectedModelId:$.Optional($.String()),permissionMode:$.Optional(O),reasoningEffort:$.Optional(q),serviceTier:$.Optional(v),responseVerbosity:$.Optional(P),communicationStyle:$.Optional(z),communicationStyleDigest:$.Optional($.String({pattern:"^[a-f0-9]{64}$"})),projectInstructionsDigest:$.Optional($.String({pattern:"^[a-f0-9]{64}$"})),taskRetryAvailable:$.Optional($.Boolean()),taskRetriedFrom:$.Optional($.Object({sessionId:$.String(),projectPath:$.String()})),taskDelivery:$.Optional(U1),taskIsolation:$.Optional(N),taskSourceProjectPath:$.Optional($.String()),taskWorktreePath:$.Optional($.String()),taskWorktreeBranch:$.Optional($.String()),taskBaseCommit:$.Optional($.String()),taskDiffStat:$.Optional(F1),taskQueuePosition:$.Optional($.Integer({minimum:1})),taskQueueDepth:$.Optional($.Integer({minimum:0})),taskConcurrencyLimit:$.Optional($.Integer({minimum:1})),archivedAt:$.Optional($.String()),archivedBySessionId:$.Optional($.String()),pendingInteraction:$.Optional(R1),messageCount:$.Number(),firstMessageTime:$.String(),lastMessageTime:$.String(),hasErrors:$.Boolean()})),I0=Z($.Object({sessions:$.Array(C),nextCursor:$.Optional($.String())})),N0=Z($.Object({session:C,archivedSessionIds:$.Array($.String())})),C0=Z($.Object({session:C,restoredSessionIds:$.Array($.String())})),_1=$.Object({rootTurnId:$.Optional($.String({minLength:1,maxLength:U})),currentTurnId:$.String({minLength:1,maxLength:U}),parentTurnId:$.Optional($.String({minLength:1,maxLength:U}))},{additionalProperties:!1}),U0=Z($.Object({version:$.Union([$.Literal(1),$.Literal(2)]),sessionId:$.String(),goalId:$.String(),objective:$.String(),status:K(["active","verifying","paused","blocked","usage_limited","budget_limited","complete"]),tokenBudget:$.Optional($.Number()),tokensUsed:$.Number(),timeUsedSeconds:$.Number(),continuationCount:$.Number(),statusReason:$.Optional($.String()),completionVerification:$.Optional($.Object({attempt:$.Integer({minimum:1}),status:K(["pending","pass","fail","partial"]),requestedAt:$.String(),completedAt:$.Optional($.String()),verifierSessionId:$.Optional($.String()),summary:$.Optional($.String()),evidenceSha256:$.Optional($.String({pattern:"^[a-f0-9]{64}$"}))})),prematureStop:$.Optional($.Object({pattern:$.Unsafe({type:"string"}),consecutiveCount:$.Integer({minimum:1}),detectedAt:$.String()})),executionHostFailure:$.Optional($.Object({category:K(a),consecutiveCount:$.Integer({minimum:1,maximum:3}),detectedAt:$.String()},{additionalProperties:!1})),turnLineage:$.Optional(_1),verificationStall:$.Optional($.Unsafe({type:"object"})),executionFrontier:$.Optional($.Object({taskListId:$.String({minLength:1,maxLength:256}),total:$.Integer({minimum:0}),completed:$.Integer({minimum:0}),inProgress:$.Integer({minimum:0}),pending:$.Integer({minimum:0}),blocked:$.Integer({minimum:0}),nextTask:$.Optional($.Object({id:$.String({minLength:1}),subject:$.String({minLength:1,maxLength:512}),priority:K(["high","medium","low"])})),digestSha256:$.String({pattern:"^[a-f0-9]{64}$"}),observedAt:$.String()})),frontierStall:$.Optional($.Object({category:K(["waiting_dependency","same_task_no_effect","repeated_deferral"]),consecutiveCount:$.Integer({minimum:1,maximum:3}),digestSha256:$.String({pattern:"^[a-f0-9]{64}$"}),detectedAt:$.String()})),createdAt:$.String(),updatedAt:$.String()})),r=Z($.Object({role:R,content:t,metadata:$.Optional($.Unknown()),reasoningContent:$.Optional($.String()),thinkingContent:$.Optional($.String()),tool_call_id:$.Optional($.String()),name:$.Optional($.String()),tool_calls:$.Optional($.Unknown())})),F0=Z($.Object({session:C,messages:$.Array(r)})),y=Z(K(["conversation","code","both"])),S1=Z($.Object({messageId:$.String(),preview:$.String(),createdAt:$.String(),fileCount:$.Integer({minimum:0})})),L0=Z($.Object({targetMessageId:$.String({minLength:1}),mode:b(y,"conversation")})),M0=Z($.Object({checkpoint:S1,mode:y,removedTurns:$.Integer({minimum:1}),restoredFiles:$.Array($.String()),messages:$.Array(r)})),l1=K(["running","completed","failed","cancelled"]),i=Z($.Object({id:$.String(),subagentType:$.String(),description:$.String(),status:l1,background:$.Boolean(),rootAgentId:$.String(),resumedFrom:$.Optional($.String()),resumeDepth:$.Integer({minimum:0}),createdAt:$.Number(),lastActiveAt:$.Number(),completedAt:$.Optional($.Number()),restartRecovery:$.Optional($.Object({outcome:K(["completed","interrupted","failed"]),recoveredAt:$.Number()})),result:$.Optional($.Object({success:$.Boolean(),message:$.String(),error:$.Optional($.String()),verificationCommands:$.Optional($.Array($.String())),verificationVerdict:$.Optional(K(["pass","fail","partial"])),modifiedFiles:$.Optional($.Array($.String()))})),stats:$.Optional($.Object({tokens:$.Optional($.Number()),toolCalls:$.Optional($.Number()),duration:$.Optional($.Number())}))})),A0=Z($.Object({prompt:$.String({minLength:1,maxLength:32000,pattern:"\\S"})})),R0=Z($.Object({source:i,session:i})),E0=Z($.Object({sessionId:$.String(),projectPath:$.String()})),_0=Z($.Object({path:$.String(),name:$.String(),gitBranch:$.Optional($.String()),available:$.Boolean(),isCurrent:$.Boolean(),boundAt:$.String()})),S0=Z($.Union([$.Object({cancelled:$.Literal(!0)}),$.Object({cancelled:$.Literal(!1),path:$.String({minLength:1})})])),l0=Z($.Object({type:$.String(),seq:$.Optional($.Number()),properties:$.Record($.String(),$.Unknown())})),T=$.Object({type:K(["file","image","url"]),path:$.Optional($.String()),url:$.Optional($.String()),content:$.Optional($.String({maxLength:o})),mimeType:$.Optional($.String()),name:$.Optional($.String())}),u1=20,d1=12288,m1=4096,h1=$.Object({id:$.String({minLength:1,maxLength:200}),text:$.String({minLength:1,maxLength:d1}),sourceMessageId:$.String({minLength:1,maxLength:500}),sourceRole:K(["user","assistant"]),comment:$.Optional($.String({maxLength:m1}))}),p=$.Record($.String(),$.Unknown()),u0=Z($.Object({prompt:$.String({minLength:1,maxLength:32000,pattern:"\\S"}),title:$.Optional($.String({minLength:1,maxLength:200})),taskPriority:b(E,"medium"),taskKind:b(_,"feature"),taskDueAt:$.Optional($.String({minLength:1,maxLength:64})),projectPath:$.Optional($.String()),modelId:$.Optional($.String({minLength:1,maxLength:500})),reasoningEffort:$.Optional(q),serviceTier:$.Optional(v),responseVerbosity:$.Optional(P),communicationStyle:$.Optional(z),isolation:b(N,"worktree"),permissionMode:b(O,"default"),attachments:$.Optional($.Array(T,{maxItems:A})),outputSchema:$.Optional(p)})),d0=Z($.Object({title:$.Optional($.String({minLength:1,maxLength:200})),taskPriority:$.Optional(E),taskKind:$.Optional(_),taskDueAt:$.Optional($.Union([$.String({minLength:1,maxLength:64}),$.Null()]))})),m0=Z($.Object({session:C,runId:$.String(),messageId:$.String(),status:K(["queued","running"]),queuePosition:$.Optional($.Integer({minimum:1})),queueDepth:$.Optional($.Integer({minimum:0})),maxConcurrentTasks:$.Optional($.Integer({minimum:1}))})),h0=Z($.Object({action:K(["apply","discard"])})),S=Z($.Object({kind:K(["cron","interval","once"]),cron:$.Optional($.String({minLength:1,maxLength:120})),intervalMs:$.Optional($.Integer({minimum:60000})),runAt:$.Optional($.String({minLength:1,maxLength:40})),timezone:$.Optional($.String({minLength:1,maxLength:80}))})),c1=Z($.Object({modelId:$.Optional($.String({minLength:1,maxLength:500})),reasoningEffort:$.Optional(q),serviceTier:$.Optional(v),responseVerbosity:$.Optional(P),communicationStyle:$.Optional(z),isolation:b(N,"worktree"),permissionMode:b(O,"default")})),l=Z($.Object({id:$.String(),title:$.Optional($.String({minLength:1,maxLength:200})),prompt:$.String({minLength:1,maxLength:32000,pattern:"\\S"}),projectPath:$.String({minLength:1}),trigger:S,dispatch:c1,enabled:$.Boolean(),createdAt:$.String(),updatedAt:$.String(),nextRunAt:$.Union([$.String(),$.Null()]),expiresAt:$.Union([$.String(),$.Null()]),lastRunAt:$.Optional($.String()),lastRunSessionId:$.Optional($.String()),lastStatus:$.Optional(K(["queued","running","completed","failed","cancelled","interrupted","error"])),lastError:$.Optional($.String()),runCount:$.Integer({minimum:0})})),c0=Z($.Object({title:$.Optional($.String({minLength:1,maxLength:200})),prompt:$.String({minLength:1,maxLength:32000,pattern:"\\S"}),projectPath:$.String({minLength:1}),trigger:S,modelId:$.Optional($.String({minLength:1,maxLength:500})),reasoningEffort:$.Optional(q),serviceTier:$.Optional(v),responseVerbosity:$.Optional(P),communicationStyle:$.Optional(z),isolation:b(N,"worktree"),permissionMode:b(O,"default"),enabled:b($.Boolean(),!0)})),g0=Z($.Object({title:$.Optional($.String({minLength:1,maxLength:200})),prompt:$.Optional($.String({minLength:1,maxLength:32000,pattern:"\\S"})),trigger:$.Optional(S),modelId:$.Optional($.String({minLength:1,maxLength:500})),reasoningEffort:$.Optional(q),serviceTier:$.Optional(v),responseVerbosity:$.Optional(P),communicationStyle:$.Optional(z),isolation:$.Optional(N),permissionMode:$.Optional(O),enabled:$.Optional($.Boolean())})),n0=Z($.Object({schedules:$.Array(l)})),i0=Z($.Object({content:$.String({maxLength:s}),projectPath:$.Optional($.String()),modelId:$.Optional($.String({minLength:1,maxLength:500})),reasoningEffort:$.Optional(q),serviceTier:$.Optional(v),responseVerbosity:$.Optional(P),communicationStyle:$.Optional(z),permissionMode:$.Optional(O),attachments:$.Optional($.Array(T,{maxItems:A})),annotations:$.Optional($.Array(h1,{maxItems:u1})),outputSchema:$.Optional(p)})),g1=K(["completed","failed","aborted","timed_out","spawn_error"]),n1=Z($.Object({version:$.Literal(1),command:$.String(),status:g1,exitCode:$.Union([$.Integer(),$.Null()]),durationMs:$.Number({minimum:0}),stdout:$.String(),stderr:$.String(),stdoutOmittedBytes:$.Integer({minimum:0}),stderrOmittedBytes:$.Integer({minimum:0}),binaryOutput:$.Boolean(),truncated:$.Boolean()})),o0=Z($.Object({command:$.String({minLength:1,maxLength:32768,pattern:"^(?![\\s\\S]*\\u0000)(?=[\\s\\S]*\\S)[\\s\\S]*$"}),projectPath:$.Optional($.String())})),s0=Z($.Object({executionId:$.String(),messageId:$.String(),record:n1,auxiliary:$.Boolean(),delivery:$.Optional(K(["current_turn","next_turn"])),queued:$.Optional($.Integer({minimum:0}))})),a0=Z($.Object({question:$.String({minLength:1,maxLength:n,pattern:"^(?![\\s\\S]*\\x00)(?=[\\s\\S]*\\S)[\\s\\S]*$"}),projectPath:$.Optional($.String())})),t0=Z($.Object({response:$.String({minLength:1}),durationMs:$.Number({minimum:0}),modelId:$.Optional($.String()),usage:$.Optional($.Object({promptTokens:$.Number({minimum:0}),completionTokens:$.Number({minimum:0}),totalTokens:$.Number({minimum:0}),reasoningTokens:$.Optional($.Number({minimum:0})),cacheCreationInputTokens:$.Optional($.Number({minimum:0})),cacheReadInputTokens:$.Optional($.Number({minimum:0})),costUsd:$.Optional($.Number({minimum:0}))}))})),r0=Z($.Object({projectPath:$.String(),kind:K(["uncommitted","base","commit"]),ref:$.Optional($.String({maxLength:200})),instructions:$.Optional($.String({maxLength:4000})),modelId:$.Optional($.String({minLength:1,maxLength:200}))})),y0=Z($.Object({reviewId:$.String(),status:$.Literal("running")})),T0=Z($.Object({messageId:$.String(),role:R,content:$.String(),timestamp:$.String()})),p0=Z($.Object({approved:$.Boolean(),remember:$.Optional($.Boolean()),scope:$.Optional(K(["once","session","project"])),targetMode:$.Optional(O),feedback:$.Optional($.String()),answers:$.Optional($.Record($.String(),$.Union([$.String(),$.Array($.String())]))),elicitation:$.Optional($.Object({action:K(["accept","decline","cancel"]),content:$.Optional($.Record($.String(),$.Union([$.String({maxLength:4000}),$.Number(),$.Boolean(),$.Array($.String({maxLength:1000}),{maxItems:100})]),{maxProperties:32}))}))})),i1=Z($.Object({id:z,name:$.String({minLength:1,maxLength:80}),description:$.String({minLength:1,maxLength:256}),source:K(["built-in","user","project","plugin"]),contentSha256:$.Optional($.String({pattern:"^[a-f0-9]{64}$"}))})),e0=Z($.Object({id:$.String(),displayName:$.Optional($.String()),provider:$.String(),model:$.String(),contextWindow:$.Optional($.Number()),maxTokens:$.Optional($.Number()),reasoning:$.Optional($.Boolean()),supportedReasoningEfforts:$.Optional($.Array(K(["off","minimal","low","medium","high","xhigh","max"]))),supportedServiceTiers:$.Optional($.Array(K(["standard","fast","flex"]))),supportedResponseVerbosities:$.Optional($.Array(K(["low","medium","high"]))),communicationStyles:$.Optional($.Array(i1,{maxItems:36})),input:$.Optional($.Array(K(["text","image"]))),overrides:$.Optional($.Object({baseUrl:$.Optional($.String()),temperature:$.Optional($.Number()),maxOutputTokens:$.Optional($.Number()),timeout:$.Optional($.Number()),streamIdleTimeout:$.Optional($.Number({minimum:1000}))}))})),$2=Z(K(["vs-dark","vs-light","hc-black"])),o1=Z(K(["light","dark","system"])),s1=Z($.Object({language:$.String(),codeTheme:$.String(),uiTheme:o1,autoSaveSessions:$.Boolean(),notifyBuild:$.Boolean(),notifyErrors:$.Boolean(),notifySounds:$.Boolean(),privacyTelemetry:$.Boolean(),privacyCrash:$.Boolean(),agentTeamsEnabled:$.Boolean(),communicationStyle:$.Optional(z)})),J2=Z($.Partial(s1));var e=J1("Service"),T1=1;function p1(){return Z1.join($1(),"schedules.json")}class f{filePath;static instance;static getInstance(){if(!f.instance)f.instance=new f;return f.instance}writeChain=Promise.resolve();constructor(J=p1()){this.filePath=J}async readFile(){try{let J=await t1(this.filePath,"utf-8"),B=JSON.parse(J);if(!B||!Array.isArray(B.schedules))return[];let j=[],Y=0;for(let H of B.schedules){let k=l.safeParse(H);if(k.success)j.push(k.data);else Y+=1}if(Y>0)e.warn(`[ScheduleStore] Ignored ${Y} invalid persisted schedule(s)`);return j}catch(J){let B=J;if(B.code!=="ENOENT")e.warn("[ScheduleStore] Failed to read schedules; treating as empty:",B);return[]}}async writeFile(J){await a1(Z1.dirname(this.filePath),{recursive:!0,mode:493});let B={version:T1,schedules:J};await y1(this.filePath,JSON.stringify(B,null,2),{mode:384})}serializeWrite(J){let B=this.writeChain.then(J,J);return this.writeChain=B.then(()=>{return},()=>{return}),B}async list(){return this.readFile()}async get(J){return(await this.readFile()).find((j)=>j.id===J)}async create(J){return this.serializeWrite(async()=>{let B=J.trigger.kind==="cron"&&!J.trigger.timezone?{...J.trigger,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}:J.trigger,j=L(B);if(j)throw Error(j);let Y=new Date;if(B.kind==="once"&&new Date(B.runAt).getTime()<=Y.getTime())throw Error("once trigger runAt must be in the future");let H=Y.toISOString(),k=F(B,Y),G={id:r1(10),title:J.title,prompt:J.prompt,projectPath:J.projectPath,trigger:B,dispatch:{modelId:J.modelId,reasoningEffort:J.reasoningEffort,serviceTier:J.serviceTier,responseVerbosity:J.responseVerbosity,communicationStyle:J.communicationStyle,isolation:J.isolation??"worktree",permissionMode:J.permissionMode??"default"},enabled:J.enabled??!0,createdAt:H,updatedAt:H,nextRunAt:k?k.toISOString():null,expiresAt:null,runCount:0},V=await this.readFile();return V.push(G),await this.writeFile(V),G})}async update(J,B){return this.serializeWrite(async()=>{let j=await this.readFile(),Y=j.findIndex((Q)=>Q.id===J);if(Y===-1)return;let H=j[Y];if(B.trigger){let Q=B.trigger.kind==="cron"&&!B.trigger.timezone?{...B.trigger,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}:B.trigger,W=L(Q);if(W)throw Error(W);if(Q.kind==="once"&&new Date(Q.runAt).getTime()<=Date.now())throw Error("once trigger runAt must be in the future");B={...B,trigger:Q}}let k={...H,...B,dispatch:B.dispatch?{...H.dispatch,...B.dispatch}:H.dispatch,updatedAt:new Date().toISOString()},G=!H.enabled,V=k.enabled,X=B.trigger!==void 0;if((X||G&&V)&&B.nextRunAt===void 0){let Q=new Date,W=F(k.trigger,Q);if(k.nextRunAt=W?W.toISOString():null,X)k.expiresAt=null}return j[Y]=k,await this.writeFile(j),k})}async remove(J){return this.serializeWrite(async()=>{let B=await this.readFile(),j=B.filter((Y)=>Y.id!==J);if(j.length===B.length)return!1;return await this.writeFile(j),!0})}async setEnabled(J,B){return this.update(J,{enabled:B})}}var O2=f.getInstance();
2
- export{n as Sa,V0 as Ta,x as Ua,Q1 as Va,h as Wa,c as Xa,b1 as Ya,z1 as Za,b0 as _a,W0 as $a,k0 as ab,e1 as bb,F as cb,L as db,$0 as eb,P0 as fb,C as gb,L0 as hb,A0 as ib,u0 as jb,d0 as kb,m0 as lb,h0 as mb,l as nb,c0 as ob,g0 as pb,n0 as qb,i0 as rb,o0 as sb,a0 as tb,r0 as ub,f as vb,O2 as wb};
1
+ import{gh as F,nh as a}from"./chunk-53vh6vpt.js";import{Ui as A,Vi as o,Xi as s}from"./chunk-514va7ce.js";import{Cj as J1,Gj as $,Hj as Z,Ij as W,Jj as K}from"./chunk-09kqfdpa.js";import{dk as $1}from"./chunk-ed2hdrwe.js";var w=[{min:0,max:59},{min:0,max:23},{min:1,max:31},{min:1,max:12},{min:0,max:7}],K1={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6},u=new Map;function I(J,B,j){let Y=new Set;for(let H of J.split(",")){let[k,G]=H.split("/"),V=G?Number.parseInt(G,10):1;if(!Number.isInteger(V)||V<1)throw Error(`Invalid cron step in "${J}"`);let X=B,Q=j;if(k!=="*"&&k!=="")if(k.includes("-")){let[b,B1]=k.split("-");X=Number.parseInt(b,10),Q=Number.parseInt(B1,10)}else X=Number.parseInt(k,10),Q=X;if(!Number.isInteger(X)||!Number.isInteger(Q)||X<B||Q>j||X>Q)throw Error(`Invalid cron range "${k}" in field "${J}"`);for(let b=X;b<=Q;b+=V)Y.add(b)}return Y}function d(J){let B=J.trim().split(/\s+/);if(B.length!==5)throw Error(`Cron expression must have 5 fields (min hour dom mon dow), got ${B.length}`);let[j,Y,H,k,G]=B,V=I(G,w[4].min,w[4].max),X=new Set([...V].map((Q)=>Q===7?0:Q));return{minutes:I(j,w[0].min,w[0].max),hours:I(Y,w[1].min,w[1].max),daysOfMonth:I(H,w[2].min,w[2].max),months:I(k,w[3].min,w[3].max),daysOfWeek:X,domRestricted:H.trim()!=="*",dowRestricted:G.trim()!=="*"}}function Y1(J,B){if(!B)return{minute:J.getMinutes(),hour:J.getHours(),dayOfMonth:J.getDate(),month:J.getMonth()+1,dayOfWeek:J.getDay()};let j=u.get(B);if(!j)j=new Intl.DateTimeFormat("en-US",{timeZone:B,month:"numeric",day:"numeric",hour:"numeric",minute:"numeric",weekday:"short",hourCycle:"h23"}),u.set(B,j);let Y=Object.fromEntries(j.formatToParts(J).filter((H)=>H.type!=="literal").map((H)=>[H.type,H.value]));return{minute:Number(Y.minute),hour:Number(Y.hour),dayOfMonth:Number(Y.day),month:Number(Y.month),dayOfWeek:K1[Y.weekday]??-1}}function j1(J,B,j){let Y=Y1(B,j);if(!J.minutes.has(Y.minute))return!1;if(!J.hours.has(Y.hour))return!1;if(!J.months.has(Y.month))return!1;let H=J.daysOfMonth.has(Y.dayOfMonth),k=J.daysOfWeek.has(Y.dayOfWeek);if(J.domRestricted&&J.dowRestricted)return H||k;if(J.domRestricted)return H;if(J.dowRestricted)return k;return!0}function H1(J,B,j){let Y=d(J),H=new Date(B.getTime());H.setSeconds(0,0),H.setMinutes(H.getMinutes()+1);let k=new Date(B.getTime());k.setFullYear(k.getFullYear()+4);while(H.getTime()<=k.getTime()){if(j1(Y,H,j))return new Date(H.getTime());H.setMinutes(H.getMinutes()+1)}return null}var m={s:1000,m:60000,h:3600000,d:86400000};function e1(J){let j=J.trim().toLowerCase().match(/^(\d+)\s*([smhd]?)$/);if(!j)return null;let Y=Number.parseInt(j[1],10);if(!Number.isInteger(Y)||Y<=0)return null;let H=j[2]||"m";return Y*m[H]}function k1(J){for(let B of["d","h","m","s"]){let j=m[B];if(J%j===0)return`${J/j}${B}`}return`${Math.round(J/1000)}s`}function C(J,B,j){switch(J.kind){case"cron":{if(!J.cron)return null;try{return H1(J.cron,B,J.timezone)}catch{return null}}case"interval":{if(!J.intervalMs||J.intervalMs<=0)return null;let H=new Date((j??B).getTime()+J.intervalMs);return H.getTime()<=B.getTime()?new Date(B.getTime()+1000):H}case"once":{if(!J.runAt)return null;let Y=new Date(J.runAt);if(Number.isNaN(Y.getTime()))return null;return Y.getTime()>B.getTime()?Y:null}default:return null}}function L(J){switch(J.kind){case"cron":if(!J.cron)return"cron trigger requires a cron expression";try{if(d(J.cron),J.timezone)new Intl.DateTimeFormat("en-US",{timeZone:J.timezone}).format();return null}catch(B){return B instanceof Error?B.message:"invalid cron expression"}case"interval":if(!J.intervalMs||J.intervalMs<60000)return"interval trigger requires intervalMs >= 60000 (1 minute)";return null;case"once":{if(!J.runAt)return"once trigger requires runAt timestamp";let B=new Date(J.runAt);if(Number.isNaN(B.getTime()))return"once trigger runAt is not a valid date";return null}default:return"unknown trigger kind"}}function $0(J){switch(J.kind){case"cron":return`cron: ${J.cron??"?"}`;case"interval":return`every ${J.intervalMs?k1(J.intervalMs):"?"}`;case"once":return`once at ${J.runAt??"?"}`;default:return"unknown"}}import{mkdir as a1,readFile as t1}from"node:fs/promises";import Z1 from"node:path";import{nanoid as r1}from"nanoid";import y1 from"write-file-atomic";var q=160,Q1=240,h=$.String({pattern:"^[a-f0-9]{64}$"}),X1=Z($.Object({id:$.String({minLength:1,maxLength:128}),position:$.Integer({minimum:0,maximum:q-1}),queuedAt:$.String({minLength:20,maxLength:32}),kind:K(["user","internal"]),state:K(["pending","locked"]),delivery:K(["current_turn","next_turn","recovery"]),mutable:$.Boolean(),preview:$.Optional($.String({maxLength:Q1})),previewTruncated:$.Boolean(),attachmentCount:$.Integer({minimum:0,maximum:20})},{additionalProperties:!1})),g=Z($.Object({version:h,pending:$.Integer({minimum:0,maximum:q}),mutable:$.Integer({minimum:0,maximum:q}),locked:$.Integer({minimum:0,maximum:q}),internal:$.Integer({minimum:0,maximum:q}),items:$.Array(X1,{maxItems:q})},{additionalProperties:!1})),W1=$.Union([$.Object({type:$.Literal("remove"),messageId:$.String({minLength:1,maxLength:128})},{additionalProperties:!1}),$.Object({type:$.Literal("move"),messageId:$.String({minLength:1,maxLength:128}),toPosition:$.Integer({minimum:0,maximum:q-1})},{additionalProperties:!1})]),B0=Z($.Object({expectedVersion:h,operation:W1},{additionalProperties:!1})),K0=Z($.Object({snapshot:g},{additionalProperties:!1})),b1=K(["revision_conflict","already_claimed","immutable_origin","immutable_boundary","not_found","runtime_unavailable","invalid_mutation","storage_unavailable"]),Y0=Z($.Object({error:$.Object({code:b1,message:$.String({minLength:1,maxLength:256})},{additionalProperties:!1}),snapshot:g},{additionalProperties:!1}));var G1=K(["preferences","conventions","lessons","debugging"]),V1=$.Object({outcome:K(["nothing_to_store","disabled","failed"]),entries:$.Literal(0),topics:$.Tuple([])},{additionalProperties:!1}),w1=$.Object({outcome:$.Literal("written"),entries:$.Integer({minimum:1,maximum:20}),topics:$.Array(G1,{minItems:1,maxItems:4,uniqueItems:!0})},{additionalProperties:!1}),k0=Z($.Union([w1,V1]));var c=128,D1=128,z1=8,q1=1e6,v1=8640000000000000,D=$.Integer({minimum:0,maximum:q1}),M=$.Integer({minimum:0,maximum:v1}),x1=$.String({minLength:1,maxLength:c,pattern:"^[^\x00-\x1F]+$"}),P1=K(["starting","thinking","responding","executing_tools","compacting","continuing"]),f1=$.Refine($.Object({name:x1,kind:$.Optional(K(["readonly","write","execute"])),startedAt:M,progress:$.Optional(D),total:$.Optional(D)},{additionalProperties:!1}),(J)=>J.progress===void 0&&J.total===void 0||J.progress!==void 0&&J.total!==void 0&&J.progress<=J.total,()=>"progress and total must be present together with progress <= total"),O1=$.Refine($.Object({phase:P1,startedAt:M,updatedAt:M,turn:D,maxTurns:$.Union([D,$.Null()]),outputStarted:$.Boolean(),toolCallsStarted:D,toolCallsCompleted:D,activeTools:$.Array(f1,{maxItems:z1}),activeToolOverflow:D},{additionalProperties:!1}),(J)=>J.startedAt<=J.updatedAt&&J.toolCallsCompleted<=J.toolCallsStarted&&J.activeTools.length+J.activeToolOverflow<=J.toolCallsStarted-J.toolCallsCompleted,()=>"turn activity snapshot counters and timestamps are inconsistent"),W0=Z($.Object({version:$.Literal(1),generation:$.String({minLength:1,maxLength:D1,pattern:"^[^\x00-\x1F]+$"}),revision:D,snapshot:$.Union([O1,$.Null()])},{additionalProperties:!1}));function b0(J){let B=[...J].filter((j)=>{let Y=j.codePointAt(0)??0;return Y>31&&Y!==127}).join("").trim().slice(0,c);if(!B)throw Error("Turn activity tool name is empty");return B}var n=16384;function V0(J){let B=/^\s*\/btw(?:\s+([\s\S]*))?\s*$/iu.exec(J);if(!B)return;return{question:(B[1]??"").trim()}}var v=Z(K(["default","autoEdit","yolo","plan"]));var R=Z(K(["user","assistant","system","tool"])),I1=Z($.Union([$.Object({type:$.Literal("text"),text:$.String()}),$.Object({type:$.Literal("image_url"),image_url:$.Object({url:$.String()})})])),t=$.Union([$.String(),$.Array(I1)]),P0=Z($.Object({id:$.String(),role:R,content:t,timestamp:$.Number(),metadata:$.Optional($.Record($.String(),$.Unknown())),thinkingContent:$.Optional($.String()),tool_call_id:$.Optional($.String()),name:$.Optional($.String()),tool_calls:$.Optional($.Unknown())})),N1=Z(K(["queued","running","completed","failed","cancelled","interrupted"])),N=Z(K(["local","worktree"])),E=Z(K(["high","medium","low"])),_=Z(K(["feature","bug","maintenance","research"])),U1=Z(K(["applied","discarded","conflicted"])),F1=Z($.Object({status:U1,updatedAt:$.String(),sourceCommit:$.Optional($.String()),changedFiles:$.Optional($.Integer({minimum:0})),message:$.Optional($.String())})),C1=Z($.Object({changedFiles:$.Integer({minimum:0}),additions:$.Integer({minimum:0}),deletions:$.Integer({minimum:0}),commits:$.Integer({minimum:0})})),L1=Z($.Object({path:$.String({minLength:1}),patch:$.String({maxLength:2097152}),additions:$.Integer({minimum:0}),deletions:$.Integer({minimum:0}),binary:$.Boolean(),truncated:$.Boolean()})),f0=Z($.Object({sessionId:$.String(),projectPath:$.String(),baseCommit:$.String(),files:$.Array(L1,{maxItems:100}),truncated:$.Boolean()})),M1=$.Union([$.String(),$.Number(),$.Boolean(),$.Array($.String())]),A1=Z($.Object({name:$.String(),type:K(["string","number","integer","boolean","select","multi-select"]),title:$.String(),description:$.Optional($.String()),required:$.Boolean(),defaultValue:$.Optional(M1),options:$.Optional($.Array($.Object({value:$.String(),label:$.String()}))),format:$.Optional(K(["date","uri","email","date-time"])),minimum:$.Optional($.Number()),maximum:$.Optional($.Number()),minLength:$.Optional($.Number()),maxLength:$.Optional($.Number()),minItems:$.Optional($.Number()),maxItems:$.Optional($.Number())})),O0=Z($.Object({serverName:$.String(),mode:K(["form","url"]),message:$.String(),fields:$.Optional($.Array(A1)),requestedSchema:$.Optional($.Record($.String(),$.Unknown())),url:$.Optional($.String()),domain:$.Optional($.String()),elicitationId:$.Optional($.String())})),R1=Z($.Object({type:K(["permission","question","elicitation"]),requestId:$.String()})),E1=Z($.Object({code:K(["authentication","permission","rate_limit","timeout","network","model_unavailable","context_limit","unsupported_input","workspace_unavailable","capacity","runtime"]),message:$.String({minLength:1,maxLength:500}),retryable:$.Boolean(),resource:$.Optional(K(["pending_count","pending_bytes","resident_runtimes"]))})),x=Z(K(["auto","off","minimal","low","medium","high","xhigh","max"])),P=Z(K(["auto","standard","fast","flex"])),f=Z(K(["auto","low","medium","high"])),z=Z($.Union([K(["auto","pragmatic","friendly","explanatory"]),$.String({minLength:7,maxLength:300,pattern:"^(?:(?:user|project):[a-z0-9][a-z0-9._-]{0,63}(?::[a-z0-9][a-z0-9._-]{0,63}){0,3}|plugin:[a-z0-9][a-z0-9._-]{0,63}:[a-z0-9][a-z0-9._-]{0,63}(?::[a-z0-9][a-z0-9._-]{0,63}){0,3})$"})])),U=Z($.Object({sessionId:$.String(),projectPath:$.String(),title:$.Optional($.String()),gitBranch:$.Optional($.String()),rootId:$.String(),parentId:$.Optional($.String()),relationType:$.Optional(K(["subagent","fork"])),resumedFrom:$.Optional($.String()),rootAgentId:$.Optional($.String()),resumeDepth:$.Optional($.Integer({minimum:0})),taskStatus:W(N1,"completed"),taskStatusReason:$.Optional($.String()),taskFailure:$.Optional(E1),taskStartedAt:$.Optional($.String()),taskCompletedAt:$.Optional($.String()),taskPromptSummary:$.Optional($.String()),taskPriority:$.Optional(E),taskKind:$.Optional(_),taskDueAt:$.Optional($.String()),taskModelId:$.Optional($.String()),selectedModelId:$.Optional($.String()),permissionMode:$.Optional(v),reasoningEffort:$.Optional(x),serviceTier:$.Optional(P),responseVerbosity:$.Optional(f),communicationStyle:$.Optional(z),communicationStyleDigest:$.Optional($.String({pattern:"^[a-f0-9]{64}$"})),projectInstructionsDigest:$.Optional($.String({pattern:"^[a-f0-9]{64}$"})),taskRetryAvailable:$.Optional($.Boolean()),taskRetriedFrom:$.Optional($.Object({sessionId:$.String(),projectPath:$.String()})),taskDelivery:$.Optional(F1),taskIsolation:$.Optional(N),taskSourceProjectPath:$.Optional($.String()),taskWorktreePath:$.Optional($.String()),taskWorktreeBranch:$.Optional($.String()),taskBaseCommit:$.Optional($.String()),taskDiffStat:$.Optional(C1),taskQueuePosition:$.Optional($.Integer({minimum:1})),taskQueueDepth:$.Optional($.Integer({minimum:0})),taskConcurrencyLimit:$.Optional($.Integer({minimum:1})),archivedAt:$.Optional($.String()),archivedBySessionId:$.Optional($.String()),pendingInteraction:$.Optional(R1),messageCount:$.Number(),firstMessageTime:$.String(),lastMessageTime:$.String(),hasErrors:$.Boolean()})),I0=Z($.Object({sessions:$.Array(U),nextCursor:$.Optional($.String())})),N0=Z($.Object({session:U,archivedSessionIds:$.Array($.String())})),U0=Z($.Object({session:U,restoredSessionIds:$.Array($.String())})),_1=$.Object({rootTurnId:$.Optional($.String({minLength:1,maxLength:F})),currentTurnId:$.String({minLength:1,maxLength:F}),parentTurnId:$.Optional($.String({minLength:1,maxLength:F}))},{additionalProperties:!1}),F0=Z($.Object({version:$.Union([$.Literal(1),$.Literal(2)]),sessionId:$.String(),goalId:$.String(),objective:$.String(),status:K(["active","verifying","paused","blocked","usage_limited","budget_limited","complete"]),tokenBudget:$.Optional($.Number()),tokensUsed:$.Number(),timeUsedSeconds:$.Number(),continuationCount:$.Number(),statusReason:$.Optional($.String()),completionVerification:$.Optional($.Object({attempt:$.Integer({minimum:1}),status:K(["pending","pass","fail","partial"]),requestedAt:$.String(),completedAt:$.Optional($.String()),verifierSessionId:$.Optional($.String()),summary:$.Optional($.String()),evidenceSha256:$.Optional($.String({pattern:"^[a-f0-9]{64}$"}))})),prematureStop:$.Optional($.Object({pattern:$.Unsafe({type:"string"}),consecutiveCount:$.Integer({minimum:1}),detectedAt:$.String()})),executionHostFailure:$.Optional($.Object({category:K(a),consecutiveCount:$.Integer({minimum:1,maximum:3}),detectedAt:$.String()},{additionalProperties:!1})),turnLineage:$.Optional(_1),verificationStall:$.Optional($.Unsafe({type:"object"})),executionFrontier:$.Optional($.Object({taskListId:$.String({minLength:1,maxLength:256}),total:$.Integer({minimum:0}),completed:$.Integer({minimum:0}),inProgress:$.Integer({minimum:0}),pending:$.Integer({minimum:0}),blocked:$.Integer({minimum:0}),nextTask:$.Optional($.Object({id:$.String({minLength:1}),subject:$.String({minLength:1,maxLength:512}),priority:K(["high","medium","low"])})),digestSha256:$.String({pattern:"^[a-f0-9]{64}$"}),observedAt:$.String()})),frontierStall:$.Optional($.Object({category:K(["waiting_dependency","same_task_no_effect","repeated_deferral"]),consecutiveCount:$.Integer({minimum:1,maximum:3}),digestSha256:$.String({pattern:"^[a-f0-9]{64}$"}),detectedAt:$.String()})),createdAt:$.String(),updatedAt:$.String()})),r=Z($.Object({role:R,content:t,metadata:$.Optional($.Unknown()),reasoningContent:$.Optional($.String()),thinkingContent:$.Optional($.String()),tool_call_id:$.Optional($.String()),name:$.Optional($.String()),tool_calls:$.Optional($.Unknown())})),C0=Z($.Object({session:U,messages:$.Array(r)})),y=Z(K(["conversation","code","both"])),S1=Z($.Object({messageId:$.String(),preview:$.String(),createdAt:$.String(),fileCount:$.Integer({minimum:0})})),L0=Z($.Object({targetMessageId:$.String({minLength:1}),mode:W(y,"conversation")})),M0=Z($.Object({checkpoint:S1,mode:y,removedTurns:$.Integer({minimum:1}),restoredFiles:$.Array($.String()),messages:$.Array(r)})),l1=K(["running","completed","failed","cancelled"]),i=Z($.Object({id:$.String(),subagentType:$.String(),description:$.String(),status:l1,background:$.Boolean(),rootAgentId:$.String(),resumedFrom:$.Optional($.String()),resumeDepth:$.Integer({minimum:0}),createdAt:$.Number(),lastActiveAt:$.Number(),completedAt:$.Optional($.Number()),restartRecovery:$.Optional($.Object({outcome:K(["completed","interrupted","failed"]),recoveredAt:$.Number()})),result:$.Optional($.Object({success:$.Boolean(),message:$.String(),error:$.Optional($.String()),verificationCommands:$.Optional($.Array($.String())),verificationVerdict:$.Optional(K(["pass","fail","partial"])),modifiedFiles:$.Optional($.Array($.String()))})),stats:$.Optional($.Object({tokens:$.Optional($.Number()),toolCalls:$.Optional($.Number()),duration:$.Optional($.Number())}))})),A0=Z($.Object({prompt:$.String({minLength:1,maxLength:32000,pattern:"\\S"})})),R0=Z($.Object({source:i,session:i})),E0=Z($.Object({sessionId:$.String(),projectPath:$.String()})),_0=Z($.Object({path:$.String(),name:$.String(),gitBranch:$.Optional($.String()),available:$.Boolean(),isCurrent:$.Boolean(),boundAt:$.String()})),S0=Z($.Union([$.Object({cancelled:$.Literal(!0)}),$.Object({cancelled:$.Literal(!1),path:$.String({minLength:1})})])),l0=Z($.Object({type:$.String(),seq:$.Optional($.Number()),properties:$.Record($.String(),$.Unknown())})),T=$.Object({type:K(["file","image","url"]),path:$.Optional($.String()),url:$.Optional($.String()),content:$.Optional($.String({maxLength:o})),mimeType:$.Optional($.String()),name:$.Optional($.String())}),u1=20,d1=12288,m1=4096,h1=$.Object({id:$.String({minLength:1,maxLength:200}),text:$.String({minLength:1,maxLength:d1}),sourceMessageId:$.String({minLength:1,maxLength:500}),sourceRole:K(["user","assistant"]),comment:$.Optional($.String({maxLength:m1}))}),p=$.Record($.String(),$.Unknown()),u0=Z($.Object({prompt:$.String({minLength:1,maxLength:32000,pattern:"\\S"}),title:$.Optional($.String({minLength:1,maxLength:200})),taskPriority:W(E,"medium"),taskKind:W(_,"feature"),taskDueAt:$.Optional($.String({minLength:1,maxLength:64})),projectPath:$.Optional($.String()),modelId:$.Optional($.String({minLength:1,maxLength:500})),reasoningEffort:$.Optional(x),serviceTier:$.Optional(P),responseVerbosity:$.Optional(f),communicationStyle:$.Optional(z),isolation:W(N,"worktree"),permissionMode:W(v,"default"),attachments:$.Optional($.Array(T,{maxItems:A})),outputSchema:$.Optional(p)})),d0=Z($.Object({title:$.Optional($.String({minLength:1,maxLength:200})),taskPriority:$.Optional(E),taskKind:$.Optional(_),taskDueAt:$.Optional($.Union([$.String({minLength:1,maxLength:64}),$.Null()]))})),m0=Z($.Object({session:U,runId:$.String(),messageId:$.String(),status:K(["queued","running"]),queuePosition:$.Optional($.Integer({minimum:1})),queueDepth:$.Optional($.Integer({minimum:0})),maxConcurrentTasks:$.Optional($.Integer({minimum:1}))})),h0=Z($.Object({action:K(["apply","discard"])})),S=Z($.Object({kind:K(["cron","interval","once"]),cron:$.Optional($.String({minLength:1,maxLength:120})),intervalMs:$.Optional($.Integer({minimum:60000})),runAt:$.Optional($.String({minLength:1,maxLength:40})),timezone:$.Optional($.String({minLength:1,maxLength:80}))})),g1=Z($.Object({modelId:$.Optional($.String({minLength:1,maxLength:500})),reasoningEffort:$.Optional(x),serviceTier:$.Optional(P),responseVerbosity:$.Optional(f),communicationStyle:$.Optional(z),isolation:W(N,"worktree"),permissionMode:W(v,"default")})),l=Z($.Object({id:$.String(),title:$.Optional($.String({minLength:1,maxLength:200})),prompt:$.String({minLength:1,maxLength:32000,pattern:"\\S"}),projectPath:$.String({minLength:1}),trigger:S,dispatch:g1,enabled:$.Boolean(),createdAt:$.String(),updatedAt:$.String(),nextRunAt:$.Union([$.String(),$.Null()]),expiresAt:$.Union([$.String(),$.Null()]),lastRunAt:$.Optional($.String()),lastRunSessionId:$.Optional($.String()),lastStatus:$.Optional(K(["queued","running","completed","failed","cancelled","interrupted","error"])),lastError:$.Optional($.String()),runCount:$.Integer({minimum:0})})),g0=Z($.Object({title:$.Optional($.String({minLength:1,maxLength:200})),prompt:$.String({minLength:1,maxLength:32000,pattern:"\\S"}),projectPath:$.String({minLength:1}),trigger:S,modelId:$.Optional($.String({minLength:1,maxLength:500})),reasoningEffort:$.Optional(x),serviceTier:$.Optional(P),responseVerbosity:$.Optional(f),communicationStyle:$.Optional(z),isolation:W(N,"worktree"),permissionMode:W(v,"default"),enabled:W($.Boolean(),!0)})),c0=Z($.Object({title:$.Optional($.String({minLength:1,maxLength:200})),prompt:$.Optional($.String({minLength:1,maxLength:32000,pattern:"\\S"})),trigger:$.Optional(S),modelId:$.Optional($.String({minLength:1,maxLength:500})),reasoningEffort:$.Optional(x),serviceTier:$.Optional(P),responseVerbosity:$.Optional(f),communicationStyle:$.Optional(z),isolation:$.Optional(N),permissionMode:$.Optional(v),enabled:$.Optional($.Boolean())})),n0=Z($.Object({schedules:$.Array(l)})),i0=Z($.Object({content:$.String({maxLength:s}),projectPath:$.Optional($.String()),modelId:$.Optional($.String({minLength:1,maxLength:500})),reasoningEffort:$.Optional(x),serviceTier:$.Optional(P),responseVerbosity:$.Optional(f),communicationStyle:$.Optional(z),permissionMode:$.Optional(v),attachments:$.Optional($.Array(T,{maxItems:A})),annotations:$.Optional($.Array(h1,{maxItems:u1})),outputSchema:$.Optional(p)})),c1=K(["completed","failed","aborted","timed_out","spawn_error"]),n1=Z($.Object({version:$.Literal(1),command:$.String(),status:c1,exitCode:$.Union([$.Integer(),$.Null()]),durationMs:$.Number({minimum:0}),stdout:$.String(),stderr:$.String(),stdoutOmittedBytes:$.Integer({minimum:0}),stderrOmittedBytes:$.Integer({minimum:0}),binaryOutput:$.Boolean(),truncated:$.Boolean()})),o0=Z($.Object({command:$.String({minLength:1,maxLength:32768,pattern:"^(?![\\s\\S]*\\u0000)(?=[\\s\\S]*\\S)[\\s\\S]*$"}),projectPath:$.Optional($.String())})),s0=Z($.Object({executionId:$.String(),messageId:$.String(),record:n1,auxiliary:$.Boolean(),delivery:$.Optional(K(["current_turn","next_turn"])),queued:$.Optional($.Integer({minimum:0}))})),a0=Z($.Object({question:$.String({minLength:1,maxLength:n,pattern:"^(?![\\s\\S]*\\x00)(?=[\\s\\S]*\\S)[\\s\\S]*$"}),projectPath:$.Optional($.String())})),t0=Z($.Object({response:$.String({minLength:1}),durationMs:$.Number({minimum:0}),modelId:$.Optional($.String()),usage:$.Optional($.Object({promptTokens:$.Number({minimum:0}),completionTokens:$.Number({minimum:0}),totalTokens:$.Number({minimum:0}),reasoningTokens:$.Optional($.Number({minimum:0})),cacheCreationInputTokens:$.Optional($.Number({minimum:0})),cacheReadInputTokens:$.Optional($.Number({minimum:0})),costUsd:$.Optional($.Number({minimum:0}))}))})),r0=Z($.Object({projectPath:$.String(),kind:K(["uncommitted","base","commit"]),ref:$.Optional($.String({maxLength:200})),instructions:$.Optional($.String({maxLength:4000})),modelId:$.Optional($.String({minLength:1,maxLength:200}))})),y0=Z($.Object({reviewId:$.String(),status:$.Literal("running")})),T0=Z($.Object({messageId:$.String(),role:R,content:$.String(),timestamp:$.String()})),p0=Z($.Object({approved:$.Boolean(),remember:$.Optional($.Boolean()),scope:$.Optional(K(["once","session","project"])),targetMode:$.Optional(v),feedback:$.Optional($.String()),answers:$.Optional($.Record($.String(),$.Union([$.String(),$.Array($.String())]))),elicitation:$.Optional($.Object({action:K(["accept","decline","cancel"]),content:$.Optional($.Record($.String(),$.Union([$.String({maxLength:4000}),$.Number(),$.Boolean(),$.Array($.String({maxLength:1000}),{maxItems:100})]),{maxProperties:32}))}))})),i1=Z($.Object({id:z,name:$.String({minLength:1,maxLength:80}),description:$.String({minLength:1,maxLength:256}),source:K(["built-in","user","project","plugin"]),contentSha256:$.Optional($.String({pattern:"^[a-f0-9]{64}$"}))})),e0=Z($.Object({id:$.String(),displayName:$.Optional($.String()),provider:$.String(),model:$.String(),contextWindow:$.Optional($.Number()),maxTokens:$.Optional($.Number()),reasoning:$.Optional($.Boolean()),supportedReasoningEfforts:$.Optional($.Array(K(["off","minimal","low","medium","high","xhigh","max"]))),supportedServiceTiers:$.Optional($.Array(K(["standard","fast","flex"]))),supportedResponseVerbosities:$.Optional($.Array(K(["low","medium","high"]))),communicationStyles:$.Optional($.Array(i1,{maxItems:36})),input:$.Optional($.Array(K(["text","image"]))),overrides:$.Optional($.Object({baseUrl:$.Optional($.String()),temperature:$.Optional($.Number()),maxOutputTokens:$.Optional($.Number()),timeout:$.Optional($.Number()),streamIdleTimeout:$.Optional($.Number({minimum:1000}))}))})),$2=Z(K(["vs-dark","vs-light","hc-black"])),o1=Z(K(["light","dark","system"])),s1=Z($.Object({language:$.String(),codeTheme:$.String(),uiTheme:o1,autoSaveSessions:$.Boolean(),notifyBuild:$.Boolean(),notifyErrors:$.Boolean(),notifySounds:$.Boolean(),privacyTelemetry:$.Boolean(),privacyCrash:$.Boolean(),agentTeamsEnabled:$.Boolean(),communicationStyle:$.Optional(z)})),J2=Z($.Partial(s1));var e=J1("Service"),T1=1;function p1(){return Z1.join($1(),"schedules.json")}class O{filePath;static instance;static getInstance(){if(!O.instance)O.instance=new O;return O.instance}writeChain=Promise.resolve();constructor(J=p1()){this.filePath=J}async readFile(){try{let J=await t1(this.filePath,"utf-8"),B=JSON.parse(J);if(!B||!Array.isArray(B.schedules))return[];let j=[],Y=0;for(let H of B.schedules){let k=l.safeParse(H);if(k.success)j.push(k.data);else Y+=1}if(Y>0)e.warn(`[ScheduleStore] Ignored ${Y} invalid persisted schedule(s)`);return j}catch(J){let B=J;if(B.code!=="ENOENT")e.warn("[ScheduleStore] Failed to read schedules; treating as empty:",B);return[]}}async writeFile(J){await a1(Z1.dirname(this.filePath),{recursive:!0,mode:493});let B={version:T1,schedules:J};await y1(this.filePath,JSON.stringify(B,null,2),{mode:384})}serializeWrite(J){let B=this.writeChain.then(J,J);return this.writeChain=B.then(()=>{return},()=>{return}),B}async list(){return this.readFile()}async get(J){return(await this.readFile()).find((j)=>j.id===J)}async create(J){return this.serializeWrite(async()=>{let B=J.trigger.kind==="cron"&&!J.trigger.timezone?{...J.trigger,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}:J.trigger,j=L(B);if(j)throw Error(j);let Y=new Date;if(B.kind==="once"&&new Date(B.runAt).getTime()<=Y.getTime())throw Error("once trigger runAt must be in the future");let H=Y.toISOString(),k=C(B,Y),G={id:r1(10),title:J.title,prompt:J.prompt,projectPath:J.projectPath,trigger:B,dispatch:{modelId:J.modelId,reasoningEffort:J.reasoningEffort,serviceTier:J.serviceTier,responseVerbosity:J.responseVerbosity,communicationStyle:J.communicationStyle,isolation:J.isolation??"worktree",permissionMode:J.permissionMode??"default"},enabled:J.enabled??!0,createdAt:H,updatedAt:H,nextRunAt:k?k.toISOString():null,expiresAt:null,runCount:0},V=await this.readFile();return V.push(G),await this.writeFile(V),G})}async update(J,B){return this.serializeWrite(async()=>{let j=await this.readFile(),Y=j.findIndex((Q)=>Q.id===J);if(Y===-1)return;let H=j[Y];if(B.trigger){let Q=B.trigger.kind==="cron"&&!B.trigger.timezone?{...B.trigger,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}:B.trigger,b=L(Q);if(b)throw Error(b);if(Q.kind==="once"&&new Date(Q.runAt).getTime()<=Date.now())throw Error("once trigger runAt must be in the future");B={...B,trigger:Q}}let k={...H,...B,dispatch:B.dispatch?{...H.dispatch,...B.dispatch}:H.dispatch,updatedAt:new Date().toISOString()},G=!H.enabled,V=k.enabled,X=B.trigger!==void 0;if((X||G&&V)&&B.nextRunAt===void 0){let Q=new Date,b=C(k.trigger,Q);if(k.nextRunAt=b?b.toISOString():null,X)k.expiresAt=null}return j[Y]=k,await this.writeFile(j),k})}async remove(J){return this.serializeWrite(async()=>{let B=await this.readFile(),j=B.filter((Y)=>Y.id!==J);if(j.length===B.length)return!1;return await this.writeFile(j),!0})}async setEnabled(J,B){return this.update(J,{enabled:B})}}var v2=O.getInstance();
2
+ export{n as Va,V0 as Wa,q as Xa,Q1 as Ya,h as Za,g as _a,W1 as $a,z1 as ab,W0 as bb,b0 as cb,k0 as db,e1 as eb,C as fb,L as gb,$0 as hb,f0 as ib,U as jb,L0 as kb,A0 as lb,u0 as mb,d0 as nb,m0 as ob,h0 as pb,l as qb,g0 as rb,c0 as sb,n0 as tb,i0 as ub,o0 as vb,a0 as wb,r0 as xb,O as yb,v2 as zb};
@@ -1,2 +1,2 @@
1
- import{Yj as d,_j as h}from"./chunk-z0m9j0e2.js";var q={debug:{alias:"d",type:"string",describe:'Enable debug mode with optional category filtering (e.g., "agent,ui" or "!chat,!loop")',group:"Debug Options:"},model:{type:"string",describe:"Override the current run model using a model config ID (TUI / print / headless)",group:"AI Options:"},print:{alias:"p",type:"boolean",describe:"Print response and exit (useful for pipes)",group:"Output Options:"},headless:{type:"boolean",describe:"Run full agent loop without Ink UI and print all events to the terminal",group:"Output Options:"},"output-format":{alias:["outputFormat"],type:"string",choices:["text","json","stream-json","jsonl"],default:"text",describe:"Output format: --print supports text|json|stream-json; --headless supports text|jsonl",group:"Output Options:"},"json-schema":{alias:["jsonSchema"],type:"string",describe:"Inline JSON Schema for the turn-scoped structured final response",group:"Output Options:"},"output-schema":{alias:["outputSchema"],type:"string",describe:"Path to a JSON Schema file for the structured final response",group:"Output Options:"},"include-partial-messages":{alias:["includePartialMessages"],type:"boolean",describe:"Include partial message chunks as they arrive",group:"Output Options:"},"input-format":{alias:["inputFormat"],type:"string",choices:["text","stream-json"],default:"text",describe:"Input format",group:"Input Options:"},"replay-user-messages":{alias:["replayUserMessages"],type:"boolean",describe:"Re-emit user messages from stdin",group:"Input Options:"},"allowed-tools":{alias:["allowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to allow",group:"Security Options:"},"disallowed-tools":{alias:["disallowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to deny",group:"Security Options:"},"mcp-config":{alias:["mcpConfig"],type:"array",string:!0,describe:"Load MCP servers from JSON files or strings",group:"MCP Options:"},"system-prompt":{alias:["systemPrompt"],type:"string",describe:"System prompt to use for the session (replaces default)",group:"AI Options:"},"append-system-prompt":{alias:["appendSystemPrompt"],type:"string",describe:"Append a system prompt to the default system prompt",group:"AI Options:"},"max-turns":{alias:["maxTurns"],type:"number",describe:"Maximum conversation turns (-1: unlimited, 0: disable chat, N>0: limit to N turns)",group:"AI Options:",default:void 0},"max-concurrent-tasks":{alias:["maxConcurrentTasks"],type:"number",describe:"Maximum top-level tasks running concurrently in this process",group:"AI Options:",default:void 0},"max-queued-tasks":{alias:["maxQueuedTasks"],type:"number",describe:"Maximum top-level tasks waiting for an admission slot",group:"AI Options:",default:void 0},"max-queued-task-bytes":{alias:["maxQueuedTaskBytes"],type:"number",describe:"Maximum retained bytes across queued top-level tasks",group:"AI Options:",default:void 0},"max-resident-session-runtimes":{alias:["maxResidentSessionRuntimes"],type:"number",describe:"Maximum initialized Session runtimes resident in this process",group:"AI Options:",default:void 0},"session-runtime-idle-ms":{alias:["sessionRuntimeIdleMs"],type:"number",describe:"Idle time before an evictable Web Session runtime is evicted",group:"AI Options:",default:void 0},"max-resident-session-projections":{alias:["maxResidentSessionProjections"],type:"number",describe:"Maximum resident Session projections retained in this process",group:"AI Options:",default:void 0},"session-projection-idle-ms":{alias:["sessionProjectionIdleMs"],type:"number",describe:"Idle time before an evictable Session projection is evicted",group:"AI Options:",default:void 0},"permission-mode":{alias:["permissionMode"],type:"string",choices:["default","autoEdit","yolo","plan"],describe:"Permission mode (default: ask for non-read tools, autoEdit: auto-approve edits, yolo: auto-approve all, plan: reserved)",group:"Security Options:"},yolo:{type:"boolean",describe:"Auto-approve all tools (shortcut for --permission-mode=yolo)",group:"Security Options:"},"trust-workspace":{alias:["trustWorkspace"],type:"boolean",describe:"Trust the current workspace before loading project models, MCP, LSP, permissions, or plugins",group:"Security Options:"},continue:{alias:"c",type:"boolean",describe:"Continue the most recent conversation",group:"Session Options:"},resume:{alias:"r",describe:"Resume a conversation - provide a session ID or interactively select a conversation to resume",group:"Session Options:",coerce:(b)=>{if(b===void 0||b===!0||b==="")return"true";return String(b)}},"fork-session":{alias:["forkSession"],type:"boolean",describe:"Create a new session ID when resuming",group:"Session Options:"},settings:{type:"string",describe:"Path to a settings JSON file or JSON string",group:"Configuration:"},"add-dir":{alias:["addDir"],type:"array",string:!0,describe:"Additional directories to allow tool access to",group:"Security Options:"},ide:{type:"boolean",describe:"Automatically connect to IDE on startup",group:"Integration:"},acp:{type:"boolean",describe:"Run in ACP (Agent Client Protocol) mode for IDE integration",group:"Integration:"},"strict-mcp-config":{alias:["strictMcpConfig"],type:"boolean",describe:"Only use MCP servers from --mcp-config",group:"MCP Options:"},"session-id":{alias:["sessionId"],type:"string",describe:"Use a specific session ID for the conversation",group:"Session Options:"},agents:{type:"string",describe:"JSON object defining custom agents",group:"AI Options:"},"setting-sources":{alias:["settingSources"],type:"string",describe:"Comma-separated list of setting sources to load",group:"Configuration:"},"plugin-dir":{alias:["pluginDir"],type:"array",string:!0,describe:"Load plugins from specified directories",group:"Plugin Options:"}},w={scriptName:"blade",usage:"$0 [command] [options]",description:h(),version:d(),locale:"en",showHelpOnFail:!0,demandCommand:!1,recommendCommands:!0,strict:!1};
2
- export{q as sf,w as tf};
1
+ import{Wj as d,Yj as h}from"./chunk-yzf2jpam.js";var q={debug:{alias:"d",type:"string",describe:'Enable debug mode with optional category filtering (e.g., "agent,ui" or "!chat,!loop")',group:"Debug Options:"},model:{type:"string",describe:"Override the current run model using a model config ID (TUI / print / headless)",group:"AI Options:"},print:{alias:"p",type:"boolean",describe:"Print response and exit (useful for pipes)",group:"Output Options:"},headless:{type:"boolean",describe:"Run full agent loop without Ink UI and print all events to the terminal",group:"Output Options:"},"output-format":{alias:["outputFormat"],type:"string",choices:["text","json","stream-json","jsonl"],default:"text",describe:"Output format: --print supports text|json|stream-json; --headless supports text|jsonl",group:"Output Options:"},"json-schema":{alias:["jsonSchema"],type:"string",describe:"Inline JSON Schema for the turn-scoped structured final response",group:"Output Options:"},"output-schema":{alias:["outputSchema"],type:"string",describe:"Path to a JSON Schema file for the structured final response",group:"Output Options:"},"include-partial-messages":{alias:["includePartialMessages"],type:"boolean",describe:"Include partial message chunks as they arrive",group:"Output Options:"},"input-format":{alias:["inputFormat"],type:"string",choices:["text","stream-json"],default:"text",describe:"Input format",group:"Input Options:"},"replay-user-messages":{alias:["replayUserMessages"],type:"boolean",describe:"Re-emit user messages from stdin",group:"Input Options:"},"allowed-tools":{alias:["allowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to allow",group:"Security Options:"},"disallowed-tools":{alias:["disallowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to deny",group:"Security Options:"},"mcp-config":{alias:["mcpConfig"],type:"array",string:!0,describe:"Load MCP servers from JSON files or strings",group:"MCP Options:"},"system-prompt":{alias:["systemPrompt"],type:"string",describe:"System prompt to use for the session (replaces default)",group:"AI Options:"},"append-system-prompt":{alias:["appendSystemPrompt"],type:"string",describe:"Append a system prompt to the default system prompt",group:"AI Options:"},"max-turns":{alias:["maxTurns"],type:"number",describe:"Maximum conversation turns (-1: unlimited, 0: disable chat, N>0: limit to N turns)",group:"AI Options:",default:void 0},"max-concurrent-tasks":{alias:["maxConcurrentTasks"],type:"number",describe:"Maximum top-level tasks running concurrently in this process",group:"AI Options:",default:void 0},"max-queued-tasks":{alias:["maxQueuedTasks"],type:"number",describe:"Maximum top-level tasks waiting for an admission slot",group:"AI Options:",default:void 0},"max-queued-task-bytes":{alias:["maxQueuedTaskBytes"],type:"number",describe:"Maximum retained bytes across queued top-level tasks",group:"AI Options:",default:void 0},"max-resident-session-runtimes":{alias:["maxResidentSessionRuntimes"],type:"number",describe:"Maximum initialized Session runtimes resident in this process",group:"AI Options:",default:void 0},"session-runtime-idle-ms":{alias:["sessionRuntimeIdleMs"],type:"number",describe:"Idle time before an evictable Web Session runtime is evicted",group:"AI Options:",default:void 0},"max-resident-session-projections":{alias:["maxResidentSessionProjections"],type:"number",describe:"Maximum resident Session projections retained in this process",group:"AI Options:",default:void 0},"session-projection-idle-ms":{alias:["sessionProjectionIdleMs"],type:"number",describe:"Idle time before an evictable Session projection is evicted",group:"AI Options:",default:void 0},"permission-mode":{alias:["permissionMode"],type:"string",choices:["default","autoEdit","yolo","plan"],describe:"Permission mode (default: ask for non-read tools, autoEdit: auto-approve edits, yolo: auto-approve all, plan: reserved)",group:"Security Options:"},yolo:{type:"boolean",describe:"Auto-approve all tools (shortcut for --permission-mode=yolo)",group:"Security Options:"},"trust-workspace":{alias:["trustWorkspace"],type:"boolean",describe:"Trust the current workspace before loading project models, MCP, LSP, permissions, or plugins",group:"Security Options:"},continue:{alias:"c",type:"boolean",describe:"Continue the most recent conversation",group:"Session Options:"},resume:{alias:"r",describe:"Resume a conversation - provide a session ID or interactively select a conversation to resume",group:"Session Options:",coerce:(b)=>{if(b===void 0||b===!0||b==="")return"true";return String(b)}},"fork-session":{alias:["forkSession"],type:"boolean",describe:"Create a new session ID when resuming",group:"Session Options:"},settings:{type:"string",describe:"Path to a settings JSON file or JSON string",group:"Configuration:"},"add-dir":{alias:["addDir"],type:"array",string:!0,describe:"Additional directories to allow tool access to",group:"Security Options:"},ide:{type:"boolean",describe:"Automatically connect to IDE on startup",group:"Integration:"},acp:{type:"boolean",describe:"Run in ACP (Agent Client Protocol) mode for IDE integration",group:"Integration:"},"strict-mcp-config":{alias:["strictMcpConfig"],type:"boolean",describe:"Only use MCP servers from --mcp-config",group:"MCP Options:"},"session-id":{alias:["sessionId"],type:"string",describe:"Use a specific session ID for the conversation",group:"Session Options:"},agents:{type:"string",describe:"JSON object defining custom agents",group:"AI Options:"},"setting-sources":{alias:["settingSources"],type:"string",describe:"Comma-separated list of setting sources to load",group:"Configuration:"},"plugin-dir":{alias:["pluginDir"],type:"array",string:!0,describe:"Load plugins from specified directories",group:"Plugin Options:"}},w={scriptName:"blade",usage:"$0 [command] [options]",description:h(),version:d(),locale:"en",showHelpOnFail:!0,demandCommand:!1,recommendCommands:!0,strict:!1};
2
+ export{q as vf,w as wf};
@@ -1,8 +1,8 @@
1
- import{ea as p}from"./chunk-rwm71p4g.js";import{Pb as _}from"./chunk-1b8qjgm6.js";import{Ad as N,Bd as U,Cd as I,Dd as A,Ed as z,Pd as q,ie as O}from"./chunk-4ts2s9mz.js";import{ue as o}from"./chunk-ztreczac.js";import{eg as P}from"./chunk-5yyp6njq.js";import{Fg as e}from"./chunk-egc2f1ye.js";import{Dk as j}from"./chunk-n52n2w5v.js";import{createHash as ff}from"node:crypto";var af=4,cf=1000,E=4000,wf=120000,M=0.2;function $f(a){try{return q(a)&&a.retryable}catch{return!1}}function gf(a,c){let f=Number.isSafeInteger(c)&&c>0?c:1,w=f-1,h=Math.min(cf*2**w,E),$=ff("sha256").update(`${a}\x00${f}`).digest().readUInt32BE(0)/4294967295,k=1-M+2*M*$;return Math.min(E,Math.max(0,Math.round(h*k)))}function Tf(a){let c=gf(a.sessionIdentity,a.failedAttempt),f=a.evidence,w=a.workStillPending===!0&&f!==void 0&&$f(f.taskFailure)&&f.outputStarted===!1&&f.toolExecutionStarted===!1&&Number.isInteger(f.toolCallsCount)&&f.toolCallsCount===0,h=Number.isSafeInteger(a.failedAttempt)&&a.failedAttempt>0&&a.failedAttempt<af,g=a.now??Date.now(),$=g-a.recoveryStartedAt,k=Number.isFinite(g)&&Number.isFinite(a.recoveryStartedAt)&&Number.isFinite($)&&$>=0&&$+c<=wf;return{phase:w?h&&k?"retry_scheduled":"exhausted":"failed",delayMs:c,retryable:w,withinAttemptBudget:h,withinTimeBudget:k}}import R from"node:path";import{nanoid as Lf}from"nanoid";import{execFile as hf}from"node:child_process";import{createHash as xf}from"node:crypto";import{lstat as bf,readFile as mf,realpath as i}from"node:fs/promises";import n from"node:path";import{promisify as kf}from"node:util";var lf=kf(hf),T=8388608,s=500,u=200;async function C(a,c){try{return(await lf("git",["-c","core.pager=cat",...c],{cwd:a,encoding:"utf8",timeout:30000,maxBuffer:T+1024,env:{...process.env,GIT_CONFIG_NOSYSTEM:"1",GIT_PAGER:"cat",GIT_OPTIONAL_LOCKS:"0"}})).stdout}catch(f){let w=f instanceof Error&&f.message.includes("maxBuffer")?`Review target exceeds the ${T} byte limit`:f instanceof Error?f.message:String(f);throw Error(`Git review target failed: ${w}`)}}function d(a,c){let f=a?.trim();if(!f||f.length>u||f.includes("\x00")||f.includes(`
1
+ import{ha as p}from"./chunk-az3rehz9.js";import{Sb as _}from"./chunk-793wjhvz.js";import{Dd as N,Ed as U,Fd as I,Gd as A,Hd as z,Sd as q,le as O}from"./chunk-sbfe9vh3.js";import{xe as o}from"./chunk-yjjxv7fn.js";import{dg as P}from"./chunk-t0gm0pn1.js";import{Eg as e}from"./chunk-5k8k56f2.js";import{Ak as j}from"./chunk-ed2hdrwe.js";import{createHash as ff}from"node:crypto";var af=4,cf=1000,E=4000,wf=120000,M=0.2;function $f(a){try{return q(a)&&a.retryable}catch{return!1}}function gf(a,c){let f=Number.isSafeInteger(c)&&c>0?c:1,w=f-1,h=Math.min(cf*2**w,E),$=ff("sha256").update(`${a}\x00${f}`).digest().readUInt32BE(0)/4294967295,k=1-M+2*M*$;return Math.min(E,Math.max(0,Math.round(h*k)))}function Tf(a){let c=gf(a.sessionIdentity,a.failedAttempt),f=a.evidence,w=a.workStillPending===!0&&f!==void 0&&$f(f.taskFailure)&&f.outputStarted===!1&&f.toolExecutionStarted===!1&&Number.isInteger(f.toolCallsCount)&&f.toolCallsCount===0,h=Number.isSafeInteger(a.failedAttempt)&&a.failedAttempt>0&&a.failedAttempt<af,g=a.now??Date.now(),$=g-a.recoveryStartedAt,k=Number.isFinite(g)&&Number.isFinite(a.recoveryStartedAt)&&Number.isFinite($)&&$>=0&&$+c<=wf;return{phase:w?h&&k?"retry_scheduled":"exhausted":"failed",delayMs:c,retryable:w,withinAttemptBudget:h,withinTimeBudget:k}}import R from"node:path";import{nanoid as Lf}from"nanoid";import{execFile as hf}from"node:child_process";import{createHash as xf}from"node:crypto";import{lstat as bf,readFile as mf,realpath as i}from"node:fs/promises";import n from"node:path";import{promisify as kf}from"node:util";var lf=kf(hf),T=8388608,s=500,u=200;async function C(a,c){try{return(await lf("git",["-c","core.pager=cat",...c],{cwd:a,encoding:"utf8",timeout:30000,maxBuffer:T+1024,env:{...process.env,GIT_CONFIG_NOSYSTEM:"1",GIT_PAGER:"cat",GIT_OPTIONAL_LOCKS:"0"}})).stdout}catch(f){let w=f instanceof Error&&f.message.includes("maxBuffer")?`Review target exceeds the ${T} byte limit`:f instanceof Error?f.message:String(f);throw Error(`Git review target failed: ${w}`)}}function d(a,c){let f=a?.trim();if(!f||f.length>u||f.includes("\x00")||f.includes(`
2
2
  `)||f.includes("\r"))throw Error(`${c} must contain 1-${u} characters`);return f}function Q(a){return a.split("\x00").filter(Boolean)}async function X(a,c){return(await C(a,["rev-parse","--verify",`${c}^{commit}`])).trim()}async function Ff(a,c,f,w,h){let g=h,$=await i(a);for(let k of c){let l=n.resolve($,k),x=n.relative($,l);if(!x||x.startsWith("..")||n.isAbsolute(x))throw Error(`Untracked review path escapes the workspace: ${k}`);let b=await bf(l);if(!b.isFile()||b.isSymbolicLink())throw Error(`Untracked review target must be a regular file: ${k}`);if(g+=b.size,g>T)throw Error(`Review target exceeds ${T} bytes`);f.update("\x00untracked\x00"),f.update(x.replaceAll(n.sep,"/")),f.update("\x00");let F=await mf(l);f.update(F);let m=Math.max(1,F.toString("utf8").split(`
3
3
  `).length);w.set(x.replaceAll(n.sep,"/"),[{start:1,end:m}])}}function Y(a,c){let f=new Map,w,h,g,$,k=!1,l=(x,b)=>{let F=f.get(x)??[],m=F.at(-1);if(m&&b<=m.end+1)m.end=Math.max(m.end,b);else F.push({start:b,end:b});f.set(x,F)};for(let x of a.split(`
4
4
  `)){if(x.startsWith("--- ")){let b=x.slice(4).split("\t")[0]?.trim();w=b&&b!=="/dev/null"?b.replace(/^a\//,"").replaceAll("\\","/"):void 0;continue}if(x.startsWith("+++ ")){let b=x.slice(4).split("\t")[0]?.trim();k=b==="/dev/null",h=k?w:b?b.replace(/^b\//,"").replaceAll("\\","/"):void 0,g=void 0,$=void 0;continue}if(x.startsWith("@@ ")){let b=/-(\d+)(?:,\d+)? \+(\d+)(?:,\d+)?/.exec(x);g=b?Math.max(1,Number(b[1])):void 0,$=b?Math.max(1,Number(b[2])):void 0;continue}if(!h||g===void 0||$===void 0)continue;if(x.startsWith("+")&&!x.startsWith("+++"))l(h,$),$++;else if(x.startsWith("-")&&!x.startsWith("---"))l(h,k?g:$),g++;else if(!x.startsWith("\\"))g++,$++}for(let x of c)if(!f.has(x))f.set(x,[{start:1,end:1}]);return f}function D(a){if(a.length>s)throw Error(`Review target exceeds the ${s} file limit`)}class K{static async resolve(a,c){let f=await i(a);await C(f,["rev-parse","--is-inside-work-tree"]);let w=await X(f,"HEAD"),h=xf("sha256");h.update(`kind\x00${c.kind}\x00head\x00${w}\x00`);let g="",$=[],k,l,x,b,F=new Map;switch(c.kind){case"uncommitted":{g=await C(f,["diff","--binary","--no-ext-diff","--relative","HEAD","--","."]);let m=Q(await C(f,["diff","--name-only","-z","--relative","HEAD","--","."])),L=Q(await C(f,["ls-files","--others","--exclude-standard","-z","--","."]));if($=[...new Set([...m,...L])].sort(),D($),$.length===0)throw Error("No uncommitted changes to review");h.update(g),F=Y(g,m),await Ff(f,L,h,F,Buffer.byteLength(g)),x="uncommitted changes",b=["Review the uncommitted working tree against HEAD.","Use git status --short, git diff --cached, and git diff, then inspect","every relevant untracked file listed by git status."].join(" ");break}case"base":{let m=d(c.ref,"Base ref");k=await X(f,m);let L=(await C(f,["merge-base",k,w])).trim();if(g=await C(f,["diff","--binary","--no-ext-diff","--relative",`${L}..${w}`,"--","."]),$=Q(await C(f,["diff","--name-only","-z","--relative",`${L}..${w}`,"--","."])),D($),$.length===0)throw Error(`No changes between ${m} and HEAD`);h.update(g),h.update(`\x00merge-base\x00${L}`),F=Y(g,$),x=`changes against ${m}`,b=`Review changes introduced by ${L}..${w}.`;break}case"commit":{let m=d(c.ref,"Commit ref");if(l=await X(f,m),g=await C(f,["show","--format=","--binary","--no-ext-diff","--relative",l,"--","."]),$=Q(await C(f,["diff-tree","--root","--no-commit-id","--name-only","-r","-z",l,"--","."])),D($),$.length===0)throw Error(`Commit has no changes in this workspace: ${m}`);h.update(g),h.update(`\x00commit\x00${l}`),F=Y(g,$),x=`commit ${m}`,b=`Review only the changes introduced by commit ${l}.`;break}}if(Buffer.byteLength(g)>T)throw Error(`Review diff exceeds ${T} bytes`);return{info:{kind:c.kind,label:x,headSha:w,...k?{baseSha:k}:{},...l?{commitSha:l}:{},digest:h.digest("hex"),fileCount:$.length},instruction:b,changedLines:F}}}var Wf=131072,t=50,Z=new Set;function v(a,c){return`${R.resolve(a)}\x00${c}`}function S(a){return`/review ${a.kind}${a.kind==="uncommitted"?"":` ${a.ref?.trim()??""}`}`}function V(a,c,f,w=!1){if(typeof a!=="string")throw Error(`${c} must be a string`);let h=a.trim();if(!w&&!h||h.length>f)throw Error(`${c} exceeds its allowed length`);return h}function Hf(a,c,f){if(!a||typeof a!=="object"||Array.isArray(a))throw Error("Review finding must be an object");let w=a,h=typeof w.line==="number"&&Number.isInteger(w.line)?w.line:void 0,g=w.code_location??(typeof w.file==="string"&&h!==void 0?{path:w.file,line_start:h,line_end:h}:void 0);if(!g||typeof g!=="object"||Array.isArray(g))throw Error("Review finding has no code_location");let $=g,k=V($.path,"Finding path",1000),l=R.posix.normalize(k.replaceAll("\\","/"));if(R.posix.isAbsolute(l)||l===".."||l.startsWith("../"))throw Error("Review finding path must be workspace-relative");let x=R.resolve(c,l),b=R.relative(R.resolve(c),x);if(b.startsWith("..")||R.isAbsolute(b))throw Error("Review finding path escapes the workspace");let F=typeof w.severity==="string"?w.severity.toLowerCase():"",m=F==="critical"?0:F==="high"?1:F==="medium"?2:F==="low"?3:void 0,L=w.priority??m;if(L!==0&&L!==1&&L!==2&&L!==3)throw Error("Review finding priority must be 0-3");let W=w.confidence_score??w.confidence??0.8;if(typeof W!=="number"||!Number.isFinite(W)||W<0||W>1)throw Error("Review finding confidence_score must be between 0 and 1");let{line_start:H,line_end:r}=$;if(!Number.isInteger(H)||!Number.isInteger(r)||H<1||r<H||r-H>=10)throw Error("Review finding line range is invalid");let G=f.changedLines.get(l);if(!G)throw Error("Review finding path is outside the review target");if(!G.some((y)=>H<=y.end&&r>=y.start))throw Error("Review finding line range does not overlap the changed lines");let B=V(w.title??`[P${L}] ${String(w.type??"Review finding").replaceAll("-"," ").replace(/\b\w/g,(y)=>y.toUpperCase())}`,"Finding title",120);if(!B.startsWith(`[P${L}] `))throw Error("Review finding title priority does not match priority");return{title:B,body:V(w.body??w.description,"Finding body",4000),priority:L,confidenceScore:W,codeLocation:{path:l,lineStart:H,lineEnd:r}}}function Rf(a,c,f){if(Buffer.byteLength(a)>Wf)throw Error("Review output exceeds the 128 KiB limit");let w=a.indexOf("{"),h=a.lastIndexOf("}");if(w<0||h<=w)throw Error("Reviewer did not return a JSON object");let g;try{g=JSON.parse(a.slice(w,h+1))}catch{throw Error("Reviewer returned invalid JSON")}if(!g||typeof g!=="object"||Array.isArray(g))throw Error("Reviewer output must be an object");let $=g;if(!Array.isArray($.findings))throw Error("Reviewer output must contain findings");if($.findings.length>t)throw Error(`Reviewer returned more than ${t} findings`);return{overallExplanation:V($.overall_explanation??$.summary,"Review explanation",1e4,!0),findings:$.findings.map((k)=>Hf(k,c,f))}}async function J(a,c){return new o(j(a,c)).readAll()}class rf{static async start(a){let{sessionId:c,projectPath:f,runtime:w,request:h,onEvent:g}=a;if(w.sessionId!==c||R.resolve(w.workspaceRoot)!==R.resolve(f))throw Error("Review runtime does not own the requested Session");if(w.hasTurnOwner())throw Error("Cannot start a review during an active turn");await O.assertSessionWritable(c,f);let $=v(f,c);if(Z.has($))throw Error("Session already has an active review");let k=await J(f,c);if(U(k))throw Error("Session has an interrupted review that must be recovered");let l=h.instructions?.trim();if(l&&l.length>4000)throw Error("Review instructions exceed 4,000 characters");let x=await K.resolve(f,h),b=Lf(16),F=P("review"),m=new Date().toISOString(),L={reviewId:b,reviewerSessionId:F,target:x.info,startedAt:m},W=new _(f);await W.saveReviewStart(c,L),await W.saveMessage(c,"user",S(h),null,{codeReview:{reviewId:b,phase:"started",targetKind:x.info.kind,targetDigest:x.info.digest}}),await O.updateSessionMetadata(c,f,{taskStatus:"running",taskStatusReason:`Reviewing ${x.info.label}`,taskPromptSummary:S(h),taskStartedAt:m,taskCompletedAt:null,taskFailure:null}),Z.add($);let H=this.execute({...a,target:x,reviewId:b,reviewerSessionId:F,instructions:l,store:W,onEvent:g}).finally(()=>{Z.delete($)});return{reviewId:b,completion:H}}static async execute(a){let{sessionId:c,projectPath:f,runtime:w,request:h,signal:g,onEvent:$,target:k,reviewId:l,reviewerSessionId:x,instructions:b,store:F}=a,m;try{let W=[k.instruction,"Bash already starts in the review workspace. Never prefix a command with cd.",`Authoritative target digest: ${k.info.digest}`,`Changed file count: ${k.info.fileCount}`,b?`Additional review instructions:
5
5
  ${b}`:"","Inspect the diff and enough surrounding code to prove each finding.","Return only JSON with keys overall_explanation and findings. Each finding","must use title, body, priority, confidence_score, and code_location","(path, line_start, line_end) exactly as defined by the reviewer contract."].filter(Boolean).join(`
6
6
 
7
7
  `),r=await new p(e,w.getAgentResources(),w.getModelResources(),w.getLspResources()).execute({prompt:W,parentSessionId:c,modelId:w.getCurrentModelId(),permissionMode:"default",reasoningEffort:w.getReasoningConfiguration().selection,serviceTier:w.getServiceTierConfiguration().selection,responseVerbosity:w.getResponseVerbosityConfiguration().selection,communicationStyle:w.getCommunicationStyleConfiguration().selection,subagentSessionId:x,workspaceRoot:f,signal:g,onEvent:$});if(!r.success)throw Error(r.error||"Review agent failed");if((r.modifiedFiles?.length??0)>0)throw Error("Read-only reviewer reported workspace modifications");let G=Rf(r.message,f,k),B=!1;try{B=(await K.resolve(f,h)).info.digest!==k.info.digest}catch{B=!0}m={reviewId:l,status:B?"stale":"completed",...G,completedAt:new Date().toISOString()}}catch(W){let H=g?.aborted===!0;m={reviewId:l,status:H?"aborted":"failed",overallExplanation:H?"The code review was aborted.":"The code review could not produce a valid structured report.",findings:[],completedAt:new Date().toISOString(),error:W instanceof Error?W.message.slice(0,2000):String(W)}}await F.saveReviewCompletion(c,m);let L=N(await J(f,c)).find((W)=>W.start.reviewId===l)?.start;if(!L)throw Error(`Review start disappeared: ${l}`);return await F.saveMessage(c,"assistant",A(L,m),null,{codeReview:z(L,m)}),await O.updateSessionMetadata(c,f,{taskStatus:m.status==="completed"||m.status==="stale"?"completed":m.status==="aborted"?"cancelled":m.status==="interrupted"?"interrupted":"failed",taskStatusReason:m.status==="completed"?null:`Code review ${I(m.status)}`,taskCompletedAt:m.completedAt,taskOwnerPid:null}),m}static async recoverInterrupted(a,c,f){let w=v(a,c);if(Z.has(w))return;let h=await J(a,c),g=U(h);if(!g)return;if(f.sessionId!==c||R.resolve(f.workspaceRoot)!==R.resolve(a))throw Error("Review recovery requires the owning Session runtime");if(f.hasTurnOwner())return;let $={reviewId:g.start.reviewId,status:"interrupted",overallExplanation:"The process exited before the reviewer completed. The review was not replayed.",findings:[],completedAt:new Date().toISOString(),error:"Review interrupted by process restart"},k=new _(a);return await k.saveReviewCompletion(c,$),await k.saveMessage(c,"assistant",A(g.start,$),null,{codeReview:z(g.start,$)}),await O.updateSessionMetadata(c,a,{taskStatus:"interrupted",taskStatusReason:"Code review interrupted by process restart",taskCompletedAt:$.completedAt,taskOwnerPid:null}),$}static async list(a,c){return N(await J(a,c))}}
8
- export{af as x,wf as y,Tf as z,rf as A};
8
+ export{af as A,wf as B,Tf as C,rf as D};