@leviyuan/lodestar 0.18.25 → 0.19.0
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/lodestar-setup.js +49 -49
- package/dist/lodestar-stop.js +3 -2
- package/dist/lodestar-update.js +48 -48
- package/dist/lodestar-version.js +16 -16
- package/dist/lodestar.js +201 -199
- package/docs/configuration.md +4 -0
- package/docs/models.md +10 -6
- package/docs/usage.md +2 -0
- package/package.json +1 -1
package/dist/lodestar-stop.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{createRequire as
|
|
3
|
-
`)
|
|
2
|
+
import{createRequire as j}from"node:module";var v=Object.create;var{getPrototypeOf:T,defineProperty:b,getOwnPropertyNames:k}=Object;var C=Object.prototype.hasOwnProperty;function x(q){return this[q]}var R,F,_=(q,X,H)=>{var Z=q!=null&&typeof q==="object";if(Z){var Q=X?R??=new WeakMap:F??=new WeakMap,G=Q.get(q);if(G)return G}H=q!=null?v(T(q)):{};let $=X||!q||!q.__esModule?b(H,"default",{value:q,enumerable:!0}):H;for(let K of k(q))if(!C.call($,K))b($,K,{get:x.bind(q,K),enumerable:!0});if(Z)Q.set(q,$);return $};var c=(q,X)=>()=>(X||q((X={exports:{}}).exports,X),X.exports);var E=j(import.meta.url);var w=c((Qq,f)=>{var{homedir:O}=E("node:os"),{join:B}=E("node:path");function S(){if(process.env.LODESTAR_DATA_DIR)return process.env.LODESTAR_DATA_DIR;if(process.env.XDG_DATA_HOME)return B(process.env.XDG_DATA_HOME,"lodestar");if(process.platform==="win32")return B(process.env.LOCALAPPDATA??B(O(),"AppData","Local"),"Lodestar");return B(O(),".local","share","lodestar")}function A(){return B(S(),"managed-claude-plugin")}f.exports={lodestarDataDir:S,managedClaudePluginDir:A}});import{execFileSync as qq}from"node:child_process";import{readFileSync as Xq}from"node:fs";var N=_(w(),1);import{homedir as g}from"node:os";import{join as z}from"node:path";var h=g(),I=process.platform==="win32";function l(q,X,H){if(q)return q;if(X)return z(X,"lodestar");return H}function t(){if(I)return z(process.env.APPDATA??z(h,"AppData","Roaming"),"Lodestar");return z(h,".config","lodestar")}var m=l(process.env.LODESTAR_CONFIG_DIR,process.env.XDG_CONFIG_HOME,t()),J=N.lodestarDataDir(),$q=process.env.LODESTAR_CONFIG??z(m,"config.toml"),L=z(J,"daemon.pid"),Gq=z(J,"daemon.log"),Lq=z(J,"session-chat-map.json"),Bq=z(J,"session-resume-map.json"),Nq=z(J,"session-turns-map.json"),Uq=z(J,"session-model-map.json"),Mq=z(J,"temp-session-leases.json"),Wq=z(J,"tasklist-map.json"),Pq=z(J,"agent-runs"),Vq=z(J,"agent-session-ids.json"),bq=N.managedClaudePluginDir(),Eq=z(J,"dsh"),Oq=z(J,"codex-accounts"),Sq=z(J,"codex-accounts.json"),fq=z(J,"codex-quota-blocks.json"),wq=z(J,"agent-runtimes"),hq=z(J,"context-window-cache.json"),yq=z(J,"notify-callbacks.json"),uq=z(J,"alive-on-shutdown.json"),vq=z(J,"inbox"),Tq=z(J,"file-deliveries"),kq=z(J,"file-delivery-groups.json"),Cq=z(J,"debug.sock"),xq=z(J,"debug-context.json");import{execFileSync as W}from"node:child_process";import{readFileSync as D,readlinkSync as s,writeFileSync as cq}from"node:fs";import{isAbsolute as p,resolve as U,win32 as M}from"node:path";function u(q){if(!/^[1-9]\d*$/.test(q.trim()))return null;let X=Number(q.trim());return Number.isSafeInteger(X)&&X<=2147483647?X:null}function y(q){try{return process.kill(q,0),!0}catch(X){if(X.code==="ESRCH")return!1;throw X}}function o(q){if(!y(q))return null;try{let X;if(process.platform==="linux")X=D(`/proc/${q}/cmdline`,"utf8");else if(process.platform==="darwin")X=W("ps",["-p",String(q),"-o","args="],{encoding:"utf8",timeout:2000});else if(process.platform==="win32")X=W("powershell",["-NoProfile","-NonInteractive","-Command",`$ErrorActionPreference='Stop'; (Get-CimInstance Win32_Process -Filter 'ProcessId=${q}' -ErrorAction Stop).CommandLine`],{encoding:"utf8",timeout:5000});else throw Error(`不支持查询 ${process.platform} 平台的进程入口`);if(!X.trim())throw Error(`PID ${q} 的命令行为空,无法核对 daemon 身份`);return X.trim()}catch(X){if(!y(q))return null;throw Error(`无法读取 PID ${q} 的命令行: ${X instanceof Error?X.message:String(X)}`,{cause:X})}}var a=new Set(["-r","--require","--import","--loader","--experimental-loader","--conditions","-C","--inspect-port","--title","--icu-data-dir","--openssl-config","--redirect-warnings","--diagnostic-dir","--report-directory","--report-filename","--env-file","--env-file-if-exists","--watch-path","--unhandled-rejections","--max-old-space-size","--max-semi-space-size","--stack-size"]),n=new Set(["--enable-source-maps","--no-warnings","--trace-warnings","--trace-uncaught","--preserve-symlinks","--preserve-symlinks-main","--inspect","--inspect-brk","--watch","--watch-preserve-output","--experimental-strip-types","--experimental-transform-types"]),d=new Set(["--preload","--cwd","--config","-c","--env-file","--tsconfig-override"]),r=new Set(["--hot","--watch","--smol","--no-clear-screen","--silent","--bun","--no-install"]);function i(q){let X=q[0]?.replace(/\\/g,"/").split("/").pop()?.toLowerCase();if(!X||!/^(?:node|nodejs|bun)(?:\.exe)?$/.test(X))return null;let H=X.startsWith("bun"),Z=H?d:a,Q=H?r:n,G=!1,$=1;while($<q.length){let K=q[$];if(/^-[ep]/.test(K)||K==="--eval"||K==="--print"||/^(?:--eval|--print)=/.test(K))return null;if(!H&&(K==="-c"||K==="--check"||K==="--run"||K.startsWith("--run=")))return null;if(K==="--")return $+1;if(!K.startsWith("-")){if(H&&!G&&K==="run"){G=!0,$++;continue}return $}let V=K.split("=")[0];if(Z.has(V))$+=K.includes("=")?1:2;else if(Q.has(V))$++;else throw Error(`无法安全核对 daemon 入口: 未识别的 ${X} 选项 ${K}`)}return null}function e(q){if(process.platform==="linux")return s(`/proc/${q}/cwd`);if(process.platform==="darwin"){let H=W("lsof",["-a","-p",String(q),"-d","cwd","-Fn"],{encoding:"utf8",timeout:2000}).split(`
|
|
3
|
+
`).find((Z)=>Z.startsWith("n"))?.slice(1);if(H)return H}throw Error(`无法确定 PID ${q} 的工作目录,不能核对相对 daemon 入口`)}function P(q,X){if(!Number.isSafeInteger(q)||q<=0||q>2147483647||!X)return!1;let H=o(q);if(H===null)return!1;let Z=process.platform==="linux"?H.split("\x00").filter(Boolean):(H.match(/"[^"]*"|'[^']*'|\S+/g)??[]).map(($)=>$.replace(/^(?:"(.*)"|'(.*)')$/,"$1$2")),Q=i(Z);if(Q===null||!Z[Q])return!1;let G=Z[Q];if(process.platform==="win32"){if(!M.isAbsolute(G))throw Error(`PID ${q} 使用相对入口,无法安全核对 daemon 身份`);return M.normalize(G).toLowerCase()===M.normalize(X).toLowerCase()}if(process.platform==="darwin"&&X.startsWith(`${G} `))throw Error(`PID ${q} 的入口包含无法区分的空格,不能安全核对 daemon 身份`);if(!p(G))G=U(e(q),G);return U(G)===U(X)}var Y={reset:"\x1B[0m",bold:"\x1B[1m",green:"\x1B[32m",yellow:"\x1B[33m",red:"\x1B[31m",dim:"\x1B[2m"};function zq(q){return new Promise((X)=>setTimeout(X,q))}async function Hq(){let q;try{q=Xq(L,"utf8")}catch(Q){if(Q.code!=="ENOENT")throw Q;console.log(`${Y.yellow}Lodestar daemon 未运行${Y.reset} ${Y.dim}(${L} 不存在)${Y.reset}`);return}let X=q.split(`
|
|
4
|
+
`),H=u(X[0]??""),Z=(X[1]??"").trim();if(H===null)throw Error(`PID 文件格式坏: ${L}`);if(!Z)throw Error(`旧 PID 文件没有 daemon 入口标识,拒绝发送停止信号。请核对 PID ${H} 的完整命令行后手动停止: ${L}`);if(!P(H,Z)){console.log(`${Y.yellow}PID ${H} 上没有 daemon (stale 文件)${Y.reset}`),console.log(`${Y.dim}手删 ${L} 后再试${Y.reset}`);return}console.log(`${Y.bold}停止 daemon${Y.reset} (pid ${H})...`);try{if(process.platform==="win32")qq("taskkill",["/PID",String(H),"/T","/F"],{stdio:"pipe"});else process.kill(H,"SIGTERM")}catch(Q){console.error(`${Y.red}发信号失败:${Y.reset} ${Q?.message??Q}`),process.exit(1)}for(let Q=0;Q<50;Q++){if(!P(H,Z)){console.log(`${Y.green}✓ daemon 已停${Y.reset}`);return}await zq(100)}throw Error(`已发送停止请求,但 5s 内 PID ${H} 的 daemon 仍未退出,可能还在收尾;请检查日志`)}Hq().catch((q)=>{console.error(`${Y.red}lodestar-stop:${Y.reset} ${q?.message??q}`),process.exit(1)});
|