@leviyuan/lodestar 0.17.1 → 0.17.3

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.
@@ -1,5 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import{spawn as g}from"node:child_process";import{existsSync as x}from"node:fs";import{homedir as p}from"node:os";import{join as s}from"node:path";var m=p(),a=process.platform==="win32";function $(t,l,r){if(t)return t;if(l)return s(l,"lodestar");return r}function u(){if(a)return s(process.env.APPDATA??s(m,"AppData","Roaming"),"Lodestar");return s(m,".config","lodestar")}function y(){if(a)return s(process.env.LOCALAPPDATA??s(m,"AppData","Local"),"Lodestar");return s(m,".local","share","lodestar")}var C=$(process.env.LODESTAR_CONFIG_DIR,process.env.XDG_CONFIG_HOME,u()),e=$(process.env.LODESTAR_DATA_DIR,process.env.XDG_DATA_HOME,y()),K=process.env.LODESTAR_CONFIG??s(C,"config.toml"),n=s(e,"daemon.pid"),f=s(e,"daemon.log"),S=s(e,"session-chat-map.json"),q=s(e,"session-resume-map.json"),z=s(e,"session-turns-map.json"),J=s(e,"session-model-map.json"),Q=s(e,"temp-session-leases.json"),Y=s(e,"tasklist-map.json"),Z=s(e,"agent-runs"),W=s(e,"agent-session-ids.json"),X=s(e,"managed-claude-plugin"),B=s(e,"dsh"),G=s(e,"context-window-cache.json"),N=s(e,"notify-callbacks.json"),U=s(e,"alive-on-shutdown.json"),i=s(e,"inbox"),F=s(e,"debug.sock"),h=s(e,"debug-context.json");var o={reset:"\x1B[0m",bold:"\x1B[1m",cyan:"\x1B[36m",green:"\x1B[32m",yellow:"\x1B[33m",red:"\x1B[31m",dim:"\x1B[2m"},d=["@leviyuan/lodestar@latest","@openai/codex@latest","@anthropic-ai/claude-code@latest","@anthropic-ai/claude-agent-sdk@latest","@anthropic-ai/sdk@latest"];function b(){let t=process.platform==="win32"?"npm.cmd":"npm";return new Promise((l)=>{let r=g(t,["install","-g","--include=optional",...d],{stdio:"inherit",shell:process.platform==="win32"});r.on("exit",(c)=>l(c??1)),r.on("error",(c)=>{console.error(`${o.red}spawn npm 失败:${o.reset} ${c.message}`),l(1)})})}async function w(){console.log(`${o.bold}更新 Lodestar + Codex CLI + Claude Code / SDK${o.reset}`),console.log(`${o.dim}npm i -g ${d.join(" ")}${o.reset}
3
- `);let t=await b();if(t!==0)console.error(`
4
- ${o.red}更新失败 (npm exit ${t})${o.reset}`),process.exit(t);if(console.log(`
5
- ${o.green}✓ 更新完成${o.reset}`),x(n))console.log(),console.log(`${o.yellow}检测到 daemon 仍在跑老版本进程, 用新版本需要重启:${o.reset}`),console.log(` ${o.dim}# Linux systemd --user 托管的:${o.reset}`),console.log(` ${o.cyan}systemctl --user restart lodestar${o.reset} ${o.dim}# Linux${o.reset}`),console.log(` ${o.dim}# macOS launchd / Windows 任务计划:用对应服务管理器重启。${o.reset}`),console.log(` ${o.dim}# 或手动重启:${o.reset}`),console.log(` ${o.cyan}lodestar-stop && lodestar-daemon${o.reset}`)}w().catch((t)=>{console.error(`${o.red}lodestar-update:${o.reset} ${t?.message??t}`),process.exit(1)});
2
+ import{createRequire as z1}from"node:module";var e$=Object.create;var{getPrototypeOf:$1,defineProperty:a,getOwnPropertyNames:L1}=Object;var q1=Object.prototype.hasOwnProperty;function J1($){return this[$]}var Q1,X1,Z1=($,L,q)=>{var J=$!=null&&typeof $==="object";if(J){var Q=L?Q1??=new WeakMap:X1??=new WeakMap,X=Q.get($);if(X)return X}q=$!=null?e$($1($)):{};let B=L||!$||!$.__esModule?a(q,"default",{value:$,enumerable:!0}):q;for(let Y of L1($))if(!q1.call(B,Y))a(B,Y,{get:J1.bind($,Y),enumerable:!0});if(J)Q.set($,B);return B};var O=($,L)=>()=>(L||$((L={exports:{}}).exports,L),L.exports);var y=z1(import.meta.url);var X$=O((f0,Q$)=>{Q$.exports=J$;J$.sync=U1;var L$=y("fs");function K1($,L){var q=L.pathExt!==void 0?L.pathExt:process.env.PATHEXT;if(!q)return!0;if(q=q.split(";"),q.indexOf("")!==-1)return!0;for(var J=0;J<q.length;J++){var Q=q[J].toLowerCase();if(Q&&$.substr(-Q.length).toLowerCase()===Q)return!0}return!1}function q$($,L,q){if(!$.isSymbolicLink()&&!$.isFile())return!1;return K1(L,q)}function J$($,L,q){L$.stat($,function(J,Q){q(J,J?!1:q$(Q,$,L))})}function U1($,L){return q$(L$.statSync($),$,L)}});var H$=O((b0,Y$)=>{Y$.exports=z$;z$.sync=W1;var Z$=y("fs");function z$($,L,q){Z$.stat($,function(J,Q){q(J,J?!1:B$(Q,L))})}function W1($,L){return B$(Z$.statSync($),L)}function B$($,L){return $.isFile()&&G1($,L)}function G1($,L){var{mode:q,uid:J,gid:Q}=$,X=L.uid!==void 0?L.uid:process.getuid&&process.getuid(),B=L.gid!==void 0?L.gid:process.getgid&&process.getgid(),Y=parseInt("100",8),Z=parseInt("010",8),z=parseInt("001",8),K=Y|Z,G=q&z||q&Z&&Q===B||q&Y&&J===X||q&K&&X===0;return G}});var K$=O((w0,V$)=>{var T0=y("fs"),D;if(process.platform==="win32"||global.TESTING_WINDOWS)D=X$();else D=H$();V$.exports=u;u.sync=P1;function u($,L,q){if(typeof L==="function")q=L,L={};if(!q){if(typeof Promise!=="function")throw TypeError("callback not provided");return new Promise(function(J,Q){u($,L||{},function(X,B){if(X)Q(X);else J(B)})})}D($,L||{},function(J,Q){if(J){if(J.code==="EACCES"||L&&L.ignoreErrors)J=null,Q=!1}q(J,Q)})}function P1($,L){try{return D.sync($,L||{})}catch(q){if(L&&L.ignoreErrors||q.code==="EACCES")return!1;else throw q}}});var M$=O((R0,O$)=>{var S=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",U$=y("path"),k1=S?";":":",W$=K$(),G$=($)=>Object.assign(Error(`not found: ${$}`),{code:"ENOENT"}),P$=($,L)=>{let q=L.colon||k1,J=$.match(/\//)||S&&$.match(/\\/)?[""]:[...S?[process.cwd()]:[],...(L.path||process.env.PATH||"").split(q)],Q=S?L.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",X=S?Q.split(q):[""];if(S){if($.indexOf(".")!==-1&&X[0]!=="")X.unshift("")}return{pathEnv:J,pathExt:X,pathExtExe:Q}},k$=($,L,q)=>{if(typeof L==="function")q=L,L={};if(!L)L={};let{pathEnv:J,pathExt:Q,pathExtExe:X}=P$($,L),B=[],Y=(z)=>new Promise((K,G)=>{if(z===J.length)return L.all&&B.length?K(B):G(G$($));let U=J[z],M=/^".*"$/.test(U)?U.slice(1,-1):U,P=U$.join(M,$),N=!M&&/^\.[\\\/]/.test($)?$.slice(0,2)+P:P;K(Z(N,z,0))}),Z=(z,K,G)=>new Promise((U,M)=>{if(G===Q.length)return U(Y(K+1));let P=Q[G];W$(z+P,{pathExt:X},(N,F)=>{if(!N&&F)if(L.all)B.push(z+P);else return U(z+P);return U(Z(z,K,G+1))})});return q?Y(0).then((z)=>q(null,z),q):Y(0)},O1=($,L)=>{L=L||{};let{pathEnv:q,pathExt:J,pathExtExe:Q}=P$($,L),X=[];for(let B=0;B<q.length;B++){let Y=q[B],Z=/^".*"$/.test(Y)?Y.slice(1,-1):Y,z=U$.join(Z,$),K=!Z&&/^\.[\\\/]/.test($)?$.slice(0,2)+z:z;for(let G=0;G<J.length;G++){let U=K+J[G];try{if(W$.sync(U,{pathExt:Q}))if(L.all)X.push(U);else return U}catch(M){}}}if(L.all&&X.length)return X;if(L.nothrow)return null;throw G$($)};O$.exports=k$;k$.sync=O1});var F$=O((D0,h)=>{var N$=($={})=>{let L=$.env||process.env;if(($.platform||process.platform)!=="win32")return"PATH";return Object.keys(L).reverse().find((J)=>J.toUpperCase()==="PATH")||"Path"};h.exports=N$;h.exports.default=N$});var _$=O((j0,C$)=>{var x$=y("path"),M1=M$(),N1=F$();function y$($,L){let q=$.options.env||process.env,J=process.cwd(),Q=$.options.cwd!=null,X=Q&&process.chdir!==void 0&&!process.chdir.disabled;if(X)try{process.chdir($.options.cwd)}catch(Y){}let B;try{B=M1.sync($.command,{path:q[N1({env:q})],pathExt:L?x$.delimiter:void 0})}catch(Y){}finally{if(X)process.chdir(J)}if(B)B=x$.resolve(Q?$.options.cwd:"",B);return B}function F1($){return y$($)||y$($,!0)}C$.exports=F1});var S$=O((C1,m)=>{var c=/([()\][%!^"`<>&|;, *?])/g;function x1($){return $=$.replace(c,"^$1"),$}function y1($,L){if($=`${$}`,$=$.replace(/(?=(\\+?)?)\1"/g,"$1$1\\\""),$=$.replace(/(?=(\\+?)?)\1$/,"$1$1"),$=`"${$}"`,$=$.replace(c,"^$1"),L)$=$.replace(c,"^$1");return $}C1.command=x1;C1.argument=y1});var f$=O((v0,I$)=>{I$.exports=/^#!(.*)/});var T$=O((E0,b$)=>{var I1=f$();b$.exports=($="")=>{let L=$.match(I1);if(!L)return null;let[q,J]=L[0].replace(/#! ?/,"").split(" "),Q=q.split("/").pop();if(Q==="env")return J;return J?`${Q} ${J}`:Q}});var R$=O((A0,w$)=>{var l=y("fs"),f1=T$();function b1($){let q=Buffer.alloc(150),J;try{J=l.openSync($,"r"),l.readSync(J,q,0,150,0),l.closeSync(J)}catch(Q){}return f1(q.toString())}w$.exports=b1});var E$=O((u0,v$)=>{var T1=y("path"),D$=_$(),j$=S$(),w1=R$(),R1=process.platform==="win32",D1=/\.(?:com|exe)$/i,j1=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function v1($){$.file=D$($);let L=$.file&&w1($.file);if(L)return $.args.unshift($.file),$.command=L,D$($);return $.file}function E1($){if(!R1)return $;let L=v1($),q=!D1.test(L);if($.options.forceShell||q){let J=j1.test(L);$.command=T1.normalize($.command),$.command=j$.command($.command),$.args=$.args.map((X)=>j$.argument(X,J));let Q=[$.command].concat($.args).join(" ");$.args=["/d","/s","/c",`"${Q}"`],$.command=process.env.comspec||"cmd.exe",$.options.windowsVerbatimArguments=!0}return $}function A1($,L,q){if(L&&!Array.isArray(L))q=L,L=null;L=L?L.slice(0):[],q=Object.assign({},q);let J={command:$,args:L,options:q,file:void 0,original:{command:$,args:L}};return q.shell?J:E1(J)}v$.exports=A1});var h$=O((h0,u$)=>{var g=process.platform==="win32";function d($,L){return Object.assign(Error(`${L} ${$.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${L} ${$.command}`,path:$.command,spawnargs:$.args})}function u1($,L){if(!g)return;let q=$.emit;$.emit=function(J,Q){if(J==="exit"){let X=A$(Q,L);if(X)return q.call($,"error",X)}return q.apply($,arguments)}}function A$($,L){if(g&&$===1&&!L.file)return d(L.original,"spawn");return null}function h1($,L){if(g&&$===1&&!L.file)return d(L.original,"spawnSync");return null}u$.exports={hookChildProcess:u1,verifyENOENT:A$,verifyENOENTSync:h1,notFoundError:d}});var l$=O((c0,I)=>{var c$=y("child_process"),p=E$(),n=h$();function m$($,L,q){let J=p($,L,q),Q=c$.spawn(J.command,J.args,J.options);return n.hookChildProcess(Q,J),Q}function c1($,L,q){let J=p($,L,q),Q=c$.spawnSync(J.command,J.args,J.options);return Q.error=Q.error||n.verifyENOENTSync(Q.status,J),Q}I.exports=m$;I.exports.spawn=m$;I.exports.sync=c1;I.exports._parse=p;I.exports._enoent=n});import{spawn as L0}from"node:child_process";import{existsSync as q0}from"node:fs";import{homedir as B1}from"node:os";import{join as H}from"node:path";var R=B1(),r=process.platform==="win32";function e($,L,q){if($)return $;if(L)return H(L,"lodestar");return q}function Y1(){if(r)return H(process.env.APPDATA??H(R,"AppData","Roaming"),"Lodestar");return H(R,".config","lodestar")}function H1(){if(r)return H(process.env.LOCALAPPDATA??H(R,"AppData","Local"),"Lodestar");return H(R,".local","share","lodestar")}var V1=e(process.env.LODESTAR_CONFIG_DIR,process.env.XDG_CONFIG_HOME,Y1()),W=e(process.env.LODESTAR_DATA_DIR,process.env.XDG_DATA_HOME,H1()),Y0=process.env.LODESTAR_CONFIG??H(V1,"config.toml"),$$=H(W,"daemon.pid"),H0=H(W,"daemon.log"),V0=H(W,"session-chat-map.json"),K0=H(W,"session-resume-map.json"),U0=H(W,"session-turns-map.json"),W0=H(W,"session-model-map.json"),G0=H(W,"temp-session-leases.json"),P0=H(W,"tasklist-map.json"),k0=H(W,"agent-runs"),O0=H(W,"agent-session-ids.json"),M0=H(W,"managed-claude-plugin"),N0=H(W,"dsh"),A=H(W,"agent-runtimes"),F0=H(W,"context-window-cache.json"),x0=H(W,"notify-callbacks.json"),y0=H(W,"alive-on-shutdown.json"),C0=H(W,"inbox"),_0=H(W,"debug.sock"),S0=H(W,"debug-context.json");import{createHash as d1,randomUUID as p1}from"node:crypto";import{existsSync as n$,readFileSync as i$}from"node:fs";import{mkdir as s$,mkdtemp as n1,readFile as t$,rename as o$,rm as v,writeFile as s}from"node:fs/promises";import{join as x,isAbsolute as i1}from"node:path";import{fileURLToPath as s1,pathToFileURL as s0}from"node:url";var g$=Z1(l$(),1);import{execFile as m1}from"node:child_process";var l1="https://registry.npmjs.org";class j extends Error{}function g1($){if(!Number.isSafeInteger($)||$<=0)return Promise.reject(Error(`Invalid npm installer PID: ${$}`));return new Promise((L,q)=>{m1("taskkill",["/PID",String($),"/T","/F"],{windowsHide:!0,timeout:1e4},(J,Q,X)=>{if(J)q(Error(`taskkill npm installer PID ${$} failed: ${J.message}
3
+ ${Q}${X}`));else L()})})}async function i($,L,q={}){L?.throwIfAborted();let J=q.platform??process.platform,Q=q.timeoutMs??300000,X=q.terminationTimeoutMs??1e4;return await new Promise((B,Y)=>{let Z=(q.spawn??g$.spawn)("npm",["install","--prefix",$,"--include=optional","--no-fund","--no-audit",`--registry=${l1}`],{cwd:$,stdio:["ignore","pipe","pipe"],shell:!1,windowsHide:!0}),z="",K,G,U=!1,M=!1,P,N=(k)=>{z=(z+k.toString()).slice(-16384)};Z.stdout.on("data",N),Z.stderr.on("data",N);let F=(k)=>{if(U)return;if(U=!0,clearTimeout(o),P)clearTimeout(P);if(L?.removeEventListener("abort",w),k)Y(k);else B()},_=(k)=>new j(`${K?.message??"Agent runtime install failed"}; npm installer PID ${Z.pid??"MISS"} termination unconfirmed: ${k}; partial directory retained: ${$}
4
+ ${z}`),t=(k)=>{if(U||M||G)return;K??=Error(k),P=setTimeout(()=>F(_(`stdio did not close within ${X}ms`)),X),G=Promise.resolve().then(async()=>{if(M)throw Error("installer closed before process-tree termination started");if(!Z.pid)throw Error("installer PID unavailable");if(J==="win32")await(q.terminateWindows??g1)(Z.pid);else if(!Z.kill("SIGTERM"))throw Error("npm installer rejected SIGTERM")}),G.catch((b)=>F(_(b instanceof Error?b.message:String(b))))},w=()=>t("Agent runtime install aborted"),o=setTimeout(()=>t(`Agent runtime install timed out after ${Q}ms`),Q);if(L?.addEventListener("abort",w,{once:!0}),Z.on("error",(k)=>{if(K??=k,!Z.pid)F(Error(`${k.message}
5
+ ${z}`))}),Z.once("close",async(k,b)=>{M=!0,clearTimeout(o),L?.removeEventListener("abort",w);try{await G}catch(E){F(_(E instanceof Error?E.message:String(E)));return}if(K||k!==0)F(Error(`${K?.message??`npm install exited code=${k} signal=${b}`}
6
+ ${z}`));else F()}),L?.aborted)w()})}var d$=["codex","claude","dsh"];var t1="https://registry.npmjs.org",T={codex:["@openai/codex"],claude:["@anthropic-ai/claude-code","@anthropic-ai/claude-agent-sdk","@anthropic-ai/sdk"],dsh:["@deepseek-ai/dsh","@deepseek-ai/dsh-llm-pi-ai","@deepseek-ai/dsh-tool-ask-user"]},C=($)=>$ instanceof Error?$.message:String($);function o1($,L=A){let q=x(L,$,"current.json");if(!n$(q))return null;let J=JSON.parse(i$(q,"utf8"));if(!Number.isFinite(J.checkedAt)||J.directory!==void 0&&!i1(J.directory))throw Error(`Invalid ${$} runtime state: ${q}`);return J}async function a1($,L,q){let J=new AbortController,Q=()=>J.abort(q?.reason);if(q?.addEventListener("abort",Q,{once:!0}),q?.aborted)Q();let X=setTimeout(()=>J.abort(Error("npm registry request timed out")),30000);try{let B=await fetch(`${t1}/${encodeURIComponent($)}/${encodeURIComponent(L)}`,{signal:J.signal});if(!B.ok)throw Error(`${$}@${L}: npm HTTP ${B.status}`);let Y=await B.json();if(Y.name!==$||typeof Y.version!=="string"||!Y.version)throw Error(`Invalid npm manifest: ${$}@${L}`);return Y}finally{clearTimeout(X),q?.removeEventListener("abort",Q)}}async function r1($,L){let q={};if($!=="dsh"){let B=await Promise.all(T[$].map((Y)=>L(Y,"latest")));for(let Y of B)q[Y.name]=Y.version;return q}let J=await L("@deepseek-ai/dsh","latest"),Q=new Set(T.dsh),X=new Set;while(Q.size){let B=[...Q].slice(0,12);for(let Z of B)Q.delete(Z),X.add(Z);let Y=await Promise.all(B.map((Z)=>Z===J.name?J:L(Z,J.version)));for(let Z of Y){if(Z.version!==J.version)throw Error(`DSH release package mismatch: ${Z.name}@${Z.version}, expected ${J.version}`);q[Z.name]=Z.version;for(let z of Object.keys({...Z.dependencies,...Z.peerDependencies,...Z.optionalDependencies}))if(z.startsWith("@deepseek-ai/dsh")&&!X.has(z))Q.add(z)}}return q}async function f($,L=process.platform){for(let q=0;;q++)try{return await $()}catch(J){let Q=J.code;if(L!=="win32"||!["EPERM","EACCES","EBUSY","ENOTEMPTY"].includes(Q??"")||q>=5)throw J;await new Promise((X)=>setTimeout(X,100*(q+1)))}}async function p$($,L){let q=x($,`current-${p1()}.json`),J;try{await s(q,JSON.stringify(L)+`
7
+ `,{mode:384}),await f(()=>o$(q,x($,"current.json")))}catch(Q){throw J=Q,Q}finally{try{await f(()=>v(q,{force:!0}))}catch(Q){if(J)throw AggregateError([J,Q],`${C(J)}; state temporary file cleanup failed: ${C(Q)}`);throw Q}}}async function e1($,L){let q=x($,"update.lock"),J=Date.now()+360000;for(;;){L?.throwIfAborted();try{return await s$(q),await s(x(q,"pid"),String(process.pid)),()=>f(()=>v(q,{recursive:!0}))}catch(Q){if(Q.code!=="EEXIST")throw Q;try{let X=Number(await t$(x(q,"pid"),"utf8"));if(!Number.isSafeInteger(X)||X<=0)throw Error(`Invalid runtime update lock: ${q}`);try{process.kill(X,0)}catch(B){if(B.code!=="ESRCH")throw B;await f(()=>v(q,{recursive:!0}));continue}}catch(X){if(X.code!=="ENOENT")throw X}if(Date.now()>=J)throw Error(`Timed out waiting for runtime update lock: ${q}`);await new Promise((X)=>setTimeout(X,200))}}}async function $0($,L={}){let q=L.root??A,J=x(q,$);await s$(J,{recursive:!0,mode:448});let Q=await e1(J,L.signal),X,B,Y=!1;try{L.report?.(`${$}: 检查 upstream latest`);let Z=o1($,q),z=await r1($,L.metadata??((P,N)=>a1(P,N,L.signal)));L.signal?.throwIfAborted();let K=JSON.parse(i$(s1(new URL("../package.json",import.meta.url)),"utf8")).overrides??{},G=d1("sha256").update(JSON.stringify({installFormat:2,versions:Object.entries(z).sort(),security:K,platform:process.platform,arch:process.arch})).digest("hex").slice(0,20),U=x(J,G);if(!n$(U)){X=await n1(x(J,".install-")),await s(x(X,"package.json"),JSON.stringify({name:`lodestar-runtime-${$}`,version:z[T[$][0]],private:!0,type:"module",dependencies:z,overrides:{...K,...$==="dsh"?z:{}}})+`
8
+ `,{mode:384}),await(L.install??i)(X,L.signal);for(let[N,F]of Object.entries(z)){let _=JSON.parse(await t$(x(X,"node_modules",N,"package.json"),"utf8"));if(_.version!==F)throw Error(`npm installed ${N}@${_.version}, expected ${F}`)}L.signal?.throwIfAborted();let P=X;await f(()=>o$(P,U)),X=void 0}let M={directory:U,versions:z,checkedAt:Date.now()};return await p$(J,M),L.report?.(`${$}: ${T[$][0]}@${z[T[$][0]]}${Z?.directory===U?" 已是 latest":" 已更新,新进程使用新版"}`),M}catch(Z){B=Z,Y=Z instanceof j;try{await p$(J,{checkedAt:Date.now(),error:C(Z)})}catch(z){throw B=AggregateError([Z,z],`${C(Z)}; recording update failure also failed: ${C(z)}`),B}throw Z}finally{let Z=[];if(X&&!Y){let z=X;try{await f(()=>v(z,{recursive:!0}))}catch(K){Z.push(K)}}try{await Q()}catch(z){Z.push(z)}if(Z.length){let z=B?[B,...Z]:Z;throw AggregateError(z,z.map(C).join("; "))}}}async function a$($={}){let L=await Promise.allSettled(d$.map((J)=>$0(J,$))),q=[];for(let J=0;J<L.length;J++){let Q=L[J];if(Q.status==="rejected"){let X=Error(`${d$[J]}: ${C(Q.reason)}`);$.report?.(`Agent 更新失败: ${X.message}`),q.push(X)}}if(q.length)throw AggregateError(q,q.map((J)=>J.message).join(`
9
+ `))}var V={reset:"\x1B[0m",bold:"\x1B[1m",cyan:"\x1B[36m",green:"\x1B[32m",yellow:"\x1B[33m",red:"\x1B[31m",dim:"\x1B[2m"},r$=["@leviyuan/lodestar@latest"];function J0(){let $=process.platform==="win32"?"npm.cmd":"npm";return new Promise((L)=>{let q=L0($,["install","-g","--include=optional",...r$],{stdio:"inherit",shell:process.platform==="win32"});q.on("exit",(J)=>L(J??1)),q.on("error",(J)=>{console.error(`${V.red}spawn npm 失败:${V.reset} ${J.message}`),L(1)})})}async function Q0(){let $=process.argv.includes("--agents-only");if(process.argv.slice(2).some((L)=>L!=="--agents-only"))throw Error("用法: lodestar-update [--agents-only]");if(console.log(`${V.bold}更新 ${$?"":"Lodestar + "}Codex、Claude Code/SDK、DSH${V.reset}`),!$){console.log(`${V.dim}npm i -g ${r$.join(" ")}${V.reset}
10
+ `);let L=await J0();if(L!==0)throw Error(`Lodestar 更新失败 (npm exit ${L})`)}if(await a$({report:(L)=>console.log(L)}),console.log(`
11
+ ${V.green}✓ Agent 更新完成,新进程使用新版${V.reset}`),!$&&q0($$))console.log(),console.log(`${V.yellow}检测到 daemon 仍在跑老版本进程, 用新版本需要重启:${V.reset}`),console.log(` ${V.dim}# Linux systemd --user 托管的:${V.reset}`),console.log(` ${V.cyan}systemctl --user restart lodestar${V.reset} ${V.dim}# Linux${V.reset}`),console.log(` ${V.dim}# macOS launchd / Windows 任务计划:用对应服务管理器重启。${V.reset}`),console.log(` ${V.dim}# 或手动重启:${V.reset}`),console.log(` ${V.cyan}lodestar-stop && lodestar-daemon${V.reset}`)}Q0().catch(($)=>{console.error(`${V.red}lodestar-update:${V.reset} ${$?.message??$}`),process.exit(1)});
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{execSync as z}from"node:child_process";import{readFileSync as A}from"node:fs";import{dirname as B,join as D}from"node:path";import{fileURLToPath as E}from"node:url";var b={reset:"\x1B[0m",bold:"\x1B[1m",cyan:"\x1B[36m",green:"\x1B[32m",dim:"\x1B[2m"};function G(){try{let q=B(E(import.meta.url)),v=JSON.parse(A(D(q,"..","package.json"),"utf8"));return typeof v.version==="string"?v.version:"(unknown)"}catch{return"(unknown)"}}function H(){try{return z("claude --version",{timeout:1e4,stdio:["ignore","pipe","ignore"]}).toString().trim()||"(unknown)"}catch{return"(未找到 / 未安装)"}}function I(){try{return z("codex --version",{timeout:1e4,stdio:["ignore","pipe","ignore"]}).toString().trim()||"(unknown)"}catch{return"(未找到 / 未安装)"}}console.log(`${b.bold}Lodestar${b.reset} ${b.green}v${G()}${b.reset}`);console.log(`${b.dim}Claude Code:${b.reset} ${H()}`);console.log(`${b.dim}Codex CLI:${b.reset} ${I()}`);console.log(`${b.dim}Runtime:${b.reset} ${process.version} (${process.platform}-${process.arch})`);
2
+ import{createRequire as E$}from"node:module";var y$=Object.create;var{getPrototypeOf:T$,defineProperty:D,getOwnPropertyNames:R$}=Object;var b$=Object.prototype.hasOwnProperty;function j$($){return this[$]}var D$,w$,v$=($,q,L)=>{var J=$!=null&&typeof $==="object";if(J){var Q=q?D$??=new WeakMap:w$??=new WeakMap,Z=Q.get($);if(Z)return Z}L=$!=null?y$(T$($)):{};let z=q||!$||!$.__esModule?D(L,"default",{value:$,enumerable:!0}):L;for(let Y of R$($))if(!b$.call(z,Y))D(z,Y,{get:j$.bind($,Y),enumerable:!0});if(J)Q.set($,z);return z};var V=($,q)=>()=>(q||$((q={exports:{}}).exports,q),q.exports);var k=E$(import.meta.url);var m=V((o0,c)=>{c.exports=h;h.sync=g$;var A=k("fs");function m$($,q){var L=q.pathExt!==void 0?q.pathExt:process.env.PATHEXT;if(!L)return!0;if(L=L.split(";"),L.indexOf("")!==-1)return!0;for(var J=0;J<L.length;J++){var Q=L[J].toLowerCase();if(Q&&$.substr(-Q.length).toLowerCase()===Q)return!0}return!1}function u($,q,L){if(!$.isSymbolicLink()&&!$.isFile())return!1;return m$(q,L)}function h($,q,L){A.stat($,function(J,Q){L(J,J?!1:u(Q,$,q))})}function g$($,q){return u(A.statSync($),$,q)}});var i=V((a0,p)=>{p.exports=l;l.sync=l$;var g=k("fs");function l($,q,L){g.stat($,function(J,Q){L(J,J?!1:d(Q,q))})}function l$($,q){return d(g.statSync($),q)}function d($,q){return $.isFile()&&d$($,q)}function d$($,q){var{mode:L,uid:J,gid:Q}=$,Z=q.uid!==void 0?q.uid:process.getuid&&process.getuid(),z=q.gid!==void 0?q.gid:process.getgid&&process.getgid(),Y=parseInt("100",8),W=parseInt("010",8),H=parseInt("001",8),G=Y|W,K=L&H||L&W&&Q===z||L&Y&&J===Z||L&G&&Z===0;return K}});var s=V((e0,n)=>{var r0=k("fs"),S;if(process.platform==="win32"||global.TESTING_WINDOWS)S=m();else S=i();n.exports=I;I.sync=p$;function I($,q,L){if(typeof q==="function")L=q,q={};if(!L){if(typeof Promise!=="function")throw TypeError("callback not provided");return new Promise(function(J,Q){I($,q||{},function(Z,z){if(Z)Q(Z);else J(z)})})}S($,q||{},function(J,Q){if(J){if(J.code==="EACCES"||q&&q.ignoreErrors)J=null,Q=!1}L(J,Q)})}function p$($,q){try{return S.sync($,q||{})}catch(L){if(q&&q.ignoreErrors||L.code==="EACCES")return!1;else throw L}}});var q$=V(($1,$$)=>{var P=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",t=k("path"),i$=P?";":":",o=s(),a=($)=>Object.assign(Error(`not found: ${$}`),{code:"ENOENT"}),r=($,q)=>{let L=q.colon||i$,J=$.match(/\//)||P&&$.match(/\\/)?[""]:[...P?[process.cwd()]:[],...(q.path||process.env.PATH||"").split(L)],Q=P?q.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",Z=P?Q.split(L):[""];if(P){if($.indexOf(".")!==-1&&Z[0]!=="")Z.unshift("")}return{pathEnv:J,pathExt:Z,pathExtExe:Q}},e=($,q,L)=>{if(typeof q==="function")L=q,q={};if(!q)q={};let{pathEnv:J,pathExt:Q,pathExtExe:Z}=r($,q),z=[],Y=(H)=>new Promise((G,K)=>{if(H===J.length)return q.all&&z.length?G(z):K(a($));let U=J[H],O=/^".*"$/.test(U)?U.slice(1,-1):U,M=t.join(O,$),C=!O&&/^\.[\\\/]/.test($)?$.slice(0,2)+M:M;G(W(C,H,0))}),W=(H,G,K)=>new Promise((U,O)=>{if(K===Q.length)return U(Y(G+1));let M=Q[K];o(H+M,{pathExt:Z},(C,f$)=>{if(!C&&f$)if(q.all)z.push(H+M);else return U(H+M);return U(W(H,G,K+1))})});return L?Y(0).then((H)=>L(null,H),L):Y(0)},n$=($,q)=>{q=q||{};let{pathEnv:L,pathExt:J,pathExtExe:Q}=r($,q),Z=[];for(let z=0;z<L.length;z++){let Y=L[z],W=/^".*"$/.test(Y)?Y.slice(1,-1):Y,H=t.join(W,$),G=!W&&/^\.[\\\/]/.test($)?$.slice(0,2)+H:H;for(let K=0;K<J.length;K++){let U=G+J[K];try{if(o.sync(U,{pathExt:Q}))if(q.all)Z.push(U);else return U}catch(O){}}}if(q.all&&Z.length)return Z;if(q.nothrow)return null;throw a($)};$$.exports=e;e.sync=n$});var J$=V((q1,x)=>{var L$=($={})=>{let q=$.env||process.env;if(($.platform||process.platform)!=="win32")return"PATH";return Object.keys(q).reverse().find((J)=>J.toUpperCase()==="PATH")||"Path"};x.exports=L$;x.exports.default=L$});var z$=V((L1,Z$)=>{var Q$=k("path"),s$=q$(),t$=J$();function X$($,q){let L=$.options.env||process.env,J=process.cwd(),Q=$.options.cwd!=null,Z=Q&&process.chdir!==void 0&&!process.chdir.disabled;if(Z)try{process.chdir($.options.cwd)}catch(Y){}let z;try{z=s$.sync($.command,{path:L[t$({env:L})],pathExt:q?Q$.delimiter:void 0})}catch(Y){}finally{if(Z)process.chdir(J)}if(z)z=Q$.resolve(Q?$.options.cwd:"",z);return z}function o$($){return X$($)||X$($,!0)}Z$.exports=o$});var B$=V((e$,f)=>{var _=/([()\][%!^"`<>&|;, *?])/g;function a$($){return $=$.replace(_,"^$1"),$}function r$($,q){if($=`${$}`,$=$.replace(/(?=(\\+?)?)\1"/g,"$1$1\\\""),$=$.replace(/(?=(\\+?)?)\1$/,"$1$1"),$=`"${$}"`,$=$.replace(_,"^$1"),q)$=$.replace(_,"^$1");return $}e$.command=a$;e$.argument=r$});var H$=V((J1,Y$)=>{Y$.exports=/^#!(.*)/});var K$=V((Q1,V$)=>{var L0=H$();V$.exports=($="")=>{let q=$.match(L0);if(!q)return null;let[L,J]=q[0].replace(/#! ?/,"").split(" "),Q=L.split("/").pop();if(Q==="env")return J;return J?`${Q} ${J}`:Q}});var G$=V((X1,U$)=>{var y=k("fs"),J0=K$();function Q0($){let L=Buffer.alloc(150),J;try{J=y.openSync($,"r"),y.readSync(J,L,0,150,0),y.closeSync(J)}catch(Q){}return J0(L.toString())}U$.exports=Q0});var P$=V((Z1,M$)=>{var X0=k("path"),W$=z$(),k$=B$(),Z0=G$(),z0=process.platform==="win32",B0=/\.(?:com|exe)$/i,Y0=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function H0($){$.file=W$($);let q=$.file&&Z0($.file);if(q)return $.args.unshift($.file),$.command=q,W$($);return $.file}function V0($){if(!z0)return $;let q=H0($),L=!B0.test(q);if($.options.forceShell||L){let J=Y0.test(q);$.command=X0.normalize($.command),$.command=k$.command($.command),$.args=$.args.map((Z)=>k$.argument(Z,J));let Q=[$.command].concat($.args).join(" ");$.args=["/d","/s","/c",`"${Q}"`],$.command=process.env.comspec||"cmd.exe",$.options.windowsVerbatimArguments=!0}return $}function K0($,q,L){if(q&&!Array.isArray(q))L=q,q=null;q=q?q.slice(0):[],L=Object.assign({},L);let J={command:$,args:q,options:L,file:void 0,original:{command:$,args:q}};return L.shell?J:V0(J)}M$.exports=K0});var F$=V((z1,O$)=>{var T=process.platform==="win32";function R($,q){return Object.assign(Error(`${q} ${$.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${q} ${$.command}`,path:$.command,spawnargs:$.args})}function U0($,q){if(!T)return;let L=$.emit;$.emit=function(J,Q){if(J==="exit"){let Z=N$(Q,q);if(Z)return L.call($,"error",Z)}return L.apply($,arguments)}}function N$($,q){if(T&&$===1&&!q.file)return R(q.original,"spawn");return null}function G0($,q){if(T&&$===1&&!q.file)return R(q.original,"spawnSync");return null}O$.exports={hookChildProcess:U0,verifyENOENT:N$,verifyENOENTSync:G0,notFoundError:R}});var I$=V((B1,N)=>{var S$=k("child_process"),b=P$(),j=F$();function C$($,q,L){let J=b($,q,L),Q=S$.spawn(J.command,J.args,J.options);return j.hookChildProcess(Q,J),Q}function W0($,q,L){let J=b($,q,L),Q=S$.spawnSync(J.command,J.args,J.options);return Q.error=Q.error||j.verifyENOENTSync(Q.status,J),Q}N.exports=C$;N.exports.spawn=C$;N.exports.sync=W0;N.exports._parse=b;N.exports._enoent=j});import{readFileSync as C0}from"node:fs";import{fileURLToPath as I0}from"node:url";import{existsSync as P0,readFileSync as N0}from"node:fs";import{join as O0,isAbsolute as F0}from"node:path";import{homedir as A$}from"node:os";import{join as X}from"node:path";var F=A$(),w=process.platform==="win32";function v($,q,L){if($)return $;if(q)return X(q,"lodestar");return L}function u$(){if(w)return X(process.env.APPDATA??X(F,"AppData","Roaming"),"Lodestar");return X(F,".config","lodestar")}function h$(){if(w)return X(process.env.LOCALAPPDATA??X(F,"AppData","Local"),"Lodestar");return X(F,".local","share","lodestar")}var c$=v(process.env.LODESTAR_CONFIG_DIR,process.env.XDG_CONFIG_HOME,u$()),B=v(process.env.LODESTAR_DATA_DIR,process.env.XDG_DATA_HOME,h$()),R0=process.env.LODESTAR_CONFIG??X(c$,"config.toml"),b0=X(B,"daemon.pid"),j0=X(B,"daemon.log"),D0=X(B,"session-chat-map.json"),w0=X(B,"session-resume-map.json"),v0=X(B,"session-turns-map.json"),E0=X(B,"session-model-map.json"),A0=X(B,"temp-session-leases.json"),u0=X(B,"tasklist-map.json"),h0=X(B,"agent-runs"),c0=X(B,"agent-session-ids.json"),m0=X(B,"managed-claude-plugin"),g0=X(B,"dsh"),E=X(B,"agent-runtimes"),l0=X(B,"context-window-cache.json"),d0=X(B,"notify-callbacks.json"),p0=X(B,"alive-on-shutdown.json"),i0=X(B,"inbox"),n0=X(B,"debug.sock"),s0=X(B,"debug-context.json");var k0=v$(I$(),1);var x$=["codex","claude","dsh"];function S0($,q=E){let L=O0(q,$,"current.json");if(!P0(L))return null;let J=JSON.parse(N0(L,"utf8"));if(!Number.isFinite(J.checkedAt)||J.directory!==void 0&&!F0(J.directory))throw Error(`Invalid ${$} runtime state: ${L}`);return J}function _$($){return S0($)}var x0=JSON.parse(C0(I0(new URL("../package.json",import.meta.url)),"utf8"));console.log(`Lodestar v${x0.version}`);for(let $ of x$)try{let q=_$($);if(!q){console.log(`${$}: MISS(尚未自动安装)`);continue}if(q.error){console.log(`${$}: MISS(自动更新失败:${q.error})`),process.exitCode=1;continue}let L=$==="dsh"?["@deepseek-ai/dsh"]:Object.keys(q.versions??{});console.log(`${$}: ${L.map((J)=>`${J}@${q.versions?.[J]??"MISS"}`).join(", ")}`),console.log(` ${q.directory}`)}catch(q){console.error(`${$}: MISS(${q})`),process.exitCode=1}console.log(`Runtime: ${process.version} (${process.platform}-${process.arch})`);