blade-code 0.10.6 → 0.10.8

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 (116) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-1w6azndv.js +1 -0
  3. package/dist/chunk-2gwaqpge.js +1 -0
  4. package/dist/chunk-2pjd4cys.js +1 -0
  5. package/dist/{chunk-xsmtpkjm.js → chunk-2thg3fq1.js} +1 -1
  6. package/dist/chunk-2zn5en0w.js +1 -0
  7. package/dist/{chunk-vvbd9fb5.js → chunk-33ave20b.js} +1 -1
  8. package/dist/chunk-3w1z6fwm.js +1 -0
  9. package/dist/chunk-43x4qbvt.js +1 -0
  10. package/dist/{chunk-kcwq1e7h.js → chunk-4h9ff923.js} +1 -1
  11. package/dist/chunk-52csdk21.js +3 -0
  12. package/dist/{chunk-frcg8gea.js → chunk-66hb7kxm.js} +2 -2
  13. package/dist/chunk-6j8wgp2s.js +2 -0
  14. package/dist/chunk-6vsszvgg.js +2 -0
  15. package/dist/chunk-7evtr0yr.js +10 -0
  16. package/dist/{chunk-yt39kfc6.js → chunk-7hbw6q6d.js} +1 -1
  17. package/dist/chunk-7zsyejr1.js +22 -0
  18. package/dist/{chunk-r083b7vn.js → chunk-8gcg2z3y.js} +16 -16
  19. package/dist/{chunk-rag8zchg.js → chunk-8gcvpmwk.js} +1 -1
  20. package/dist/{chunk-6cv4gddv.js → chunk-8gnfj89a.js} +2 -2
  21. package/dist/{chunk-76d7p64v.js → chunk-8h0yxh6y.js} +2 -2
  22. package/dist/chunk-8sfycn3y.js +194 -0
  23. package/dist/{chunk-c2rhwxyn.js → chunk-954vmnrn.js} +1 -1
  24. package/dist/chunk-a8h3fymk.js +100 -0
  25. package/dist/chunk-b5szbtmp.js +5 -0
  26. package/dist/chunk-bxm2hq0m.js +1 -0
  27. package/dist/chunk-c8da4b3d.js +1 -0
  28. package/dist/{chunk-p4j4aawd.js → chunk-cbpqcdga.js} +1 -1
  29. package/dist/{chunk-m4htdpr9.js → chunk-cf8e7e92.js} +72 -17
  30. package/dist/chunk-d0g4t8fw.js +8 -0
  31. package/dist/{chunk-b4n34hrn.js → chunk-eq2qj9ja.js} +1 -1
  32. package/dist/{chunk-7xm3vjkz.js → chunk-fj8v7pep.js} +1 -1
  33. package/dist/{chunk-bn0ge244.js → chunk-fxpq9nh6.js} +1 -1
  34. package/dist/chunk-g00wj2we.js +4 -0
  35. package/dist/{chunk-bnrce0hg.js → chunk-h28ptrrt.js} +1 -1
  36. package/dist/{chunk-gb4n3hwj.js → chunk-h421wzbm.js} +2 -2
  37. package/dist/{chunk-dcvvxsa1.js → chunk-j4tttsaz.js} +2 -2
  38. package/dist/{chunk-k0p9ecgc.js → chunk-kagpk2x5.js} +6 -6
  39. package/dist/chunk-kvnwhwx3.js +1 -0
  40. package/dist/{chunk-p196e4rq.js → chunk-m2xrx1je.js} +1 -1
  41. package/dist/chunk-nhc49pan.js +160 -0
  42. package/dist/{chunk-sf9pe2n6.js → chunk-nymm525r.js} +1 -1
  43. package/dist/{chunk-9sfmrb1j.js → chunk-nz57y1ad.js} +3 -3
  44. package/dist/{chunk-45dcfkwe.js → chunk-p2m56new.js} +2 -2
  45. package/dist/{chunk-w154jyby.js → chunk-pv9sw79c.js} +1 -1
  46. package/dist/chunk-qgp08qmz.js +6 -0
  47. package/dist/{chunk-evaht3v4.js → chunk-r7tsa2zv.js} +1 -1
  48. package/dist/{chunk-rw6gv740.js → chunk-rkvfsx8e.js} +1 -1
  49. package/dist/{chunk-v1p80wvh.js → chunk-rxqft6td.js} +2 -2
  50. package/dist/{chunk-g9n211y4.js → chunk-s9aj3p11.js} +2 -2
  51. package/dist/chunk-senkwdh6.js +2 -0
  52. package/dist/chunk-v1c58sm6.js +1 -0
  53. package/dist/{chunk-n9khyme2.js → chunk-v8pq6qmv.js} +2 -2
  54. package/dist/{chunk-1cvr3qtd.js → chunk-van4ysq6.js} +289 -305
  55. package/dist/chunk-vgp8m9fg.js +2 -0
  56. package/dist/{chunk-4y28hykg.js → chunk-vsg8f0e6.js} +1 -1
  57. package/dist/{chunk-kcs3xa8f.js → chunk-w0nscjd2.js} +2 -2
  58. package/dist/chunk-w26jhcj9.js +1 -0
  59. package/dist/{chunk-hjsm6ejs.js → chunk-wmnszjmv.js} +2 -2
  60. package/dist/chunk-x6wgh726.js +1 -0
  61. package/dist/{chunk-thvwt4kc.js → chunk-xa05phpw.js} +3 -3
  62. package/dist/{chunk-g4q26d9a.js → chunk-xmcsn7y0.js} +2 -2
  63. package/dist/{chunk-c9tzf9r5.js → chunk-y4c3wwpa.js} +1 -1
  64. package/dist/{chunk-0rp2ck29.js → chunk-yfs9tq3y.js} +2 -2
  65. package/dist/chunk-ymzcxryf.js +1 -0
  66. package/dist/{chunk-xkp4ph6v.js → chunk-zknv3d6y.js} +1 -1
  67. package/dist/chunk-zp4x2mwj.js +1 -0
  68. package/dist/chunk-zvk3g177.js +9 -0
  69. package/dist/web/assets/ChatView-Fqy97qw9.js +7 -0
  70. package/dist/web/assets/{CodeBlockHighlighter-CFW6qjnA.js → CodeBlockHighlighter-EgdsVoMQ.js} +1 -1
  71. package/dist/web/assets/{FilePreview-CR_XetY0.js → FilePreview-xicd9-Sl.js} +1 -1
  72. package/dist/web/assets/{MarkdownRenderer-CVrxJswQ.js → MarkdownRenderer-DBSjC_z3.js} +18 -18
  73. package/dist/web/assets/SettingsModal-Bkh5rMAJ.js +5 -0
  74. package/dist/web/assets/TaskSwitcher-DXcj0iJ_.js +1 -0
  75. package/dist/web/assets/{TerminalPanel-DTqvx8yB.js → TerminalPanel-DWVY-Elm.js} +1 -1
  76. package/dist/web/assets/index-Bi5ijAQP.css +1 -0
  77. package/dist/web/assets/index-CxEh32hc.js +32 -0
  78. package/dist/web/assets/{vendor-icons-D_AkWmWB.js → vendor-icons-Cv18Q6rW.js} +72 -67
  79. package/dist/web/assets/{vendor-radix-DBy9B2DN.js → vendor-radix-DXRuAJHH.js} +1 -1
  80. package/dist/web/index.html +4 -4
  81. package/package.json +3 -1
  82. package/dist/chunk-10k6egwk.js +0 -1
  83. package/dist/chunk-17xtw88g.js +0 -1
  84. package/dist/chunk-1kg9r8xp.js +0 -2
  85. package/dist/chunk-383vbwmt.js +0 -4
  86. package/dist/chunk-3kk3bk11.js +0 -1
  87. package/dist/chunk-47dsd91k.js +0 -99
  88. package/dist/chunk-4kaygjqv.js +0 -10
  89. package/dist/chunk-50fq7r0h.js +0 -22
  90. package/dist/chunk-59eje513.js +0 -1
  91. package/dist/chunk-710bvht9.js +0 -160
  92. package/dist/chunk-a9pbpgkg.js +0 -9
  93. package/dist/chunk-c8rky275.js +0 -6
  94. package/dist/chunk-j1sd03h7.js +0 -1
  95. package/dist/chunk-jqyvnmfr.js +0 -187
  96. package/dist/chunk-jrh5tzc4.js +0 -1
  97. package/dist/chunk-kj1ah6kn.js +0 -1
  98. package/dist/chunk-n34z4c47.js +0 -1
  99. package/dist/chunk-n5m2p0bq.js +0 -2
  100. package/dist/chunk-nfmsn652.js +0 -2
  101. package/dist/chunk-qvabd0vg.js +0 -1
  102. package/dist/chunk-t75wspk3.js +0 -1
  103. package/dist/chunk-vddqv6fv.js +0 -1
  104. package/dist/chunk-w4zvftrw.js +0 -5
  105. package/dist/chunk-wa7v7akz.js +0 -3
  106. package/dist/chunk-wxwqz67n.js +0 -1
  107. package/dist/chunk-x9hm3p3a.js +0 -1
  108. package/dist/chunk-xd2g4zjx.js +0 -1
  109. package/dist/web/assets/ChatView-Y-6k-ayR.js +0 -7
  110. package/dist/web/assets/McpModal-BO-85gll.js +0 -5
  111. package/dist/web/assets/SettingsModal-CW87OnxI.js +0 -1
  112. package/dist/web/assets/SkillsModal-Q8ZFPhys.js +0 -1
  113. package/dist/web/assets/TaskSwitcher-BzH-0QXr.js +0 -1
  114. package/dist/web/assets/index-B7etZcne.css +0 -1
  115. package/dist/web/assets/index-ClOgGy-I.js +0 -32
  116. package/dist/web/assets/useRequest-BvqVDnKl.js +0 -1
