blade-code 0.10.73 → 0.10.74
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.
- package/dist/blade.js +2 -2
- package/dist/{chunk-4ehgjdm0.js → chunk-03947xkg.js} +1 -1
- package/dist/{chunk-yvnm25nb.js → chunk-0cbpjhq7.js} +1 -1
- package/dist/{chunk-xv92c582.js → chunk-0m2bs3s2.js} +1 -1
- package/dist/{chunk-9e6dcbqq.js → chunk-16k0tc6h.js} +2 -2
- package/dist/chunk-1qde0g23.js +1 -0
- package/dist/{chunk-2wdxpdz3.js → chunk-1ykz47d9.js} +2 -2
- package/dist/{chunk-tvv3syt3.js → chunk-1zkwxaa0.js} +1 -1
- package/dist/{chunk-3hv57n95.js → chunk-21bb1xda.js} +311 -289
- package/dist/{chunk-ah12xhh6.js → chunk-22aaybx2.js} +1 -1
- package/dist/chunk-22s3r2xy.js +2 -0
- package/dist/chunk-2e6pcscc.js +1 -0
- package/dist/{chunk-vhadycw2.js → chunk-2faga011.js} +2 -2
- package/dist/{chunk-3r0x2p7z.js → chunk-2m4mgw58.js} +2 -2
- package/dist/{chunk-tzytnhbp.js → chunk-2qqmmxqf.js} +2 -2
- package/dist/{chunk-a37mn58w.js → chunk-2v10cw32.js} +1 -1
- package/dist/{chunk-traa01dd.js → chunk-44zkyzrj.js} +1 -1
- package/dist/{chunk-xjc0bthz.js → chunk-453tf6d0.js} +2 -2
- package/dist/{chunk-4cpgcm7q.js → chunk-465tgzab.js} +2 -2
- package/dist/chunk-4mgjj8zg.js +1 -0
- package/dist/{chunk-vw0gg08s.js → chunk-4ppgfhqd.js} +2 -2
- package/dist/{chunk-jeazjp08.js → chunk-54va5hc4.js} +3 -3
- package/dist/chunk-63c25yhj.js +1 -0
- package/dist/{chunk-8fm3xamc.js → chunk-6ra5d8ng.js} +1 -1
- package/dist/{chunk-5d1gbm41.js → chunk-74wb5e1h.js} +2 -2
- package/dist/{chunk-q6ak67n8.js → chunk-7hc84akg.js} +2 -2
- package/dist/{chunk-67ddp3ns.js → chunk-7kf3hwp3.js} +3 -3
- package/dist/{chunk-meee1cbq.js → chunk-8asewt01.js} +1 -1
- package/dist/{chunk-p0qjjyex.js → chunk-8w1gtvy0.js} +2 -2
- package/dist/{chunk-b28zsp1t.js → chunk-8zpsw401.js} +3 -3
- package/dist/{chunk-0hrj06t7.js → chunk-99nevk7k.js} +1 -1
- package/dist/chunk-a6kbpq05.js +1 -0
- package/dist/chunk-aqzbsxjh.js +1 -0
- package/dist/chunk-bawbgvm3.js +6 -0
- package/dist/{chunk-ne7vres8.js → chunk-bj5msq36.js} +1 -1
- package/dist/{chunk-yx82ang3.js → chunk-bxtw5f52.js} +2 -2
- package/dist/{chunk-k82ff14t.js → chunk-c03xn5s3.js} +1 -1
- package/dist/{chunk-77hn7hf6.js → chunk-cpky2bgy.js} +1 -1
- package/dist/chunk-cvbacjwr.js +10 -0
- package/dist/{chunk-sxjs66h6.js → chunk-d51pge1m.js} +1 -1
- package/dist/{chunk-r8wbvxn7.js → chunk-fbgzeb3m.js} +1 -1
- package/dist/chunk-ffkdx471.js +1 -0
- package/dist/{chunk-r5bpvfym.js → chunk-fhxy024n.js} +1 -1
- package/dist/{chunk-ax610gqh.js → chunk-fj297dmj.js} +1 -1
- package/dist/{chunk-9cgsheg0.js → chunk-fx19tpcm.js} +2 -2
- package/dist/{chunk-948efzyp.js → chunk-gbrwzpyg.js} +2 -2
- package/dist/{chunk-b3413dtc.js → chunk-h4d37zt2.js} +1 -1
- package/dist/{chunk-tmvg7taj.js → chunk-k3ddw7q3.js} +1 -1
- package/dist/{chunk-4khtsmrf.js → chunk-kaf6m50a.js} +1 -1
- package/dist/chunk-kheaqr7j.js +1 -0
- package/dist/{chunk-a5e4sy4q.js → chunk-map4165w.js} +2 -2
- package/dist/chunk-ntvm6t83.js +1 -0
- package/dist/{chunk-mefb27ch.js → chunk-p7ww2tcn.js} +1 -1
- package/dist/{chunk-p7y79y6c.js → chunk-qp8mejbn.js} +1 -1
- package/dist/{chunk-kka51s0k.js → chunk-qtt17d5s.js} +1 -1
- package/dist/{chunk-zxn7f308.js → chunk-qw5j84ny.js} +2 -2
- package/dist/chunk-qxjsfp2c.js +1 -0
- package/dist/{chunk-skw3b17a.js → chunk-qyxbee3w.js} +1 -1
- package/dist/{chunk-wp0794r2.js → chunk-r297pq3s.js} +2 -2
- package/dist/{chunk-jkh9s1ht.js → chunk-rc7jnds2.js} +1 -1
- package/dist/{chunk-y36rdy4v.js → chunk-rjgfy07e.js} +2 -2
- package/dist/{chunk-n1w40gq2.js → chunk-shx5e10e.js} +2 -2
- package/dist/chunk-vm5bzhrm.js +1 -0
- package/dist/chunk-wgztvasm.js +1 -0
- package/dist/chunk-x5579r4w.js +1 -0
- package/dist/{chunk-js4vqnds.js → chunk-xbj18hxh.js} +1 -1
- package/dist/{chunk-a0ns74mh.js → chunk-xgmn301g.js} +1 -1
- package/dist/{chunk-c9e0fbyh.js → chunk-xkz9ecdx.js} +1 -1
- package/dist/{chunk-cvvtrvk6.js → chunk-y67yrm3k.js} +2 -2
- package/dist/chunk-yjbq4jeg.js +2 -0
- package/dist/chunk-yrbbx1pr.js +1 -0
- package/dist/{chunk-bhhdvqe7.js → chunk-ytce7gnt.js} +2 -2
- package/dist/{chunk-1ava19kd.js → chunk-yz80dp1a.js} +2 -2
- package/dist/web/assets/ChatView-Bjl8VJFM.js +18 -0
- package/dist/web/assets/{CodeBlockHighlighter-XaY8h0vd.js → CodeBlockHighlighter-i8Yc4Qe4.js} +1 -1
- package/dist/web/assets/{FilePreview-CVHV6oga.js → FilePreview-DbU1IMtz.js} +1 -1
- package/dist/web/assets/{KanbanBoard-D1_61uZi.js → KanbanBoard-Fe4qkgpi.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-DUPwAzs4.js → MarkdownRenderer-CdeC66uL.js} +3 -3
- package/dist/web/assets/{SettingsModal-DHnU7uMN.js → SettingsModal-mbG701yW.js} +1 -1
- package/dist/web/assets/{TaskSwitcher-CpXhLtO5.js → TaskSwitcher-DF-q_rMi.js} +1 -1
- package/dist/web/assets/{TerminalPanel-eYsA-A62.js → TerminalPanel-BxAmwOXK.js} +1 -1
- package/dist/web/assets/{index-gjBOFzd1.js → index-BTj86SSJ.js} +3 -3
- package/dist/web/assets/{teamService-Bb2kW8Hh.js → teamService-Cnno2N5h.js} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/chunk-0qqzd0hq.js +0 -1
- package/dist/chunk-1cyy8wqj.js +0 -10
- package/dist/chunk-3fzy7q6x.js +0 -1
- package/dist/chunk-64jq6jcr.js +0 -2
- package/dist/chunk-8h35w91f.js +0 -1
- package/dist/chunk-fdmcef2p.js +0 -2
- package/dist/chunk-fgh6mjdp.js +0 -6
- package/dist/chunk-hswyrd88.js +0 -1
- package/dist/chunk-jsg7vmxp.js +0 -1
- package/dist/chunk-vxd30mnx.js +0 -1
- package/dist/chunk-wbzvy99s.js +0 -1
- package/dist/chunk-wg3z2epq.js +0 -1
- package/dist/chunk-xkc6v9nb.js +0 -1
- package/dist/chunk-yg6c4xrs.js +0 -1
- package/dist/chunk-z8a5ebep.js +0 -1
- package/dist/chunk-z95pw8nb.js +0 -1
- package/dist/chunk-zh2x0tcm.js +0 -1
- package/dist/chunk-zr1mg5kq.js +0 -1
- package/dist/web/assets/ChatView-Dm-DMbOV.js +0 -18
package/dist/blade.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{
|
|
2
|
+
import{Ad as W}from"./chunk-shx5e10e.js";import{Dd as F,Ed as M}from"./chunk-2m4mgw58.js";import"./chunk-ytce7gnt.js";import"./chunk-v508x7cg.js";import"./chunk-xkz9ecdx.js";import"./chunk-7kf3hwp3.js";import"./chunk-03947xkg.js";import"./chunk-465tgzab.js";import"./chunk-qp8mejbn.js";import"./chunk-c03xn5s3.js";import"./chunk-yjbq4jeg.js";import{Eg as N,Fg as B}from"./chunk-22aaybx2.js";import"./chunk-qtt17d5s.js";import{eh as T}from"./chunk-2qqmmxqf.js";import"./chunk-gbrwzpyg.js";import"./chunk-bj5msq36.js";import"./chunk-453tf6d0.js";import"./chunk-yz80dp1a.js";import"./chunk-p7ww2tcn.js";import"./chunk-qw5j84ny.js";import{Nh as J}from"./chunk-99nevk7k.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-wgztvasm.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-63c25yhj.js");K(U.map((Z)=>v.resolve(Q,Z)))}if(q(E,"--trust-workspace","--trustWorkspace")){let{WorkspaceTrustService:K}=await import("./chunk-qxjsfp2c.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-bawbgvm3.js");if(await K())return}if(W(),q(E,"--print","-p")){let{handlePrintMode:K}=await import("./chunk-8asewt01.js");if(await K())return}if(E.includes("--acp")){let{runAcpIntegration:K}=await import("./chunk-8w1gtvy0.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-x5579r4w.js"),import("./chunk-vm5bzhrm.js"),import("./chunk-7hc84akg.js"),import("./chunk-fj297dmj.js"),import("./chunk-d51pge1m.js"),import("./chunk-44zkyzrj.js"),import("./chunk-2v10cw32.js"),import("./chunk-1qde0g23.js"),import("./chunk-cpky2bgy.js"),import("./chunk-cvbacjwr.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-
|
|
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-aqzbsxjh.js").then(({checkVersionOnStartup:C})=>C()),[{render:w},{createElement:f},{AppWrapper:j}]=await Promise.all([import("ink"),import("react"),import("./chunk-16k0tc6h.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
|
import{spawn as I}from"node:child_process";var X=500;function x(j){return new Promise((q)=>setTimeout(q,j))}function Z(j){return j&&typeof j==="object"&&"code"in j?String(j.code):void 0}function L(j){return j()||j()}function G(j,q=process.platform,y=process.kill.bind(process)){if(q==="win32"||!Number.isInteger(j)||j<=1||j===process.pid)return!1;try{return y(-j,0),!0}catch(z){let B=Z(z);if(B==="ESRCH")return!1;if(B==="EPERM")return!0;throw z}}function N(j,q){return new Promise((y)=>{let z=["/PID",String(j),"/T"];if(q)z.push("/F");let B=I("taskkill",z,{stdio:"ignore",windowsHide:!0}),K=!1,J=(H)=>{if(K)return;K=!0,y(H)};B.once("error",()=>J(!1)),B.once("close",(H)=>J(H===0))})}async function F(j,q={}){if(!Number.isInteger(j)||j<=1||j===process.pid)return{success:!1,alreadyExited:!1,forced:!1};let y=q.platform??process.platform,z=q.gracePeriodMs??X,B=q.killProcess??process.kill.bind(process),K=q.taskkill??N,J=q.wait??x,H=q.validatePidOwnership??(()=>!0);if(!L(H))return{success:!1,alreadyExited:!1,forced:!1};if(y==="win32"){let V=await K(j,!1);if(await J(z),!H())return{success:V,alreadyExited:!1,forced:!1};let Y=await K(j,!0);return{success:V||Y,alreadyExited:!V&&!Y,forced:Y}}let Q=(V,Y)=>{try{return B(V,Y)}catch(D){return Z(D)==="ESRCH"}},W=Q(-j,"SIGTERM")||Q(j,"SIGTERM");if(await J(z),!H())return{success:W,alreadyExited:!1,forced:!1};let $=Q(-j,"SIGKILL")||Q(j,"SIGKILL");return{success:W||$,alreadyExited:!1,forced:$}}async function R(j,q={}){if(!Number.isInteger(j)||j<=1||j===process.pid)return{success:!1,alreadyExited:!1,forced:!1};if((q.platform??process.platform)==="win32")return{success:!1,alreadyExited:!1,forced:!1};let z=q.gracePeriodMs??X,B=q.killProcess??process.kill.bind(process),K=q.wait??x,J=q.validatePidOwnership??(()=>!0);if(!J())return{success:!1,alreadyExited:!1,forced:!1};let H=($)=>{try{return B(-j,$),"sent"}catch(V){return Z(V)==="ESRCH"?"missing":"failed"}},Q=H("SIGTERM");if(Q==="missing")return{success:!0,alreadyExited:!0,forced:!1};if(Q==="failed")return{success:!1,alreadyExited:!1,forced:!1};if(await K(z),!J())return{success:!1,alreadyExited:!1,forced:!1};let W=H("SIGKILL");return{success:W!=="failed",alreadyExited:W==="missing",forced:W==="sent"}}class b{child;state="owned";terminationPromise;terminationResult;platform;gracePeriodMs;killProcess;taskkill;wait;constructor(j,q={}){this.child=j;if(this.platform=q.platform??process.platform,this.gracePeriodMs=q.gracePeriodMs??X,this.killProcess=q.killProcess??process.kill.bind(process),this.taskkill=q.taskkill??N,this.wait=q.wait??x,q.releaseOnExit!==!1){let y=()=>{if(this.state==="owned")this.state="released"};j.once("close",y),j.once("error",y)}}release(){if(this.state==="owned")this.state="released"}terminate(){if(this.terminationPromise)return this.terminationPromise;if(this.terminationResult)return Promise.resolve(this.terminationResult);if(this.state==="released")return this.terminationResult={success:!0,alreadyExited:!0,forced:!1},Promise.resolve(this.terminationResult);return this.state="terminating",this.terminationPromise=this.terminateOwnedTree().then((j)=>{return this.state="released",this.terminationResult=j,j}),this.terminationPromise}async terminateOwnedTree(){let j=this.child.pid;if(!j)return{success:!1,alreadyExited:!0,forced:!1};if(this.platform==="win32"){let z=await this.taskkill(j,!1);await this.wait(this.gracePeriodMs);let B=await this.taskkill(j,!0);if(!z&&!B)return{success:this.signalDirectChild("SIGKILL"),alreadyExited:!1,forced:!0};return{success:!0,alreadyExited:!1,forced:!0}}let q=this.signalPosixTree(j,"SIGTERM");await this.wait(this.gracePeriodMs);let y=this.signalPosixTree(j,"SIGKILL");return{success:q||y,alreadyExited:!1,forced:y}}signalPosixTree(j,q){if(j<=1||j===process.pid)return this.signalDirectChild(q);try{return this.killProcess(-j,q)}catch(y){if(Z(y)==="ESRCH")return!0;return this.signalDirectChild(q)}}signalDirectChild(j){try{return this.child.kill(j)}catch(q){return Z(q)==="ESRCH"}}}function v(j,q,y={},z={}){let B=I(j,q,{...y,detached:process.platform==="win32"?y.detached:!0,windowsHide:y.windowsHide??!0});return{child:B,processTree:new b(B,z)}}
|
|
2
|
-
export{G as
|
|
2
|
+
export{G as jf,F as kf,R as lf,v as mf};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{th as S}from"./chunk-453tf6d0.js";import{Nh as f}from"./chunk-99nevk7k.js";import*as $ from"fs/promises";import*as K from"path";import j from"semver";import{ProxyAgent as H,fetch as I}from"undici";function R(){return process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy}function N(){let q=R();if(q)try{return new H(q)}catch(z){console.warn(`[proxyFetch] Invalid proxy URL: ${q}`)}return}async function M(q,z={}){let{timeout:W=30000,signal:Q,...B}=z;if(Q?.aborted)throw new DOMException("The operation was aborted.","AbortError");let J=N(),X=new AbortController,Y=!1,F=setTimeout(()=>{Y=!0,X.abort()},W),b=()=>X.abort();Q?.addEventListener("abort",b);try{let Z={method:B.method,headers:B.headers,body:B.body,signal:X.signal,dispatcher:J};return await I(q.toString(),Z)}catch(Z){if(Z instanceof Error&&Z.name==="AbortError"){if(Y)throw Error(`Request timeout after ${W}ms`);throw Z}throw Z}finally{clearTimeout(F),Q?.removeEventListener("abort",b)}}var w="blade-code",y="https://cdn.jsdelivr.net/npm/blade-code@latest/CHANGELOG.md",G=K.join(process.env.HOME||process.env.USERPROFILE||".",".blade"),O=K.join(G,"version-cache.json"),P=3600000,k=`https://registry.npmjs.org/${w}/latest`;async function L(){try{if(process.env.BLADE_VERSION)return process.env.BLADE_VERSION;return S()}catch{return"unknown"}}async function T(){try{let q=await $.readFile(O,"utf-8"),z=JSON.parse(q);if(Date.now()-z.checkedAt<P)return z;return{...z,checkedAt:0}}catch{return null}}async function D(q){try{await $.mkdir(G,{recursive:!0,mode:493}),await $.writeFile(O,JSON.stringify(q,null,2))}catch{}}async function x(){try{let q=await M(k,{timeout:5000,headers:{Accept:"application/json"}});if(!q.ok)return null;return(await q.json()).version||null}catch{return null}}async function _(q=!1){let z=await L(),W=y;if(z==="unknown")return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to determine current version"};let Q=await T(),B=Q?.skipUntilVersion,J=null;if(!q&&Q?.latestVersion&&Q.checkedAt>0)J=Q.latestVersion;else if(J=await x(),J)await D({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});else if(Q?.latestVersion)await D({checkedAt:0,skipUntilVersion:B});if(!J||!j.valid(J))return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to check for updates"};if(j.lt(J,z))J=z,await D({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});let X=j.gt(J,z),Y=X;if(X&&B)Y=j.gt(J,B);return{currentVersion:z,latestVersion:J,hasUpdate:X,shouldPrompt:Y,releaseNotesUrl:W}}async function u(q){let z=await T();await D({latestVersion:z?.latestVersion??q,checkedAt:z?.checkedAt||Date.now(),skipUntilVersion:q})}function g(){return`npm install -g ${w}@latest --registry https://registry.npmjs.org`}async function C(){let{spawn:q}=await import("child_process");return new Promise((z)=>{let W=g(),Q=q(W,{stdio:"inherit",shell:!0});Q.on("close",(B)=>{if(B===0)z({success:!0,message:"Upgrade successful! Please restart blade."});else z({success:!1,message:`Upgrade failed (exit code: ${B})`})}),Q.on("error",(B)=>{z({success:!1,message:`Upgrade failed: ${B.message}`})})})}async function V(){try{let q=await _();return q.shouldPrompt?q:null}catch{return null}}
|
|
2
2
|
export{_ as a,u as b,g as c,C as d,V as e};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as RY,c as MY,d as TY}from"./chunk-
|
|
1
|
+
import{b as RY,c as MY,d as TY}from"./chunk-0m2bs3s2.js";import{j as DJ,k as VJ}from"./chunk-1zkwxaa0.js";import{u as s2}from"./chunk-6ra5d8ng.js";import{$ as tJ,C as c6,E as gY,G as OQ,H as XQ,I as v6,M as A6,N as P6,R as j1,T as e4,U as $6,X as y6,Z as z2,_ as nJ,ca as sJ,da as eJ,ha as L4,ia as $9,ka as t6,la as s6,ma as mY,na as O6,pa as z6,ra as x6}from"./chunk-21bb1xda.js";import{Aa as EY,va as qJ,wa as OJ,xa as zJ}from"./chunk-fx19tpcm.js";import{Ca as b6}from"./chunk-22s3r2xy.js";import{Fb as QQ,jb as L6,kb as B6,wb as w6}from"./chunk-8zpsw401.js";import{Qb as W2}from"./chunk-fbgzeb3m.js";import{Ac as s4,Hc as Y6,Ic as $Q,Jc as Z6,Lc as d2,Tc as O2,Wc as C0,hc as _6,vc as t4}from"./chunk-1ykz47d9.js";import"./chunk-qyxbee3w.js";import"./chunk-r297pq3s.js";import{xd as PY}from"./chunk-4ppgfhqd.js";import{Bd as C1,yd as H2,zd as e2}from"./chunk-shx5e10e.js";import"./chunk-2m4mgw58.js";import{Fd as k$,Gd as a0,Hd as Q$,Id as jQ,Jd as g$,Kd as r2,Ld as v9,Md as Q4,Nd as MJ,Od as D9,Pd as V$,Qd as l0,Rd as jY,Sd as o0,Td as AY,Ud as D8,Vd as N2,Yd as U6,de as p0}from"./chunk-ytce7gnt.js";import"./chunk-v508x7cg.js";import"./chunk-xkz9ecdx.js";import"./chunk-rjgfy07e.js";import{qe as J4}from"./chunk-2faga011.js";import"./chunk-xbj18hxh.js";import"./chunk-y67yrm3k.js";import{Be as Q8,Ee as _Y,Je as iJ,Se as hY}from"./chunk-74wb5e1h.js";import"./chunk-kaf6m50a.js";import"./chunk-0cbpjhq7.js";import"./chunk-rc7jnds2.js";import{gf as gQ,if as q1}from"./chunk-7kf3hwp3.js";import"./chunk-03947xkg.js";import{kg as DY,pg as oJ,qg as VY}from"./chunk-465tgzab.js";import"./chunk-qp8mejbn.js";import"./chunk-c03xn5s3.js";import{Ag as a2,Bg as mQ,zg as m$}from"./chunk-yjbq4jeg.js";import{Fg as d0}from"./chunk-22aaybx2.js";import"./chunk-qtt17d5s.js";import{ch as vY,fh as t1}from"./chunk-2qqmmxqf.js";import{hh as kJ,ih as SJ,lh as h1}from"./chunk-gbrwzpyg.js";import"./chunk-bj5msq36.js";import{xh as bJ}from"./chunk-453tf6d0.js";import{Ah as F4}from"./chunk-yz80dp1a.js";import"./chunk-p7ww2tcn.js";import{Lh as e8}from"./chunk-qw5j84ny.js";import{Nh as EQ}from"./chunk-99nevk7k.js";import{useMemoizedFn as u8}from"ahooks";import{useEffect as S7,useState as l8}from"react";import{useMemoizedFn as s0}from"ahooks";import{Box as z$}from"ink";import{useEffect as _$,useMemo as R7,useRef as p8}from"react";import{useShallow as uY}from"zustand/react/shallow";import{useStore as xY}from"zustand";function t($){return xY(V$,$)}var lY=[],j$=()=>t(($)=>$.session.sessionId),T1=()=>t(($)=>$.session.workspaceRoot),B4=()=>t(($)=>$.session.messages),w4=()=>t(($)=>$.session.clearCount),b4=()=>t(($)=>$.session.isCompacting),A4=()=>t(($)=>$.session.tokenUsage.estimatedCostUsd),P4=()=>t(($)=>{let{totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}=$.session.tokenUsage;return L4({totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}).hitRate}),y4=()=>t(($)=>$.session.providerCircuit),R4=()=>t(($)=>$.session.providerAdmission),M4=()=>t(($)=>$.session.providerRetry),T4=()=>t(($)=>$.session.providerStall),C4=()=>t(($)=>$.session.actionStationarity),i1=()=>t(($)=>$.session.actions),I4=()=>t(($)=>{let{inputTokens:Q,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Q/Y*100);return Math.round(J)}),f4=()=>t(($)=>$.app.initializationStatus),k4=()=>t(($)=>$.app.initializationError),D2=()=>t(($)=>$.app.activeModal),S4=()=>t(($)=>$.app.tasks),v4=()=>t(($)=>$.app.modelEditorTarget),D4=()=>t(($)=>$.app.sessionSelectorData),V4=()=>t(($)=>$.app.awaitingSecondCtrlC),n1=()=>t(($)=>$.app.actions),V2=()=>t(($)=>$.app.sideConversation),j4=()=>t(($)=>$.app.teams),j2=()=>t(($)=>$.app.initializationStatus==="ready"),h4=()=>t(($)=>$.app.tasks.length>0),h$=()=>t(($)=>$.config.config?.permissionMode||"default"),E4=()=>t(($)=>$.config.config?.models??lY),h2=()=>t(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),E2=()=>t(($)=>$.config.config?.currentModelId),g4=()=>t(($)=>$.config.config?.agentTeamsEnabled===!0),b0=()=>t(($)=>{return a0.getTheme()}),m4=()=>t(($)=>$.config.config?.codeTheme??"default"),e0=()=>t(($)=>$.focus.currentFocus),p4=()=>t(($)=>$.focus.actions),E$=()=>t(($)=>$.command.isProcessing),c4=()=>t(($)=>$.command.actions),g2=()=>t(($)=>$.command.pendingCommands),x4=()=>t(($)=>$.command.recoveredSteeringCount),m2=()=>t(($)=>$.app.reasoningEffort!=="off"),p2=()=>t(($)=>$.app.reasoningEffort),c2=()=>t(($)=>$.app.serviceTier),x2=()=>t(($)=>$.app.responseVerbosity),u2=()=>t(($)=>$.app.communicationStyle),u4=()=>t(($)=>$.session.currentThinkingContent),l4=()=>t(($)=>$.session.thinkingExpanded),d4=()=>t(($)=>$.session.currentStreamingMessageId),r4=()=>t(uY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),a4=()=>t(($)=>$.session.finalizingStreamingMessageId),o4=()=>t(($)=>$.session.historyExpanded),i4=()=>t(($)=>$.session.expandedMessageCount);import{useMemoizedFn as s1}from"ahooks";import{useEffect as c$,useRef as s8}from"react";function dY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let K=JSON.parse(J.responseBody)?.error?.message;if(K){let U=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${K}${U}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function rY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function aY($){if(!($ instanceof Error))return!1;let Q=$.message;return Q.includes("can only concatenate str")||Q.includes("image_url")||Q.includes("multimodal")||Q.includes("vision")||Q.includes("does not support images")}function l2($){let Q=rY($),Y=aY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=dY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as oY,mkdirSync as iY,writeFileSync as nY}from"node:fs";import tY from"node:os";import a8 from"node:path";var n4=null;function sY(){let $=process.env.BLADE_STORAGE_ROOT||a8.join(tY.homedir(),".blade");return a8.join($,"logs","stream-debug.log")}function eY($){if(n4===$)return;let Q=a8.dirname($);iY(Q,{recursive:!0,mode:493}),nY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
|
|
2
2
|
`),n4=$}function o8($,Q,Y){try{let J=sY();eY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",K=`[${Z}] [${$}] ${Q}${X}
|
|
3
3
|
`;oY(J,K)}catch{}}var q2=t1("UI");function Q6($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,o8("loopEventHandler","onContentDelta",{callCount:Q.contentDeltaCount,deltaLen:J.delta.length,totalLen:Q.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(J.delta);break;case"thinking_delta":if(Y||$.signal.aborted)break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(J.delta);break;case"stream_end":{if($.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),q2.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),o8("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),Y||$.signal.aborted){Y=!0;break}let{extraContent:Z,extraThinking:X}=$.streamingBuffer.drainPendingBuffers(),K=$.getStreamingMessageId();if(K){if(Z)g$(K,Z);r2(K)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"provider_admission":{let{kind:Z,...X}=J;$.sessionActions.setProviderAdmission(J.phase==="queued"?X:null);break}case"provider_circuit":{let{kind:Z,...X}=J;$.sessionActions.setProviderCircuit(J.phase==="closed"?null:X);break}case"provider_retry":{let{kind:Z,...X}=J;$.sessionActions.setProviderRetry(J.phase==="recovered"?null:X);break}case"provider_stall":{let{kind:Z,...X}=J;$.sessionActions.setProviderStall(J.phase==="detected"?X:null);break}case"action_stationarity":{let{kind:Z,...X}=J;$.sessionActions.setActionStationarity(J.phase==="recovered"?null:X);break}case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===d2)break;if(q2.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:J.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let X=JSON.parse(Z.function.arguments),K=e4(Z.function.name,X);$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:K,params:X})}catch(X){q2.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===d2)break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",K=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:K,...J.update.admission?{admission:J.update.admission}:{}});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===d2)break;q2.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=s4($6(Z.function.name,J.result),t4);$.sessionActions.addToolMessage(X.summary,{toolCallId:Z.id,toolName:Z.function.name,phase:"complete",summary:X.summary,detail:X.detail});break}case"structured_output":$.sessionActions.replaceLastAssistantMessage(JSON.stringify(J.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(J.usage);break;case"compaction":if($.sessionActions.setCompacting(J.phase==="start"),J.phase==="end"){if($.sessionActions.resetContextUsage(),J.outcome!=="failed")Q.compactionCount=(Q.compactionCount??0)+1}break;case"turn_start":q2.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
4
4
|
`)});break}case"mcp_content_changed":{let Z=`MCP ${J.contentKind} r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Content",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
@@ -115,7 +115,7 @@ ${V0}`}]}}let $0=n8(V),B0=await R($0);if(!B0.accepted){let V0=B0.reason==="queue
|
|
|
115
115
|
|
|
116
116
|
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,U)).trim(),H=R.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(H)R=H[1];let k=JSON.parse(R);if(!k.name||!k.description||!k.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(k.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");K({name:k.name,description:k.description,tools:Array.isArray(k.tools)?k.tools:[],color:k.color||"blue",location:"project",systemPrompt:k.systemPrompt}),Z("confirm")}catch(B){W(B instanceof Error?B.message:String(B))}finally{L(!1)}});r6(()=>{if(J==="aiGenerating"&&!q&&!O)P()},[J,q,O,P]);let w=U8(async()=>{try{let B=X.location==="project"?GQ.join(d0(),".blade","agents"):GQ.join(D3.homedir(),".blade","agents");await d6.promises.mkdir(B,{recursive:!0});let y=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){y.push("tools:");for(let H of X.tools)y.push(` - ${H}`)}if(X.color)y.push(`color: ${X.color}`);y.push("---");let I=[y.join(`
|
|
117
117
|
`),"",`# ${X.name} Subagent`,"",X.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
|
|
118
|
-
`),R=GQ.join(B,`${X.name}.md`);await d6.promises.writeFile(R,I,"utf-8"),$()}catch(B){console.error("保存配置失败:",B)}}),C=S0(!1,Q);if(a6((B,y)=>{if(y.escape)f();else if(y.ctrl&&B==="c"||y.meta&&B==="c")C()},{isActive:J!=="tools"}),J==="mode")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(q8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(B)=>{if(B.value==="ai")b("ai"),Z("aiPrompt");else b("manual"),Z("name")}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j(J0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiPrompt")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(L2,{value:U,onChange:G,onSubmit:(B)=>{if(!B.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(O)return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"yellow",children:[j(E3,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:['根据你的描述:"',U,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="name"){let B=z==="edit";return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:["Step 1/7: ",B?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:B?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"名称: "},void 0,!1,void 0,this),B?j(J0,{children:X.name},void 0,!1,void 0,this):j(L2,{value:X.name,onChange:(y)=>K({...X,name:y}),onSubmit:(y)=>{if(p3(y))return;_()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:B?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B&&j(L2,{value:"",onChange:()=>{},onSubmit:_,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(L2,{value:X.description,onChange:(B)=>K({...X,description:B}),onSubmit:(B)=>{if(!B.trim())return;_()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="tools")return j(c3,{config:X,setConfig:K,onNext:_,onPrev:f},void 0,!1,void 0,this);if(J==="color")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(q8,{items:m3,onSelect:(B)=>{let y=B.value==="none"?void 0:B.value;K({...X,color:y}),_()}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j(J0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="location")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(q8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(B)=>{K({...X,location:B.value}),_()}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j(J0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="systemPrompt")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),j(L2,{value:X.systemPrompt,onChange:(B)=>K({...X,systemPrompt:B}),onSubmit:()=>_()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="confirm")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[j(J0,{children:[j(J0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),j(J0,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),j(J0,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),j(J0,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),j(J0,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),j(J0,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),j(J0,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(q8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(B)=>{if(B.value==="save")w();else if(B.value==="back")f();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function c3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=j3({id:"step-tools"});a6((K,U)=>{if(U.escape)J()},{isActive:Z});let X=(K)=>{if(K.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:K});Y()};return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(V3,{options:g3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import x3 from"node:fs";import{useMemoizedFn as w$}from"ahooks";import{Box as I0,Text as v0,useInput as u3}from"ink";import UQ from"ink-select-input";import{useEffect as l3,useMemo as o6,useState as O8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var qQ=10;function i6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=Q8($),[X,K]=O8(Q),[U,G]=O8(null),[q,L]=O8(0),[O,W]=O8(0),z=w$(()=>{Z.clear(),Z.loadFromStandardLocations(),L((R)=>R+1)}),b=o6(()=>{return Z.getAllSubagents()},[q]),N=Math.ceil(b.length/qQ)||1,A=o6(()=>{let R=O*qQ;return b.slice(R,R+qQ)},[b,O]);l3(()=>{let R=Math.max(0,N-1);if(O>R)W(R)},[N,O]);let T=w$(()=>{if(O<N-1)W((R)=>R+1)}),_=w$(()=>{if(O>0)W((R)=>R-1)}),f=[{key:"list",label:"查看所有 Agents",value:"list"},{key:"create",label:"创建新 Agent",value:"create"},{key:"edit",label:"编辑 Agent",value:"edit"},{key:"delete",label:"删除 Agent",value:"delete"},{key:"cancel",label:"取消",value:"cancel"}],P=w$((R)=>{if(R.value==="cancel"){J?.();return}K(R.value)}),w=w$((R)=>{if(G(R.value),X==="edit")K("editWizard");else if(X==="delete")K("deleteConfirm")}),C=w$(async()=>{if(!U?.configPath)return;try{await x3.promises.unlink(U.configPath),z(),B()}catch(R){console.error("删除失败:",R)}}),B=w$(()=>{K("menu"),G(null)}),y=S0(!1,J);if(u3((R,H)=>{if(H.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")W(0),B();else if(X==="deleteConfirm")B()}else if(H.ctrl&&R==="c"||H.meta&&R==="c")y();else if(X==="list"){if(H.leftArrow||R==="h")_();else if(H.rightArrow||R==="l")T()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(UQ,{items:f,onSelect:P},void 0,!1,void 0,this),i(I0,{marginTop:1,children:i(v0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="list"){if(b.length===0)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:[i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),i(v0,{color:"gray",children:[" (共 ",b.length," 个)"]},void 0,!0,void 0,this),N>1&&i(v0,{color:"yellow",children:[" ","第 ",O+1,"/",N," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A.map((R)=>i(I0,{flexDirection:"column",paddingLeft:2,children:[i(I0,{children:i(v0,{children:[i(v0,{bold:!0,color:R.color||"white",children:["• ",R.name]},void 0,!0,void 0,this),i(v0,{color:"gray",children:[" - ",R.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.tools&&R.tools.length>0&&i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:["工具: ",R.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.configPath&&i(I0,{paddingLeft:2,children:i(v0,{color:"gray",dimColor:!0,children:R.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R.name,!0,void 0,this)),i(I0,{marginTop:1,paddingLeft:2,children:N>1?i(v0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let I=(R)=>{if(b.length===0)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let H=b.map((k)=>({key:k.name,label:`${k.name} - ${k.description}`,value:k}));return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(UQ,{items:H,onSelect:w},void 0,!1,void 0,this),i(I0,{marginTop:1,children:i(v0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(X==="create")return i(B2,{onComplete:()=>{z(),B()},onCancel:B},void 0,!1,void 0,this);if(X==="edit")return I("编辑 Agent");if(X==="editWizard"&&U){let R={name:U.name,description:U.description,tools:U.tools||[],color:U.color,location:U.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:U.systemPrompt||""};return i(B2,{initialConfig:R,onComplete:()=>{z(),B()},onCancel:B},void 0,!1,void 0,this)}if(X==="delete")return I("删除 Agent");if(X==="deleteConfirm"&&U)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{children:["你确定要删除 Agent"," ",i(v0,{bold:!0,color:"yellow",children:U.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:["文件路径: ",U.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(UQ,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(R)=>{if(R.value==="confirm")C();else B()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as l$,Text as O0}from"ink";import r3,{useEffect as a3,useState as o3}from"react";import{useEffect as d3,useState as n6}from"react";function e6($=d0(),Q=5000){let[Y,J]=n6(null),[Z,X]=n6(!0);return d3(()=>{let K=!0,U=async()=>{try{let q=await t6($);if(!K)return;if(!q){J(null),X(!1);return}let L=await s6($);if(!K)return;J(L)}catch{if(K)J(null)}finally{if(K)X(!1)}};U();let G=null;if(Q>0)G=setInterval(U,Q);return()=>{if(K=!1,G)clearInterval(G)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as s,Fragment as B1}from"react/jsx-dev-runtime";var Q9=r3.memo(()=>{let $=j2(),Q=h$(),J=D2()==="shortcuts",Z=V4(),X=T1(),{branch:K}=e6(X),U=h2(),G=I4(),q=b4(),L=m2(),O=p2(),W=c2(),z=x2(),b=u2(),N=A4(),A=P4(),T=g2(),_=x4(),f=j$(),[P,w]=o3(null);a3(()=>{let H=!1;new OQ(X,f).get().then((n)=>{if(!H)w(n)}).catch(()=>{if(!H)w(null)});let E=OQ.subscribe((n)=>{if(!H&&n.sessionId===f&&n.workspaceRoot===X)w(n.goal)});return()=>{H=!0,E()}},[f,X]);let C=U?K8(U):!1,y=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return s(O0,{color:"magenta",children:[">> ","auto edit on ",s(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return s(O0,{color:"cyan",children:["‖ plan mode on ",s(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return s(O0,{color:"red",children:["yolo mode on ",s(O0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),I=y!==null,R=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return s(l$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?s(l$,{flexDirection:"column",gap:0,children:R.map((H,k)=>s(l$,{flexDirection:"row",children:[H.map((E,n)=>{let[d,a]=E.split(":");return s(l$,{flexDirection:"row",width:20,children:[s(O0,{color:"yellow",children:d},void 0,!1,void 0,this),s(O0,{color:"gray",children:":"},void 0,!1,void 0,this),s(O0,{color:"white",children:a},void 0,!1,void 0,this)]},n,!0,void 0,this)}),k===R.length-1&&s(O0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},k,!0,void 0,this))},void 0,!1,void 0,this):s(l$,{flexDirection:"row",gap:1,children:[K&&s(B1,{children:[s(O0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y,I&&s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),P&&s(B1,{children:[s(O0,{color:P.status==="active"?"green":P.status==="verifying"?"cyan":P.status==="blocked"||P.status==="budget_limited"?"yellow":"gray",children:["goal:",P.status," ",P.objective.slice(0,32)]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(l$,{flexDirection:"row",gap:1,children:!$?s(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):s(B1,{children:[C&&s(B1,{children:[L?s(O0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):s(O0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&s(B1,{children:[s(O0,{color:W==="fast"?"yellow":"gray",children:["Speed ",W]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&s(B1,{children:[s(O0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b!=="auto"&&s(B1,{children:[s(O0,{color:"gray",children:["Style ",b]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&s(O0,{color:"gray",children:U.model},void 0,!1,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?s(O0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):s(O0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:A===void 0?"gray":"cyan",children:["Cache ",$9(A)]},void 0,!0,void 0,this),N>0.001&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"green",children:["$",N<0.01?N.toFixed(4):N.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T.length>0&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"yellow",children:["已排队 ",T.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_>0&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"cyan",children:["已恢复 ",_," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"yellow",children:"再按一次 Ctrl+C 退出"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as zQ,Text as _Q}from"ink";import i3 from"react";import{jsxDEV as d$}from"react/jsx-dev-runtime";var J9=i3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),K=Q>=$.length;if(Q>=J&&!K)Z=Q-J+1,X=Q+1;let U=$.slice(Z,X),G=$.length>J;return d$(zQ,{flexDirection:"column",paddingX:2,paddingY:0,children:[U.map((q,L)=>{let W=Z+L===Q;return d$(zQ,{flexDirection:"row",paddingX:1,gap:2,children:[d$(_Q,{color:W?"cyan":"white",bold:W,children:q.command},void 0,!1,void 0,this),d$(_Q,{color:W?"cyan":"gray",dimColor:!W,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),G&&d$(zQ,{paddingX:1,children:d$(_Q,{color:K?"cyan":"gray",bold:K,dimColor:!K,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as F1,Text as f1,useInput as iZ,useStdout as nZ}from"ink";import tZ from"ink-select-input";import hQ,{useMemo as V9}from"react";import{Box as z0,Text as M0}from"ink";import A$,{useEffect as VQ,useMemo as b$,useRef as S9}from"react";import{Box as RQ,Text as F9}from"ink";import qZ from"react";import{Text as w1}from"ink";import KZ from"react";import z9 from"string-width";import w2 from"string-width";function NQ({onlyFirst:$=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",$?void 0:"g")}var n3=NQ();function FQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(n3,"")}var Y9=($=0)=>(Q)=>`\x1B[${Q+$}m`,Z9=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,X9=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,h0={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},xU=Object.keys(h0.modifier),t3=Object.keys(h0.color),s3=Object.keys(h0.bgColor),uU=[...t3,...s3];function e3(){let $=new Map;for(let[Q,Y]of Object.entries(h0)){for(let[J,Z]of Object.entries(Y))h0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=h0[J],$.set(Z[0],Z[1]);Object.defineProperty(h0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(h0,"codes",{value:$,enumerable:!1}),h0.color.close="\x1B[39m",h0.bgColor.close="\x1B[49m",h0.color.ansi=Y9(),h0.color.ansi256=Z9(),h0.color.ansi16m=X9(),h0.bgColor.ansi=Y9(10),h0.bgColor.ansi256=Z9(10),h0.bgColor.ansi16m=X9(10),Object.defineProperties(h0,{rgbToAnsi256:{value(Q,Y,J){if(Q===Y&&Y===J){if(Q<8)return 16;if(Q>248)return 231;return Math.round((Q-8)/247*24)+232}return 16+36*Math.round(Q/255*5)+6*Math.round(Y/255*5)+Math.round(J/255*5)},enumerable:!1},hexToRgb:{value(Q){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(Q.toString(16));if(!Y)return[0,0,0];let[J]=Y;if(J.length===3)J=[...J].map((X)=>X+X).join("");let Z=Number.parseInt(J,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(Q)=>h0.rgbToAnsi256(...h0.hexToRgb(Q)),enumerable:!1},ansi256ToAnsi:{value(Q){if(Q<8)return 30+Q;if(Q<16)return 90+(Q-8);let Y,J,Z;if(Q>=232)Y=((Q-232)*10+8)/255,J=Y,Z=Y;else{Q-=16;let U=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(U/6)/5,Z=U%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let K=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)K+=60;return K},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>h0.ansi256ToAnsi(h0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>h0.ansi256ToAnsi(h0.hexToAnsi256(Q)),enumerable:!1}}),h0}var $Z=e3(),K9=$Z;var _8=new Set(["\x1B",""]),QZ=39,HQ="\x07",q9="[",JZ="]",O9="m",z8=`${JZ}8;;`,G9=($)=>`${_8.values().next().value}${q9}${$}${O9}`,U9=($)=>`${_8.values().next().value}${z8}${$}${HQ}`,YZ=($)=>$.split(" ").map((Q)=>w2(Q)),WQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,K=w2(FQ($.at(-1)));for(let[U,G]of J.entries()){let q=w2(G);if(K+q<=Y)$[$.length-1]+=G;else $.push(G),K=0;if(_8.has(G))Z=!0,X=J.slice(U+1,U+1+z8.length).join("")===z8;if(Z){if(X){if(G===HQ)Z=!1,X=!1}else if(G===O9)Z=!1;continue}if(K+=q,K===Y&&U<J.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},ZZ=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(w2(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},XZ=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,K=YZ($),U=[""];for(let[O,W]of $.split(" ").entries()){if(Y.trim!==!1)U[U.length-1]=U.at(-1).trimStart();let z=w2(U.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))U.push(""),z=0;if(z>0||Y.trim===!1)U[U.length-1]+=" ",z++}if(Y.hard&&K[O]>Q){let b=Q-z,N=1+Math.floor((K[O]-b-1)/Q);if(Math.floor((K[O]-1)/Q)<N)U.push("");WQ(U,W,Q);continue}if(z+K[O]>Q&&z>0&&K[O]>0){if(Y.wordWrap===!1&&z<Q){WQ(U,W,Q);continue}U.push("")}if(z+K[O]>Q&&Y.wordWrap===!1){WQ(U,W,Q);continue}U[U.length-1]+=W}if(Y.trim!==!1)U=U.map((O)=>ZZ(O));let G=U.join(`
|
|
118
|
+
`),R=GQ.join(B,`${X.name}.md`);await d6.promises.writeFile(R,I,"utf-8"),$()}catch(B){console.error("保存配置失败:",B)}}),C=S0(!1,Q);if(a6((B,y)=>{if(y.escape)f();else if(y.ctrl&&B==="c"||y.meta&&B==="c")C()},{isActive:J!=="tools"}),J==="mode")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(q8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(B)=>{if(B.value==="ai")b("ai"),Z("aiPrompt");else b("manual"),Z("name")}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j(J0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiPrompt")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(L2,{value:U,onChange:G,onSubmit:(B)=>{if(!B.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(O)return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"yellow",children:[j(E3,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:['根据你的描述:"',U,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="name"){let B=z==="edit";return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:["Step 1/7: ",B?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:B?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"名称: "},void 0,!1,void 0,this),B?j(J0,{children:X.name},void 0,!1,void 0,this):j(L2,{value:X.name,onChange:(y)=>K({...X,name:y}),onSubmit:(y)=>{if(p3(y))return;_()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:B?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B&&j(L2,{value:"",onChange:()=>{},onSubmit:_,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(L2,{value:X.description,onChange:(B)=>K({...X,description:B}),onSubmit:(B)=>{if(!B.trim())return;_()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="tools")return j(c3,{config:X,setConfig:K,onNext:_,onPrev:f},void 0,!1,void 0,this);if(J==="color")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(q8,{items:m3,onSelect:(B)=>{let y=B.value==="none"?void 0:B.value;K({...X,color:y}),_()}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j(J0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="location")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(q8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(B)=>{K({...X,location:B.value}),_()}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j(J0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="systemPrompt")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j(J0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),j(L2,{value:X.systemPrompt,onChange:(B)=>K({...X,systemPrompt:B}),onSubmit:()=>_()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j(J0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="confirm")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[j(J0,{children:[j(J0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),j(J0,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),j(J0,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),j(J0,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),j(J0,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),j(J0,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(J0,{children:[j(J0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),j(J0,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(q8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(B)=>{if(B.value==="save")w();else if(B.value==="back")f();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function c3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=j3({id:"step-tools"});a6((K,U)=>{if(U.escape)J()},{isActive:Z});let X=(K)=>{if(K.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:K});Y()};return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j(J0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j(J0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(V3,{options:g3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import x3 from"node:fs";import{useMemoizedFn as w$}from"ahooks";import{Box as I0,Text as v0,useInput as u3}from"ink";import UQ from"ink-select-input";import{useEffect as l3,useMemo as o6,useState as O8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var qQ=10;function i6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=Q8($),[X,K]=O8(Q),[U,G]=O8(null),[q,L]=O8(0),[O,W]=O8(0),z=w$(()=>{Z.clear(),Z.loadFromStandardLocations(),L((R)=>R+1)}),b=o6(()=>{return Z.getAllSubagents()},[q]),N=Math.ceil(b.length/qQ)||1,A=o6(()=>{let R=O*qQ;return b.slice(R,R+qQ)},[b,O]);l3(()=>{let R=Math.max(0,N-1);if(O>R)W(R)},[N,O]);let T=w$(()=>{if(O<N-1)W((R)=>R+1)}),_=w$(()=>{if(O>0)W((R)=>R-1)}),f=[{key:"list",label:"查看所有 Agents",value:"list"},{key:"create",label:"创建新 Agent",value:"create"},{key:"edit",label:"编辑 Agent",value:"edit"},{key:"delete",label:"删除 Agent",value:"delete"},{key:"cancel",label:"取消",value:"cancel"}],P=w$((R)=>{if(R.value==="cancel"){J?.();return}K(R.value)}),w=w$((R)=>{if(G(R.value),X==="edit")K("editWizard");else if(X==="delete")K("deleteConfirm")}),C=w$(async()=>{if(!U?.configPath)return;try{await x3.promises.unlink(U.configPath),z(),B()}catch(R){console.error("删除失败:",R)}}),B=w$(()=>{K("menu"),G(null)}),y=S0(!1,J);if(u3((R,H)=>{if(H.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")W(0),B();else if(X==="deleteConfirm")B()}else if(H.ctrl&&R==="c"||H.meta&&R==="c")y();else if(X==="list"){if(H.leftArrow||R==="h")_();else if(H.rightArrow||R==="l")T()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(UQ,{items:f,onSelect:P},void 0,!1,void 0,this),i(I0,{marginTop:1,children:i(v0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="list"){if(b.length===0)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:[i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),i(v0,{color:"gray",children:[" (共 ",b.length," 个)"]},void 0,!0,void 0,this),N>1&&i(v0,{color:"yellow",children:[" ","第 ",O+1,"/",N," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A.map((R)=>i(I0,{flexDirection:"column",paddingLeft:2,children:[i(I0,{children:i(v0,{children:[i(v0,{bold:!0,color:R.color||"white",children:["• ",R.name]},void 0,!0,void 0,this),i(v0,{color:"gray",children:[" - ",R.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.tools&&R.tools.length>0&&i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:["工具: ",R.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R.configPath&&i(I0,{paddingLeft:2,children:i(v0,{color:"gray",dimColor:!0,children:R.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R.name,!0,void 0,this)),i(I0,{marginTop:1,paddingLeft:2,children:N>1?i(v0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let I=(R)=>{if(b.length===0)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let H=b.map((k)=>({key:k.name,label:`${k.name} - ${k.description}`,value:k}));return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(UQ,{items:H,onSelect:w},void 0,!1,void 0,this),i(I0,{marginTop:1,children:i(v0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(X==="create")return i(B2,{onComplete:()=>{z(),B()},onCancel:B},void 0,!1,void 0,this);if(X==="edit")return I("编辑 Agent");if(X==="editWizard"&&U){let R={name:U.name,description:U.description,tools:U.tools||[],color:U.color,location:U.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:U.systemPrompt||""};return i(B2,{initialConfig:R,onComplete:()=>{z(),B()},onCancel:B},void 0,!1,void 0,this)}if(X==="delete")return I("删除 Agent");if(X==="deleteConfirm"&&U)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{children:["你确定要删除 Agent"," ",i(v0,{bold:!0,color:"yellow",children:U.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:["文件路径: ",U.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(UQ,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(R)=>{if(R.value==="confirm")C();else B()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as l$,Text as O0}from"ink";import r3,{useEffect as a3,useState as o3}from"react";import{useEffect as d3,useState as n6}from"react";function e6($=d0(),Q=5000){let[Y,J]=n6(null),[Z,X]=n6(!0);return d3(()=>{let K=!0,U=async()=>{try{let q=await t6($);if(!K)return;if(!q){J(null),X(!1);return}let L=await s6($);if(!K)return;J(L)}catch{if(K)J(null)}finally{if(K)X(!1)}};U();let G=null;if(Q>0)G=setInterval(U,Q);return()=>{if(K=!1,G)clearInterval(G)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as s,Fragment as B1}from"react/jsx-dev-runtime";var Q9=r3.memo(()=>{let $=j2(),Q=h$(),J=D2()==="shortcuts",Z=V4(),X=T1(),{branch:K}=e6(X),U=h2(),G=I4(),q=b4(),L=m2(),O=p2(),W=c2(),z=x2(),b=u2(),N=A4(),A=P4(),T=g2(),_=x4(),f=j$(),[P,w]=o3(null);a3(()=>{let H=!1;new OQ(X,f).get().then((n)=>{if(!H)w(n)}).catch(()=>{if(!H)w(null)});let E=OQ.subscribe((n)=>{if(!H&&n.sessionId===f&&n.workspaceRoot===X)w(n.goal)});return()=>{H=!0,E()}},[f,X]);let C=U?K8(U):!1,y=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return s(O0,{color:"magenta",children:[">> ","auto edit on ",s(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return s(O0,{color:"cyan",children:["‖ plan mode on ",s(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return s(O0,{color:"red",children:["yolo mode on ",s(O0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),I=y!==null,R=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return s(l$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?s(l$,{flexDirection:"column",gap:0,children:R.map((H,k)=>s(l$,{flexDirection:"row",children:[H.map((E,n)=>{let[d,a]=E.split(":");return s(l$,{flexDirection:"row",width:20,children:[s(O0,{color:"yellow",children:d},void 0,!1,void 0,this),s(O0,{color:"gray",children:":"},void 0,!1,void 0,this),s(O0,{color:"white",children:a},void 0,!1,void 0,this)]},n,!0,void 0,this)}),k===R.length-1&&s(O0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},k,!0,void 0,this))},void 0,!1,void 0,this):s(l$,{flexDirection:"row",gap:1,children:[K&&s(B1,{children:[s(O0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y,I&&s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),P&&s(B1,{children:[s(O0,{color:P.status==="active"?"green":P.status==="verifying"?"cyan":P.status==="blocked"||P.status==="budget_limited"?"yellow":"gray",children:["goal:",P.status," ",P.objective.slice(0,32),P.prematureStop?` recovery:${P.prematureStop.consecutiveCount}`:""]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(l$,{flexDirection:"row",gap:1,children:!$?s(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):s(B1,{children:[C&&s(B1,{children:[L?s(O0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):s(O0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&s(B1,{children:[s(O0,{color:W==="fast"?"yellow":"gray",children:["Speed ",W]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&s(B1,{children:[s(O0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b!=="auto"&&s(B1,{children:[s(O0,{color:"gray",children:["Style ",b]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&s(O0,{color:"gray",children:U.model},void 0,!1,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?s(O0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):s(O0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:A===void 0?"gray":"cyan",children:["Cache ",$9(A)]},void 0,!0,void 0,this),N>0.001&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"green",children:["$",N<0.01?N.toFixed(4):N.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T.length>0&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"yellow",children:["已排队 ",T.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_>0&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"cyan",children:["已恢复 ",_," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&s(B1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"yellow",children:"再按一次 Ctrl+C 退出"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as zQ,Text as _Q}from"ink";import i3 from"react";import{jsxDEV as d$}from"react/jsx-dev-runtime";var J9=i3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),K=Q>=$.length;if(Q>=J&&!K)Z=Q-J+1,X=Q+1;let U=$.slice(Z,X),G=$.length>J;return d$(zQ,{flexDirection:"column",paddingX:2,paddingY:0,children:[U.map((q,L)=>{let W=Z+L===Q;return d$(zQ,{flexDirection:"row",paddingX:1,gap:2,children:[d$(_Q,{color:W?"cyan":"white",bold:W,children:q.command},void 0,!1,void 0,this),d$(_Q,{color:W?"cyan":"gray",dimColor:!W,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),G&&d$(zQ,{paddingX:1,children:d$(_Q,{color:K?"cyan":"gray",bold:K,dimColor:!K,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as F1,Text as f1,useInput as iZ,useStdout as nZ}from"ink";import tZ from"ink-select-input";import hQ,{useMemo as V9}from"react";import{Box as z0,Text as M0}from"ink";import A$,{useEffect as VQ,useMemo as b$,useRef as S9}from"react";import{Box as RQ,Text as F9}from"ink";import qZ from"react";import{Text as w1}from"ink";import KZ from"react";import z9 from"string-width";import w2 from"string-width";function NQ({onlyFirst:$=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",$?void 0:"g")}var n3=NQ();function FQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(n3,"")}var Y9=($=0)=>(Q)=>`\x1B[${Q+$}m`,Z9=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,X9=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,h0={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},xU=Object.keys(h0.modifier),t3=Object.keys(h0.color),s3=Object.keys(h0.bgColor),uU=[...t3,...s3];function e3(){let $=new Map;for(let[Q,Y]of Object.entries(h0)){for(let[J,Z]of Object.entries(Y))h0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=h0[J],$.set(Z[0],Z[1]);Object.defineProperty(h0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(h0,"codes",{value:$,enumerable:!1}),h0.color.close="\x1B[39m",h0.bgColor.close="\x1B[49m",h0.color.ansi=Y9(),h0.color.ansi256=Z9(),h0.color.ansi16m=X9(),h0.bgColor.ansi=Y9(10),h0.bgColor.ansi256=Z9(10),h0.bgColor.ansi16m=X9(10),Object.defineProperties(h0,{rgbToAnsi256:{value(Q,Y,J){if(Q===Y&&Y===J){if(Q<8)return 16;if(Q>248)return 231;return Math.round((Q-8)/247*24)+232}return 16+36*Math.round(Q/255*5)+6*Math.round(Y/255*5)+Math.round(J/255*5)},enumerable:!1},hexToRgb:{value(Q){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(Q.toString(16));if(!Y)return[0,0,0];let[J]=Y;if(J.length===3)J=[...J].map((X)=>X+X).join("");let Z=Number.parseInt(J,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(Q)=>h0.rgbToAnsi256(...h0.hexToRgb(Q)),enumerable:!1},ansi256ToAnsi:{value(Q){if(Q<8)return 30+Q;if(Q<16)return 90+(Q-8);let Y,J,Z;if(Q>=232)Y=((Q-232)*10+8)/255,J=Y,Z=Y;else{Q-=16;let U=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(U/6)/5,Z=U%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let K=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)K+=60;return K},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>h0.ansi256ToAnsi(h0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>h0.ansi256ToAnsi(h0.hexToAnsi256(Q)),enumerable:!1}}),h0}var $Z=e3(),K9=$Z;var _8=new Set(["\x1B",""]),QZ=39,HQ="\x07",q9="[",JZ="]",O9="m",z8=`${JZ}8;;`,G9=($)=>`${_8.values().next().value}${q9}${$}${O9}`,U9=($)=>`${_8.values().next().value}${z8}${$}${HQ}`,YZ=($)=>$.split(" ").map((Q)=>w2(Q)),WQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,K=w2(FQ($.at(-1)));for(let[U,G]of J.entries()){let q=w2(G);if(K+q<=Y)$[$.length-1]+=G;else $.push(G),K=0;if(_8.has(G))Z=!0,X=J.slice(U+1,U+1+z8.length).join("")===z8;if(Z){if(X){if(G===HQ)Z=!1,X=!1}else if(G===O9)Z=!1;continue}if(K+=q,K===Y&&U<J.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},ZZ=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(w2(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},XZ=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,K=YZ($),U=[""];for(let[O,W]of $.split(" ").entries()){if(Y.trim!==!1)U[U.length-1]=U.at(-1).trimStart();let z=w2(U.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))U.push(""),z=0;if(z>0||Y.trim===!1)U[U.length-1]+=" ",z++}if(Y.hard&&K[O]>Q){let b=Q-z,N=1+Math.floor((K[O]-b-1)/Q);if(Math.floor((K[O]-1)/Q)<N)U.push("");WQ(U,W,Q);continue}if(z+K[O]>Q&&z>0&&K[O]>0){if(Y.wordWrap===!1&&z<Q){WQ(U,W,Q);continue}U.push("")}if(z+K[O]>Q&&Y.wordWrap===!1){WQ(U,W,Q);continue}U[U.length-1]+=W}if(Y.trim!==!1)U=U.map((O)=>ZZ(O));let G=U.join(`
|
|
119
119
|
`),q=[...G],L=0;for(let[O,W]of q.entries()){if(J+=W,_8.has(W)){let{groups:b}=new RegExp(`(?:\\${q9}(?<code>\\d+)m|\\${z8}(?<uri>.*)${HQ})`).exec(G.slice(L))||{groups:{}};if(b.code!==void 0){let N=Number.parseFloat(b.code);Z=N===QZ?void 0:N}else if(b.uri!==void 0)X=b.uri.length===0?void 0:b.uri}let z=K9.codes.get(Number(Z));if(q[O+1]===`
|
|
120
120
|
`){if(X)J+=U9("");if(Z&&z)J+=G9(z)}else if(W===`
|
|
121
121
|
`){if(Z&&z)J+=G9(Z);if(X)J+=U9(X)}L+=W.length}return J};function LQ($,Q,Y){return String($).normalize().replaceAll(`\r
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as a,g as i,h as l,i as m}from"./chunk-54va5hc4.js";import"./chunk-1zkwxaa0.js";import"./chunk-h4d37zt2.js";import"./chunk-k3ddw7q3.js";import"./chunk-6ra5d8ng.js";import"./chunk-fhxy024n.js";import"./chunk-21bb1xda.js";import"./chunk-fx19tpcm.js";import"./chunk-22s3r2xy.js";import"./chunk-8zpsw401.js";import"./chunk-fbgzeb3m.js";import"./chunk-1ykz47d9.js";import"./chunk-qyxbee3w.js";import"./chunk-r297pq3s.js";import{zd as n}from"./chunk-shx5e10e.js";import"./chunk-2m4mgw58.js";import{Vd as s}from"./chunk-ytce7gnt.js";import"./chunk-v508x7cg.js";import"./chunk-xkz9ecdx.js";import"./chunk-rjgfy07e.js";import"./chunk-2faga011.js";import"./chunk-xbj18hxh.js";import"./chunk-y67yrm3k.js";import"./chunk-74wb5e1h.js";import"./chunk-kaf6m50a.js";import"./chunk-0cbpjhq7.js";import"./chunk-rc7jnds2.js";import"./chunk-7kf3hwp3.js";import"./chunk-03947xkg.js";import"./chunk-465tgzab.js";import"./chunk-qp8mejbn.js";import"./chunk-c03xn5s3.js";import"./chunk-yjbq4jeg.js";import"./chunk-22aaybx2.js";import"./chunk-qtt17d5s.js";import"./chunk-2qqmmxqf.js";import"./chunk-gbrwzpyg.js";import"./chunk-bj5msq36.js";import"./chunk-453tf6d0.js";import"./chunk-yz80dp1a.js";import"./chunk-p7ww2tcn.js";import"./chunk-qw5j84ny.js";import"./chunk-99nevk7k.js";import v from"chalk";var C={command:"serve",describe:"Start a headless Blade server (no browser)",builder:a,handler:async(p)=>{let r=i(p);if(await s(),!process.env.BLADE_SERVER_PASSWORD)console.log(v.yellow("Warning: BLADE_SERVER_PASSWORD is not set; server is unsecured."));let e=await m.listenAsync(r);if(console.log(`Blade server listening on http://${e.hostname}:${e.port}`),r.hostname==="0.0.0.0"){let o=l();for(let g of o)console.log(` Network: http://${g}:${e.port}`)}let t,c=new Promise((o)=>{t=o}),d=n(async()=>{await e.stop(),t()});try{await c}finally{d(),await e.stop()}}};export{C as serveCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{$c as
|
|
1
|
+
import{$c as u,ad as I1,bd as O$,cd as v1,dd as I,ed as N$,fd as u1,gd as U$,hd as P1,id as F$,jd as R$,ld as g0,od as x$,pd as h1}from"./chunk-r297pq3s.js";import{re as H0}from"./chunk-xbj18hxh.js";import{af as K0}from"./chunk-0cbpjhq7.js";import{mf as V1}from"./chunk-03947xkg.js";import{Ag as m1,zg as j1}from"./chunk-yjbq4jeg.js";import{Fg as v$}from"./chunk-22aaybx2.js";import{fh as D0}from"./chunk-2qqmmxqf.js";import{mh as Y0,ph as W0}from"./chunk-bj5msq36.js";import{th as i}from"./chunk-453tf6d0.js";import{Dh as k1,Eh as B0,Fh as S1,Gh as b,Hh as m,Jh as V0,Kh as p,Lh as G0}from"./chunk-qw5j84ny.js";import{readdir as H$,readFile as s,rm as q0,stat as y0}from"node:fs/promises";import*as H from"node:path";import{nanoid as j}from"nanoid";import{createHash as e1,randomUUID as $q}from"node:crypto";import*as v from"node:fs/promises";import*as F0 from"node:path";import{execFileSync as d1}from"node:child_process";import{createHash as r1}from"node:crypto";import{readFileSync as o1}from"node:fs";var t1=/^[a-f0-9]{64}$/;function k$($){if(!$||typeof $!=="object")return!1;let q=$;return(q.platform==="linux"||q.platform==="darwin"||q.platform==="win32")&&typeof q.fingerprint==="string"&&t1.test(q.fingerprint)}var S$={readFile:($)=>o1($,"utf8"),execFile:($,q)=>d1($,q,{encoding:"utf8",timeout:$==="powershell.exe"?3000:2000,windowsHide:!0})},a1=($)=>{try{return process.kill($,0),!0}catch(q){return q instanceof Error&&"code"in q&&q.code==="EPERM"}};function l0($,q){return{platform:$,fingerprint:r1("sha256").update(`${$}\x00${q}`).digest("hex")}}function s1($,q){let L=q.readFile(`/proc/${$}/stat`).trim(),f=L.lastIndexOf(")");if(f<0)throw Error("Invalid /proc process stat");let B=L.slice(f+2).split(/\s+/)[19];if(!B||!/^\d+$/.test(B))throw Error("Missing process start ticks");return B}function N0($,q=process.platform,L=S$){if(!Number.isInteger($)||$<=1)return;try{if(q==="linux")return l0(q,s1($,L));if(q==="darwin"){let f=L.execFile("ps",["-o","lstart=","-p",String($)]).trim();return f?l0(q,f):void 0}if(q==="win32"){let f=`(Get-CimInstance Win32_Process -Filter "ProcessId = ${$}").CreationDate.ToUniversalTime().ToString('O')`,J=L.execFile("powershell.exe",["-NoProfile","-NonInteractive","-Command",f]).trim();return J?l0(q,J):void 0}}catch{return}return}function j$($,q){return N0($,q.platform)?.fingerprint===q.fingerprint}function wL($,q,L=S$,f=a1){if(!Number.isInteger($)||$<=1)return!1;let J=N0($,q.platform,L);if(J)return J.fingerprint===q.fingerprint;return!f($)}var u$=1;function qq($,q){let L=e1("sha256").update(q).digest("hex");return F0.join(B0($),".locks",`${L}.lock`)}function U0($,q){return $ instanceof Error&&"code"in $&&$.code===q}async function p0($){try{let q=JSON.parse(await v.readFile($,"utf8"));if(q.version!==u$||typeof q.sessionId!=="string"||typeof q.ownerId!=="string"||!Number.isInteger(q.pid)||(q.pid??0)<=0||q.processIdentity!==void 0&&!k$(q.processIdentity)||typeof q.acquiredAt!=="string")return;return q}catch{return}}async function m$($){let q=await p0($);if(q)return q;return await new Promise((L)=>setTimeout(L,10)),p0($)}function Lq($){try{return process.kill($,0),!0}catch(q){return U0(q,"EPERM")}}async function I$($,q){let L;try{return L=await v.open($,"wx",384),await L.writeFile(`${JSON.stringify(q)}
|
|
2
2
|
`,"utf8"),!0}catch(f){if(U0(f,"EEXIST"))return!1;if(L)await v.unlink($).catch(()=>{return});throw f}finally{await L?.close().catch(()=>{return})}}class h extends Error{code="BLADE_SESSION_IN_USE";constructor($){super($?`Session is already active in another Blade process (PID ${$}). Stop that process or choose a different session.`:"Session is already active in another Blade process. Stop that process or choose a different session.");this.name="SessionInUseError"}}class c{filePath;record;released=!1;constructor($,q){this.filePath=$;this.record=q}static async acquire($,q=v$()){let L=qq(q,$),f={version:u$,sessionId:$,ownerId:$q(),pid:process.pid,processIdentity:N0(process.pid),acquiredAt:new Date().toISOString()};if(await v.mkdir(F0.dirname(L),{recursive:!0,mode:448}),await I$(L,f))return new c(L,f);let J=await m$(L);if(J&&Lq(J.pid)&&(!J.processIdentity||j$(J.pid,J.processIdentity)))throw new h(J.pid);if(await v.unlink(L).catch((B)=>{if(!U0(B,"ENOENT"))throw B}),await I$(L,f))return new c(L,f);throw new h((await m$(L))?.pid)}async release(){if(this.released)return;if(this.released=!0,(await p0(this.filePath))?.ownerId!==this.record.ownerId)return;await v.unlink(this.filePath).catch((q)=>{if(!U0(q,"ENOENT"))throw q})}}var mL=1;function i0($){return $!==null&&typeof $==="object"&&!Array.isArray($)}function fq($){if(!i0($)||typeof $.type!=="string")return!1;if($.type==="text")return typeof $.text==="string";return $.type==="image_url"&&i0($.image_url)&&typeof $.image_url.url==="string"}function Bq($){if(!i0($))return!1;if(!["system","user","assistant","tool"].includes(String($.role)))return!1;return typeof $.content==="string"||Array.isArray($.content)&&$.content.every(fq)}function P$($){if(!Array.isArray($)||$.length===0||$.length>4096)return;let q=JSON.stringify($);if(Buffer.byteLength(q)>16777216)return;let L=JSON.parse(q);if(!Array.isArray(L)||!L.every(Bq))return;return L}function IL($){let q=P$($);if(!q)throw Error("Compaction replacement context is invalid or exceeds limits");return q}function R0($){return P$($)}function Jq($,q){for(let L of $){if(L.type!=="part_created"||L.data.partType!=="tool_result")continue;let f=L.data.payload;if(!f||typeof f!=="object"||Array.isArray(f))continue;let J=f;if(J.toolCallId===q||L.data.partId===q||L.data.messageId===q)return J}return}function h$($){let q=u($),L=new Map;for(let f of q){if(f.type==="interaction_requested"){L.set(f.data.requestId,{request:f.data,hasToolResult:!1,hasRecoveryToolResult:!1});continue}if(f.type==="interaction_responded"){let J=L.get(f.data.requestId);if(J)J.response=f.data;continue}if(f.type==="interaction_recovered"){let J=L.get(f.data.requestId);if(J)J.recovery=f.data}}for(let f of L.values()){let J=Jq(q,f.request.toolCallId);f.hasToolResult=J!==void 0;let B=J?.metadata&&typeof J.metadata==="object"?J.metadata:void 0;f.hasRecoveryToolResult=B?.interactionRecovery===!0&&B.requestId===f.request.requestId}return[...L.values()]}function c$($){return h$($).reverse().find((q)=>!q.response&&!q.recovery)}function PL($){let q=new Map;for(let L of h$($))q.set(L.request.toolCallId,L);return[...q.values()].filter((L)=>L.response&&!L.recovery&&(!L.hasToolResult||L.hasRecoveryToolResult))}function n$($){if(!$)return;return{type:$.request.interactionType,requestId:$.request.requestId}}function x0($){let q=new Map,L=[];for(let f of $){if(f.type==="review_started"){if(!q.has(f.data.reviewId))L.push(f.data.reviewId),q.set(f.data.reviewId,{start:f.data});continue}if(f.type!=="review_completed")continue;let J=q.get(f.data.reviewId);if(J&&J.completion===void 0)J.completion=f.data}return L.map((f)=>q.get(f)).filter((f)=>f!==void 0)}function cL($){return x0($).reverse().find((q)=>q.completion===void 0)}function d0($){switch($){case"completed":return"completed";case"stale":return"stale: the review target changed while the reviewer was running";case"aborted":return"aborted";case"interrupted":return"interrupted by process restart";case"failed":return"failed"}}function l$($,q){let L=["## Code Review","",`Target: ${$.target.label}`,`Status: ${d0(q.status)}`,"",q.overallExplanation||"No overall explanation was provided."];if(q.findings.length===0)L.push("","No actionable findings.");else{L.push("","### Findings");for(let[f,J]of q.findings.entries()){let B=J.codeLocation.lineStart===J.codeLocation.lineEnd?`${J.codeLocation.lineStart}`:`${J.codeLocation.lineStart}-${J.codeLocation.lineEnd}`;L.push("",`${f+1}. ${J.title}`,` ${J.codeLocation.path}:L${B} · confidence ${J.confidenceScore.toFixed(2)}`,` ${J.body}`)}}if(q.error)L.push("",`Error: ${q.error}`);return L.join(`
|
|
3
3
|
`)}function p$($,q){return{reviewId:$.reviewId,phase:"completed",status:q.status,target:{kind:$.target.kind,label:$.target.label,...$.target.baseSha?{reference:$.target.baseSha}:{},...$.target.commitSha?{reference:$.target.commitSha}:{}},overallExplanation:q.overallExplanation,findings:q.findings.map((L)=>({title:L.title,body:L.body,priority:L.priority,confidenceScore:L.confidenceScore,codeLocation:{...L.codeLocation}})),...q.error?{error:q.error}:{}}}var a0=1;var r0=2000,Zq='<token-budget-handoff version="1">',pL="handoff-message-",Cq=128,Gq=["version","messageId","observedPromptTokens","availableForInput","handoffThreshold","compactionThreshold","createdAt"],Qq=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/,Vq=/(?:^|\n)Remaining prompt-token headroom before compaction: (\d+)\.$/;function n($){return typeof $==="number"&&Number.isSafeInteger($)&&$>=0}function s0($){return n($)&&$>0}function Xq($){for(let q=0;q<$.length;q+=1){let L=$.charCodeAt(q);if(L<=31||L===127)return!0}return!1}function i$($){return typeof $==="string"&&$.length>=1&&$.length<=Cq&&!Xq($)}function o0($){if(!$||typeof $!=="object"||Array.isArray($))return!1;let q=Object.getPrototypeOf($);return q===Object.prototype||q===null}function T0($,q){let L=Math.floor($/10),f=$%10;return L*q+Math.floor(f*q/10)}function Yq($){if(typeof $!=="string"||!Qq.test($))return!1;try{let q=new Date($);return Number.isFinite(q.getTime())&&q.toISOString()===$}catch{return!1}}function d$($){if(!n($))throw Error("Token budget handoff headroom must be a safe nonnegative integer");return[Zq,"Context rollover is approaching. Continue the user task from this state only.","Make objective, decisions, mutations, verification, background work, blockers, and the exact next action explicit.","For pending work, preserve exact commands, tool arguments, and required final-response constraints when they are known.","Do not claim success or completion unless it is already proven in the transcript.","Do not create bookkeeping files the user did not request.",`Remaining prompt-token headroom before compaction: ${$}.`].join(`
|
|
4
4
|
`)}function Wq($){let q=d$($);if(new TextEncoder().encode(q).length>r0)throw Error(`Token budget handoff reminder exceeds ${r0} bytes`);return q}function t0($,q){let L=Object.keys($).sort(),f=[...q].sort();return L.length===f.length&&L.every((J,B)=>J===f[B])}function iL($){let{maxContextTokens:q,maxOutputTokens:L,configuredMaxOutputTokens:f}=$,J=L??f??void 0;if(J!==void 0)return J;if(!s0(q))return;return Math.min(Math.max(Math.floor(q*0.1),8192),32768)}function dL($){let{actualPromptTokens:q,maxContextTokens:L,maxOutputTokens:f}=$;if(!s0(L)||!n(f)||f>=L)return{phase:"unknown"};let J=L-f;if(J<=0)return{phase:"unknown"};let B=T0(J,7),Z=T0(J,8);if(!n(q))return{phase:"unknown",maxContextTokens:L,maxOutputTokens:f,availableForInput:J,handoffThreshold:B,compactionThreshold:Z};if(q<B)return{phase:"below_handoff",actualPromptTokens:q,maxContextTokens:L,maxOutputTokens:f,availableForInput:J,handoffThreshold:B,compactionThreshold:Z};if(q<Z)return{phase:"handoff_band",actualPromptTokens:q,maxContextTokens:L,maxOutputTokens:f,availableForInput:J,handoffThreshold:B,compactionThreshold:Z};return{phase:"compaction_due",actualPromptTokens:q,maxContextTokens:L,maxOutputTokens:f,availableForInput:J,handoffThreshold:B,compactionThreshold:Z}}function r$($){if($.type!=="token_budget_handoff_recorded"||!o0($.data))return;let q=$.data;if(!t0(q,Gq)||q.version!==a0||!i$(q.messageId)||!n(q.observedPromptTokens)||!s0(q.availableForInput)||!n(q.handoffThreshold)||!n(q.compactionThreshold)||!Yq(q.createdAt))return;let L=T0(q.availableForInput,7),f=T0(q.availableForInput,8);if(q.handoffThreshold!==L||q.compactionThreshold!==f||q.observedPromptTokens<q.handoffThreshold||q.observedPromptTokens>=q.compactionThreshold)return;return $}function Hq($){return $.type==="token_budget_handoff_recorded"}function o$($){let q=$.findLastIndex((B)=>{if(B.type!=="part_created"||B.data.partType!=="summary")return!1;let Z=B.data.payload;return Z!==null&&typeof Z==="object"&&!Array.isArray(Z)&&R0(Z.replacementMessages)!==void 0}),L=$.slice(q+1).filter(Hq);if(L.length===0)return{kind:"none"};let f=L.at(-1);if(!f)return{kind:"none"};if(L.length!==1)return{kind:"suppressed",recordId:f.id};let J=r$(f);return J?{kind:"valid",event:J}:{kind:"suppressed",recordId:f.id}}function t$($){let q=r$($);if(!q)return;let L={clientVisible:!1,tokenBudgetHandoff:{version:a0,messageId:q.data.messageId}};return{id:q.data.messageId,role:"user",content:Wq(Math.max(0,q.data.compactionThreshold-q.data.observedPromptTokens)),metadata:L}}function Kq($){if(typeof $.id!=="string"||$.role!=="user"||typeof $.content!=="string"||!o0($.metadata)||$.metadata.clientVisible!==!1)return!1;let q=$.metadata;if(!t0(q,["clientVisible","tokenBudgetHandoff"]))return!1;let L=q.tokenBudgetHandoff;if(!o0(L))return!1;if(!t0(L,["messageId","version"]))return!1;if(L.version!==a0||!i$(L.messageId)||L.messageId!==$.id)return!1;if(new TextEncoder().encode($.content).length>r0)return!1;let J=Vq.exec($.content);if(!J)return!1;let B=Number(J[1]);return n(B)&&$.content===d$(B)}function rL($){return $.filter((q)=>!Kq(q))}var e0={authentication:{message:"Provider authentication failed. Check model credentials.",retryable:!1},permission:{message:"Provider rejected this request. Check account and model permissions.",retryable:!1},rate_limit:{message:"Provider rate limit or quota exceeded.",retryable:!0},timeout:{message:"Provider request timed out.",retryable:!0},network:{message:"Provider connection failed.",retryable:!0},model_unavailable:{message:"The selected model is unavailable.",retryable:!0},context_limit:{message:"The request exceeded the model context limit.",retryable:!1},unsupported_input:{message:"The selected model does not support this input.",retryable:!1},capacity:{message:"Task admission capacity is full. Retry after running tasks complete.",retryable:!0},runtime:{message:"Agent execution failed.",retryable:!0}};function _q($){try{if($ instanceof Error)return $.message;if($!==null&&typeof $==="object"&&"message"in $&&typeof $.message==="string")return $.message;return String($)}catch{return"Unknown error"}}function Oq($){let q=$.toLowerCase();if(/\b(401|unauthorized|authentication|invalid (?:api[ _-]?)?key|api[ _-]?key|credential)\b/.test(q))return"authentication";if(/\b(403|forbidden|permission denied|not permitted)\b/.test(q))return"permission";if(/\b(429|rate limit|too many requests|quota)\b/.test(q))return"rate_limit";if(/\b(timeout|timed out|deadline exceeded|etimedout)\b/.test(q))return"timeout";if(/\b(econnreset|econnrefused|enotfound|network|socket|connection)\b/.test(q))return"network";if(/\b(model not found|model unavailable|unsupported model|no such model)\b/.test(q))return"model_unavailable";if(/\b(context (?:length|window)|maximum context|too many tokens|token limit)\b/.test(q))return"context_limit";if(/\b(image|vision|multimodal|unsupported input|does not support)\b/.test(q))return"unsupported_input";if(/\btask admission\b.*\b(capacity|queue)\b/.test(q))return"capacity";return"runtime"}function Nq($){try{if(!$||typeof $!=="object"||!("name"in $)||$.name!=="TaskAdmissionQueueFullError"&&$.name!=="SessionRuntimeCapacityError"||!("resource"in $))return;return $.resource==="pending_count"||$.resource==="pending_bytes"||$.resource==="resident_runtimes"?$.resource:void 0}catch{return}}function a$($){return{code:$,...e0[$]}}function $$($){let q=Nq($);if(q)return{...a$("capacity"),resource:q};return a$(Oq(_q($)))}function q$($){if(!$||typeof $!=="object")return!1;let q=$;if(typeof q.code!=="string"||!(q.code in e0))return!1;let L=e0[q.code],f=q.resource===void 0||q.resource==="pending_count"||q.resource==="pending_bytes"||q.resource==="resident_runtimes";return q.message===L.message&&q.retryable===L.retryable&&f&&(q.code==="capacity"||q.resource===void 0)}import{promises as J0,realpathSync as Fq}from"node:fs";import z0 from"node:path";import*as o from"fs/promises";import*as x from"path";var s$=[".git",".claude","node_modules",".env",".env.local",".env.production",".env.development",".env.test"];class r extends Error{code;constructor($,q){super($);this.code=q;this.name="PathSecurityError"}}class L${static normalize($,q){let L=x.isAbsolute($)?$:x.resolve(q,$),f=x.normalize(L),J=x.normalize(q);if(!this.isWithinWorkspace(f,J))throw new r(`Path outside workspace: ${$} (resolved to ${f}, workspace: ${J})`,"PATH_OUTSIDE_WORKSPACE");return f}static checkRestricted($){let q=$.split(x.sep);for(let L of s$)if(q.includes(L))throw new r(`Access denied: "${L}" is a protected directory`,"RESTRICTED_PATH")}static checkTraversal($){if($.includes(".."))throw new r(`Path traversal not allowed: ${$}`,"PATH_TRAVERSAL")}static async validatePath($,q){this.checkTraversal($);let L=this.normalize($,q);this.checkRestricted(L);try{await o.access(L)}catch(f){throw new r(`Path not found: ${$}`,"PATH_NOT_FOUND")}return L}static async resolveSymlink($,q){try{let L=await o.realpath($),f=await o.realpath(q);if(!this.isWithinWorkspace(L,f))throw new r(`Symlink points outside workspace: ${$} -> ${L}`,"SYMLINK_OUTSIDE_WORKSPACE");return L}catch(L){if(L instanceof r)throw L;return $}}static getRelativePath($,q){return x.relative(q,$)}static isWithinWorkspace($,q){let L=x.resolve($),f=x.resolve(q),J=x.relative(f,L);return J===""||J!==".."&&!J.startsWith(`..${x.sep}`)&&!x.isAbsolute(J)}static async isWithinWorkspaceResolved($,q){let L=x.resolve(q),f=x.isAbsolute($)?x.resolve($):x.resolve(L,$);if(!this.isWithinWorkspace(f,L))return!1;let J;try{J=await o.realpath(L)}catch{return!1}let B=f;while(!0){try{let C=await o.realpath(B);return this.isWithinWorkspace(C,J)}catch(C){let Q=C.code;if(Q!=="ENOENT"&&Q!=="ENOTDIR")return!1}let Z=x.dirname(B);if(Z===B)return!1;B=Z}}static isRestricted($){let q=$.split(x.sep);return s$.some((L)=>q.includes(L))}}var Z0=D0("Tool");class l{static instance=null;accessedFiles=new Map;pathAliases=new Map;constructor(){}static getInstance(){if(!l.instance)l.instance=new l;return l.instance}async recordFileRead($,q){try{let L=await J0.stat($),f={filePath:z0.resolve($),accessTime:Date.now(),mtime:L.mtimeMs,sessionId:q,lastOperation:"read"};this.setRecord(f),await this.recordAliases($,f.filePath),Z0.debug(`记录文件读取: ${$}`)}catch(L){Z0.warn(`记录文件读取失败: ${$}`,L)}}async recordFileEdit($,q,L="edit"){try{let f=await J0.stat($),J={filePath:z0.resolve($),accessTime:Date.now(),mtime:f.mtimeMs,sessionId:q,lastOperation:L};this.setRecord(J),await this.recordAliases($,J.filePath),Z0.debug(`记录文件${L==="edit"?"编辑":"写入"}: ${$}`)}catch(f){Z0.warn(`记录文件${L==="edit"?"编辑":"写入"}失败: ${$}`,f)}}hasFileBeenRead($,q){let L=this.accessedFiles.get(this.resolveTrackedPath($));if(!L)return!1;return q?L.has(q):L.size>0}async checkFileModification($,q){let L=this.getFileRecord($,q);if(!L)return{modified:!1,message:"文件未被跟踪"};try{let f=await J0.stat($);if(Math.abs(f.mtimeMs-L.mtime)>1)return{modified:!0,message:`文件在访问后被修改(访问时间: ${new Date(L.accessTime).toISOString()}, 当前修改时间: ${f.mtime.toISOString()})`};return{modified:!1}}catch(f){let J=f;if(J.code==="ENOENT")return{modified:!0,message:"文件已被删除"};return{modified:!1,message:`无法检查文件状态: ${J.message}`}}}async checkExternalModification($,q){let L=this.getFileRecord($,q);if(!L)return{isExternal:!1,message:"文件未被跟踪"};try{let f=await J0.stat($);if(f.mtimeMs-L.mtime>2000)return{isExternal:!0,message:`文件在 ${new Date(L.accessTime).toISOString()} (${L.lastOperation}) 之后被外部程序修改(当前修改时间: ${f.mtime.toISOString()})`};return{isExternal:!1}}catch(f){let J=f;if(J.code==="ENOENT")return{isExternal:!0,message:"文件已被删除"};return Z0.warn(`检查文件外部修改失败: ${$}`,f),{isExternal:!1,message:`无法检查文件状态: ${J.message}`}}}getFileRecord($,q){let L=this.accessedFiles.get(this.resolveTrackedPath($));if(!L)return;if(q)return L.get(q);return[...L.values()].sort((f,J)=>J.accessTime-f.accessTime)[0]}getTrackedRecords(){return[...this.accessedFiles.values()].flatMap(($)=>[...$.values()])}clearFileRecord($,q){let L=this.resolveTrackedPath($);if(!q){this.accessedFiles.delete(L),this.removeAliases(L);return}let f=this.accessedFiles.get(L);if(f?.delete(q),f?.size===0)this.accessedFiles.delete(L),this.removeAliases(L)}clearAll(){this.accessedFiles.clear(),this.pathAliases.clear()}clearSession($,q){for(let[L,f]of this.accessedFiles.entries()){if(q&&!L$.isWithinWorkspace(L,q))continue;if(f.delete($),f.size===0)this.accessedFiles.delete(L),this.removeAliases(L)}}getTrackedFiles(){return Array.from(this.accessedFiles.keys())}getTrackedFileCount(){return this.accessedFiles.size}static resetInstance(){l.instance=null}setRecord($){let q=this.accessedFiles.get($.filePath);if(!q)q=new Map,this.accessedFiles.set($.filePath,q);q.set($.sessionId,$)}async recordAliases($,q){this.pathAliases.set(z0.resolve($),q);let L=await J0.realpath($).catch(()=>{return});if(L)this.pathAliases.set(L,q)}resolveTrackedPath($){let q=z0.resolve($);if(this.accessedFiles.has(q))return q;let L=this.pathAliases.get(q);if(L)return L;try{let f=Fq.native(q);return this.pathAliases.get(f)??f}catch{return q}}removeAliases($){for(let[q,L]of this.pathAliases)if(L===$)this.pathAliases.delete(q)}}import*as C0 from"node:crypto";import{promises as _}from"node:fs";import*as N from"node:path";import f$ from"write-file-atomic";var e$="missing";class A0{sessionId;workspaceRoot;enableCheckpoints;maxSnapshots;snapshotDir;manifestPath;trackedFileBackups=new Map;snapshots=[];constructor($){if(b($.sessionId),this.sessionId=$.sessionId,$.workspaceRoot&&!N.isAbsolute($.workspaceRoot))throw Error("Snapshot workspace root must be absolute");this.workspaceRoot=$.workspaceRoot?N.resolve($.workspaceRoot):void 0,this.enableCheckpoints=$.enableCheckpoints??!0,this.maxSnapshots=$.maxSnapshots??10;let q=G0();this.snapshotDir=N.join(q,"file-history",this.sessionId),this.manifestPath=N.join(this.snapshotDir,"manifest.json")}async initialize(){if(!this.enableCheckpoints)return;if(this.workspaceRoot)await this.selectWorkspaceSnapshotDir();await _.mkdir(this.snapshotDir,{recursive:!0,mode:493}),await this.loadManifest()}async selectWorkspaceSnapshotDir(){let $=G0(),q=await _.realpath(this.workspaceRoot).catch(()=>this.workspaceRoot),L=C0.createHash("sha256").update(q).digest("hex").slice(0,24),f=N.join($,"file-history",this.sessionId),J=N.join($,"file-history","workspaces",L,this.sessionId),B=N.join(J,"manifest.json");try{await _.access(B)}catch{await this.migrateLegacySnapshotDir(f,J,q)}this.snapshotDir=J,this.manifestPath=B}async migrateLegacySnapshotDir($,q,L){let f;try{f=JSON.parse(await _.readFile(N.join($,"manifest.json"),"utf8"))}catch{return}if(f.schemaVersion!==1||!Array.isArray(f.snapshots)||!f.snapshots.every((J)=>this.isWithinWorkspace(J.filePath,L)))return;await _.mkdir(N.dirname(q),{recursive:!0,mode:493});try{await _.rename($,q)}catch(J){let B=J.code;if(B!=="ENOENT"&&B!=="EEXIST"&&B!=="ENOTEMPTY")throw J}}isWithinWorkspace($,q){if(!N.isAbsolute($))return!1;let L=N.relative(q,N.resolve($));return L===""||L!==".."&&!L.startsWith(`..${N.sep}`)&&!N.isAbsolute(L)}async createSnapshot($,q){if(!this.enableCheckpoints)return{backupFileName:"",version:0,backupTime:new Date};let L=await this.resolveFileIdentity($),f=!0;try{await _.access(L)}catch{f=!1}let J=this.trackedFileBackups.get(L),B=J?J.version+1:1,Z=this.generateFileHash(L,B),C=this.getSnapshotPath(Z,B),Q=new Date;if(f){let Y=await _.readFile(L);await _.writeFile(C,Y)}let X={backupFileName:Z,version:B,backupTime:Q};return this.trackedFileBackups.set(L,X),this.snapshots.push({messageId:q,backupFileName:Z,timestamp:Q,filePath:L,version:B,existedBefore:f}),await this.cleanupOldSnapshots(L),await this.persistManifest(),X}async recordPostEditState($,q){if(!this.enableCheckpoints||!q.backupFileName)return;let L=await this.resolveFileIdentity($),f=this.snapshots.find((J)=>J.filePath===L&&J.backupFileName===q.backupFileName&&J.version===q.version);if(!f)throw Error(`未找到待完成的快照: ${L}`);f.postEditHash=await this.hashFile(L),await this.persistManifest()}async discardSnapshot($,q){if(!this.enableCheckpoints||!q.backupFileName)return;let L=await this.resolveFileIdentity($),f=this.snapshots.find((J)=>J.filePath===L&&J.backupFileName===q.backupFileName&&J.version===q.version);if(!f)return;this.removeSnapshot(f),await _.rm(this.getSnapshotPath(f.backupFileName,f.version),{force:!0}),await this.persistManifest()}async rewindLatest($){let q=await this.resolveFileIdentity($),L=this.snapshots.slice().reverse().find((B)=>B.filePath===q&&B.postEditHash!==void 0);if(!L?.postEditHash)throw Error(`未找到可回退快照: ${q}`);if(await this.hashFile(q)!==L.postEditHash)throw Error(`文件在 Blade 编辑后已被修改,拒绝覆盖: ${q}`);let J=this.getSnapshotPath(L.backupFileName,L.version);if(L.existedBefore){let B=await _.readFile(J);await _.mkdir(N.dirname(q),{recursive:!0}),await _.writeFile(q,B)}else await _.rm(q,{force:!0});return this.removeSnapshot(L),await _.rm(J,{force:!0}),await this.persistManifest(),L}async restoreSnapshot($,q){let L=await this.resolveFileIdentity($),f=this.snapshots.slice().reverse().find((B)=>B.messageId===q&&B.filePath===L);if(!f)throw Error(`未找到快照: messageId=${q}, filePath=${L}`);let J=this.getSnapshotPath(f.backupFileName,f.version);if(f.existedBefore){let B=await _.readFile(J);await _.mkdir(N.dirname(L),{recursive:!0}),await _.writeFile(L,B)}else await _.rm(L,{force:!0})}async listSnapshots($){let q=await this.resolveFileIdentity($);return this.snapshots.filter((L)=>L.filePath===q)}async listAllSnapshots(){return this.snapshots.filter(($)=>$.postEditHash!==void 0)}async previewRewind($){let q=this.buildRewindPlan($);return{files:q.map((L)=>L.filePath),snapshotCount:q.reduce((L,f)=>L+f.selected.length,0)}}async rewindSnapshots($){let q=this.buildRewindPlan($);if(q.length===0)return{files:[],snapshotCount:0};let L=new Map;for(let J of q){let B,Z=!0;try{B=await _.readFile(J.filePath)}catch(Q){if(Q.code!=="ENOENT")throw Q;Z=!1}if((B?C0.createHash("sha256").update(B).digest("hex"):e$)!==J.latest.postEditHash)throw Error(`文件在 Blade 编辑后已被修改,拒绝覆盖: ${J.filePath}`);if(L.set(J.filePath,{existed:Z,content:B}),J.target.existedBefore)await _.access(this.getSnapshotPath(J.target.backupFileName,J.target.version))}let f=[...this.snapshots];try{for(let B of q)if(B.target.existedBefore){let Z=await _.readFile(this.getSnapshotPath(B.target.backupFileName,B.target.version));await _.mkdir(N.dirname(B.filePath),{recursive:!0}),await f$(B.filePath,Z)}else await _.rm(B.filePath,{force:!0});let J=new Set(q.flatMap((B)=>B.selected));this.snapshots=this.snapshots.filter((B)=>!J.has(B)),this.rebuildTrackedFileBackups(),await this.persistManifest(),await Promise.all([...J].map((B)=>_.rm(this.getSnapshotPath(B.backupFileName,B.version),{force:!0}).catch(()=>{return})))}catch(J){this.snapshots=f,this.rebuildTrackedFileBackups();let B=[];for(let[Z,C]of L)try{if(C.existed&&C.content)await f$(Z,C.content);else await _.rm(Z,{force:!0})}catch(Q){B.push(Q)}if(B.length>0)throw AggregateError([J,...B],"快照回退失败且无法完整恢复回退前状态");throw J}return{files:q.map((J)=>J.filePath),snapshotCount:q.reduce((J,B)=>J+B.selected.length,0)}}async commitSnapshots($){let q=this.buildRewindPlan($),L=new Set(q.flatMap((J)=>J.selected));if(L.size===0)return{files:[],snapshotCount:0};let f=[...this.snapshots];this.snapshots=this.snapshots.filter((J)=>!L.has(J)),this.rebuildTrackedFileBackups();try{await this.persistManifest()}catch(J){throw this.snapshots=f,this.rebuildTrackedFileBackups(),J}return await Promise.all([...L].map((J)=>_.rm(this.getSnapshotPath(J.backupFileName,J.version),{force:!0}).catch(()=>{return}))),{files:q.map((J)=>J.filePath),snapshotCount:L.size}}buildRewindPlan($){let q=new Set($),L=this.snapshots.filter((B)=>B.postEditHash!==void 0),f=L.filter((B)=>q.has(B.messageId));return[...new Set(f.map((B)=>B.filePath))].sort().map((B)=>{let Z=L.filter((Y)=>Y.filePath===B),C=Z.filter((Y)=>q.has(Y.messageId)),Q=Z.indexOf(C[0]),X=Z.slice(Q);if(X.length!==C.length||X.some((Y)=>!q.has(Y.messageId)))throw Error(`请求的快照不是文件历史的连续后缀: ${B}`);return{filePath:B,selected:C,target:C[0],latest:C.at(-1)}})}async loadManifest(){try{let $=await _.readFile(this.manifestPath,"utf-8"),q=JSON.parse($);if(q.schemaVersion!==1||!Array.isArray(q.snapshots))throw Error("Unsupported snapshot manifest");this.snapshots=await Promise.all(q.snapshots.map(async(L)=>({...L,filePath:await this.resolveFileIdentity(L.filePath),timestamp:new Date(L.timestamp)}))),this.rebuildTrackedFileBackups()}catch($){if($.code!=="ENOENT")throw $;this.snapshots=[],this.trackedFileBackups.clear()}}async persistManifest(){if(this.snapshots.length===0){await _.rm(this.manifestPath,{force:!0});return}let $={schemaVersion:1,snapshots:this.snapshots.map((q)=>({...q,timestamp:q.timestamp.toISOString()}))};await f$(this.manifestPath,JSON.stringify($,null,2),{encoding:"utf-8",mode:384})}async cleanupOldSnapshots($){let L=this.snapshots.filter((f)=>f.filePath===$).slice(0,-this.maxSnapshots);for(let f of L)await _.rm(this.getSnapshotPath(f.backupFileName,f.version),{force:!0}),this.removeSnapshot(f)}async cleanup($=0){let q=this.snapshots.slice().sort((f,J)=>J.timestamp.getTime()-f.timestamp.getTime()),L=new Set(q.slice(0,$));for(let f of this.snapshots)if(!L.has(f))await _.rm(this.getSnapshotPath(f.backupFileName,f.version),{force:!0});this.snapshots=q.slice(0,$).reverse(),this.rebuildTrackedFileBackups(),await this.persistManifest()}getSnapshotPath($,q){return N.join(this.snapshotDir,`${$}@v${q}`)}async resolveFileIdentity($){let q=N.resolve($),L=[],f=q;while(!0){try{let B=await _.realpath(f);return N.join(B,...L.reverse())}catch(B){let Z=B.code;if(Z!=="ENOENT"&&Z!=="ENOTDIR")throw B}let J=N.dirname(f);if(J===f)return q;L.push(N.basename(f)),f=J}}async hashFile($){try{let q=await _.readFile($);return C0.createHash("sha256").update(q).digest("hex")}catch(q){if(q.code==="ENOENT")return e$;throw q}}removeSnapshot($){let q=this.snapshots.indexOf($);if(q>=0)this.snapshots.splice(q,1);this.rebuildTrackedFileBackups()}rebuildTrackedFileBackups(){this.trackedFileBackups.clear();for(let $ of this.snapshots){let q=this.trackedFileBackups.get($.filePath);if(!q||q.version<$.version)this.trackedFileBackups.set($.filePath,{backupFileName:$.backupFileName,version:$.version,backupTime:$.timestamp})}}generateFileHash($,q){let L=C0.createHash("md5");return L.update(`${$}:${q}`),L.digest("hex").substring(0,16)}getSnapshotDir(){return this.snapshotDir}getSessionId(){return this.sessionId}getTrackedFileCount(){return this.trackedFileBackups.size}getSnapshotCount(){return this.snapshots.length}}var Q2=1200,V2=2000,X2=2000,Y2=2000;function q1($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function Rq($){if(typeof $==="string"&&$.length>0)return $;if(q1($)&&typeof $.message==="string")return $.message;return}function xq($,q){if($===null||$===void 0)return q??"";if(typeof $==="string")return $;if(typeof $==="object")return $;return String($)}function L1($){let q=$.error!==null&&$.error!==void 0,L=q?Rq($.error)??"Tool execution failed":void 0,f=q1($.metadata)?$.metadata:void 0;return{success:!q,llmContent:xq($.output,L),...L?{error:{type:"execution_error",message:L}}:{},...f?{metadata:f}:{}}}function J$($,q){if($.length<=q)return $;let L=Math.max(0,q);if(L>0&&L<$.length&&/[\uD800-\uDBFF]/.test($.charAt(L-1)))L-=1;return $.slice(0,L)}function $1($,q){if($.length<=q)return $;let L=Math.max(0,$.length-q);if(L<$.length&&/[\uDC00-\uDFFF]/.test($.charAt(L)))L+=1;return $.slice(L)}function B$($,q){if($.length<=q)return $;if(q<=0)return"";let L=`
|
|
@@ -109,4 +109,4 @@ ${[...e,...$0].join(`
|
|
|
109
109
|
s.project_sort_key ASC,
|
|
110
110
|
s.session_sort_key ASC
|
|
111
111
|
LIMIT ?`).all(...J,$.limit+1),Z=await Promise.all(B.map(async(Q)=>{let X=JSON.parse(Q.metadata_json);if(Q.archive_root_id&&Q.effective_archived_at)return this.reconcileInterruptedTask({...X,archivedAt:Q.effective_archived_at,archivedBySessionId:Q.archive_root_id});let{archivedAt:Y,archivedBySessionId:G,...V}=X;return this.reconcileInterruptedTask(V)})),C=R$(Z,$);return{sessions:C.sessions.map((Q)=>this.toPublicMetadata(Q)),nextCursor:C.nextCursor}}catch{return null}}static async listSessions($={}){let q=U$($),L=P1($),f=await this.scanStoredSessions(q.cwd??void 0,q.includeSubagents,0,q.archived,L),J=new Set;return f.sort(F$).flatMap((B)=>{let Z=`${B.projectPath}\x00${B.sessionId}`;if(J.has(Z))return[];return J.add(Z),[this.toPublicMetadata(B)]})}static async collectStaleEmptySessions($={}){let q=$.now??Date.now(),L=$.olderThanMs??fL;if(!Number.isFinite(L)||L<0)throw Error("Stale empty session age must be a non-negative number");let f=$.projectPath?[{storagePath:B0(this.resolveCatalogWorkspace($.projectPath)),projectPath:this.resolveCatalogWorkspace($.projectPath)}]:await this.listAllProjectStorageDirectories(),J=0;for(let B of f){let Z;try{Z=await H$(B.storagePath)}catch(C){if(C.code==="ENOENT")continue;throw C}for(let C of Z){if(!C.endsWith(".jsonl"))continue;let Q=C.slice(0,-6);if(!S1(Q))continue;let X=H.join(B.storagePath,C);try{let G=await y0(X);if(q-G.mtimeMs<L)continue;if(await Promise.all([y0(H.join(B.storagePath,`${Q}.inbox.json`)).then(()=>!0).catch(()=>!1),y0(V0(B.projectPath,Q)).then(()=>!0).catch(()=>!1)]).then((W)=>W.some(Boolean)))continue}catch(G){if(G.code==="ENOENT")continue;throw G}let Y;try{Y=await c.acquire(Q,B.projectPath)}catch(G){if(G instanceof h)continue;throw G}try{if(!await new I(X).deleteValidated((V)=>V.length===1&&V[0]?.type==="session_created"&&V[0].data.relationType!=="subagent"))continue;J++,await q0(H.join(B.storagePath,`${Q}.inbox.json`),{force:!0}),await q0(V0(B.projectPath,Q),{force:!0}),await this.removeFromProjection(Q,B.projectPath)}catch(G){Q0.warn(`[SessionService] Skipping stale empty session cleanup: ${Q}`,G)}finally{await Y.release()}}}return J}static async findSessionMetadata($,q){if(b($),q!==void 0){if(!H.isAbsolute(q))throw Error("Session catalog cwd must be absolute");let f=H.resolve(q),J=this.getSessionFilePath(f,$);try{let B=await this.readStoredSessionMetadata(J,$,f);if(B.projectPath!==f)return;if(!B.parentId||B.archivedAt)return this.toPublicMetadata(_$([B],null)[0]??B);let Z=await this.scanStoredSessions(f,!0,0,null);return this.toPublicMetadata(Z.find((C)=>C.sessionId===$)??B)}catch(B){if(B.code==="ENOENT")return;throw B}}let L=(await this.scanStoredSessions(void 0,!0,0,null)).filter((f)=>f.sessionId===$);if(L.length===0)return;if(L.length>1)throw Error(`Ambiguous session ID: ${$}`);return this.toPublicMetadata(L[0])}static async loadSession($,q){try{if(q){if(!H.isAbsolute(q))throw Error("Session catalog cwd must be absolute");let f=H.resolve(q),J=this.getSessionFilePath(f,$);try{return await this.loadSessionFromFile(J,$,f)}catch(B){if(B.code==="ENOENT")throw Error(`未找到会话: ${$}`);throw B}}let L=(await this.scanStoredSessions(void 0,!0,0,null)).find((f)=>f.sessionId===$);if(!L)throw Error(`未找到会话: ${$}`);return await this.loadSessionFromFile(L.filePath,$)}catch(L){throw Q0.error(`[SessionService] 加载会话失败 (${$}):`,L),L}}static async loadSessionModelContext($,q){try{if(q){if(!H.isAbsolute(q))throw Error("Session catalog cwd must be absolute");let f=H.resolve(q),J=this.getSessionFilePath(f,$);try{return await this.loadSessionModelContextFromFile(J,$,f)}catch(B){if(B.code==="ENOENT")throw Error(`未找到会话: ${$}`);throw B}}let L=(await this.scanStoredSessions(void 0,!0,0,null)).find((f)=>f.sessionId===$);if(!L)throw Error(`未找到会话: ${$}`);return await this.loadSessionModelContextFromFile(L.filePath,$)}catch(L){throw Q0.error(`[SessionService] 加载模型上下文失败 (${$}):`,L),L}}static async exportSessionMarkdown($,q,L={}){b($);let f=this.resolveCatalogWorkspace(q),J=m(f,$),B;try{B=await this.readStableSessionSnapshot(J,$)}catch(Q){throw this.sanitizeStoredSessionError(Q,$)}let Z=this.projectMetadataFromEntries(B,$,f,J);if(Z.projectPath!==f)throw Error(`Session export workspace mismatch: ${$}`);let C=Z.archivedAt;if(!C&&Z.parentId)C=(await this.findArchivedAncestor(Z.parentId,f))?.archivedAt;return K1(B,{...Z,archivedAt:C},L)}static async listRewindCheckpoints($,q){b($);let L=this.resolveCatalogWorkspace(q),f=m(L,$),J=await this.readStableSessionSnapshot(f,$);this.validateSessionWorkspace(J,$,L);let B=new A0({sessionId:$,workspaceRoot:L});await B.initialize();let Z=I1(J),C=[];for(let Q of Z){let X=O$(J,Q.messageId),Y=await B.previewRewind(X.snapshotMessageIds);C.push({...Q,fileCount:Y.files.length})}return C}static async rewindSession($,q,L){b($);let f=this.resolveCatalogWorkspace(q);await this.assertSessionWritable($,f);let J=m(f,$),B=new I(J),Z;try{await B.appendValidatedAsync(async(C)=>{this.validateSessionWorkspace(C,$,f);let Q=O$(C,L.targetMessageId),X=new A0({sessionId:$,workspaceRoot:f});await X.initialize();let Y=await X.previewRewind(Q.snapshotMessageIds),G=L.mode==="conversation"?await X.commitSnapshots(Q.snapshotMessageIds):await X.rewindSnapshots(Q.snapshotMessageIds),V=new Date().toISOString(),W={id:j(),sessionId:$,timestamp:V,type:"session_rewound",cwd:f,gitBranch:p(f),version:i(),data:{rewindId:j(),targetMessageId:L.targetMessageId,mode:L.mode,restoredFiles:L.mode==="conversation"?[]:G.files,createdAt:V}},K=u([...C,W]);return Z={checkpoint:{...Q.checkpoint,fileCount:Y.files.length},mode:L.mode,removedTurns:Q.removedTurns,restoredFiles:W.data.restoredFiles,messages:this.convertJSONLToMessages(K)},W})}catch(C){throw this.sanitizeStoredSessionError(C,$)}if(!Z)throw Error(`Session rewind did not produce a result: ${$}`);for(let C of Z.restoredFiles)l.getInstance().clearFileRecord(C);return Z}static async forkSession($,q){b($);let L=q.newSessionId??`fork-${Date.now()}-${j(8)}`;b(L);let f=this.resolveForkWorkspace(q.sourceProjectPath),J=this.resolveForkWorkspace(q.targetProjectPath);if(f!==J)throw Error("Session forks must stay in the source workspace");let B=m(f,$),Z=await this.readStableSessionSnapshot(B,$),C=this.getSessionCreatedEntry(Z,$);if(C.data.sessionId!==$)throw Error("Fork source session_created.data.sessionId must match the requested session ID");if(!H.isAbsolute(C.cwd)||H.resolve(C.cwd)!==f)throw Error("Fork source session_created.cwd must resolve to the requested source workspace");let Q=this.projectMetadataFromEntries(Z,$,f,B);if(Q.archivedAt)throw new L0($,$);if(Q.parentId){let R=await this.findArchivedAncestor(Q.parentId,f);if(R)throw new L0($,R.sessionId)}let X=u(Z),Y=new Date().toISOString(),G=C.data.rootId||$,V=p(J),W=i(),{status:K,taskStatus:F,taskStatusReason:E,taskFailure:T,taskStartedAt:e,taskCompletedAt:$0,taskOwnerPid:k,taskPromptSummary:S,taskPriority:A,taskKind:D,taskDueAt:w,taskDispatch:O,taskModelId:M,taskRetriedFrom:D$,taskDelivery:A$,taskIsolation:M$,taskSourceProjectPath:m0,taskWorktree:b$,taskDiffStat:w$,taskQueuePosition:E$,taskQueueDepth:g$,taskConcurrencyLimit:y$,pendingInteraction:I0,...v0}=C.data,u0={id:j(),sessionId:L,timestamp:Y,type:"session_created",cwd:J,gitBranch:V,version:W,data:{...v0,sessionId:L,rootId:G,parentId:$,relationType:"fork",taskStatus:"completed",taskCompletedAt:Y,taskIsolation:"local",taskSourceProjectPath:J,createdAt:Y,updatedAt:Y}},P0=X.filter((R)=>R.type!=="session_created"&&R.type!=="token_budget_handoff_recorded"&&R.type!=="inbox_acknowledged"&&R.type!=="interaction_requested"&&R.type!=="interaction_responded"&&R.type!=="interaction_recovered"&&R.type!=="review_started"&&R.type!=="review_completed").map((R)=>{let d={...R,id:j(),sessionId:L,cwd:J,gitBranch:V,version:W};if(R.type==="session_updated"){let{status:O0,taskStatus:z,taskStatusReason:n0,taskFailure:ZL,taskStartedAt:CL,taskCompletedAt:GL,taskOwnerPid:QL,taskPromptSummary:VL,taskPriority:XL,taskKind:YL,taskDueAt:WL,taskDispatch:HL,taskModelId:KL,taskRetriedFrom:_L,taskDelivery:OL,taskIsolation:NL,taskSourceProjectPath:UL,taskWorktree:FL,taskDiffStat:RL,taskQueuePosition:xL,taskQueueDepth:TL,taskConcurrencyLimit:zL,pendingInteraction:DL,...i1}=R.data;return{...d,type:"session_updated",data:{...i1,sessionId:L,rootId:G,parentId:$,relationType:"fork"}}}if(R.type==="message_created"){let{inboxMessageId:O0,...z}=R.data;return{...d,type:"message_created",data:z}}return d}),h0={id:j(),sessionId:L,timestamp:Y,type:"session_updated",cwd:J,gitBranch:V,version:W,data:{sessionId:L,rootId:G,parentId:$,relationType:"fork",taskStatus:"completed",taskStatusReason:null,taskFailure:null,taskStartedAt:null,taskCompletedAt:Y,taskOwnerPid:null,taskIsolation:"local",taskSourceProjectPath:J,taskWorktree:null,taskDiffStat:null,taskDelivery:null,taskQueuePosition:null,taskQueueDepth:null,taskConcurrencyLimit:null,updatedAt:Y}},f0=[u0,...P0,h0],_0=m(J,L);try{await new I(_0).createExclusive(f0)}catch(R){if(R.code==="EEXIST")throw Error(`Fork session already exists: ${L}`,{cause:R});throw R}let c0=this.projectMetadataFromEntries(f0,L,J,_0);return{sessionId:L,parentSessionId:$,projectPath:J,messages:this.convertJSONLToMessages(f0),metadata:this.toPublicMetadata(c0)}}static async deleteSession($,q){if(b($),q){if(!H.isAbsolute(q))throw Error("Session catalog cwd must be absolute");let f=H.resolve(q),J=this.getSessionFilePath(f,$),B=new I(J),Z;try{Z=await B.deleteValidated((C)=>{return this.projectMetadataFromEntries(C,$,f,J).projectPath===f})}catch(C){if(!this.isCorruptSessionJSONLError(C))throw C;Z=await B.delete()}if(!Z)return 0;return await q0(H.join(H.dirname(J),`${$}.inbox.json`),{force:!0}),await q0(V0(f,$),{force:!0}),await this.removeFromProjection($,f),1}let L=(await this.scanStoredSessions(void 0,!0)).filter((f)=>f.sessionId===$);if(L.length===0)return 0;return await Promise.all(L.map(async(f)=>{await new I(f.filePath).delete(),await q0(H.join(H.dirname(f.filePath),`${f.sessionId}.inbox.json`),{force:!0}),await q0(V0(f.projectPath,f.sessionId),{force:!0}),await this.removeFromProjection(f.sessionId,f.projectPath)})),L.length}static async removeFromProjection($,q){try{let L=await g0();if(L)h1(L,$,q)}catch{}}static validateTaskMetadataUpdate($,q){if($.taskPromptSummary!==void 0&&$.taskPromptSummary!==null&&(!$.taskPromptSummary.trim()||$.taskPromptSummary.length>1000))throw Error("Session task prompt summary must contain 1-1000 characters");if($.taskPriority!==void 0&&$.taskPriority!==null&&!S0.has($.taskPriority))throw Error("Invalid session task priority");if($.taskKind!==void 0&&$.taskKind!==null&&!j0.has($.taskKind))throw Error("Invalid session task kind");if($.taskDueAt!==void 0&&$.taskDueAt!==null&&!Number.isFinite(Date.parse($.taskDueAt)))throw Error("Invalid session task due date");if($.taskFailure!==void 0&&$.taskFailure!==null&&!q$($.taskFailure))throw Error("Invalid session task failure");if($.taskDispatch!==void 0&&$.taskDispatch!==null&&!E1($.taskDispatch))throw Error("Invalid durable task dispatch");if($.taskModelId!==void 0&&$.taskModelId!==null&&(!$.taskModelId.trim()||$.taskModelId.length>500))throw Error("Invalid session task model ID");if($.selectedModelId!==void 0&&$.selectedModelId!==null&&(!$.selectedModelId.trim()||$.selectedModelId.length>500))throw Error("Invalid selected session model ID");if($.permissionMode!==void 0&&$.permissionMode!==null&&!k0($.permissionMode))throw Error("Invalid session permission mode");if($.reasoningEffort!==void 0&&$.reasoningEffort!==null&&!H0($.reasoningEffort))throw Error("Invalid session reasoning effort");if($.serviceTier!==void 0&&$.serviceTier!==null&&!W0($.serviceTier))throw Error("Invalid session service tier");if($.responseVerbosity!==void 0&&$.responseVerbosity!==null&&!Y0($.responseVerbosity))throw Error("Invalid session response verbosity");if($.communicationStyle!==void 0&&$.communicationStyle!==null&&!K0($.communicationStyle))throw Error("Invalid session communication style");if($.communicationStyleDigest!==void 0&&$.communicationStyleDigest!==null&&!/^[a-f0-9]{64}$/.test($.communicationStyleDigest))throw Error("Invalid session communication style digest");if($.projectInstructionsDigest!==void 0&&$.projectInstructionsDigest!==null&&!/^[a-f0-9]{64}$/.test($.projectInstructionsDigest))throw Error("Invalid session project instructions digest");if($.taskRetriedFrom!==void 0&&$.taskRetriedFrom!==null&&!g1($.taskRetriedFrom))throw Error("Invalid session task retry source");if($.taskDelivery!==void 0&&$.taskDelivery!==null&&!b1($.taskDelivery))throw Error("Invalid session task delivery");if($.taskIsolation!==void 0&&$.taskIsolation!==null&&!T$.has($.taskIsolation))throw Error(`Invalid session task isolation: ${String($.taskIsolation)}`);if($.taskSourceProjectPath!==void 0&&$.taskSourceProjectPath!==null&&!H.isAbsolute($.taskSourceProjectPath))throw Error("Session task source project path must be absolute");if($.taskWorktree!==void 0&&$.taskWorktree!==null){let L=M1($.taskWorktree);if(!L||L.sessionId!==q||![L.repositoryRoot,L.originalWorkspaceRoot,L.worktreeRoot,L.workspaceRoot].every((f)=>H.isAbsolute(f)))throw Error("Invalid session task worktree metadata")}if($.taskDiffStat!==void 0&&$.taskDiffStat!==null&&!w1($.taskDiffStat))throw Error("Invalid session task diff stat");if($.taskQueuePosition!==void 0&&$.taskQueuePosition!==null&&(!Number.isInteger($.taskQueuePosition)||$.taskQueuePosition<1))throw Error("Invalid session task queue position");if($.taskQueueDepth!==void 0&&$.taskQueueDepth!==null&&(!Number.isInteger($.taskQueueDepth)||$.taskQueueDepth<0))throw Error("Invalid session task queue depth");if($.taskConcurrencyLimit!==void 0&&$.taskConcurrencyLimit!==null&&(!Number.isInteger($.taskConcurrencyLimit)||$.taskConcurrencyLimit<1))throw Error("Invalid session task concurrency limit");if(typeof $.taskQueuePosition==="number"&&typeof $.taskQueueDepth==="number"&&$.taskQueuePosition>$.taskQueueDepth)throw Error("Session task queue position exceeds queue depth")}static async createSessionMetadata($,q,L={}){b($),U.validateTaskMetadataUpdate(L,$);let f=U.resolveCatalogWorkspace(q);if(L.taskWorktree&&H.resolve(L.taskWorktree.workspaceRoot)!==f)throw Error("Session task worktree must match the catalog workspace");let J=new Date().toISOString(),B={id:j(),sessionId:$,timestamp:J,type:"session_created",cwd:f,gitBranch:p(f),version:i(),data:{sessionId:$,rootId:$,...L.title!==void 0?{title:L.title}:{},taskStatus:L.taskStatus??"queued",...L.taskPromptSummary!==void 0?{taskPromptSummary:L.taskPromptSummary}:{},...L.taskPriority!==void 0?{taskPriority:L.taskPriority}:{},...L.taskKind!==void 0?{taskKind:L.taskKind}:{},...typeof L.taskDueAt==="string"?{taskDueAt:new Date(L.taskDueAt).toISOString()}:{},...L.taskDispatch!==void 0?{taskDispatch:L.taskDispatch}:{},...L.taskModelId!==void 0?{taskModelId:L.taskModelId}:{},...L.taskRetriedFrom!==void 0?{taskRetriedFrom:L.taskRetriedFrom}:{},...L.taskIsolation!==void 0?{taskIsolation:L.taskIsolation}:{},...L.taskSourceProjectPath!==void 0?{taskSourceProjectPath:L.taskSourceProjectPath}:{},...L.taskWorktree!==void 0?{taskWorktree:L.taskWorktree}:{},...L.selectedModelId!==void 0?{selectedModelId:L.selectedModelId}:{},...L.permissionMode!==void 0?{permissionMode:L.permissionMode}:{},...L.reasoningEffort!==void 0?{reasoningEffort:L.reasoningEffort}:{},...L.serviceTier!==void 0?{serviceTier:L.serviceTier}:{},...L.responseVerbosity!==void 0?{responseVerbosity:L.responseVerbosity}:{},...L.communicationStyle!==void 0?{communicationStyle:L.communicationStyle}:{},...L.communicationStyleDigest!==void 0?{communicationStyleDigest:L.communicationStyleDigest}:{},...L.projectInstructionsDigest!==void 0?{projectInstructionsDigest:L.projectInstructionsDigest}:{},createdAt:J,updatedAt:J}},Z=U.getSessionFilePath(f,$);return await new I(Z).createExclusive([B]),U.toPublicMetadata(U.projectMetadataFromEntries([B],$,f,Z))}static async assertSessionWritable($,q){let L=await this.findSessionMetadata($,q);if(!L)throw Error(`Session not found: ${$}`);if(L.archivedAt)throw new L0($,L.archivedBySessionId??$);return L}static async findArchivedAncestor($,q){let L=new Set,f=$;while(f){if(L.has(f))throw Error("Session lineage contains a cycle");L.add(f),b(f);let J=m(q,f),B;try{B=await s(J,"utf8")}catch(C){if(C.code==="ENOENT")return;throw C}let Z=this.projectMetadataFromEntries(this.parseStoredSession(B,f),f,q,J);if(Z.projectPath!==q)throw Error("Session lineage escapes the requested workspace");if(Z.archivedAt)return{sessionId:Z.sessionId,archivedAt:Z.archivedAt};f=Z.parentId}return}static async listSessionArchiveMembers($,q){b($);let L=this.resolveCatalogWorkspace(q),f=await this.scanStoredSessions(L,!0,0,null);if(!f.some((Z)=>Z.sessionId===$))throw Error(`Session not found: ${$}`);let J=new Set([$]),B=!0;while(B){B=!1;for(let Z of f)if(Z.parentId&&J.has(Z.parentId)&&!J.has(Z.sessionId))J.add(Z.sessionId),B=!0}return f.filter((Z)=>J.has(Z.sessionId)).sort((Z,C)=>Z.sessionId.localeCompare(C.sessionId)).map((Z)=>this.toPublicMetadata(Z))}static async archiveSession($,q){b($);let L=this.resolveCatalogWorkspace(q),f=await this.findSessionMetadata($,L);if(!f)throw Error(`Session not found: ${$}`);if(f.archivedAt)return f;let J=await this.listSessionArchiveMembers($,L),B=J.find((C)=>C.taskStatus==="queued"||C.taskStatus==="running");if(B)throw new P(`Stop session ${B.sessionId} before archiving this session tree`);let Z=[];try{for(let Y of J)Z.push(await c.acquire(Y.sessionId,L));let C=m(L,$),Q=new I(C),X=[];return await Q.appendValidated((Y)=>{let G=this.projectMetadataFromEntries(Y,$,L,C);if(G.archivedAt)throw new P(`Session archive state changed concurrently: ${$}`);if(G.taskStatus==="queued"||G.taskStatus==="running")throw new P(`Stop session ${$} before archiving it`);let V=new Date().toISOString(),W={id:j(),sessionId:$,timestamp:V,type:"session_updated",cwd:L,gitBranch:p(L),version:i(),data:{sessionId:$,archivedAt:V,updatedAt:V}};return X=[...Y,W],W}),this.toPublicMetadata({...this.projectMetadataFromEntries(X,$,L,C),archivedBySessionId:$})}catch(C){if(C instanceof P)throw C;if(C instanceof h)throw new P(C.message);throw this.sanitizeStoredSessionError(C,$)}finally{for(let C of Z.reverse())await C.release()}}static async unarchiveSession($,q){b($);let L=this.resolveCatalogWorkspace(q),f=await this.findSessionMetadata($,L);if(!f)throw Error(`Session not found: ${$}`);if(!f.archivedAt)return f;if(f.archivedBySessionId&&f.archivedBySessionId!==$)throw new P(`Unarchive ancestor ${f.archivedBySessionId} to restore session ${$}`);let J;try{J=await c.acquire($,L);let B=m(L,$),Z=new I(B),C=[];return await Z.appendValidated((Q)=>{if(!this.projectMetadataFromEntries(Q,$,L,B).archivedAt)throw new P(`Session archive state changed concurrently: ${$}`);let Y=new Date().toISOString(),G={id:j(),sessionId:$,timestamp:Y,type:"session_updated",cwd:L,gitBranch:p(L),version:i(),data:{sessionId:$,archivedAt:null,updatedAt:Y}};return C=[...Q,G],G}),this.toPublicMetadata(this.projectMetadataFromEntries(C,$,L,B))}catch(B){if(B instanceof P)throw B;if(B instanceof h)throw new P(B.message);throw this.sanitizeStoredSessionError(B,$)}finally{await J?.release()}}static async updateSessionMetadata($,q,L){if(b($),U.validateTaskMetadataUpdate(L,$),L.taskStatus!==void 0&&!D1.has(L.taskStatus))throw Error(`Invalid session task status: ${String(L.taskStatus)}`);if(L.taskOwnerPid!==void 0&&L.taskOwnerPid!==null&&(!Number.isInteger(L.taskOwnerPid)||L.taskOwnerPid<=0))throw Error("Session task owner PID must be a positive integer");let f=U.resolveCatalogWorkspace(q);if(L.taskWorktree&&H.resolve(L.taskWorktree.workspaceRoot)!==f)throw Error("Session task worktree must match the catalog workspace");let J=U.getSessionFilePath(f,$),B=new I(J),Z=[];try{await B.appendValidatedAsync(async(C)=>{let Q=U.getSessionCreatedEntry(C,$);if(Q.data.sessionId!==$)throw Error(`Session metadata creation record sessionId mismatch: ${$}`);if(!H.isAbsolute(Q.cwd)||H.resolve(Q.cwd)!==f)throw Error(`Session metadata creation record cwd mismatch: ${$}`);let X=U.projectMetadataFromEntries(C,$,f,J);if(X.archivedAt)throw new L0($,$);if(X.parentId){let V=await U.findArchivedAncestor(X.parentId,f);if(V)throw new L0($,V.sessionId)}let Y=new Date().toISOString(),G={id:j(),sessionId:$,timestamp:Y,type:"session_updated",cwd:f,gitBranch:p(f),version:i(),data:{sessionId:$,...L.title!==void 0?{title:L.title}:{},...L.taskStatus!==void 0?{taskStatus:L.taskStatus}:{},...L.taskStatusReason!==void 0?{taskStatusReason:L.taskStatusReason}:{},...L.taskFailure!==void 0?{taskFailure:L.taskFailure}:{},...L.taskStartedAt!==void 0?{taskStartedAt:L.taskStartedAt}:{},...L.taskCompletedAt!==void 0?{taskCompletedAt:L.taskCompletedAt}:{},...L.taskOwnerPid!==void 0?{taskOwnerPid:L.taskOwnerPid}:{},...L.taskPromptSummary!==void 0?{taskPromptSummary:L.taskPromptSummary}:{},...L.taskPriority!==void 0?{taskPriority:L.taskPriority}:{},...L.taskKind!==void 0?{taskKind:L.taskKind}:{},...L.taskDueAt!==void 0?{taskDueAt:L.taskDueAt===null?null:new Date(L.taskDueAt).toISOString()}:{},...L.taskDispatch!==void 0?{taskDispatch:L.taskDispatch}:{},...L.taskModelId!==void 0?{taskModelId:L.taskModelId}:{},...L.taskRetriedFrom!==void 0?{taskRetriedFrom:L.taskRetriedFrom}:{},...L.taskDelivery!==void 0?{taskDelivery:L.taskDelivery}:{},...L.taskIsolation!==void 0?{taskIsolation:L.taskIsolation}:{},...L.taskSourceProjectPath!==void 0?{taskSourceProjectPath:L.taskSourceProjectPath}:{},...L.taskWorktree!==void 0?{taskWorktree:L.taskWorktree}:{},...L.taskDiffStat!==void 0?{taskDiffStat:L.taskDiffStat}:{},...L.taskQueuePosition!==void 0?{taskQueuePosition:L.taskQueuePosition}:{},...L.taskQueueDepth!==void 0?{taskQueueDepth:L.taskQueueDepth}:{},...L.taskConcurrencyLimit!==void 0?{taskConcurrencyLimit:L.taskConcurrencyLimit}:{},...L.selectedModelId!==void 0?{selectedModelId:L.selectedModelId}:{},...L.permissionMode!==void 0?{permissionMode:L.permissionMode}:{},...L.reasoningEffort!==void 0?{reasoningEffort:L.reasoningEffort}:{},...L.serviceTier!==void 0?{serviceTier:L.serviceTier}:{},...L.responseVerbosity!==void 0?{responseVerbosity:L.responseVerbosity}:{},...L.communicationStyle!==void 0?{communicationStyle:L.communicationStyle}:{},...L.communicationStyleDigest!==void 0?{communicationStyleDigest:L.communicationStyleDigest}:{},...L.projectInstructionsDigest!==void 0?{projectInstructionsDigest:L.projectInstructionsDigest}:{},updatedAt:Y}};return Z=[...C,G],G})}catch(C){throw U.sanitizeStoredSessionError(C,$)}return U.toPublicMetadata(U.projectMetadataFromEntries(Z,$,f,J))}static async setSessionPermissionMode($,q,L){if(b($),!k0(L))throw Error("Invalid session permission mode");let f=U.resolveCatalogWorkspace(q),J=await U.findSessionMetadata($,f);if(J?.permissionMode===L)return J;if(J)return U.updateSessionMetadata($,f,{permissionMode:L});try{return await U.createSessionMetadata($,f,{taskStatus:"completed",permissionMode:L})}catch(B){if(B.code!=="EEXIST")throw B;return U.updateSessionMetadata($,f,{permissionMode:L})}}static async findSessionTaskWorktree($,q){b($);let L=U.resolveCatalogWorkspace(q),f=U.getSessionFilePath(L,$);try{return(await U.readStoredSessionMetadata(f,$,L)).taskWorktree}catch(J){if(J.code==="ENOENT")return;throw U.sanitizeStoredSessionError(J,$)}}static async findSessionTaskDispatch($,q){b($);let L=U.resolveCatalogWorkspace(q),f=U.getSessionFilePath(L,$);try{return(await U.readStoredSessionMetadata(f,$,L)).taskDispatch}catch(J){if(J.code==="ENOENT")return;throw U.sanitizeStoredSessionError(J,$)}}static async loadSessionFromFile($,q,L){let f=await s($,"utf-8"),J=this.parseStoredSession(f,q);if(L!==void 0){if(this.projectMetadataFromEntries(J,q,L,$).projectPath!==L)throw Error(`未找到会话: ${q}`)}return this.convertJSONLToMessages(J)}static async loadSessionModelContextFromFile($,q,L){let f=await s($,"utf-8"),J=this.parseStoredSession(f,q);if(L!==void 0){if(this.projectMetadataFromEntries(J,q,L,$).projectPath!==L)throw Error(`未找到会话: ${q}`)}return this.convertJSONLToModelContext(J)}static convertJSONLToModelContext($){let q=u($),L=-1,f;for(let B=0;B<q.length;B++){let Z=q[B];if(Z?.type!=="part_created"||Z.data.partType!=="summary")continue;let C=Z.data.payload;if(L=B,f=R0(C.replacementMessages),!f)f=[{role:"user",content:C.text??"",metadata:Z.data.payload}]}if(L<0||!f)return this.convertJSONLToMessages(q,{includeTokenBudgetHandoffs:!0});let J=this.convertJSONLToMessages(q.slice(L+1),{includeTokenBudgetHandoffs:!0});return[...f,...J]}static convertJSONLToMessages($,q={}){let L=[],f=new Map,J=new Map,B=new Map,Z=new Map,C=new Map,Q=u($),X=q.includeTokenBudgetHandoffs?o$(Q):{kind:"none"},Y=new Set;for(let G of Q){if(G.type==="token_budget_handoff_recorded"){if(X.kind==="valid"&&X.event.id===G.id){let V=t$(G);if(V)L.push(V)}continue}if(G.type==="message_created"){let V=G.data.metadata&&typeof G.data.metadata==="object"&&!Array.isArray(G.data.metadata)?G.data.metadata:void 0,W=V?.codeReview&&typeof V.codeReview==="object"&&!Array.isArray(V.codeReview)?V.codeReview:void 0;if(W?.phase==="completed"&&typeof W.reviewId==="string")Y.add(W.reviewId);let K=G.data.role==="assistant"&&G.data.parentMessageId?B.get(G.data.parentMessageId):void 0,F=K??{role:G.data.role,content:"",...G.data.metadata||G.data.inboxMessageId?{metadata:{...G.data.metadata&&typeof G.data.metadata==="object"&&!Array.isArray(G.data.metadata)?G.data.metadata:{},...G.data.inboxMessageId?{inboxMessageId:G.data.inboxMessageId}:{}}}:{}};if(f.set(G.data.messageId,F),J.set(G.data.messageId,[]),!K)L.push(F)}if(G.type==="part_created"){if(G.data.partType==="reasoning"){let V=f.get(G.data.messageId);if(V){let W=G.data.payload;V.reasoningContent=(V.reasoningContent??"")+(W.text??"")}}if(G.data.partType==="text"){let V=f.get(G.data.messageId);if(V){let W=G.data.payload,K=J.get(G.data.messageId);if(K)K.push({type:"text",text:W.text??""}),V.content=y1(K);else V.content=W.text??""}}if(G.data.partType==="image"){let V=f.get(G.data.messageId);if(V){let W=G.data.payload,K=J.get(G.data.messageId);if(K&&W.dataUrl)K.push({type:"image_url",image_url:{url:W.dataUrl}}),V.content=y1(K)}}if(G.data.partType==="tool_call"){let V=f.get(G.data.messageId);if(V?.role!=="assistant"){if(V=B.get(G.data.messageId),!V)V={role:"assistant",content:"",tool_calls:[]},B.set(G.data.messageId,V),L.push(V)}if(V.role==="assistant"){let W=G.data.payload,K=W.toolCallId??G.data.partId;Z.set(G.data.partId,K),C.set(K,V),V.tool_calls??=[],V.tool_calls.push({id:K,type:"function",function:{name:W.toolName??"unknown",arguments:JSON.stringify(W.input??{})}})}}if(G.data.partType==="tool_result"){let V=G.data.payload,W=L1(V),K=W.error?`Error: ${W.error.message}`:typeof W.llmContent==="string"?W.llmContent:JSON.stringify(W.llmContent),F=V;L.push({role:"tool",content:K,tool_call_id:Z.get(G.data.messageId)??V.toolCallId,name:V.toolName,metadata:F})}if(G.data.partType==="summary"){let V=G.data.payload,W=G.data.payload;L.push({role:"system",content:V.text??"",metadata:W})}if(G.data.partType==="subtask_ref"){let V=f.get(G.data.messageId)??C.get(G.data.messageId);if(V){let W=G.data.payload,K=V.metadata??{};V.metadata={...K,subtaskRef:W}}}}}for(let G of x0(Q)){if(G.completion===void 0||Y.has(G.start.reviewId))continue;L.push({role:"assistant",content:l$(G.start,G.completion),metadata:{codeReview:{...p$(G.start,G.completion),synthetic:!0}}})}return L}static projectionDeriver(){return($,q,L)=>{try{let f=m(L,q);return this.projectMetadataFromEntries($,q,L,f)}catch{return null}}}static projectionDeriverForSearch(){return this.projectionDeriver()}static async scanStoredSessionsFromProjection($,q,L=0,f=!1,J={}){try{let B=await g0();if(!B)return null;await x$(B,this.projectionDeriver(),L);let Z=[],C=[];if($!==void 0)Z.push("project_path=?"),C.push($);eq(J,"",Z,C);let Q=Z.length>0?` WHERE ${Z.join(" AND ")}`:"",X=B.prepare(`SELECT metadata_json, is_subagent FROM sessions${Q}`).all(...C),Y=[];for(let V of X){if(!q&&V.is_subagent===1)continue;try{let W=JSON.parse(V.metadata_json);if($!==void 0&&W.projectPath!==$)continue;Y.push(W)}catch{}}let G=await Promise.all(Y.map((V)=>this.reconcileInterruptedTask(V)));return _$(G.filter((V)=>c1(V,J)),f)}catch{return null}}static async scanStoredSessions($,q=!1,L=0,f=!1,J={}){let B=$?H.resolve($):void 0,Z=await this.scanStoredSessionsFromProjection(B,q,L,f,J);if(Z)return Z;let C=B?[{storagePath:B0(B),projectPath:B}]:await this.listAllProjectStorageDirectories(),Q=[];for(let X of C){let Y;try{Y=await H$(X.storagePath)}catch(G){if(G.code==="ENOENT")continue;throw G}for(let G of Y){if(!G.endsWith(".jsonl"))continue;let V=G.slice(0,-6),W=H.join(X.storagePath,G);try{let K=await this.readStoredSessionMetadata(W,V,X.projectPath);if(B!==void 0&&K.projectPath!==B){Q0.warn(`[SessionService] Skipping out-of-scope session transcript: ${V}`);continue}if(!q&&K.relationType==="subagent")continue;if(!$L(K,J))continue;Q.push(K)}catch(K){let F=K.code;if(F==="ENOENT")continue;if(F)throw K;Q0.warn(`[SessionService] Skipping invalid session transcript: ${V}`)}}}return _$(Q,f)}static async listAllProjectStorageDirectories(){let $=H.join(G0(),"projects"),q;try{q=await H$($,{withFileTypes:!0,encoding:"utf8"})}catch(L){if(L.code==="ENOENT")return[];throw L}return q.filter((L)=>L.isDirectory()).map((L)=>({storagePath:H.join($,L.name),projectPath:k1(L.name)}))}static async readStoredSessionMetadata($,q,L){let f=await s($,"utf-8"),J=this.parseStoredSession(f,q);return this.reconcileInterruptedTask(this.projectMetadataFromEntries(J,q,L,$))}static async reconcileInterruptedTask($){let q=$.taskOwnerPid;if($.taskStatus!=="running"||q===void 0||A1(q))return $;let L;try{L=await c.acquire($.sessionId,$.projectPath)}catch(B){if(!(B instanceof h))throw B;let Z=await s($.filePath,"utf-8");return this.projectMetadataFromEntries(this.parseStoredSession(Z,$.sessionId),$.sessionId,$.projectPath,$.filePath)}let f=new I($.filePath),J;try{try{await f.appendValidated((B)=>{let Z=this.projectMetadataFromEntries(B,$.sessionId,$.projectPath,$.filePath);if(Z.taskStatus!=="running"||Z.taskOwnerPid!==q||A1(q))throw new z$;let C=new Date().toISOString(),Q={id:j(),sessionId:$.sessionId,timestamp:C,type:"session_updated",cwd:$.projectPath,gitBranch:p($.projectPath),version:i(),data:{sessionId:$.sessionId,taskStatus:"interrupted",taskStatusReason:"Task owner process exited before completion",taskCompletedAt:C,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null,updatedAt:C}};return J=[...B,Q],Q})}catch(B){if(!(B instanceof z$))throw B}if(!J){let B=await s($.filePath,"utf-8");J=this.parseStoredSession(B,$.sessionId)}return this.projectMetadataFromEntries(J,$.sessionId,$.projectPath,$.filePath)}finally{await L.release()}}static projectMetadataFromEntries($,q,L,f){if($.length===0)throw Error(`Empty session transcript: ${q}`);let J=this.getSessionCreatedEntry($,q),B=$.reduce((z,n0)=>n0.type==="session_updated"?{...z,...n0.data}:z,{...J.data}),Z=u($),C=n$(c$(Z)),X=x0(Z).at(-1),Y=Z.findLastIndex((z)=>z.type==="review_started"&&z.data.reviewId===X?.start.reviewId||z.type==="review_completed"&&z.data.reviewId===X?.start.reviewId),G=Z.findLastIndex((z)=>(z.type==="session_created"||z.type==="session_updated")&&Object.hasOwn(z.data,"taskStatus")),V=X!==void 0&&Y>G,W=V?X.completion===void 0?"running":X.completion.status==="completed"||X.completion.status==="stale"?"completed":X.completion.status==="aborted"?"cancelled":X.completion.status==="interrupted"?"interrupted":"failed":void 0,K=Z.filter((z)=>z.type==="message_created"&&["user","assistant"].includes(z.data.role)).length,F=Z.some((z)=>z.type==="part_created"&&z.data.partType==="tool_result"&&typeof z.data.payload.error==="string"),E=D1.has(B.taskStatus)?B.taskStatus:void 0,T=W??E??(F?"failed":"completed"),e=typeof B.taskOwnerPid==="number"&&Number.isInteger(B.taskOwnerPid)&&B.taskOwnerPid>0?B.taskOwnerPid:void 0,$0=T$.has(B.taskIsolation)?B.taskIsolation:void 0,k=typeof B.taskSourceProjectPath==="string"&&H.isAbsolute(B.taskSourceProjectPath)?H.resolve(B.taskSourceProjectPath):void 0,S=J.cwd;if(S!==void 0&&!H.isAbsolute(S))throw Error(`Session catalog cwd must be absolute: ${q}`);let A=S===void 0?L:H.resolve(S),D=M1(B.taskWorktree),w=D?.sessionId===q&&H.resolve(D.workspaceRoot)===A?D:void 0,O=w1(B.taskDiffStat),M=E1(B.taskDispatch),D$=S0.has(B.taskPriority)?B.taskPriority:M?.taskPriority,A$=j0.has(B.taskKind)?B.taskKind:M?.taskKind,M$=typeof B.taskDueAt==="string"&&Number.isFinite(Date.parse(B.taskDueAt))?new Date(B.taskDueAt).toISOString():M?.taskDueAt,m0=typeof B.taskModelId==="string"&&B.taskModelId.trim()?B.taskModelId:M?.modelId,b$=typeof B.selectedModelId==="string"&&B.selectedModelId.trim()?B.selectedModelId:m0,w$=k0(B.permissionMode)?B.permissionMode:M?.permissionMode,E$=H0(B.reasoningEffort)?B.reasoningEffort:M?.reasoningEffort,g$=W0(B.serviceTier)?B.serviceTier:M?.serviceTier,y$=Y0(B.responseVerbosity)?B.responseVerbosity:M?.responseVerbosity,I0=K0(B.communicationStyle)?B.communicationStyle:M?.communicationStyle,v0=Object.hasOwn(B,"communicationStyleDigest")?typeof B.communicationStyleDigest==="string"&&/^[a-f0-9]{64}$/.test(B.communicationStyleDigest)?B.communicationStyleDigest:void 0:I0===M?.communicationStyle?M?.communicationStyleDigest:void 0,u0=Object.hasOwn(B,"projectInstructionsDigest")?typeof B.projectInstructionsDigest==="string"&&/^[a-f0-9]{64}$/.test(B.projectInstructionsDigest)?B.projectInstructionsDigest:void 0:M?.projectInstructionsDigest,P0=p1(B.archivedAt)?B.archivedAt:void 0,h0=g1(B.taskRetriedFrom),f0=b1(B.taskDelivery),_0=typeof B.taskQueuePosition==="number"&&Number.isInteger(B.taskQueuePosition)&&B.taskQueuePosition>0?B.taskQueuePosition:void 0,c0=typeof B.taskQueueDepth==="number"&&Number.isInteger(B.taskQueueDepth)&&B.taskQueueDepth>=0?B.taskQueueDepth:void 0,R=typeof B.taskConcurrencyLimit==="number"&&Number.isInteger(B.taskConcurrencyLimit)&&B.taskConcurrencyLimit>0?B.taskConcurrencyLimit:void 0,d=V?X?.completion?X.completion.status==="completed"?void 0:`Code review ${d0(X.completion.status)}`:`Reviewing ${X?.start.target.label??"changes"}`:void 0,O0=V?T==="failed"&&d?$$(d):void 0:q$(B.taskFailure)?B.taskFailure:T==="failed"&&typeof B.taskStatusReason==="string"?$$(B.taskStatusReason):void 0;return{sessionId:q,projectPath:A,gitBranch:J.gitBranch,rootId:B.rootId||q,parentId:B.parentId,relationType:B.relationType,resumedFrom:B.resumedFrom,rootAgentId:B.rootAgentId,resumeDepth:B.resumeDepth,title:B.title,agentType:B.agentType,model:B.model,selectedModelId:b$,permissionMode:w$,reasoningEffort:E$,serviceTier:g$,responseVerbosity:y$,communicationStyle:I0,communicationStyleDigest:v0,projectInstructionsDigest:u0,pendingInteraction:C,taskStatus:T,taskStatusReason:O0?.message??d??(typeof B.taskStatusReason==="string"?B.taskStatusReason:void 0),taskFailure:O0,taskStartedAt:V?X?.start.startedAt:typeof B.taskStartedAt==="string"?B.taskStartedAt:void 0,taskCompletedAt:V?X?.completion?.completedAt:typeof B.taskCompletedAt==="string"?B.taskCompletedAt:void 0,taskPromptSummary:V?X?BL(X.start.target):"/review uncommitted":typeof B.taskPromptSummary==="string"?B.taskPromptSummary:void 0,taskPriority:D$,taskKind:A$,taskDueAt:M$,taskModelId:m0,taskRetryAvailable:M!==void 0,taskRetriedFrom:h0,taskDelivery:f0,taskIsolation:$0,taskSourceProjectPath:k,taskWorktreePath:w?.worktreeRoot,taskWorktreeBranch:w?.branch,taskBaseCommit:w?.baseCommit,taskDiffStat:O,taskQueuePosition:_0,taskQueueDepth:c0,taskConcurrencyLimit:R,archivedAt:P0,taskOwnerPid:V?void 0:e,taskWorktree:w,taskDispatch:M,messageCount:K,firstMessageTime:$[0].timestamp,lastMessageTime:$.at(-1).timestamp,hasErrors:F||T==="failed",filePath:f}}static toPublicMetadata($){let{filePath:q,taskOwnerPid:L,taskWorktree:f,taskDispatch:J,...B}=$;return B}static getSessionFilePath($,q){return m($,q)}static getSessionCreatedEntry($,q){let L=$.find((f)=>f.type==="session_created");if(!L)throw new l1(q);return L}static resolveCatalogWorkspace($){if(!H.isAbsolute($))throw Error("Session catalog cwd must be absolute");return H.resolve($)}static validateSessionWorkspace($,q,L){let f=this.getSessionCreatedEntry($,q);if(f.data.sessionId!==q)throw Error(`Session creation record sessionId mismatch: ${q}`);if(!H.isAbsolute(f.cwd)||H.resolve(f.cwd)!==L)throw Error(`Session creation record cwd mismatch: ${q}`)}static resolveForkWorkspace($){if(!H.isAbsolute($))throw Error("Fork workspace paths must be absolute");return H.resolve($)}static parseStoredSession($,q){return v1($,`session ${q}`)}static isCorruptSessionJSONLError($){return $ instanceof Error&&$.message.startsWith("Invalid session JSONL ")}static sanitizeStoredSessionError($,q){if(!this.isCorruptSessionJSONLError($)||!($ instanceof Error))return $;let L=$.message.match(/ at line (\d+)$/)?.[1];return Error(`Invalid session JSONL in session ${q}${L?` at line ${L}`:""}`,{cause:$.cause})}static async readStableSessionSnapshot($,q,L=3){for(let f=0;f<L;f+=1){let J=await X0.stat($),B=await X0.readFile($),Z=this.parseStoredSession(B,q),C=await X0.stat($);if(J.size===C.size&&J.mtimeNs===C.mtimeNs&&J.dev===C.dev&&J.ino===C.ino)return Z}throw Error("Session changed while creating fork; retry the operation")}}function y1($){if($.length===1&&$[0]?.type==="text")return $[0].text;return[...$]}
|
|
112
|
-
export{L$ as
|
|
112
|
+
export{L$ as Vb,k$ as Wb,N0 as Xb,j$ as Yb,wL as Zb,h as _b,c as $b,mL as ac,IL as bc,c$ as cc,PL as dc,x0 as ec,cL as fc,d0 as gc,l$ as hc,p$ as ic,pL as jc,iL as kc,dL as lc,Hq as mc,o$ as nc,t$ as oc,Kq as pc,rL as qc,a$ as rc,$$ as sc,l as tc,A0 as uc,Q2 as vc,V2 as wc,X2 as xc,Y2 as yc,L1 as zc,W2 as Ac,K2 as Bc,f1 as Cc,O2 as Dc,C$ as Ec,G$ as Fc,z2 as Gc,D2 as Hc,X1 as Ic,b0 as Jc,g2 as Kc,T1 as Lc,_1 as Mc,j2 as Nc,z1 as Oc,m2 as Pc,fL as Qc,X4 as Rc,Y4 as Sc,l1 as Tc,L0 as Uc,P as Vc,U as Wc};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{lh as o}from"./chunk-gbrwzpyg.js";async function e(){return o().listProviders()}async function i(r){return o().listModels(r)}
|
|
2
2
|
export{e as j,i as k};
|