blade-code 0.10.41 → 0.10.43

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 (110) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-qgez5vw6.js → chunk-0qsssahq.js} +1 -1
  3. package/dist/{chunk-5ygv33qe.js → chunk-26wse17p.js} +2 -2
  4. package/dist/{chunk-eg5sz4bw.js → chunk-2eddqgnh.js} +1 -1
  5. package/dist/{chunk-01jt0mpr.js → chunk-2yvte5a7.js} +1 -1
  6. package/dist/chunk-32g59k4p.js +8 -0
  7. package/dist/{chunk-q87nwpsb.js → chunk-372mmzj3.js} +1 -1
  8. package/dist/{chunk-2bm55evt.js → chunk-3bpxvanm.js} +2 -2
  9. package/dist/chunk-3y784b9c.js +1 -0
  10. package/dist/{chunk-bdxaz350.js → chunk-56qew7w0.js} +2 -2
  11. package/dist/chunk-5wzjdfde.js +1 -0
  12. package/dist/chunk-6ch7a6xf.js +44 -0
  13. package/dist/chunk-6cx4t8r6.js +1 -0
  14. package/dist/chunk-6skymhz5.js +1 -0
  15. package/dist/{chunk-4ekrbk2w.js → chunk-7fqsgdee.js} +2 -2
  16. package/dist/{chunk-wvc6bx0t.js → chunk-7s5hw0gr.js} +7 -7
  17. package/dist/{chunk-gbbnjzy8.js → chunk-7sna3js9.js} +1 -1
  18. package/dist/chunk-8vsx6m43.js +10 -0
  19. package/dist/{chunk-t80e2bms.js → chunk-8vtyatd6.js} +1 -1
  20. package/dist/{chunk-0hqsdbkr.js → chunk-9rrced3b.js} +1 -1
  21. package/dist/chunk-ag5ea7ce.js +111 -0
  22. package/dist/{chunk-4mdy9d43.js → chunk-bct3s5vs.js} +1 -1
  23. package/dist/{chunk-5sbewyjn.js → chunk-bvf9syb2.js} +2 -2
  24. package/dist/chunk-c3020yav.js +22 -0
  25. package/dist/{chunk-wk0vpgwk.js → chunk-c8ddch38.js} +395 -395
  26. package/dist/{chunk-dp9xzsja.js → chunk-c9s4n31b.js} +1 -1
  27. package/dist/{chunk-tsskar00.js → chunk-cxzx7j0p.js} +1 -1
  28. package/dist/{chunk-sfbprf9r.js → chunk-d5x5wknc.js} +1 -1
  29. package/dist/{chunk-adgx9vd7.js → chunk-dcp5gg6q.js} +3 -3
  30. package/dist/{chunk-f4bx2n1y.js → chunk-e1vyznkn.js} +3 -3
  31. package/dist/chunk-egczvfsv.js +5 -0
  32. package/dist/{chunk-5zf8204m.js → chunk-f4sp074f.js} +1 -1
  33. package/dist/chunk-fer18bbe.js +1 -0
  34. package/dist/{chunk-fz55cnws.js → chunk-fhnkyqfb.js} +2 -2
  35. package/dist/{chunk-y30kw6gj.js → chunk-fk4wbmv6.js} +2 -2
  36. package/dist/chunk-fzqsea19.js +1 -0
  37. package/dist/{chunk-x04xb9g3.js → chunk-hcm55r3d.js} +1 -1
  38. package/dist/{chunk-22h5kh4z.js → chunk-hfrcwkc8.js} +1 -1
  39. package/dist/chunk-j7edwwg1.js +2 -0
  40. package/dist/{chunk-yhw0pvyt.js → chunk-jpz805fs.js} +2 -2
  41. package/dist/chunk-k87p7x1e.js +1 -0
  42. package/dist/{chunk-g9re8v25.js → chunk-kfpzrmq7.js} +1 -1
  43. package/dist/chunk-m8a2qj5c.js +1 -0
  44. package/dist/{chunk-b5b8fb9y.js → chunk-m8ss9rmx.js} +1 -1
  45. package/dist/{chunk-5cgyevqj.js → chunk-mrsc4a55.js} +1 -1
  46. package/dist/{chunk-xs7w13na.js → chunk-n7dvqbrc.js} +1 -1
  47. package/dist/{chunk-w07gb3h0.js → chunk-nsrghqdx.js} +1 -1
  48. package/dist/chunk-nwzjmcxq.js +1 -0
  49. package/dist/chunk-nynfqgsj.js +6 -0
  50. package/dist/chunk-pyk2ey7y.js +1 -0
  51. package/dist/{chunk-npgt73cg.js → chunk-q78s028m.js} +1 -1
  52. package/dist/{chunk-9neq5xrb.js → chunk-qb0sqh29.js} +2 -2
  53. package/dist/chunk-qmcj20g2.js +1 -0
  54. package/dist/chunk-qnxgzyyx.js +2 -0
  55. package/dist/{chunk-fxw1q5j5.js → chunk-qp2z1r7y.js} +1 -1
  56. package/dist/{chunk-djr17h80.js → chunk-rwjm6p0f.js} +1 -1
  57. package/dist/chunk-s9s9daak.js +1 -0
  58. package/dist/{chunk-8xfzbv9v.js → chunk-skb4h36j.js} +1 -1
  59. package/dist/{chunk-ens8nsge.js → chunk-sqd5ge5s.js} +1 -1
  60. package/dist/chunk-t2r7tqn0.js +2 -0
  61. package/dist/{chunk-n0ebpwxd.js → chunk-tpa75y39.js} +1 -1
  62. package/dist/chunk-txkrtgcd.js +2 -0
  63. package/dist/{chunk-3p32k12g.js → chunk-v9tzhe90.js} +2 -2
  64. package/dist/{chunk-358zaryv.js → chunk-vbpykrxd.js} +2 -2
  65. package/dist/{chunk-27w2k6t7.js → chunk-w5ayh9b8.js} +2 -2
  66. package/dist/{chunk-atsw605q.js → chunk-wwvb6znp.js} +1 -1
  67. package/dist/{chunk-yxwargqc.js → chunk-x2vqgssm.js} +2 -2
  68. package/dist/chunk-y6tkxqjx.js +2 -0
  69. package/dist/{chunk-nhzdkxnx.js → chunk-yk9pxkc1.js} +1 -1
  70. package/dist/{chunk-hjkdc185.js → chunk-yqy000kg.js} +2 -2
  71. package/dist/chunk-yt9qer14.js +1 -0
  72. package/dist/{chunk-6dma8han.js → chunk-yypnfmed.js} +2 -2
  73. package/dist/chunk-z1aqe7ms.js +1 -0
  74. package/dist/web/assets/{ChatView-BP89vdT_.js → ChatView-CyxiCTbL.js} +3 -3
  75. package/dist/web/assets/{CodeBlockHighlighter-UnjC3KVk.js → CodeBlockHighlighter-Bb3gIeQv.js} +1 -1
  76. package/dist/web/assets/{FilePreview-D0BiZowf.js → FilePreview-BXg9VaTv.js} +1 -1
  77. package/dist/web/assets/{MarkdownRenderer-CPu_rkPT.js → MarkdownRenderer-vxpqGt4L.js} +3 -3
  78. package/dist/web/assets/{SettingsModal-CM9pcJas.js → SettingsModal-4L1nPkh0.js} +1 -1
  79. package/dist/web/assets/{TaskSwitcher-BOCm7kPO.js → TaskSwitcher-DKSqTLK1.js} +1 -1
  80. package/dist/web/assets/{TerminalPanel-CUZ4slSS.js → TerminalPanel-Bv9PDclr.js} +1 -1
  81. package/dist/web/assets/index-Bz4W1-8a.js +11 -0
  82. package/dist/web/assets/{session-events-109FkhOM.js → session-events-DJh6SZcl.js} +5 -5
  83. package/dist/web/index.html +2 -2
  84. package/package.json +1 -1
  85. package/dist/chunk-1j2sf8mc.js +0 -1
  86. package/dist/chunk-1kwm2m6t.js +0 -1
  87. package/dist/chunk-5w8edqbt.js +0 -1
  88. package/dist/chunk-62jaf7ej.js +0 -22
  89. package/dist/chunk-6a3c496e.js +0 -1
  90. package/dist/chunk-6fe9kq17.js +0 -1
  91. package/dist/chunk-asnzpfzh.js +0 -10
  92. package/dist/chunk-atdeg922.js +0 -2
  93. package/dist/chunk-bw7fgs2n.js +0 -1
  94. package/dist/chunk-ck8sw2zp.js +0 -2
  95. package/dist/chunk-d61673v7.js +0 -5
  96. package/dist/chunk-f7y4m3y0.js +0 -1
  97. package/dist/chunk-fnz5g9ac.js +0 -1
  98. package/dist/chunk-kjn0yaqw.js +0 -1
  99. package/dist/chunk-m883e8d4.js +0 -1
  100. package/dist/chunk-mx5s93np.js +0 -6
  101. package/dist/chunk-nsawkccy.js +0 -2
  102. package/dist/chunk-p54vmne8.js +0 -1
  103. package/dist/chunk-qy9qkvwe.js +0 -1
  104. package/dist/chunk-s8f8amvg.js +0 -1
  105. package/dist/chunk-v80xem15.js +0 -2
  106. package/dist/chunk-w1vcjwbx.js +0 -8
  107. package/dist/chunk-x5s68axq.js +0 -44
  108. package/dist/chunk-z15h0370.js +0 -1
  109. package/dist/chunk-zracmha2.js +0 -111
  110. package/dist/web/assets/index-CthLsVgC.js +0 -11