package/dist/blade.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{Wb as W}from"./chunk-gb4n3hwj.js";import{Zb as F,_b as M}from"./chunk-g4q26d9a.js";import"./chunk-r083b7vn.js";import"./chunk-yt39kfc6.js";import"./chunk-bnrce0hg.js";import"./chunk-thvwt4kc.js";import"./chunk-p4j4aawd.js";import{rd as T}from"./chunk-6cv4gddv.js";import"./chunk-0rp2ck29.js";import"./chunk-xkp4ph6v.js";import"./chunk-1kg9r8xp.js";import{ve as N,we as B}from"./chunk-c9tzf9r5.js";import"./chunk-n9khyme2.js";import"./chunk-7xm3vjkz.js";import"./chunk-nfmsn652.js";import"./chunk-kcs3xa8f.js";import"./chunk-vvbd9fb5.js";import"./chunk-frcg8gea.js";import{_e as K}from"./chunk-c2rhwxyn.js";import C from"node:path";var E=process.argv.slice(2),I=p(E),v=I!==null;if(I!==null)T.setGlobalDebug(I);function p(Q){for(let Y=0;Y<Q.length;Y+=1){let U=Q[Y];if(U==="--debug"||U==="-d"){let X=Q[Y+1];return X&&!X.startsWith("-")?X:!0}if(U.startsWith("--debug="))return U.slice(8)||!0}return null}function u(Q){return Q.length===1&&(Q[0]==="--version"||Q[0]==="-V")}function q(Q,...Y){return Q.some((U)=>Y.some((X)=>U===X||U.startsWith(`${X}=`)))}function c(Q,...Y){let U=[];for(let X=0;X<Q.length;X+=1){let G=Q[X],z=Y.find(($)=>G.startsWith(`${$}=`));if(z){let $=G.slice(z.length+1);if($)U.push($);continue}if(Y.includes(G)){let $=Q[X+1];if($&&!$.startsWith("-"))U.push($),X+=1}}return U}async function m(){if(u(E)){let{getVersion:J}=await import("./chunk-qvabd0vg.js");console.log(J());return}let Q=process.cwd(),Y=F(Q);M(Y),N(B());let U=c(E,"--plugin-dir","--pluginDir");if(U.length>0){let{configureInvocationPluginDirs:J}=await import("./chunk-wxwqz67n.js");J(U.map((Z)=>C.resolve(Q,Z)))}if(q(E,"--trust-workspace","--trustWorkspace")){let{WorkspaceTrustService:J}=await import("./chunk-kj1ah6kn.js");await J.getInstance().trust(B())}if(process.getuid&&process.getuid()===0){let J=!!process.env.SUDO_USER,Z=!!process.env.BLADE_ALLOW_ROOT;if(J&&!Z)console.error(""),console.error("Error: 请不要使用 sudo 运行 blade"),console.error(""),console.error("原因:"),console.error(" 使用 sudo 会创建属于 root 的配置文件,"),console.error(" 导致普通用户无法访问。"),console.error(""),console.error("正确用法:"),console.error(" blade # 直接运行,不要加 sudo"),console.error(""),console.error("如果遇到权限错误,请运行:"),console.error(" sudo chown -R $USER:$USER ~/.blade/"),console.error(""),console.error("如果你确实需要以 root 运行(容器/CI),设置环境变量:"),console.error(" BLADE_ALLOW_ROOT=1 blade"),console.error(""),process.exit(1)}if(q(E,"--headless")){let{handleHeadlessMode:J}=await import("./chunk-c8rky275.js");if(await J())return}if(W(),q(E,"--print","-p")){let{handlePrintMode:J}=await import("./chunk-a9pbpgkg.js");if(await J())return}if(E.includes("--acp")){let{runAcpIntegration:J}=await import("./chunk-50fq7r0h.js");await J();return}let[{default:X},{hideBin:G},{cliConfig:z,globalOptions:$},{loadConfiguration:_,validateOutput:D,validatePermissions:R},{doctorCommands:S},{installCommands:k},{mcpCommands:O},{projectsCommands:y},{serveCommand:b},{updateCommands:V},{webCommand:P}]=await Promise.all([import("yargs"),import("yargs/helpers"),import("./chunk-17xtw88g.js"),import("./chunk-59eje513.js"),import("./chunk-dcvvxsa1.js"),import("./chunk-rag8zchg.js"),import("./chunk-xsmtpkjm.js"),import("./chunk-bn0ge244.js"),import("./chunk-vddqv6fv.js"),import("./chunk-evaht3v4.js"),import("./chunk-4kaygjqv.js")]),x=X(G(process.argv)).scriptName(z.scriptName).usage(z.usage).version(z.version).locale(z.locale).showHelpOnFail(z.showHelpOnFail).demandCommand(0,"").recommendCommands().strict(z.strict).parserConfiguration({"populate--":!0}).options($).middleware([_,R,D]).command(O).command(y).command(S).command(V).command(k).command(P).command(b).completion("completion",!1).help("help","Show help").alias("help","h").alias("version","V").fail((J,Z,L)=>{if(Z){if(console.error("An error occurred:"),console.error(Z.message),v&&Z.stack)console.error(`
2
+ import{gc as W}from"./chunk-h421wzbm.js";import{jc as F,kc as M}from"./chunk-xmcsn7y0.js";import"./chunk-8gcg2z3y.js";import"./chunk-7hbw6q6d.js";import"./chunk-h28ptrrt.js";import"./chunk-xa05phpw.js";import"./chunk-cbpqcdga.js";import{Hd as T}from"./chunk-8gnfj89a.js";import"./chunk-yfs9tq3y.js";import"./chunk-zknv3d6y.js";import"./chunk-6j8wgp2s.js";import{Le as N,Me as B}from"./chunk-y4c3wwpa.js";import"./chunk-v8pq6qmv.js";import"./chunk-fj8v7pep.js";import"./chunk-6vsszvgg.js";import"./chunk-w0nscjd2.js";import"./chunk-33ave20b.js";import"./chunk-66hb7kxm.js";import{of as K}from"./chunk-954vmnrn.js";import C from"node:path";var E=process.argv.slice(2),I=p(E),v=I!==null;if(I!==null)T.setGlobalDebug(I);function p(Q){for(let Y=0;Y<Q.length;Y+=1){let U=Q[Y];if(U==="--debug"||U==="-d"){let X=Q[Y+1];return X&&!X.startsWith("-")?X:!0}if(U.startsWith("--debug="))return U.slice(8)||!0}return null}function u(Q){return Q.length===1&&(Q[0]==="--version"||Q[0]==="-V")}function q(Q,...Y){return Q.some((U)=>Y.some((X)=>U===X||U.startsWith(`${X}=`)))}function c(Q,...Y){let U=[];for(let X=0;X<Q.length;X+=1){let G=Q[X],z=Y.find(($)=>G.startsWith(`${$}=`));if(z){let $=G.slice(z.length+1);if($)U.push($);continue}if(Y.includes(G)){let $=Q[X+1];if($&&!$.startsWith("-"))U.push($),X+=1}}return U}async function m(){if(u(E)){let{getVersion:J}=await import("./chunk-w26jhcj9.js");console.log(J());return}let Q=process.cwd(),Y=F(Q);M(Y),N(B());let U=c(E,"--plugin-dir","--pluginDir");if(U.length>0){let{configureInvocationPluginDirs:J}=await import("./chunk-2pjd4cys.js");J(U.map((Z)=>C.resolve(Q,Z)))}if(q(E,"--trust-workspace","--trustWorkspace")){let{WorkspaceTrustService:J}=await import("./chunk-zp4x2mwj.js");await J.getInstance().trust(B())}if(process.getuid&&process.getuid()===0){let J=!!process.env.SUDO_USER,Z=!!process.env.BLADE_ALLOW_ROOT;if(J&&!Z)console.error(""),console.error("Error: 请不要使用 sudo 运行 blade"),console.error(""),console.error("原因:"),console.error(" 使用 sudo 会创建属于 root 的配置文件,"),console.error(" 导致普通用户无法访问。"),console.error(""),console.error("正确用法:"),console.error(" blade # 直接运行,不要加 sudo"),console.error(""),console.error("如果遇到权限错误,请运行:"),console.error(" sudo chown -R $USER:$USER ~/.blade/"),console.error(""),console.error("如果你确实需要以 root 运行(容器/CI),设置环境变量:"),console.error(" BLADE_ALLOW_ROOT=1 blade"),console.error(""),process.exit(1)}if(q(E,"--headless")){let{handleHeadlessMode:J}=await import("./chunk-qgp08qmz.js");if(await J())return}if(W(),q(E,"--print","-p")){let{handlePrintMode:J}=await import("./chunk-zvk3g177.js");if(await J())return}if(E.includes("--acp")){let{runAcpIntegration:J}=await import("./chunk-7zsyejr1.js");await J();return}let[{default:X},{hideBin:G},{cliConfig:z,globalOptions:$},{loadConfiguration:_,validateOutput:D,validatePermissions:R},{doctorCommands:S},{installCommands:k},{mcpCommands:O},{projectsCommands:y},{serveCommand:b},{updateCommands:V},{webCommand:P}]=await Promise.all([import("yargs"),import("yargs/helpers"),import("./chunk-c8da4b3d.js"),import("./chunk-1w6azndv.js"),import("./chunk-j4tttsaz.js"),import("./chunk-8gcvpmwk.js"),import("./chunk-2thg3fq1.js"),import("./chunk-fxpq9nh6.js"),import("./chunk-kvnwhwx3.js"),import("./chunk-r7tsa2zv.js"),import("./chunk-7evtr0yr.js")]),x=X(G(process.argv)).scriptName(z.scriptName).usage(z.usage).version(z.version).locale(z.locale).showHelpOnFail(z.showHelpOnFail).demandCommand(0,"").recommendCommands().strict(z.strict).parserConfiguration({"populate--":!0}).options($).middleware([_,R,D]).command(O).command(y).command(S).command(V).command(k).command(P).command(b).completion("completion",!1).help("help","Show help").alias("help","h").alias("version","V").fail((J,Z,L)=>{if(Z){if(console.error("An error occurred:"),console.error(Z.message),v&&Z.stack)console.error(`
3
3
  Stack trace:`),console.error(Z.stack);else console.error(`
4
4
  Run with --debug to show the stack trace.`);process.exit(1)}if(J)console.error("Error: Invalid arguments:"),console.error(J),console.error(`
5
- Hint: Did you mean:`),L.showHelp(),process.exit(1)}).command("$0",!1,()=>{},async(J)=>{let Z=J._.slice(1),L=Z.length>0?Z.join(" "):void 0,h=import("./chunk-j1sd03h7.js").then(({checkVersionOnStartup:j})=>j()),[{render:A},{createElement:w},{AppWrapper:f}]=await Promise.all([import("ink"),import("react"),import("./chunk-710bvht9.js")]),H={...J,initialMessage:L,debug:J.debug,print:Boolean(J.print),versionCheckPromise:h};delete H._,delete H.$0,delete H.message,A(w(f,H),{patchConsole:!0,exitOnCtrlC:!1,alternateBuffer:!1})});try{await x.parse()}catch(J){console.error("Error: Parse error:",J),process.exit(1)}}if(K.main==K.module)m().catch(console.error);export{m as main};
5
+ Hint: Did you mean:`),L.showHelp(),process.exit(1)}).command("$0",!1,()=>{},async(J)=>{let Z=J._.slice(1),L=Z.length>0?Z.join(" "):void 0,h=import("./chunk-ymzcxryf.js").then(({checkVersionOnStartup:j})=>j()),[{render:A},{createElement:w},{AppWrapper:f}]=await Promise.all([import("ink"),import("react"),import("./chunk-nhc49pan.js")]),H={...J,initialMessage:L,debug:J.debug,print:Boolean(J.print),versionCheckPromise:h};delete H._,delete H.$0,delete H.message,A(w(f,H),{patchConsole:!0,exitOnCtrlC:!1,alternateBuffer:!1})});try{await x.parse()}catch(J){console.error("Error: Parse error:",J),process.exit(1)}}if(K.main==K.module)m().catch(console.error);export{m as main};
@@ -0,0 +1 @@
1
+ import{ac as a,bc as b,cc as c}from"./chunk-nz57y1ad.js";import"./chunk-p2m56new.js";import"./chunk-8gcg2z3y.js";import"./chunk-7hbw6q6d.js";import"./chunk-h28ptrrt.js";import"./chunk-4h9ff923.js";import"./chunk-8gnfj89a.js";import"./chunk-yfs9tq3y.js";import"./chunk-zknv3d6y.js";import"./chunk-6j8wgp2s.js";import"./chunk-y4c3wwpa.js";import"./chunk-v8pq6qmv.js";import"./chunk-fj8v7pep.js";import"./chunk-6vsszvgg.js";import"./chunk-w0nscjd2.js";import"./chunk-33ave20b.js";import"./chunk-66hb7kxm.js";import"./chunk-954vmnrn.js";export{a as validatePermissions,c as validateOutput,b as loadConfiguration};
@@ -0,0 +1 @@
1
+ import{Ac as f,Bc as g,Cc as h,Dc as i,Ec as j,Fc as k,Gc as l,Hc as m,Ic as n,Jc as o,Kc as p,Lc as q,vc as a,wc as b,xc as c,yc as d,zc as e}from"./chunk-8gcg2z3y.js";import"./chunk-7hbw6q6d.js";import"./chunk-h28ptrrt.js";import"./chunk-8gnfj89a.js";import"./chunk-yfs9tq3y.js";import"./chunk-zknv3d6y.js";import"./chunk-6j8wgp2s.js";import"./chunk-y4c3wwpa.js";import"./chunk-v8pq6qmv.js";import"./chunk-fj8v7pep.js";import"./chunk-6vsszvgg.js";import"./chunk-w0nscjd2.js";import"./chunk-33ave20b.js";import"./chunk-66hb7kxm.js";import"./chunk-954vmnrn.js";export{a as vanillaStore,c as sessionActions,l as getThinkingModeEnabled,b as getState,n as getServiceTier,o as getResponseVerbosity,m as getReasoningEffort,j as getModelById,e as getMessages,k as getMcpServers,i as getCurrentModel,f as getConfig,p as getCommunicationStyle,h as getAllModels,g as ensureStoreInitialized,q as configActions,d as appActions};
@@ -0,0 +1 @@
1
+ import{nd as a,od as b,pd as c,qd as d,rd as e}from"./chunk-cf8e7e92.js";import"./chunk-senkwdh6.js";import"./chunk-vsg8f0e6.js";import"./chunk-4h9ff923.js";import"./chunk-xa05phpw.js";import"./chunk-cbpqcdga.js";import"./chunk-8gnfj89a.js";import"./chunk-yfs9tq3y.js";import"./chunk-zknv3d6y.js";import"./chunk-6j8wgp2s.js";import"./chunk-y4c3wwpa.js";import"./chunk-v8pq6qmv.js";import"./chunk-fj8v7pep.js";import"./chunk-6vsszvgg.js";import"./chunk-w0nscjd2.js";import"./chunk-33ave20b.js";import"./chunk-66hb7kxm.js";import"./chunk-954vmnrn.js";export{d as snapshotWorkspaceAgentResources,c as resolveWorkspaceAgentResources,e as resetWorkspaceAgentResources,a as refreshWorkspaceCommunicationStyles,b as configureInvocationPluginDirs};
@@ -1,4 +1,4 @@
1
- import{ha as H}from"./chunk-g9n211y4.js";import"./chunk-sf9pe2n6.js";import{tc as $,zc as T}from"./chunk-r083b7vn.js";import"./chunk-yt39kfc6.js";import"./chunk-bnrce0hg.js";import"./chunk-thvwt4kc.js";import"./chunk-p4j4aawd.js";import"./chunk-6cv4gddv.js";import"./chunk-0rp2ck29.js";import"./chunk-xkp4ph6v.js";import"./chunk-1kg9r8xp.js";import{we as k}from"./chunk-c9tzf9r5.js";import"./chunk-n9khyme2.js";import"./chunk-7xm3vjkz.js";import"./chunk-nfmsn652.js";import"./chunk-kcs3xa8f.js";import"./chunk-vvbd9fb5.js";import"./chunk-frcg8gea.js";import"./chunk-c2rhwxyn.js";import U from"os";import J from"path";function X(z){return typeof z==="string"?z:void 0}function N(z){if(!Array.isArray(z))return;let q=[];for(let K of z)if(typeof K==="string")q.push(K);else if(K!=null)q.push(String(K));return q}function b(){console.log(`
1
+ import{ka as H}from"./chunk-s9aj3p11.js";import"./chunk-nymm525r.js";import{Fc as $,Lc as T}from"./chunk-8gcg2z3y.js";import"./chunk-7hbw6q6d.js";import"./chunk-h28ptrrt.js";import"./chunk-xa05phpw.js";import"./chunk-cbpqcdga.js";import"./chunk-8gnfj89a.js";import"./chunk-yfs9tq3y.js";import"./chunk-zknv3d6y.js";import"./chunk-6j8wgp2s.js";import{Me as k}from"./chunk-y4c3wwpa.js";import"./chunk-v8pq6qmv.js";import"./chunk-fj8v7pep.js";import"./chunk-6vsszvgg.js";import"./chunk-w0nscjd2.js";import"./chunk-33ave20b.js";import"./chunk-66hb7kxm.js";import"./chunk-954vmnrn.js";import U from"os";import J from"path";function X(z){return typeof z==="string"?z:void 0}function N(z){if(!Array.isArray(z))return;let q=[];for(let K of z)if(typeof K==="string")q.push(K);else if(K!=null)q.push(String(K));return q}function b(){console.log(`
2
2
  blade mcp
3
3
  `),console.log(`管理 MCP 服务器
4
4
  `),console.log("Commands:"),console.log(" blade mcp add <name> <commandOrUrl> [args...] 添加 MCP 服务器"),console.log(" blade mcp remove <name> 删除 MCP 服务器 [aliases: rm]"),console.log(" blade mcp list 列出所有 MCP 服务器并检查健康状态 [aliases: ls]"),console.log(" blade mcp get <name> 获取服务器详情"),console.log(" blade mcp login <name> 登录远程 MCP OAuth"),console.log(" blade mcp logout <name> 清除远程 MCP OAuth 凭证"),console.log(` blade mcp add-json <name> <json> 从 JSON 字符串添加服务器
@@ -0,0 +1 @@
1
+ import{Sb as a,Tb as b,Ub as c,Vb as d,Wb as e,Xb as f,Yb as g,Zb as h}from"./chunk-kagpk2x5.js";import"./chunk-8gnfj89a.js";import"./chunk-66hb7kxm.js";import"./chunk-954vmnrn.js";export{d as syncSession,e as syncAll,h as searchProjectionText,c as resetProjectionDbCache,f as removeSessionFromProjection,g as rebuildProjectionIndex,b as getProjectionDb,a as getIndexDbPath};
@@ -1,2 +1,2 @@
1
1
  import{promises as A}from"node:fs";import q from"node:path";var J=new Map;async function L(B){let b=B;while(!0){try{return await A.lstat(q.join(b,".git")),b}catch(H){if(H.code!=="ENOENT")return}let E=q.dirname(b);if(E===b)return;b=E}}async function M(B){let b=q.join(B,".git"),E=await A.lstat(b);if(E.isDirectory())return B;if(!E.isFile())return;let H=await A.readFile(b,"utf8"),F=/^gitdir:\s*(.+)\s*$/im.exec(H);if(!F)return;let z=await A.realpath(q.isAbsolute(F[1])?F[1]:q.resolve(B,F[1])),I=z;try{let x=(await A.readFile(q.join(z,"commondir"),"utf8")).trim();if(x)I=await A.realpath(q.resolve(z,x))}catch(x){if(x.code!=="ENOENT")throw x}return q.basename(I)===".git"?A.realpath(q.dirname(I)):void 0}async function S(B){if(!q.isAbsolute(B))throw Error("Workspace path must be absolute");let b=await A.realpath(B),E=J.get(b);if(E)return E;let H=b;try{let z=await L(b);if(z){let I=await M(z),x=q.relative(z,b);if(I&&(x===""||!x.startsWith(`..${q.sep}`)&&x!==".."&&!q.isAbsolute(x))){let K=q.resolve(I,x);H=await A.realpath(K).catch(()=>K)}}}catch{}let F={projectPath:b,trustRoot:H};if(J.size>=512){let z=J.keys().next().value;if(z)J.delete(z)}return J.set(b,F),F}
2
- export{S as Pe};
2
+ export{S as df};
@@ -0,0 +1 @@
1
+ import{Cb as a,Db as b,Eb as c,Fb as d,Gb as e,Hb as f}from"./chunk-a8h3fymk.js";import"./chunk-kagpk2x5.js";import"./chunk-eq2qj9ja.js";import"./chunk-vsg8f0e6.js";import"./chunk-cbpqcdga.js";import"./chunk-8gnfj89a.js";import"./chunk-6j8wgp2s.js";import"./chunk-y4c3wwpa.js";import"./chunk-fj8v7pep.js";import"./chunk-6vsszvgg.js";import"./chunk-66hb7kxm.js";import"./chunk-954vmnrn.js";export{a as __setSessionSnapshotIOForTesting,b as __resetSessionSnapshotIOForTesting,f as SessionService,c as SessionMissingCreationError,d as SessionArchivedError,e as SessionArchiveConflictError};
@@ -0,0 +1 @@
1
+ import{Aa as e,Ba as f,Fa as g,Ga as h,Ha as i,Ia as j,Ja as k,Qa as l,Ra as m,Sa as n,Ta as o,Ua as p,Va as q,Wa as r,va as a,wa as b,ya as c,za as d}from"./chunk-8sfycn3y.js";import"./chunk-nymm525r.js";import"./chunk-a8h3fymk.js";import"./chunk-kagpk2x5.js";import"./chunk-h28ptrrt.js";import"./chunk-b5szbtmp.js";import"./chunk-eq2qj9ja.js";import"./chunk-senkwdh6.js";import"./chunk-vsg8f0e6.js";import"./chunk-xa05phpw.js";import"./chunk-cbpqcdga.js";import"./chunk-8gnfj89a.js";import"./chunk-zknv3d6y.js";import"./chunk-6j8wgp2s.js";import"./chunk-y4c3wwpa.js";import"./chunk-v8pq6qmv.js";import"./chunk-fj8v7pep.js";import"./chunk-6vsszvgg.js";import"./chunk-33ave20b.js";import"./chunk-66hb7kxm.js";import"./chunk-954vmnrn.js";export{g as saveUserMessage,i as saveToolUse,j as saveToolResult,k as saveCompaction,h as saveAssistantMessage,d as isRootSystemPrompt,m as handleTaskListUpdate,n as handleSkillActivation,o as extractModelSwitch,r as executeLoopGenerator,f as drainLoop,c as checkStopHook,a as checkOutputRecovery,b as checkIncompleteIntent,q as checkAndCompactInLoop,p as applyToolDomainEffects,l as StreamingToolExecutor,e as ConversationState};
@@ -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 kd};
2
+ export{v as Ad};
@@ -0,0 +1,3 @@
1
+ import{e as u1,f as d1}from"./chunk-rkvfsx8e.js";import{g as b$}from"./chunk-pv9sw79c.js";import{r as j0}from"./chunk-d0g4t8fw.js";import{s as U1}from"./chunk-8h0yxh6y.js";import{A as w$,B as c$,C as E0,D as i$,E as l0,F as Q$,I as o$,J as n$,L as W1,M as M1,N as b1,O as R1,P as j1,Q as C1,R as I1,S as k1,T as S1,U as f1,V as g1,Y as z4,ba as t1,u as n1,w as V1,x as s0,y as OO}from"./chunk-van4ysq6.js";import{ea as CO,ka as X0}from"./chunk-s9aj3p11.js";import{Ba as l$,Ca as C0,Da as P,Ea as C,Na as F1,Pa as v0}from"./chunk-8sfycn3y.js";import{_a as Q1}from"./chunk-nymm525r.js";import{Ab as G1,Eb as K1,Fb as d$,Gb as y$,Hb as S,lb as N1,nb as A$,qb as n0,tb as u$,zb as X1}from"./chunk-a8h3fymk.js";import{Ac as o,Ec as fO,Lc as V0}from"./chunk-8gcg2z3y.js";import{Nc as g$}from"./chunk-h28ptrrt.js";import{Xc as Y1}from"./chunk-eq2qj9ja.js";import{Zc as H$}from"./chunk-rxqft6td.js";import{cd as c1,dd as i1,gd as q1,kd as Z$,ld as x$,pd as N0}from"./chunk-cf8e7e92.js";import{xd as PO,yd as z1}from"./chunk-vsg8f0e6.js";import{Cd as MO,Dd as c0}from"./chunk-xa05phpw.js";import{Id as p}from"./chunk-8gnfj89a.js";import{Xd as jO,ke as bO,ue as J$}from"./chunk-yfs9tq3y.js";import{Ae as b,Be as Y$,Ce as j,xe as v,ze as O}from"./chunk-zknv3d6y.js";import{Ge as S$,He as i0,Ie as TO}from"./chunk-6j8wgp2s.js";import{Me as y}from"./chunk-y4c3wwpa.js";import{Re as h0}from"./chunk-v8pq6qmv.js";import{Te as kO,Ue as Z1,We as SO,Xe as x1}from"./chunk-fj8v7pep.js";import{Ze as y0}from"./chunk-6vsszvgg.js";import{cf as YO}from"./chunk-w0nscjd2.js";import{hf as _$,lf as LO}from"./chunk-66hb7kxm.js";import{of as JO}from"./chunk-954vmnrn.js";var B5={port:{type:"number",describe:"Port to listen on (0 for auto)",default:0},hostname:{type:"string",describe:"Hostname to listen on",default:"127.0.0.1"},cors:{type:"array",describe:"Additional domains to allow for CORS",default:[]}};function H5($){return{port:$.port??0,hostname:$.hostname??"127.0.0.1",cors:$.cors??[]}}import{existsSync as zO,readFileSync as W$}from"node:fs";import{createServer as s2}from"node:http";import{networkInterfaces as r2}from"node:os";import{dirname as e2,extname as $5,join as f0}from"node:path";import{fileURLToPath as O5}from"node:url";import{brotliCompressSync as J5,gzipSync as Z5,constants as x5}from"node:zlib";import{Hono as Y5}from"hono";import{cors as z5}from"hono/cors";import{WebSocketServer as Q5}from"ws";class J0 extends Error{code;statusCode;constructor($,J,Z=500){super(J);this.code=$;this.statusCode=Z;this.name="BladeServerError"}toObject(){return{error:{code:this.code,message:this.message}}}}class u extends J0{constructor($,J){super("NOT_FOUND",J?`${$} not found: ${J}`:`${$} not found`,404)}}class D extends J0{constructor($){super("BAD_REQUEST",$,400)}}class k extends J0{constructor($){super("CONFLICT",$,409)}}class d0 extends J0{constructor($){super("TOO_MANY_REQUESTS",$,429)}}class K0 extends J0{constructor(){super("AMBIGUOUS_SESSION","Multiple workspaces contain this session ID; projectPath is required",409)}}class a extends J0{constructor($="Internal server error"){super("INTERNAL_ERROR",$,500)}}var A5=O.Object({error:O.Object({code:O.String(),message:O.String()})});import{Hono as U4}from"hono";var I$=p("Service"),_4=O.Object({updates:O.Record(O.String(),O.Any()),options:O.Optional(O.Object({scope:O.Optional(j(["local","project","global"])),immediate:O.Optional(O.Boolean())}))});function D4($){return{currentModelId:$.currentModelId,permissionMode:$.permissionMode,language:$.language,theme:$.theme,uiTheme:$.uiTheme,autoSaveSessions:$.autoSaveSessions,notifyBuild:$.notifyBuild,notifyErrors:$.notifyErrors,notifySounds:$.notifySounds,privacyTelemetry:$.privacyTelemetry,privacyCrash:$.privacyCrash,communicationStyle:$.communicationStyle,maxConcurrentTasks:$.maxConcurrentTasks,maxQueuedTasks:$.maxQueuedTasks}}var BO=()=>{let $=new U4;return $.get("/",async(J)=>{try{let Z=o();return J.json(Z?D4(Z):{})}catch(Z){return I$.error("[ConfigRoutes] Failed to get config:",Z),J.json({})}}),$.put("/",async(J)=>{try{let Z=await J.req.json(),x=v(_4,Z);if(!x.success)throw new D("Invalid config update format");let{updates:z,options:X}=x.data;return await V0().updateConfig(z,X),J.json({success:!0,updates:z})}catch(Z){throw I$.error("[ConfigRoutes] Failed to update config:",Z),Z}}),$.get("/permissions",async(J)=>{try{let Z=o();return J.json(Z?.permissions||{})}catch(Z){return I$.error("[ConfigRoutes] Failed to get permissions:",Z),J.json({})}}),$};import{Hono as B4}from"hono";import{streamSSE as H4}from"hono/streaming";var L4=15000,w4=new Set(["task.status","task.delivery","session.created","session.updated","session.deleted","permission.asked","question.required","elicitation.required","interaction.resolved"]),A4=new Set(["queued","running","completed","failed","cancelled","interrupted"]);function E4($){if(!$||typeof $!=="object"||Array.isArray($))return;let J=$,Z=["changedFiles","additions","deletions","commits"];if(Z.some((x)=>typeof J[x]!=="number"||!Number.isInteger(J[x])||J[x]<0))return;return Object.fromEntries(Z.map((x)=>[x,J[x]]))}function O$($,J){return typeof $==="number"&&Number.isInteger($)&&$>=J?$:void 0}function q4($){if(!$||typeof $!=="object"||Array.isArray($))return;let J=$;if(!["applied","discarded","conflicted"].includes(String(J.status))||typeof J.updatedAt!=="string")return;return{status:J.status,updatedAt:J.updatedAt,...typeof J.sourceCommit==="string"?{sourceCommit:J.sourceCommit}:{},...O$(J.changedFiles,0)!==void 0?{changedFiles:J.changedFiles}:{},...typeof J.message==="string"?{message:J.message}:{}}}var HO=()=>{let $=new B4;return $.get("/",(J)=>H4(J,async(Z)=>{let x,z,X=!1,G=()=>{if(z!==void 0)clearInterval(z),z=void 0;x?.(),x=void 0},V=()=>{if(X)return;X=!0,G()};Z.onAbort(V),x=C.subscribe((W)=>{if(!w4.has(W.type))return;if(W.type==="permission.asked"||W.type==="question.required"||W.type==="elicitation.required"){let A=W.properties.requestId;if(typeof A!=="string"||!A)return;Z.writeSSE({data:JSON.stringify({type:"interaction.pending",properties:{sessionId:W.sessionId,projectPath:W.projectPath,interactionType:W.type==="question.required"?"question":W.type==="elicitation.required"?"elicitation":"permission",requestId:A}})}).catch(V);return}if(W.type==="interaction.resolved"){let A=W.properties.requestId;if(typeof A!=="string"||!A)return;Z.writeSSE({data:JSON.stringify({type:W.type,properties:{sessionId:W.sessionId,projectPath:W.projectPath,requestId:A}})}).catch(V);return}if(W.type==="session.created"||W.type==="session.deleted"){Z.writeSSE({data:JSON.stringify({type:W.type,properties:{sessionId:W.sessionId,projectPath:W.projectPath}})}).catch(V);return}if(W.type==="session.updated"){let A=W.properties.title;if(typeof A!=="string"||!A.trim())return;Z.writeSSE({data:JSON.stringify({type:W.type,properties:{sessionId:W.sessionId,projectPath:W.projectPath,title:A}})}).catch(V);return}if(W.type==="task.delivery"){let A=q4(W.properties.taskDelivery);if(!A)return;Z.writeSSE({data:JSON.stringify({type:W.type,properties:{sessionId:W.sessionId,projectPath:W.projectPath,taskDelivery:A,...W.properties.taskWorktreeRemoved===!0?{taskWorktreeRemoved:!0}:{},...typeof W.properties.updatedAt==="string"?{updatedAt:W.properties.updatedAt}:{}}})}).catch(V);return}let L=W.properties.taskStatus;if(typeof L!=="string"||!A4.has(L))return;let M=E4(W.properties.taskDiffStat),R=O$(W.properties.taskQueuePosition,1),I=O$(W.properties.taskQueueDepth,0),n=O$(W.properties.taskConcurrencyLimit,1),Z0=O$(W.properties.taskInFlight,0);Z.writeSSE({data:JSON.stringify({type:W.type,properties:{sessionId:W.sessionId,projectPath:W.projectPath,taskStatus:L,...typeof W.properties.taskStatusReason==="string"?{taskStatusReason:W.properties.taskStatusReason}:{},...W.properties.taskFailure&&typeof W.properties.taskFailure==="object"?{taskFailure:W.properties.taskFailure}:{},...typeof W.properties.taskStartedAt==="string"?{taskStartedAt:W.properties.taskStartedAt}:{},...typeof W.properties.taskCompletedAt==="string"?{taskCompletedAt:W.properties.taskCompletedAt}:{},...typeof W.properties.updatedAt==="string"?{updatedAt:W.properties.updatedAt}:{},...M?{taskDiffStat:M}:{},...R!==void 0?{taskQueuePosition:R}:{},...I!==void 0?{taskQueueDepth:I}:{},...n!==void 0?{taskConcurrencyLimit:n}:{},...Z0!==void 0?{taskInFlight:Z0}:{}}})}).catch(V)});try{if(Z.aborted||X)return;if(await Z.writeSSE({data:JSON.stringify({type:"connected",properties:{timestamp:Date.now()}})}),Z.aborted||X)return;z=setInterval(()=>{if(Z.aborted||X)return;Z.writeSSE({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})}).catch(V)},L4);while(!Z.aborted&&!X)await new Promise((W)=>setTimeout(W,1000))}finally{V()}})),$};import{Hono as M4}from"hono";var wO=()=>{let $=new M4;return $.get("/health",(J)=>{return J.json({healthy:!0,version:y0()})}),$.get("/info",(J)=>{let Z=y(),x=o();if(x)l0.configure(x.maxConcurrentTasks,x.maxQueuedTasks);return J.json({version:y0(),platform:process.platform,arch:process.arch,nodeVersion:process.version,cwd:Z,gitBranch:LO(Z),taskAdmission:l0.getStats()})}),$};import AO from"node:path";import{Hono as b4}from"hono";var R4=O.Object({projectPath:O.String({minLength:1}),action:j(["trust","revoke"]),expectedDigest:O.Optional(O.String())}),j4=O.Object({projectPath:O.String({minLength:1}),sessionId:O.String({minLength:1}),enabled:O.Boolean()});function k$($){if(!$||!AO.isAbsolute($))throw new D("projectPath must be absolute");return AO.resolve($)}function EO($){if(!$)throw new D("sessionId is required");try{_$($)}catch(J){throw new D(J instanceof Error?J.message:"sessionId is invalid")}return $}async function U$($){let J=k$($),Z=o()?.hooks??bO.hooks,x=await J$.getInstance().loadWorkspaceHooks(J,Z,{includeBaseForCurrentWorkspace:!1});await N0(J),x$(J);let z=c0.getInstance();return z.loadConfig(x,J),await Z$(J),z.getConfig(J)}function qO($,J){let Z=c0.getInstance(),x=Z.getConfig(J).enabled,z=Z.isSessionPaused($,J);return{sessionId:$,projectPath:J,enabled:Z.isSessionEnabled($,J),paused:z,configEnabled:x}}var RO=()=>{let $=new b4;return $.get("/trust",async(J)=>{let Z=J.req.query("projectPath");if(!Z)throw new D("projectPath query parameter is required");return await U$(Z),J.json(await c0.getInstance().getTrustStatus(Z))}),$.post("/trust",async(J)=>{let Z=v(R4,await J.req.json());if(!Z.success)throw new D("Invalid hook trust request");let{projectPath:x,action:z,expectedDigest:X}=Z.data;await U$(x);let G=c0.getInstance(),V;try{V=z==="trust"?await G.trustProject(x,X):await G.revokeProjectTrust(x)}catch(W){if(W instanceof MO)throw new k(W.message);throw W}return J.json(V)}),$.get("/session",async(J)=>{let Z=k$(J.req.query("projectPath")),x=EO(J.req.query("sessionId"));return await U$(Z),J.json(qO(x,Z))}),$.post("/session",async(J)=>{let Z=v(j4,await J.req.json());if(!Z.success)throw new D("Invalid hook session request");let x=k$(Z.data.projectPath),z=EO(Z.data.sessionId);await U$(x);let X=c0.getInstance();if(Z.data.enabled)X.enableSession(z,x);else X.disableSession(z,x);return J.json(qO(z,x))}),$};import{Hono as C4}from"hono";var A0=p("Service");function I4($){try{return CO($)}catch{return[]}}function k4($){if(!D$($)||!D$($.reference)||!D$($.argument))throw Error("Invalid MCP completion request");let J=$.reference.type,Z=J==="prompt"&&typeof $.reference.name==="string"?{type:"prompt",name:$.reference.name}:J==="resource"&&typeof $.reference.uri==="string"?{type:"resource",uri:$.reference.uri}:void 0;if(!Z||typeof $.argument.name!=="string"||typeof $.argument.value!=="string")throw Error("Invalid MCP completion request");let x;if($.context!==void 0){if(!D$($.context))throw Error("Invalid MCP completion context");x=Object.create(null);for(let[z,X]of Object.entries($.context)){if(typeof X!=="string")throw Error("Invalid MCP completion context");x[z]=X}}return{reference:Z,argument:{name:$.argument.name,value:$.argument.value},...x?{context:x}:{}}}function D$($){return $!==null&&typeof $==="object"&&!Array.isArray($)}async function b0($,J){let Z=o()?.mcpServers??{};for(let[x,z]of Object.entries(Z)){if(J&&x!==J)continue;if(!$.getServerStatus(x))await $.registerServer(x,z,{connect:!1})}}var IO=()=>{let $=new C4;return $.get("/",async(J)=>{try{let Z=X0.getInstance();await b0(Z);let x=Z.getAllServers(),z=await Promise.all(Array.from(x.entries()).map(async([X,G])=>({id:X,name:X,status:G.status==="connected"?"connected":G.status==="reconnecting"?"reconnecting":G.status==="connecting"?"connecting":G.lastError?"error":"offline",endpoint:G.config.command?`${G.config.command} ${(G.config.args||[]).join(" ")}`.trim():G.config.url||"Unknown",description:`MCP server: ${X}`,tools:G.tools.map((V)=>V.name),completionSupported:G.client.completionSupported,tasks:G.client.tasks,resources:G.contentCatalog.resources,resourceTemplates:G.contentCatalog.resourceTemplates.map((V)=>({...V,variables:I4(V.uriTemplate)})),prompts:G.contentCatalog.prompts,connectedAt:G.connectedAt?.toISOString(),error:G.lastError?.message,recovery:G.recovery,logging:G.logging,instructions:G.instructions,oauthEnabled:G.client.oauthEnabled,oauthStatus:await G.client.getOAuthStatus()})));return J.json(z)}catch(Z){return A0.error("[McpRoutes] Failed to get MCP servers:",Z),J.json({error:Z instanceof Error?Z.message:"Failed to get MCP servers"},500)}}),$.post("/:name/connect",async(J)=>{try{let Z=J.req.param("name"),x=X0.getInstance();return await b0(x,Z),await x.connectServer(Z),J.json({success:!0})}catch(Z){return A0.error("[McpRoutes] Failed to connect MCP server:",Z),J.json({success:!1,error:Z.message},500)}}),$.post("/:name/disconnect",async(J)=>{try{let Z=J.req.param("name"),x=X0.getInstance();return await b0(x,Z),await x.disconnectServer(Z),J.json({success:!0})}catch(Z){return A0.error("[McpRoutes] Failed to disconnect MCP server:",Z),J.json({success:!1,error:Z.message},500)}}),$.get("/:name/logs",async(J)=>{try{let Z=J.req.param("name"),x=Number(J.req.query("limit")??20),z=Number(J.req.query("afterRevision")??0);if(!Number.isSafeInteger(x)||x<1||x>100||!Number.isSafeInteger(z)||z<0)return J.json({error:"Invalid MCP log pagination"},400);let X=X0.getInstance();return await b0(X,Z),J.json(X.getLogSnapshot(Z,{limit:x,afterRevision:z}))}catch(Z){return A0.error("[McpRoutes] Failed to get MCP logs:",Z),J.json({error:Z.message},500)}}),$.post("/:name/logging-level",async(J)=>{try{let Z=J.req.param("name"),x=await J.req.json();if(!jO(x.level))return J.json({success:!1,error:"Invalid MCP logging level"},400);let z=X0.getInstance();return await b0(z,Z),await z.setServerLoggingLevel(Z,x.level),J.json({success:!0,level:x.level})}catch(Z){return A0.error("[McpRoutes] Failed to set MCP logging level:",Z),J.json({success:!1,error:Z.message},400)}}),$.post("/:name/complete",async(J)=>{try{let Z=J.req.param("name"),x=k4(await J.req.json()),z=X0.getInstance();await b0(z,Z);let X=await z.complete(Z,x);return J.json(X)}catch(Z){return A0.error("[McpRoutes] Failed to complete MCP argument:",Z),J.json({error:Z.message},400)}}),$.post("/:name/oauth/login",async(J)=>{try{let Z=J.req.param("name"),x=X0.getInstance();await b0(x,Z);let z=await x.beginOAuthLogin(Z);return J.json({success:!0,flowId:z.flowId,authorizationUrl:z.authorizationUrl},202)}catch(Z){return A0.error("[McpRoutes] Failed to start MCP OAuth login:",Z),J.json({success:!1,error:Z.message},400)}}),$.post("/:name/oauth/logout",async(J)=>{try{let Z=J.req.param("name"),x=X0.getInstance();return await b0(x,Z),await x.logoutOAuth(Z),J.json({success:!0})}catch(Z){return A0.error("[McpRoutes] Failed to log out MCP OAuth:",Z),J.json({success:!1,error:Z.message},400)}}),$.delete("/:name",async(J)=>{try{let Z=J.req.param("name");await X0.getInstance().unregisterServer(Z);let z=o();if(z?.mcpServers){let{[Z]:X,...G}=z.mcpServers;await V0().updateConfig({mcpServers:G})}return J.json({success:!0})}catch(Z){return A0.error("[McpRoutes] Failed to delete MCP server:",Z),J.json({success:!1,error:Z.message},500)}}),$.post("/",async(J)=>{try{let Z=await J.req.json(),{name:x,config:z}=Z;if(!x||!z)return J.json({success:!1,error:"Missing name or config"},400);await X0.getInstance().registerServer(x,z);let G=o();return await V0().updateConfig({mcpServers:{...G?.mcpServers,[x]:z}}),J.json({success:!0})}catch(Z){return A0.error("[McpRoutes] Failed to add MCP server:",Z),J.json({success:!1,error:Z.message},500)}}),$};import{getSupportedThinkingLevels as S4}from"@earendil-works/pi-ai";import{Hono as f4}from"hono";var B$=p("Service");function P4($,J,Z=PO.list()){return{id:$.id,displayName:$.displayName,provider:$.provider,model:$.model,overrides:$.overrides,fallbackModels:$.fallbackModels,contextWindow:J.contextWindow,maxTokens:J.maxTokens,reasoning:J.reasoning,supportedReasoningEfforts:S4(J),supportedServiceTiers:SO(J),supportedResponseVerbosities:kO(J),communicationStyles:Z,input:J.input}}function h4($){hO($.overrides);let J={displayName:$.displayName||void 0,overrides:$.overrides||void 0};if($.model)J.model=$.model;return J}function hO($){let J=$?.streamIdleTimeout;if(J!==void 0&&(!Number.isFinite(J)||J<1000))throw new D("streamIdleTimeout must be at least 1000ms")}var mO=()=>{let $=new f4;return $.get("/",async(J)=>{try{let Z=o();if(!Z)throw Error("Config not initialized");let x=J.get("directory")||y(),[z,X]=await Promise.all([H$(x,Z),N0(x)]),G=z.config.models,V=G.find((R)=>R.id===z.config.currentModelId)??G[0],W=z.catalog,L=X.communicationStyles.list(),M=(R)=>P4(R,W.resolveConfig(R),L);return J.json({configured:G.map(M),current:V?M(V):null})}catch(Z){B$.error("[ModelsRoutes] Failed to get models:",Z);let x=new a("Failed to get models");return J.json(x.toObject(),500)}}),$.post("/",async(J)=>{let Z=h0(),x,z;try{let X=await J.req.json(),{provider:G,displayName:V,model:W,overrides:L,apiKey:M,modelProvider:R}=X;if(!G||!W)throw new D("provider and model are required");hO(L);let I;if(R){if(R.id!==G)throw new D("modelProvider.id must match the model provider");if(o()?.modelProviders[G])throw new D(`model provider already exists: ${G}`);I={name:R.name,baseUrl:R.baseUrl,wireApi:R.wireApi,...R.apiKeyEnv?{apiKeyEnv:R.apiKeyEnv}:{}};try{Z.registerModelProvider(G,I,[W]),z=G}catch(A){throw new D(A instanceof Error?A.message:"Invalid model provider")}}else Z.getModel(G,W);if(M?.trim()){if(await Z.setApiKey(G,M.trim()),I)x=G}let n={provider:G,displayName:V||void 0,model:W,overrides:L||void 0},Z0=I?await V0().addModelWithProvider(n,I):await V0().addModel(n);return J.json({success:!0,model:Z0})}catch(X){if(x)await Z.credentials.delete(x);if(z){let G=o();Z.configureModelProviders(G?.modelProviders??{},G?.models??[])}throw B$.error("[ModelsRoutes] Failed to add model:",X),X}}),$.put("/:modelId",async(J)=>{try{let Z=J.req.param("modelId"),x=await J.req.json(),{displayName:z,overrides:X,model:G}=x,V=fO(Z);if(!V)throw new D("model config not found");if(G)h0().getModel(V.provider,G);return await V0().updateModel(Z,h4({displayName:z,overrides:X,model:G})),J.json({success:!0})}catch(Z){throw B$.error("[ModelsRoutes] Failed to update model:",Z),Z}}),$.delete("/:modelId",async(J)=>{try{let Z=J.req.param("modelId");return await V0().removeModel(Z),J.json({success:!0})}catch(Z){throw B$.error("[ModelsRoutes] Failed to delete model:",Z),Z}}),$};import{Hono as F2}from"hono";import{Mutex as eO}from"async-mutex";import{Hono as e4}from"hono";import{streamSSE as $2}from"hono/streaming";import{LRUCache as O2}from"lru-cache";import{nanoid as p0}from"nanoid";import $1 from"node:path";var L$=b(j(["default","autoEdit","yolo","plan"]));var f$=b(j(["user","assistant","system","tool"])),m4=b(O.Union([O.Object({type:O.Literal("text"),text:O.String()}),O.Object({type:O.Literal("image_url"),image_url:O.Object({url:O.String()})})])),gO=O.Union([O.String(),O.Array(m4)]),M9=b(O.Object({id:O.String(),role:f$,content:gO,timestamp:O.Number(),metadata:O.Optional(O.Record(O.String(),O.Unknown())),thinkingContent:O.Optional(O.String()),tool_call_id:O.Optional(O.String()),name:O.Optional(O.String()),tool_calls:O.Optional(O.Unknown())})),v4=b(j(["queued","running","completed","failed","cancelled","interrupted"])),uO=b(j(["local","worktree"])),T4=b(j(["applied","discarded","conflicted"])),g4=b(O.Object({status:T4,updatedAt:O.String(),sourceCommit:O.Optional(O.String()),changedFiles:O.Optional(O.Integer({minimum:0})),message:O.Optional(O.String())})),u4=b(O.Object({changedFiles:O.Integer({minimum:0}),additions:O.Integer({minimum:0}),deletions:O.Integer({minimum:0}),commits:O.Integer({minimum:0})})),d4=b(O.Object({path:O.String({minLength:1}),patch:O.String({maxLength:2097152}),additions:O.Integer({minimum:0}),deletions:O.Integer({minimum:0}),binary:O.Boolean(),truncated:O.Boolean()})),dO=b(O.Object({sessionId:O.String(),projectPath:O.String(),baseCommit:O.String(),files:O.Array(d4,{maxItems:100}),truncated:O.Boolean()})),y4=O.Union([O.String(),O.Number(),O.Boolean(),O.Array(O.String())]),l4=b(O.Object({name:O.String(),type:j(["string","number","integer","boolean","select","multi-select"]),title:O.String(),description:O.Optional(O.String()),required:O.Boolean(),defaultValue:O.Optional(y4),options:O.Optional(O.Array(O.Object({value:O.String(),label:O.String()}))),format:O.Optional(j(["date","uri","email","date-time"])),minimum:O.Optional(O.Number()),maximum:O.Optional(O.Number()),minLength:O.Optional(O.Number()),maxLength:O.Optional(O.Number()),minItems:O.Optional(O.Number()),maxItems:O.Optional(O.Number())})),b9=b(O.Object({serverName:O.String(),mode:j(["form","url"]),message:O.String(),fields:O.Optional(O.Array(l4)),requestedSchema:O.Optional(O.Record(O.String(),O.Unknown())),url:O.Optional(O.String()),domain:O.Optional(O.String()),elicitationId:O.Optional(O.String())})),c4=b(O.Object({type:j(["permission","question","elicitation"]),requestId:O.String()})),i4=b(O.Object({code:j(["authentication","permission","rate_limit","timeout","network","model_unavailable","context_limit","unsupported_input","runtime"]),message:O.String({minLength:1,maxLength:500}),retryable:O.Boolean()})),P$=b(j(["auto","off","minimal","low","medium","high","xhigh","max"])),h$=b(j(["auto","standard","fast","flex"])),m$=b(j(["auto","low","medium","high"])),z$=b(O.Union([j(["auto","pragmatic","friendly","explanatory"]),O.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})$"})])),m0=b(O.Object({sessionId:O.String(),projectPath:O.String(),title:O.Optional(O.String()),gitBranch:O.Optional(O.String()),rootId:O.String(),parentId:O.Optional(O.String()),relationType:O.Optional(j(["subagent","fork"])),resumedFrom:O.Optional(O.String()),rootAgentId:O.Optional(O.String()),resumeDepth:O.Optional(O.Integer({minimum:0})),taskStatus:Y$(v4,"completed"),taskStatusReason:O.Optional(O.String()),taskFailure:O.Optional(i4),taskStartedAt:O.Optional(O.String()),taskCompletedAt:O.Optional(O.String()),taskPromptSummary:O.Optional(O.String()),taskModelId:O.Optional(O.String()),selectedModelId:O.Optional(O.String()),permissionMode:O.Optional(L$),reasoningEffort:O.Optional(P$),serviceTier:O.Optional(h$),responseVerbosity:O.Optional(m$),communicationStyle:O.Optional(z$),communicationStyleDigest:O.Optional(O.String({pattern:"^[a-f0-9]{64}$"})),projectInstructionsDigest:O.Optional(O.String({pattern:"^[a-f0-9]{64}$"})),taskRetryAvailable:O.Optional(O.Boolean()),taskRetriedFrom:O.Optional(O.Object({sessionId:O.String(),projectPath:O.String()})),taskDelivery:O.Optional(g4),taskIsolation:O.Optional(uO),taskSourceProjectPath:O.Optional(O.String()),taskWorktreePath:O.Optional(O.String()),taskWorktreeBranch:O.Optional(O.String()),taskBaseCommit:O.Optional(O.String()),taskDiffStat:O.Optional(u4),taskQueuePosition:O.Optional(O.Integer({minimum:1})),taskQueueDepth:O.Optional(O.Integer({minimum:0})),taskConcurrencyLimit:O.Optional(O.Integer({minimum:1})),archivedAt:O.Optional(O.String()),archivedBySessionId:O.Optional(O.String()),pendingInteraction:O.Optional(c4),messageCount:O.Number(),firstMessageTime:O.String(),lastMessageTime:O.String(),hasErrors:O.Boolean()})),R9=b(O.Object({sessions:O.Array(m0),nextCursor:O.Optional(O.String())})),j9=b(O.Object({session:m0,archivedSessionIds:O.Array(O.String())})),C9=b(O.Object({session:m0,restoredSessionIds:O.Array(O.String())})),I9=b(O.Object({version:O.Literal(1),sessionId:O.String(),goalId:O.String(),objective:O.String(),status:j(["active","paused","blocked","usage_limited","budget_limited","complete"]),tokenBudget:O.Optional(O.Number()),tokensUsed:O.Number(),timeUsedSeconds:O.Number(),continuationCount:O.Number(),statusReason:O.Optional(O.String()),createdAt:O.String(),updatedAt:O.String()})),yO=b(O.Object({role:f$,content:gO,metadata:O.Optional(O.Unknown()),reasoningContent:O.Optional(O.String()),thinkingContent:O.Optional(O.String()),tool_call_id:O.Optional(O.String()),name:O.Optional(O.String()),tool_calls:O.Optional(O.Unknown())})),k9=b(O.Object({session:m0,messages:O.Array(yO)})),lO=b(j(["conversation","code","both"])),a4=b(O.Object({messageId:O.String(),preview:O.String(),createdAt:O.String(),fileCount:O.Integer({minimum:0})})),cO=b(O.Object({targetMessageId:O.String({minLength:1}),mode:Y$(lO,"conversation")})),S9=b(O.Object({checkpoint:a4,mode:lO,removedTurns:O.Integer({minimum:1}),restoredFiles:O.Array(O.String()),messages:O.Array(yO)})),p4=j(["running","completed","failed","cancelled"]),vO=b(O.Object({id:O.String(),subagentType:O.String(),description:O.String(),status:p4,rootAgentId:O.String(),resumedFrom:O.Optional(O.String()),resumeDepth:O.Integer({minimum:0}),createdAt:O.Number(),lastActiveAt:O.Number(),completedAt:O.Optional(O.Number()),result:O.Optional(O.Object({success:O.Boolean(),message:O.String(),error:O.Optional(O.String()),verificationCommands:O.Optional(O.Array(O.String())),verificationVerdict:O.Optional(j(["pass","fail","partial"])),modifiedFiles:O.Optional(O.Array(O.String()))})),stats:O.Optional(O.Object({tokens:O.Optional(O.Number()),toolCalls:O.Optional(O.Number()),duration:O.Optional(O.Number())}))})),iO=b(O.Object({prompt:O.String({minLength:1,maxLength:32000,pattern:"\\S"})})),f9=b(O.Object({source:vO,session:vO})),P9=b(O.Object({sessionId:O.String(),projectPath:O.String()})),h9=b(O.Object({path:O.String(),name:O.String(),gitBranch:O.Optional(O.String()),available:O.Boolean(),isCurrent:O.Boolean(),boundAt:O.String()})),m9=b(O.Union([O.Object({cancelled:O.Literal(!0)}),O.Object({cancelled:O.Literal(!1),path:O.String({minLength:1})})])),v9=b(O.Object({type:O.String(),seq:O.Optional(O.Number()),properties:O.Record(O.String(),O.Unknown())})),aO=O.Object({type:j(["file","image","url"]),path:O.Optional(O.String()),url:O.Optional(O.String()),content:O.Optional(O.String({maxLength:i0})),mimeType:O.Optional(O.String()),name:O.Optional(O.String())}),pO=O.Record(O.String(),O.Unknown()),oO=b(O.Object({prompt:O.String({minLength:1,maxLength:32000,pattern:"\\S"}),title:O.Optional(O.String({minLength:1,maxLength:200})),projectPath:O.Optional(O.String()),modelId:O.Optional(O.String({minLength:1,maxLength:500})),reasoningEffort:O.Optional(P$),serviceTier:O.Optional(h$),responseVerbosity:O.Optional(m$),communicationStyle:O.Optional(z$),isolation:Y$(uO,"worktree"),permissionMode:Y$(L$,"default"),attachments:O.Optional(O.Array(aO,{maxItems:S$})),outputSchema:O.Optional(pO)})),v$=b(O.Object({session:m0,runId:O.String(),messageId:O.String(),status:j(["queued","running"]),queuePosition:O.Optional(O.Integer({minimum:1})),queueDepth:O.Optional(O.Integer({minimum:0})),maxConcurrentTasks:O.Optional(O.Integer({minimum:1}))})),nO=b(O.Object({action:j(["apply","discard"])})),tO=b(O.Object({content:O.String({maxLength:TO}),projectPath:O.Optional(O.String()),modelId:O.Optional(O.String({minLength:1,maxLength:500})),reasoningEffort:O.Optional(P$),serviceTier:O.Optional(h$),responseVerbosity:O.Optional(m$),communicationStyle:O.Optional(z$),permissionMode:O.Optional(L$),attachments:O.Optional(O.Array(aO,{maxItems:S$})),outputSchema:O.Optional(pO)})),o4=j(["completed","failed","aborted","timed_out","spawn_error"]),n4=b(O.Object({version:O.Literal(1),command:O.String(),status:o4,exitCode:O.Union([O.Integer(),O.Null()]),durationMs:O.Number({minimum:0}),stdout:O.String(),stderr:O.String(),stdoutOmittedBytes:O.Integer({minimum:0}),stderrOmittedBytes:O.Integer({minimum:0}),binaryOutput:O.Boolean(),truncated:O.Boolean()})),sO=b(O.Object({command:O.String({minLength:1,maxLength:32768,pattern:"^(?![\\s\\S]*\\u0000)(?=[\\s\\S]*\\S)[\\s\\S]*$"}),projectPath:O.Optional(O.String())})),T9=b(O.Object({executionId:O.String(),messageId:O.String(),record:n4,auxiliary:O.Boolean(),delivery:O.Optional(j(["current_turn","next_turn"])),queued:O.Optional(O.Integer({minimum:0}))})),rO=b(O.Object({projectPath:O.String(),kind:j(["uncommitted","base","commit"]),ref:O.Optional(O.String({maxLength:200})),instructions:O.Optional(O.String({maxLength:4000})),modelId:O.Optional(O.String({minLength:1,maxLength:200}))})),g9=b(O.Object({reviewId:O.String(),status:O.Literal("running")})),u9=b(O.Object({messageId:O.String(),role:f$,content:O.String(),timestamp:O.String()})),d9=b(O.Object({approved:O.Boolean(),remember:O.Optional(O.Boolean()),scope:O.Optional(j(["once","session","project"])),targetMode:O.Optional(L$),feedback:O.Optional(O.String()),answers:O.Optional(O.Record(O.String(),O.Union([O.String(),O.Array(O.String())]))),elicitation:O.Optional(O.Object({action:j(["accept","decline","cancel"]),content:O.Optional(O.Record(O.String(),O.Union([O.String({maxLength:4000}),O.Number(),O.Boolean(),O.Array(O.String({maxLength:1000}),{maxItems:100})]),{maxProperties:32}))}))})),t4=b(O.Object({id:z$,name:O.String({minLength:1,maxLength:80}),description:O.String({minLength:1,maxLength:256}),source:j(["built-in","user","project","plugin"]),contentSha256:O.Optional(O.String({pattern:"^[a-f0-9]{64}$"}))})),y9=b(O.Object({id:O.String(),displayName:O.Optional(O.String()),provider:O.String(),model:O.String(),contextWindow:O.Optional(O.Number()),maxTokens:O.Optional(O.Number()),reasoning:O.Optional(O.Boolean()),supportedReasoningEfforts:O.Optional(O.Array(j(["off","minimal","low","medium","high","xhigh","max"]))),supportedServiceTiers:O.Optional(O.Array(j(["standard","fast","flex"]))),supportedResponseVerbosities:O.Optional(O.Array(j(["low","medium","high"]))),communicationStyles:O.Optional(O.Array(t4,{maxItems:36})),input:O.Optional(O.Array(j(["text","image"]))),overrides:O.Optional(O.Object({baseUrl:O.Optional(O.String()),temperature:O.Optional(O.Number()),maxOutputTokens:O.Optional(O.Number()),timeout:O.Optional(O.Number()),streamIdleTimeout:O.Optional(O.Number({minimum:1000}))}))})),l9=b(j(["vs-dark","vs-light","hc-black"])),s4=b(j(["light","dark","system"])),r4=b(O.Object({language:O.String(),theme:O.String(),uiTheme:s4,autoSaveSessions:O.Boolean(),notifyBuild:O.Boolean(),notifyErrors:O.Boolean(),notifySounds:O.Boolean(),privacyTelemetry:O.Boolean(),privacyCrash:O.Boolean(),communicationStyle:O.Optional(z$)})),c9=b(O.Partial(r4));var h=p("Service"),J2=O.Object({title:O.Optional(O.String()),projectPath:O.Optional(O.String())}),Z2=tO,x2=O.Object({title:O.Optional(O.String()),projectPath:O.Optional(O.String())}),Y2=O.Object({projectPath:O.String()}),z2=O.Object({objective:O.String({minLength:1}),tokenBudget:O.Optional(O.Integer({minimum:1})),permissionMode:O.Optional(j(["default","autoEdit","plan","yolo"]))}),Q2=O.Union([O.Object({action:O.Literal("pause")}),O.Object({action:O.Literal("resume")}),O.Object({action:O.Literal("edit"),objective:O.String({minLength:1})})]),c=new Map,E$,q0=new Map,o0=new Map,R0=new Map,M$=new O2({max:100,ttl:1800000});function O1($){return{sessionId:$.sessionId,projectPath:$.projectPath}}function Y0($){if(!$)return;return q0.get($)??M$.get($)}function N2($){if(q0.get($.id)!==$)return;q0.delete($.id),M$.set($.id,$)}function X2($){q0.delete($),M$.delete($)}function F0($){return $?.status==="queued"||$?.status==="running"||$?.status==="waiting_permission"}function q$($,J="user-cancel"){if($.status==="cancelled"||$.status==="completed"||$.status==="failed")return!1;let Z=$.pendingPermission;if($.pendingPermission=void 0,Z?.resolve({approved:!1,reason:Q1}),Z)C.publish(O1($),"interaction.resolved",{requestId:Z.permissionId});return $.abortController.abort(J),$.status="cancelled",C.publish(O1($),"run.cancelled",{runId:$.id}),!0}function _1($,J=!1){let{permissionId:Z,details:x}=$;if(x.type==="askUserQuestion"&&x.questions)return{type:"question.required",properties:{requestId:Z,toolCallId:x.toolCallId??Z,questions:x.questions,details:x,...J?{replayed:!0}:{}}};if(x.type==="mcpElicitation"&&x.mcpElicitation)return{type:"elicitation.required",properties:{requestId:Z,toolCallId:x.toolCallId??Z,elicitation:x.mcpElicitation,...J?{replayed:!0}:{}}};return{type:"permission.asked",properties:{requestId:Z,toolName:x.toolName,description:x.message,args:x.args,details:x,...J?{replayed:!0}:{}}}}function G2(){for(let $ of q0.values())q$($,"route-reset");q0.clear();for(let $ of o0.values())$.controller.abort("route-reset");o0.clear(),M$.clear(),E$=void 0,c.clear()}var D1=($)=>{if(!$||typeof $!=="object")return $;let J={...$},Z=200000,x=(z,X)=>typeof z==="number"&&Number.isSafeInteger(z)&&z>=0&&z<=X?z:0;if(typeof J.oldContent==="string"&&J.oldContent.length>Z)delete J.oldContent;if(typeof J.newContent==="string"&&J.newContent.length>Z)delete J.newContent;if(J.mcpResult&&typeof J.mcpResult==="object"&&!Array.isArray(J.mcpResult)){let z=J.mcpResult,X=Array.isArray(z.artifacts)?z.artifacts.slice(0,64).flatMap((G)=>{if(!G||typeof G!=="object"||Array.isArray(G))return[];let V=G,W=new Set(["text","image","audio","resource"]);if(typeof V.id!=="string"||!/^[a-f0-9]{64}$/.test(V.id)||typeof V.sha256!=="string"||V.sha256!==V.id||typeof V.kind!=="string"||!W.has(V.kind)||x(V.size,67108864)!==V.size||typeof V.persisted!=="boolean")return[];return[{id:V.id.slice(0,128),sha256:V.sha256.slice(0,128),kind:V.kind,size:V.size,persisted:V.persisted,...typeof V.mimeType==="string"?{mimeType:V.mimeType.slice(0,256)}:{},...typeof V.sourceUri==="string"?{sourceUri:V.sourceUri.slice(0,8192)}:{},...typeof V.path==="string"?{path:V.path.slice(0,8192)}:{}}]}):[];J.mcpResult={isError:z.isError===!0,contentCount:x(z.contentCount,64),textBytes:x(z.textBytes,4194304),structuredBytes:x(z.structuredBytes,4194304),artifactCount:x(z.artifactCount,64),truncated:z.truncated===!0,binaryOmitted:z.binaryOmitted===!0,artifacts:X}}else delete J.mcpResult;return J};function K2($,J,Z){switch(Z.kind){case"tool_start":if("function"in Z.toolCall)C.publish($,"subagent.update",{subagentSessionId:J,toolName:Z.toolCall.function.name}),C.publish($,"subagent.tool.start",{subagentSessionId:J,toolCallId:Z.toolCall.id,toolName:Z.toolCall.function.name,arguments:Z.toolCall.function.arguments,toolKind:Z.toolKind});break;case"tool_result":if("function"in Z.toolCall)C.publish($,"subagent.tool.result",{subagentSessionId:J,toolCallId:Z.toolCall.id,toolName:Z.toolCall.function.name,success:!Z.result.error,summary:Z.result.metadata?.summary,output:n$(o$(Z.toolCall.function.name,Z.result)),metadata:D1(Z.result.metadata)});break;case"tool_progress":if("function"in Z.toolCall)C.publish($,"subagent.tool.progress",{subagentSessionId:J,toolCallId:Z.toolCall.id,toolName:Z.toolCall.function.name,...Z.update});break;case"content_delta":C.publish($,"subagent.delta",{subagentSessionId:J,delta:Z.delta});break;case"thinking_delta":C.publish($,"subagent.thinking.delta",{subagentSessionId:J,delta:Z.delta});break;case"stream_end":C.publish($,"subagent.stream.end",{subagentSessionId:J});break;case"mcp_catalog_changed":C.publish($,"subagent.mcp.catalog.changed",{subagentSessionId:J,revision:Z.revision,serverName:Z.serverName,added:Z.added,removed:Z.removed,updated:Z.updated});break;case"mcp_content_changed":C.publish($,"subagent.mcp.content.changed",{subagentSessionId:J,revision:Z.revision,serverName:Z.serverName,contentKind:Z.contentKind,added:Z.added,removed:Z.removed,updated:Z.updated});break;case"mcp_resource_updated":C.publish($,"subagent.mcp.resource.updated",{subagentSessionId:J,revision:Z.revision,serverName:Z.serverName,uri:Z.uri});break;case"mcp_connection_changed":C.publish($,"subagent.mcp.connection.changed",{subagentSessionId:J,revision:Z.revision,serverName:Z.serverName,phase:Z.phase,reason:Z.reason,attempt:Z.attempt,maxAttempts:Z.maxAttempts,nextRetryAt:Z.nextRetryAt,error:Z.error});break;case"mcp_log":C.publish($,"subagent.mcp.log",{subagentSessionId:J,revision:Z.revision,serverName:Z.serverName,level:Z.level,logger:Z.logger,message:Z.message,projectedBytes:Z.projectedBytes,dataSha256:Z.dataSha256,truncated:Z.truncated,detailsOmitted:Z.detailsOmitted,timestamp:Z.timestamp,synthetic:Z.synthetic});break;case"mcp_instructions_changed":C.publish($,"subagent.mcp.instructions.changed",{subagentSessionId:J,revision:Z.revision,serverName:Z.serverName,action:Z.action,reason:Z.reason,text:Z.text,sourceBytes:Z.sourceBytes,projectedBytes:Z.projectedBytes,sha256:Z.sha256,truncated:Z.truncated,detailsOmitted:Z.detailsOmitted});break;case"mcp_task_changed":C.publish($,"subagent.mcp.task.changed",{subagentSessionId:J,revision:Z.revision,taskId:Z.taskId,serverName:Z.serverName,toolName:Z.toolName,status:Z.status,statusMessage:Z.statusMessage,createdAt:Z.createdAt,updatedAt:Z.updatedAt,completedAt:Z.completedAt,hasResult:Z.hasResult,error:Z.error});break;case"project_rules_loaded":C.publish($,"subagent.project.rules.loaded",{subagentSessionId:J,files:Z.files,triggerPaths:Z.triggerPaths,blockedWrite:Z.blockedWrite});break;default:break}}function N$($,J="projectPath"){if(!$1.isAbsolute($))throw new D(`${J} must be absolute`);return $1.resolve($)}function a$($){try{_$($)}catch(J){throw new D(J instanceof Error?J.message:`Invalid session ID: ${$}`)}}function r($){return{sessionId:$.id,projectPath:$.projectPath}}function X$($,J,Z){return{id:$.sessionId,projectPath:$.projectPath,title:$.title??`Session ${$.sessionId.slice(0,6)}`,createdAt:new Date($.firstMessageTime),updatedAt:new Date($.lastMessageTime),rootId:$.rootId,parentId:$.parentId,relationType:$.relationType,taskStatus:$.taskStatus,taskStatusReason:$.taskStatusReason,taskFailure:$.taskFailure,taskStartedAt:$.taskStartedAt,taskCompletedAt:$.taskCompletedAt,taskPromptSummary:$.taskPromptSummary,taskModelId:$.taskModelId,selectedModelId:$.selectedModelId,permissionMode:$.permissionMode,reasoningEffort:$.reasoningEffort,serviceTier:$.serviceTier,responseVerbosity:$.responseVerbosity,communicationStyle:$.communicationStyle,communicationStyleDigest:$.communicationStyleDigest,projectInstructionsDigest:$.projectInstructionsDigest,pendingInteraction:$.pendingInteraction,taskRetryAvailable:$.taskRetryAvailable,taskRetriedFrom:$.taskRetriedFrom,taskDelivery:$.taskDelivery,taskIsolation:$.taskIsolation,taskSourceProjectPath:$.taskSourceProjectPath,taskWorktreePath:$.taskWorktreePath,taskWorktreeBranch:$.taskWorktreeBranch,taskBaseCommit:$.taskBaseCommit,taskDiffStat:$.taskDiffStat,taskQueuePosition:$.taskQueuePosition,taskQueueDepth:$.taskQueueDepth,taskConcurrencyLimit:$.taskConcurrencyLimit,archivedAt:$.archivedAt,archivedBySessionId:$.archivedBySessionId,taskWorktree:Z,messages:J}}function T$($){return $.flatMap((J)=>{if(J.role==="system"||J.role==="tool"&&J.name===n0)return[];let Z=J.tool_calls?.filter((G)=>!("function"in G)||G.function.name!==n0),x=typeof J.content==="string"?J.content.trim():"";if(J.role==="assistant"&&J.tool_calls?.length&&!Z?.length&&!x&&!J.reasoningContent&&!J.metadata)return[];let z={...J,...J.tool_calls?{tool_calls:Z&&Z.length>0?Z:void 0}:{}},X=G1(J.metadata);return[X?{...z,content:X1(X)}:z]})}function G$($,J){$.taskStatus=J.taskStatus,$.taskStatusReason=J.taskStatusReason,$.taskFailure=J.taskFailure,$.taskStartedAt=J.taskStartedAt,$.taskCompletedAt=J.taskCompletedAt,$.taskPromptSummary=J.taskPromptSummary,$.taskModelId=J.taskModelId,$.selectedModelId=J.selectedModelId,$.permissionMode=J.permissionMode,$.reasoningEffort=J.reasoningEffort,$.serviceTier=J.serviceTier,$.responseVerbosity=J.responseVerbosity,$.communicationStyle=J.communicationStyle,$.communicationStyleDigest=J.communicationStyleDigest,$.projectInstructionsDigest=J.projectInstructionsDigest,$.pendingInteraction=J.pendingInteraction,$.taskRetryAvailable=J.taskRetryAvailable,$.taskRetriedFrom=J.taskRetriedFrom,$.taskDelivery=J.taskDelivery,$.taskIsolation=J.taskIsolation,$.taskSourceProjectPath=J.taskSourceProjectPath,$.taskWorktreePath=J.taskWorktreePath,$.taskWorktreeBranch=J.taskWorktreeBranch,$.taskBaseCommit=J.taskBaseCommit,$.taskDiffStat=J.taskDiffStat,$.taskQueuePosition=J.taskQueuePosition,$.taskQueueDepth=J.taskQueueDepth,$.taskConcurrencyLimit=J.taskConcurrencyLimit,$.archivedAt=J.archivedAt,$.archivedBySessionId=J.archivedBySessionId,$.updatedAt=new Date(J.lastMessageTime)}async function T0($){let J=await S.findSessionMetadata($.id,$.projectPath);if(J)G$($,J)}function a0($){let J=Y0($.currentRunId),Z=J?.status==="waiting_permission"?"running":J?.status??$.taskStatus;return{sessionId:$.id,projectPath:$.projectPath,title:$.title,rootId:$.rootId,parentId:$.parentId,relationType:$.relationType,status:void 0,taskStatus:Z,taskStatusReason:$.taskStatusReason,taskFailure:$.taskFailure,taskStartedAt:$.taskStartedAt,taskCompletedAt:$.taskCompletedAt,taskPromptSummary:$.taskPromptSummary,taskModelId:$.taskModelId,selectedModelId:$.selectedModelId,permissionMode:$.permissionMode,reasoningEffort:$.reasoningEffort,serviceTier:$.serviceTier,responseVerbosity:$.responseVerbosity,communicationStyle:$.communicationStyle,communicationStyleDigest:$.communicationStyleDigest,projectInstructionsDigest:$.projectInstructionsDigest,taskRetryAvailable:$.taskRetryAvailable,taskRetriedFrom:$.taskRetriedFrom,taskDelivery:$.taskDelivery,taskIsolation:$.taskIsolation,taskSourceProjectPath:$.taskSourceProjectPath,taskWorktreePath:$.taskWorktreePath,taskWorktreeBranch:$.taskWorktreeBranch,taskBaseCommit:$.taskBaseCommit,taskDiffStat:$.taskDiffStat,taskQueuePosition:J?.status==="queued"?J.taskQueuePosition:Z==="queued"?$.taskQueuePosition:void 0,taskQueueDepth:J?.status==="queued"?J.taskQueueDepth:Z==="queued"?$.taskQueueDepth:void 0,taskConcurrencyLimit:J?.taskConcurrencyLimit??$.taskConcurrencyLimit,archivedAt:$.archivedAt,archivedBySessionId:$.archivedBySessionId,pendingInteraction:J?.pendingPermission?{type:J.pendingPermission.details.type==="askUserQuestion"?"question":J.pendingPermission.details.type==="mcpElicitation"?"elicitation":"permission",requestId:J.pendingPermission.permissionId}:$.pendingInteraction,agentType:void 0,model:void 0,messageCount:$.messages.length,firstMessageTime:$.createdAt.toISOString(),lastMessageTime:$.updatedAt.toISOString(),hasErrors:!1,isActive:!0}}async function x0($,J){if(a$($),J!==void 0){let x=C0({sessionId:$,projectPath:N$(J)});if(c.has(P(x)))return x;let z=await S.findSessionMetadata(x.sessionId,x.projectPath);if(!z)throw new u("Session",$);return C0({sessionId:z.sessionId,projectPath:z.projectPath})}let Z=new Map;for(let x of c.values()){if(x.id!==$)continue;let z=r(x);Z.set(P(z),z)}for(let x of await S.listSessions()){if(x.sessionId!==$)continue;let z=C0({sessionId:x.sessionId,projectPath:x.projectPath});Z.set(P(z),z)}if(Z.size===0)try{let x=await S.findSessionMetadata($);if(!x)throw new u("Session",$);return C0({sessionId:x.sessionId,projectPath:x.projectPath})}catch(x){if(x instanceof u)throw x;if(x instanceof Error&&x.message.startsWith("Ambiguous session ID:"))throw new K0;throw x}if(Z.size>1)throw new K0;return Z.values().next().value}function p$($){if(typeof $==="string")return $;return $.filter((J)=>J.type==="text").map((J)=>J.text).join(`
2
+ `)}function J1($,J){let Z=(J??[]).filter((z)=>z.type==="image"&&typeof z.content==="string").map((z)=>({type:"image_url",image_url:{url:z.content}}));if(Z.length===0)return $;let x=[];if($.trim())x.push({type:"text",text:$});return x.push(...Z),x}var B1=()=>{G2();let $=new e4;$.onError((N,F)=>{if(N instanceof J0)return F.json(N.toObject(),N.statusCode);return h.error("[SessionRoutes] Unhandled route error:",N),F.json({error:{code:"INTERNAL_ERROR",message:"Internal server error"}},500)});let J=new Map,Z=new Map,x=new Map,z=new Map,X=new Map,G=new Map,V=(N)=>{let F=P(N),Q=X.get(F);if(!Q)Q=new eO,X.set(F,Q);return Q},W=(N)=>{let F=P(N),Q=G.get(F);if(!Q)Q=new eO,G.set(F,Q);return Q},L=async(N,F={})=>{let Q=P(r(N));await x.get(Q);let Y=J.get(Q);if(Y)return Y;let K=Z.get(Q);if(!K){let U=F.communicationStyle??N.communicationStyle;K=Q$.create({sessionId:N.id,workspaceRoot:N.projectPath,...N.selectedModelId??N.taskModelId?{modelId:N.selectedModelId??N.taskModelId}:{},permissionMode:F.permissionMode??N.permissionMode??"default",...N.reasoningEffort?{reasoningEffort:N.reasoningEffort}:{},...N.serviceTier?{serviceTier:N.serviceTier}:{},...N.responseVerbosity?{responseVerbosity:N.responseVerbosity}:{},...U?{communicationStyle:U}:{},...U===N.communicationStyle&&N.communicationStyleDigest?{communicationStyleDigest:N.communicationStyleDigest}:{},...N.projectInstructionsDigest?{projectInstructionsDigest:N.projectInstructionsDigest}:{},...N.taskWorktree?{taskWorktree:N.taskWorktree}:{},...N.taskIsolation?{taskIsolation:N.taskIsolation}:{},...N.messages.length>0?{sessionStart:{isResume:!0,resumeSessionId:N.id}}:{}}),Z.set(Q,K)}try{let U=await K;return J.set(Q,U),U}finally{if(Z.get(Q)===K)Z.delete(Q)}},M=async(N,F)=>{let Q=P(r(N)),Y=x.get(Q);if(!Y)Y=(async()=>{let K=Z.get(Q);if(K)await K.catch(()=>{return});Z.delete(Q);let U=F??J.get(Q);if(J.delete(Q),U){for(let[_,B]of J)if(B===U)J.delete(_)}await U?.dispose()})().finally(()=>{if(x.get(Q)===Y)x.delete(Q)}),x.set(Q,Y);await Y},R=async(N)=>{let F=P(N),Q=c.get(F);if(Q)return Q;let Y=z.get(F);if(!Y)Y=(async()=>{let K=await S.findSessionMetadata(N.sessionId,N.projectPath);if(!K)throw new u("Session",N.sessionId);let[U,_]=await Promise.all([S.loadSession(N.sessionId,N.projectPath),S.findSessionTaskWorktree(N.sessionId,N.projectPath)]),B=X$(K,U,_);return c.set(F,B),B})(),z.set(F,Y);try{return await Y}finally{if(z.get(F)===Y)z.delete(F)}},I=async(N,F)=>{let Q=await x0(N,F);try{await S.assertSessionWritable(Q.sessionId,Q.projectPath)}catch(Y){if(Y instanceof d$)throw new k(Y.message);throw Y}return R(Q)},n=async(N,F)=>{if(N.permissionMode===F)return;let Q=await S.setSessionPermissionMode(N.id,N.projectPath,F);N.permissionMode=Q.permissionMode,N.updatedAt=new Date(Q.lastMessageTime),C.publish(r(N),"session.updated",{permissionMode:F})},Z0=(N,F,Q,Y={})=>{let K=p0(12),U={id:K,sessionId:N.id,projectPath:N.projectPath,status:"running",abortController:new AbortController,disposeRuntimeOnSettle:Y.taskRuntime!==void 0,createdAt:new Date};if(Y.taskRuntime){let _=Y.taskRuntime,B=l0.admit({key:`${N.projectPath}\x00${N.id}`,..._.getTaskAdmissionLimits(),signal:U.abortController.signal,onUpdate:(w)=>{U.status=w.state,U.taskQueuePosition=w.queuePosition,U.taskQueueDepth=w.queueDepth,U.taskConcurrencyLimit=w.maxConcurrent,N.taskStatus=w.state,N.taskQueuePosition=w.queuePosition,N.taskQueueDepth=w.queueDepth,N.taskConcurrencyLimit=w.maxConcurrent,U.taskAdmissionUpdate=(U.taskAdmissionUpdate??Promise.resolve()).then(async()=>{await _.setTaskAdmission(w)}).catch((H)=>{h.warn(`[SessionRoutes] Failed to persist admission for ${N.id}:`,H)})}});U.taskAdmission=B;let E=B.getSnapshot();U.status=E.state,U.taskQueuePosition=E.queuePosition,U.taskQueueDepth=E.queueDepth,U.taskConcurrencyLimit=E.maxConcurrent}return q0.set(K,U),N.currentRunId=K,U.completion=V2(U,N,F,Q,L,{pendingInputOnly:Y.pendingInputOnly,preparedInputTurn:Y.preparedInputTurn,goalContinuationOnly:Y.goalContinuationOnly,outputSchema:Y.outputSchema,taskAdmission:U.taskAdmission,disposeRuntime:M}).catch((_)=>{h.error(`[SessionRoutes] Run ${K} failed:`,_)}),U},A=async(N)=>{let F;if(N.outputSchema)try{F=u$(N.outputSchema).schema}catch(q){throw new D(q instanceof Error?q.message:"Invalid output schema")}let Q=g$("task",12),Y=N$(N.sourceProjectPath),K=N.modelId?.trim(),U=o();if(!U)throw new D("Config not initialized");let[_,B]=await Promise.all([H$(Y,U),N0(Y)]);if(K&&!_.config.models.some((q)=>q.id===K))throw new D(`Task model not found: ${K}`);let E=K||_.config.models.find((q)=>q.id===_.config.currentModelId)?.id||_.config.models[0]?.id;if(!E)throw new D("No model is configured. Add or select a model before dispatching a task.");let w=_.config.models.find((q)=>q.id===E);if(!w)throw new D(`Task model not found: ${E}`);let H=N.reasoningEffort??"off",s=N.serviceTier??"auto",M0=N.responseVerbosity??"auto",D0=N.communicationStyle??"auto",G0,f=B.projectRules?.staticRules(Y),d=f&&f.files.length>0?f.provenanceSha256:void 0;try{let q=_.catalog.resolveConfig(w);Y1(q,H),x1(q,s),Z1(q,M0);let g=z1(D0,B.communicationStyles);G0=g.source==="built-in"?void 0:g.contentSha256}catch(q){throw new D(q instanceof Error?q.message:"Invalid reasoning effort")}let e0={version:1,prompt:N.prompt,...N.title?{title:N.title}:{},sourceProjectPath:Y,isolation:N.isolation,permissionMode:N.permissionMode,modelId:E,reasoningEffort:H,serviceTier:s,responseVerbosity:M0,communicationStyle:D0,...G0?{communicationStyleDigest:G0}:{},...d?{projectInstructionsDigest:d}:{},...N.attachments?{attachments:N.attachments.map((q)=>({...q}))}:{},...F?{outputSchema:F}:{}},B0,m;try{let q=await U1.createSessionTask({sessionId:Q,prompt:N.prompt,title:N.title,sourceProjectPath:Y,isolation:N.isolation,dispatch:e0,retriedFrom:N.retriedFrom}),{metadata:g}=q;B0=q.taskWorktree,m=X$(g,[],B0);let $0=r(m);c.set(P($0),m),C.publish($0,"task.status",{taskStatus:g.taskStatus,updatedAt:g.lastMessageTime});let t=J1(N.prompt,N.attachments),i=await L(m),W0=F?await i.prepareInputTurn(t,{outputSchema:F}):await i.prepareInputTurn(t);if(!W0.accepted)throw new k(`Task prompt was not accepted: ${W0.reason}`);let H0=Z0(m,t,N.permissionMode,{preparedInputTurn:W0,taskRuntime:i,outputSchema:F});return await H0.taskAdmissionUpdate,{session:a0(m),runId:H0.id,messageId:W0.messageId,status:H0.status==="queued"?"queued":"running",queuePosition:H0.taskQueuePosition,queueDepth:H0.taskQueueDepth,maxConcurrentTasks:H0.taskConcurrencyLimit}}catch(q){if(q instanceof i$&&m){let g=r(m),$0=P(g);if(B0)await E0.exit({sessionId:m.id,action:"remove",discardChanges:!0}).catch(()=>{return});throw await J.get($0)?.dispose().catch(()=>{return}),J.delete($0),await S.deleteSession(m.id,m.projectPath).catch(()=>{return}),c.delete($0),new d0("Task admission queue is full")}if(m){let g=await S.findSessionMetadata(m.id,m.projectPath).catch(()=>{return});if(!g||g.taskStatus==="queued"){let $0=A$(q),t=await S.updateSessionMetadata(m.id,m.projectPath,{taskStatus:"failed",taskStatusReason:$0.message,taskFailure:$0,taskCompletedAt:new Date().toISOString(),taskOwnerPid:null}).catch(()=>{return});m.taskStatus=t?.taskStatus??"failed",m.taskStatusReason=t?.taskStatusReason??$0.message,m.taskFailure=t?.taskFailure??$0,m.taskCompletedAt=t?.taskCompletedAt}else m.taskStatus=g.taskStatus,m.taskStatusReason=g.taskStatusReason,m.taskFailure=g.taskFailure,m.taskCompletedAt=g.taskCompletedAt}throw q}},e=async(N,F)=>{let Q=await x0(N,F),Y=await S.findSessionMetadata(Q.sessionId,Q.projectPath);if(!Y)throw new u("Session",Q.sessionId);if(!["failed","interrupted","cancelled"].includes(Y.taskStatus))throw new k(`Task cannot be retried while status is ${Y.taskStatus}`);let K=await S.findSessionTaskDispatch(Q.sessionId,Q.projectPath);if(!K)throw new k("Task retry payload is unavailable");return A({prompt:K.prompt,title:K.title,sourceProjectPath:K.sourceProjectPath,isolation:K.isolation,permissionMode:K.permissionMode,modelId:K.modelId,reasoningEffort:K.reasoningEffort,serviceTier:K.serviceTier,responseVerbosity:K.responseVerbosity,communicationStyle:K.communicationStyle,attachments:K.attachments,outputSchema:K.outputSchema,retriedFrom:Q})},T=async(N,F)=>{let Q=await I(N,F);if(!Q.taskWorktree)throw new D("Session does not have a task worktree");try{await E0.restoreSession(Q.taskWorktree);let Y=await E0.getDiffArtifact(Q.id);if(!Y)throw new k("Task diff artifact is unavailable");return{sessionId:Q.id,projectPath:Q.projectPath,...Y}}catch(Y){if(Y instanceof k)throw Y;throw h.error("[SessionRoutes] Failed to load task diff artifact:",Y),new k("Task diff artifact is unavailable")}},O0=async(N,F,Q)=>{let Y=await x0(N,Q);return W(Y).runExclusive(async()=>{let K=await I(Y.sessionId,Y.projectPath);if(["queued","running"].includes(K.taskStatus))throw new k(`Task artifacts cannot be delivered while status is ${K.taskStatus}`);if(K.taskDelivery?.status==="applied")throw new k("Task changes have already been applied");if(K.taskDelivery?.status==="discarded")throw new k("Task changes have already been discarded");if(!K.taskWorktree)throw new k("Task worktree is unavailable");let U=async(_,B=!1)=>{let E=await S.updateSessionMetadata(K.id,K.projectPath,{taskDelivery:_,...B?{taskWorktree:null}:{}});if(G$(K,E),B)K.taskWorktree=void 0;return C.publish(Y,"task.delivery",{taskDelivery:_,...B?{taskWorktreeRemoved:!0}:{},updatedAt:E.lastMessageTime}),a0(K)};try{if(F==="discard"){try{await E0.restoreSession(K.taskWorktree)}catch(E){return h.warn(`[SessionRoutes] Abandoning unavailable task worktree for ${K.id}:`,E),U({status:"discarded",updatedAt:new Date().toISOString(),changedFiles:K.taskDiffStat?.changedFiles??0,message:"Task artifact discarded; worktree was unavailable"},!0)}let B=await E0.exit({sessionId:K.id,action:"remove",discardChanges:!0});return U({status:"discarded",updatedAt:new Date().toISOString(),changedFiles:B.discardedFiles??0,message:"Task worktree removed"},!0)}try{await E0.restoreSession(K.taskWorktree)}catch(B){throw h.warn(`[SessionRoutes] Task worktree is unavailable for ${K.id}:`,B),new c$("artifact_unavailable","Task worktree is unavailable")}let _=await E0.apply(K.id);return U({status:"applied",updatedAt:new Date().toISOString(),sourceCommit:_.sourceCommit,changedFiles:_.changedFiles,message:"Task changes applied to the source workspace"})}catch(_){if(_ instanceof c$)throw await U({status:"conflicted",updatedAt:new Date().toISOString(),message:_.message}),new k(_.message);throw _}})},Q0=async(N)=>{let F=Y0(N.currentRunId);if(F0(F))return;if(N.taskIsolation&&N.taskStatus!=="queued"&&N.taskStatus!=="running")return;let Q=await Q$.hasPendingInbox(N.projectPath,N.id),Y=!Q&&await Q$.hasActiveGoal(N.projectPath,N.id);if(!Q&&!Y)return;let K=await L(N),U=Y0(N.currentRunId);if(F0(U))return;if(Q&&K.getPendingSteeringCount()===0)await K.reloadPendingInbox();let _=K.getPendingSteeringCount()>0,E=(_?null:await K.getGoal())?.status==="active"||Y;if(!_&&!E||K.hasTurnOwner())return;Z0(N,"",N.permissionMode??"default",{pendingInputOnly:_,goalContinuationOnly:E,...N.taskIsolation?{taskRuntime:K}:{}})};E$=Q0;let P0=async()=>{let N={scheduled:0,failed:0,deferred:0},F=(await S.listSessions()).filter((Q)=>Q.taskStatus==="queued"&&Q.taskIsolation!==void 0).sort((Q,Y)=>Q.firstMessageTime.localeCompare(Y.firstMessageTime)||Q.projectPath.localeCompare(Y.projectPath)||Q.sessionId.localeCompare(Y.sessionId));for(let[Q,Y]of F.entries()){let K={sessionId:Y.sessionId,projectPath:Y.projectPath};try{if(!await Q$.hasPendingInbox(Y.projectPath,Y.sessionId)){let _=A$("Queued task input is missing");await S.updateSessionMetadata(Y.sessionId,Y.projectPath,{taskStatus:"failed",taskStatusReason:_.message,taskFailure:_,taskCompletedAt:new Date().toISOString(),taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}),N.failed++;continue}let U=await R(K);if(await Q0(U),U.currentRunId)N.scheduled++}catch(U){if(U instanceof i$){N.deferred+=F.length-Q;break}h.warn(`[SessionRoutes] Failed to recover queued task ${Y.sessionId}:`,U),N.deferred++}}return N};return $.get("/",async(N)=>{try{let F=await S.listSessions(),Q=new Set(F.filter((w)=>w.relationType==="subagent").map((w)=>P({sessionId:w.sessionId,projectPath:w.projectPath}))),Y=Array.from(c.values()).filter((w)=>!Q.has(P(r(w)))&&w.relationType!=="subagent").map((w)=>a0(w)),K=new Set(Y.map((w)=>P({sessionId:w.sessionId,projectPath:w.projectPath}))),U=F.filter((w)=>{if(w.relationType==="subagent")return!1;return!K.has(P({sessionId:w.sessionId,projectPath:w.projectPath}))}),_=new Set(K),B=U.filter((w)=>{let H=P({sessionId:w.sessionId,projectPath:w.projectPath});if(_.has(H))return!1;return _.add(H),!0}),E=[...Y,...B];return N.json(E)}catch(F){throw h.error("[SessionRoutes] Failed to list sessions:",F),new a("Failed to list sessions")}}),$.get("/catalog",async(N)=>{try{let F=N.req.query("limit"),Q=F===void 0?void 0:Number(F),Y=N.req.query("cursor"),K=N.req.query("projectPath"),U=N.req.query("archived");if(U!==void 0&&U!=="true"&&U!=="false")throw new D("archived must be true or false");let _=U==="true",B=await S.listSessionPage({...K?{cwd:N$(K)}:{},...Y?{cursor:Y}:{},...Q===void 0?{}:{limit:Q},includeSubagents:!1,archived:_}),E=new Map((_?[]:Array.from(c.values())).filter((w)=>w.relationType!=="subagent").map((w)=>[P(r(w)),a0(w)]));return N.json({sessions:B.sessions.map((w)=>E.get(P({sessionId:w.sessionId,projectPath:w.projectPath}))??w),...B.nextCursor?{nextCursor:B.nextCursor}:{}})}catch(F){if(F instanceof D)throw F;if(F instanceof Error&&(F.message.startsWith("Invalid session cursor")||F.message.startsWith("Session cursor scope")||F.message.startsWith("Session catalog")))throw new D(F.message);throw h.error("[SessionRoutes] Failed to list session catalog:",F),new a("Failed to list session catalog")}}),$.post("/",async(N)=>{try{let F=await N.req.json(),Q=v(J2,F);if(!Q.success)throw new D("Invalid request body");let{title:Y,projectPath:K}=Q.data,U=g$("web",12),_=N$(K||N.get("directory")||y(),K?"projectPath":"directory"),B=await S.createSessionMetadata(U,_,{title:Y,taskStatus:"completed"}),E=X$(B,[]),w=r(E);return c.set(P(w),E),C.publish(w,"session.created",{}),N.json({...a0(E),status:void 0,agentType:void 0,model:void 0})}catch(F){if(h.error("[SessionRoutes] Failed to create session:",F),F instanceof D)throw F;throw new a("Failed to create session")}}),$.get("/:sessionId/export",async(N)=>{let F=N.req.param("sessionId");try{let Q=N.req.query("includeReasoning");if(Q!==void 0&&Q!=="true"&&Q!=="false")throw new D("includeReasoning must be true or false");let Y=await x0(F,N.req.query("projectPath")),K=await S.exportSessionMarkdown(Y.sessionId,Y.projectPath,{includeReasoning:Q==="true"});return N.body(K.markdown,200,{"Cache-Control":"no-store","Content-Disposition":`attachment; filename="${K.filename}"`,"Content-Length":String(Buffer.byteLength(K.markdown,"utf8")),"Content-Type":"text/markdown; charset=utf-8","X-Blade-Content-Sha256":K.contentSha256,"X-Blade-Export-Activities":String(K.activityCount),"X-Blade-Export-Messages":String(K.messageCount),"X-Blade-Export-Redactions":String(K.redactionCount)})}catch(Q){if(Q instanceof D||Q instanceof u||Q instanceof K0)throw Q;if(Q instanceof Error&&Q.message==="No conversation content to export")throw new k(Q.message);throw h.error("[SessionRoutes] Failed to export session:",Q),new a("Failed to export session")}}),$.post("/:sessionId/fork",async(N)=>{let F=N.req.param("sessionId");try{a$(F);let Q=await N.req.json(),Y=v(Y2,Q);if(!Y.success)throw new D("Invalid request body");let K=N$(Y.data.projectPath),U=await S.findSessionMetadata(F,K);if(!U)throw new u("Session",F);let _=await S.forkSession(F,{sourceProjectPath:U.projectPath,targetProjectPath:U.projectPath}),B=X$(_.metadata,_.messages),E=r(B);return c.set(P(E),B),C.publish(E,"task.status",{taskStatus:_.metadata.taskStatus,..._.metadata.taskCompletedAt?{taskCompletedAt:_.metadata.taskCompletedAt}:{},updatedAt:_.metadata.lastMessageTime}),N.json({session:_.metadata,messages:T$(_.messages)},201)}catch(Q){if(Q instanceof D||Q instanceof u||Q instanceof k)throw Q;if(Q instanceof K1)throw new k("Session has no durable creation record");throw h.error("[SessionRoutes] Failed to fork session:",Q),new a("Failed to fork session")}}),$.get("/:sessionId",async(N)=>{let F=N.req.param("sessionId");try{let Q=await x0(F,N.req.query("projectPath")),Y=c.get(P(Q));if(Y)return N.json(a0(Y));let K=await S.findSessionMetadata(Q.sessionId,Q.projectPath);if(!K)throw new u("Session",F);return N.json(K)}catch(Q){if(Q instanceof D||Q instanceof u||Q instanceof K0)throw Q;throw h.error("[SessionRoutes] Failed to get session:",Q),new a("Failed to get session")}}),$.patch("/:sessionId",async(N)=>{let F=N.req.param("sessionId");try{let Q=await N.req.json(),Y=v(x2,Q);if(!Y.success)throw new D("Invalid request body");if(Y.data.title===void 0)throw new D("title is required");let K=await x0(F,Y.data.projectPath),U=await S.updateSessionMetadata(K.sessionId,K.projectPath,{title:Y.data.title}),_=c.get(P(K));if(_)_.title=U.title??_.title,_.updatedAt=new Date(U.lastMessageTime);if(U.title)C.publish(K,"session.updated",{title:U.title});return N.json({success:!0,title:U.title})}catch(Q){if(h.error("[SessionRoutes] Failed to update session:",Q),Q instanceof D||Q instanceof u||Q instanceof K0)throw Q;throw new a("Failed to update session")}}),$.get("/:sessionId/rewind",async(N)=>{let F=await I(N.req.param("sessionId"),N.req.query("projectPath")),Q=await L(F);return N.json({checkpoints:await Q.listRewindCheckpoints()})}),$.post("/:sessionId/rewind",async(N)=>{let F=v(cO,await N.req.json());if(!F.success)throw new D("Invalid rewind request");let Q=await I(N.req.param("sessionId"),N.req.query("projectPath")),Y=r(Q);return V(Y).runExclusive(async()=>{let K=Y0(Q.currentRunId);if(F0(K))throw new k("Cannot rewind while a run is active");let U=await L(Q),_;try{_=await U.rewindSession(F.data)}catch(E){if(E instanceof Error&&E.message.startsWith("Cannot rewind while"))throw new k(E.message);throw E}Q.messages=[..._.messages],Q.updatedAt=new Date;let B=T$(_.messages);return C.publish(Y,"session.rewound",{targetMessageId:_.checkpoint.messageId,mode:_.mode,removedTurns:_.removedTurns,restoredFiles:_.restoredFiles,messages:B}),N.json({..._,messages:B})})}),$.get("/:sessionId/review",async(N)=>{let F=N.req.param("sessionId"),Q=await x0(F,N.req.query("projectPath")),Y=await j0.list(Q.projectPath,Q.sessionId);return N.json({reviews:Y.map((K)=>({...K,content:K.completion?N1(K.start,K.completion):void 0}))})}),$.post("/:sessionId/review",async(N)=>{let F=N.req.param("sessionId"),Q=v(rO,await N.req.json());if(!Q.success)throw new D("Invalid code review request");let Y=await I(F,Q.data.projectPath),K=r(Y),U=P(K);return V(K).runExclusive(async()=>{if(F0(Y0(Y.currentRunId)))throw new k("Cannot start a review during an active turn");if(R0.has(U))throw new k("Session already has an active review");let _=await L(Y);if(await j0.recoverInterrupted(K.projectPath,K.sessionId,_),Q.data.modelId&&!_.getModelById(Q.data.modelId))throw new D(`Model not found: ${Q.data.modelId}`);if(Q.data.modelId&&_.getCurrentModelId()!==Q.data.modelId)await _.refresh({modelId:Q.data.modelId});if(Q.data.modelId&&Y.selectedModelId!==Q.data.modelId){let H=await S.updateSessionMetadata(Y.id,Y.projectPath,{selectedModelId:Q.data.modelId});G$(Y,H)}let B=new AbortController,E;try{E=await j0.start({sessionId:K.sessionId,projectPath:K.projectPath,runtime:_,request:{kind:Q.data.kind,...Q.data.ref?{ref:Q.data.ref}:{},...Q.data.instructions?{instructions:Q.data.instructions}:{}},signal:B.signal,onEvent:(H)=>{if(H.kind==="tool_start")C.publish(K,"review.tool.started",{reviewId:E?.reviewId,toolCallId:H.toolCall.id,toolName:H.toolCall.function.name});else if(H.kind==="tool_progress")C.publish(K,"review.tool.progress",{reviewId:E?.reviewId,toolCallId:H.toolCall.id,message:H.update.message.slice(0,1000)});else if(H.kind==="tool_result")C.publish(K,"review.tool.completed",{reviewId:E?.reviewId,toolCallId:H.toolCall.id,success:H.result.success})}})}catch(H){if(H instanceof Error&&(H.message.includes("active review")||H.message.includes("interrupted review")||H.message.includes("active turn")))throw new k(H.message);if(H instanceof Error&&(H.message.includes("review")||H.message.includes("Git")||H.message.includes("changes")||H.message.includes("ref")))throw new D(H.message);throw H}if(!E)throw new a("Code review failed to start");await T0(Y),C.publish(K,"review.started",{reviewId:E.reviewId,kind:Q.data.kind}),C.publish(K,"task.status",{taskStatus:Y.taskStatus,...Y.taskStatusReason?{taskStatusReason:Y.taskStatusReason}:{},...Y.taskStartedAt?{taskStartedAt:Y.taskStartedAt}:{},...Y.taskPromptSummary?{taskPromptSummary:Y.taskPromptSummary}:{},updatedAt:new Date().toISOString()});let w=E.completion.then(async(H)=>{Y.messages=await S.loadSession(K.sessionId,K.projectPath),await T0(Y),C.publish(K,"task.status",{taskStatus:Y.taskStatus,...Y.taskStatusReason?{taskStatusReason:Y.taskStatusReason}:{},...Y.taskFailure?{taskFailure:Y.taskFailure}:{},...Y.taskStartedAt?{taskStartedAt:Y.taskStartedAt}:{},...Y.taskCompletedAt?{taskCompletedAt:Y.taskCompletedAt}:{},...Y.taskPromptSummary?{taskPromptSummary:Y.taskPromptSummary}:{},updatedAt:new Date().toISOString()}),C.publish(K,"review.completed",{reviewId:E.reviewId,status:H.status,findings:H.findings.length})}).catch((H)=>{h.error(`[SessionRoutes] Code review ${E.reviewId} failed:`,H)}).finally(()=>{if(R0.get(U)?.reviewId===E.reviewId)R0.delete(U)});return R0.set(U,{reviewId:E.reviewId,controller:B,completion:w}),N.json({reviewId:E.reviewId,status:"running"},202)})}),$.get("/:sessionId/subagents",async(N)=>{let F=await I(N.req.param("sessionId"),N.req.query("projectPath")),Q=await L(F);return N.json({subagents:Q.listSubagents().map(w$)})}),$.post("/:sessionId/subagents/:agentId/resume",async(N)=>{a$(N.req.param("agentId"));let F=iO.safeParse(await N.req.json());if(!F.success)throw new D("Invalid subagent resume request");let Q=await I(N.req.param("sessionId"),N.req.query("projectPath")),Y=r(Q);return V(Y).runExclusive(async()=>{let K=Y0(Q.currentRunId);if(F0(K))throw new k("Cannot resume a subagent while a parent run is active");let U=await L(Q),_=!1,B,E=(H)=>{C.publish(Y,"subagent.complete",{subagentSessionId:H.id,success:H.status==="completed",status:H.status,summary:H.result?.message?.slice(0,500),type:H.subagentType,verificationVerdict:H.result?.verificationVerdict,resumedFrom:H.resumedFrom,rootAgentId:H.rootAgentId,resumeDepth:H.resumeDepth})},w;try{w=U.resumeSubagent({agentId:N.req.param("agentId"),prompt:F.data.prompt,onEvent:(H,s)=>{K2(Y,s,H)},onCompleted:(H)=>{if(_)E(H);else B=H}})}catch(H){if(H instanceof Error&&(H.message.startsWith("Cannot resume")||H.message.startsWith("Subagent cannot")))throw new k(H.message);if(H instanceof Error&&H.message.startsWith("Subagent not found"))throw new u(H.message);throw H}if(C.publish(Y,"subagent.start",{subagentSessionId:w.session.id,type:w.session.subagentType,description:w.session.description,resumedFrom:w.source.id,rootAgentId:w.session.rootAgentId,resumeDepth:w.session.resumeDepth}),_=!0,B)E(B);return N.json({source:w$(w.source),session:w$(w.session)})})}),$.get("/:sessionId/goal",async(N)=>{let F=await I(N.req.param("sessionId"),N.req.query("projectPath"));return N.json({goal:await new V1(F.projectPath,F.id).get()})}),$.put("/:sessionId/goal",async(N)=>{let F=v(z2,await N.req.json());if(!F.success)throw new D("Invalid goal request");let Q=await I(N.req.param("sessionId"),N.req.query("projectPath")),Y=r(Q);return V(Y).runExclusive(async()=>{let K=Y0(Q.currentRunId);if(F0(K))return N.json({status:"rejected",reason:"run_active"},409);let _=F.data.permissionMode??Q.permissionMode??"default";if(Q.permissionMode!==_)await n(Q,_);let B=await L(Q),E=await B.createGoal(F.data);C.publish(Y,"goal.updated",{goal:E});let w=Z0(Q,"",_,{goalContinuationOnly:!0,...Q.taskIsolation?{taskRuntime:B}:{}});return await w.taskAdmissionUpdate,N.json({status:w.status==="queued"?"queued":"running",runId:w.id,goal:E,queuePosition:w.taskQueuePosition,queueDepth:w.taskQueueDepth,maxConcurrentTasks:w.taskConcurrencyLimit},202)})}),$.patch("/:sessionId/goal",async(N)=>{let F=v(Q2,await N.req.json());if(!F.success)throw new D("Invalid goal update");let Q=await I(N.req.param("sessionId"),N.req.query("projectPath")),Y=r(Q);return V(Y).runExclusive(async()=>{let K=await L(Q),U;if(F.data.action==="pause")U=await K.pauseGoal();else if(F.data.action==="edit")U=await K.editGoal(F.data.objective);else U=await K.resumeGoal();if(C.publish(Y,"goal.updated",{goal:U}),U.status==="active"&&!F0(Y0(Q.currentRunId))){let _=Z0(Q,"","default",{goalContinuationOnly:!0,...Q.taskIsolation?{taskRuntime:K}:{}});return await _.taskAdmissionUpdate,N.json({status:_.status==="queued"?"queued":"running",runId:_.id,goal:U,queuePosition:_.taskQueuePosition,queueDepth:_.taskQueueDepth,maxConcurrentTasks:_.taskConcurrencyLimit},202)}return N.json({status:U.status,goal:U})})}),$.delete("/:sessionId/goal",async(N)=>{let F=await I(N.req.param("sessionId"),N.req.query("projectPath")),Q=r(F),K=await(await L(F)).clearGoal();if(K)C.publish(Q,"goal.cleared",{});return N.json({cleared:K})}),$.post("/:sessionId/archive",async(N)=>{let F=N.req.param("sessionId");try{let Q=await x0(F,N.req.query("projectPath")),Y=await S.listSessionArchiveMembers(Q.sessionId,Q.projectPath);for(let U of Y){let _=C0({sessionId:U.sessionId,projectPath:U.projectPath}),B=c.get(P(_));if(F0(Y0(B?.currentRunId)))throw new k(`Stop session ${U.sessionId} before archiving this session tree`)}for(let U of Y){let _=C0({sessionId:U.sessionId,projectPath:U.projectPath}),B=c.get(P(_));if(B)await M(B)}let K=await S.archiveSession(Q.sessionId,Q.projectPath);for(let U of Y){let _=C0({sessionId:U.sessionId,projectPath:U.projectPath}),B=P(_);c.delete(B),z.delete(B),Z.delete(B),X.delete(B),C.publish(_,"session.archived",{archiveRootId:Q.sessionId,archivedAt:K.archivedAt})}if(J.size===0)await X0.getInstance().disconnectAll();return N.json({session:K,archivedSessionIds:Y.map((U)=>U.sessionId)})}catch(Q){if(Q instanceof D||Q instanceof u||Q instanceof K0||Q instanceof k)throw Q;if(Q instanceof y$)throw new k(Q.message);throw h.error("[SessionRoutes] Failed to archive session:",Q),new a("Failed to archive session")}}),$.post("/:sessionId/unarchive",async(N)=>{let F=N.req.param("sessionId");try{let Q=await x0(F,N.req.query("projectPath")),Y=await S.listSessionArchiveMembers(Q.sessionId,Q.projectPath),K=await S.unarchiveSession(Q.sessionId,Q.projectPath),U=Y.filter((_)=>_.sessionId===Q.sessionId||_.archivedBySessionId===Q.sessionId).map((_)=>_.sessionId);for(let _ of U)C.publish({sessionId:_,projectPath:Q.projectPath},"session.unarchived",{archiveRootId:Q.sessionId});return N.json({session:K,restoredSessionIds:U})}catch(Q){if(Q instanceof D||Q instanceof u||Q instanceof K0)throw Q;if(Q instanceof y$)throw new k(Q.message);throw h.error("[SessionRoutes] Failed to unarchive session:",Q),new a("Failed to unarchive session")}}),$.delete("/:sessionId",async(N)=>{let F=N.req.param("sessionId"),Q=N.req.query("projectPath");try{let Y=await x0(F,Q),K=P(Y),U=c.get(K),_=J.get(K),B=U?.taskWorktree??await S.findSessionTaskWorktree(Y.sessionId,Y.projectPath),E;if(U?.currentRunId){let H=Y0(U.currentRunId);if(H)q$(H),await H.completion,E=H.id}let w=R0.get(K);if(w)w.controller.abort("session-delete"),await w.completion;if(_)await _.clearGoal().catch((H)=>{h.warn("[SessionRoutes] Failed to clear session goal:",H)});if(await S.deleteSession(Y.sessionId,Y.projectPath),C.publish(Y,"session.deleted",{}),E)X2(E);if(c.delete(K),z.delete(K),Z.delete(K),X.delete(K),_){if(await _.dispose(),J.delete(K),J.size===0)await X0.getInstance().disconnectAll()}if(B)try{await E0.restoreSession(B),await E0.exit({sessionId:Y.sessionId,action:"remove",discardChanges:!0})}catch(H){h.warn(`[SessionRoutes] Failed to remove deleted task worktree ${Y.sessionId}:`,H)}return N.json({success:!0})}catch(Y){if(h.error("[SessionRoutes] Failed to delete session:",Y),Y instanceof D||Y instanceof u||Y instanceof K0)throw Y;throw new a("Failed to delete session")}}),$.get("/:sessionId/message",async(N)=>{let F=N.req.param("sessionId");try{let Q=await x0(F,N.req.query("projectPath")),Y=c.get(P(Q)),K=Y?.messages?Y.messages:await S.loadSession(Q.sessionId,Q.projectPath);return N.json(T$(K))}catch(Q){if(h.error("[SessionRoutes] Failed to get messages:",Q),Q instanceof D||Q instanceof u||Q instanceof K0)throw Q;throw new a("Failed to get messages")}}),$.get("/:sessionId/events",async(N)=>{let F=N.req.param("sessionId"),Q=await x0(F,N.req.query("projectPath"));try{await S.assertSessionWritable(Q.sessionId,Q.projectPath)}catch(B){if(B instanceof d$)throw new k(B.message);throw B}let Y=await R(Q),K=N.req.header("Last-Event-ID")??N.req.query("lastEventId"),U=K?Number.parseInt(K,10):Number.NaN,_=Number.isInteger(U)?U+1:void 0;return $2(N,async(B)=>{let w,H,s=!1,M0=()=>{if(H!==void 0)clearInterval(H),H=void 0;w?.(),w=void 0},D0=()=>{if(s)return;s=!0,M0()},G0=new Set;B.onAbort(D0),w=C.subscribe((f)=>{if(f.sessionId!==Q.sessionId||f.projectPath!==Q.projectPath)return;let d=f.properties.requestId;if((f.type==="permission.asked"||f.type==="question.required"||f.type==="elicitation.required")&&typeof d==="string"){if(G0.has(d))return;G0.add(d)}B.writeSSE({...typeof f.seq==="number"?{id:String(f.seq)}:{},data:JSON.stringify({type:f.type,...typeof f.seq==="number"?{seq:f.seq}:{},properties:{...f.properties,sessionId:f.sessionId,projectPath:f.projectPath}})}).catch(D0)});try{if(B.aborted||s)return;let f=Y0(Y.currentRunId),d=F0(f)?await L(Y):void 0,e0=d?.getPendingSteeringCount()??0;if(await B.writeSSE({data:JSON.stringify({type:"connected",properties:{sessionId:Q.sessionId,projectPath:Q.projectPath,timestamp:Date.now(),status:F0(f)?f.status:"idle",runId:F0(f)?f.id:void 0,queued:e0,pendingInputDelivery:e0>0?d?.hasActiveTurn()?"current_turn":"next_turn":null,recovered:d?.getRecoveredSteeringCount()??0}})}).catch((q)=>{throw D0(),q}),B.aborted||s)return;if(_!==void 0){if(await F1.for(Q.sessionId,Q.projectPath).replay({onCommitted:(g)=>{if(B.aborted||s)return;B.writeSSE({...typeof g.seq==="number"?{id:String(g.seq)}:{},data:JSON.stringify({type:`committed.${g.type}`,...typeof g.seq==="number"?{seq:g.seq}:{},properties:{event:g,sessionId:Q.sessionId,projectPath:Q.projectPath}})})}},_),B.aborted||s)return}if(!f&&!R0.has(P(Q))){let g=(await j0.list(Q.projectPath,Q.sessionId)).some(($0)=>$0.completion===void 0)?await j0.recoverInterrupted(Q.projectPath,Q.sessionId,await L(Y)):void 0;if(g)Y.messages=await S.loadSession(Q.sessionId,Q.projectPath),await T0(Y),C.publish(Q,"review.completed",{reviewId:g.reviewId,status:g.status,findings:0,recovered:!0})}if(!f)await v0.recoverResponded(Q.projectPath,Q.sessionId);let B0=f?void 0:await v0.findPending(Q.projectPath,Q.sessionId),m=f?.pendingPermission??(B0?{permissionId:B0.request.requestId,details:v0.confirmationDetails(B0),resolve:()=>{return}}:void 0);if(m){G0.add(m.permissionId);let q=_1(m,!0);await B.writeSSE({data:JSON.stringify({type:q.type,properties:{...q.properties,sessionId:Q.sessionId,projectPath:Q.projectPath}})})}Q0(Y).catch((q)=>{h.error(`[SessionRoutes] Failed to resume pending input for ${F}:`,q)}),H=setInterval(()=>{if(!B.aborted)B.writeSSE({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})}).catch(D0)},15000);while(!B.aborted&&!s)await new Promise((q)=>setTimeout(q,1000))}finally{D0()}})}),$.post("/:sessionId/message",async(N)=>{let F=N.req.param("sessionId"),Q=await N.req.json(),Y=v(Z2,Q);if(!Y.success)throw new D("Invalid message format");let{content:K,attachments:U,modelId:_,reasoningEffort:B,serviceTier:E,responseVerbosity:w,communicationStyle:H,permissionMode:s,projectPath:M0,outputSchema:D0}=Y.data,G0;if(D0)try{G0=u$(D0).schema}catch(t){throw new D(t instanceof Error?t.message:"Invalid output schema")}let f=H,d=_?.trim();if((U??[]).reduce((t,i)=>t+(typeof i.content==="string"?Buffer.byteLength(i.content):0),0)>i0)throw new D("Message attachments exceed the 5 MiB limit");let B0=s,m=J1(K,U),q=await I(F,M0??N.req.query("projectPath")),g=B0??q.permissionMode??"default",$0=r(q);return V($0).runExclusive(async()=>{let t=Y0(q.currentRunId);if(F0(t)){if(G0)throw new k("Wait for the active turn to finish before setting an output schema");let l=await L(q);if(d&&!l.getModelById(d))throw new D(`Model not found: ${d}`);if(d&&l.getCurrentModelId()!==d)throw new k("Wait for the active turn to finish before switching models");if(B&&l.getReasoningConfiguration().selection!==B)throw new k("Wait for the active turn to finish before switching reasoning effort");if(E&&l.getServiceTierConfiguration().selection!==E)throw new k("Wait for the active turn to finish before switching service tier");if(w&&l.getResponseVerbosityConfiguration().selection!==w)throw new k("Wait for the active turn to finish before switching response verbosity");if(f&&l.getCommunicationStyleConfiguration().selection!==f)throw new k("Wait for the active turn to finish before switching communication style");if(B0&&q.permissionMode!==B0)throw new k("Wait for the active turn to finish before switching permission mode");let L0=await l.enqueueSteering(m,{allowBeforeTurn:!0});if(!L0.accepted)return N.json({status:"rejected",reason:L0.reason??"turn_unavailable"},409);let C$=L0.messageId??p0(12),DO=L0.queued;C.publish($0,"message.created",{messageId:C$,role:"user",content:p$(m)});let F4=L0.delivery==="next_turn"?"follow_up.queued":"steering.queued";if(C.publish($0,F4,{runId:t.id,messageId:C$,queued:DO}),L0.delivery==="next_turn"&&t.status!=="running"&&t.status!=="waiting_permission")Q0(q).catch((W4)=>{h.error(`[SessionRoutes] Failed to wake queued follow-up for ${F}:`,W4)});if(L0.delivery==="next_turn")t.pendingFollowUpRequested=!0;return N.json({runId:t.id,messageId:C$,status:L0.delivery==="next_turn"?"follow_up_queued":"steering_queued",queued:DO},202)}if(q.permissionMode!==g)await n(q,g);let i=await L(q,{permissionMode:g,...f&&!f.includes(":")?{communicationStyle:f}:{}});if(d&&!i.getModelById(d))throw new D(`Model not found: ${d}`);if(B)try{i.resolveReasoningConfiguration(B,d)}catch(l){throw new D(l instanceof Error?l.message:"Invalid reasoning effort")}if(E)try{i.resolveServiceTierConfiguration(E,d)}catch(l){throw new D(l instanceof Error?l.message:"Invalid service tier")}if(w)try{i.resolveResponseVerbosityConfiguration(w,d)}catch(l){throw new D(l instanceof Error?l.message:"Invalid response verbosity")}let W0=f?i.resolveCommunicationStyleConfiguration(f):void 0;if(W0?.source!==void 0&&W0.source!=="built-in"&&!W0.contentSha256)throw new D("Custom communication style has no provenance");let H0=i.getCurrentModelId(),NO=i.getReasoningConfiguration(),XO=i.getServiceTierConfiguration(),GO=i.getResponseVerbosityConfiguration(),KO=i.getCommunicationStyleConfiguration(),VO=Boolean(d)&&H0!==d,FO=Boolean(B)&&NO.selection!==B,WO=Boolean(E)&&XO.selection!==E,UO=Boolean(w)&&GO.selection!==w,_O=Boolean(f)&&KO.selection!==f;if(VO||FO||WO||UO||_O)await i.refresh({...d?{modelId:d}:{},...B?{reasoningEffort:B}:{},...E?{serviceTier:E}:{},...w?{responseVerbosity:w}:{},...f?{communicationStyle:f}:{}});let j$={...d&&q.selectedModelId!==d?{selectedModelId:d}:{},...B&&q.reasoningEffort!==B?{reasoningEffort:B}:{},...E&&q.serviceTier!==E?{serviceTier:E}:{},...w&&q.responseVerbosity!==w?{responseVerbosity:w}:{},...W0&&(q.communicationStyle!==f||q.communicationStyleDigest!==W0.contentSha256)?{communicationStyle:f,communicationStyleDigest:W0.source==="built-in"?null:W0.contentSha256}:{}};if(Object.keys(j$).length>0)try{let l=await S.updateSessionMetadata(q.id,q.projectPath,j$);q.permissionMode=l.permissionMode,q.selectedModelId=l.selectedModelId,q.reasoningEffort=l.reasoningEffort,q.serviceTier=l.serviceTier,q.responseVerbosity=l.responseVerbosity,q.communicationStyle=l.communicationStyle,q.communicationStyleDigest=l.communicationStyleDigest,q.updatedAt=new Date(l.lastMessageTime),C.publish($0,"session.updated",j$)}catch(l){if(VO||FO||WO||UO||_O)await i.refresh({...H0?{modelId:H0}:{},reasoningEffort:NO.selection,serviceTier:XO.selection,responseVerbosity:GO.selection,communicationStyle:KO.selection}).catch((L0)=>h.error("[SessionRoutes] Failed to roll back non-durable model settings:",L0));throw l}let $$=G0?await i.prepareInputTurn(m,{outputSchema:G0}):await i.prepareInputTurn(m);if(!$$.accepted)return N.json({status:"rejected",reason:$$.reason},$$.reason==="queue_full"?429:409);let u0=Z0(q,m,g,{preparedInputTurn:$$,outputSchema:G0,...q.taskIsolation?{taskRuntime:i}:{}});return await u0.taskAdmissionUpdate,N.json({runId:u0.id,messageId:$$.messageId,status:u0.status==="queued"?"queued":"running",queuePosition:u0.taskQueuePosition,queueDepth:u0.taskQueueDepth,maxConcurrentTasks:u0.taskConcurrencyLimit},202)})}),$.post("/:sessionId/shell",async(N)=>{let F=N.req.param("sessionId"),Q=v(sO,await N.req.json());if(!Q.success)throw new D("Invalid user shell command");let Y=await I(F,Q.data.projectPath??N.req.query("projectPath")),K=r(Y),U=P(K);return V(K).runExclusive(async()=>{if(o0.has(U))throw new k("A user shell command is already running in this Session");let _=await L(Y),B=new AbortController,E,w=new Promise((H)=>{E=H});o0.set(U,{controller:B,completion:w});try{let H=await _.executeUserShellCommand(Q.data.command,{signal:B.signal});Y.messages=await S.loadSession(Y.id,Y.projectPath),Y.updatedAt=new Date;let s=Y0(Y.currentRunId);if(H.delivery==="next_turn"&&F0(s))s.pendingFollowUpRequested=!0;return N.json({executionId:H.executionId,messageId:H.messageId,record:H.record,auxiliary:H.auxiliary,...H.delivery?{delivery:H.delivery}:{},...H.queued!==void 0?{queued:H.queued}:{}})}finally{o0.delete(U),E()}})}),$.post("/:sessionId/abort",async(N)=>{let F=N.req.param("sessionId"),Q=await x0(F,N.req.query("projectPath")),Y=c.get(P(Q));if(Y?.currentRunId){let _=Y0(Y.currentRunId);if(_)q$(_),await _.completion}let K=o0.get(P(Q));if(K)K.controller.abort("user-cancel"),await K.completion;let U=R0.get(P(Q));if(U)U.controller.abort("user-cancel"),await U.completion;return N.json({success:!0})}),$.get("/:sessionId/status",async(N)=>{let F=N.req.param("sessionId"),Q=await x0(F,N.req.query("projectPath")),Y=c.get(P(Q)),K=R0.get(P(Q));if(K)return N.json({sessionId:F,projectPath:Q.projectPath,reviewId:K.reviewId,status:"reviewing"});if(!Y?.currentRunId)return N.json({sessionId:F,projectPath:Q.projectPath,status:"idle"});let U=Y0(Y.currentRunId);return N.json({sessionId:F,projectPath:Q.projectPath,runId:Y.currentRunId,status:U?.status||"idle"})}),{app:$,dispatchTask:A,retryTask:e,getTaskDiff:T,deliverTask:O0,recoverQueuedTasks:P0}};async function V2($,J,Z,x,z,X={}){let{abortController:G,sessionId:V,id:W}=$,L=X.preparedInputTurn?.messageId??p0(12),R=X.pendingInputOnly===!0||X.preparedInputTurn?.mode==="pending"||X.goalContinuationOnly===!0?void 0:p0(12),I,n,Z0=r(J),A=(T,O0)=>{C.publish(Z0,T,O0)},e=async()=>{let T=String(G.signal.reason||"Task run cancelled");if(J.taskIsolation){let O0=I??await z(J).catch(()=>{return});if(T==="user-cancel")await O0?.discardPendingInput().catch((P0)=>{h.warn(`[SessionRoutes] Failed to discard cancelled input for ${J.id}:`,P0)});let Q0=await O0?.setTaskStatus("cancelled",T).catch(()=>{return});if(Q0)G$(J,Q0);else await T0(J).catch(()=>{return})}J.taskStatus="cancelled",J.taskStatusReason=T,J.taskCompletedAt??=new Date().toISOString()};try{if(X.taskAdmission){if(await X.taskAdmission.ready,await $.taskAdmissionUpdate,G.signal.aborted)throw Error(String(G.signal.reason||"Task run cancelled"))}if(J.taskStatus="running",J.taskStatusReason=void 0,J.taskStartedAt=new Date().toISOString(),J.taskCompletedAt=void 0,!X.pendingInputOnly&&!X.goalContinuationOnly)A("message.created",{messageId:L,role:"user",content:p$(Z)});if(A("session.status",{status:"running"}),R)A("message.created",{messageId:R,role:"assistant",content:""});I=await z(J);let T=I,O0=Boolean(X.outputSchema??T.getPendingSteeringMessages().find((Y)=>Y.outputSchema)?.outputSchema);n=await W1.createWithRuntime(T,{sessionId:V,...J.taskWorktree?{toolBlacklist:["EnterWorktree","ExitWorktree"]}:{}});let Q0=async(Y)=>{let K=Y.interactionRequestId??p0(12),U=300000;$.status="waiting_permission";let _=new Promise((H)=>{let s=setTimeout(()=>{h.warn(`[SessionRoutes] Permission ${K} timed out after 300000ms`),A("permission.timeout",{requestId:K}),H({approved:!1,reason:"timeout"})},300000);$.pendingPermission={permissionId:K,resolve:(M0)=>{clearTimeout(s),H(M0)},details:Y}}),B=$.pendingPermission;if(!B)throw Error("Permission request was not registered");let E=_1(B);A(E.type,E.properties),h.info(`[SessionRoutes] Permission request created: ${K}, runId: ${W}`);let w=await _;if(h.info(`[SessionRoutes] Permission response received: ${K}, approved: ${w.approved}`),!G.signal.aborted)$.status="running";if($.pendingPermission===B)$.pendingPermission=void 0;return A("interaction.resolved",{requestId:K}),w},P0={messages:[...J.messages],userId:"web-user",sessionId:V,workspaceRoot:J.projectPath,signal:G.signal,permissionMode:x,onPermissionModeChange:async(Y)=>{J.permissionMode=Y,J.updatedAt=new Date,A("session.updated",{permissionMode:Y})},...J.taskWorktree?{worktreeActive:!0}:{},confirmationHandler:{requestConfirmation:Q0}},N=()=>{if(!R)R=p0(12),A("message.created",{messageId:R,role:"assistant",content:""});return R},F=async(Y)=>{switch(Y.kind){case"content_delta":if(O0)break;A("message.delta",{messageId:N(),delta:Y.delta});break;case"structured_output":A("structured.output",{messageId:N(),output:Y.output,schemaDigest:Y.schemaDigest});break;case"thinking_delta":A("thinking.delta",{messageId:N(),delta:Y.delta});break;case"tool_start":if("function"in Y.toolCall){if(Y.toolCall.function.name===n0)break;A("tool.start",{messageId:N(),toolName:Y.toolCall.function.name,toolCallId:Y.toolCall.id,arguments:Y.toolCall.function.arguments,toolKind:Y.toolKind})}break;case"tool_result":if("function"in Y.toolCall){if(Y.toolCall.function.name===n0)break;A("tool.result",{messageId:N(),toolName:Y.toolCall.function.name,toolCallId:Y.toolCall.id,success:Y.result.success,summary:Y.result.metadata?.summary,output:n$(o$(Y.toolCall.function.name,Y.result)),metadata:D1(Y.result.metadata)})}break;case"tool_progress":if("function"in Y.toolCall){if(Y.toolCall.function.name===n0)break;A("tool.progress",{messageId:N(),toolName:Y.toolCall.function.name,toolCallId:Y.toolCall.id,...Y.update})}break;case"token_usage":A("token.usage",{...Y.usage});break;case"turn_start":A("turn.started",{turn:Y.turn,maxTurns:Y.maxTurns});break;case"mcp_catalog_changed":A("mcp.catalog.changed",{messageId:N(),revision:Y.revision,serverName:Y.serverName,added:Y.added,removed:Y.removed,updated:Y.updated});break;case"mcp_content_changed":A("mcp.content.changed",{messageId:N(),revision:Y.revision,serverName:Y.serverName,contentKind:Y.contentKind,added:Y.added,removed:Y.removed,updated:Y.updated});break;case"mcp_resource_updated":A("mcp.resource.updated",{messageId:N(),revision:Y.revision,serverName:Y.serverName,uri:Y.uri});break;case"mcp_connection_changed":A("mcp.connection.changed",{messageId:N(),revision:Y.revision,serverName:Y.serverName,phase:Y.phase,reason:Y.reason,attempt:Y.attempt,maxAttempts:Y.maxAttempts,nextRetryAt:Y.nextRetryAt,error:Y.error});break;case"mcp_log":A("mcp.log",{messageId:N(),revision:Y.revision,serverName:Y.serverName,level:Y.level,logger:Y.logger,message:Y.message,projectedBytes:Y.projectedBytes,dataSha256:Y.dataSha256,truncated:Y.truncated,detailsOmitted:Y.detailsOmitted,timestamp:Y.timestamp,synthetic:Y.synthetic});break;case"mcp_instructions_changed":A("mcp.instructions.changed",{messageId:N(),revision:Y.revision,serverName:Y.serverName,action:Y.action,reason:Y.reason,text:Y.text,sourceBytes:Y.sourceBytes,projectedBytes:Y.projectedBytes,sha256:Y.sha256,truncated:Y.truncated,detailsOmitted:Y.detailsOmitted});break;case"mcp_task_changed":A("mcp.task.changed",{messageId:N(),revision:Y.revision,taskId:Y.taskId,serverName:Y.serverName,toolName:Y.toolName,status:Y.status,statusMessage:Y.statusMessage,createdAt:Y.createdAt,updatedAt:Y.updatedAt,completedAt:Y.completedAt,hasResult:Y.hasResult,error:Y.error});break;case"project_rules_loaded":A("project.rules.loaded",{messageId:N(),files:Y.files,triggerPaths:Y.triggerPaths,blockedWrite:Y.blockedWrite});break;case"steering_applied":A("steering.applied",{runId:W,messageIds:Y.messageIds,count:Y.count,recovered:Y.recovered,delivery:Y.delivery,queued:T.getPendingSteeringCount()});break;case"follow_up_started":{if(R)A("message.complete",{messageId:R}),R=void 0;for(let K of Y.messages){if(!K.recovered||K.persisted)continue;A("message.created",{messageId:K.id,role:"user",content:p$(K.content),recovered:!0})}A("follow_up.started",{runId:W,queued:Y.queued,recovered:Y.recovered}),N();break}case"goal_updated":A("goal.updated",{goal:Y.goal});break;case"goal_continuation_started":A("goal.continuation.started",{goal:Y.goal,continuation:Y.continuation}),N();break;case"compaction":A(Y.phase==="start"?"compaction.started":"compaction.completed",{});break;case"model_fallback":A("model.fallback",{});break;case"task_update":A("task.updated",{tasks:Y.tasks});break;default:break}},Q=await l$(n.chatStream(Z,P0,{stream:!0,pendingInputOnly:X.pendingInputOnly,preparedInputTurn:X.preparedInputTurn,goalContinuationOnly:X.goalContinuationOnly,outputSchema:X.outputSchema,taskAdmission:X.taskAdmission}),F);if(!Q.success)throw Error(Q.error?.message??"Agent run failed");for(let Y=0;Y<20;Y++){let K=$.pendingFollowUpRequested===!0;if($.pendingFollowUpRequested=!1,T.getPendingSteeringCount()===0){if(!K)break;continue}if(G.signal.aborted)break;if(Q=await l$(n.chatStream("",P0,{stream:!0,pendingInputOnly:!0,taskAdmission:X.taskAdmission}),F),!Q.success)throw Error(Q.error?.message??"Agent follow-up failed")}if(J.messages=[...P0.messages],J.updatedAt=new Date,await T0(J),G.signal.aborted||$.status==="cancelled"){await e(),A("session.status",{status:"idle"});return}if(R)A("message.complete",{messageId:R});A("thinking.completed",{}),$.status="completed",J.taskStatus="completed",J.taskCompletedAt??=new Date().toISOString(),A("session.completed",{runId:W,outputTruncated:Q.metadata?.outputTruncated??!1}),A("session.status",{status:"idle"})}catch(T){if(I&&X.preparedInputTurn)await I.finishTurn(X.preparedInputTurn.handle).catch(()=>{return});if(G.signal.aborted||$.status==="cancelled"){q$($,"runtime-abort"),await e(),A("session.status",{status:"idle"});return}await T0(J).catch(()=>{return}),h.error("[SessionRoutes] Agent execution error:",T),$.status="failed",J.taskStatus="failed",J.taskCompletedAt??=new Date().toISOString();let O0=A$(T);if(!J.taskFailure){let Q0=I?await I.setTaskStatus("failed",T).catch(()=>{return}):await S.updateSessionMetadata(J.id,J.projectPath,{taskStatus:"failed",taskStatusReason:O0.message,taskFailure:O0,taskCompletedAt:J.taskCompletedAt,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}).catch(()=>{return});if(Q0)G$(J,Q0)}J.taskStatusReason??=O0.message,J.taskFailure??=O0,A("session.error",{error:J.taskFailure.message,taskFailure:J.taskFailure}),A("session.status",{status:"error"})}finally{if(X.taskAdmission?.release(),X.taskAdmission){let T=l0.getStats();A("task.status",{taskStatus:J.taskStatus,...J.taskStatusReason?{taskStatusReason:J.taskStatusReason}:{},...J.taskFailure?{taskFailure:J.taskFailure}:{},...J.taskStartedAt?{taskStartedAt:J.taskStartedAt}:{},...J.taskCompletedAt?{taskCompletedAt:J.taskCompletedAt}:{},...J.taskDiffStat?{taskDiffStat:J.taskDiffStat}:{},taskQueueDepth:T.queued,taskConcurrencyLimit:T.maxConcurrent,taskInFlight:T.inFlight,updatedAt:new Date().toISOString()})}if(await n?.destroy().catch(()=>{return}),$.disposeRuntimeOnSettle&&X.disposeRuntime)await X.disposeRuntime(J,I).catch((T)=>{h.warn(`[SessionRoutes] Failed to dispose terminal task runtime ${J.id}:`,T)});N2($)}}async function H1($,J,Z){h.info(`[SessionRoutes] Looking for permission ${J} in session ${$.sessionId}`),h.info(`[SessionRoutes] Active runs: ${q0.size}`);for(let[X,G]of q0.entries())if(h.info(`[SessionRoutes] Checking run ${X}: sessionId=${G.sessionId}, projectPath=${G.projectPath}, pendingPermission=${G.pendingPermission?.permissionId}`),G.sessionId===$.sessionId&&G.projectPath===$.projectPath&&G.pendingPermission?.permissionId===J){if(G.pendingPermission.details.interactionRequestId)await v0.respond($.projectPath,$.sessionId,J,Z);return G.pendingPermission.resolve(Z),h.info(`[SessionRoutes] Permission ${J} responded, runId: ${G.id}`),!0}let x=await v0.findPending($.projectPath,$.sessionId);if(!x||x.request.requestId!==J)return h.error(`[SessionRoutes] Permission not found: ${J}`),!1;await v0.respondAndRecover($.projectPath,$.sessionId,J,Z);let z=c.get(P($));if(!z){let X=await S.findSessionMetadata($.sessionId,$.projectPath);if(!X)return!1;let[G,V]=await Promise.all([S.loadSession($.sessionId,$.projectPath),S.findSessionTaskWorktree($.sessionId,$.projectPath)]);z=X$(X,G,V),c.set(P($),z)}else await T0(z);if(C.publish($,"interaction.resolved",{requestId:J}),E$)E$(z).catch((X)=>{h.error(`[SessionRoutes] Failed to resume recovered interaction ${J}:`,X)});return!0}var t$=p("Service"),W2=O.Object({approved:O.Boolean(),remember:O.Optional(O.Boolean()),scope:O.Optional(j(["once","session","project"])),targetMode:O.Optional(j(["default","autoEdit","plan","yolo"])),feedback:O.Optional(O.String({maxLength:4000})),answers:O.Optional(O.Record(O.String({maxLength:80}),O.Union([O.String({maxLength:4000}),O.Array(O.String({maxLength:1000}),{maxItems:4})]),{maxProperties:4})),elicitation:O.Optional(O.Object({action:j(["accept","decline","cancel"]),content:O.Optional(O.Record(O.String(),O.Union([O.String({maxLength:4000}),O.Number(),O.Boolean(),O.Array(O.String({maxLength:1000}),{maxItems:100})]),{maxProperties:32}))}))}),L1=()=>{let $=new F2;return $.post("/:permissionId",async(J)=>{let Z=J.req.param("permissionId"),x=J.req.query("sessionId"),z=J.req.query("projectPath");t$.info(`[PermissionRoutes] Received permission response: permissionId=${Z}, sessionId=${x}`);try{let X=await J.req.json(),G=v(W2,X);if(!G.success)throw new D("Invalid permission response format");let{approved:V,remember:W,scope:L,targetMode:M,feedback:R,answers:I,elicitation:n}=G.data;if(!x)throw new D("sessionId query parameter is required");let Z0=await x0(x,z);if(!await H1(Z0,Z,{approved:V,reason:R,scope:L,targetMode:M,feedback:R,answers:I,elicitation:n}))throw new u("Permission request",Z);return t$.info(`[PermissionRoutes] Permission ${Z} ${V?"approved":"denied"}`),J.json({success:!0,approved:V,remember:W})}catch(X){if(t$.error("[PermissionRoutes] Failed to respond to permission:",X),X instanceof D||X instanceof K0||X instanceof u||X instanceof J0)throw X;throw X}}),$};import w1 from"node:path";import{Hono as U2}from"hono";var _2=O.Object({projectPath:O.String({minLength:1}),enabled:O.Boolean(),scope:O.Optional(j(["local","project","global"]))}),D2=O.Object({projectPath:O.String({minLength:1})}),B2=O.Object({projectPath:O.String({minLength:1}),source:O.String({minLength:1}),trust:O.Literal(!0),ref:O.Optional(O.String({minLength:1}))}),H2=O.Object({projectPath:O.String({minLength:1}),trust:O.Literal(!0)}),L2=O.Object({projectPath:O.String({minLength:1}),confirm:O.Literal(!0)}),w2=O.Object({projectPath:O.String({minLength:1}),source:O.String({minLength:1}),ref:O.Optional(O.String({minLength:1}))}),A1=O.Object({projectPath:O.String({minLength:1}),confirm:O.Optional(O.Literal(!0))}),A2=O.Object({projectPath:O.String({minLength:1}),scope:O.Optional(j(["local","project","global"])),policy:O.Object({restrictToAllowedSources:O.Boolean(),requireGitCommitSha:O.Boolean(),allowedGitHosts:O.Array(O.String()),allowedMarketplaces:O.Array(O.String()),allowedLocalRoots:O.Array(O.String())})});function U0($){if(!$||!w1.isAbsolute($))throw new D("projectPath must be absolute");return w1.resolve($)}async function E1($){let[J,Z]=await Promise.all([N0($),J$.getInstance().loadWorkspacePluginSettingsResolution($)]);return J.plugins.getAll().map((x)=>({name:x.manifest.name,description:x.manifest.description,version:x.manifest.version,source:x.source,enabled:x.status==="active",status:x.status,commands:x.commands.length,skills:x.skills.length,agents:x.agents.length,hooks:x.hooks?Object.values(x.hooks).reduce((z,X)=>z+(Array.isArray(X)?X.length:0),0):0,mcpServers:Object.keys(x.mcpServers??{}).length,configurable:x.source!=="cli",managed:x.installation!==void 0,marketplace:x.installation?.source.type==="marketplace"?x.installation.source.marketplace:void 0,revision:x.installation?.revision,installedAt:x.installation?.installedAt,updatedAt:x.installation?.updatedAt,compatibilityIssues:x.compatibilityIssues??[],effectiveScope:x.source==="cli"?"invocation":Z.settings[x.manifest.name]?.effectiveScope??"default",settingLayers:x.source==="cli"?{invocation:!0}:Z.settings[x.manifest.name]?.layers??{}}))}async function E2(){let $=q1(),[J,Z]=await Promise.all([$.listCatalogs(),$.listInstallationRecords()]),x=new Map(Z.map((z)=>[z.name,z]));return J.map(({marketplace:z,manifest:X})=>({name:z.name,description:X.description??X.metadata?.description??"",sourceType:z.source.type,revision:z.revision,updatedAt:z.updatedAt,plugins:X.plugins.map((G)=>{let V=x.get(G.name);return{name:G.name,description:G.description??"",version:G.version,category:G.category,tags:G.tags??[],installed:V!==void 0,installedVersion:V?.version}})}))}function t0($,J){if(!$.success)throw new D($.error??J)}var P1=()=>{let $=new U2;return $.get("/",async(J)=>{let Z=U0(J.req.query("projectPath"));return J.json(await E1(Z))}),$.post("/refresh",async(J)=>{let Z=v(D2,await J.req.json());if(!Z.success)throw new D("Invalid plugin refresh request");let x=U0(Z.data.projectPath),z=await b1(x);return J.json({plugins:await E1(x),errors:z.discovery.errors.map((X)=>({code:X.code??"LOAD_ERROR",error:X.error}))})}),$.get("/catalog",async(J)=>{return U0(J.req.query("projectPath")),J.json(await E2())}),$.get("/policy",async(J)=>{let Z=U0(J.req.query("projectPath")),x=await J$.getInstance().loadWorkspacePluginSourcePolicy(Z);return J.json({policy:x,environmentRequiresSha:process.env.BLADE_PLUGIN_REQUIRE_SHA==="1"||process.env.BLADE_PLUGIN_REQUIRE_SHA==="true"})}),$.post("/policy",async(J)=>{let Z=v(A2,await J.req.json());if(!Z.success)throw new D("Invalid plugin source policy request");let x=U0(Z.data.projectPath),z=await R1(x,Z.data.policy,Z.data.scope??"global");return J.json({policy:z})}),$.post("/install",async(J)=>{let Z=v(B2,await J.req.json());if(!Z.success)throw new D("Invalid plugin install request; explicit source trust is required");let x=U0(Z.data.projectPath),{result:z}=await j1(x,Z.data.source,{trusted:Z.data.trust,ref:Z.data.ref});return t0(z,"Plugin installation failed"),J.json({name:z.pluginName,version:z.manifest?.version,revision:z.installation?.revision,changed:z.changed,installedDependencies:z.installedDependencies??[]})}),$.post("/marketplaces",async(J)=>{let Z=v(w2,await J.req.json());if(!Z.success)throw new D("Invalid marketplace add request");let x=U0(Z.data.projectPath),z=await k1(x,Z.data.source,Z.data.ref);return t0(z,"Marketplace installation failed"),J.json({name:z.marketplace?.name,plugins:z.manifest?.plugins.length??0,revision:z.marketplace?.revision,changed:z.changed})}),$.post("/marketplaces/:name/refresh",async(J)=>{let Z=v(A1,await J.req.json());if(!Z.success)throw new D("Invalid marketplace refresh request");let x=await S1(U0(Z.data.projectPath),J.req.param("name"));return t0(x,"Marketplace refresh failed"),J.json({name:x.marketplace?.name,plugins:x.manifest?.plugins.length??0,revision:x.marketplace?.revision,changed:x.changed})}),$.post("/marketplaces/:name/remove",async(J)=>{let Z=v(A1,await J.req.json());if(!Z.success||Z.data.confirm!==!0)throw new D("Invalid marketplace removal request; explicit confirmation is required");U0(Z.data.projectPath);let x=await f1(J.req.param("name"),!0);return t0(x,"Marketplace removal failed"),J.json({name:x.marketplace?.name,removed:!0})}),$.post("/:name/update",async(J)=>{let Z=v(H2,await J.req.json());if(!Z.success)throw new D("Invalid plugin update request; explicit source trust is required");let x=U0(Z.data.projectPath),{result:z}=await C1(x,J.req.param("name"),{trusted:Z.data.trust});return t0(z,"Plugin update failed"),J.json({name:z.pluginName,version:z.manifest?.version,revision:z.installation?.revision,changed:z.changed,updatedDependencies:z.updatedDependencies??[]})}),$.post("/:name/uninstall",async(J)=>{let Z=v(L2,await J.req.json());if(!Z.success)throw new D("Invalid plugin uninstall request; explicit confirmation is required");let x=U0(Z.data.projectPath),{result:z}=await I1(x,J.req.param("name"),Z.data.confirm);return t0(z,"Plugin uninstall failed"),J.json({name:z.pluginName,removed:!0})}),$.post("/:name/state",async(J)=>{let Z=v(_2,await J.req.json());if(!Z.success)throw new D("Invalid plugin state request");let x=U0(Z.data.projectPath),z=J.req.param("name"),G=(await N0(x)).plugins.get(z);if(!G)throw new u("Plugin",z);if(G.source==="cli")throw new D(`Plugin "${z}" was loaded with --plugin-dir and is invocation-scoped`);let V=await M1(x,z,Z.data.enabled,Z.data.scope??"local");return J.json(V)}),$};import{Hono as j2}from"hono";import{execFile as q2}from"node:child_process";import M2 from"node:path";var e$="__BLADE_DIRECTORY_PICKER_CANCELLED__",b2=900000;function R2($,J){return new Promise((Z)=>{q2($,[...J],{timeout:b2,maxBuffer:65536,windowsHide:!0},(x,z,X)=>{let G=x?.code;Z({stdout:z,stderr:X,exitCode:typeof G==="number"?G:x?1:0,...typeof G==="string"?{errorCode:G}:{}})})})}function s$($){let J=$.replace(/[\r\n]+$/,"");if(!J||J===e$)return{cancelled:!0};if(!M2.isAbsolute(J))throw Error("The folder picker returned an invalid path");return{cancelled:!1,path:J}}function r$($){return $.exitCode!==0||Boolean($.errorCode)}class h1{platform;runCommand;activeSelection=null;constructor($={}){this.platform=$.platform??process.platform,this.runCommand=$.runCommand??R2}pick(){if(this.activeSelection)return this.activeSelection;let $=this.pickForPlatform().finally(()=>{this.activeSelection=null});return this.activeSelection=$,$}async pickForPlatform(){switch(this.platform){case"darwin":return this.pickOnMac();case"win32":return this.pickOnWindows();case"linux":return this.pickOnLinux();default:throw Error("Native folder selection is unavailable on this system")}}async pickOnMac(){let $=["try",'set selectedFolder to choose folder with prompt "Choose a project folder"',"return POSIX path of selectedFolder","on error number -128",`return "${e$}"`,"end try"].join(`
3
+ `),J=await this.runCommand("osascript",["-e",$]);if(r$(J))throw Error("Unable to open the macOS folder picker");return s$(J.stdout)}async pickOnWindows(){let $=["Add-Type -AssemblyName System.Windows.Forms","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog",'$dialog.Description = "Choose a project folder"',"$dialog.ShowNewFolderButton = $true","if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {"," [Console]::Out.Write($dialog.SelectedPath)","} else {",` [Console]::Out.Write("${e$}")`,"}"].join("; "),J=await this.runCommand("powershell.exe",["-NoProfile","-STA","-Command",$]);if(r$(J))throw Error("Unable to open the Windows folder picker");return s$(J.stdout)}async pickOnLinux(){let $=[{command:"zenity",args:["--file-selection","--directory","--title=Choose a project folder"]},{command:"kdialog",args:["--getexistingdirectory",".","--title","Choose a project folder"]}];for(let J of $){let Z=await this.runCommand(J.command,J.args);if(Z.errorCode==="ENOENT")continue;if(Z.exitCode===1&&!Z.stdout.trim()&&!Z.stderr.trim())return{cancelled:!0};if(r$(Z))throw Error("Unable to open the Linux folder picker");return s$(Z.stdout)}throw Error("Install zenity or kdialog to use native folder selection")}}var m1=new h1;var C2=O.Object({path:O.String({minLength:1})});function I2($){if(!$)return!1;if($==="tauri://localhost"||$==="http://tauri.localhost")return!0;try{let J=new URL($).hostname;return J==="localhost"||J==="127.0.0.1"||J==="::1"||J==="[::1]"}catch{return!1}}var v1=($={})=>{let J=new j2,Z=$.pickDirectory??(()=>m1.pick()),x=$.allowDirectoryPickerRequest??I2;return J.get("/",async(z)=>{return z.json(await b$.list(y()))}),J.post("/",async(z)=>{let X;try{X=await z.req.json()}catch{throw new D("A valid JSON body is required")}let G=v(C2,X);if(!G.success)throw new D("A project path is required");try{let V=await b$.bind(G.data.path,y());return z.json(V,201)}catch(V){throw new D(V instanceof Error?V.message:"Failed to bind project")}}),J.post("/pick",async(z)=>{if(!x(z.req.header("Origin")))throw new J0("LOCAL_ACCESS_REQUIRED","Folder selection is only available from this machine",403);try{return z.json(await Z())}catch(X){throw new D(X instanceof Error?X.message:"Failed to select a folder")}}),J.delete("/",async(z)=>{let X=z.req.query("path");if(!X)throw new D("A project path is required");try{let G=await b$.unbind(X);return z.json({success:!0,removed:G})}catch(G){throw new D(G instanceof Error?G.message:"Failed to unbind project")}}),J};import{Hono as k2}from"hono";var T1=p("Service"),y1=()=>{let $=new k2;return $.get("/",async(J)=>{try{let Z=await u1();return J.json(Z)}catch(Z){return T1.error("[ProviderRoutes] Failed to list providers:",Z),J.json([])}}),$.get("/:provider/models",async(J)=>{let Z=J.req.param("provider");try{let x=await d1(Z);return J.json(x)}catch(x){return T1.error("[ProviderRoutes] Failed to list models:",x),J.json([])}}),$.put("/:provider/credential",async(J)=>{let Z=J.req.param("provider"),x=await J.req.json();if(!x.apiKey?.trim())throw new D("apiKey is required");return await h0().setApiKey(Z,x.apiKey.trim()),J.json({success:!0})}),$.delete("/:provider/credential",async(J)=>{return await h0().clearCredential(J.req.param("provider")),J.json({success:!0})}),$.put("/:provider",async(J)=>{let Z=J.req.param("provider"),x=o(),z=x?.modelProviders[Z];if(!x||!z)throw new u("Model provider",Z);let X=await J.req.json();if(!X.name||!X.baseUrl||!X.wireApi)throw new D("name, baseUrl and wireApi are required");let G="apiKeyEnv"in X?X.apiKeyEnv?.trim():z.apiKeyEnv,V={name:X.name,baseUrl:X.baseUrl,wireApi:X.wireApi,...G?{apiKeyEnv:G}:{}},W=h0(),L=X.apiKey?.trim()?await W.credentials.read(Z):void 0;if(X.apiKey?.trim())await W.setApiKey(Z,X.apiKey.trim());try{return await V0().updateModelProvider(Z,V),J.json({success:!0})}catch(M){if(X.apiKey?.trim())if(L)await W.credentials.modify(Z,async()=>L);else await W.credentials.delete(Z);if(M instanceof Error&&(M.message.includes("modelProviders.")||M.message.includes("built-in provider")))throw new D(M.message);throw M}}),$.delete("/:provider",async(J)=>{let Z=J.req.param("provider");if(!o()?.modelProviders[Z])throw new u("Model provider",Z);let z=J.req.query("removeModels");if(z!==void 0&&z!=="true"&&z!=="false")throw new D("removeModels must be true or false");try{let X=await V0().removeModelProvider(Z,{removeModels:z==="true"});return J.json({success:!0,...X})}catch(X){if(X instanceof Error&&(X.message.includes("still referenced")||X.message.includes("owns the only model")))throw new k(X.message);throw X}}),$.post("/:provider/probe",async(J)=>{let Z=J.req.param("provider"),x=o();if(!x?.modelProviders[Z])throw new u("Model provider",Z);let z=await J.req.json().catch(()=>({})),X=x.models.filter((V)=>V.provider===Z),G=z.modelId?X.find((V)=>V.id===z.modelId):X[0];if(!G)throw new D(z.modelId?"modelId does not reference this provider":"Model provider has no configured model to probe");return J.json(await g1(G,x))}),$};import*as k0 from"node:fs/promises";import{homedir as a1}from"node:os";import*as _0 from"node:path";import{Hono as S2}from"hono";var g0=p("Service"),l1=_0.join(a1(),".blade","skills"),$O=_0.join(a1(),".blade","skills-config.json");async function p1(){try{let $=await k0.readFile($O,"utf-8");return JSON.parse($)}catch{return{disabled:[]}}}async function f2($){await k0.mkdir(_0.dirname($O),{recursive:!0}),await k0.writeFile($O,JSON.stringify($,null,2))}async function P2($,J){let Z=await p1();if(J)Z.disabled=Z.disabled.filter((x)=>x!==$);else if(!Z.disabled.includes($))Z.disabled.push($);await f2(Z)}var I0=null,h2=300000,m2=6;async function v2(){if(I0&&Date.now()-I0.timestamp<h2)return I0.data;try{let $=await fetch("https://api.github.com/repos/anthropics/skills/contents/skills",{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"Blade-Skills-Catalog"}});if(!$.ok){if(g0.warn(`GitHub API returned ${$.status}`),I0)return I0.data;throw Error(`GitHub skills catalog returned ${$.status}`)}let Z=(await $.json()).filter((G)=>G.type==="dir"),x=Array(Z.length),z=0,X=Math.min(m2,Z.length);return await Promise.all(Array.from({length:X},async()=>{while(z<Z.length){let G=z++,V=Z[G];if(!V)continue;let W=`Official ${V.name} skill`;try{let L=await fetch(`https://raw.githubusercontent.com/anthropics/skills/main/skills/${V.name}/SKILL.md`,{headers:{"User-Agent":"Blade-Skills-Catalog"}});if(L.ok){let R=(await L.text()).match(/^#[^\n]*\n+([^\n#]+)/);if(R)W=R[1].trim().slice(0,100)}}catch{}x[G]={name:V.name,description:W,tag:"Official",author:"Anthropic"}}})),I0={data:x,timestamp:Date.now()},x}catch($){if(g0.warn("Failed to fetch skills catalog from GitHub:",$),I0)return I0.data;throw $}}var o1=()=>{let $=new S2;return $.get("/",async(J)=>{try{let Z=J.get("directory")||y(),z=(await N0(Z)).skills.getAll(),X=await p1(),G=z.map((V)=>({id:V.name,name:V.name,enabled:!X.disabled.includes(V.name),description:V.description||"",version:V.version||"1.0.0",provider:"Local",location:V.source==="builtin"?"Built-in":V.basePath,removable:V.source==="user"&&_0.dirname(_0.resolve(V.basePath))===_0.resolve(l1),capabilities:["prompts"],allowedTools:V.allowedTools||[]}));return J.json(G)}catch(Z){return g0.error("[SkillsRoutes] Failed to get skills:",Z),J.json({error:Z instanceof Error?Z.message:"Failed to get skills"},500)}}),$.post("/:name/toggle",async(J)=>{try{let Z=J.req.param("name"),x=await J.req.json();return await P2(Z,x.enabled),J.json({success:!0,enabled:x.enabled})}catch(Z){return g0.error("[SkillsRoutes] Failed to toggle skill:",Z),J.json({success:!1,error:Z.message},500)}}),$.delete("/:name",async(J)=>{try{let Z=J.req.param("name"),x=J.get("directory")||y(),z=(await N0(x)).skills,X=z.get(Z);if(!X)return J.json({success:!1,error:"Skill not found"},404);let G=_0.resolve(X.basePath),V=_0.resolve(l1);if(X.source!=="user"||_0.dirname(G)!==V)return J.json({success:!1,error:"Only Blade user skills can be uninstalled"},400);return await k0.rm(G,{recursive:!0,force:!0}),await z.refresh(),x$(x),await Z$(x),J.json({success:!0})}catch(Z){return g0.error("[SkillsRoutes] Failed to uninstall skill:",Z),J.json({success:!1,error:Z.message},500)}}),$.post("/install",async(J)=>{try{let Z=await J.req.json(),x=c1(),z=J.get("directory")||y(),X=i1({cwd:z}),G=!1;if(Z.source==="catalog"&&Z.name){if(G=await x.installOfficialSkill(Z.name),!G)return J.json({success:!1,error:"Failed to install skill from catalog"},500)}else if(Z.source==="repo"&&Z.url){if(G=await x.installFromRepo(Z.url,Z.name),!G)return J.json({success:!1,error:"Failed to install skill from repository. Make sure the repo contains a SKILL.md file."},500)}else if(Z.source==="local"&&Z.path){if(G=await x.installFromLocal(Z.path,Z.name),!G)return J.json({success:!1,error:"Failed to install skill from local path. Make sure the path exists and contains a SKILL.md file."},500)}else return J.json({success:!1,error:"Invalid install parameters. Required: source with corresponding url/path/name"},400);return await X.refresh(),x$(z),await Z$(z),J.json({success:!0})}catch(Z){return g0.error("[SkillsRoutes] Failed to install skill:",Z),J.json({success:!1,error:Z.message},500)}}),$.get("/catalog",async(J)=>{try{let Z=await v2();return J.json(Z)}catch(Z){return g0.error("[SkillsRoutes] Failed to get catalog:",Z),J.json({error:Z instanceof Error?Z.message:"Failed to get skills catalog"},502)}}),$};import{execSync as T2}from"node:child_process";import{readdir as g2}from"node:fs/promises";import R$ from"node:path";import u2 from"fast-glob";import{Hono as d2}from"hono";var K$=p("Service"),y2=($)=>{try{return T2("git rev-parse --abbrev-ref HEAD",{cwd:$,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}},l2=[...s0.map(($)=>`${$}/**`),...s0,...s0.map(($)=>`**/${$}/**`),...s0.map(($)=>`**/${$}`),...OO.map(($)=>`**/${$}`)],c2=new Set(["/theme","/model","/permissions","/mcp","/skills","/exit","/resume","/ide","/login","/logout"]),s1=()=>{let $=new d2;return $.get("/commands",async(J)=>{try{let Z=J.req.query("q")||"",x=J.get("directory")||y();await N0(x);let z=t1(Z,x).filter((X)=>!c2.has(X.command));return J.json(z)}catch(Z){return K$.error("[SuggestionsRoutes] Failed to get command suggestions:",Z),J.json([])}}),$.get("/files",async(J)=>{try{let Z=J.req.query("q")||"",x=J.get("directory")||y(),z=Math.min(Number(J.req.query("limit"))||100,1000),X=J.req.query("type")==="file",V=(await u2("**/*",{cwd:x,dot:!1,followSymbolicLinks:!1,onlyFiles:X,markDirectories:!0,unique:!0,ignore:l2})).map((M)=>M.replace(/\\/g,"/"));if(!Z)return J.json(V.slice(0,z));let W=Z.toLowerCase(),L=V.filter((M)=>M.toLowerCase().includes(W)).slice(0,z);return J.json(L)}catch(Z){return K$.error("[SuggestionsRoutes] Failed to get file suggestions:",Z),J.json([])}}),$.get("/files/tree",async(J)=>{try{let Z=J.get("directory")||y(),x=J.req.query("path")||"",z=x?R$.join(Z,x):Z,G=(await g2(z,{withFileTypes:!0})).map((L)=>({name:L.name,path:x?`${x}/${L.name}`:L.name,type:L.isDirectory()?"dir":"file"}));G.sort((L,M)=>{if(L.type!==M.type)return L.type==="dir"?-1:1;return L.name.localeCompare(M.name)});let V=new Set(s0),W=G.filter((L)=>{let M=L.name;if(M.startsWith("."))return!1;if(V.has(M))return!1;for(let R of OO)if(M.match(new RegExp(R.replace("*",".*"))))return!1;return!0});return J.json(W)}catch(Z){return K$.error("[SuggestionsRoutes] Failed to get file tree:",Z),J.json([])}}),$.get("/files/content",async(J)=>{try{let Z=J.req.query("path");if(!Z)return J.json({error:"Missing file path"},400);let x=J.get("directory")||y(),z=R$.resolve(x,Z),X=R$.relative(x,z);if(X.startsWith("..")||R$.isAbsolute(X))return J.json({error:"Invalid file path"},400);let G=n1(),V=await G.stat(z);if(!V?.isFile)return J.json({error:"File not found"},404);let W=200000,L=await G.readTextFile(z),M=L.length>W;return J.json({path:Z,content:M?L.slice(0,W):L,truncated:M,size:V.size})}catch(Z){return K$.error("[SuggestionsRoutes] Failed to get file content:",Z),J.json({error:"Failed to read file"},500)}}),$.get("/git-info",async(J)=>{try{let Z=J.get("directory")||y(),x=y2(Z);return J.json({branch:x})}catch(Z){return K$.error("[SuggestionsRoutes] Failed to get git info:",Z),J.json({branch:null})}}),$};import{Hono as i2}from"hono";var V$=p("Service"),r1=($)=>{let J=new i2;return J.onError((Z,x)=>{if(Z instanceof J0)return x.json(Z.toObject(),Z.statusCode);return V$.error("[TaskRoutes] Unhandled route error:",Z),x.json(new a("Failed to dispatch task").toObject(),500)}),J.post("/",async(Z)=>{let x;try{x=await Z.req.json()}catch{throw new D("Invalid request body")}let z=v(oO,x);if(!z.success)throw new D("Invalid task request");if((z.data.attachments??[]).reduce((G,V)=>G+(typeof V.content==="string"?Buffer.byteLength(V.content):0),0)>i0)throw new D("Task attachments exceed the 5 MiB limit");try{let G=await $.dispatchTask({prompt:z.data.prompt,title:z.data.title,sourceProjectPath:z.data.projectPath||Z.get("directory")||y(),isolation:z.data.isolation,permissionMode:z.data.permissionMode,modelId:z.data.modelId,reasoningEffort:z.data.reasoningEffort,serviceTier:z.data.serviceTier,responseVerbosity:z.data.responseVerbosity,communicationStyle:z.data.communicationStyle,attachments:z.data.attachments,outputSchema:z.data.outputSchema});return Z.json(v$.parse(G),202)}catch(G){if(G instanceof D||G instanceof k||G instanceof d0)throw G;throw V$.error("[TaskRoutes] Failed to dispatch task:",G),new a("Failed to dispatch task")}}),J.post("/:sessionId/retry",async(Z)=>{try{let x=await $.retryTask(Z.req.param("sessionId"),Z.req.query("projectPath"));return Z.json(v$.parse(x),202)}catch(x){if(x instanceof D||x instanceof u||x instanceof k||x instanceof d0)throw x;throw V$.error("[TaskRoutes] Failed to retry task:",x),new a("Failed to retry task")}}),J.get("/:sessionId/diff",async(Z)=>{try{let x=await $.getTaskDiff(Z.req.param("sessionId"),Z.req.query("projectPath"));return Z.json(dO.parse(x))}catch(x){if(x instanceof D||x instanceof u||x instanceof k)throw x;throw V$.error("[TaskRoutes] Failed to load task diff:",x),new a("Failed to load task diff")}}),J.post("/:sessionId/delivery",async(Z)=>{let x;try{x=await Z.req.json()}catch{throw new D("Invalid request body")}let z=v(nO,x);if(!z.success)throw new D("Invalid task delivery request");try{let X=await $.deliverTask(Z.req.param("sessionId"),z.data.action,Z.req.query("projectPath"));return Z.json(m0.parse(X))}catch(X){if(X instanceof D||X instanceof u||X instanceof k)throw X;throw V$.error("[TaskRoutes] Failed to deliver task:",X),new a("Failed to deliver task")}}),J};import{Hono as a2}from"hono";var S0=p("Service"),r0=new Map,e1=2097152,$4=65536;function O4(){return typeof globalThis.Bun<"u"}async function p2($,J,Z){if(O4()){let{spawn:X}=await import("bun-pty"),G=X($,J,{name:"xterm-256color",cwd:Z.cwd,env:Z.env});return{pid:G.pid,write:(V)=>G.write(V),resize:(V,W)=>G.resize(V,W),kill:()=>G.kill(),onData:(V)=>G.onData(V),onExit:(V)=>G.onExit(V)}}let z=(await import("node-pty")).spawn($,J,{name:"xterm-256color",cwd:Z.cwd,env:Z.env,cols:80,rows:24});return{pid:z.pid,write:(X)=>z.write(X),resize:(X,G)=>z.resize(X,G),kill:()=>z.kill(),onData:(X)=>{z.onData(X)},onExit:(X)=>{z.onExit(X)}}}var xO=void 0,ZO;if(O4())try{let{createBunWebSocket:$}=await import("hono/bun"),J=$();ZO=J.upgradeWebSocket,xO=J.websocket}catch($){S0.warn("[Terminal] Failed to initialize Bun WebSocket support:",$)}async function J4($,J){let Z=`term-${Date.now()}`;S0.info(`[Terminal] New connection: ${Z}, cwd: ${$}`);let x=process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/zsh",z=x.endsWith("sh")?["-l"]:[],X=await p2(x,z,{cwd:$,env:{...process.env,TERM:"xterm-256color",COLORTERM:"truecolor"}}),G={id:Z,process:X,cwd:$,buffer:"",subscribers:new Set};if(r0.set(Z,G),G.subscribers.add(J),X.onData((V)=>{let W=!1;for(let L of G.subscribers)try{L.send(V),W=!0}catch{G.subscribers.delete(L)}if(W)return;if(G.buffer+=V,G.buffer.length>e1)G.buffer=G.buffer.slice(-e1)}),X.onExit(({exitCode:V})=>{S0.info(`[Terminal] Process exited: ${Z}, code: ${V}`);for(let W of G.subscribers)try{W.close()}catch{}r0.delete(Z)}),G.buffer){let V=G.buffer;G.buffer="";for(let W=0;W<V.length;W+=$4)J.send(V.slice(W,W+$4))}return{session:G,cleanup:()=>{if(S0.info(`[Terminal] Connection closed: ${Z}`),G.subscribers.delete(J),G.subscribers.size===0){try{G.process.kill()}catch{}r0.delete(Z)}}}}function Z4($,J){$.on("connection",async(Z,x)=>{let z=new URL(x.url||"/",`http://${x.headers.host}`);if(!z.pathname.endsWith("/terminal/ws")){Z.close();return}let X=z.searchParams.get("cwd")||J()||y();try{let{session:G,cleanup:V}=await J4(X,{send:(W)=>Z.send(W),close:()=>Z.close()});Z.on("message",(W)=>{try{G.process.write(String(W))}catch(L){S0.error("[Terminal] Failed to write to PTY:",L)}}),Z.on("close",V),Z.on("error",V)}catch(G){S0.error("[Terminal] Failed to spawn PTY:",G),Z.close()}})}var x4=()=>{let $=new a2;if($.get("/status",(J)=>{let Z=Array.from(r0.values()).map((x)=>({id:x.id,cwd:x.cwd}));return J.json({active:Z.length,terminals:Z})}),$.post("/kill/:terminalId",(J)=>{let Z=J.req.param("terminalId"),x=r0.get(Z);if(x){try{x.process.kill()}catch{}for(let z of x.subscribers)z.close();return r0.delete(Z),J.json({success:!0})}return J.json({success:!1,error:"Terminal not found"},404)}),ZO)$.get("/ws",ZO((J)=>{let Z=J.req.query("cwd")||J.get("directory")||y(),x;return{async onOpen(z,X){try{x=await J4(Z,{send:(G)=>X.send(G),close:()=>X.close()})}catch(G){S0.error("[Terminal] Failed to spawn PTY:",G),X.close()}},onMessage(z){if(!x)return;try{x.session.process.write(String(z.data))}catch(X){S0.error("[Terminal] Failed to write to PTY:",X)}},onClose(){x?.cleanup()}}}));else $.get("/ws",(J)=>{return J.json({message:"WebSocket endpoint - connect via ws:// protocol",hint:"Use WebSocket client to connect to this endpoint"})});return $};import o2 from"node:path";import{Hono as n2}from"hono";var t2=O.Object({projectPath:O.String({minLength:1}),action:j(["trust","revoke"])});function Y4($){if(!o2.isAbsolute($))throw new D("projectPath must be absolute")}var Q4=()=>{let $=new n2;return $.get("/",async(J)=>{let Z=J.req.query("projectPath");if(!Z)throw new D("projectPath query parameter is required");return Y4(Z),J.json(await YO.getInstance().getStatus(Z))}),$.post("/",async(J)=>{let Z=v(t2,await J.req.json());if(!Z.success)throw new D("Invalid workspace trust request");let{projectPath:x,action:z}=Z.data;Y4(x);let X=YO.getInstance(),G=z==="trust"?await X.trust(x):await X.revoke(x);return await z4(),J.json({...G,reloadRequired:G.sensitiveSources>0})}),$};var z0=p("Service"),QO=[],F$,N4=new Map,X4=new Map,N5=new Set([".css",".html",".js",".json",".svg"]),X5=1024;function G5($,J){if(!$)return 0;let Z=$.split(",").map((x)=>{let[z,...X]=x.trim().toLowerCase().split(";"),G=X.find((W)=>W.trim().startsWith("q=")),V=G?Number(G.trim().slice(2)):1;return{name:z,quality:Number.isFinite(V)?Math.max(0,Math.min(1,V)):0}});return Z.find((x)=>x.name===J)?.quality??Z.find((x)=>x.name==="*")?.quality??0}function K5($){return["br","gzip"].map((Z)=>({encoding:Z,quality:G5($,Z)})).filter((Z)=>Z.quality>0).sort((Z,x)=>x.quality-Z.quality||(Z.encoding==="br"?-1:1))[0]?.encoding}function V5($){let J=N4.get($);if(J)return J;let Z=W$($);return N4.set($,Z),Z}function F5($,J,Z){let x=`${Z}:${$}`,z=X4.get(x);if(z)return z;let X=Z==="br"?J5(J,{params:{[x5.BROTLI_PARAM_QUALITY]:5}}):Z5(J,{level:6});return X4.set(x,X),X}function W5(){let $=e2(O5(import.meta.url)),J=[f0($,"web"),f0(y(),"dist/web"),f0(y(),"packages/cli/dist/web")];for(let Z of J){let x=f0(Z,"index.html");if(zO(x)){if(W$(x,"utf-8").includes("/assets/"))return z0.debug(`[Server] Found web dist at: ${Z}`),Z}}return null}function U5(){let $=new Y5;$.onError((x,z)=>{if(z0.error("[Server] Request error:",x),x instanceof J0)return z.json(x.toObject(),x.statusCode);let X=x instanceof Error?x.message:String(x);return z.json({error:{code:"INTERNAL_ERROR",message:X}},500)}),$.use(async(x,z)=>{let X=process.env.BLADE_SERVER_PASSWORD;if(!X)return z();let G=x.req.path;if(G==="/"||G==="/favicon.svg"||G.startsWith("/assets/")||G.endsWith(".html")||G.endsWith(".js")||G.endsWith(".css"))return z();let V=x.req.header("Authorization");if(!V?.startsWith("Basic "))return x.header("WWW-Authenticate",'Basic realm="Blade Server"'),x.json({error:{code:"UNAUTHORIZED",message:"Authentication required"}},401);let W=Buffer.from(V.slice(6),"base64").toString(),[L,M]=W.split(":"),R=process.env.BLADE_SERVER_USERNAME??"blade";if(L!==R||M!==X)return x.json({error:{code:"UNAUTHORIZED",message:"Invalid credentials"}},401);return z()}),$.use(async(x,z)=>{let X=x.req.path==="/health"||x.req.path==="/global/health"||x.req.path.startsWith("/assets/");if(!X)z0.debug(`[Server] ${x.req.method} ${x.req.path}`);let G=Date.now();if(await z(),!X){let V=Date.now()-G;z0.debug(`[Server] ${x.req.method} ${x.req.path} - ${x.res.status} (${V}ms)`)}}),$.use(z5({origin(x){if(!x)return;if(x.startsWith("http://localhost:"))return x;if(x.startsWith("http://127.0.0.1:"))return x;if(x==="tauri://localhost"||x==="http://tauri.localhost")return x;if(QO.includes(x))return x;return}})),$.use(async(x,z)=>{let X=x.req.query("directory")||x.req.header("x-blade-directory")||y();try{X=decodeURIComponent(X)}catch{}return x.set("directory",X),z()});let J=B1();F$=J.recoverQueuedTasks,$.route("/global",wO()),$.route("/events",HO()),$.route("/sessions",J.app),$.route("/tasks",r1(J)),$.route("/configs",BO()),$.route("/permissions",L1()),$.route("/plugins",P1()),$.route("/hooks",RO()),$.route("/workspace-trust",Q4()),$.route("/providers",y1()),$.route("/models",mO()),$.route("/projects",v1()),$.route("/suggestions",s1()),$.route("/terminal",x4()),$.route("/mcp",IO()),$.route("/skills",o1()),$.get("/health",(x)=>{return x.json({healthy:!0,version:y0()})});let Z=W5();if(Z)z0.info(`[Server] Serving static files from ${Z}`),$.get("/favicon.svg",()=>{let x=f0(Z,"favicon.svg");if(!zO(x))return new Response(null,{status:404});return new Response(W$(x),{headers:{"Content-Type":"image/svg+xml","Cache-Control":"public, max-age=86400"}})}),$.get("/assets/*",(x)=>{let z=f0(Z,x.req.path);if(!zO(z))return x.json({error:{code:"NOT_FOUND",message:`File not found: ${x.req.path}`}},404);let X=V5(z),G=$5(z).toLowerCase(),W={".js":"application/javascript",".css":"text/css",".html":"text/html",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".eot":"application/vnd.ms-fontobject"}[G]||"application/octet-stream",L=N5.has(G)&&X.byteLength>=X5?K5(x.req.header("Accept-Encoding")):void 0,M=L?F5(z,X,L):X;return new Response(new Uint8Array(M),{headers:{"Content-Type":W,"Content-Length":String(M.byteLength),"Cache-Control":"public, max-age=31536000, immutable",Vary:"Accept-Encoding",...L?{"Content-Encoding":L}:{}}})}),$.get("/",(x)=>{let z=f0(Z,"index.html"),X=W$(z,"utf-8");return x.html(X,200,{"Cache-Control":"no-cache"})}),$.get("*",(x)=>{let z=x.req.path;if(z.includes("."))return x.json({error:{code:"NOT_FOUND",message:`File not found: ${z}`}},404);let X=f0(Z,"index.html"),G=W$(X,"utf-8");return x.html(G,200,{"Cache-Control":"no-cache"})});else z0.warn('[Server] Web UI not found. Run "cd packages/cli/web && bun run build" to enable web interface.'),$.get("/",(x)=>{return x.json({message:"Blade API Server",version:y0(),webUI:!1,hint:'Web UI not built. Run "cd packages/cli/web && bun run build" to enable.',endpoints:{health:"/health",sessions:"/sessions",configs:"/configs",permissions:"/permissions",providers:"/providers"}})}),$.all("*",(x)=>{return x.json({error:{code:"NOT_FOUND",message:`Route not found: ${x.req.path}`}},404)});return $}function _5(){let $=r2(),J=[];for(let Z of Object.keys($)){let x=$[Z];if(!x)continue;for(let z of x){if(z.internal||z.family!=="IPv4")continue;if(z.address.startsWith("172."))continue;J.push(z.address)}}return J}function G4(){return typeof globalThis.Bun<"u"}function K4($,J){let Z=globalThis.Bun,x=(X)=>{try{return Z.serve({hostname:J.hostname,port:X,fetch:$.fetch,idleTimeout:0,websocket:xO})}catch(G){z0.error("Failed to start Bun server:",G);return}},z=J.port===0?x(4096)??x(0):x(J.port);if(!z)throw Error(`Failed to start Bun server on port ${J.port}`);return{url:z.url,port:z.port,hostname:z.hostname,stop:async()=>{z.stop(!0)}}}function D5($,J){return new Promise((Z,x)=>{let z=s2(async(L,M)=>{let R=new URL(L.url||"/",`http://${L.headers.host}`),I=new Headers;for(let[A,e]of Object.entries(L.headers))if(e)if(Array.isArray(e))for(let T of e)I.append(A,T);else I.set(A,e);let n;if(L.method!=="GET"&&L.method!=="HEAD")n=(await new Promise((e)=>{let T=[];L.on("data",(O0)=>T.push(O0)),L.on("end",()=>e(Buffer.concat(T)))})).toString();let Z0=new Request(R.toString(),{method:L.method,headers:I,body:n});try{let A=await $.fetch(Z0);if(M.statusCode=A.status,A.headers.forEach((e,T)=>{M.setHeader(T,e)}),A.body){let e=A.body.getReader(),T=async()=>{let{done:O0,value:Q0}=await e.read();if(O0){M.end();return}return M.write(Q0),T()};await T()}else{let e=await A.text();M.end(e)}}catch(A){z0.error("[Server] Node request error:",A),M.statusCode=500,M.end(JSON.stringify({error:{code:"INTERNAL_ERROR",message:"Internal server error"}}))}}),X=new Q5({noServer:!0}),G=y();Z4(X,()=>G),z.on("upgrade",(L,M,R)=>{if(new URL(L.url||"/",`http://${L.headers.host}`).pathname==="/terminal/ws")X.handleUpgrade(L,M,R,(n)=>{X.emit("connection",n,L)});else M.destroy()});let V=(L)=>{return new Promise((M,R)=>{z.once("error",(I)=>{if(I.code==="EADDRINUSE")R(I);else R(I)}),z.listen(L,J.hostname,()=>{let I=z.address();if(I&&typeof I==="object")M(I.port);else M(L)})})};(async()=>{let L;if(J.port===0)try{L=await V(4096)}catch{L=await V(0)}else L=await V(J.port);let M=new URL(`http://${J.hostname==="0.0.0.0"?"localhost":J.hostname}:${L}`);Z({url:M,port:L,hostname:J.hostname,stop:async()=>{return new Promise((R)=>{X.close(()=>{z.close(()=>R())})})}})})().catch(x)})}var V4;((k6)=>{let $,J;function Z(){if(!J)J=U5();return J}k6.getApp=Z;function x(G){QO=G.cors??[];let V=Z();if(G4())$=K4(V,G),z0.info(`[Server] Blade server listening on ${$.url} (Bun runtime)`);else throw Error("Blade web server requires Bun runtime. Please run with Bun: `bun run blade web` or install Bun from https://bun.sh");let W=$;return F$?.().catch((L)=>{z0.warn("[Server] Failed to recover queued tasks:",L)}),{url:W.url,port:W.port,hostname:W.hostname,stop:async()=>{if($)await $.stop(),$=void 0,J=void 0,F$=void 0,z0.info("[Server] Blade server stopped")}}}k6.listen=x;async function z(G){QO=G.cors??[];let V=Z();if(G4())$=K4(V,G),z0.info(`[Server] Blade server listening on ${$.url} (Bun runtime)`);else $=await D5(V,G),z0.info(`[Server] Blade server listening on ${$.url} (Node.js runtime)`);let W=$;try{await F$?.()}catch(L){z0.warn("[Server] Failed to recover queued tasks:",L)}return{url:W.url,port:W.port,hostname:W.hostname,stop:async()=>{if($)await $.stop(),$=void 0,J=void 0,F$=void 0,z0.info("[Server] Blade server stopped")}}}k6.listenAsync=z;function X(){return $!==void 0}k6.isRunning=X})(V4||={});export{B5 as a,H5 as b,_5 as c,V4 as d};
@@ -1,2 +1,2 @@
1
- import{_e as F}from"./chunk-c2rhwxyn.js";import{execSync as G}from"node:child_process";import*as C from"node:os";import*as v from"node:path";function H(k){return v.resolve(k).replace(/[/\\]/g,"-").replace(/:/g,"_")}function M(k){let q=k.replace(/_/g,":");if(q.startsWith("-"))q="/"+q.slice(1);return q.replace(/-/g,"/")}function z(k){let q=H(k);return v.join(E(),"projects",q)}function J(k){return typeof k==="string"&&k!=="."&&k!==".."&&/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,199}$/.test(k)}function A(k){if(!J(k))throw Error(`Invalid session ID: ${k}`)}function N(k,q){return A(q),v.join(z(k),`${q}.jsonl`)}function O(k,q){return A(q),v.join(z(k),`${q}.inbox.json`)}function Q(k,q){return A(q),v.join(z(k),`${q}.goal.json`)}function T(k){try{return G("git rev-parse --abbrev-ref HEAD",{cwd:k,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}function E(){return process.env.BLADE_STORAGE_ROOT||v.join(C.homedir(),".blade")}async function U(){let{readdir:k}=await import("node:fs/promises");try{let q=v.join(E(),"projects");return(await k(q,{withFileTypes:!0})).filter((w)=>w.isDirectory()).map((w)=>w.name)}catch{return[]}}
2
- export{M as Qe,z as Re,J as Se,A as Te,N as Ue,O as Ve,Q as We,T as Xe,E as Ye,U as Ze};
1
+ import{of as F}from"./chunk-954vmnrn.js";import{execSync as G}from"node:child_process";import*as C from"node:os";import*as v from"node:path";function H(k){return v.resolve(k).replace(/[/\\]/g,"-").replace(/:/g,"_")}function M(k){let q=k.replace(/_/g,":");if(q.startsWith("-"))q="/"+q.slice(1);return q.replace(/-/g,"/")}function z(k){let q=H(k);return v.join(E(),"projects",q)}function J(k){return typeof k==="string"&&k!=="."&&k!==".."&&/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,199}$/.test(k)}function A(k){if(!J(k))throw Error(`Invalid session ID: ${k}`)}function N(k,q){return A(q),v.join(z(k),`${q}.jsonl`)}function O(k,q){return A(q),v.join(z(k),`${q}.inbox.json`)}function Q(k,q){return A(q),v.join(z(k),`${q}.goal.json`)}function T(k){try{return G("git rev-parse --abbrev-ref HEAD",{cwd:k,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}function E(){return process.env.BLADE_STORAGE_ROOT||v.join(C.homedir(),".blade")}async function U(){let{readdir:k}=await import("node:fs/promises");try{let q=v.join(E(),"projects");return(await k(q,{withFileTypes:!0})).filter((w)=>w.isDirectory()).map((w)=>w.name)}catch{return[]}}
2
+ export{M as ef,z as ff,J as gf,A as hf,N as if,O as jf,Q as kf,T as lf,E as mf,U as nf};
@@ -0,0 +1,2 @@
1
+ var _=20,T=5242880,A=32000;
2
+ export{_ as Ge,T as He,A as Ie};
@@ -0,0 +1,2 @@
1
+ var e={name:"blade-code",version:"0.10.8",private:!1,description:"🗡️ Blade Code - 智能代码助手命令行工具",type:"module",bin:{blade:"dist/blade.js"},files:["dist","vendor/ripgrep/**","README.md"],scripts:{dev:"node scripts/run-bun.js --watch src/blade.tsx","dev:serve":"node scripts/run-bun.js --watch src/blade.tsx serve --port 4097",build:"rm -rf dist && node scripts/run-bun.js run scripts/build.ts",start:"node scripts/run-bun.js run dist/blade.js",test:"node scripts/test.js","test:all":"vitest run --config vitest.config.ts --project='!performance' && vitest run --config vitest.config.ts --project=performance","test:unit":"node scripts/test.js unit","test:integration":"node scripts/test.js integration","test:real-api":"node scripts/test.js realApi","test:real-api:qualification":"node scripts/test.js realApiQualification","test:cli":"node scripts/test.js cli","test:headless-core":"node scripts/test.js headlessCore","test:e2e":"node scripts/test.js e2e","test:performance":"node scripts/test.js performance","test:snapshot":"node scripts/test.js snapshot","test:security":"node scripts/test.js security","test:coverage":"node scripts/test.js all --coverage","test:watch":"vitest --watch --config vitest.config.ts","qualify:local":"node scripts/run-bun.js run scripts/qualify.ts local","qualify:production":"node scripts/run-bun.js run scripts/qualify.ts production","benchmark:repo":"node scripts/run-bun.js run scripts/run-real-repo-benchmark.ts","test:update-snapshots":"node scripts/test.js snapshot --update",lint:"biome lint src tests","lint:fix":"biome lint --write src tests","type-check":"tsc --noEmit","format:check":"biome format src tests",ready:"node scripts/run-bun.js run scripts/qualify.ts production","detect-unused":"node scripts/run-bun.js run scripts/detect-unused.ts",release:"node scripts/release.js","release:dry":"node scripts/release.js --dry-run","release:major":"node scripts/release.js --major","release:minor":"node scripts/release.js --minor","release:patch":"node scripts/release.js --patch"},keywords:["cli","blade","ai","assistant","agent","llm"],author:"echoVic",license:"MIT",engines:{node:">=22.19.0"},optionalDependencies:{"@vscode/ripgrep":"^1.18.0","better-sqlite3":"^11.8.1","bun-pty":"^0.4.8","node-pty":"1.1.0"},dependencies:{"@agentclientprotocol/sdk":"^1.3.0","@anthropic-ai/sandbox-runtime":"0.0.67","@earendil-works/pi-ai":"0.83.0","@inkjs/ui":"^2.0.0","@modelcontextprotocol/sdk":"^1.30.0",ahooks:"^3.9.7","ansi-escapes":"^7.3.0",ajv:"^8.17.1","async-mutex":"^0.5.0",axios:"^1.19.0",chalk:"^5.4.1",diff:"^8.0.2","fast-glob":"^3.3.3","fuse.js":"^7.5.0","gray-matter":"^4.0.3",hono:"^4.13.0",ink:"npm:@jrichman/ink@6.4.10","ink-big-text":"^2.0.0","ink-gradient":"^3.0.0","ink-select-input":"^6.2.0","ink-spinner":"^5.0.0","ink-text-input":"^6.0.0","js-tiktoken":"^1.0.21","lodash-es":"^4.18.1",lowlight:"^3.3.0","lru-cache":"^11.5.2",nanoid:"^5.1.6",open:"^10.1.2",picomatch:"^4.0.5",react:"19.2.4","react-dom":"19.2.4",semver:"^7.8.5","string-width":"^8.2.2",typebox:"1.3.10",undici:"^7.16.0","vscode-jsonrpc":"8.2.1","vscode-languageserver-protocol":"3.17.5","vscode-languageserver-types":"3.17.5","write-file-atomic":"^7.0.0",ws:"^8.21.2",yaml:"^2.9.0",yargs:"^18.1.0",zustand:"^5.0.14"},devDependencies:{"@biomejs/biome":"^2.5.7","@types/bun":"^1.3.14","@types/json-schema":"^7.0.15","@types/lodash-es":"^4.17.12","@types/node":"^22.15.24","@types/picomatch":"^4.0.3","@types/react":"19.2.10","@types/react-dom":"19.2.3","@types/semver":"^7.8.0","@types/write-file-atomic":"^4.0.3","@types/ws":"^8.18.1","@types/yargs":"^17.0.35","@vitest/coverage-v8":"^4.1.10",jsdom:"^26.0.0",typescript:"^5.9.2",vitest:"^4.1.10"}};function i(){return{name:e.name,version:e.version,description:e.description}}function n(){return e.version}function o(){return e.name}function c(){return e.description}function a(){return`v${e.version}`}function d(){return`v${e.version} © 2025 Blade Code`}
2
+ export{i as Ye,n as Ze,o as _e,c as $e,a as af,d as bf};
@@ -0,0 +1,10 @@
1
+ import{a as Q,b as R,c as T,d as W}from"./chunk-52csdk21.js";import"./chunk-rkvfsx8e.js";import"./chunk-pv9sw79c.js";import"./chunk-d0g4t8fw.js";import"./chunk-8h0yxh6y.js";import"./chunk-van4ysq6.js";import"./chunk-s9aj3p11.js";import"./chunk-8sfycn3y.js";import"./chunk-nymm525r.js";import"./chunk-a8h3fymk.js";import"./chunk-kagpk2x5.js";import"./chunk-xmcsn7y0.js";import{Bc as M}from"./chunk-8gcg2z3y.js";import"./chunk-7hbw6q6d.js";import"./chunk-h28ptrrt.js";import"./chunk-b5szbtmp.js";import"./chunk-wmnszjmv.js";import"./chunk-eq2qj9ja.js";import"./chunk-rxqft6td.js";import"./chunk-cf8e7e92.js";import"./chunk-senkwdh6.js";import"./chunk-vsg8f0e6.js";import"./chunk-4h9ff923.js";import"./chunk-xa05phpw.js";import"./chunk-cbpqcdga.js";import"./chunk-8gnfj89a.js";import"./chunk-yfs9tq3y.js";import"./chunk-zknv3d6y.js";import"./chunk-6j8wgp2s.js";import"./chunk-y4c3wwpa.js";import"./chunk-v8pq6qmv.js";import"./chunk-fj8v7pep.js";import{Ze as J}from"./chunk-6vsszvgg.js";import"./chunk-w0nscjd2.js";import"./chunk-33ave20b.js";import"./chunk-66hb7kxm.js";import"./chunk-954vmnrn.js";import b from"chalk";import H from"open";var $=`
2
+ ____ _ _
3
+ | __ )| | __ _ __| | ___
4
+ | _ \\| |/ _\` |/ _\` |/ _ \\
5
+ | |_) | | (_| | (_| | __/
6
+ |____/|_|\\__,_|\\__,_|\\___|
7
+ `,E={command:"web",describe:"Start Blade server and open web interface",builder:Q,handler:async(X)=>{let F=R(X);if(await M(),!process.env.BLADE_SERVER_PASSWORD)console.log(b.yellow("[WARN] BLADE_SERVER_PASSWORD is not set; server is unsecured.")),console.log(b.gray(` Set this environment variable to enable Basic Auth.
8
+ `));let C=await W.listenAsync(F);if(console.log(b.cyan($)),console.log(b.gray(` v${J()}
9
+ `)),F.hostname==="0.0.0.0"){let q=`http://localhost:${C.port}`;console.log(b.blue.bold(" Local access: "),b.white(q));let Y=T();for(let Z of Y)console.log(b.blue.bold(" Network access: "),b.white(`http://${Z}:${C.port}`));H(q).catch(()=>{})}else{let q=C.url.toString();console.log(b.blue.bold(" Web interface: "),b.white(q)),H(q).catch(()=>{})}console.log(""),console.log(b.gray(` Press Ctrl+C to stop the server.
10
+ `)),await new Promise(()=>{}),await C.stop()}};export{E as webCommand};
@@ -1 +1 @@
1
- import{sd as F}from"./chunk-6cv4gddv.js";import{we as G}from"./chunk-c9tzf9r5.js";import{promises as $}from"node:fs";import b from"node:os";import W from"node:path";import{Mutex as j}from"async-mutex";import{merge as N}from"lodash-es";import A from"write-file-atomic";var B=F("Service"),Z={models:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},modelProviders:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},currentModelId:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},temperature:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},maxOutputTokens:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},timeout:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},theme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},uiTheme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},language:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},debug:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},fontSize:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},autoSaveSessions:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyBuild:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyErrors:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifySounds:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyTelemetry:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyCrash:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},communicationStyle:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},permissionMode:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},permissions:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},hooks:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},enabledPlugins:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},pluginSourcePolicy:{target:"settings",defaultScope:"global",mergeStrategy:"replace",persistable:!0},env:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},disableAllHooks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxTurns:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxConcurrentTasks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxQueuedTasks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},mcpServers:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},lspServers:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},stream:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topP:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topK:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},mcpEnabled:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},systemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},appendSystemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},initialMessage:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},resumeSessionId:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},forkSession:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},allowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},disallowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},mcpConfigPaths:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},strictMcpConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},addDirs:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},outputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},inputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},print:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},includePartialMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},replayUserMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},agentsConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},settingSources:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1}},S=new Set(Object.entries(Z).filter(([q,z])=>z.persistable).map(([q])=>q)),m=new Set(Object.entries(Z).filter(([q,z])=>!z.persistable).map(([q])=>q));class V{static instance=null;pendingUpdates=new Map;timers=new Map;fileLocks=new Map;lastSaveError=null;debounceDelay=300;constructor(){}static getInstance(){if(!V.instance)V.instance=new V;return V.instance}static resetInstance(){if(V.instance)for(let q of V.instance.timers.values())clearTimeout(q);V.instance=null}async save(q,z={}){this.validatePersistableFields(q);let H=this.groupUpdatesByTarget(q,z.scope,z.projectDir);if(z.immediate)await Promise.all(Array.from(H.entries()).map(([J,K])=>this.flushTarget(J,K)));else for(let[J,K]of H)this.scheduleSave(J,K)}async flush(){for(let z of this.timers.values())clearTimeout(z);this.timers.clear();let q=Array.from(this.pendingUpdates.entries()).map(([z,H])=>this.flushTarget(z,H));this.pendingUpdates.clear(),await Promise.all(q)}getLastSaveError(){return this.lastSaveError}clearLastSaveError(){this.lastSaveError=null}async appendPermissionRule(q,z={}){await this.appendPermissionRuleForDecision(q,"allow",z)}async appendPermissionDenyRule(q,z={}){await this.appendPermissionRuleForDecision(q,"deny",z)}async appendPermissionRuleForDecision(q,z,H){let J=H.scope??"local",K=this.resolveFilePath("settings",J,H.projectDir);await this.flushTargetWithModifier(K,(M)=>{let Q=M.permissions??{allow:[],ask:[],deny:[]},X={allow:z==="allow"?this.dedupeArray([...Q.allow||[],q]):Q.allow||[],ask:Q.ask||[],deny:z==="deny"?this.dedupeArray([...Q.deny||[],q]):Q.deny||[]};return{...M,permissions:X}})}async appendLocalPermissionRule(q,z={}){await this.appendPermissionRule(q,{...z,scope:"local"})}async appendLocalPermissionDenyRule(q,z={}){await this.appendPermissionDenyRule(q,{...z,scope:"local"})}async removePluginSetting(q,z={}){let H=z.scope??"local",J=this.resolveFilePath("settings",H,z.projectDir);await this.flushTargetWithModifier(J,(K)=>{let M={...K.enabledPlugins??{}};delete M[q];let Q={...K};if(Object.keys(M).length>0)Q.enabledPlugins=M;else delete Q.enabledPlugins;return Q})}validatePersistableFields(q){for(let z of Object.keys(q)){let H=Z[z];if(!H)throw Error(`Unknown config field: ${z}`);if(!H.persistable)throw Error(`Field "${z}" is non-persistable and cannot be saved to config files. Non-persistable fields are runtime-only and only valid for the current session.`)}}groupUpdatesByTarget(q,z,H){let J=new Map;for(let[K,M]of Object.entries(q)){let Q=Z[K];if(!Q)continue;let X=z??Q.defaultScope,Y=this.resolveFilePath(Q.target,X,H);if(!J.has(Y))J.set(Y,{});J.get(Y)[K]=M}return J}resolveFilePath(q,z,H){let J=H??G();if(q==="config")return z==="global"?W.join(b.homedir(),".blade","config.json"):W.join(J,".blade","config.json");switch(z){case"local":return W.join(J,".blade","settings.local.json");case"project":return W.join(J,".blade","settings.json");case"global":return W.join(b.homedir(),".blade","settings.json");default:return W.join(J,".blade","settings.local.json")}}scheduleSave(q,z){let H=this.pendingUpdates.get(q)??{},J=this.mergePendingUpdates(H,z);this.pendingUpdates.set(q,J);let K=this.timers.get(q);if(K)clearTimeout(K);let M=setTimeout(async()=>{let Q=this.pendingUpdates.get(q);if(Q){this.pendingUpdates.delete(q),this.timers.delete(q);try{await this.flushTarget(q,Q),this.lastSaveError=null}catch(X){let Y=X instanceof Error?X:Error(String(X));this.lastSaveError=Y,B.error(`Failed to save config to ${q}:`,Y.message),B.error("Stack trace:",Y.stack)}}},this.debounceDelay);this.timers.set(q,M)}mergePendingUpdates(q,z){let H={...q};for(let[J,K]of Object.entries(z)){let M=Z[J];if(!M){H[J]=K;continue}switch(M.mergeStrategy){case"replace":H[J]=K;break;case"append-dedupe":this.applyAppendDedupe(H,J,K);break;case"deep-merge":this.applyDeepMerge(H,J,K);break}}return H}async flushTarget(q,z){let H=this.fileLocks.get(q);if(!H)H=new j,this.fileLocks.set(q,H);await H.runExclusive(async()=>{await this.performWrite(q,z)})}async flushTargetWithModifier(q,z){let H=this.fileLocks.get(q);if(!H)H=new j,this.fileLocks.set(q,H);await H.runExclusive(async()=>{await $.mkdir(W.dirname(q),{recursive:!0,mode:493});let J={};try{let M=await $.readFile(q,"utf-8");J=JSON.parse(M)}catch{J={}}let K=z(J);await this.atomicWrite(q,K)})}async performWrite(q,z){await $.mkdir(W.dirname(q),{recursive:!0,mode:493});let H={};try{let K=await $.readFile(q,"utf-8");H=JSON.parse(K)}catch{H={}}let J={...H};for(let[K,M]of Object.entries(z)){let Q=Z[K];if(!Q){J[K]=M;continue}switch(Q.mergeStrategy){case"replace":J[K]=M;break;case"append-dedupe":this.applyAppendDedupe(J,K,M);break;case"deep-merge":this.applyDeepMerge(J,K,M);break}}await this.atomicWrite(q,J)}applyAppendDedupe(q,z,H){if(z==="permissions"&&typeof H==="object"&&H!==null){let J=q[z]??{allow:[],ask:[],deny:[]},K=H;q[z]={allow:this.dedupeArray([...J.allow||[],...K.allow||[]]),ask:this.dedupeArray([...J.ask||[],...K.ask||[]]),deny:this.dedupeArray([...J.deny||[],...K.deny||[]])}}else if(Array.isArray(H)){let J=Array.isArray(q[z])?q[z]:[];q[z]=this.dedupeArray([...J,...H])}else q[z]=H}applyDeepMerge(q,z,H){if(typeof H==="object"&&H!==null&&!Array.isArray(H)){let J=typeof q[z]==="object"&&q[z]!==null?q[z]:{};q[z]=N({},J,H)}else q[z]=H}dedupeArray(q){return Array.from(new Set(q))}async atomicWrite(q,z){await A(q,JSON.stringify(z,null,2),{mode:384,encoding:"utf-8"})}}function O(){return V.getInstance()}export{O as Ac};
1
+ import{Id as F}from"./chunk-8gnfj89a.js";import{Me as G}from"./chunk-y4c3wwpa.js";import{promises as $}from"node:fs";import b from"node:os";import W from"node:path";import{Mutex as j}from"async-mutex";import{merge as N}from"lodash-es";import A from"write-file-atomic";var B=F("Service"),Z={models:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},modelProviders:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},currentModelId:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},temperature:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},maxOutputTokens:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},timeout:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},theme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},uiTheme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},language:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},debug:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},fontSize:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},autoSaveSessions:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyBuild:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyErrors:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifySounds:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyTelemetry:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyCrash:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},communicationStyle:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},permissionMode:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},permissions:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},hooks:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},enabledPlugins:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},pluginSourcePolicy:{target:"settings",defaultScope:"global",mergeStrategy:"replace",persistable:!0},env:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},disableAllHooks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxTurns:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxConcurrentTasks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxQueuedTasks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},mcpServers:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},lspServers:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},stream:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topP:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topK:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},mcpEnabled:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},systemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},appendSystemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},initialMessage:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},resumeSessionId:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},forkSession:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},allowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},disallowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},mcpConfigPaths:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},strictMcpConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},addDirs:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},outputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},inputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},print:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},includePartialMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},replayUserMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},agentsConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},settingSources:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1}},S=new Set(Object.entries(Z).filter(([q,z])=>z.persistable).map(([q])=>q)),m=new Set(Object.entries(Z).filter(([q,z])=>!z.persistable).map(([q])=>q));class V{static instance=null;pendingUpdates=new Map;timers=new Map;fileLocks=new Map;lastSaveError=null;debounceDelay=300;constructor(){}static getInstance(){if(!V.instance)V.instance=new V;return V.instance}static resetInstance(){if(V.instance)for(let q of V.instance.timers.values())clearTimeout(q);V.instance=null}async save(q,z={}){this.validatePersistableFields(q);let H=this.groupUpdatesByTarget(q,z.scope,z.projectDir);if(z.immediate)await Promise.all(Array.from(H.entries()).map(([J,K])=>this.flushTarget(J,K)));else for(let[J,K]of H)this.scheduleSave(J,K)}async flush(){for(let z of this.timers.values())clearTimeout(z);this.timers.clear();let q=Array.from(this.pendingUpdates.entries()).map(([z,H])=>this.flushTarget(z,H));this.pendingUpdates.clear(),await Promise.all(q)}getLastSaveError(){return this.lastSaveError}clearLastSaveError(){this.lastSaveError=null}async appendPermissionRule(q,z={}){await this.appendPermissionRuleForDecision(q,"allow",z)}async appendPermissionDenyRule(q,z={}){await this.appendPermissionRuleForDecision(q,"deny",z)}async appendPermissionRuleForDecision(q,z,H){let J=H.scope??"local",K=this.resolveFilePath("settings",J,H.projectDir);await this.flushTargetWithModifier(K,(M)=>{let Q=M.permissions??{allow:[],ask:[],deny:[]},X={allow:z==="allow"?this.dedupeArray([...Q.allow||[],q]):Q.allow||[],ask:Q.ask||[],deny:z==="deny"?this.dedupeArray([...Q.deny||[],q]):Q.deny||[]};return{...M,permissions:X}})}async appendLocalPermissionRule(q,z={}){await this.appendPermissionRule(q,{...z,scope:"local"})}async appendLocalPermissionDenyRule(q,z={}){await this.appendPermissionDenyRule(q,{...z,scope:"local"})}async removePluginSetting(q,z={}){let H=z.scope??"local",J=this.resolveFilePath("settings",H,z.projectDir);await this.flushTargetWithModifier(J,(K)=>{let M={...K.enabledPlugins??{}};delete M[q];let Q={...K};if(Object.keys(M).length>0)Q.enabledPlugins=M;else delete Q.enabledPlugins;return Q})}validatePersistableFields(q){for(let z of Object.keys(q)){let H=Z[z];if(!H)throw Error(`Unknown config field: ${z}`);if(!H.persistable)throw Error(`Field "${z}" is non-persistable and cannot be saved to config files. Non-persistable fields are runtime-only and only valid for the current session.`)}}groupUpdatesByTarget(q,z,H){let J=new Map;for(let[K,M]of Object.entries(q)){let Q=Z[K];if(!Q)continue;let X=z??Q.defaultScope,Y=this.resolveFilePath(Q.target,X,H);if(!J.has(Y))J.set(Y,{});J.get(Y)[K]=M}return J}resolveFilePath(q,z,H){let J=H??G();if(q==="config")return z==="global"?W.join(b.homedir(),".blade","config.json"):W.join(J,".blade","config.json");switch(z){case"local":return W.join(J,".blade","settings.local.json");case"project":return W.join(J,".blade","settings.json");case"global":return W.join(b.homedir(),".blade","settings.json");default:return W.join(J,".blade","settings.local.json")}}scheduleSave(q,z){let H=this.pendingUpdates.get(q)??{},J=this.mergePendingUpdates(H,z);this.pendingUpdates.set(q,J);let K=this.timers.get(q);if(K)clearTimeout(K);let M=setTimeout(async()=>{let Q=this.pendingUpdates.get(q);if(Q){this.pendingUpdates.delete(q),this.timers.delete(q);try{await this.flushTarget(q,Q),this.lastSaveError=null}catch(X){let Y=X instanceof Error?X:Error(String(X));this.lastSaveError=Y,B.error(`Failed to save config to ${q}:`,Y.message),B.error("Stack trace:",Y.stack)}}},this.debounceDelay);this.timers.set(q,M)}mergePendingUpdates(q,z){let H={...q};for(let[J,K]of Object.entries(z)){let M=Z[J];if(!M){H[J]=K;continue}switch(M.mergeStrategy){case"replace":H[J]=K;break;case"append-dedupe":this.applyAppendDedupe(H,J,K);break;case"deep-merge":this.applyDeepMerge(H,J,K);break}}return H}async flushTarget(q,z){let H=this.fileLocks.get(q);if(!H)H=new j,this.fileLocks.set(q,H);await H.runExclusive(async()=>{await this.performWrite(q,z)})}async flushTargetWithModifier(q,z){let H=this.fileLocks.get(q);if(!H)H=new j,this.fileLocks.set(q,H);await H.runExclusive(async()=>{await $.mkdir(W.dirname(q),{recursive:!0,mode:493});let J={};try{let M=await $.readFile(q,"utf-8");J=JSON.parse(M)}catch{J={}}let K=z(J);await this.atomicWrite(q,K)})}async performWrite(q,z){await $.mkdir(W.dirname(q),{recursive:!0,mode:493});let H={};try{let K=await $.readFile(q,"utf-8");H=JSON.parse(K)}catch{H={}}let J={...H};for(let[K,M]of Object.entries(z)){let Q=Z[K];if(!Q){J[K]=M;continue}switch(Q.mergeStrategy){case"replace":J[K]=M;break;case"append-dedupe":this.applyAppendDedupe(J,K,M);break;case"deep-merge":this.applyDeepMerge(J,K,M);break}}await this.atomicWrite(q,J)}applyAppendDedupe(q,z,H){if(z==="permissions"&&typeof H==="object"&&H!==null){let J=q[z]??{allow:[],ask:[],deny:[]},K=H;q[z]={allow:this.dedupeArray([...J.allow||[],...K.allow||[]]),ask:this.dedupeArray([...J.ask||[],...K.ask||[]]),deny:this.dedupeArray([...J.deny||[],...K.deny||[]])}}else if(Array.isArray(H)){let J=Array.isArray(q[z])?q[z]:[];q[z]=this.dedupeArray([...J,...H])}else q[z]=H}applyDeepMerge(q,z,H){if(typeof H==="object"&&H!==null&&!Array.isArray(H)){let J=typeof q[z]==="object"&&q[z]!==null?q[z]:{};q[z]=N({},J,H)}else q[z]=H}dedupeArray(q){return Array.from(new Set(q))}async atomicWrite(q,z){await A(q,JSON.stringify(z,null,2),{mode:384,encoding:"utf-8"})}}function O(){return V.getInstance()}export{O as Mc};