package/dist/blade.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{ad as W}from"./chunk-hjkdc185.js";import{dd as F,ed as M}from"./chunk-y30kw6gj.js";import"./chunk-27w2k6t7.js";import"./chunk-v508x7cg.js";import"./chunk-atsw605q.js";import"./chunk-f4bx2n1y.js";import"./chunk-tsskar00.js";import"./chunk-x5s68axq.js";import"./chunk-gbbnjzy8.js";import"./chunk-b5b8fb9y.js";import"./chunk-atdeg922.js";import{Nf as N,Of as B}from"./chunk-g9re8v25.js";import"./chunk-nhzdkxnx.js";import{mg as T}from"./chunk-fz55cnws.js";import"./chunk-5ygv33qe.js";import"./chunk-x04xb9g3.js";import"./chunk-358zaryv.js";import"./chunk-5sbewyjn.js";import"./chunk-npgt73cg.js";import"./chunk-9neq5xrb.js";import{Sg as J}from"./chunk-22h5kh4z.js";import v from"node:path";var E=process.argv.slice(2),I=u(E),p=I!==null;if(I!==null)T.setGlobalDebug(I);function u(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 c(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 m(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 t(){if(c(E)){let{getVersion:K}=await import("./chunk-6a3c496e.js");console.log(K());return}let Q=process.cwd(),Y=F(Q);M(Y),N(B());let U=m(E,"--plugin-dir","--pluginDir");if(U.length>0){let{configureInvocationPluginDirs:K}=await import("./chunk-fnz5g9ac.js");K(U.map((Z)=>v.resolve(Q,Z)))}if(q(E,"--trust-workspace","--trustWorkspace")){let{WorkspaceTrustService:K}=await import("./chunk-m883e8d4.js");await K.getInstance().trust(B())}if(process.getuid&&process.getuid()===0){let K=!!process.env.SUDO_USER,Z=!!process.env.BLADE_ALLOW_ROOT;if(K&&!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:K}=await import("./chunk-w07gb3h0.js");if(await K())return}if(W(),q(E,"--print","-p")){let{handlePrintMode:K}=await import("./chunk-4mdy9d43.js");if(await K())return}if(E.includes("--acp")){let{runAcpIntegration:K}=await import("./chunk-62jaf7ej.js");await K();return}let[{default:X},{hideBin:G},{cliConfig:z,globalOptions:$},{loadConfiguration:_,validateOutput:D,validatePermissions:R},{doctorCommands:S},{installCommands:k},{mcpCommands:O},{projectsCommands:y},{scheduleCommands:b},{serveCommand:V},{updateCommands:P},{webCommand:x}]=await Promise.all([import("yargs"),import("yargs/helpers"),import("./chunk-qy9qkvwe.js"),import("./chunk-p54vmne8.js"),import("./chunk-2bm55evt.js"),import("./chunk-dp9xzsja.js"),import("./chunk-8xfzbv9v.js"),import("./chunk-eg5sz4bw.js"),import("./chunk-0hqsdbkr.js"),import("./chunk-1j2sf8mc.js"),import("./chunk-xs7w13na.js"),import("./chunk-asnzpfzh.js")]),A=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(b).command(S).command(P).command(k).command(x).command(V).completion("completion",!1).help("help","Show help").alias("help","h").alias("version","V").fail((K,Z,L)=>{if(Z){if(console.error("An error occurred:"),console.error(Z.message),p&&Z.stack)console.error(`
2
+ import{dd as W}from"./chunk-yqy000kg.js";import{gd as F,hd as M}from"./chunk-fk4wbmv6.js";import"./chunk-w5ayh9b8.js";import"./chunk-v508x7cg.js";import"./chunk-wwvb6znp.js";import"./chunk-e1vyznkn.js";import"./chunk-cxzx7j0p.js";import"./chunk-6ch7a6xf.js";import"./chunk-7sna3js9.js";import"./chunk-m8ss9rmx.js";import"./chunk-j7edwwg1.js";import{cg as N,dg as B}from"./chunk-kfpzrmq7.js";import"./chunk-yk9pxkc1.js";import{Dg as T}from"./chunk-fhnkyqfb.js";import"./chunk-26wse17p.js";import"./chunk-hcm55r3d.js";import"./chunk-vbpykrxd.js";import"./chunk-bvf9syb2.js";import"./chunk-q78s028m.js";import"./chunk-qb0sqh29.js";import{hh as J}from"./chunk-hfrcwkc8.js";import v from"node:path";var E=process.argv.slice(2),I=u(E),p=I!==null;if(I!==null)T.setGlobalDebug(I);function u(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 c(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 m(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 t(){if(c(E)){let{getVersion:K}=await import("./chunk-s9s9daak.js");console.log(K());return}let Q=process.cwd(),Y=F(Q);M(Y),N(B());let U=m(E,"--plugin-dir","--pluginDir");if(U.length>0){let{configureInvocationPluginDirs:K}=await import("./chunk-k87p7x1e.js");K(U.map((Z)=>v.resolve(Q,Z)))}if(q(E,"--trust-workspace","--trustWorkspace")){let{WorkspaceTrustService:K}=await import("./chunk-3y784b9c.js");await K.getInstance().trust(B())}if(process.getuid&&process.getuid()===0){let K=!!process.env.SUDO_USER,Z=!!process.env.BLADE_ALLOW_ROOT;if(K&&!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:K}=await import("./chunk-nsrghqdx.js");if(await K())return}if(W(),q(E,"--print","-p")){let{handlePrintMode:K}=await import("./chunk-bct3s5vs.js");if(await K())return}if(E.includes("--acp")){let{runAcpIntegration:K}=await import("./chunk-c3020yav.js");await K();return}let[{default:X},{hideBin:G},{cliConfig:z,globalOptions:$},{loadConfiguration:_,validateOutput:D,validatePermissions:R},{doctorCommands:S},{installCommands:k},{mcpCommands:O},{projectsCommands:y},{scheduleCommands:b},{serveCommand:V},{updateCommands:P},{webCommand:x}]=await Promise.all([import("yargs"),import("yargs/helpers"),import("./chunk-yt9qer14.js"),import("./chunk-6skymhz5.js"),import("./chunk-3bpxvanm.js"),import("./chunk-c9s4n31b.js"),import("./chunk-skb4h36j.js"),import("./chunk-2eddqgnh.js"),import("./chunk-9rrced3b.js"),import("./chunk-fzqsea19.js"),import("./chunk-n7dvqbrc.js"),import("./chunk-8vsx6m43.js")]),A=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(b).command(S).command(P).command(k).command(x).command(V).completion("completion",!1).help("help","Show help").alias("help","h").alias("version","V").fail((K,Z,L)=>{if(Z){if(console.error("An error occurred:"),console.error(Z.message),p&&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(K)console.error("Error: Invalid arguments:"),console.error(K),console.error(`
5
- Hint: Did you mean:`),L.showHelp(),process.exit(1)}).command("$0",!1,()=>{},async(K)=>{let Z=K._.slice(1),L=Z.length>0?Z.join(" "):void 0,h=import("./chunk-6fe9kq17.js").then(({checkVersionOnStartup:C})=>C()),[{render:w},{createElement:f},{AppWrapper:j}]=await Promise.all([import("ink"),import("react"),import("./chunk-djr17h80.js")]),H={...K,initialMessage:L,debug:K.debug,print:Boolean(K.print),versionCheckPromise:h};delete H._,delete H.$0,delete H.message,w(f(j,H),{patchConsole:!0,exitOnCtrlC:!1,alternateBuffer:!1})});try{await A.parse()}catch(K){console.error("Error: Parse error:",K),process.exit(1)}}if(J.main==J.module)t().catch(console.error);export{t as main};
5
+ Hint: Did you mean:`),L.showHelp(),process.exit(1)}).command("$0",!1,()=>{},async(K)=>{let Z=K._.slice(1),L=Z.length>0?Z.join(" "):void 0,h=import("./chunk-nwzjmcxq.js").then(({checkVersionOnStartup:C})=>C()),[{render:w},{createElement:f},{AppWrapper:j}]=await Promise.all([import("ink"),import("react"),import("./chunk-rwjm6p0f.js")]),H={...K,initialMessage:L,debug:K.debug,print:Boolean(K.print),versionCheckPromise:h};delete H._,delete H.$0,delete H.message,w(f(j,H),{patchConsole:!0,exitOnCtrlC:!1,alternateBuffer:!1})});try{await A.parse()}catch(K){console.error("Error: Parse error:",K),process.exit(1)}}if(J.main==J.module)t().catch(console.error);export{t as main};
@@ -1,2 +1,2 @@
1
1
  var f;((c)=>{c.ReadOnly="readonly";c.Write="write";c.Execute="execute"})(f||={});function g(b){return b!==void 0&&typeof b.pattern==="string"&&typeof b.search_path==="string"}function h(b){return b!==void 0&&b.kind==="edit"&&typeof b.matches_found==="number"}function j(b){return b==="readonly"}
2
- export{f as yc,g as zc,h as Ac,j as Bc};
2
+ export{f as Bc,g as Cc,h as Dc,j as Ec};
@@ -1,3 +1,3 @@
1
- import{vg as N,yg as M}from"./chunk-x04xb9g3.js";import{Qg as H}from"./chunk-9neq5xrb.js";import{createModels as _,createProvider as Y,envApiKeyAuth as x,getSupportedThinkingLevels as E}from"@earendil-works/pi-ai";import{anthropicMessagesApi as F}from"@earendil-works/pi-ai/api/anthropic-messages.lazy";import{openAICompletionsApi as U}from"@earendil-works/pi-ai/api/openai-completions.lazy";import{builtinProviders as P}from"@earendil-works/pi-ai/providers/all";var K=/^[a-z][a-z0-9._-]{0,63}$/,z=/^[A-Z_][A-Z0-9_]*$/,s=new Set(["openai-completions","anthropic-messages"]);function B(u){return typeof u==="string"&&s.has(u)}function X(u,$){let h=`modelProviders.${u}`,b=[];if(!K.test(u))b.push(`${h}: id must match ${K.source}`);if(!$.name?.trim())b.push(`${h}: name must not be empty`);if(!B($.wireApi))b.push(`${h}: wireApi must be openai-completions or anthropic-messages`);try{let w=new URL($.baseUrl);if(!["http:","https:"].includes(w.protocol))b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}catch{b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}if($.apiKeyEnv!==void 0&&!z.test($.apiKeyEnv))b.push(`${h}: apiKeyEnv must be a valid environment variable name`);if("apiKey"in $)b.push(`${h}: API keys must be stored separately in auth.json`);return b}function J(u,$){let h=$.trim().replace(/\/+$/,"");if(u==="anthropic-messages"&&/\/v1$/i.test(h))return h.slice(0,-3);return h}import{promises as Z}from"node:fs";import j from"node:path";import{Mutex as R}from"async-mutex";import T from"write-file-atomic";class Q{filePath;mutex=new R;constructor(u=j.join(H(),"auth.json")){this.filePath=u}async read(u){return(await this.readAll())[u]}async list(){let u=await this.readAll();return Object.entries(u).map(([$,h])=>({providerId:$,type:h.type}))}async modify(u,$){return this.mutex.runExclusive(async()=>{let h=await this.readAll(),b=h[u],w=await $(b);if(w===void 0)return b;return h[u]=w,await this.writeAll(h),w})}async delete(u){await this.mutex.runExclusive(async()=>{let $=await this.readAll();if(!(u in $))return;delete $[u],await this.writeAll($)})}async readAll(){try{let u=await Z.readFile(this.filePath,"utf8"),$=JSON.parse(u);return $&&typeof $==="object"&&!Array.isArray($)?$:{}}catch(u){if(u.code==="ENOENT")return{};throw u}}async writeAll(u){let $=j.dirname(this.filePath);await Z.mkdir($,{recursive:!0,mode:448}),await Z.chmod($,448),await T(this.filePath,`${JSON.stringify(u,null,2)}
1
+ import{Mg as N,Pg as M}from"./chunk-hcm55r3d.js";import{fh as H}from"./chunk-qb0sqh29.js";import{createModels as _,createProvider as Y,envApiKeyAuth as x,getSupportedThinkingLevels as E}from"@earendil-works/pi-ai";import{anthropicMessagesApi as F}from"@earendil-works/pi-ai/api/anthropic-messages.lazy";import{openAICompletionsApi as U}from"@earendil-works/pi-ai/api/openai-completions.lazy";import{builtinProviders as P}from"@earendil-works/pi-ai/providers/all";var K=/^[a-z][a-z0-9._-]{0,63}$/,z=/^[A-Z_][A-Z0-9_]*$/,s=new Set(["openai-completions","anthropic-messages"]);function B(u){return typeof u==="string"&&s.has(u)}function X(u,$){let h=`modelProviders.${u}`,b=[];if(!K.test(u))b.push(`${h}: id must match ${K.source}`);if(!$.name?.trim())b.push(`${h}: name must not be empty`);if(!B($.wireApi))b.push(`${h}: wireApi must be openai-completions or anthropic-messages`);try{let w=new URL($.baseUrl);if(!["http:","https:"].includes(w.protocol))b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}catch{b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}if($.apiKeyEnv!==void 0&&!z.test($.apiKeyEnv))b.push(`${h}: apiKeyEnv must be a valid environment variable name`);if("apiKey"in $)b.push(`${h}: API keys must be stored separately in auth.json`);return b}function J(u,$){let h=$.trim().replace(/\/+$/,"");if(u==="anthropic-messages"&&/\/v1$/i.test(h))return h.slice(0,-3);return h}import{promises as Z}from"node:fs";import j from"node:path";import{Mutex as R}from"async-mutex";import T from"write-file-atomic";class Q{filePath;mutex=new R;constructor(u=j.join(H(),"auth.json")){this.filePath=u}async read(u){return(await this.readAll())[u]}async list(){let u=await this.readAll();return Object.entries(u).map(([$,h])=>({providerId:$,type:h.type}))}async modify(u,$){return this.mutex.runExclusive(async()=>{let h=await this.readAll(),b=h[u],w=await $(b);if(w===void 0)return b;return h[u]=w,await this.writeAll(h),w})}async delete(u){await this.mutex.runExclusive(async()=>{let $=await this.readAll();if(!(u in $))return;delete $[u],await this.writeAll($)})}async readAll(){try{let u=await Z.readFile(this.filePath,"utf8"),$=JSON.parse(u);return $&&typeof $==="object"&&!Array.isArray($)?$:{}}catch(u){if(u.code==="ENOENT")return{};throw u}}async writeAll(u){let $=j.dirname(this.filePath);await Z.mkdir($,{recursive:!0,mode:448}),await Z.chmod($,448),await T(this.filePath,`${JSON.stringify(u,null,2)}
2
2
  `,{mode:384}),await Z.chmod(this.filePath,384)}}var q="openai-compatible",G="anthropic-compatible",D="https://api.openai.com/v1",V="https://api.anthropic.com",A=128000,C=32768,t={input:0,output:0,cacheRead:0,cacheWrite:0},f=["openai","anthropic","deepseek","google","moonshotai","moonshotai-cn","zai","zai-coding-cn"];class L{credentials;models;compatibleModels=new Map;anthropicCompatibleModels=new Map;customProviderConfigs=new Map;customProviderModels=new Map;reservedProviderIds=new Set;constructor(u=new Q){this.credentials=u,this.models=_({credentials:u});for(let $ of P())this.models.setProvider($);this.installOpenAICompatibleProvider(),this.installAnthropicCompatibleProvider();for(let $ of this.models.getProviders())this.reservedProviderIds.add($.id)}async listProviders(){return Promise.all(this.models.getProviders().map(async(u)=>{let $=u.getModels(),h=this.customProviderConfigs.get(u.id),b=this.getFactoryWireApi(u.id);return{id:u.id,name:u.name,modelCount:$.length,defaultBaseUrl:u.baseUrl??$[0]?.baseUrl,supportsApiKey:Boolean(u.auth.apiKey),supportsOAuth:Boolean(u.auth.oauth),configured:b?!1:Boolean(await this.models.checkAuth(u.id)),custom:Boolean(h),factoryWireApi:b,wireApi:h?.wireApi,apiKeyEnv:h?.apiKeyEnv}}))}listModels(u){return this.models.getModels(u).map(($)=>this.toCatalogEntry($))}getModel(u,$){let h=this.models.getModel(u,$);if(!h&&u===q)this.registerOpenAICompatibleModel($),h=this.models.getModel(u,$);if(!h&&u===G)this.registerAnthropicCompatibleModel($),h=this.models.getModel(u,$);if(!h&&this.customProviderConfigs.has(u))this.registerCustomProviderModel(u,$),h=this.models.getModel(u,$);if(!h)throw Error(`Unknown pi-ai model: ${u}/${$}`);return h}resolveConfig(u){let $=this.getModel(u.provider,u.model),h=u.overrides;return{...$,...h?.baseUrl?{baseUrl:J($.api,h.baseUrl)}:{},...h?.maxOutputTokens?{maxTokens:h.maxOutputTokens}:{}}}async setApiKey(u,$){this.requireProvider(u),await this.credentials.modify(u,async()=>({type:"api_key",key:$}))}async clearCredential(u){this.requireProvider(u),await this.credentials.delete(u)}async isConfigured(u){return this.requireProvider(u),Boolean(await this.models.checkAuth(u))}isReservedProviderId(u){return this.reservedProviderIds.has(u)}configureModelProviders(u,$){for(let h of this.customProviderConfigs.keys())this.models.deleteProvider(h);this.customProviderConfigs.clear(),this.customProviderModels.clear();for(let[h,b]of Object.entries(u)){let w=$.filter((k)=>k.provider===h).map((k)=>k.model);this.registerModelProvider(h,b,w)}}registerModelProvider(u,$,h=[]){if(this.isReservedProviderId(u))throw Error(`modelProviders.${u}: built-in provider ids cannot be overridden`);let b=X(u,$);if(b.length>0)throw Error(b.join("; "));let w={...$,name:$.name.trim(),baseUrl:J($.wireApi,$.baseUrl),...$.apiKeyEnv?{apiKeyEnv:$.apiKeyEnv.trim()}:{}};this.customProviderConfigs.set(u,w);let k=new Map;for(let y of new Set(h)){let W=y.trim();if(!W)continue;k.set(W,this.createCompatibleModel(u,W,w.wireApi,w.baseUrl))}this.customProviderModels.set(u,k),this.installCustomProvider(u)}unregisterModelProvider(u){if(!this.customProviderConfigs.has(u))return;this.customProviderConfigs.delete(u),this.customProviderModels.delete(u),this.models.deleteProvider(u)}requireProvider(u){if(!this.models.getProvider(u))throw Error(`Unknown pi-ai provider: ${u}`)}registerOpenAICompatibleModel(u){let $=u.trim();if(!$)throw Error("OpenAI-compatible model ID must not be empty");if(this.compatibleModels.has($))return;let h=this.createCompatibleModel(q,$,"openai-completions",D);this.compatibleModels.set($,h),this.installOpenAICompatibleProvider()}registerAnthropicCompatibleModel(u){let $=u.trim();if(!$)throw Error("Anthropic-compatible model ID must not be empty");if(this.anthropicCompatibleModels.has($))return;let h=this.createCompatibleModel(G,$,"anthropic-messages",V);this.anthropicCompatibleModels.set($,h),this.installAnthropicCompatibleProvider()}registerCustomProviderModel(u,$){let h=$.trim();if(!h)throw Error("Custom provider model ID must not be empty");let b=this.customProviderConfigs.get(u),w=this.customProviderModels.get(u);if(!b||!w||w.has(h))return;w.set(h,this.createCompatibleModel(u,h,b.wireApi,b.baseUrl)),this.installCustomProvider(u)}createCompatibleModel(u,$,h,b){let w=this.models.getModels().filter((y)=>y.provider!==u&&!this.customProviderConfigs.has(y.provider)&&y.id===$),k=f.flatMap((y)=>w.filter((W)=>W.provider===y))[0]??w[0];return{id:$,name:k?.name??$,api:h,provider:u,baseUrl:b,reasoning:k?.reasoning??!1,input:k?[...k.input]:["text"],cost:{...t},contextWindow:k?.contextWindow??A,maxTokens:k?.maxTokens??C,...k?.thinkingLevelMap?{thinkingLevelMap:{...k.thinkingLevelMap}}:{}}}installOpenAICompatibleProvider(){this.models.setProvider(Y({id:q,name:"Custom OpenAI Endpoint",baseUrl:D,auth:{apiKey:x("OpenAI-compatible API key",["OPENAI_COMPATIBLE_API_KEY","BLADE_API_KEY"])},models:[...this.compatibleModels.values()],api:U()}))}installAnthropicCompatibleProvider(){this.models.setProvider(Y({id:G,name:"Custom Anthropic Endpoint",baseUrl:V,auth:{apiKey:x("Anthropic-compatible API key",["ANTHROPIC_API_KEY","BLADE_API_KEY"])},models:[...this.anthropicCompatibleModels.values()],api:F()}))}installCustomProvider(u){let $=this.customProviderConfigs.get(u),h=this.customProviderModels.get(u);if(!$||!h)return;let b=$.apiKeyEnv?[$.apiKeyEnv]:[];this.models.setProvider(Y({id:u,name:$.name,baseUrl:$.baseUrl,auth:{apiKey:x(`${$.name} API key`,b)},models:[...h.values()],api:$.wireApi==="anthropic-messages"?F():U()}))}getFactoryWireApi(u){if(u===q)return"openai-completions";if(u===G)return"anthropic-messages";return}toCatalogEntry(u){return{id:u.id,name:u.name,provider:u.provider,api:u.api,baseUrl:u.baseUrl,reasoning:u.reasoning,supportedReasoningEfforts:E(u),supportedServiceTiers:M(u),supportedResponseVerbosities:N(u),input:[...u.input],contextWindow:u.contextWindow,maxTokens:u.maxTokens,cost:{...u.cost}}}}var S;function hu(){return S??=new L,S}
3
- export{K as pg,X as qg,J as rg,L as sg,hu as tg};
3
+ export{K as Gg,X as Hg,J as Ig,L as Jg,hu as Kg};
@@ -1,3 +1,3 @@
1
- import{l as i}from"./chunk-5zf8204m.js";import{Of as s}from"./chunk-g9re8v25.js";import"./chunk-9neq5xrb.js";import"./chunk-22h5kh4z.js";import m from"node:path";var r={registry:i,currentWorkspace:s,inputCwd:()=>process.cwd(),write:console.log};function c(t,e){return m.resolve(e.inputCwd(),t)}function p(t){return t.map((e)=>{let o=e.isCurrent?"*":" ",n=e.gitBranch?` · ${e.gitBranch}`:"",d=e.available?"":" · unavailable";return`${o} ${e.name}${n}${d}
1
+ import{l as i}from"./chunk-f4sp074f.js";import{dg as s}from"./chunk-kfpzrmq7.js";import"./chunk-qb0sqh29.js";import"./chunk-hfrcwkc8.js";import m from"node:path";var r={registry:i,currentWorkspace:s,inputCwd:()=>process.cwd(),write:console.log};function c(t,e){return m.resolve(e.inputCwd(),t)}function p(t){return t.map((e)=>{let o=e.isCurrent?"*":" ",n=e.gitBranch?` · ${e.gitBranch}`:"",d=e.available?"":" · unavailable";return`${o} ${e.name}${n}${d}
2
2
  ${e.path}`}).join(`
3
3
  `)}async function l(t,e=r){let o=await e.registry.list(e.currentWorkspace());return e.write(t.json?JSON.stringify(o,null,2):p(o)),o}async function u(t,e=r){let o=await e.registry.bind(c(t.path,e),e.currentWorkspace());return e.write(t.json?JSON.stringify(o,null,2):`Bound project: ${o.path}`),o}async function j(t,e=r){let o=c(t.path,e),n=await e.registry.unbind(o);return e.write(t.json?JSON.stringify({path:o,removed:n},null,2):n?`Unbound project: ${o}`:`Project was not bound: ${o}`),n}var a={type:"boolean",default:!1,describe:"Print machine-readable JSON"},P={command:"list",aliases:["ls"],describe:"List bound projects",builder:(t)=>t.option("json",a),handler:async(t)=>{await l(t)}},b={command:"add <path>",aliases:["bind"],describe:"Bind a project folder",builder:(t)=>t.positional("path",{type:"string",demandOption:!0,describe:"Absolute or relative project folder"}).option("json",a),handler:async(t)=>{await u(t)}},h={command:"remove <path>",aliases:["rm","unbind"],describe:"Unbind a project folder",builder:(t)=>t.positional("path",{type:"string",demandOption:!0,describe:"Absolute or relative project folder"}).option("json",a),handler:async(t)=>{await j(t)}},y={command:"projects",aliases:["project"],describe:"Manage project bindings shared with Blade Web",builder:(t)=>t.command(P).command(b).command(h).demandCommand(1,"Choose list, add, or remove"),handler:()=>{return}};export{j as runProjectsRemove,l as runProjectsList,u as runProjectsAdd,y as projectsCommands,p as formatProjectList};
@@ -15,4 +15,4 @@ More specific user instructions about presentation take precedence for that resp
15
15
  <communication_style>
16
16
  ${h.prompt}
17
17
  </communication_style>`}
18
- export{R as xe,z as ye,H as ze,W as Ae,Z as Be};
18
+ export{R as Be,z as Ce,H as De,W as Ee,Z as Fe};
@@ -0,0 +1,8 @@
1
+ import{j as Q4,k as X4}from"./chunk-8vtyatd6.js";import{l as o$}from"./chunk-f4sp074f.js";import{s as J$,t as y1}from"./chunk-qnxgzyyx.js";import{u as d0}from"./chunk-x2vqgssm.js";import{A as dO,v as j1,w as vO,x as uO,y as pO,z as r0}from"./chunk-txkrtgcd.js";import{$ as t1,C as B4,F as T1,G as X$,H as LO,I as l$,J as VO,K as q0,L as NO,M as e0,N as w$,Q as C$,R as j$,T as b1,U as q1,V as C1,W as c1,X as i1,Y as a1,Z as o1,_ as n1,aa as r1,ba as s1,ca as e1,da as Y4,ga as S4,la as L4}from"./chunk-c8ddch38.js";import{oa as $1,ua as U0}from"./chunk-7s5hw0gr.js";import{Aa as M4,Ba as I1,Ca as k1,Da as E4,Ea as wO,Fa as T4,Ga as i0,Ha as K4,Ia as V4,Ja as N4,Ka as P1,La as S1,Ma as f1,Na as mO,Oa as RO,wa as $O,za as A4}from"./chunk-y6tkxqjx.js";import{Va as S0,Wa as v,Ya as q,Za as R1,lb as KO,ub as l0}from"./chunk-dcp5gg6q.js";import{Db as B1}from"./chunk-mrsc4a55.js";import{Ac as j,Wb as L1,Yb as c$,cc as b$,dc as UO,ec as q$,gc as w1,mc as A1,nc as M1,pc as x$,sc as QO,xc as E1,yc as XO,zc as zO}from"./chunk-ag5ea7ce.js";import{Bd as x1,Id as w0,xd as J0}from"./chunk-w5ayh9b8.js";import{Jd as YO}from"./chunk-wwvb6znp.js";import{Xd as H1}from"./chunk-qp2z1r7y.js";import{Zd as d$}from"./chunk-jpz805fs.js";import{ge as U4,he as F4,ke as l1,oe as B$,pe as L$,te as _0}from"./chunk-yypnfmed.js";import{De as Y1,Ee as _1}from"./chunk-2yvte5a7.js";import{Ie as tO,Je as $$}from"./chunk-e1vyznkn.js";import{$e as eO,Lf as rO,Qf as _$,tf as U1,wf as F1,yf as D1}from"./chunk-6ch7a6xf.js";import{Tf as g,Vf as F,Yf as W0}from"./chunk-m8ss9rmx.js";import{_f as i$}from"./chunk-j7edwwg1.js";import{dg as i}from"./chunk-kfpzrmq7.js";import{Eg as a}from"./chunk-fhnkyqfb.js";import{Kg as p0}from"./chunk-26wse17p.js";import{Mg as J1,Ng as G1,Pg as Z1,Qg as W1}from"./chunk-hcm55r3d.js";import{Sg as s0}from"./chunk-vbpykrxd.js";import{Xg as TO}from"./chunk-bvf9syb2.js";import{ah as v$,eh as cO}from"./chunk-qb0sqh29.js";import{hh as AO}from"./chunk-hfrcwkc8.js";var v5={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 u5($){return{port:$.port??0,hostname:$.hostname??"127.0.0.1",cors:$.cors??[]}}import{existsSync as bO,readFileSync as P$}from"node:fs";import{createServer as H5}from"node:http";import{networkInterfaces as _5}from"node:os";import{dirname as B5,extname as L5,join as h0}from"node:path";import{fileURLToPath as w5}from"node:url";import{brotliCompressSync as A5,gzipSync as M5,constants as E5}from"node:zlib";import{Hono as T5}from"hono";import{cors as R5}from"hono/cors";import{WebSocketServer as b5}from"ws";var t0=a("Service"),d4=30000,l4=new Set(["completed","failed","cancelled","interrupted"]);class OO{dispatch;store;tickMs;timer;unsubscribeBus;ticking=!1;inFlight=new Set;constructor($){this.dispatch=$.dispatch,this.store=$.store??mO.getInstance(),this.tickMs=$.tickMs??d4}start(){if(this.timer)return;t0.info("[TaskScheduler] Starting scheduler tick loop"),this.timer=setInterval(()=>{this.tick()},this.tickMs),this.timer.unref?.(),this.unsubscribeBus=q.subscribe(($)=>{if($.type!=="task.status")return;let O=$.properties.taskStatus;if(typeof O!=="string"||!l4.has(O))return;this.recordTerminalStatus($.sessionId,O,typeof $.properties.taskStatusReason==="string"?$.properties.taskStatusReason:void 0)}),this.tick()}stop(){if(this.timer)clearInterval(this.timer),this.timer=void 0,this.unsubscribeBus?.(),this.unsubscribeBus=void 0,t0.info("[TaskScheduler] Stopped scheduler tick loop")}async tick($=new Date){if(this.ticking)return;this.ticking=!0;try{let O=await this.store.list();for(let J of O)await this.evaluate(J,$)}catch(O){t0.warn("[TaskScheduler] Tick failed:",O)}finally{this.ticking=!1}}async evaluate($,O){if(!$.enabled)return;if(this.inFlight.has($.id))return;if($.expiresAt&&new Date($.expiresAt).getTime()<=O.getTime()){await this.store.update($.id,{enabled:!1,nextRunAt:null}),t0.info(`[TaskScheduler] Schedule ${$.id} expired; disabled`);return}if(!$.nextRunAt)return;if(!(new Date($.nextRunAt).getTime()<=O.getTime()))return;await this.fire($,O)}async fire($,O=new Date,J={}){if(this.inFlight.has($.id))throw Error(`Schedule ${$.id} is already dispatching`);this.inFlight.add($.id);let Z=O.toISOString();try{let x=await this.dispatch({prompt:$.prompt,title:$.title??c4($),sourceProjectPath:$.projectPath,isolation:$.dispatch.isolation??"worktree",permissionMode:$.dispatch.permissionMode??"default",modelId:$.dispatch.modelId,reasoningEffort:$.dispatch.reasoningEffort,serviceTier:$.dispatch.serviceTier,responseVerbosity:$.dispatch.responseVerbosity,communicationStyle:$.dispatch.communicationStyle}),z=$.trigger.kind==="once"?null:J.manual?$.nextRunAt?new Date($.nextRunAt):null:$O($.trigger,O,O);await this.store.update($.id,{lastRunAt:Z,lastRunSessionId:x.session.sessionId,lastStatus:x.status,lastError:void 0,runCount:$.runCount+1,nextRunAt:z?z.toISOString():null,enabled:$.trigger.kind==="once"?!1:$.enabled}),q.publish({sessionId:x.session.sessionId,projectPath:$.projectPath},"schedule.fired",{scheduleId:$.id,firedAt:Z,sessionId:x.session.sessionId,runId:x.runId,status:x.status}),t0.info(`[TaskScheduler] Fired schedule ${$.id} -> session ${x.session.sessionId} (${x.status})`)}catch(x){let z=x instanceof Error?x.message:String(x);t0.warn(`[TaskScheduler] Schedule ${$.id} dispatch failed:`,x);let X=$.trigger.kind==="once"?null:J.manual?$.nextRunAt?new Date($.nextRunAt):null:$O($.trigger,O,O);await this.store.update($.id,{lastRunAt:Z,lastStatus:"error",lastError:z,nextRunAt:X?X.toISOString():null,enabled:$.trigger.kind==="once"?!1:$.enabled})}finally{this.inFlight.delete($.id)}}async recordTerminalStatus($,O,J){let x=(await this.store.list()).find((z)=>z.lastRunSessionId===$);if(!x)return;await this.store.update(x.id,{lastStatus:O,...J?{lastError:J}:{lastError:void 0}})}}function c4($){return`Scheduled: ${$.prompt.trim().replace(/\s+/g," ").slice(0,60)}`}class Z0 extends Error{code;statusCode;details;constructor($,O,J=500,Z){super(O);this.code=$;this.statusCode=J;this.details=Z;this.name="BladeServerError"}toObject(){return{error:{code:this.code,message:this.message,...this.details?{details:this.details}:{}}}}}class m extends Z0{constructor($,O){super("NOT_FOUND",O?`${$} not found: ${O}`:`${$} not found`,404)}}class L extends Z0{constructor($){super("BAD_REQUEST",$,400)}}class C extends Z0{constructor($){super("CONFLICT",$,409)}}class v0 extends Z0{constructor($,O){super("TOO_MANY_REQUESTS",$,429,O)}}class u0 extends Z0{constructor($="Server is shutting down"){super("SERVICE_UNAVAILABLE",$,503)}}class L0 extends Z0{constructor(){super("AMBIGUOUS_SESSION","Multiple workspaces contain this session ID; projectPath is required",409)}}class e extends Z0{constructor($="Internal server error"){super("INTERNAL_ERROR",$,500)}}var n5=F.Object({error:F.Object({code:F.String(),message:F.String(),details:F.Optional(F.Record(F.String(),F.Unknown()))})});import{Hono as i4}from"hono";var JO=a("Service"),a4=F.Object({updates:F.Record(F.String(),F.Any()),options:F.Optional(F.Object({scope:F.Optional(W0(["local","project","global"])),immediate:F.Optional(F.Boolean())}))});function o4($){return{currentModelId:$.currentModelId,permissionMode:$.permissionMode,language:$.language,codeTheme:$.codeTheme,uiTheme:$.uiTheme,autoSaveSessions:$.autoSaveSessions,notifyBuild:$.notifyBuild,notifyErrors:$.notifyErrors,notifySounds:$.notifySounds,privacyTelemetry:$.privacyTelemetry,privacyCrash:$.privacyCrash,communicationStyle:$.communicationStyle,maxConcurrentTasks:$.maxConcurrentTasks,maxQueuedTasks:$.maxQueuedTasks,maxQueuedTaskBytes:$.maxQueuedTaskBytes,maxResidentSessionRuntimes:$.maxResidentSessionRuntimes,sessionRuntimeIdleMs:$.sessionRuntimeIdleMs}}var hO=()=>{let $=new i4;return $.get("/",async(O)=>{try{let J=J0();return O.json(J?o4(J):{})}catch(J){return JO.error("[ConfigRoutes] Failed to get config:",J),O.json({})}}),$.put("/",async(O)=>{try{let J=await O.req.json(),Z=g(a4,J);if(!Z.success)throw new L("Invalid config update format");let{updates:x,options:z}=Z.data;return await w0().updateConfig(x,z),O.json({success:!0,updates:x})}catch(J){throw JO.error("[ConfigRoutes] Failed to update config:",J),J}}),$.get("/permissions",async(O)=>{try{let J=J0();return O.json(J?.permissions||{})}catch(J){return JO.error("[ConfigRoutes] Failed to get permissions:",J),O.json({})}}),$};import{Hono as n4}from"hono";import{streamSSE as t4}from"hono/streaming";function gO($){let O="";if($.id!==void 0)O+=`id: ${$.id}
2
+ `;if($.event!==void 0)O+=`event: ${$.event}
3
+ `;for(let J of $.data.split(/\r\n|\r|\n/))O+=`data: ${J}
4
+ `;if($.retry!==void 0)O+=`retry: ${$.retry}
5
+ `;return O+=`
6
+ `,Buffer.byteLength(O)}class D${serial;buffered=[];bufferedBytes=0;nextOrder=0;phase="buffering";highestDeliveredSequence=0;highestReplaySequence=0;failure;maxPendingItems;maxPendingBytes;constructor($){this.maxPendingItems=$.maxPendingItems??vO,this.maxPendingBytes=$.maxPendingBytes??uO,this.serial=new dO({maxPendingItems:this.maxPendingItems,maxPendingBytes:this.maxPendingBytes,writeTimeoutMs:$.writeTimeoutMs??pO,sizeOf:gO,write:$.write,onFailure:(O)=>{this.failure=O,this.phase="closed",this.buffered.length=0,this.bufferedBytes=0,$.onFailure?.(O)}})}async writeInitial($){await this.offerDirect($)}observe($,O){if(this.phase==="closed")return;if(this.phase==="buffering"){this.buffer($,O);return}this.offerLive($,O)}async writeReplay($,O){if(!Number.isSafeInteger(O)||O<=0)throw this.fail(new r0("invalid_size","SSE committed sequence must be a positive safe integer")),this.currentFailure();if(O<=this.highestReplaySequence)return;await this.offerDirect($),this.highestReplaySequence=O,this.highestDeliveredSequence=O}finishInitialization($){if(this.phase!=="buffering")return;let O=this.buffered.splice(0);this.bufferedBytes=0,this.phase="live";let J=$.replayed?O.filter((x)=>x.sequence!==void 0&&x.sequence>this.highestReplaySequence).sort((x,z)=>x.sequence-z.sequence||x.order-z.order):O.sort((x,z)=>x.order-z.order),Z;for(let x of J){if($.replayed&&x.sequence!==void 0&&x.sequence===Z)continue;if(this.offerLive(x.message,x.sequence),this.serial.stats().closed)return;Z=x.sequence}}offerHeartbeat($){if(this.phase!=="live"||this.buffered.length>0||this.serial.stats().pendingItems>0)return!1;return this.offerLive($),!this.serial.stats().closed}async flush(){await this.serial.flush()}close($){if(this.phase==="closed")return;this.phase="closed",this.buffered.length=0,this.bufferedBytes=0,this.serial.close($)}stats(){let $=this.serial.stats();return{closed:this.phase==="closed",pendingItems:$.pendingItems+this.buffered.length,pendingBytes:$.pendingBytes+this.bufferedBytes,bufferedItems:this.buffered.length,bufferedBytes:this.bufferedBytes}}buffer($,O){let J=gO($),Z=this.serial.stats();if(J>this.maxPendingBytes){this.fail(new r0("oversized",`SSE frame requires ${J} bytes; limit is ${this.maxPendingBytes}`,{pendingItems:Z.pendingItems+this.buffered.length,pendingBytes:Z.pendingBytes+this.bufferedBytes}));return}if(Z.pendingItems+this.buffered.length>=this.maxPendingItems||Z.pendingBytes+this.bufferedBytes+J>this.maxPendingBytes){this.fail(new r0("overflow","SSE initialization buffer limit exceeded",{pendingItems:Z.pendingItems+this.buffered.length,pendingBytes:Z.pendingBytes+this.bufferedBytes}));return}this.nextOrder+=1,this.buffered.push({message:$,bytes:J,sequence:O,order:this.nextOrder}),this.bufferedBytes+=J}offerLive($,O){if(O!==void 0){if(O<=this.highestReplaySequence)return;if(O<=this.highestDeliveredSequence){this.fail(new r0("write_failed","SSE committed sequence regressed"));return}this.highestDeliveredSequence=O}if(!this.serial.offer($).accepted)this.phase="closed"}async offerDirect($){if(this.phase==="closed")throw this.currentFailure();let O=this.serial.offer($);if(!O.accepted)throw this.phase="closed",O.error;await O.completion}fail($){this.serial.close($)}currentFailure(){return this.failure??new r0("closed","SSE egress is closed")}}var r4=15000,s4=a("Service"),e4=new Set(["task.status","task.delivery","session.created","session.updated","session.deleted","schedule.fired","permission.asked","question.required","elicitation.required","interaction.resolved"]),$2=new Set(["queued","running","completed","failed","cancelled","interrupted"]);function O2($){if(!$||typeof $!=="object"||Array.isArray($))return;let O=$,J=["changedFiles","additions","deletions","commits"];if(J.some((Z)=>typeof O[Z]!=="number"||!Number.isInteger(O[Z])||O[Z]<0))return;return Object.fromEntries(J.map((Z)=>[Z,O[Z]]))}function H$($,O){return typeof $==="number"&&Number.isInteger($)&&$>=O?$:void 0}function J2($){if(!$||typeof $!=="object"||Array.isArray($))return;let O=$;if(!["applied","discarded","conflicted"].includes(String(O.status))||typeof O.updatedAt!=="string")return;return{status:O.status,updatedAt:O.updatedAt,...typeof O.sourceCommit==="string"?{sourceCommit:O.sourceCommit}:{},...H$(O.changedFiles,0)!==void 0?{changedFiles:O.changedFiles}:{},...typeof O.message==="string"?{message:O.message}:{}}}var lO=()=>{let $=new n4;return $.get("/",(O)=>t4(O,async(J)=>{let Z,x,z=!1,X,U,M=new Promise((W)=>{U=W}),B=()=>{if(x!==void 0)clearInterval(x),x=void 0;Z?.(),Z=void 0},R=(W)=>{if(z)return;z=!0,B(),X?.close(W),U()};J.onAbort(R),X=new D$({write:async(W)=>{await J.writeSSE(W)},onFailure:(W)=>{s4.warn(`[EventRoutes] SSE egress closed: kind=${W.kind} pendingItems=${W.pendingItems??0} pendingBytes=${W.pendingBytes??0}`),R(W)}});let E=(W,S)=>{X?.observe({data:JSON.stringify({type:W,properties:S})})};Z=q.subscribe((W)=>{if(!e4.has(W.type))return;if(W.type==="permission.asked"||W.type==="question.required"||W.type==="elicitation.required"){let p=W.properties.requestId;if(typeof p!=="string"||!p)return;E("interaction.pending",{sessionId:W.sessionId,projectPath:W.projectPath,interactionType:W.type==="question.required"?"question":W.type==="elicitation.required"?"elicitation":"permission",requestId:p});return}if(W.type==="interaction.resolved"){let p=W.properties.requestId;if(typeof p!=="string"||!p)return;E(W.type,{sessionId:W.sessionId,projectPath:W.projectPath,requestId:p});return}if(W.type==="session.created"||W.type==="session.deleted"){E(W.type,{sessionId:W.sessionId,projectPath:W.projectPath});return}if(W.type==="session.updated"){let p=W.properties.title;if(typeof p!=="string"||!p.trim())return;E(W.type,{sessionId:W.sessionId,projectPath:W.projectPath,title:p});return}if(W.type==="task.delivery"){let p=J2(W.properties.taskDelivery);if(!p)return;E(W.type,{sessionId:W.sessionId,projectPath:W.projectPath,taskDelivery:p,...W.properties.taskWorktreeRemoved===!0?{taskWorktreeRemoved:!0}:{},...typeof W.properties.updatedAt==="string"?{updatedAt:W.properties.updatedAt}:{}});return}if(W.type==="schedule.fired"){let p=W.properties.scheduleId,H0=W.properties.firedAt;if(typeof p!=="string"||typeof H0!=="string")return;E(W.type,{scheduleId:p,firedAt:H0,sessionId:W.sessionId,projectPath:W.projectPath,...typeof W.properties.runId==="string"?{runId:W.properties.runId}:{},...typeof W.properties.status==="string"?{status:W.properties.status}:{}});return}let S=W.properties.taskStatus;if(typeof S!=="string"||!$2.has(S))return;let x0=O2(W.properties.taskDiffStat),l=H$(W.properties.taskQueuePosition,1),b=H$(W.properties.taskQueueDepth,0),r=H$(W.properties.taskConcurrencyLimit,1),u=H$(W.properties.taskInFlight,0);E(W.type,{sessionId:W.sessionId,projectPath:W.projectPath,taskStatus:S,...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}:{},...x0?{taskDiffStat:x0}:{},...l!==void 0?{taskQueuePosition:l}:{},...b!==void 0?{taskQueueDepth:b}:{},...r!==void 0?{taskConcurrencyLimit:r}:{},...u!==void 0?{taskInFlight:u}:{}})});try{if(J.aborted||z)return;if(await X.writeInitial({data:JSON.stringify({type:"connected",properties:{timestamp:Date.now()}})}),J.aborted||z)return;if(X.finishInitialization({replayed:!1}),J.aborted||z)return;x=setInterval(()=>{if(J.aborted||z)return;X?.offerHeartbeat({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})})},r4),await M}finally{R()}})),$};import{Hono as Z2}from"hono";var iO=()=>{let $=new Z2;return $.get("/health",(O)=>{return O.json({healthy:!0,version:s0()})}),$.get("/info",(O)=>{let J=i(),Z=J0();if(Z)e0.configure(Z.maxConcurrentTasks,Z.maxQueuedTasks,Z.maxQueuedTaskBytes);let x=e0.getStats();return O.json({version:s0(),platform:process.platform,arch:process.arch,nodeVersion:process.version,cwd:J,gitBranch:cO(J),taskAdmission:{inFlight:x.inFlight,queued:x.queued,maxConcurrent:x.maxConcurrent,maxQueued:x.maxQueued}})}),$};import aO from"node:path";import{Hono as x2}from"hono";var Y2=F.Object({projectPath:F.String({minLength:1}),action:W0(["trust","revoke"]),expectedDigest:F.Optional(F.String())}),Q2=F.Object({projectPath:F.String({minLength:1}),sessionId:F.String({minLength:1}),enabled:F.Boolean()});function ZO($){if(!$||!aO.isAbsolute($))throw new L("projectPath must be absolute");return aO.resolve($)}function oO($){if(!$)throw new L("sessionId is required");try{v$($)}catch(O){throw new L(O instanceof Error?O.message:"sessionId is invalid")}return $}async function g$($){let O=ZO($),J=J0()?.hooks??rO.hooks,Z=await _$.getInstance().loadWorkspaceHooks(O,J,{includeBaseForCurrentWorkspace:!1});await _0(O),L$(O);let x=$$.getInstance();return x.loadConfig(Z,O),await B$(O),x.getConfig(O)}function nO($,O){let J=$$.getInstance(),Z=J.getConfig(O).enabled,x=J.isSessionPaused($,O);return{sessionId:$,projectPath:O,enabled:J.isSessionEnabled($,O),paused:x,configEnabled:Z}}var sO=()=>{let $=new x2;return $.get("/trust",async(O)=>{let J=O.req.query("projectPath");if(!J)throw new L("projectPath query parameter is required");return await g$(J),O.json(await $$.getInstance().getTrustStatus(J))}),$.post("/trust",async(O)=>{let J=g(Y2,await O.req.json());if(!J.success)throw new L("Invalid hook trust request");let{projectPath:Z,action:x,expectedDigest:z}=J.data;await g$(Z);let X=$$.getInstance(),U;try{U=x==="trust"?await X.trustProject(Z,z):await X.revokeProjectTrust(Z)}catch(M){if(M instanceof tO)throw new C(M.message);throw M}return O.json(U)}),$.get("/session",async(O)=>{let J=ZO(O.req.query("projectPath")),Z=oO(O.req.query("sessionId"));return await g$(J),O.json(nO(Z,J))}),$.post("/session",async(O)=>{let J=g(Q2,await O.req.json());if(!J.success)throw new L("Invalid hook session request");let Z=ZO(J.data.projectPath),x=oO(J.data.sessionId);await g$(Z);let z=$$.getInstance();if(J.data.enabled)z.enableSession(x,Z);else z.disableSession(x,Z);return O.json(nO(x,Z))}),$};import{Hono as X2}from"hono";var b0=a("Service");function z2($){try{return $1($)}catch{return[]}}function K2($){if(!u$($)||!u$($.reference)||!u$($.argument))throw Error("Invalid MCP completion request");let O=$.reference.type,J=O==="prompt"&&typeof $.reference.name==="string"?{type:"prompt",name:$.reference.name}:O==="resource"&&typeof $.reference.uri==="string"?{type:"resource",uri:$.reference.uri}:void 0;if(!J||typeof $.argument.name!=="string"||typeof $.argument.value!=="string")throw Error("Invalid MCP completion request");let Z;if($.context!==void 0){if(!u$($.context))throw Error("Invalid MCP completion context");Z=Object.create(null);for(let[x,z]of Object.entries($.context)){if(typeof z!=="string")throw Error("Invalid MCP completion context");Z[x]=z}}return{reference:J,argument:{name:$.argument.name,value:$.argument.value},...Z?{context:Z}:{}}}function u$($){return $!==null&&typeof $==="object"&&!Array.isArray($)}async function P0($,O){let J=J0()?.mcpServers??{};for(let[Z,x]of Object.entries(J)){if(O&&Z!==O)continue;if(!$.getServerStatus(Z))await $.registerServer(Z,x,{connect:!1})}}var O1=()=>{let $=new X2;return $.get("/",async(O)=>{try{let J=U0.getInstance();await P0(J);let Z=J.getAllServers(),x=await Promise.all(Array.from(Z.entries()).map(async([z,X])=>({id:z,name:z,status:X.status==="connected"?"connected":X.status==="reconnecting"?"reconnecting":X.status==="connecting"?"connecting":X.lastError?"error":"offline",endpoint:X.config.command?`${X.config.command} ${(X.config.args||[]).join(" ")}`.trim():X.config.url||"Unknown",description:`MCP server: ${z}`,tools:X.tools.map((U)=>U.name),completionSupported:X.client.completionSupported,tasks:X.client.tasks,resources:X.contentCatalog.resources,resourceTemplates:X.contentCatalog.resourceTemplates.map((U)=>({...U,variables:z2(U.uriTemplate)})),prompts:X.contentCatalog.prompts,connectedAt:X.connectedAt?.toISOString(),error:X.lastError?.message,recovery:X.recovery,logging:X.logging,instructions:X.instructions,oauthEnabled:X.client.oauthEnabled,oauthStatus:await X.client.getOAuthStatus()})));return O.json(x)}catch(J){return b0.error("[McpRoutes] Failed to get MCP servers:",J),O.json({error:J instanceof Error?J.message:"Failed to get MCP servers"},500)}}),$.post("/:name/connect",async(O)=>{try{let J=O.req.param("name"),Z=U0.getInstance();return await P0(Z,J),await Z.connectServer(J),O.json({success:!0})}catch(J){return b0.error("[McpRoutes] Failed to connect MCP server:",J),O.json({success:!1,error:J.message},500)}}),$.post("/:name/disconnect",async(O)=>{try{let J=O.req.param("name"),Z=U0.getInstance();return await P0(Z,J),await Z.disconnectServer(J),O.json({success:!0})}catch(J){return b0.error("[McpRoutes] Failed to disconnect MCP server:",J),O.json({success:!1,error:J.message},500)}}),$.get("/:name/logs",async(O)=>{try{let J=O.req.param("name"),Z=Number(O.req.query("limit")??20),x=Number(O.req.query("afterRevision")??0);if(!Number.isSafeInteger(Z)||Z<1||Z>100||!Number.isSafeInteger(x)||x<0)return O.json({error:"Invalid MCP log pagination"},400);let z=U0.getInstance();return await P0(z,J),O.json(z.getLogSnapshot(J,{limit:Z,afterRevision:x}))}catch(J){return b0.error("[McpRoutes] Failed to get MCP logs:",J),O.json({error:J.message},500)}}),$.post("/:name/logging-level",async(O)=>{try{let J=O.req.param("name"),Z=await O.req.json();if(!eO(Z.level))return O.json({success:!1,error:"Invalid MCP logging level"},400);let x=U0.getInstance();return await P0(x,J),await x.setServerLoggingLevel(J,Z.level),O.json({success:!0,level:Z.level})}catch(J){return b0.error("[McpRoutes] Failed to set MCP logging level:",J),O.json({success:!1,error:J.message},400)}}),$.post("/:name/complete",async(O)=>{try{let J=O.req.param("name"),Z=K2(await O.req.json()),x=U0.getInstance();await P0(x,J);let z=await x.complete(J,Z);return O.json(z)}catch(J){return b0.error("[McpRoutes] Failed to complete MCP argument:",J),O.json({error:J.message},400)}}),$.post("/:name/oauth/login",async(O)=>{try{let J=O.req.param("name"),Z=U0.getInstance();await P0(Z,J);let x=await Z.beginOAuthLogin(J);return O.json({success:!0,flowId:x.flowId,authorizationUrl:x.authorizationUrl},202)}catch(J){return b0.error("[McpRoutes] Failed to start MCP OAuth login:",J),O.json({success:!1,error:J.message},400)}}),$.post("/:name/oauth/logout",async(O)=>{try{let J=O.req.param("name"),Z=U0.getInstance();return await P0(Z,J),await Z.logoutOAuth(J),O.json({success:!0})}catch(J){return b0.error("[McpRoutes] Failed to log out MCP OAuth:",J),O.json({success:!1,error:J.message},400)}}),$.delete("/:name",async(O)=>{try{let J=O.req.param("name");await U0.getInstance().unregisterServer(J);let x=J0();if(x?.mcpServers){let{[J]:z,...X}=x.mcpServers;await w0().updateConfig({mcpServers:X})}return O.json({success:!0})}catch(J){return b0.error("[McpRoutes] Failed to delete MCP server:",J),O.json({success:!1,error:J.message},500)}}),$.post("/",async(O)=>{try{let J=await O.req.json(),{name:Z,config:x}=J;if(!Z||!x)return O.json({success:!1,error:"Missing name or config"},400);await U0.getInstance().registerServer(Z,x);let X=J0();return await w0().updateConfig({mcpServers:{...X?.mcpServers,[Z]:x}}),O.json({success:!0})}catch(J){return b0.error("[McpRoutes] Failed to add MCP server:",J),O.json({success:!1,error:J.message},500)}}),$};import{getSupportedThinkingLevels as V2}from"@earendil-works/pi-ai";import{Hono as N2}from"hono";var p$=a("Service");function G2($,O,J=Y1.list()){return{id:$.id,displayName:$.displayName,provider:$.provider,model:$.model,overrides:$.overrides,fallbackModels:$.fallbackModels,contextWindow:O.contextWindow,maxTokens:O.maxTokens,reasoning:O.reasoning,supportedReasoningEfforts:V2(O),supportedServiceTiers:Z1(O),supportedResponseVerbosities:J1(O),communicationStyles:J,input:O.input}}function W2($){Q1($.overrides);let O={displayName:$.displayName||void 0,overrides:$.overrides||void 0};if($.model)O.model=$.model;return O}function Q1($){let O=$?.streamIdleTimeout;if(O!==void 0&&(!Number.isFinite(O)||O<1000))throw new L("streamIdleTimeout must be at least 1000ms")}var X1=()=>{let $=new N2;return $.get("/",async(O)=>{try{let J=J0();if(!J)throw Error("Config not initialized");let Z=O.get("directory")||i(),[x,z]=await Promise.all([d$(Z,J),_0(Z)]),X=x.config.models,U=X.find((E)=>E.id===x.config.currentModelId)??X[0],M=x.catalog,B=z.communicationStyles.list(),R=(E)=>G2(E,M.resolveConfig(E),B);return O.json({configured:X.map(R),current:U?R(U):null})}catch(J){p$.error("[ModelsRoutes] Failed to get models:",J);let Z=new e("Failed to get models");return O.json(Z.toObject(),500)}}),$.post("/",async(O)=>{let J=p0(),Z,x;try{let z=await O.req.json(),{provider:X,displayName:U,model:M,overrides:B,apiKey:R,modelProvider:E}=z;if(!X||!M)throw new L("provider and model are required");Q1(B);let W;if(E){if(E.id!==X)throw new L("modelProvider.id must match the model provider");if(J0()?.modelProviders[X])throw new L(`model provider already exists: ${X}`);W={name:E.name,baseUrl:E.baseUrl,wireApi:E.wireApi,...E.apiKeyEnv?{apiKeyEnv:E.apiKeyEnv}:{}};try{J.registerModelProvider(X,W,[M]),x=X}catch(l){throw new L(l instanceof Error?l.message:"Invalid model provider")}}else J.getModel(X,M);if(R?.trim()){if(await J.setApiKey(X,R.trim()),W)Z=X}let S={provider:X,displayName:U||void 0,model:M,overrides:B||void 0},x0=W?await w0().addModelWithProvider(S,W):await w0().addModel(S);return O.json({success:!0,model:x0})}catch(z){if(Z)await J.credentials.delete(Z);if(x){let X=J0();J.configureModelProviders(X?.modelProviders??{},X?.models??[])}throw p$.error("[ModelsRoutes] Failed to add model:",z),z}}),$.put("/:modelId",async(O)=>{try{let J=O.req.param("modelId"),Z=await O.req.json(),{displayName:x,overrides:z,model:X}=Z,U=x1(J);if(!U)throw new L("model config not found");if(X)p0().getModel(U.provider,X);return await w0().updateModel(J,W2({displayName:x,overrides:z,model:X})),O.json({success:!0})}catch(J){throw p$.error("[ModelsRoutes] Failed to update model:",J),J}}),$.delete("/:modelId",async(O)=>{try{let J=O.req.param("modelId");return await w0().removeModel(J),O.json({success:!0})}catch(J){throw p$.error("[ModelsRoutes] Failed to delete model:",J),J}}),$};import{Hono as I2}from"hono";import z1 from"node:path";import{Mutex as K1}from"async-mutex";import{Hono as U2}from"hono";import{streamSSE as F2}from"hono/streaming";import{LRUCache as D2}from"lru-cache";import{nanoid as Z$}from"nanoid";var P=a("Service"),H2=F.Object({title:F.Optional(F.String()),projectPath:F.Optional(F.String())}),_2=P1,B2=F.Object({title:F.Optional(F.String()),projectPath:F.Optional(F.String())}),L2=F.Object({projectPath:F.String()}),w2=F.Object({objective:F.String({minLength:1}),tokenBudget:F.Optional(F.Integer({minimum:1})),permissionMode:F.Optional(W0(["default","autoEdit","plan","yolo"]))}),A2=F.Union([F.Object({action:F.Literal("pause")}),F.Object({action:F.Literal("resume")}),F.Object({action:F.Literal("edit"),objective:F.String({minLength:1})})]),t=new Map,Y$,R0=new Map,I0=new Map,T0=new Map,a$=new D2({max:100,ttl:1800000});function V1($){return{sessionId:$.sessionId,projectPath:$.projectPath}}function D0($){if(!$)return;return R0.get($)??a$.get($)}function M2($){if(R0.get($.id)!==$)return;R0.delete($.id),a$.set($.id,$)}function E2($){R0.delete($),a$.delete($)}function F0($){return $?.status==="queued"||$?.status==="running"||$?.status==="waiting_permission"}function E$($,O="user-cancel"){if($.status==="cancelled"||$.status==="completed"||$.status==="failed")return!1;let J=$.pendingPermission;if($.pendingPermission=void 0,J?.resolve({approved:!1,reason:B1}),J)q.publish(V1($),"interaction.resolved",{requestId:J.permissionId});return $.abortController.abort(O),$.status="cancelled",q.publish(V1($),"run.cancelled",{runId:$.id}),!0}function m1($,O=!1){let{permissionId:J,details:Z}=$;if(Z.type==="askUserQuestion"&&Z.questions)return{type:"question.required",properties:{requestId:J,toolCallId:Z.toolCallId??J,questions:Z.questions,details:Z,...O?{replayed:!0}:{}}};if(Z.type==="mcpElicitation"&&Z.mcpElicitation)return{type:"elicitation.required",properties:{requestId:J,toolCallId:Z.toolCallId??J,elicitation:Z.mcpElicitation,...O?{replayed:!0}:{}}};return{type:"permission.asked",properties:{requestId:J,toolName:Z.toolName,description:Z.message,args:Z.args,details:Z,...O?{replayed:!0}:{}}}}function T2($){return{...typeof $.seq==="number"?{id:String($.seq)}:{},data:JSON.stringify({type:$.type,...typeof $.seq==="number"?{seq:$.seq}:{},properties:{...$.properties,sessionId:$.sessionId,projectPath:$.projectPath}})}}function R2(){for(let $ of R0.values())E$($,"route-reset");R0.clear();for(let $ of I0.values())$.controller.abort("route-reset");I0.clear(),a$.clear(),Y$=void 0,t.clear()}function b2($){if(!$||typeof $!=="object"||Array.isArray($))return;let O=$,J=O.code,Z=O.reason,x=O.scope,z=O.kind,X=O.limit;if(J!=="tool_busy"&&J!=="tool_batch_full"||Z!=="queue_full"&&Z!=="wait_timeout"&&Z!=="turn_limit"||x!=="global"&&x!=="session"||typeof O.retryable!=="boolean"||!Number.isSafeInteger(X)||X<=0||z!==void 0&&z!=="readonly"&&z!=="write"&&z!=="execute")return;return{code:J,reason:Z,scope:x,retryable:O.retryable,...z===void 0?{}:{kind:z},limit:X}}var T$=($,O)=>{if(!O||typeof O!=="object")return O;let J={...O},Z=b2(J.tool_admission);if(Z)J.tool_admission=Z;else delete J.tool_admission;if($==="Bash"){let X={},U=["message","signal","status","summary"],M=["aborted","acp_mode","admission_failed","auto_backgrounded","background","capture_truncated","finalization_failed","has_stderr","output_accounting_complete","output_truncated","projection_truncated","sandbox_required","sandboxed","stderr_projection_truncated","stdout_projection_truncated","terminal_output_merged","timeout"],B=["execution_time","foreground_budget_ms","pid","raw_output_bytes","stderr_length","stderr_omitted_bytes","stderr_retained_bytes","stderr_total_bytes","stdout_length","stdout_omitted_bytes","stdout_retained_bytes","stdout_total_bytes"];for(let E of U){let W=J[E];if(typeof W==="string")X[E]=W.slice(0,8192)}for(let E of M){let W=J[E];if(typeof W==="boolean")X[E]=W}for(let E of B){let W=J[E];if(typeof W==="number"&&Number.isSafeInteger(W)&&W>=0)X[E]=W}if(J.exit_code===null||typeof J.exit_code==="number"&&Number.isSafeInteger(J.exit_code))X.exit_code=J.exit_code;if(J.terminal_transport==="local"||J.terminal_transport==="acp"||J.terminal_transport==="local_fallback")X.terminal_transport=J.terminal_transport;if(J.background_reason==="explicit"||J.background_reason==="foreground_budget")X.background_reason=J.background_reason;for(let E of["bash_id","shell_id"]){let W=J[E];if(typeof W==="string"&&W.length<=128&&/^bash_[A-Za-z0-9-]+$/.test(W))X[E]=W}if(Z)X.tool_admission=Z;let R=J.background_shell_admission;if(R&&typeof R==="object"&&!Array.isArray(R)){let E=R;if(E.code==="background_shell_busy"&&(E.scope==="session"||E.scope==="global")&&E.retryable===!0&&Number.isSafeInteger(E.limit)&&E.limit>0)X.background_shell_admission={code:E.code,scope:E.scope,retryable:E.retryable,limit:E.limit}}return X}let x=200000,z=(X,U)=>typeof X==="number"&&Number.isSafeInteger(X)&&X>=0&&X<=U?X:0;if(typeof J.oldContent==="string"&&J.oldContent.length>x)delete J.oldContent;if(typeof J.newContent==="string"&&J.newContent.length>x)delete J.newContent;if(J.mcpResult&&typeof J.mcpResult==="object"&&!Array.isArray(J.mcpResult)){let X=J.mcpResult,U=Array.isArray(X.artifacts)?X.artifacts.slice(0,64).flatMap((M)=>{if(!M||typeof M!=="object"||Array.isArray(M))return[];let B=M,R=new Set(["text","image","audio","resource"]);if(typeof B.id!=="string"||!/^[a-f0-9]{64}$/.test(B.id)||typeof B.sha256!=="string"||B.sha256!==B.id||typeof B.kind!=="string"||!R.has(B.kind)||z(B.size,67108864)!==B.size||typeof B.persisted!=="boolean")return[];return[{id:B.id.slice(0,128),sha256:B.sha256.slice(0,128),kind:B.kind,size:B.size,persisted:B.persisted,...typeof B.mimeType==="string"?{mimeType:B.mimeType.slice(0,256)}:{},...typeof B.sourceUri==="string"?{sourceUri:B.sourceUri.slice(0,8192)}:{},...typeof B.path==="string"?{path:B.path.slice(0,8192)}:{}}]}):[];J.mcpResult={isError:X.isError===!0,contentCount:z(X.contentCount,64),textBytes:z(X.textBytes,4194304),structuredBytes:z(X.structuredBytes,4194304),artifactCount:z(X.artifactCount,64),truncated:X.truncated===!0,binaryOmitted:X.binaryOmitted===!0,artifacts:U}}else delete J.mcpResult;return J};function q2($){let O=typeof $.seq==="number"?{seq:$.seq}:{};if($.type==="part_created"&&$.data.partType==="tool_call"){let J=$.data.payload;return{type:"tool.start",...O,properties:{messageId:$.data.messageId,toolCallId:J.toolCallId??$.data.partId,toolName:J.toolName??"unknown",arguments:JSON.stringify(J.input??{})}}}if($.type==="part_created"&&$.data.partType==="tool_result"){let J=$.data.payload,Z=J.toolName??"unknown",x=UO(J),z=q$(C$(Z,x),b$);return{type:"tool.result",...O,properties:{messageId:$.data.messageId,toolCallId:J.toolCallId??$.data.partId,toolName:Z,success:x.success,status:x.success?"completed":"failed",summary:x.metadata?.summary,output:j$(z),metadata:T$(Z,x.metadata)}}}return{type:`committed.${$.type}`,...O,properties:{event:$}}}function C2($,O,J){switch(J.kind){case"tool_start":if("function"in J.toolCall)q.publish($,"subagent.update",{subagentSessionId:O,toolName:J.toolCall.function.name}),q.publish($,"subagent.tool.start",{subagentSessionId:O,toolCallId:J.toolCall.id,toolName:J.toolCall.function.name,arguments:J.toolCall.function.arguments,toolKind:J.toolKind});break;case"tool_result":if("function"in J.toolCall)q.publish($,"subagent.tool.result",{subagentSessionId:O,toolCallId:J.toolCall.id,toolName:J.toolCall.function.name,success:J.result.success,summary:J.result.metadata?.summary,output:j$(q$(C$(J.toolCall.function.name,J.result),b$)),metadata:T$(J.toolCall.function.name,J.result.metadata)});break;case"tool_progress":if("function"in J.toolCall)q.publish($,"subagent.tool.progress",{subagentSessionId:O,toolCallId:J.toolCall.id,toolName:J.toolCall.function.name,...J.update});break;case"content_delta":q.publish($,"subagent.delta",{subagentSessionId:O,delta:J.delta});break;case"thinking_delta":q.publish($,"subagent.thinking.delta",{subagentSessionId:O,delta:J.delta});break;case"stream_end":q.publish($,"subagent.stream.end",{subagentSessionId:O});break;case"provider_admission":q.publish($,"subagent.provider.admission",{subagentSessionId:O,phase:J.phase,requestClass:J.requestClass,resource:J.resource,scope:J.scope,reason:J.reason,queuePosition:J.queuePosition,queueDepth:J.queueDepth,inFlight:J.inFlight,limit:J.limit,waitMs:J.waitMs,maxWaitMs:J.maxWaitMs,recoveryRemainingMs:J.recoveryRemainingMs});break;case"provider_circuit":q.publish($,"subagent.provider.circuit",{subagentSessionId:O,phase:J.phase,reason:J.reason,statusCode:J.statusCode,retryAfterMs:J.retryAfterMs,nextProbeAt:J.nextProbeAt,openDurationMs:J.openDurationMs,sampleCount:J.sampleCount,failureCount:J.failureCount,recoveryRemainingMs:J.recoveryRemainingMs});break;case"provider_retry":q.publish($,"subagent.provider.retry",{subagentSessionId:O,phase:J.phase,attempt:J.attempt,maxRetries:J.maxRetries,reason:J.reason,statusCode:J.statusCode,delayMs:J.delayMs,nextRetryAt:J.nextRetryAt,mode:J.mode,recoveryBudgetMs:J.recoveryBudgetMs,recoveryElapsedMs:J.recoveryElapsedMs,recoveryRemainingMs:J.recoveryRemainingMs,exhaustedBy:J.exhaustedBy});break;case"provider_stall":q.publish($,"subagent.provider.stall",{subagentSessionId:O,phase:J.phase,stallCount:J.stallCount,durationMs:J.durationMs,warningAfterMs:J.warningAfterMs,timeoutMs:J.timeoutMs,outputStarted:J.outputStarted});break;case"action_stationarity":q.publish($,"subagent.action.stationarity",{subagentSessionId:O,phase:J.phase,toolName:J.toolName,runLength:J.runLength,nudgeThreshold:J.nudgeThreshold,haltThreshold:J.haltThreshold,progressAware:J.progressAware});break;case"mcp_catalog_changed":q.publish($,"subagent.mcp.catalog.changed",{subagentSessionId:O,revision:J.revision,serverName:J.serverName,added:J.added,removed:J.removed,updated:J.updated});break;case"mcp_content_changed":q.publish($,"subagent.mcp.content.changed",{subagentSessionId:O,revision:J.revision,serverName:J.serverName,contentKind:J.contentKind,added:J.added,removed:J.removed,updated:J.updated});break;case"mcp_resource_updated":q.publish($,"subagent.mcp.resource.updated",{subagentSessionId:O,revision:J.revision,serverName:J.serverName,uri:J.uri});break;case"mcp_connection_changed":q.publish($,"subagent.mcp.connection.changed",{subagentSessionId:O,revision:J.revision,serverName:J.serverName,phase:J.phase,reason:J.reason,attempt:J.attempt,maxAttempts:J.maxAttempts,nextRetryAt:J.nextRetryAt,error:J.error});break;case"mcp_log":q.publish($,"subagent.mcp.log",{subagentSessionId:O,revision:J.revision,serverName:J.serverName,level:J.level,logger:J.logger,message:J.message,projectedBytes:J.projectedBytes,dataSha256:J.dataSha256,truncated:J.truncated,detailsOmitted:J.detailsOmitted,timestamp:J.timestamp,synthetic:J.synthetic});break;case"mcp_instructions_changed":q.publish($,"subagent.mcp.instructions.changed",{subagentSessionId:O,revision:J.revision,serverName:J.serverName,action:J.action,reason:J.reason,text:J.text,sourceBytes:J.sourceBytes,projectedBytes:J.projectedBytes,sha256:J.sha256,truncated:J.truncated,detailsOmitted:J.detailsOmitted});break;case"mcp_task_changed":q.publish($,"subagent.mcp.task.changed",{subagentSessionId:O,revision:J.revision,taskId:J.taskId,serverName:J.serverName,toolName:J.toolName,status:J.status,statusMessage:J.statusMessage,createdAt:J.createdAt,updatedAt:J.updatedAt,completedAt:J.completedAt,hasResult:J.hasResult,error:J.error});break;case"project_rules_loaded":q.publish($,"subagent.project.rules.loaded",{subagentSessionId:O,files:J.files,triggerPaths:J.triggerPaths,blockedWrite:J.blockedWrite});break;default:break}}function A$($,O="projectPath"){if(!z1.isAbsolute($))throw new L(`${O} must be absolute`);return z1.resolve($)}function GO($){try{v$($)}catch(O){throw new L(O instanceof Error?O.message:`Invalid session ID: ${$}`)}}function Y0($){return{sessionId:$.id,projectPath:$.projectPath}}function M$($,O,J){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:J,messages:O}}function xO($){return $.flatMap((O)=>{if(!w1(O)||O.role==="system"||O.role==="tool"&&O.name===x$)return[];let J=O.tool_calls?.filter((X)=>!("function"in X)||X.function.name!==x$),Z=typeof O.content==="string"?O.content.trim():"";if(O.role==="assistant"&&O.tool_calls?.length&&!J?.length&&!Z&&!O.reasoningContent&&!O.metadata)return[];let x={...O,...O.tool_calls?{tool_calls:J&&J.length>0?J:void 0}:{}};if(O.role==="tool"){let X=O.metadata&&typeof O.metadata==="object"&&!Array.isArray(O.metadata)?O.metadata:void 0,U=O.name??(typeof X?.toolName==="string"?X.toolName:"unknown");if(X!==void 0&&(Object.hasOwn(X,"output")||Object.hasOwn(X,"error"))){let B=UO(X),R=q$(C$(U,B),b$);return[{...x,name:U,content:j$(R),metadata:T$(U,{...B.metadata,status:B.success?"completed":"failed"})}]}return[{...x,name:U,metadata:T$(U,X)}]}let z=M1(O.metadata);return[z?{...x,content:A1(z)}:x]})}function R$($,O){$.taskStatus=O.taskStatus,$.taskStatusReason=O.taskStatusReason,$.taskFailure=O.taskFailure,$.taskStartedAt=O.taskStartedAt,$.taskCompletedAt=O.taskCompletedAt,$.taskPromptSummary=O.taskPromptSummary,$.taskModelId=O.taskModelId,$.selectedModelId=O.selectedModelId,$.permissionMode=O.permissionMode,$.reasoningEffort=O.reasoningEffort,$.serviceTier=O.serviceTier,$.responseVerbosity=O.responseVerbosity,$.communicationStyle=O.communicationStyle,$.communicationStyleDigest=O.communicationStyleDigest,$.projectInstructionsDigest=O.projectInstructionsDigest,$.pendingInteraction=O.pendingInteraction,$.taskRetryAvailable=O.taskRetryAvailable,$.taskRetriedFrom=O.taskRetriedFrom,$.taskDelivery=O.taskDelivery,$.taskIsolation=O.taskIsolation,$.taskSourceProjectPath=O.taskSourceProjectPath,$.taskWorktreePath=O.taskWorktreePath,$.taskWorktreeBranch=O.taskWorktreeBranch,$.taskBaseCommit=O.taskBaseCommit,$.taskDiffStat=O.taskDiffStat,$.taskQueuePosition=O.taskQueuePosition,$.taskQueueDepth=O.taskQueueDepth,$.taskConcurrencyLimit=O.taskConcurrencyLimit,$.archivedAt=O.archivedAt,$.archivedBySessionId=O.archivedBySessionId,$.updatedAt=new Date(O.lastMessageTime)}async function c0($){let O=await j.findSessionMetadata($.id,$.projectPath);if(O)R$($,O)}function O$($){let O=D0($.currentRunId),J=O?.status==="waiting_permission"?"running":O?.status??$.taskStatus;return{sessionId:$.id,projectPath:$.projectPath,title:$.title,rootId:$.rootId,parentId:$.parentId,relationType:$.relationType,status:void 0,taskStatus:J,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:O?.status==="queued"?O.taskQueuePosition:J==="queued"?$.taskQueuePosition:void 0,taskQueueDepth:O?.status==="queued"?O.taskQueueDepth:J==="queued"?$.taskQueueDepth:void 0,taskConcurrencyLimit:O?.taskConcurrencyLimit??$.taskConcurrencyLimit,archivedAt:$.archivedAt,archivedBySessionId:$.archivedBySessionId,pendingInteraction:O?.pendingPermission?{type:O.pendingPermission.details.type==="askUserQuestion"?"question":O.pendingPermission.details.type==="mcpElicitation"?"elicitation":"permission",requestId:O.pendingPermission.permissionId}:$.pendingInteraction,agentType:void 0,model:void 0,messageCount:$.messages.length,firstMessageTime:$.createdAt.toISOString(),lastMessageTime:$.updatedAt.toISOString(),hasErrors:!1,isActive:!0}}async function V0($,O){if(GO($),O!==void 0){let Z=S0({sessionId:$,projectPath:A$(O)});if(t.has(v(Z)))return Z;let x=await j.findSessionMetadata(Z.sessionId,Z.projectPath);if(!x)throw new m("Session",$);return S0({sessionId:x.sessionId,projectPath:x.projectPath})}let J=new Map;for(let Z of t.values()){if(Z.id!==$)continue;let x=Y0(Z);J.set(v(x),x)}for(let Z of await j.listSessions()){if(Z.sessionId!==$)continue;let x=S0({sessionId:Z.sessionId,projectPath:Z.projectPath});J.set(v(x),x)}if(J.size===0)try{let Z=await j.findSessionMetadata($);if(!Z)throw new m("Session",$);return S0({sessionId:Z.sessionId,projectPath:Z.projectPath})}catch(Z){if(Z instanceof m)throw Z;if(Z instanceof Error&&Z.message.startsWith("Ambiguous session ID:"))throw new L0;throw Z}if(J.size>1)throw new L0;return J.values().next().value}function WO($){if(typeof $==="string")return $;return $.filter((O)=>O.type==="text").map((O)=>O.text).join(`
7
+ `)}function N1($,O){let J=(O??[]).filter((x)=>x.type==="image"&&typeof x.content==="string").map((x)=>({type:"image_url",image_url:{url:x.content}}));if(J.length===0)return $;let Z=[];if($.trim())Z.push({type:"text",text:$});return Z.push(...J),Z}var h1=()=>{R2();let $=new U2;$.onError((Y,V)=>{if(Y instanceof J$){let Q=new v0("Session runtime capacity is full",{resource:Y.resource,limit:Y.limit});return V.json(Q.toObject(),429)}if(Y instanceof Z0)return V.json(Y.toObject(),Y.statusCode);return P.error("[SessionRoutes] Unhandled route error:",Y),V.json({error:{code:"INTERNAL_ERROR",message:"Internal server error"}},500)});let O=new Map,J=new Map,Z=new Map,x=new Map,z=new Map,X=new Map,U=J0(),M=new y1({maxResident:U?.maxResidentSessionRuntimes??U1,idleMs:U?.sessionRuntimeIdleMs??F1}),B=new b1,R=setInterval(()=>{M.sweepIdle().catch((Y)=>{P.warn("[SessionRoutes] Session Runtime idle sweep failed:",Y)})},D1);R.unref?.();let E,W=async(Y)=>{let V;try{V=B.enter()}catch{throw new u0}try{return await Y()}finally{V.release()}};$.use("*",async(Y,V)=>{if(Y.req.method==="GET"||Y.req.method==="HEAD")return V();return W(V)});let S=(Y)=>{let V=v(Y),Q=z.get(V);if(!Q)Q=new K1,z.set(V,Q);return Q},x0=(Y)=>{let V=v(Y),Q=X.get(V);if(!Q)Q=new K1,X.set(V,Q);return Q},l=(Y)=>[...R0.values()].some((V)=>V.sessionId===Y.sessionId&&V.projectPath===Y.projectPath&&F0(V)),b=async(Y,V,Q)=>{let K=Z.get(V);if(!K)K=(async()=>{if(O.get(V)===Q)O.delete(V);for(let[_,w]of O)if(w===Q)O.delete(_);let G=Y0(Y);if(t.get(V)===Y&&!l(G)&&!I0.has(V)&&!T0.has(V))t.delete(V);let H=z.get(V);if(H&&!H.isLocked())z.delete(V);let D=X.get(V);if(D&&!D.isLocked())X.delete(V);if(await Q.dispose(),O.size===0)await U0.getInstance().disconnectAll()})().finally(()=>{if(Z.get(V)===K)Z.delete(V)}),Z.set(V,K);await K},r=async(Y,V={})=>{let Q=Y0(Y),K=v(Q);await Z.get(K);let G=M.acquire(K);if(G){if(O.get(K)!==G.value)throw G.release(),Error("Session Runtime residency identity is inconsistent");return G}if(M.owns(K))throw new J$(M.getStats().maxResident);let H=J.get(K);if(!H){let D=V.communicationStyle??Y.communicationStyle;H=(async()=>{let _=await M.reserve(K,{surface:"web",allowEviction:!0});try{let w=await w$.create({sessionId:Y.id,workspaceRoot:Y.projectPath,...Y.selectedModelId??Y.taskModelId?{modelId:Y.selectedModelId??Y.taskModelId}:{},permissionMode:V.permissionMode??Y.permissionMode??"default",...Y.reasoningEffort?{reasoningEffort:Y.reasoningEffort}:{},...Y.serviceTier?{serviceTier:Y.serviceTier}:{},...Y.responseVerbosity?{responseVerbosity:Y.responseVerbosity}:{},...D?{communicationStyle:D}:{},...D===Y.communicationStyle&&Y.communicationStyleDigest?{communicationStyleDigest:Y.communicationStyleDigest}:{},...Y.projectInstructionsDigest?{projectInstructionsDigest:Y.projectInstructionsDigest}:{},...Y.taskWorktree?{taskWorktree:Y.taskWorktree}:{},...Y.taskIsolation?{taskIsolation:Y.taskIsolation}:{},...Y.messages.length>0?{sessionStart:{isResume:!0,resumeSessionId:Y.id}}:{}}),A=_.commit({key:K,surface:"web",value:w,canEvict:()=>!l(Q)&&!I0.has(K)&&!T0.has(K)&&!J.has(K)&&!Z.has(K)&&w.isIdleForResidency(),dispose:()=>b(Y,K,w)});return O.set(K,w),{runtime:w,claimLease:()=>{if(A){let I=A;return A=void 0,I}let T=M.acquire(K);if(!T||T.value!==w)throw Error("Initialized Session Runtime lost residency");return T}}}catch(w){throw _.cancel(),w}})(),J.set(K,H)}try{return(await H).claimLease()}finally{if(J.get(K)===H)J.delete(K)}},u=async(Y,V,Q={})=>{let K=await r(Y,Q);try{return await V(K.value)}finally{K.release()}},p=async(Y,V)=>{let Q=v(Y0(Y)),K=J.get(Q);if(K)await K.catch(()=>{return});J.delete(Q);let G=V??O.get(Q);if(!G)return;if(!await M.remove(Q,G))throw Error(`Session Runtime is pinned and cannot be disposed: ${Q}`)},H0=async(Y)=>{let V=v(Y),Q=t.get(V);if(Q)return Q;let K=x.get(V);if(!K)K=(async()=>{let G=await j.findSessionMetadata(Y.sessionId,Y.projectPath);if(!G)throw new m("Session",Y.sessionId);let[H,D]=await Promise.all([j.loadSession(Y.sessionId,Y.projectPath),j.findSessionTaskWorktree(Y.sessionId,Y.projectPath)]),_=M$(G,H,D);return t.set(V,_),_})(),x.set(V,K);try{return await K}finally{if(x.get(V)===K)x.delete(V)}},z0=async(Y,V)=>{let Q=await V0(Y,V);try{await j.assertSessionWritable(Q.sessionId,Q.projectPath)}catch(K){if(K instanceof XO)throw new C(K.message);throw K}return H0(Q)},N$=async(Y,V)=>{if(Y.permissionMode===V)return;let Q=await j.setSessionPermissionMode(Y.id,Y.projectPath,V);Y.permissionMode=Q.permissionMode,Y.updatedAt=new Date(Q.lastMessageTime),q.publish(Y0(Y),"session.updated",{permissionMode:V})},O0=(Y,V,Q,K={})=>{if(!B.stats().accepting)throw new u0;let G=Z$(12),H={id:G,sessionId:Y.id,projectPath:Y.projectPath,status:"running",abortController:new AbortController,disposeRuntimeOnSettle:Y.taskIsolation!==void 0&&K.runtimeLease!==void 0,createdAt:new Date};if(Y.taskIsolation&&K.runtimeLease){let D=K.runtimeLease.value,_=e0.admit({key:`${Y.projectPath}\x00${Y.id}`,...D.getTaskAdmissionLimits(),pendingBytes:q1({content:V,outputSchema:K.outputSchema,pendingMessages:D.getPendingSteeringMessages()}),signal:H.abortController.signal,onUpdate:(A)=>{H.status=A.state,H.taskQueuePosition=A.queuePosition,H.taskQueueDepth=A.queueDepth,H.taskConcurrencyLimit=A.maxConcurrent,Y.taskStatus=A.state,Y.taskQueuePosition=A.queuePosition,Y.taskQueueDepth=A.queueDepth,Y.taskConcurrencyLimit=A.maxConcurrent,H.taskAdmissionUpdate=(H.taskAdmissionUpdate??Promise.resolve()).then(async()=>{await D.setTaskAdmission(A)}).catch((T)=>{P.warn(`[SessionRoutes] Failed to persist admission for ${Y.id}:`,T)})}});H.taskAdmission=_;let w=_.getSnapshot();H.status=w.state,H.taskQueuePosition=w.queuePosition,H.taskQueueDepth=w.queueDepth,H.taskConcurrencyLimit=w.maxConcurrent}return R0.set(G,H),Y.currentRunId=G,H.completion=j2(H,Y,V,Q,r,{pendingInputOnly:K.pendingInputOnly,preparedInputTurn:K.preparedInputTurn,goalContinuationOnly:K.goalContinuationOnly,outputSchema:K.outputSchema,taskAdmission:H.taskAdmission,runtimeLease:K.runtimeLease,disposeRuntime:p}).catch((D)=>{P.error(`[SessionRoutes] Run ${G} failed:`,D)}),H},S$=async(Y)=>{let V;if(Y.outputSchema)try{V=QO(Y.outputSchema).schema}catch(h){throw new L(h instanceof Error?h.message:"Invalid output schema")}let Q=YO("task",12),K=A$(Y.sourceProjectPath),G=Y.modelId?.trim(),H=J0();if(!H)throw new L("Config not initialized");let[D,_]=await Promise.all([d$(K,H),_0(K)]);if(G&&!D.config.models.some((h)=>h.id===G))throw new L(`Task model not found: ${G}`);let w=G||D.config.models.find((h)=>h.id===D.config.currentModelId)?.id||D.config.models[0]?.id;if(!w)throw new L("No model is configured. Add or select a model before dispatching a task.");let A=D.config.models.find((h)=>h.id===w);if(!A)throw new L(`Task model not found: ${w}`);let T=Y.reasoningEffort??"off",I=Y.serviceTier??"auto",K0=Y.responseVerbosity??"auto",k0=Y.communicationStyle??"auto",E0,Q0=_.projectRules?.staticRules(K),s=Q0&&Q0.files.length>0?Q0.provenanceSha256:void 0;try{let h=D.catalog.resolveConfig(A);H1(h,T),W1(h,I),G1(h,K0);let c=_1(k0,_.communicationStyles);E0=c.source==="built-in"?void 0:c.contentSha256}catch(h){throw new L(h instanceof Error?h.message:"Invalid reasoning effort")}let o0={version:1,prompt:Y.prompt,...Y.title?{title:Y.title}:{},sourceProjectPath:K,isolation:Y.isolation,permissionMode:Y.permissionMode,modelId:w,reasoningEffort:T,serviceTier:I,responseVerbosity:K0,communicationStyle:k0,...E0?{communicationStyleDigest:E0}:{},...s?{projectInstructionsDigest:s}:{},...Y.attachments?{attachments:Y.attachments.map((h)=>({...h}))}:{},...V?{outputSchema:V}:{}},f,y,k;try{let h=await j1.createSessionTask({sessionId:Q,prompt:Y.prompt,title:Y.title,sourceProjectPath:K,isolation:Y.isolation,dispatch:o0,retriedFrom:Y.retriedFrom}),{metadata:c}=h;f=h.taskWorktree,y=M$(c,[],f);let d=Y0(y);t.set(v(d),y),q.publish(d,"task.status",{taskStatus:c.taskStatus,updatedAt:c.lastMessageTime});let n=N1(Y.prompt,Y.attachments);k=await r(y);let W$=k.value,o=V?await W$.prepareInputTurn(n,{outputSchema:V}):await W$.prepareInputTurn(n);if(!o.accepted)throw new C(`Task prompt was not accepted: ${o.reason}`);let $0=O0(y,n,Y.permissionMode,{preparedInputTurn:o,runtimeLease:k,outputSchema:V});return k=void 0,await $0.taskAdmissionUpdate,{session:O$(y),runId:$0.id,messageId:o.messageId,status:$0.status==="queued"?"queued":"running",queuePosition:$0.taskQueuePosition,queueDepth:$0.taskQueueDepth,maxConcurrentTasks:$0.taskConcurrencyLimit}}catch(h){if(k?.release(),k=void 0,(h instanceof NO||h instanceof J$)&&y){let c=Y0(y),d=v(c);if(f)await q0.exit({sessionId:y.id,action:"remove",discardChanges:!0}).catch(()=>{return});throw await p(y).catch(()=>{return}),await j.deleteSession(y.id,y.projectPath).catch(()=>{return}),t.delete(d),new v0(h instanceof J$?"Session runtime capacity is full":"Task admission capacity is full",{resource:h.resource,limit:h.limit})}if(y){let c=await j.findSessionMetadata(y.id,y.projectPath).catch(()=>{return});if(!c||c.taskStatus==="queued"){let d=c$(h),n=await j.updateSessionMetadata(y.id,y.projectPath,{taskStatus:"failed",taskStatusReason:d.message,taskFailure:d,taskCompletedAt:new Date().toISOString(),taskOwnerPid:null}).catch(()=>{return});y.taskStatus=n?.taskStatus??"failed",y.taskStatusReason=n?.taskStatusReason??d.message,y.taskFailure=n?.taskFailure??d,y.taskCompletedAt=n?.taskCompletedAt}else y.taskStatus=c.taskStatus,y.taskStatusReason=c.taskStatusReason,y.taskFailure=c.taskFailure,y.taskCompletedAt=c.taskCompletedAt}throw h}},C0=(Y)=>W(()=>S$(Y)),N=async(Y,V)=>{let Q=await V0(Y,V),K=await j.findSessionMetadata(Q.sessionId,Q.projectPath);if(!K)throw new m("Session",Q.sessionId);if(!["failed","interrupted","cancelled"].includes(K.taskStatus))throw new C(`Task cannot be retried while status is ${K.taskStatus}`);let G=await j.findSessionTaskDispatch(Q.sessionId,Q.projectPath);if(!G)throw new C("Task retry payload is unavailable");return C0({prompt:G.prompt,title:G.title,sourceProjectPath:G.sourceProjectPath,isolation:G.isolation,permissionMode:G.permissionMode,modelId:G.modelId,reasoningEffort:G.reasoningEffort,serviceTier:G.serviceTier,responseVerbosity:G.responseVerbosity,communicationStyle:G.communicationStyle,attachments:G.attachments,outputSchema:G.outputSchema,retriedFrom:Q})},G0=(Y,V)=>W(()=>N(Y,V)),CO=async(Y,V)=>{let Q=await z0(Y,V);if(!Q.taskWorktree)throw new L("Session does not have a task worktree");try{await q0.restoreSession(Q.taskWorktree);let K=await q0.getDiffArtifact(Q.id);if(!K)throw new C("Task diff artifact is unavailable");return{sessionId:Q.id,projectPath:Q.projectPath,...K}}catch(K){if(K instanceof C)throw K;throw P.error("[SessionRoutes] Failed to load task diff artifact:",K),new C("Task diff artifact is unavailable")}},s$=async(Y,V,Q)=>{let K=await V0(Y,Q);return x0(K).runExclusive(async()=>{let G=await z0(K.sessionId,K.projectPath);if(["queued","running"].includes(G.taskStatus))throw new C(`Task artifacts cannot be delivered while status is ${G.taskStatus}`);if(G.taskDelivery?.status==="applied")throw new C("Task changes have already been applied");if(G.taskDelivery?.status==="discarded")throw new C("Task changes have already been discarded");if(!G.taskWorktree)throw new C("Task worktree is unavailable");let H=async(D,_=!1)=>{let w=await j.updateSessionMetadata(G.id,G.projectPath,{taskDelivery:D,..._?{taskWorktree:null}:{}});if(R$(G,w),_)G.taskWorktree=void 0;return q.publish(K,"task.delivery",{taskDelivery:D,..._?{taskWorktreeRemoved:!0}:{},updatedAt:w.lastMessageTime}),O$(G)};try{if(V==="discard"){try{await q0.restoreSession(G.taskWorktree)}catch(w){return P.warn(`[SessionRoutes] Abandoning unavailable task worktree for ${G.id}:`,w),H({status:"discarded",updatedAt:new Date().toISOString(),changedFiles:G.taskDiffStat?.changedFiles??0,message:"Task artifact discarded; worktree was unavailable"},!0)}let _=await q0.exit({sessionId:G.id,action:"remove",discardChanges:!0});return H({status:"discarded",updatedAt:new Date().toISOString(),changedFiles:_.discardedFiles??0,message:"Task worktree removed"},!0)}try{await q0.restoreSession(G.taskWorktree)}catch(_){throw P.warn(`[SessionRoutes] Task worktree is unavailable for ${G.id}:`,_),new VO("artifact_unavailable","Task worktree is unavailable")}let D=await q0.apply(G.id);return H({status:"applied",updatedAt:new Date().toISOString(),sourceCommit:D.sourceCommit,changedFiles:D.changedFiles,message:"Task changes applied to the source workspace"})}catch(D){if(D instanceof VO)throw await H({status:"conflicted",updatedAt:new Date().toISOString(),message:D.message}),new C(D.message);throw D}})},G$=(Y,V,Q)=>W(()=>s$(Y,V,Q)),f$=async(Y)=>{let V=D0(Y.currentRunId);if(F0(V))return;if(Y.taskIsolation&&Y.taskStatus!=="queued"&&Y.taskStatus!=="running")return;let Q=await w$.hasPendingInbox(Y.projectPath,Y.id),K=!Q&&await w$.hasActiveGoal(Y.projectPath,Y.id);if(!Q&&!K)return;let G=await r(Y),H=!1;try{let D=G.value,_=D0(Y.currentRunId);if(F0(_))return;if(Q&&D.getPendingSteeringCount()===0)await D.reloadPendingInbox();let w=D.getPendingSteeringCount()>0,A=w?null:await D.getGoal(),T=A?.status==="active"||A?.status==="verifying";if(!w&&!T||D.hasTurnOwner())return;O0(Y,"",Y.permissionMode??"default",{pendingInputOnly:w,goalContinuationOnly:T,runtimeLease:G}),H=!0}finally{if(!H)G.release()}},j0=async(Y)=>{let V;try{V=B.enter()}catch{return}try{await f$(Y)}finally{V.release()}};Y$=j0;let y$=async()=>{let Y={scheduled:0,failed:0,deferred:0};if(!B.stats().accepting)return Y;let V=(await j.listSessions()).filter((Q)=>Q.taskStatus==="queued"&&Q.taskIsolation!==void 0).sort((Q,K)=>Q.firstMessageTime.localeCompare(K.firstMessageTime)||Q.projectPath.localeCompare(K.projectPath)||Q.sessionId.localeCompare(K.sessionId));for(let[Q,K]of V.entries()){let G={sessionId:K.sessionId,projectPath:K.projectPath};try{if(!await w$.hasPendingInbox(K.projectPath,K.sessionId)){let D=c$("Queued task input is missing");await j.updateSessionMetadata(K.sessionId,K.projectPath,{taskStatus:"failed",taskStatusReason:D.message,taskFailure:D,taskCompletedAt:new Date().toISOString(),taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}),Y.failed++;continue}let H=await H0(G);if(await j0(H),H.currentRunId)Y.scheduled++}catch(H){if(H instanceof NO||H instanceof J$){Y.deferred+=V.length-Q;break}P.warn(`[SessionRoutes] Failed to recover queued task ${K.sessionId}:`,H),Y.deferred++}}return Y};return $.get("/",async(Y)=>{try{let V=await j.listSessions(),Q=new Set(V.filter((A)=>A.relationType==="subagent").map((A)=>v({sessionId:A.sessionId,projectPath:A.projectPath}))),K=Array.from(t.values()).filter((A)=>!Q.has(v(Y0(A)))&&A.relationType!=="subagent").map((A)=>O$(A)),G=new Set(K.map((A)=>v({sessionId:A.sessionId,projectPath:A.projectPath}))),H=V.filter((A)=>{if(A.relationType==="subagent")return!1;return!G.has(v({sessionId:A.sessionId,projectPath:A.projectPath}))}),D=new Set(G),_=H.filter((A)=>{let T=v({sessionId:A.sessionId,projectPath:A.projectPath});if(D.has(T))return!1;return D.add(T),!0}),w=[...K,..._];return Y.json(w)}catch(V){throw P.error("[SessionRoutes] Failed to list sessions:",V),new e("Failed to list sessions")}}),$.get("/catalog",async(Y)=>{try{let V=Y.req.query("limit"),Q=V===void 0?void 0:Number(V),K=Y.req.query("cursor"),G=Y.req.query("projectPath"),H=Y.req.query("archived");if(H!==void 0&&H!=="true"&&H!=="false")throw new L("archived must be true or false");let D=H==="true",_=await j.listSessionPage({...G?{cwd:A$(G)}:{},...K?{cursor:K}:{},...Q===void 0?{}:{limit:Q},includeSubagents:!1,archived:D}),w=new Map((D?[]:Array.from(t.values())).filter((A)=>A.relationType!=="subagent").map((A)=>[v(Y0(A)),O$(A)]));return Y.json({sessions:_.sessions.map((A)=>w.get(v({sessionId:A.sessionId,projectPath:A.projectPath}))??A),..._.nextCursor?{nextCursor:_.nextCursor}:{}})}catch(V){if(V instanceof L)throw V;if(V instanceof Error&&(V.message.startsWith("Invalid session cursor")||V.message.startsWith("Session cursor scope")||V.message.startsWith("Session catalog")))throw new L(V.message);throw P.error("[SessionRoutes] Failed to list session catalog:",V),new e("Failed to list session catalog")}}),$.post("/",async(Y)=>{try{let V=await Y.req.json(),Q=g(H2,V);if(!Q.success)throw new L("Invalid request body");let{title:K,projectPath:G}=Q.data,H=YO("web",12),D=A$(G||Y.get("directory")||i(),G?"projectPath":"directory"),_=await j.createSessionMetadata(H,D,{title:K,taskStatus:"completed"}),w=M$(_,[]),A=Y0(w);return t.set(v(A),w),q.publish(A,"session.created",{}),Y.json({...O$(w),status:void 0,agentType:void 0,model:void 0})}catch(V){if(P.error("[SessionRoutes] Failed to create session:",V),V instanceof L)throw V;throw new e("Failed to create session")}}),$.get("/:sessionId/export",async(Y)=>{let V=Y.req.param("sessionId");try{let Q=Y.req.query("includeReasoning");if(Q!==void 0&&Q!=="true"&&Q!=="false")throw new L("includeReasoning must be true or false");let K=await V0(V,Y.req.query("projectPath")),G=await j.exportSessionMarkdown(K.sessionId,K.projectPath,{includeReasoning:Q==="true"});return Y.body(G.markdown,200,{"Cache-Control":"no-store","Content-Disposition":`attachment; filename="${G.filename}"`,"Content-Length":String(Buffer.byteLength(G.markdown,"utf8")),"Content-Type":"text/markdown; charset=utf-8","X-Blade-Content-Sha256":G.contentSha256,"X-Blade-Export-Activities":String(G.activityCount),"X-Blade-Export-Messages":String(G.messageCount),"X-Blade-Export-Redactions":String(G.redactionCount)})}catch(Q){if(Q instanceof L||Q instanceof m||Q instanceof L0)throw Q;if(Q instanceof Error&&Q.message==="No conversation content to export")throw new C(Q.message);throw P.error("[SessionRoutes] Failed to export session:",Q),new e("Failed to export session")}}),$.post("/:sessionId/fork",async(Y)=>{let V=Y.req.param("sessionId");try{GO(V);let Q=await Y.req.json(),K=g(L2,Q);if(!K.success)throw new L("Invalid request body");let G=A$(K.data.projectPath),H=await j.findSessionMetadata(V,G);if(!H)throw new m("Session",V);let D=await j.forkSession(V,{sourceProjectPath:H.projectPath,targetProjectPath:H.projectPath}),_=M$(D.metadata,D.messages),w=Y0(_);return t.set(v(w),_),q.publish(w,"task.status",{taskStatus:D.metadata.taskStatus,...D.metadata.taskCompletedAt?{taskCompletedAt:D.metadata.taskCompletedAt}:{},updatedAt:D.metadata.lastMessageTime}),Y.json({session:D.metadata,messages:xO(D.messages)},201)}catch(Q){if(Q instanceof L||Q instanceof m||Q instanceof C)throw Q;if(Q instanceof E1)throw new C("Session has no durable creation record");throw P.error("[SessionRoutes] Failed to fork session:",Q),new e("Failed to fork session")}}),$.get("/:sessionId",async(Y)=>{let V=Y.req.param("sessionId");try{let Q=await V0(V,Y.req.query("projectPath")),K=t.get(v(Q));if(K)return Y.json(O$(K));let G=await j.findSessionMetadata(Q.sessionId,Q.projectPath);if(!G)throw new m("Session",V);return Y.json(G)}catch(Q){if(Q instanceof L||Q instanceof m||Q instanceof L0)throw Q;throw P.error("[SessionRoutes] Failed to get session:",Q),new e("Failed to get session")}}),$.patch("/:sessionId",async(Y)=>{let V=Y.req.param("sessionId");try{let Q=await Y.req.json(),K=g(B2,Q);if(!K.success)throw new L("Invalid request body");if(K.data.title===void 0)throw new L("title is required");let G=await V0(V,K.data.projectPath),H=await j.updateSessionMetadata(G.sessionId,G.projectPath,{title:K.data.title}),D=t.get(v(G));if(D)D.title=H.title??D.title,D.updatedAt=new Date(H.lastMessageTime);if(H.title)q.publish(G,"session.updated",{title:H.title});return Y.json({success:!0,title:H.title})}catch(Q){if(P.error("[SessionRoutes] Failed to update session:",Q),Q instanceof L||Q instanceof m||Q instanceof L0)throw Q;throw new e("Failed to update session")}}),$.get("/:sessionId/rewind",async(Y)=>{let V=await z0(Y.req.param("sessionId"),Y.req.query("projectPath"));return u(V,async(Q)=>Y.json({checkpoints:await Q.listRewindCheckpoints()}))}),$.post("/:sessionId/rewind",async(Y)=>{let V=g(I1,await Y.req.json());if(!V.success)throw new L("Invalid rewind request");let Q=await z0(Y.req.param("sessionId"),Y.req.query("projectPath")),K=Y0(Q);return S(K).runExclusive(async()=>{let G=D0(Q.currentRunId);if(F0(G))throw new C("Cannot rewind while a run is active");return u(Q,async(H)=>{let D;try{D=await H.rewindSession(V.data)}catch(w){if(w instanceof Error&&w.message.startsWith("Cannot rewind while"))throw new C(w.message);throw w}Q.messages=[...D.messages],Q.updatedAt=new Date;let _=xO(D.messages);return q.publish(K,"session.rewound",{targetMessageId:D.checkpoint.messageId,mode:D.mode,removedTurns:D.removedTurns,restoredFiles:D.restoredFiles,messages:_}),Y.json({...D,messages:_})})})}),$.get("/:sessionId/review",async(Y)=>{let V=Y.req.param("sessionId"),Q=await V0(V,Y.req.query("projectPath")),K=await d0.list(Q.projectPath,Q.sessionId);return Y.json({reviews:K.map((G)=>({...G,content:G.completion?L1(G.start,G.completion):void 0}))})}),$.post("/:sessionId/review",async(Y)=>{let V=Y.req.param("sessionId"),Q=g(f1,await Y.req.json());if(!Q.success)throw new L("Invalid code review request");let K=await z0(V,Q.data.projectPath),G=Y0(K),H=v(G);return S(G).runExclusive(async()=>{if(F0(D0(K.currentRunId)))throw new C("Cannot start a review during an active turn");if(T0.has(H))throw new C("Session already has an active review");return u(K,async(D)=>{if(await d0.recoverInterrupted(G.projectPath,G.sessionId,D),Q.data.modelId&&!D.getModelById(Q.data.modelId))throw new L(`Model not found: ${Q.data.modelId}`);if(Q.data.modelId&&D.getCurrentModelId()!==Q.data.modelId)await D.refresh({modelId:Q.data.modelId});if(Q.data.modelId&&K.selectedModelId!==Q.data.modelId){let T=await j.updateSessionMetadata(K.id,K.projectPath,{selectedModelId:Q.data.modelId});R$(K,T)}let _=new AbortController,w;try{w=await d0.start({sessionId:G.sessionId,projectPath:G.projectPath,runtime:D,request:{kind:Q.data.kind,...Q.data.ref?{ref:Q.data.ref}:{},...Q.data.instructions?{instructions:Q.data.instructions}:{}},signal:_.signal,onEvent:(T)=>{if(T.kind==="tool_start")q.publish(G,"review.tool.started",{reviewId:w?.reviewId,toolCallId:T.toolCall.id,toolName:T.toolCall.function.name});else if(T.kind==="tool_progress")q.publish(G,"review.tool.progress",{reviewId:w?.reviewId,toolCallId:T.toolCall.id,message:T.update.message.slice(0,1000)});else if(T.kind==="tool_result")q.publish(G,"review.tool.completed",{reviewId:w?.reviewId,toolCallId:T.toolCall.id,success:T.result.success})}})}catch(T){if(T instanceof Error&&(T.message.includes("active review")||T.message.includes("interrupted review")||T.message.includes("active turn")))throw new C(T.message);if(T instanceof Error&&(T.message.includes("review")||T.message.includes("Git")||T.message.includes("changes")||T.message.includes("ref")))throw new L(T.message);throw T}if(!w)throw new e("Code review failed to start");await c0(K),q.publish(G,"review.started",{reviewId:w.reviewId,kind:Q.data.kind}),q.publish(G,"task.status",{taskStatus:K.taskStatus,...K.taskStatusReason?{taskStatusReason:K.taskStatusReason}:{},...K.taskStartedAt?{taskStartedAt:K.taskStartedAt}:{},...K.taskPromptSummary?{taskPromptSummary:K.taskPromptSummary}:{},updatedAt:new Date().toISOString()});let A=w.completion.then(async(T)=>{K.messages=await j.loadSession(G.sessionId,G.projectPath),await c0(K),q.publish(G,"task.status",{taskStatus:K.taskStatus,...K.taskStatusReason?{taskStatusReason:K.taskStatusReason}:{},...K.taskFailure?{taskFailure:K.taskFailure}:{},...K.taskStartedAt?{taskStartedAt:K.taskStartedAt}:{},...K.taskCompletedAt?{taskCompletedAt:K.taskCompletedAt}:{},...K.taskPromptSummary?{taskPromptSummary:K.taskPromptSummary}:{},updatedAt:new Date().toISOString()}),q.publish(G,"review.completed",{reviewId:w.reviewId,status:T.status,findings:T.findings.length})}).catch((T)=>{P.error(`[SessionRoutes] Code review ${w.reviewId} failed:`,T)}).finally(()=>{if(T0.get(H)?.reviewId===w.reviewId)T0.delete(H)});return T0.set(H,{reviewId:w.reviewId,controller:_,completion:A}),Y.json({reviewId:w.reviewId,status:"running"},202)})})}),$.get("/:sessionId/subagents",async(Y)=>{let V=await z0(Y.req.param("sessionId"),Y.req.query("projectPath"));return u(V,(Q)=>Y.json({subagents:Q.listSubagents().map(l$)}))}),$.post("/:sessionId/subagents/:agentId/resume",async(Y)=>{GO(Y.req.param("agentId"));let V=k1.safeParse(await Y.req.json());if(!V.success)throw new L("Invalid subagent resume request");let Q=await z0(Y.req.param("sessionId"),Y.req.query("projectPath")),K=Y0(Q);return S(K).runExclusive(async()=>{let G=D0(Q.currentRunId);if(F0(G))throw new C("Cannot resume a subagent while a parent run is active");return u(Q,async(H)=>{let D=!1,_,w=(T)=>{q.publish(K,"subagent.complete",{subagentSessionId:T.id,success:T.status==="completed",status:T.status,summary:T.result?.message?.slice(0,500),type:T.subagentType,verificationVerdict:T.result?.verificationVerdict,resumedFrom:T.resumedFrom,rootAgentId:T.rootAgentId,resumeDepth:T.resumeDepth})},A;try{A=H.resumeSubagent({agentId:Y.req.param("agentId"),prompt:V.data.prompt,onEvent:(T,I)=>{C2(K,I,T)},onCompleted:(T)=>{if(D)w(T);else _=T}})}catch(T){if(T instanceof Error&&(T.message.startsWith("Cannot resume")||T.message.startsWith("Subagent cannot")))throw new C(T.message);if(T instanceof Error&&T.message.startsWith("Subagent not found"))throw new m(T.message);throw T}if(q.publish(K,"subagent.start",{subagentSessionId:A.session.id,type:A.session.subagentType,description:A.session.description,resumedFrom:A.source.id,rootAgentId:A.session.rootAgentId,resumeDepth:A.session.resumeDepth}),D=!0,_)w(_);return Y.json({source:l$(A.source),session:l$(A.session)})})})}),$.get("/:sessionId/goal",async(Y)=>{let V=await z0(Y.req.param("sessionId"),Y.req.query("projectPath"));return Y.json({goal:await new T1(V.projectPath,V.id).get()})}),$.put("/:sessionId/goal",async(Y)=>{let V=g(w2,await Y.req.json());if(!V.success)throw new L("Invalid goal request");let Q=await z0(Y.req.param("sessionId"),Y.req.query("projectPath")),K=Y0(Q);return S(K).runExclusive(async()=>{let G=D0(Q.currentRunId);if(F0(G))return Y.json({status:"rejected",reason:"run_active"},409);let D=V.data.permissionMode??Q.permissionMode??"default";if(Q.permissionMode!==D)await N$(Q,D);let _=await r(Q),w=!1;try{let A=await _.value.createGoal(V.data);q.publish(K,"goal.updated",{goal:A});let T=O0(Q,"",D,{goalContinuationOnly:!0,runtimeLease:_});return w=!0,await T.taskAdmissionUpdate,Y.json({status:T.status==="queued"?"queued":"running",runId:T.id,goal:A,queuePosition:T.taskQueuePosition,queueDepth:T.taskQueueDepth,maxConcurrentTasks:T.taskConcurrencyLimit},202)}finally{if(!w)_.release()}})}),$.patch("/:sessionId/goal",async(Y)=>{let V=g(A2,await Y.req.json());if(!V.success)throw new L("Invalid goal update");let Q=await z0(Y.req.param("sessionId"),Y.req.query("projectPath")),K=Y0(Q);return S(K).runExclusive(async()=>{let G=await r(Q),H=!1;try{let D=G.value,_;if(V.data.action==="pause")_=await D.pauseGoal();else if(V.data.action==="edit")_=await D.editGoal(V.data.objective);else _=await D.resumeGoal();if(q.publish(K,"goal.updated",{goal:_}),_.status==="active"&&!F0(D0(Q.currentRunId))){let w=O0(Q,"","default",{goalContinuationOnly:!0,runtimeLease:G});return H=!0,await w.taskAdmissionUpdate,Y.json({status:w.status==="queued"?"queued":"running",runId:w.id,goal:_,queuePosition:w.taskQueuePosition,queueDepth:w.taskQueueDepth,maxConcurrentTasks:w.taskConcurrencyLimit},202)}return Y.json({status:_.status,goal:_})}finally{if(!H)G.release()}})}),$.delete("/:sessionId/goal",async(Y)=>{let V=await z0(Y.req.param("sessionId"),Y.req.query("projectPath")),Q=Y0(V);return u(V,async(K)=>{let G=await K.clearGoal();if(G)q.publish(Q,"goal.cleared",{});return Y.json({cleared:G})})}),$.post("/:sessionId/archive",async(Y)=>{let V=Y.req.param("sessionId");try{let Q=await V0(V,Y.req.query("projectPath")),K=await j.listSessionArchiveMembers(Q.sessionId,Q.projectPath);for(let H of K){let D=S0({sessionId:H.sessionId,projectPath:H.projectPath}),_=t.get(v(D));if(F0(D0(_?.currentRunId)))throw new C(`Stop session ${H.sessionId} before archiving this session tree`)}for(let H of K){let D=S0({sessionId:H.sessionId,projectPath:H.projectPath}),_=t.get(v(D));if(_)await p(_)}let G=await j.archiveSession(Q.sessionId,Q.projectPath);for(let H of K){let D=S0({sessionId:H.sessionId,projectPath:H.projectPath}),_=v(D);t.delete(_),x.delete(_),J.delete(_),z.delete(_),q.publish(D,"session.archived",{archiveRootId:Q.sessionId,archivedAt:G.archivedAt})}if(O.size===0)await U0.getInstance().disconnectAll();return Y.json({session:G,archivedSessionIds:K.map((H)=>H.sessionId)})}catch(Q){if(Q instanceof L||Q instanceof m||Q instanceof L0||Q instanceof C)throw Q;if(Q instanceof zO)throw new C(Q.message);throw P.error("[SessionRoutes] Failed to archive session:",Q),new e("Failed to archive session")}}),$.post("/:sessionId/unarchive",async(Y)=>{let V=Y.req.param("sessionId");try{let Q=await V0(V,Y.req.query("projectPath")),K=await j.listSessionArchiveMembers(Q.sessionId,Q.projectPath),G=await j.unarchiveSession(Q.sessionId,Q.projectPath),H=K.filter((D)=>D.sessionId===Q.sessionId||D.archivedBySessionId===Q.sessionId).map((D)=>D.sessionId);for(let D of H)q.publish({sessionId:D,projectPath:Q.projectPath},"session.unarchived",{archiveRootId:Q.sessionId});return Y.json({session:G,restoredSessionIds:H})}catch(Q){if(Q instanceof L||Q instanceof m||Q instanceof L0)throw Q;if(Q instanceof zO)throw new C(Q.message);throw P.error("[SessionRoutes] Failed to unarchive session:",Q),new e("Failed to unarchive session")}}),$.delete("/:sessionId",async(Y)=>{let V=Y.req.param("sessionId"),Q=Y.req.query("projectPath");try{let K=await V0(V,Q),G=v(K),H=t.get(G),D=O.get(G),_=H?.taskWorktree??await j.findSessionTaskWorktree(K.sessionId,K.projectPath),w;if(H?.currentRunId){let I=D0(H.currentRunId);if(I)E$(I),await I.completion,w=I.id}let A=T0.get(G);if(A)A.controller.abort("session-delete"),await A.completion;if(D)await D.clearGoal().catch((I)=>{P.warn("[SessionRoutes] Failed to clear session goal:",I)});if(await j.deleteSession(K.sessionId,K.projectPath),q.publish(K,"session.deleted",{}),w)E2(w);t.delete(G),x.delete(G),J.delete(G),z.delete(G);let T=O.get(G);if(T){if(!await M.remove(G,T))throw new C("Session Runtime is still active and cannot be deleted")}if(_)try{await q0.restoreSession(_),await q0.exit({sessionId:K.sessionId,action:"remove",discardChanges:!0})}catch(I){P.warn(`[SessionRoutes] Failed to remove deleted task worktree ${K.sessionId}:`,I)}return Y.json({success:!0})}catch(K){if(P.error("[SessionRoutes] Failed to delete session:",K),K instanceof L||K instanceof m||K instanceof L0)throw K;throw new e("Failed to delete session")}}),$.get("/:sessionId/message",async(Y)=>{let V=Y.req.param("sessionId");try{let Q=await V0(V,Y.req.query("projectPath")),K=t.get(v(Q)),G=K?.messages?K.messages:await j.loadSession(Q.sessionId,Q.projectPath);return Y.json(xO(G))}catch(Q){if(P.error("[SessionRoutes] Failed to get messages:",Q),Q instanceof L||Q instanceof m||Q instanceof L0)throw Q;throw new e("Failed to get messages")}}),$.get("/:sessionId/events",async(Y)=>{let V=Y.req.param("sessionId"),Q=await V0(V,Y.req.query("projectPath"));try{await j.assertSessionWritable(Q.sessionId,Q.projectPath)}catch(_){if(_ instanceof XO)throw new C(_.message);throw _}let K=await H0(Q),G=Y.req.header("Last-Event-ID")??Y.req.query("lastEventId"),H=G?Number.parseInt(G,10):Number.NaN,D=Number.isInteger(H)?H+1:void 0;return F2(Y,async(_)=>{let A,T,I=!1,K0,k0,E0=new Promise((f)=>{k0=f}),Q0=()=>{if(T!==void 0)clearInterval(T),T=void 0;A?.(),A=void 0},s=(f)=>{if(I)return;I=!0,Q0(),K0?.close(f),k0()},o0=new Set;_.onAbort(s),K0=new D$({write:async(f)=>{await _.writeSSE(f)},onFailure:(f)=>{P.warn(`[SessionRoutes] SSE egress closed for ${Q.sessionId}: kind=${f.kind} pendingItems=${f.pendingItems??0} pendingBytes=${f.pendingBytes??0}`),s(f)}}),A=q.subscribe((f)=>{if(f.sessionId!==Q.sessionId||f.projectPath!==Q.projectPath)return;let y=f.properties.requestId;if((f.type==="permission.asked"||f.type==="question.required"||f.type==="elicitation.required")&&typeof y==="string"){if(o0.has(y))return;o0.add(y)}if(f.type==="subagent.completion.queued")S(Q).runExclusive(()=>j0(K)).catch((k)=>{P.error(`[SessionRoutes] Failed to wake background completion for ${K.id}:`,k)});K0?.observe(T2(f),f.seq)});try{if(_.aborted||I)return;let f=D0(K.currentRunId),y=F0(f)?await r(K):void 0;try{let c=y?.value,d=c?.getPendingSteeringCount()??0;await K0.writeInitial({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:d,pendingInputDelivery:d>0?c?.hasActiveTurn()?"current_turn":"next_turn":null,recovered:c?.getRecoveredSteeringCount()??0}})})}finally{y?.release()}if(_.aborted||I)return;if(D!==void 0){if(await R1.for(Q.sessionId,Q.projectPath).replay({onCommitted:async(d)=>{if(_.aborted||I)return;let n=q2(d);if(n.seq===void 0)return;await K0.writeReplay({...typeof d.seq==="number"?{id:String(d.seq)}:{},data:JSON.stringify({type:n.type,...n.seq!==void 0?{seq:n.seq}:{},properties:{...n.properties,sessionId:Q.sessionId,projectPath:Q.projectPath}})},n.seq)}},D),_.aborted||I)return}if(K0.finishInitialization({replayed:D!==void 0}),_.aborted||I)return;if(!f&&!T0.has(v(Q))){let d=(await d0.list(Q.projectPath,Q.sessionId)).some((n)=>n.completion===void 0)?await u(K,(n)=>d0.recoverInterrupted(Q.projectPath,Q.sessionId,n)):void 0;if(d)K.messages=await j.loadSession(Q.sessionId,Q.projectPath),await c0(K),q.publish(Q,"review.completed",{reviewId:d.reviewId,status:d.status,findings:0,recovered:!0})}if(_.aborted||I)return;if(!f)await l0.recoverResponded(Q.projectPath,Q.sessionId);if(_.aborted||I)return;let k=f?void 0:await l0.findPending(Q.projectPath,Q.sessionId),h=f?.pendingPermission??(k?{permissionId:k.request.requestId,details:l0.confirmationDetails(k),resolve:()=>{return}}:void 0);if(h){o0.add(h.permissionId);let c=m1(h,!0);K0.observe({data:JSON.stringify({type:c.type,properties:{...c.properties,sessionId:Q.sessionId,projectPath:Q.projectPath}})})}if(_.aborted||I)return;if(j0(K).catch((c)=>{P.error(`[SessionRoutes] Failed to resume pending input for ${V}:`,c)}),_.aborted||I)return;T=setInterval(()=>{if(_.aborted||I)return;K0?.offerHeartbeat({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})})},15000),await E0}finally{s()}})}),$.post("/:sessionId/message",async(Y)=>{let V=Y.req.param("sessionId"),Q=await Y.req.json(),K=g(_2,Q);if(!K.success)throw new L("Invalid message format");let{content:G,attachments:H,modelId:D,reasoningEffort:_,serviceTier:w,responseVerbosity:A,communicationStyle:T,permissionMode:I,projectPath:K0,outputSchema:k0}=K.data,E0;if(k0)try{E0=QO(k0).schema}catch(d){throw new L(d instanceof Error?d.message:"Invalid output schema")}let Q0=T,s=D?.trim();if((H??[]).reduce((d,n)=>d+(typeof n.content==="string"?Buffer.byteLength(n.content):0),0)>i$)throw new L("Message attachments exceed the 5 MiB limit");let f=I,y=N1(G,H),k=await z0(V,K0??Y.req.query("projectPath")),h=f??k.permissionMode??"default",c=Y0(k);return S(c).runExclusive(async()=>{let d=D0(k.currentRunId);if(F0(d)){if(E0)throw new C("Wait for the active turn to finish before setting an output schema");return u(k,async(o)=>{if(s&&!o.getModelById(s))throw new L(`Model not found: ${s}`);if(s&&o.getCurrentModelId()!==s)throw new C("Wait for the active turn to finish before switching models");if(_&&o.getReasoningConfiguration().selection!==_)throw new C("Wait for the active turn to finish before switching reasoning effort");if(w&&o.getServiceTierConfiguration().selection!==w)throw new C("Wait for the active turn to finish before switching service tier");if(A&&o.getResponseVerbosityConfiguration().selection!==A)throw new C("Wait for the active turn to finish before switching response verbosity");if(Q0&&o.getCommunicationStyleConfiguration().selection!==Q0)throw new C("Wait for the active turn to finish before switching communication style");if(f&&k.permissionMode!==f)throw new C("Wait for the active turn to finish before switching permission mode");let $0=await o.enqueueSteering(y,{allowBeforeTurn:!0});if(!$0.accepted)return Y.json({status:"rejected",reason:$0.reason??"turn_unavailable"},409);let g0=$0.messageId??Z$(12),U$=$0.queued;q.publish(c,"message.created",{messageId:g0,role:"user",content:WO(y)});let m$=$0.delivery==="next_turn"?"follow_up.queued":"steering.queued";if(q.publish(c,m$,{runId:d.id,messageId:g0,queued:U$}),$0.delivery==="next_turn"&&d.status!=="running"&&d.status!=="waiting_permission")j0(k).catch((h$)=>{P.error(`[SessionRoutes] Failed to wake queued follow-up for ${V}:`,h$)});if($0.delivery==="next_turn")d.pendingFollowUpRequested=!0;return Y.json({runId:d.id,messageId:g0,status:$0.delivery==="next_turn"?"follow_up_queued":"steering_queued",queued:U$},202)})}if(k.permissionMode!==h)await N$(k,h);let n=await r(k,{permissionMode:h,...Q0&&!Q0.includes(":")?{communicationStyle:Q0}:{}}),W$=!1;try{let o=n.value;if(s&&!o.getModelById(s))throw new L(`Model not found: ${s}`);if(_)try{o.resolveReasoningConfiguration(_,s)}catch(X0){throw new L(X0 instanceof Error?X0.message:"Invalid reasoning effort")}if(w)try{o.resolveServiceTierConfiguration(w,s)}catch(X0){throw new L(X0 instanceof Error?X0.message:"Invalid service tier")}if(A)try{o.resolveResponseVerbosityConfiguration(A,s)}catch(X0){throw new L(X0 instanceof Error?X0.message:"Invalid response verbosity")}let $0=Q0?o.resolveCommunicationStyleConfiguration(Q0):void 0;if($0?.source!==void 0&&$0.source!=="built-in"&&!$0.contentSha256)throw new L("Custom communication style has no provenance");let g0=o.getCurrentModelId(),U$=o.getReasoningConfiguration(),m$=o.getServiceTierConfiguration(),h$=o.getResponseVerbosityConfiguration(),IO=o.getCommunicationStyleConfiguration(),kO=Boolean(s)&&g0!==s,PO=Boolean(_)&&U$.selection!==_,SO=Boolean(w)&&m$.selection!==w,fO=Boolean(A)&&h$.selection!==A,yO=Boolean(Q0)&&IO.selection!==Q0;if(kO||PO||SO||fO||yO)await o.refresh({...s?{modelId:s}:{},..._?{reasoningEffort:_}:{},...w?{serviceTier:w}:{},...A?{responseVerbosity:A}:{},...Q0?{communicationStyle:Q0}:{}});let e$={...s&&k.selectedModelId!==s?{selectedModelId:s}:{},..._&&k.reasoningEffort!==_?{reasoningEffort:_}:{},...w&&k.serviceTier!==w?{serviceTier:w}:{},...A&&k.responseVerbosity!==A?{responseVerbosity:A}:{},...$0&&(k.communicationStyle!==Q0||k.communicationStyleDigest!==$0.contentSha256)?{communicationStyle:Q0,communicationStyleDigest:$0.source==="built-in"?null:$0.contentSha256}:{}};if(Object.keys(e$).length>0)try{let X0=await j.updateSessionMetadata(k.id,k.projectPath,e$);k.permissionMode=X0.permissionMode,k.selectedModelId=X0.selectedModelId,k.reasoningEffort=X0.reasoningEffort,k.serviceTier=X0.serviceTier,k.responseVerbosity=X0.responseVerbosity,k.communicationStyle=X0.communicationStyle,k.communicationStyleDigest=X0.communicationStyleDigest,k.updatedAt=new Date(X0.lastMessageTime),q.publish(c,"session.updated",e$)}catch(X0){if(kO||PO||SO||fO||yO)await o.refresh({...g0?{modelId:g0}:{},reasoningEffort:U$.selection,serviceTier:m$.selection,responseVerbosity:h$.selection,communicationStyle:IO.selection}).catch((p4)=>P.error("[SessionRoutes] Failed to roll back non-durable model settings:",p4));throw X0}let F$=E0?await o.prepareInputTurn(y,{outputSchema:E0}):await o.prepareInputTurn(y);if(!F$.accepted)return Y.json({status:"rejected",reason:F$.reason},F$.reason==="queue_full"?429:409);let n0=O0(k,y,h,{preparedInputTurn:F$,outputSchema:E0,runtimeLease:n});return W$=!0,await n0.taskAdmissionUpdate,Y.json({runId:n0.id,messageId:F$.messageId,status:n0.status==="queued"?"queued":"running",queuePosition:n0.taskQueuePosition,queueDepth:n0.taskQueueDepth,maxConcurrentTasks:n0.taskConcurrencyLimit},202)}finally{if(!W$)n.release()}})}),$.post("/:sessionId/shell",async(Y)=>{let V=Y.req.param("sessionId"),Q=g(S1,await Y.req.json());if(!Q.success)throw new L("Invalid user shell command");let K=await z0(V,Q.data.projectPath??Y.req.query("projectPath")),G=Y0(K),H=v(G);return S(G).runExclusive(async()=>{if(I0.has(H))throw new C("A user shell command is already running in this Session");let D=await r(K),_=D.value,w=new AbortController,A,T=new Promise((I)=>{A=I});I0.set(H,{controller:w,completion:T});try{let I=await _.executeUserShellCommand(Q.data.command,{signal:w.signal});K.messages=await j.loadSession(K.id,K.projectPath),K.updatedAt=new Date;let K0=D0(K.currentRunId);if(I.delivery==="next_turn"&&F0(K0))K0.pendingFollowUpRequested=!0;return Y.json({executionId:I.executionId,messageId:I.messageId,record:I.record,auxiliary:I.auxiliary,...I.delivery?{delivery:I.delivery}:{},...I.queued!==void 0?{queued:I.queued}:{}})}finally{I0.delete(H),A(),D.release()}})}),$.post("/:sessionId/abort",async(Y)=>{let V=Y.req.param("sessionId"),Q=await V0(V,Y.req.query("projectPath")),K=t.get(v(Q));if(K?.currentRunId){let D=D0(K.currentRunId);if(D)E$(D),await D.completion}let G=I0.get(v(Q));if(G)G.controller.abort("user-cancel"),await G.completion;let H=T0.get(v(Q));if(H)H.controller.abort("user-cancel"),await H.completion;return Y.json({success:!0})}),$.get("/:sessionId/status",async(Y)=>{let V=Y.req.param("sessionId"),Q=await V0(V,Y.req.query("projectPath")),K=t.get(v(Q)),G=T0.get(v(Q));if(G)return Y.json({sessionId:V,projectPath:Q.projectPath,reviewId:G.reviewId,status:"reviewing"});if(!K?.currentRunId)return Y.json({sessionId:V,projectPath:Q.projectPath,status:"idle"});let H=D0(K.currentRunId);return Y.json({sessionId:V,projectPath:Q.projectPath,runId:K.currentRunId,status:H?.status||"idle"})}),{app:$,dispatchTask:C0,retryTask:G0,getTaskDiff:CO,deliverTask:G$,recoverQueuedTasks:y$,getRuntimeResidencyStats:()=>M.getStats(),shutdown:(Y="server-shutdown")=>{if(E)return E;return B.close(Y),clearInterval(R),E=(async()=>{let V,Q=async(_)=>{let w=await Promise.allSettled(_);for(let A of w)if(A.status==="rejected")V??=A.reason},K=new Set,G=()=>{for(let _ of R0.values()){if(_.completion)K.add(_.completion);if(F0(_))E$(_,Y)}for(let _ of I0.values())_.controller.abort(Y),K.add(_.completion);for(let _ of T0.values())_.controller.abort(Y),K.add(_.completion)},H=B.waitForIdle(),D=!1;H.then(()=>{D=!0});while(!D)G(),await Promise.race([H,new Promise((_)=>setImmediate(_))]);if(await H,G(),await Q([...K]),await Q([...J.values()]),G(),await Q([...K]),await Q([M.disposeAll()]),O.clear(),await Q([...Z.values()]),await Q([U0.getInstance().disconnectAll()]),J.clear(),Z.clear(),x.clear(),z.clear(),X.clear(),t.clear(),Y$===j0)Y$=void 0;if(V!==void 0)throw V})(),E}}};async function j2($,O,J,Z,x,z={}){let{abortController:X,sessionId:U,id:M}=$,B=z.preparedInputTurn?.messageId??Z$(12),E=z.pendingInputOnly===!0||z.preparedInputTurn?.mode==="pending"||z.goalContinuationOnly===!0?void 0:Z$(12),W=z.runtimeLease,S,x0,l=Y0(O),b=(u,p)=>{q.publish(l,u,p)},r=async()=>{let u=String(X.signal.reason||"Task run cancelled");if(O.taskIsolation){if(!W)W=await x(O).catch(()=>{return});let p=S??W?.value;if(u==="user-cancel")await p?.discardPendingInput().catch((z0)=>{P.warn(`[SessionRoutes] Failed to discard cancelled input for ${O.id}:`,z0)});let H0=await p?.setTaskStatus("cancelled",u).catch(()=>{return});if(H0)R$(O,H0);else await c0(O).catch(()=>{return})}O.taskStatus="cancelled",O.taskStatusReason=u,O.taskCompletedAt??=new Date().toISOString()};try{if(z.taskAdmission){if(await z.taskAdmission.ready,await $.taskAdmissionUpdate,X.signal.aborted)throw Error(String(X.signal.reason||"Task run cancelled"))}if(O.taskStatus="running",O.taskStatusReason=void 0,O.taskStartedAt=new Date().toISOString(),O.taskCompletedAt=void 0,!z.pendingInputOnly&&!z.goalContinuationOnly)b("message.created",{messageId:B,role:"user",content:WO(J)});if(b("session.status",{status:"running"}),E)b("message.created",{messageId:E,role:"assistant",content:""});W??=await x(O),S=W.value;let u=S,p=Boolean(z.outputSchema??u.getPendingSteeringMessages().find((N)=>N.outputSchema)?.outputSchema);x0=await C1.createWithRuntime(u,{sessionId:U,...O.taskWorktree?{toolBlacklist:["EnterWorktree","ExitWorktree"]}:{}});let H0=async(N)=>{let G0=N.interactionRequestId??Z$(12),CO=300000;$.status="waiting_permission";let s$=new Promise((y$)=>{let jO=setTimeout(()=>{P.warn(`[SessionRoutes] Permission ${G0} timed out after 300000ms`),b("permission.timeout",{requestId:G0}),y$({approved:!1,reason:"timeout"})},300000);$.pendingPermission={permissionId:G0,resolve:(Y)=>{clearTimeout(jO),y$(Y)},details:N}}),G$=$.pendingPermission;if(!G$)throw Error("Permission request was not registered");let f$=m1(G$);b(f$.type,f$.properties),P.info(`[SessionRoutes] Permission request created: ${G0}, runId: ${M}`);let j0=await s$;if(P.info(`[SessionRoutes] Permission response received: ${G0}, approved: ${j0.approved}`),!X.signal.aborted)$.status="running";if($.pendingPermission===G$)$.pendingPermission=void 0;return b("interaction.resolved",{requestId:G0}),j0},N$={messages:await j.loadSessionModelContext(O.id,O.projectPath),userId:"web-user",sessionId:U,workspaceRoot:O.projectPath,signal:X.signal,permissionMode:Z,onPermissionModeChange:async(N)=>{O.permissionMode=N,O.updatedAt=new Date,b("session.updated",{permissionMode:N})},...O.taskWorktree?{worktreeActive:!0}:{},confirmationHandler:{requestConfirmation:H0}},O0=()=>{if(!E)E=Z$(12),b("message.created",{messageId:E,role:"assistant",content:""});return E},S$=async(N)=>{switch(N.kind){case"content_delta":if(p)break;b("message.delta",{messageId:O0(),delta:N.delta});break;case"structured_output":b("structured.output",{messageId:O0(),output:N.output,schemaDigest:N.schemaDigest});break;case"thinking_delta":b("thinking.delta",{messageId:O0(),delta:N.delta});break;case"tool_start":if("function"in N.toolCall){if(N.toolCall.function.name===x$)break;b("tool.start",{messageId:O0(),toolName:N.toolCall.function.name,toolCallId:N.toolCall.id,arguments:N.toolCall.function.arguments,toolKind:N.toolKind})}break;case"tool_result":if("function"in N.toolCall){if(N.toolCall.function.name===x$)break;b("tool.result",{messageId:O0(),toolName:N.toolCall.function.name,toolCallId:N.toolCall.id,success:N.result.success,summary:N.result.metadata?.summary,output:j$(q$(C$(N.toolCall.function.name,N.result),b$)),metadata:T$(N.toolCall.function.name,N.result.metadata)})}break;case"tool_progress":if("function"in N.toolCall){if(N.toolCall.function.name===x$)break;b("tool.progress",{messageId:O0(),toolName:N.toolCall.function.name,toolCallId:N.toolCall.id,...N.update})}break;case"token_usage":b("token.usage",{...N.usage});break;case"turn_start":b("turn.started",{turn:N.turn,maxTurns:N.maxTurns});break;case"provider_admission":b("provider.admission",{phase:N.phase,requestClass:N.requestClass,resource:N.resource,scope:N.scope,reason:N.reason,queuePosition:N.queuePosition,queueDepth:N.queueDepth,inFlight:N.inFlight,limit:N.limit,waitMs:N.waitMs,maxWaitMs:N.maxWaitMs,recoveryRemainingMs:N.recoveryRemainingMs});break;case"provider_circuit":b("provider.circuit",{phase:N.phase,reason:N.reason,statusCode:N.statusCode,retryAfterMs:N.retryAfterMs,nextProbeAt:N.nextProbeAt,openDurationMs:N.openDurationMs,sampleCount:N.sampleCount,failureCount:N.failureCount,recoveryRemainingMs:N.recoveryRemainingMs});break;case"provider_retry":b("provider.retry",{phase:N.phase,attempt:N.attempt,maxRetries:N.maxRetries,reason:N.reason,statusCode:N.statusCode,delayMs:N.delayMs,nextRetryAt:N.nextRetryAt,mode:N.mode,recoveryBudgetMs:N.recoveryBudgetMs,recoveryElapsedMs:N.recoveryElapsedMs,recoveryRemainingMs:N.recoveryRemainingMs,exhaustedBy:N.exhaustedBy});break;case"provider_stall":b("provider.stall",{phase:N.phase,stallCount:N.stallCount,durationMs:N.durationMs,warningAfterMs:N.warningAfterMs,timeoutMs:N.timeoutMs,outputStarted:N.outputStarted});break;case"action_stationarity":b("action.stationarity",{phase:N.phase,toolName:N.toolName,runLength:N.runLength,nudgeThreshold:N.nudgeThreshold,haltThreshold:N.haltThreshold,progressAware:N.progressAware});break;case"mcp_catalog_changed":b("mcp.catalog.changed",{messageId:O0(),revision:N.revision,serverName:N.serverName,added:N.added,removed:N.removed,updated:N.updated});break;case"mcp_content_changed":b("mcp.content.changed",{messageId:O0(),revision:N.revision,serverName:N.serverName,contentKind:N.contentKind,added:N.added,removed:N.removed,updated:N.updated});break;case"mcp_resource_updated":b("mcp.resource.updated",{messageId:O0(),revision:N.revision,serverName:N.serverName,uri:N.uri});break;case"mcp_connection_changed":b("mcp.connection.changed",{messageId:O0(),revision:N.revision,serverName:N.serverName,phase:N.phase,reason:N.reason,attempt:N.attempt,maxAttempts:N.maxAttempts,nextRetryAt:N.nextRetryAt,error:N.error});break;case"mcp_log":b("mcp.log",{messageId:O0(),revision:N.revision,serverName:N.serverName,level:N.level,logger:N.logger,message:N.message,projectedBytes:N.projectedBytes,dataSha256:N.dataSha256,truncated:N.truncated,detailsOmitted:N.detailsOmitted,timestamp:N.timestamp,synthetic:N.synthetic});break;case"mcp_instructions_changed":b("mcp.instructions.changed",{messageId:O0(),revision:N.revision,serverName:N.serverName,action:N.action,reason:N.reason,text:N.text,sourceBytes:N.sourceBytes,projectedBytes:N.projectedBytes,sha256:N.sha256,truncated:N.truncated,detailsOmitted:N.detailsOmitted});break;case"mcp_task_changed":b("mcp.task.changed",{messageId:O0(),revision:N.revision,taskId:N.taskId,serverName:N.serverName,toolName:N.toolName,status:N.status,statusMessage:N.statusMessage,createdAt:N.createdAt,updatedAt:N.updatedAt,completedAt:N.completedAt,hasResult:N.hasResult,error:N.error});break;case"project_rules_loaded":b("project.rules.loaded",{messageId:O0(),files:N.files,triggerPaths:N.triggerPaths,blockedWrite:N.blockedWrite});break;case"steering_applied":b("steering.applied",{runId:M,messageIds:N.messageIds,count:N.count,recovered:N.recovered,delivery:N.delivery,queued:u.getPendingSteeringCount()});break;case"follow_up_started":{if(E)b("message.complete",{messageId:E}),E=void 0;for(let G0 of N.messages){if(!G0.recovered||G0.persisted)continue;b("message.created",{messageId:G0.id,role:"user",content:WO(G0.content),recovered:!0})}b("follow_up.started",{runId:M,queued:N.queued,recovered:N.recovered}),O0();break}case"goal_updated":b("goal.updated",{goal:N.goal});break;case"goal_continuation_started":b("goal.continuation.started",{goal:N.goal,continuation:N.continuation}),O0();break;case"compaction":b(N.phase==="start"?"compaction.started":"compaction.completed",{...N.reason?{reason:N.reason}:{},...N.strategy?{strategy:N.strategy}:{},...N.outcome?{outcome:N.outcome}:{},...N.preTokens!==void 0?{preTokens:N.preTokens}:{},...N.postTokens!==void 0?{postTokens:N.postTokens}:{}});break;case"model_fallback":b("model.fallback",{});break;case"task_update":b("task.updated",{tasks:N.tasks});break;default:break}},C0=await KO(x0.chatStream(J,N$,{stream:!0,pendingInputOnly:z.pendingInputOnly,preparedInputTurn:z.preparedInputTurn,goalContinuationOnly:z.goalContinuationOnly,outputSchema:z.outputSchema,taskAdmission:z.taskAdmission}),S$);if(!C0.success)throw Error(C0.error?.message??"Agent run failed");for(let N=0;N<20;N++){let G0=$.pendingFollowUpRequested===!0;if($.pendingFollowUpRequested=!1,u.getPendingSteeringCount()===0){if(!G0)break;continue}if(X.signal.aborted)break;if(C0=await KO(x0.chatStream("",N$,{stream:!0,pendingInputOnly:!0,taskAdmission:z.taskAdmission}),S$),!C0.success)throw Error(C0.error?.message??"Agent follow-up failed")}if(O.messages=await j.loadSession(O.id,O.projectPath),O.updatedAt=new Date,await c0(O),X.signal.aborted||$.status==="cancelled"){await r(),b("session.status",{status:"idle"});return}if(E)b("message.complete",{messageId:E});b("thinking.completed",{}),$.status="completed",O.taskStatus="completed",O.taskCompletedAt??=new Date().toISOString(),b("session.completed",{runId:M,outputTruncated:C0.metadata?.outputTruncated??!1}),b("session.status",{status:"idle"})}catch(u){if(S&&z.preparedInputTurn)await S.finishTurn(z.preparedInputTurn.handle).catch(()=>{return});if(X.signal.aborted||$.status==="cancelled"){E$($,"runtime-abort"),await r(),b("session.status",{status:"idle"});return}await c0(O).catch(()=>{return}),P.error("[SessionRoutes] Agent execution error:",u),$.status="failed",O.taskStatus="failed",O.taskCompletedAt??=new Date().toISOString();let p=c$(u);if(!O.taskFailure){let H0=S?await S.setTaskStatus("failed",u).catch(()=>{return}):await j.updateSessionMetadata(O.id,O.projectPath,{taskStatus:"failed",taskStatusReason:p.message,taskFailure:p,taskCompletedAt:O.taskCompletedAt,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}).catch(()=>{return});if(H0)R$(O,H0)}O.taskStatusReason??=p.message,O.taskFailure??=p,b("session.error",{error:O.taskFailure.message,taskFailure:O.taskFailure}),b("session.status",{status:"error"})}finally{if(z.taskAdmission?.release(),z.taskAdmission){let u=e0.getStats();b("task.status",{taskStatus:O.taskStatus,...O.taskStatusReason?{taskStatusReason:O.taskStatusReason}:{},...O.taskFailure?{taskFailure:O.taskFailure}:{},...O.taskStartedAt?{taskStartedAt:O.taskStartedAt}:{},...O.taskCompletedAt?{taskCompletedAt:O.taskCompletedAt}:{},...O.taskDiffStat?{taskDiffStat:O.taskDiffStat}:{},taskQueueDepth:u.queued,taskConcurrencyLimit:u.maxConcurrent,taskInFlight:u.inFlight,updatedAt:new Date().toISOString()})}if(await x0?.destroy().catch(()=>{return}),W?.release(),$.disposeRuntimeOnSettle&&z.disposeRuntime)await z.disposeRuntime(O,S).catch((u)=>{P.warn(`[SessionRoutes] Failed to dispose terminal task runtime ${O.id}:`,u)});M2($)}}async function g1($,O,J){P.info(`[SessionRoutes] Looking for permission ${O} in session ${$.sessionId}`),P.info(`[SessionRoutes] Active runs: ${R0.size}`);for(let[z,X]of R0.entries())if(P.info(`[SessionRoutes] Checking run ${z}: sessionId=${X.sessionId}, projectPath=${X.projectPath}, pendingPermission=${X.pendingPermission?.permissionId}`),X.sessionId===$.sessionId&&X.projectPath===$.projectPath&&X.pendingPermission?.permissionId===O){if(X.pendingPermission.details.interactionRequestId)await l0.respond($.projectPath,$.sessionId,O,J);return X.pendingPermission.resolve(J),P.info(`[SessionRoutes] Permission ${O} responded, runId: ${X.id}`),!0}let Z=await l0.findPending($.projectPath,$.sessionId);if(!Z||Z.request.requestId!==O)return P.error(`[SessionRoutes] Permission not found: ${O}`),!1;await l0.respondAndRecover($.projectPath,$.sessionId,O,J);let x=t.get(v($));if(!x){let z=await j.findSessionMetadata($.sessionId,$.projectPath);if(!z)return!1;let[X,U]=await Promise.all([j.loadSession($.sessionId,$.projectPath),j.findSessionTaskWorktree($.sessionId,$.projectPath)]);x=M$(z,X,U),t.set(v($),x)}else await c0(x);if(q.publish($,"interaction.resolved",{requestId:O}),Y$)Y$(x).catch((z)=>{P.error(`[SessionRoutes] Failed to resume recovered interaction ${O}:`,z)});return!0}var FO=a("Service"),k2=F.Object({approved:F.Boolean(),remember:F.Optional(F.Boolean()),scope:F.Optional(W0(["once","session","project"])),targetMode:F.Optional(W0(["default","autoEdit","plan","yolo"])),feedback:F.Optional(F.String({maxLength:4000})),answers:F.Optional(F.Record(F.String({maxLength:80}),F.Union([F.String({maxLength:4000}),F.Array(F.String({maxLength:1000}),{maxItems:4})]),{maxProperties:4})),elicitation:F.Optional(F.Object({action:W0(["accept","decline","cancel"]),content:F.Optional(F.Record(F.String(),F.Union([F.String({maxLength:4000}),F.Number(),F.Boolean(),F.Array(F.String({maxLength:1000}),{maxItems:100})]),{maxProperties:32}))}))}),v1=()=>{let $=new I2;return $.post("/:permissionId",async(O)=>{let J=O.req.param("permissionId"),Z=O.req.query("sessionId"),x=O.req.query("projectPath");FO.info(`[PermissionRoutes] Received permission response: permissionId=${J}, sessionId=${Z}`);try{let z=await O.req.json(),X=g(k2,z);if(!X.success)throw new L("Invalid permission response format");let{approved:U,remember:M,scope:B,targetMode:R,feedback:E,answers:W,elicitation:S}=X.data;if(!Z)throw new L("sessionId query parameter is required");let x0=await V0(Z,x);if(!await g1(x0,J,{approved:U,reason:E,scope:B,targetMode:R,feedback:E,answers:W,elicitation:S}))throw new m("Permission request",J);return FO.info(`[PermissionRoutes] Permission ${J} ${U?"approved":"denied"}`),O.json({success:!0,approved:U,remember:M})}catch(z){if(FO.error("[PermissionRoutes] Failed to respond to permission:",z),z instanceof L||z instanceof L0||z instanceof m||z instanceof Z0)throw z;throw z}}),$};import u1 from"node:path";import{Hono as P2}from"hono";var S2=F.Object({projectPath:F.String({minLength:1}),enabled:F.Boolean(),scope:F.Optional(W0(["local","project","global"]))}),f2=F.Object({projectPath:F.String({minLength:1})}),y2=F.Object({projectPath:F.String({minLength:1}),source:F.String({minLength:1}),trust:F.Literal(!0),ref:F.Optional(F.String({minLength:1}))}),m2=F.Object({projectPath:F.String({minLength:1}),trust:F.Literal(!0)}),h2=F.Object({projectPath:F.String({minLength:1}),confirm:F.Literal(!0)}),g2=F.Object({projectPath:F.String({minLength:1}),source:F.String({minLength:1}),ref:F.Optional(F.String({minLength:1}))}),p1=F.Object({projectPath:F.String({minLength:1}),confirm:F.Optional(F.Literal(!0))}),v2=F.Object({projectPath:F.String({minLength:1}),scope:F.Optional(W0(["local","project","global"])),policy:F.Object({restrictToAllowedSources:F.Boolean(),requireGitCommitSha:F.Boolean(),allowedGitHosts:F.Array(F.String()),allowedMarketplaces:F.Array(F.String()),allowedLocalRoots:F.Array(F.String())})});function A0($){if(!$||!u1.isAbsolute($))throw new L("projectPath must be absolute");return u1.resolve($)}async function d1($){let[O,J]=await Promise.all([_0($),_$.getInstance().loadWorkspacePluginSettingsResolution($)]);return O.plugins.getAll().map((Z)=>({name:Z.manifest.name,description:Z.manifest.description,version:Z.manifest.version,source:Z.source,enabled:Z.status==="active",status:Z.status,commands:Z.commands.length,skills:Z.skills.length,agents:Z.agents.length,hooks:Z.hooks?Object.values(Z.hooks).reduce((x,z)=>x+(Array.isArray(z)?z.length:0),0):0,mcpServers:Object.keys(Z.mcpServers??{}).length,configurable:Z.source!=="cli",managed:Z.installation!==void 0,marketplace:Z.installation?.source.type==="marketplace"?Z.installation.source.marketplace:void 0,revision:Z.installation?.revision,installedAt:Z.installation?.installedAt,updatedAt:Z.installation?.updatedAt,compatibilityIssues:Z.compatibilityIssues??[],effectiveScope:Z.source==="cli"?"invocation":J.settings[Z.manifest.name]?.effectiveScope??"default",settingLayers:Z.source==="cli"?{invocation:!0}:J.settings[Z.manifest.name]?.layers??{}}))}async function u2(){let $=l1(),[O,J]=await Promise.all([$.listCatalogs(),$.listInstallationRecords()]),Z=new Map(J.map((x)=>[x.name,x]));return O.map(({marketplace:x,manifest:z})=>({name:x.name,description:z.description??z.metadata?.description??"",sourceType:x.source.type,revision:x.revision,updatedAt:x.updatedAt,plugins:z.plugins.map((X)=>{let U=Z.get(X.name);return{name:X.name,description:X.description??"",version:X.version,category:X.category,tags:X.tags??[],installed:U!==void 0,installedVersion:U?.version}})}))}function Q$($,O){if(!$.success)throw new L($.error??O)}var $4=()=>{let $=new P2;return $.get("/",async(O)=>{let J=A0(O.req.query("projectPath"));return O.json(await d1(J))}),$.post("/refresh",async(O)=>{let J=g(f2,await O.req.json());if(!J.success)throw new L("Invalid plugin refresh request");let Z=A0(J.data.projectPath),x=await i1(Z);return O.json({plugins:await d1(Z),errors:x.discovery.errors.map((z)=>({code:z.code??"LOAD_ERROR",error:z.error}))})}),$.get("/catalog",async(O)=>{return A0(O.req.query("projectPath")),O.json(await u2())}),$.get("/policy",async(O)=>{let J=A0(O.req.query("projectPath")),Z=await _$.getInstance().loadWorkspacePluginSourcePolicy(J);return O.json({policy:Z,environmentRequiresSha:process.env.BLADE_PLUGIN_REQUIRE_SHA==="1"||process.env.BLADE_PLUGIN_REQUIRE_SHA==="true"})}),$.post("/policy",async(O)=>{let J=g(v2,await O.req.json());if(!J.success)throw new L("Invalid plugin source policy request");let Z=A0(J.data.projectPath),x=await a1(Z,J.data.policy,J.data.scope??"global");return O.json({policy:x})}),$.post("/install",async(O)=>{let J=g(y2,await O.req.json());if(!J.success)throw new L("Invalid plugin install request; explicit source trust is required");let Z=A0(J.data.projectPath),{result:x}=await o1(Z,J.data.source,{trusted:J.data.trust,ref:J.data.ref});return Q$(x,"Plugin installation failed"),O.json({name:x.pluginName,version:x.manifest?.version,revision:x.installation?.revision,changed:x.changed,installedDependencies:x.installedDependencies??[]})}),$.post("/marketplaces",async(O)=>{let J=g(g2,await O.req.json());if(!J.success)throw new L("Invalid marketplace add request");let Z=A0(J.data.projectPath),x=await r1(Z,J.data.source,J.data.ref);return Q$(x,"Marketplace installation failed"),O.json({name:x.marketplace?.name,plugins:x.manifest?.plugins.length??0,revision:x.marketplace?.revision,changed:x.changed})}),$.post("/marketplaces/:name/refresh",async(O)=>{let J=g(p1,await O.req.json());if(!J.success)throw new L("Invalid marketplace refresh request");let Z=await s1(A0(J.data.projectPath),O.req.param("name"));return Q$(Z,"Marketplace refresh failed"),O.json({name:Z.marketplace?.name,plugins:Z.manifest?.plugins.length??0,revision:Z.marketplace?.revision,changed:Z.changed})}),$.post("/marketplaces/:name/remove",async(O)=>{let J=g(p1,await O.req.json());if(!J.success||J.data.confirm!==!0)throw new L("Invalid marketplace removal request; explicit confirmation is required");A0(J.data.projectPath);let Z=await e1(O.req.param("name"),!0);return Q$(Z,"Marketplace removal failed"),O.json({name:Z.marketplace?.name,removed:!0})}),$.post("/:name/update",async(O)=>{let J=g(m2,await O.req.json());if(!J.success)throw new L("Invalid plugin update request; explicit source trust is required");let Z=A0(J.data.projectPath),{result:x}=await n1(Z,O.req.param("name"),{trusted:J.data.trust});return Q$(x,"Plugin update failed"),O.json({name:x.pluginName,version:x.manifest?.version,revision:x.installation?.revision,changed:x.changed,updatedDependencies:x.updatedDependencies??[]})}),$.post("/:name/uninstall",async(O)=>{let J=g(h2,await O.req.json());if(!J.success)throw new L("Invalid plugin uninstall request; explicit confirmation is required");let Z=A0(J.data.projectPath),{result:x}=await t1(Z,O.req.param("name"),J.data.confirm);return Q$(x,"Plugin uninstall failed"),O.json({name:x.pluginName,removed:!0})}),$.post("/:name/state",async(O)=>{let J=g(S2,await O.req.json());if(!J.success)throw new L("Invalid plugin state request");let Z=A0(J.data.projectPath),x=O.req.param("name"),X=(await _0(Z)).plugins.get(x);if(!X)throw new m("Plugin",x);if(X.source==="cli")throw new L(`Plugin "${x}" was loaded with --plugin-dir and is invocation-scoped`);let U=await c1(Z,x,J.data.enabled,J.data.scope??"local");return O.json(U)}),$};import{Hono as i2}from"hono";import{execFile as p2}from"node:child_process";import d2 from"node:path";var _O="__BLADE_DIRECTORY_PICKER_CANCELLED__",l2=900000;function c2($,O){return new Promise((J)=>{p2($,[...O],{timeout:l2,maxBuffer:65536,windowsHide:!0},(Z,x,z)=>{let X=Z?.code;J({stdout:x,stderr:z,exitCode:typeof X==="number"?X:Z?1:0,...typeof X==="string"?{errorCode:X}:{}})})})}function DO($){let O=$.replace(/[\r\n]+$/,"");if(!O||O===_O)return{cancelled:!0};if(!d2.isAbsolute(O))throw Error("The folder picker returned an invalid path");return{cancelled:!1,path:O}}function HO($){return $.exitCode!==0||Boolean($.errorCode)}class O4{platform;runCommand;activeSelection=null;constructor($={}){this.platform=$.platform??process.platform,this.runCommand=$.runCommand??c2}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 "${_O}"`,"end try"].join(`
8
+ `),O=await this.runCommand("osascript",["-e",$]);if(HO(O))throw Error("Unable to open the macOS folder picker");return DO(O.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("${_O}")`,"}"].join("; "),O=await this.runCommand("powershell.exe",["-NoProfile","-STA","-Command",$]);if(HO(O))throw Error("Unable to open the Windows folder picker");return DO(O.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 O of $){let J=await this.runCommand(O.command,O.args);if(J.errorCode==="ENOENT")continue;if(J.exitCode===1&&!J.stdout.trim()&&!J.stderr.trim())return{cancelled:!0};if(HO(J))throw Error("Unable to open the Linux folder picker");return DO(J.stdout)}throw Error("Install zenity or kdialog to use native folder selection")}}var J4=new O4;var a2=F.Object({path:F.String({minLength:1})});function o2($){if(!$)return!1;if($==="tauri://localhost"||$==="http://tauri.localhost")return!0;try{let O=new URL($).hostname;return O==="localhost"||O==="127.0.0.1"||O==="::1"||O==="[::1]"}catch{return!1}}var Z4=($={})=>{let O=new i2,J=$.pickDirectory??(()=>J4.pick()),Z=$.allowDirectoryPickerRequest??o2;return O.get("/",async(x)=>{return x.json(await o$.list(i()))}),O.post("/",async(x)=>{let z;try{z=await x.req.json()}catch{throw new L("A valid JSON body is required")}let X=g(a2,z);if(!X.success)throw new L("A project path is required");try{let U=await o$.bind(X.data.path,i());return x.json(U,201)}catch(U){throw new L(U instanceof Error?U.message:"Failed to bind project")}}),O.post("/pick",async(x)=>{if(!Z(x.req.header("Origin")))throw new Z0("LOCAL_ACCESS_REQUIRED","Folder selection is only available from this machine",403);try{return x.json(await J())}catch(z){throw new L(z instanceof Error?z.message:"Failed to select a folder")}}),O.delete("/",async(x)=>{let z=x.req.query("path");if(!z)throw new L("A project path is required");try{let X=await o$.unbind(z);return x.json({success:!0,removed:X})}catch(X){throw new L(X instanceof Error?X.message:"Failed to unbind project")}}),O};import{Hono as n2}from"hono";var x4=a("Service"),z4=()=>{let $=new n2;return $.get("/",async(O)=>{try{let J=await Q4();return O.json(J)}catch(J){return x4.error("[ProviderRoutes] Failed to list providers:",J),O.json([])}}),$.get("/:provider/models",async(O)=>{let J=O.req.param("provider");try{let Z=await X4(J);return O.json(Z)}catch(Z){return x4.error("[ProviderRoutes] Failed to list models:",Z),O.json([])}}),$.put("/:provider/credential",async(O)=>{let J=O.req.param("provider"),Z=await O.req.json();if(!Z.apiKey?.trim())throw new L("apiKey is required");return await p0().setApiKey(J,Z.apiKey.trim()),O.json({success:!0})}),$.delete("/:provider/credential",async(O)=>{return await p0().clearCredential(O.req.param("provider")),O.json({success:!0})}),$.put("/:provider",async(O)=>{let J=O.req.param("provider"),Z=J0(),x=Z?.modelProviders[J];if(!Z||!x)throw new m("Model provider",J);let z=await O.req.json();if(!z.name||!z.baseUrl||!z.wireApi)throw new L("name, baseUrl and wireApi are required");let X="apiKeyEnv"in z?z.apiKeyEnv?.trim():x.apiKeyEnv,U={name:z.name,baseUrl:z.baseUrl,wireApi:z.wireApi,...X?{apiKeyEnv:X}:{}},M=p0(),B=z.apiKey?.trim()?await M.credentials.read(J):void 0;if(z.apiKey?.trim())await M.setApiKey(J,z.apiKey.trim());try{return await w0().updateModelProvider(J,U),O.json({success:!0})}catch(R){if(z.apiKey?.trim())if(B)await M.credentials.modify(J,async()=>B);else await M.credentials.delete(J);if(R instanceof Error&&(R.message.includes("modelProviders.")||R.message.includes("built-in provider")))throw new L(R.message);throw R}}),$.delete("/:provider",async(O)=>{let J=O.req.param("provider");if(!J0()?.modelProviders[J])throw new m("Model provider",J);let x=O.req.query("removeModels");if(x!==void 0&&x!=="true"&&x!=="false")throw new L("removeModels must be true or false");try{let z=await w0().removeModelProvider(J,{removeModels:x==="true"});return O.json({success:!0,...z})}catch(z){if(z instanceof Error&&(z.message.includes("still referenced")||z.message.includes("owns the only model")))throw new C(z.message);throw z}}),$.post("/:provider/probe",async(O)=>{let J=O.req.param("provider"),Z=J0();if(!Z?.modelProviders[J])throw new m("Model provider",J);let x=await O.req.json().catch(()=>({})),z=Z.models.filter((U)=>U.provider===J),X=x.modelId?z.find((U)=>U.id===x.modelId):z[0];if(!X)throw new L(x.modelId?"modelId does not reference this provider":"Model provider has no configured model to probe");return O.json(await Y4(X,Z))}),$};import{Hono as t2}from"hono";var r2=a("Service"),G4=($,O)=>{let J=new t2;return J.onError((Z,x)=>{if(Z instanceof Z0)return x.json(Z.toObject(),Z.statusCode);return r2.error("[ScheduleRoutes] Unhandled route error:",Z),x.json(new e("Schedule request failed").toObject(),500)}),J.get("/",async(Z)=>{let x=await $.list();return Z.json(N4.parse({schedules:x}))}),J.post("/",async(Z)=>{let x;try{x=await Z.req.json()}catch{throw new L("Invalid request body")}let z=g(K4,x);if(!z.success)throw new L("Invalid schedule request");let X=z.data.projectPath||Z.get("directory")||i();try{let U=await $.create({...z.data,projectPath:X});return Z.json(i0.parse(U),201)}catch(U){throw new L(U instanceof Error?U.message:"Failed to create schedule")}}),J.get("/:id",async(Z)=>{let x=await $.get(Z.req.param("id"));if(!x)throw new m("Schedule not found");return Z.json(i0.parse(x))}),J.patch("/:id",async(Z)=>{let x;try{x=await Z.req.json()}catch{throw new L("Invalid request body")}let z=g(V4,x);if(!z.success)throw new L("Invalid schedule update");let{modelId:X,reasoningEffort:U,serviceTier:M,responseVerbosity:B,communicationStyle:R,isolation:E,permissionMode:W,...S}=z.data,x0={...X!==void 0?{modelId:X}:{},...U!==void 0?{reasoningEffort:U}:{},...M!==void 0?{serviceTier:M}:{},...B!==void 0?{responseVerbosity:B}:{},...R!==void 0?{communicationStyle:R}:{},...E!==void 0?{isolation:E}:{},...W!==void 0?{permissionMode:W}:{}};try{let l=await $.update(Z.req.param("id"),{...S,...Object.keys(x0).length>0?{dispatch:x0}:{}});if(!l)throw new m("Schedule not found");return Z.json(i0.parse(l))}catch(l){if(l instanceof Z0)throw l;throw new L(l instanceof Error?l.message:"Failed to update schedule")}}),J.delete("/:id",async(Z)=>{if(!await $.remove(Z.req.param("id")))throw new m("Schedule not found");return Z.json({ok:!0})}),J.post("/:id/enable",async(Z)=>{let x=await $.setEnabled(Z.req.param("id"),!0);if(!x)throw new m("Schedule not found");return Z.json(i0.parse(x))}),J.post("/:id/disable",async(Z)=>{let x=await $.setEnabled(Z.req.param("id"),!1);if(!x)throw new m("Schedule not found");return Z.json(i0.parse(x))}),J.post("/:id/run",async(Z)=>{let x=await $.get(Z.req.param("id"));if(!x)throw new m("Schedule not found");if(!O)throw new e("Scheduler is not running in this process");await O.fire(x,new Date,{manual:!0});let z=await $.get(x.id);return Z.json(i0.parse(z??x),202)}),J};import*as y0 from"node:fs/promises";import{homedir as D4}from"node:os";import*as M0 from"node:path";import{Hono as s2}from"hono";var a0=a("Service"),W4=M0.join(D4(),".blade","skills"),BO=M0.join(D4(),".blade","skills-config.json");async function H4(){try{let $=await y0.readFile(BO,"utf-8");return JSON.parse($)}catch{return{disabled:[]}}}async function e2($){await y0.mkdir(M0.dirname(BO),{recursive:!0}),await y0.writeFile(BO,JSON.stringify($,null,2))}async function $5($,O){let J=await H4();if(O)J.disabled=J.disabled.filter((Z)=>Z!==$);else if(!J.disabled.includes($))J.disabled.push($);await e2(J)}var f0=null,O5=300000,J5=6;async function Z5(){if(f0&&Date.now()-f0.timestamp<O5)return f0.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(a0.warn(`GitHub API returned ${$.status}`),f0)return f0.data;throw Error(`GitHub skills catalog returned ${$.status}`)}let J=(await $.json()).filter((X)=>X.type==="dir"),Z=Array(J.length),x=0,z=Math.min(J5,J.length);return await Promise.all(Array.from({length:z},async()=>{while(x<J.length){let X=x++,U=J[X];if(!U)continue;let M=`Official ${U.name} skill`;try{let B=await fetch(`https://raw.githubusercontent.com/anthropics/skills/main/skills/${U.name}/SKILL.md`,{headers:{"User-Agent":"Blade-Skills-Catalog"}});if(B.ok){let E=(await B.text()).match(/^#[^\n]*\n+([^\n#]+)/);if(E)M=E[1].trim().slice(0,100)}}catch{}Z[X]={name:U.name,description:M,tag:"Official",author:"Anthropic"}}})),f0={data:Z,timestamp:Date.now()},Z}catch($){if(a0.warn("Failed to fetch skills catalog from GitHub:",$),f0)return f0.data;throw $}}var _4=()=>{let $=new s2;return $.get("/",async(O)=>{try{let J=O.get("directory")||i(),x=(await _0(J)).skills.getAll(),z=await H4(),X=x.map((U)=>({id:U.name,name:U.name,enabled:!z.disabled.includes(U.name),description:U.description||"",version:U.version||"1.0.0",provider:"Local",location:U.source==="builtin"?"Built-in":U.basePath,removable:U.source==="user"&&M0.dirname(M0.resolve(U.basePath))===M0.resolve(W4),capabilities:["prompts"],allowedTools:U.allowedTools||[]}));return O.json(X)}catch(J){return a0.error("[SkillsRoutes] Failed to get skills:",J),O.json({error:J instanceof Error?J.message:"Failed to get skills"},500)}}),$.post("/:name/toggle",async(O)=>{try{let J=O.req.param("name"),Z=await O.req.json();return await $5(J,Z.enabled),O.json({success:!0,enabled:Z.enabled})}catch(J){return a0.error("[SkillsRoutes] Failed to toggle skill:",J),O.json({success:!1,error:J.message},500)}}),$.delete("/:name",async(O)=>{try{let J=O.req.param("name"),Z=O.get("directory")||i(),x=(await _0(Z)).skills,z=x.get(J);if(!z)return O.json({success:!1,error:"Skill not found"},404);let X=M0.resolve(z.basePath),U=M0.resolve(W4);if(z.source!=="user"||M0.dirname(X)!==U)return O.json({success:!1,error:"Only Blade user skills can be uninstalled"},400);return await y0.rm(X,{recursive:!0,force:!0}),await x.refresh(),L$(Z),await B$(Z),O.json({success:!0})}catch(J){return a0.error("[SkillsRoutes] Failed to uninstall skill:",J),O.json({success:!1,error:J.message},500)}}),$.post("/install",async(O)=>{try{let J=await O.req.json(),Z=U4(),x=O.get("directory")||i(),z=F4({cwd:x}),X=!1;if(J.source==="catalog"&&J.name){if(X=await Z.installOfficialSkill(J.name),!X)return O.json({success:!1,error:"Failed to install skill from catalog"},500)}else if(J.source==="repo"&&J.url){if(X=await Z.installFromRepo(J.url,J.name),!X)return O.json({success:!1,error:"Failed to install skill from repository. Make sure the repo contains a SKILL.md file."},500)}else if(J.source==="local"&&J.path){if(X=await Z.installFromLocal(J.path,J.name),!X)return O.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 O.json({success:!1,error:"Invalid install parameters. Required: source with corresponding url/path/name"},400);return await z.refresh(),L$(x),await B$(x),O.json({success:!0})}catch(J){return a0.error("[SkillsRoutes] Failed to install skill:",J),O.json({success:!1,error:J.message},500)}}),$.get("/catalog",async(O)=>{try{let J=await Z5();return O.json(J)}catch(J){return a0.error("[SkillsRoutes] Failed to get catalog:",J),O.json({error:J instanceof Error?J.message:"Failed to get skills catalog"},502)}}),$};import{execSync as x5}from"node:child_process";import{readdir as Y5}from"node:fs/promises";import n$ from"node:path";import Q5 from"fast-glob";import{Hono as X5}from"hono";var I$=a("Service"),z5=($)=>{try{return x5("git rev-parse --abbrev-ref HEAD",{cwd:$,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}},K5=[...X$.map(($)=>`${$}/**`),...X$,...X$.map(($)=>`**/${$}/**`),...X$.map(($)=>`**/${$}`),...LO.map(($)=>`**/${$}`)],V5=new Set(["/theme","/model","/permissions","/mcp","/skills","/exit","/resume","/ide","/login","/logout"]),w4=()=>{let $=new X5;return $.get("/commands",async(O)=>{try{let J=O.req.query("q")||"",Z=O.get("directory")||i();await _0(Z);let x=L4(J,Z).filter((z)=>!V5.has(z.command));return O.json(x)}catch(J){return I$.error("[SuggestionsRoutes] Failed to get command suggestions:",J),O.json([])}}),$.get("/files",async(O)=>{try{let J=O.req.query("q")||"",Z=O.get("directory")||i(),x=Math.min(Number(O.req.query("limit"))||100,1000),z=O.req.query("type")==="file",U=(await Q5("**/*",{cwd:Z,dot:!1,followSymbolicLinks:!1,onlyFiles:z,markDirectories:!0,unique:!0,ignore:K5})).map((R)=>R.replace(/\\/g,"/"));if(!J)return O.json(U.slice(0,x));let M=J.toLowerCase(),B=U.filter((R)=>R.toLowerCase().includes(M)).slice(0,x);return O.json(B)}catch(J){return I$.error("[SuggestionsRoutes] Failed to get file suggestions:",J),O.json([])}}),$.get("/files/tree",async(O)=>{try{let J=O.get("directory")||i(),Z=O.req.query("path")||"",x=Z?n$.join(J,Z):J,X=(await Y5(x,{withFileTypes:!0})).map((B)=>({name:B.name,path:Z?`${Z}/${B.name}`:B.name,type:B.isDirectory()?"dir":"file"}));X.sort((B,R)=>{if(B.type!==R.type)return B.type==="dir"?-1:1;return B.name.localeCompare(R.name)});let U=new Set(X$),M=X.filter((B)=>{let R=B.name;if(R.startsWith("."))return!1;if(U.has(R))return!1;for(let E of LO)if(R.match(new RegExp(E.replace("*",".*"))))return!1;return!0});return O.json(M)}catch(J){return I$.error("[SuggestionsRoutes] Failed to get file tree:",J),O.json([])}}),$.get("/files/content",async(O)=>{try{let J=O.req.query("path");if(!J)return O.json({error:"Missing file path"},400);let Z=O.get("directory")||i(),x=n$.resolve(Z,J),z=n$.relative(Z,x);if(z.startsWith("..")||n$.isAbsolute(z))return O.json({error:"Invalid file path"},400);let X=B4(),U=await X.stat(x);if(!U?.isFile)return O.json({error:"File not found"},404);let M=200000,B=await X.readTextFile(x),R=B.length>M;return O.json({path:J,content:R?B.slice(0,M):B,truncated:R,size:U.size})}catch(J){return I$.error("[SuggestionsRoutes] Failed to get file content:",J),O.json({error:"Failed to read file"},500)}}),$.get("/git-info",async(O)=>{try{let J=O.get("directory")||i(),Z=z5(J);return O.json({branch:Z})}catch(J){return I$.error("[SuggestionsRoutes] Failed to get git info:",J),O.json({branch:null})}}),$};import{Hono as N5}from"hono";var k$=a("Service"),R4=($)=>{let O=new N5;return O.onError((J,Z)=>{if(J instanceof Z0)return Z.json(J.toObject(),J.statusCode);return k$.error("[TaskRoutes] Unhandled route error:",J),Z.json(new e("Failed to dispatch task").toObject(),500)}),O.post("/",async(J)=>{let Z;try{Z=await J.req.json()}catch{throw new L("Invalid request body")}let x=g(E4,Z);if(!x.success)throw new L("Invalid task request");if((x.data.attachments??[]).reduce((X,U)=>X+(typeof U.content==="string"?Buffer.byteLength(U.content):0),0)>i$)throw new L("Task attachments exceed the 5 MiB limit");try{let X=await $.dispatchTask({prompt:x.data.prompt,title:x.data.title,sourceProjectPath:x.data.projectPath||J.get("directory")||i(),isolation:x.data.isolation,permissionMode:x.data.permissionMode,modelId:x.data.modelId,reasoningEffort:x.data.reasoningEffort,serviceTier:x.data.serviceTier,responseVerbosity:x.data.responseVerbosity,communicationStyle:x.data.communicationStyle,attachments:x.data.attachments,outputSchema:x.data.outputSchema});return J.json(wO.parse(X),202)}catch(X){if(X instanceof L||X instanceof C||X instanceof u0||X instanceof v0)throw X;throw k$.error("[TaskRoutes] Failed to dispatch task:",X),new e("Failed to dispatch task")}}),O.post("/:sessionId/retry",async(J)=>{try{let Z=await $.retryTask(J.req.param("sessionId"),J.req.query("projectPath"));return J.json(wO.parse(Z),202)}catch(Z){if(Z instanceof L||Z instanceof m||Z instanceof C||Z instanceof u0||Z instanceof v0)throw Z;throw k$.error("[TaskRoutes] Failed to retry task:",Z),new e("Failed to retry task")}}),O.get("/:sessionId/diff",async(J)=>{try{let Z=await $.getTaskDiff(J.req.param("sessionId"),J.req.query("projectPath"));return J.json(A4.parse(Z))}catch(Z){if(Z instanceof L||Z instanceof m||Z instanceof C)throw Z;throw k$.error("[TaskRoutes] Failed to load task diff:",Z),new e("Failed to load task diff")}}),O.post("/:sessionId/delivery",async(J)=>{let Z;try{Z=await J.req.json()}catch{throw new L("Invalid request body")}let x=g(T4,Z);if(!x.success)throw new L("Invalid task delivery request");try{let z=await $.deliverTask(J.req.param("sessionId"),x.data.action,J.req.query("projectPath"));return J.json(M4.parse(z))}catch(z){if(z instanceof L||z instanceof m||z instanceof C)throw z;throw k$.error("[TaskRoutes] Failed to deliver task:",z),new e("Failed to deliver task")}}),O};import{Hono as G5}from"hono";var m0=a("Service"),z$=new Map,b4=2097152,q4=65536;function C4(){return typeof globalThis.Bun<"u"}async function W5($,O,J){if(C4()){let{spawn:z}=await import("bun-pty"),X=z($,O,{name:"xterm-256color",cwd:J.cwd,env:J.env});return{pid:X.pid,write:(U)=>X.write(U),resize:(U,M)=>X.resize(U,M),kill:()=>X.kill(),onData:(U)=>X.onData(U),onExit:(U)=>X.onExit(U)}}let x=(await import("node-pty")).spawn($,O,{name:"xterm-256color",cwd:J.cwd,env:J.env,cols:80,rows:24});return{pid:x.pid,write:(z)=>x.write(z),resize:(z,X)=>x.resize(z,X),kill:()=>x.kill(),onData:(z)=>{x.onData(z)},onExit:(z)=>{x.onExit(z)}}}var EO=void 0,MO;if(C4())try{let{createBunWebSocket:$}=await import("hono/bun"),O=$();MO=O.upgradeWebSocket,EO=O.websocket}catch($){m0.warn("[Terminal] Failed to initialize Bun WebSocket support:",$)}async function j4($,O){let J=`term-${Date.now()}`;m0.info(`[Terminal] New connection: ${J}, cwd: ${$}`);let Z=process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/zsh",x=Z.endsWith("sh")?["-l"]:[],z=await W5(Z,x,{cwd:$,env:{...process.env,TERM:"xterm-256color",COLORTERM:"truecolor"}}),X={id:J,process:z,cwd:$,buffer:"",subscribers:new Set};if(z$.set(J,X),X.subscribers.add(O),z.onData((U)=>{let M=!1;for(let B of X.subscribers)try{B.send(U),M=!0}catch{X.subscribers.delete(B)}if(M)return;if(X.buffer+=U,X.buffer.length>b4)X.buffer=X.buffer.slice(-b4)}),z.onExit(({exitCode:U})=>{m0.info(`[Terminal] Process exited: ${J}, code: ${U}`);for(let M of X.subscribers)try{M.close()}catch{}z$.delete(J)}),X.buffer){let U=X.buffer;X.buffer="";for(let M=0;M<U.length;M+=q4)O.send(U.slice(M,M+q4))}return{session:X,cleanup:()=>{if(m0.info(`[Terminal] Connection closed: ${J}`),X.subscribers.delete(O),X.subscribers.size===0){try{X.process.kill()}catch{}z$.delete(J)}}}}function I4($,O){$.on("connection",async(J,Z)=>{let x=new URL(Z.url||"/",`http://${Z.headers.host}`);if(!x.pathname.endsWith("/terminal/ws")){J.close();return}let z=x.searchParams.get("cwd")||O()||i();try{let{session:X,cleanup:U}=await j4(z,{send:(M)=>J.send(M),close:()=>J.close()});J.on("message",(M)=>{try{X.process.write(String(M))}catch(B){m0.error("[Terminal] Failed to write to PTY:",B)}}),J.on("close",U),J.on("error",U)}catch(X){m0.error("[Terminal] Failed to spawn PTY:",X),J.close()}})}var k4=()=>{let $=new G5;if($.get("/status",(O)=>{let J=Array.from(z$.values()).map((Z)=>({id:Z.id,cwd:Z.cwd}));return O.json({active:J.length,terminals:J})}),$.post("/kill/:terminalId",(O)=>{let J=O.req.param("terminalId"),Z=z$.get(J);if(Z){try{Z.process.kill()}catch{}for(let x of Z.subscribers)x.close();return z$.delete(J),O.json({success:!0})}return O.json({success:!1,error:"Terminal not found"},404)}),MO)$.get("/ws",MO((O)=>{let J=O.req.query("cwd")||O.get("directory")||i(),Z;return{async onOpen(x,z){try{Z=await j4(J,{send:(X)=>z.send(X),close:()=>z.close()})}catch(X){m0.error("[Terminal] Failed to spawn PTY:",X),z.close()}},onMessage(x){if(!Z)return;try{Z.session.process.write(String(x.data))}catch(z){m0.error("[Terminal] Failed to write to PTY:",z)}},onClose(){Z?.cleanup()}}}));else $.get("/ws",(O)=>{return O.json({message:"WebSocket endpoint - connect via ws:// protocol",hint:"Use WebSocket client to connect to this endpoint"})});return $};import U5 from"node:path";import{Hono as F5}from"hono";var D5=F.Object({projectPath:F.String({minLength:1}),action:W0(["trust","revoke"])});function P4($){if(!U5.isAbsolute($))throw new L("projectPath must be absolute")}var f4=()=>{let $=new F5;return $.get("/",async(O)=>{let J=O.req.query("projectPath");if(!J)throw new L("projectPath query parameter is required");return P4(J),O.json(await TO.getInstance().getStatus(J))}),$.post("/",async(O)=>{let J=g(D5,await O.req.json());if(!J.success)throw new L("Invalid workspace trust request");let{projectPath:Z,action:x}=J.data;P4(Z);let z=TO.getInstance(),X=x==="trust"?await z.trust(Z):await z.revoke(Z);return await S4(),O.json({...X,reloadRequired:X.sensitiveSources>0})}),$};var N0=a("Service"),qO=[],t$,K$,V$,r$,y4=new Map,m4=new Map,q5=new Set([".css",".html",".js",".json",".svg"]),C5=1024,j5=3600000;function I5($,O){if(!$)return 0;let J=$.split(",").map((Z)=>{let[x,...z]=Z.trim().toLowerCase().split(";"),X=z.find((M)=>M.trim().startsWith("q=")),U=X?Number(X.trim().slice(2)):1;return{name:x,quality:Number.isFinite(U)?Math.max(0,Math.min(1,U)):0}});return J.find((Z)=>Z.name===O)?.quality??J.find((Z)=>Z.name==="*")?.quality??0}function h4(){if(V$)return;let $=()=>{j.collectStaleEmptySessions().then((O)=>{if(O>0)N0.info(`[SessionGC] removed ${O} stale empty session(s)`)}).catch((O)=>{N0.warn("[SessionGC] failed to collect stale empty sessions:",O)})};$(),V$=setInterval($,j5),V$.unref?.()}function k5(){if(!V$)return;clearInterval(V$),V$=void 0}function P5($){return["br","gzip"].map((J)=>({encoding:J,quality:I5($,J)})).filter((J)=>J.quality>0).sort((J,Z)=>Z.quality-J.quality||(J.encoding==="br"?-1:1))[0]?.encoding}function S5($){let O=y4.get($);if(O)return O;let J=P$($);return y4.set($,J),J}function f5($,O,J){let Z=`${J}:${$}`,x=m4.get(Z);if(x)return x;let z=J==="br"?A5(O,{params:{[E5.BROTLI_PARAM_QUALITY]:5}}):M5(O,{level:6});return m4.set(Z,z),z}function y5(){let $=B5(w5(import.meta.url)),O=[h0($,"web"),h0(i(),"dist/web"),h0(i(),"packages/cli/dist/web")];for(let J of O){let Z=h0(J,"index.html");if(bO(Z)){if(P$(Z,"utf-8").includes("/assets/"))return N0.debug(`[Server] Found web dist at: ${J}`),J}}return null}function m5(){let $=new T5;$.onError((Z,x)=>{if(N0.error("[Server] Request error:",Z),Z instanceof Z0)return x.json(Z.toObject(),Z.statusCode);let z=Z instanceof Error?Z.message:String(Z);return x.json({error:{code:"INTERNAL_ERROR",message:z}},500)}),$.use(async(Z,x)=>{let z=process.env.BLADE_SERVER_PASSWORD;if(!z)return x();let X=Z.req.path;if(X==="/"||X==="/favicon.svg"||X.startsWith("/assets/")||X.endsWith(".html")||X.endsWith(".js")||X.endsWith(".css"))return x();let U=Z.req.header("Authorization");if(!U?.startsWith("Basic "))return Z.header("WWW-Authenticate",'Basic realm="Blade Server"'),Z.json({error:{code:"UNAUTHORIZED",message:"Authentication required"}},401);let M=Buffer.from(U.slice(6),"base64").toString(),[B,R]=M.split(":"),E=process.env.BLADE_SERVER_USERNAME??"blade";if(B!==E||R!==z)return Z.json({error:{code:"UNAUTHORIZED",message:"Invalid credentials"}},401);return x()}),$.use(async(Z,x)=>{let z=Z.req.path==="/health"||Z.req.path==="/global/health"||Z.req.path.startsWith("/assets/");if(!z)N0.debug(`[Server] ${Z.req.method} ${Z.req.path}`);let X=Date.now();if(await x(),!z){let U=Date.now()-X;N0.debug(`[Server] ${Z.req.method} ${Z.req.path} - ${Z.res.status} (${U}ms)`)}}),$.use(R5({origin(Z){if(!Z)return;if(Z.startsWith("http://localhost:"))return Z;if(Z.startsWith("http://127.0.0.1:"))return Z;if(Z==="tauri://localhost"||Z==="http://tauri.localhost")return Z;if(qO.includes(Z))return Z;return}})),$.use(async(Z,x)=>{let z=Z.req.query("directory")||Z.req.header("x-blade-directory")||i();try{z=decodeURIComponent(z)}catch{}return Z.set("directory",z),x()});let O=h1();r$=O,t$=O.recoverQueuedTasks,K$=new OO({dispatch:(Z)=>O.dispatchTask(Z),store:RO}),$.route("/global",iO()),$.route("/events",lO()),$.route("/sessions",O.app),$.route("/tasks",R4(O)),$.route("/schedules",G4(RO,K$)),$.route("/configs",hO()),$.route("/permissions",v1()),$.route("/plugins",$4()),$.route("/hooks",sO()),$.route("/workspace-trust",f4()),$.route("/providers",z4()),$.route("/models",X1()),$.route("/projects",Z4()),$.route("/suggestions",w4()),$.route("/terminal",k4()),$.route("/mcp",O1()),$.route("/skills",_4()),$.get("/health",(Z)=>{return Z.json({healthy:!0,version:s0()})});let J=y5();if(J)N0.info(`[Server] Serving static files from ${J}`),$.get("/favicon.svg",()=>{let Z=h0(J,"favicon.svg");if(!bO(Z))return new Response(null,{status:404});return new Response(P$(Z),{headers:{"Content-Type":"image/svg+xml","Cache-Control":"public, max-age=86400"}})}),$.get("/assets/*",(Z)=>{let x=h0(J,Z.req.path);if(!bO(x))return Z.json({error:{code:"NOT_FOUND",message:`File not found: ${Z.req.path}`}},404);let z=S5(x),X=L5(x).toLowerCase(),M={".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"}[X]||"application/octet-stream",B=q5.has(X)&&z.byteLength>=C5?P5(Z.req.header("Accept-Encoding")):void 0,R=B?f5(x,z,B):z;return new Response(new Uint8Array(R),{headers:{"Content-Type":M,"Content-Length":String(R.byteLength),"Cache-Control":"public, max-age=31536000, immutable",Vary:"Accept-Encoding",...B?{"Content-Encoding":B}:{}}})}),$.get("/",(Z)=>{let x=h0(J,"index.html"),z=P$(x,"utf-8");return Z.html(z,200,{"Cache-Control":"no-cache"})}),$.get("*",(Z)=>{let x=Z.req.path;if(x.includes("."))return Z.json({error:{code:"NOT_FOUND",message:`File not found: ${x}`}},404);let z=h0(J,"index.html"),X=P$(z,"utf-8");return Z.html(X,200,{"Cache-Control":"no-cache"})});else N0.warn('[Server] Web UI not found. Run "cd packages/cli/web && bun run build" to enable web interface.'),$.get("/",(Z)=>{return Z.json({message:"Blade API Server",version:s0(),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("*",(Z)=>{return Z.json({error:{code:"NOT_FOUND",message:`Route not found: ${Z.req.path}`}},404)});return $}function h5(){let $=_5(),O=[];for(let J of Object.keys($)){let Z=$[J];if(!Z)continue;for(let x of Z){if(x.internal||x.family!=="IPv4")continue;if(x.address.startsWith("172."))continue;O.push(x.address)}}return O}function g4(){return typeof globalThis.Bun<"u"}function v4($,O){let J=globalThis.Bun,Z=(z)=>{try{return J.serve({hostname:O.hostname,port:z,fetch:$.fetch,idleTimeout:0,websocket:EO})}catch(X){N0.error("Failed to start Bun server:",X);return}},x=O.port===0?Z(4096)??Z(0):Z(O.port);if(!x)throw Error(`Failed to start Bun server on port ${O.port}`);return{url:x.url,port:x.port,hostname:x.hostname,stop:async()=>{x.stop(!0)}}}function g5($,O){return new Promise((J,Z)=>{let x=H5(async(B,R)=>{let E=new URL(B.url||"/",`http://${B.headers.host}`),W=new Headers;for(let[l,b]of Object.entries(B.headers))if(b)if(Array.isArray(b))for(let r of b)W.append(l,r);else W.set(l,b);let S;if(B.method!=="GET"&&B.method!=="HEAD")S=(await new Promise((b)=>{let r=[];B.on("data",(u)=>r.push(u)),B.on("end",()=>b(Buffer.concat(r)))})).toString();let x0=new Request(E.toString(),{method:B.method,headers:W,body:S});try{let l=await $.fetch(x0);if(R.statusCode=l.status,l.headers.forEach((b,r)=>{R.setHeader(r,b)}),l.body){let b=l.body.getReader(),r=async()=>{let{done:u,value:p}=await b.read();if(u){R.end();return}return R.write(p),r()};await r()}else{let b=await l.text();R.end(b)}}catch(l){N0.error("[Server] Node request error:",l),R.statusCode=500,R.end(JSON.stringify({error:{code:"INTERNAL_ERROR",message:"Internal server error"}}))}}),z=new b5({noServer:!0}),X=i();I4(z,()=>X),x.on("upgrade",(B,R,E)=>{if(new URL(B.url||"/",`http://${B.headers.host}`).pathname==="/terminal/ws")z.handleUpgrade(B,R,E,(S)=>{z.emit("connection",S,B)});else R.destroy()});let U=(B)=>{return new Promise((R,E)=>{x.once("error",(W)=>{if(W.code==="EADDRINUSE")E(W);else E(W)}),x.listen(B,O.hostname,()=>{let W=x.address();if(W&&typeof W==="object")R(W.port);else R(B)})})};(async()=>{let B;if(O.port===0)try{B=await U(4096)}catch{B=await U(0)}else B=await U(O.port);let R=new URL(`http://${O.hostname==="0.0.0.0"?"localhost":O.hostname}:${B}`);J({url:R,port:B,hostname:O.hostname,stop:async()=>{return new Promise((E)=>{z.close(()=>{x.close(()=>E())})})}})})().catch(Z)})}var u4;((O7)=>{let $,O,J,Z=(M,B)=>{if($!==M)return Promise.resolve();if(J)return J;let R=B?.shutdown("server-shutdown");return K$?.stop(),k5(),J=(async()=>{let E,W=async(S)=>{if(!S)return;try{await S()}catch(x0){E??=x0}};if(await W(()=>M.stop()),await W(R?()=>R:void 0),$===M)$=void 0,O=void 0,r$=void 0,t$=void 0,K$=void 0;if(N0.info("[Server] Blade server stopped"),E!==void 0)throw E})(),J};function x(){if(!O)O=m5();return O}O7.getApp=x;function z(M){qO=M.cors??[];let B=x();if(g4())$=v4(B,M),J=void 0,N0.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 R=$,E=r$;return t$?.().catch((W)=>{N0.warn("[Server] Failed to recover queued tasks:",W)}),K$?.start(),h4(),{url:R.url,port:R.port,hostname:R.hostname,stop:()=>Z(R,E)}}O7.listen=z;async function X(M){qO=M.cors??[];let B=x();if(g4())$=v4(B,M),N0.info(`[Server] Blade server listening on ${$.url} (Bun runtime)`);else $=await g5(B,M),N0.info(`[Server] Blade server listening on ${$.url} (Node.js runtime)`);J=void 0;let R=$,E=r$;try{await t$?.()}catch(W){N0.warn("[Server] Failed to recover queued tasks:",W)}return K$?.start(),h4(),{url:R.url,port:R.port,hostname:R.hostname,stop:()=>Z(R,E)}}O7.listenAsync=X;function U(){return $!==void 0}O7.isRunning=U})(u4||={});export{v5 as f,u5 as g,h5 as h,u4 as i};
@@ -1,4 +1,4 @@
1
- import{ea as F,ga as L}from"./chunk-wk0vpgwk.js";import{nc as $,pc as B,xc as Q}from"./chunk-zracmha2.js";import{pe as y}from"./chunk-6dma8han.js";import{Of as V}from"./chunk-g9re8v25.js";async function j(){await y(V())}async function I(b){let q=b.message||b._?.[0];if(typeof q==="string"&&q.trim())return q;let z=b.stdin??process.stdin;if(!z.isTTY){let G=[];for await(let K of z)G.push(K);return Buffer.concat(G).toString("utf-8").trim()}if(b.defaultMessage!==void 0)return b.defaultMessage;throw Error("No input provided")}async function M(b){let q=b.message||b._?.[0];if(typeof q==="string"&&q.trim())return q;let z=b.stdin??process.stdin;if(z.isTTY)return;let G=[];for await(let Z of z)G.push(Buffer.isBuffer(Z)?Z:Buffer.from(Z));return Buffer.concat(G).toString("utf-8").trim()||void 0}async function R(b){if(!F(b))return{mode:"agent",content:b};let q=await L(b,{cwd:V(),surface:"headless",workspaceRoot:V()});if(!q.success)return{mode:"output",content:`Error: ${q.error||"未知错误"}`,exitCode:1};let z=q.data;if(z?.action==="invoke_skill"){let{skillName:G,skillArgs:K}=z;return{mode:"agent",content:K?`Please use the "${G}" skill to help me with: ${K}`:`Please use the "${G}" skill.`}}if(z?.action==="invoke_custom_command"||z?.action==="invoke_plugin_command"){let G=z.processedContent;return{mode:"agent",content:`# Custom Command: /${z.commandName}
1
+ import{ha as F,ja as L}from"./chunk-c8ddch38.js";import{Ac as Q,qc as $,sc as B}from"./chunk-ag5ea7ce.js";import{te as y}from"./chunk-yypnfmed.js";import{dg as V}from"./chunk-kfpzrmq7.js";async function j(){await y(V())}async function I(b){let q=b.message||b._?.[0];if(typeof q==="string"&&q.trim())return q;let z=b.stdin??process.stdin;if(!z.isTTY){let G=[];for await(let K of z)G.push(K);return Buffer.concat(G).toString("utf-8").trim()}if(b.defaultMessage!==void 0)return b.defaultMessage;throw Error("No input provided")}async function M(b){let q=b.message||b._?.[0];if(typeof q==="string"&&q.trim())return q;let z=b.stdin??process.stdin;if(z.isTTY)return;let G=[];for await(let Z of z)G.push(Buffer.isBuffer(Z)?Z:Buffer.from(Z));return Buffer.concat(G).toString("utf-8").trim()||void 0}async function R(b){if(!F(b))return{mode:"agent",content:b};let q=await L(b,{cwd:V(),surface:"headless",workspaceRoot:V()});if(!q.success)return{mode:"output",content:`Error: ${q.error||"未知错误"}`,exitCode:1};let z=q.data;if(z?.action==="invoke_skill"){let{skillName:G,skillArgs:K}=z;return{mode:"agent",content:K?`Please use the "${G}" skill to help me with: ${K}`:`Please use the "${G}" skill.`}}if(z?.action==="invoke_custom_command"||z?.action==="invoke_plugin_command"){let G=z.processedContent;return{mode:"agent",content:`# Custom Command: /${z.commandName}
2
2
 
3
3
  ${G}`}}return{mode:"output",content:q.content||q.message||"",exitCode:0}}import{readFile as D,stat as H}from"node:fs/promises";import J from"node:path";function x(b,q){let z;try{z=JSON.parse(b)}catch(G){throw Error(`Invalid JSON output schema from ${q}`,{cause:G})}return B(z).schema}async function _(b){if(b.jsonSchema!==void 0&&b.outputSchema!==void 0)throw Error("--json-schema cannot be combined with --output-schema");if(b.jsonSchema!==void 0)return x(b.jsonSchema,"--json-schema");if(b.outputSchema===void 0)return;let q=J.resolve(b.outputSchema),z=await H(q);if(!z.isFile())throw Error(`Output schema path is not a regular file: ${q}`);if(z.size>$)throw Error(`Output schema exceeds ${$} bytes: ${q}`);return x(await D(q,"utf8"),q)}function N(b){if(!(b instanceof Error))return!1;return b.message.includes("未找到会话")||b.message.includes("ENOENT")||b.message.includes("no such file")}async function W(b){try{return await Q.loadSessionModelContext(b,V())}catch(q){if(N(q))return null;throw q}}async function C(b){if(b.resume===!0||b.resume==="true")throw Error("--resume without a session ID is only supported in interactive UI mode");if(typeof b.resume==="string"&&b.resume.length>0){if(b.forkSession){let G=V(),K=await Q.forkSession(b.resume,{newSessionId:b.sessionId,sourceProjectPath:G,targetProjectPath:G});return{...K,messages:await Q.loadSessionModelContext(K.sessionId,G)}}let[q,z]=await Promise.all([Q.loadSessionModelContext(b.resume),Q.findSessionMetadata(b.resume)]);return{sessionId:b.resume,messages:q,metadata:z}}if(b.continue){let q=b.forkSession?await Q.listSessions({cwd:V()}):await Q.listSessions();if(q.length>0){let z=q[0].sessionId;if(b.forkSession){let G=V(),K=await Q.forkSession(z,{newSessionId:b.sessionId,sourceProjectPath:G,targetProjectPath:G});return{...K,messages:await Q.loadSessionModelContext(K.sessionId,G)}}return{sessionId:z,messages:await Q.loadSessionModelContext(z),metadata:q[0]}}if(b.forkSession)throw Error("Cannot fork: no sessions are available to continue")}if(b.sessionId){let q=await W(b.sessionId);return{sessionId:b.sessionId,messages:q??[],...q?{metadata:await Q.findSessionMetadata(b.sessionId,V())}:{}}}return{sessionId:`${b.fallbackSessionPrefix}-${Date.now()}`,messages:[]}}
4
4
  export{j as m,I as n,M as o,R as p,_ as q,C as r};
@@ -1,4 +1,4 @@
1
- import"./chunk-v508x7cg.js";import{zf as Q}from"./chunk-x5s68axq.js";import"./chunk-gbbnjzy8.js";import"./chunk-b5b8fb9y.js";import"./chunk-atdeg922.js";import{Of as L}from"./chunk-g9re8v25.js";import"./chunk-nhzdkxnx.js";import"./chunk-fz55cnws.js";import"./chunk-5ygv33qe.js";import"./chunk-x04xb9g3.js";import"./chunk-358zaryv.js";import"./chunk-5sbewyjn.js";import"./chunk-npgt73cg.js";import"./chunk-9neq5xrb.js";import{Sg as F}from"./chunk-22h5kh4z.js";var K=[22,19,0];function T(G){let A=/^v?(\d+)\.(\d+)\.(\d+)/.exec(G);if(!A)return!1;let H=A.slice(1).map(Number);for(let z=0;z<K.length;z++){let B=H[z]??0,J=K[z];if(B!==J)return B>J}return!0}var X={command:"doctor",describe:"Check the health of your Blade installation",builder:(G)=>G.option("rebuild-index",{type:"boolean",default:!1,describe:"Rebuild the SQLite session index from JSONL transcripts"}),handler:async(G)=>{if(G.rebuildIndex){console.log(`Rebuilding session index from JSONL transcripts...
2
- `);try{let{rebuildProjectionIndex:z}=await import("./chunk-bw7fgs2n.js"),{SessionService:B}=await import("./chunk-s8f8amvg.js"),J=await z(B.projectionDeriverForSearch());if(J===null)console.log("[WARN] Session index unavailable (SQLite driver missing); reads fall back to JSONL scan.");else console.log(`[OK] Session index rebuilt: ${J} session(s) indexed.`)}catch(z){console.log("[FAIL] Session index rebuild failed"),console.log(` Error: ${z instanceof Error?z.message:"未知错误"}`),process.exit(1)}return}console.log(`Running Blade health check...
1
+ import"./chunk-v508x7cg.js";import{Qf as Q}from"./chunk-6ch7a6xf.js";import"./chunk-7sna3js9.js";import"./chunk-m8ss9rmx.js";import"./chunk-j7edwwg1.js";import{dg as L}from"./chunk-kfpzrmq7.js";import"./chunk-yk9pxkc1.js";import"./chunk-fhnkyqfb.js";import"./chunk-26wse17p.js";import"./chunk-hcm55r3d.js";import"./chunk-vbpykrxd.js";import"./chunk-bvf9syb2.js";import"./chunk-q78s028m.js";import"./chunk-qb0sqh29.js";import{hh as F}from"./chunk-hfrcwkc8.js";var K=[22,19,0];function T(G){let A=/^v?(\d+)\.(\d+)\.(\d+)/.exec(G);if(!A)return!1;let H=A.slice(1).map(Number);for(let z=0;z<K.length;z++){let B=H[z]??0,J=K[z];if(B!==J)return B>J}return!0}var X={command:"doctor",describe:"Check the health of your Blade installation",builder:(G)=>G.option("rebuild-index",{type:"boolean",default:!1,describe:"Rebuild the SQLite session index from JSONL transcripts"}),handler:async(G)=>{if(G.rebuildIndex){console.log(`Rebuilding session index from JSONL transcripts...
2
+ `);try{let{rebuildProjectionIndex:z}=await import("./chunk-z1aqe7ms.js"),{SessionService:B}=await import("./chunk-5wzjdfde.js"),J=await z(B.projectionDeriverForSearch());if(J===null)console.log("[WARN] Session index unavailable (SQLite driver missing); reads fall back to JSONL scan.");else console.log(`[OK] Session index rebuilt: ${J} session(s) indexed.`)}catch(z){console.log("[FAIL] Session index rebuild failed"),console.log(` Error: ${z instanceof Error?z.message:"未知错误"}`),process.exit(1)}return}console.log(`Running Blade health check...
3
3
  `);let A=0;try{await Q.getInstance().initialize(),console.log("[OK] Configuration: OK")}catch(z){console.log("[FAIL] Configuration: FAILED"),console.log(` Error: ${z instanceof Error?z.message:"未知错误"}`),A++}let H=process.version;if(T(H))console.log(`[OK] Node.js version: ${H}`);else console.log(`[WARN] Node.js version: ${H} (required: >=22.19.0)`),A++;try{let z=await import("fs/promises"),B=L();await z.access(B,(await import("fs")).constants.R_OK|(await import("fs")).constants.W_OK),console.log("[OK] File system permissions: OK")}catch(z){console.log("[FAIL] File system permissions: FAILED"),console.log(" Error: Cannot read/write in current directory"),A++}try{await import("ink"),console.log("[OK] Dependencies: OK")}catch(z){console.log("[FAIL] Dependencies: FAILED"),console.log(" Error: Missing required dependencies"),A++}if(console.log(`
4
4
  Health Check Summary:`),A===0)console.log("All checks passed! Blade is ready to use.");else console.log(`Warning: Found ${A} issue(s). Please resolve them for optimal performance.`),process.exit(1)}};export{T as isSupportedNodeVersion,X as doctorCommands};
@@ -0,0 +1 @@
1
+ import{Xg as a}from"./chunk-bvf9syb2.js";import"./chunk-q78s028m.js";import"./chunk-qb0sqh29.js";import"./chunk-hfrcwkc8.js";export{a as WorkspaceTrustService};
@@ -1,4 +1,4 @@
1
- import{ng as i}from"./chunk-fz55cnws.js";import{Ig as o,Kg as C,Mg as L,Qg as j,Rg as n}from"./chunk-9neq5xrb.js";import{Sg as I}from"./chunk-22h5kh4z.js";import{stat as d}from"node:fs/promises";import B from"node:path";import*as U from"node:path";var s=50,t=100,e=/^[A-Za-z0-9_-]+$/,__=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/;function E_(_){return typeof _==="string"&&__.test(_)&&Number.isFinite(Date.parse(_))}function P(_){return typeof _==="string"&&U.isAbsolute(_)}function R_(_){return Buffer.from(JSON.stringify(_),"utf8").toString("base64url")}function W_(_){try{if(!e.test(_))throw Error("invalid");let E=Buffer.from(_,"base64url").toString("utf8");if(Buffer.from(E,"utf8").toString("base64url")!==_)throw Error("invalid");let R=JSON.parse(E);if(R.version!==1||typeof R.includeSubagents!=="boolean"||R.archived!==void 0&&typeof R.archived!=="boolean"||!(R.cwd===null||P(R.cwd))||!E_(R.lastMessageTime)||!P(R.projectPath)||!C(R.sessionId))throw Error("invalid");return{version:1,cwd:R.cwd===null?null:U.resolve(R.cwd),includeSubagents:R.includeSubagents,archived:R.archived??!1,lastMessageTime:R.lastMessageTime,projectPath:U.resolve(R.projectPath),sessionId:R.sessionId}}catch{throw Error("Invalid session cursor")}}function y(_){let E="";for(let R=0;R<_.length;R+=1)E+=_.charCodeAt(R).toString(16).padStart(4,"0");return E}function $_(_){if(!_.cursor)return;let E=W_(_.cursor);if(E.cwd!==_.cwd||E.includeSubagents!==_.includeSubagents||(E.archived??!1)!==_.archived)throw Error("Session cursor scope does not match this query");return E}function z_(_={}){let{cwd:E,cursor:R,limit:W,includeSubagents:$=!1,archived:H=!1}=_;if(E!==void 0&&!U.isAbsolute(E))throw Error("Session catalog cwd must be absolute");let k=W===void 0?s:W;if(!Number.isInteger(k)||k<1||k>t)throw Error("Session catalog limit must be an integer from 1 to 100");return{cwd:E===void 0?null:U.resolve(E),cursor:R??void 0,limit:k,includeSubagents:$,archived:H}}function k_(_,E){if(_.lastMessageTime>E.lastMessageTime)return-1;if(_.lastMessageTime<E.lastMessageTime)return 1;if(_.projectPath<E.projectPath)return-1;if(_.projectPath>E.projectPath)return 1;if(_.sessionId<E.sessionId)return-1;if(_.sessionId>E.sessionId)return 1;return 0}function f_(_,E){let R=[..._],W=$_(E);if(W)R=R.filter((k)=>k_(k,{sessionId:W.sessionId,projectPath:W.projectPath,lastMessageTime:W.lastMessageTime})>0);let $=R.slice(0,E.limit);if($.length===0||R.length<=$.length)return{sessions:$};let H=$[$.length-1];return{sessions:$,nextCursor:R_({version:1,cwd:E.cwd,includeSubagents:E.includeSubagents,archived:E.archived,lastMessageTime:H.lastMessageTime,projectPath:H.projectPath,sessionId:H.sessionId})}}function H_(_){return _.type==="message_created"||_.type==="part_created"||_.type==="part_updated"||_.type==="turn_started"||_.type==="turn_completed"||_.type==="turn_aborted"||_.type==="interaction_requested"||_.type==="interaction_responded"||_.type==="interaction_recovered"||_.type==="review_started"||_.type==="review_completed"}function J(_){return _.type==="message_created"&&_.data.role==="user"&&(_.data.inboxMessageId!==void 0||_.data.parentMessageId===void 0)}function u(_,E){let R=_.find((W)=>J(W)&&W.data.messageId===E);if(!R)throw Error(`Rewind checkpoint not found: ${E}`);return{messageId:E,preview:c(_,E),createdAt:R.data.createdAt}}function c(_,E){let R=_.flatMap((W)=>{if(W.type!=="part_created"||W.data.messageId!==E)return[];if(W.data.partType==="text"){let $=W.data.payload;return typeof $.text==="string"?[$.text]:[]}if(W.data.partType==="image")return["[Image]"];return[]}).join("").trim();if(R.length<=160)return R;return`${R.slice(0,160)}...`}function S(_,E){u(_,E);let R=_.findIndex((k)=>k.type==="message_created"&&k.data.messageId===E),W=_[R],$=W?.type==="message_created"?W.data.inboxMessageId:void 0,H=new Set(_.flatMap((k)=>k.type==="turn_started"&&$&&k.data.inputMessageIds?.includes($)?[k.data.turnId]:[]));return _.filter((k,M)=>{if((k.type==="turn_started"||k.type==="turn_completed"||k.type==="turn_aborted")&&H.has(k.data.turnId))return!1;return M<R||!H_(k)})}function w(_){let E=[];for(let R of _){if(R.type!=="session_rewound"){E.push(R);continue}if(u(E,R.data.targetMessageId),R.data.mode!=="code")E=S(E,R.data.targetMessageId)}return E}function q_(_){let E=w(_);return E.filter(J).map((R)=>({messageId:R.data.messageId,preview:c(E,R.data.messageId),createdAt:R.data.createdAt})).reverse()}function y_(_,E){let R=w(_),W=u(R,E),$=R.findIndex((k)=>k.type==="message_created"&&k.data.messageId===E),H=R.slice($);return{checkpoint:W,projectedEntries:S(R,E),removedTurns:H.filter(J).length,snapshotMessageIds:H.flatMap((k)=>k.type==="part_created"&&k.data.partType==="tool_call"?[k.data.partId]:[])}}import*as f from"node:fs";import{createReadStream as M_}from"node:fs";import*as V from"node:fs/promises";import*as O from"node:path";import{createInterface as Q_}from"node:readline";var m=65536;function x(_){let E=_.data;if(E===null||typeof E!=="object"||Array.isArray(E))throw Error("Session event data must be a JSON object");return JSON.stringify(_)}function V_(_,E,R){let W=_.trim();if(!W)return;try{return JSON.parse(W)}catch($){throw Error(`Invalid session JSONL in ${R} at line ${E}`,{cause:$})}}function z(_,E="session transcript"){let R=_.split(`
1
+ import{Eg as i}from"./chunk-fhnkyqfb.js";import{$g as C,Zg as o,bh as L,fh as j,gh as n}from"./chunk-qb0sqh29.js";import{hh as I}from"./chunk-hfrcwkc8.js";import{stat as d}from"node:fs/promises";import B from"node:path";import*as U from"node:path";var s=50,t=100,e=/^[A-Za-z0-9_-]+$/,__=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/;function E_(_){return typeof _==="string"&&__.test(_)&&Number.isFinite(Date.parse(_))}function P(_){return typeof _==="string"&&U.isAbsolute(_)}function R_(_){return Buffer.from(JSON.stringify(_),"utf8").toString("base64url")}function W_(_){try{if(!e.test(_))throw Error("invalid");let E=Buffer.from(_,"base64url").toString("utf8");if(Buffer.from(E,"utf8").toString("base64url")!==_)throw Error("invalid");let R=JSON.parse(E);if(R.version!==1||typeof R.includeSubagents!=="boolean"||R.archived!==void 0&&typeof R.archived!=="boolean"||!(R.cwd===null||P(R.cwd))||!E_(R.lastMessageTime)||!P(R.projectPath)||!C(R.sessionId))throw Error("invalid");return{version:1,cwd:R.cwd===null?null:U.resolve(R.cwd),includeSubagents:R.includeSubagents,archived:R.archived??!1,lastMessageTime:R.lastMessageTime,projectPath:U.resolve(R.projectPath),sessionId:R.sessionId}}catch{throw Error("Invalid session cursor")}}function y(_){let E="";for(let R=0;R<_.length;R+=1)E+=_.charCodeAt(R).toString(16).padStart(4,"0");return E}function $_(_){if(!_.cursor)return;let E=W_(_.cursor);if(E.cwd!==_.cwd||E.includeSubagents!==_.includeSubagents||(E.archived??!1)!==_.archived)throw Error("Session cursor scope does not match this query");return E}function z_(_={}){let{cwd:E,cursor:R,limit:W,includeSubagents:$=!1,archived:H=!1}=_;if(E!==void 0&&!U.isAbsolute(E))throw Error("Session catalog cwd must be absolute");let k=W===void 0?s:W;if(!Number.isInteger(k)||k<1||k>t)throw Error("Session catalog limit must be an integer from 1 to 100");return{cwd:E===void 0?null:U.resolve(E),cursor:R??void 0,limit:k,includeSubagents:$,archived:H}}function k_(_,E){if(_.lastMessageTime>E.lastMessageTime)return-1;if(_.lastMessageTime<E.lastMessageTime)return 1;if(_.projectPath<E.projectPath)return-1;if(_.projectPath>E.projectPath)return 1;if(_.sessionId<E.sessionId)return-1;if(_.sessionId>E.sessionId)return 1;return 0}function f_(_,E){let R=[..._],W=$_(E);if(W)R=R.filter((k)=>k_(k,{sessionId:W.sessionId,projectPath:W.projectPath,lastMessageTime:W.lastMessageTime})>0);let $=R.slice(0,E.limit);if($.length===0||R.length<=$.length)return{sessions:$};let H=$[$.length-1];return{sessions:$,nextCursor:R_({version:1,cwd:E.cwd,includeSubagents:E.includeSubagents,archived:E.archived,lastMessageTime:H.lastMessageTime,projectPath:H.projectPath,sessionId:H.sessionId})}}function H_(_){return _.type==="message_created"||_.type==="part_created"||_.type==="part_updated"||_.type==="turn_started"||_.type==="turn_completed"||_.type==="turn_aborted"||_.type==="interaction_requested"||_.type==="interaction_responded"||_.type==="interaction_recovered"||_.type==="review_started"||_.type==="review_completed"}function J(_){return _.type==="message_created"&&_.data.role==="user"&&(_.data.inboxMessageId!==void 0||_.data.parentMessageId===void 0)}function u(_,E){let R=_.find((W)=>J(W)&&W.data.messageId===E);if(!R)throw Error(`Rewind checkpoint not found: ${E}`);return{messageId:E,preview:c(_,E),createdAt:R.data.createdAt}}function c(_,E){let R=_.flatMap((W)=>{if(W.type!=="part_created"||W.data.messageId!==E)return[];if(W.data.partType==="text"){let $=W.data.payload;return typeof $.text==="string"?[$.text]:[]}if(W.data.partType==="image")return["[Image]"];return[]}).join("").trim();if(R.length<=160)return R;return`${R.slice(0,160)}...`}function S(_,E){u(_,E);let R=_.findIndex((k)=>k.type==="message_created"&&k.data.messageId===E),W=_[R],$=W?.type==="message_created"?W.data.inboxMessageId:void 0,H=new Set(_.flatMap((k)=>k.type==="turn_started"&&$&&k.data.inputMessageIds?.includes($)?[k.data.turnId]:[]));return _.filter((k,M)=>{if((k.type==="turn_started"||k.type==="turn_completed"||k.type==="turn_aborted")&&H.has(k.data.turnId))return!1;return M<R||!H_(k)})}function w(_){let E=[];for(let R of _){if(R.type!=="session_rewound"){E.push(R);continue}if(u(E,R.data.targetMessageId),R.data.mode!=="code")E=S(E,R.data.targetMessageId)}return E}function q_(_){let E=w(_);return E.filter(J).map((R)=>({messageId:R.data.messageId,preview:c(E,R.data.messageId),createdAt:R.data.createdAt})).reverse()}function y_(_,E){let R=w(_),W=u(R,E),$=R.findIndex((k)=>k.type==="message_created"&&k.data.messageId===E),H=R.slice($);return{checkpoint:W,projectedEntries:S(R,E),removedTurns:H.filter(J).length,snapshotMessageIds:H.flatMap((k)=>k.type==="part_created"&&k.data.partType==="tool_call"?[k.data.partId]:[])}}import*as f from"node:fs";import{createReadStream as M_}from"node:fs";import*as V from"node:fs/promises";import*as O from"node:path";import{createInterface as Q_}from"node:readline";var m=65536;function x(_){let E=_.data;if(E===null||typeof E!=="object"||Array.isArray(E))throw Error("Session event data must be a JSON object");return JSON.stringify(_)}function V_(_,E,R){let W=_.trim();if(!W)return;try{return JSON.parse(W)}catch($){throw Error(`Invalid session JSONL in ${R} at line ${E}`,{cause:$})}}function z(_,E="session transcript"){let R=_.split(`
2
2
  `),W=!_.endsWith(`
3
3
  `),$=[];for(let[H,k]of R.entries())try{let M=V_(k,H+1,E);if(M){if(typeof M.seq!=="number")M.seq=$.length+1;$.push(M)}}catch(M){if(W&&H===R.length-1)break;throw M}return $}class Y{static appendQueues=new Map;filePath;constructor(_){this.filePath=_}static maxSeq(_){let E=0;for(let R of _)if(typeof R.seq==="number"&&R.seq>E)E=R.seq;return E}static stampSeqFrom(_,E){let R=E;return _.map((W)=>{if(typeof W.seq==="number"){if(W.seq>R)R=W.seq;return W}return R+=1,{...W,seq:R}})}static stampSeq(_,E){return Y.stampSeqFrom(_,Y.maxSeq(E))}async append(_){try{let[E]=await this.appendEntries([_]);return E}catch(E){throw console.error(`[JSONLStore] 追加写入失败: ${this.filePath}`,E),E}}async appendBatch(_){try{return await this.appendEntries(_)}catch(E){throw console.error(`[JSONLStore] 批量追加写入失败: ${this.filePath}`,E),E}}async appendEntries(_){if(_.length===0)return[];return this.enqueue(async()=>{await V.mkdir(O.dirname(this.filePath),{recursive:!0,mode:493});let E=await V.open(this.filePath,"a+",384);try{let R=await this.repairIncompleteTail(E),W=await this.readTailSeq(E),$=Y.stampSeqFrom(_,W),H=`${$.map(x).join(`
4
4
  `)}
@@ -113,4 +113,4 @@ CREATE VIRTUAL TABLE IF NOT EXISTS parts_fts USING fts5(
113
113
  ORDER BY timestamp DESC LIMIT ?`:`SELECT session_id, role, timestamp, text FROM parts_fts
114
114
  WHERE parts_fts MATCH ?
115
115
  ORDER BY timestamp DESC LIMIT ?`,M=_.prepare(k);return R?M.all(H,R,W):M.all(H,W)}
116
- export{w as Cc,q_ as Dc,y_ as Ec,z as Fc,Y as Gc,y as Hc,$_ as Ic,z_ as Jc,k_ as Kc,f_ as Lc,r as Mc,K_ as Nc,U_ as Oc,B_ as Pc,A_ as Qc,n_ as Rc,i_ as Sc,d_ as Tc};
116
+ export{w as Fc,q_ as Gc,y_ as Hc,z as Ic,Y as Jc,y as Kc,$_ as Lc,z_ as Mc,k_ as Nc,f_ as Oc,r as Pc,K_ as Qc,U_ as Rc,B_ as Sc,A_ as Tc,n_ as Uc,i_ as Vc,d_ as Wc};
@@ -0,0 +1 @@
1
+ import{Ac as g,uc as a,vc as b,wc as c,xc as d,yc as e,zc as f}from"./chunk-ag5ea7ce.js";import"./chunk-0qsssahq.js";import"./chunk-56qew7w0.js";import"./chunk-qp2z1r7y.js";import"./chunk-2yvte5a7.js";import"./chunk-cxzx7j0p.js";import"./chunk-j7edwwg1.js";import"./chunk-kfpzrmq7.js";import"./chunk-fhnkyqfb.js";import"./chunk-hcm55r3d.js";import"./chunk-vbpykrxd.js";import"./chunk-qb0sqh29.js";import"./chunk-hfrcwkc8.js";export{b as __setSessionSnapshotIOForTesting,c as __resetSessionSnapshotIOForTesting,g as SessionService,d as SessionMissingCreationError,e as SessionArchivedError,f as SessionArchiveConflictError,a as STALE_EMPTY_SESSION_AGE_MS};