@leviyuan/lodestar 0.14.0 → 0.14.1
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.js +2 -2
- package/package.json +1 -1
package/dist/lodestar.js
CHANGED
|
@@ -120,7 +120,7 @@ ${z.join(`
|
|
|
120
120
|
app_secret = "xxx"
|
|
121
121
|
|
|
122
122
|
`),j}let Z=_40(x),Q=Z.feishu?.app_id,J=Z.feishu?.app_secret;if(!Q||!J)throw Error(`lodestar: ${N8} is missing [feishu].app_id / [feishu].app_secret`);let X=jT(Z.runtime?.projects_root??IT()),z=(Z.runtime?.live_elapsed??"bucket").trim().toLowerCase();if(z!=="bucket"&&z!=="second")throw Error(`lodestar: [runtime].live_elapsed must be "bucket" or "second", got "${Z.runtime?.live_elapsed}"`);let Y=z,G=Z.notify?.bind??"127.0.0.1",K=Z.notify?.port??"9876",H=Number.parseInt(K,10);if(!Number.isFinite(H)||H<=0||H>65535)throw Error(`lodestar: [notify].port must be 1..65535, got "${K}"`);let W=(j)=>{let c=Z[j]??{},I={};for(let[P,f]of Object.entries(c))if(typeof f==="string"&&f.length>0)I[P]=f;return I},$=()=>{let j={};for(let[c,I]of Object.entries(Z)){if(!c.startsWith("claude.models."))continue;let f=c.slice(14).trim();if(!f)continue;let g={};for(let[T,E]of Object.entries(I)){if(typeof E!=="string"||E.length===0)continue;let u=T.trim();if(u==="display_name"||u==="description"||u==="model")g[u]=E}j[f]=g}return j},N=()=>{let j={},c="projects.";for(let[I,P]of Object.entries(Z)){if(!I.startsWith("projects."))continue;let f=I.slice(9).trim();if(!f)continue;let g={};for(let[T,E]of Object.entries(P)){if(typeof E!=="string"||E.length===0)continue;switch(T.trim()){case"cwd":g.cwd=E;break;case"setting_sources":g.settingSources=E;break;case"strict_mcp":g.strictMcp=E==="true";break;case"tools":g.tools=E;break;case"load_project_mcp":g.loadProjectMcp=E==="true";break}}j[f]=g}return j},D=()=>{let j={},c="token_source.";for(let[I,P]of Object.entries(Z)){if(!I.startsWith("token_source."))continue;let f=I.slice(13).trim();if(!f)continue;let g={};for(let[T,E]of Object.entries(P)){if(typeof E!=="string"||E.length===0)continue;let u=T.trim();if(u==="default")g.default=E==="true";else if(u==="agent"||u==="display"||u==="auth"||u==="base_url"||u==="auth_token"||u==="api_key"||u==="bin"||u==="model"||u==="effort"||u==="models"||u==="slots"||u==="usage")g[u]=E}j[f]=g}return j},O=W("codex.env"),v=W("claude.env"),B=Z.claude?.bin?jT(Z.claude.bin):void 0;return{feishu:{app_id:Q,app_secret:J},runtime:{projects_root:X,live_elapsed:Y},notify:{bind:G,port:H},codex:{env:O},claude:{bin:B,env:v,models:$()},projects:N(),token_sources:D()}}function cT(){a0.token_sources=TT().token_sources}var a0;var E8=M0(()=>{B4();a0=TT()});import{appendFileSync as AT,mkdirSync as l40,readdirSync as n40,unlinkSync as bT,existsSync as qT,statSync as d40,renameSync as i40,readFileSync as p40}from"node:fs";import{join as kT}from"node:path";function cH(x="development"){return x!=="test"}function PT(x){let Z=x.getFullYear(),Q=String(x.getMonth()+1).padStart(2,"0"),J=String(x.getDate()).padStart(2,"0");return`${Z}-${Q}-${J}`}function gT(x,Z=N1){return kT(Z,`${IH}${PT(x)}${TH}`)}function o40(x){if(!x.startsWith(IH)||!x.endsWith(TH))return null;let Z=x.slice(IH.length,x.length-TH.length),Q=/^(\d{4})-(\d{2})-(\d{2})$/.exec(Z);if(!Q)return null;let J=new Date(Number(Q[1]),Number(Q[2])-1,Number(Q[3]));return Number.isNaN(J.getTime())?null:J}function wT(x,Z=new Date,Q=s40){let J;try{J=n40(x)}catch{return 0}let X=new Date(Z.getFullYear(),Z.getMonth(),Z.getDate()),z=0;for(let Y of J){let G=o40(Y);if(!G)continue;if(Math.round((X.getTime()-G.getTime())/86400000)<Q)continue;try{bT(kT(x,Y)),z++}catch{}}return z}function r40(x=new Date){try{if(!qT(Z5))return;let Z=d40(Z5);if(!Z.isFile()||Z.size===0)return;let Q=gT(Z.mtime);if(qT(Q)){AT(Q,p40(Z5)),bT(Z5);return}i40(Z5,Q)}catch{}}function b(x){let Z=new Date,Q=`[${Z.toISOString()}] ${x}
|
|
123
|
-
`;if(process.stderr.write(Q),!cH())return;try{let J=PT(Z);if(ET!==J)ET=J,wT(N1,Z);AT(gT(Z),Q)}catch{}}var s40=7,IH="daemon-",TH=".log",ET=null;var J1=M0(()=>{B4();if(cH())try{l40(N1,{recursive:!0})}catch{}if(cH()){try{r40()}catch{}try{wT(N1)}catch{}}});function i1(x){return typeof x==="string"&&x?x:void 0}function z1(x){return x!=null&&typeof x==="object"?x:null}function q6(x){if(x==null||x==="")return"-";return String(x).replace(/\s+/g," ").slice(0,300)}function WJ(x){if(!x)return"[]";let Z=Object.keys(x),Q=Z.slice(0,80),J=Z.length>Q.length?`,...+${Z.length-Q.length}`:"";return`[${Q.join(",")}${J}]`}function e40(x){let Z=x.slice(0,AH),Q=x.length>Z.length?`,...+${x.length-Z.length}`:"";return`[${Z.join(",")}${Q}]`}function a40(x){let Z=z1(x);if(!Z)return null;let Q=z1(Z.event),J=z1(Z.payload);return z1(Z.item)??z1(Z.responseItem)??z1(Z.rawItem)??z1(Q?.item)??z1(Q?.responseItem)??z1(Q?.rawItem)??z1(J?.item)??z1(J?.responseItem)??z1(J?.rawItem)??(Q2(Z.type)?Z:null)??(Q&&Q2(Q.type)?Q:null)??(J&&Q2(J.type)?J:null)}function x60(x){let Z=[],Q=new WeakSet,J=(X,z,Y)=>{if(Z.length>=AH||Y>6)return;if(Array.isArray(X)){if(z)Z.push(`${z}[]`);if(X.length>0)J(X[0],z?`${z}[]`:"[]",Y+1);return}if(X==null||typeof X!=="object")return;if(Q.has(X))return;Q.add(X);for(let G of Object.keys(X)){if(Z.length>=AH)return;let K=z?`${z}.${G}`:G;Z.push(K),J(X[G],K,Y+1)}};return J(x,"",0),Z}function bH(x){let Z=new WeakSet,Q;try{Q=JSON.stringify(x,(J,X)=>{if(typeof X==="bigint")return`${X.toString()}n`;if(typeof X==="string"&&X.length>EH)return`${X.slice(0,EH)}...<truncated ${X.length-EH} chars>`;if(X!=null&&typeof X==="object"){if(Z.has(X))return"[Circular]";Z.add(X)}return X})??String(x)}catch(J){Q=`<unserializable: ${J}>`}if(Q.length>qH)return`${Q.slice(0,qH)}...<truncated ${Q.length-qH} chars>`;return Q}function a4(x,Z){let Q=z1(Z),J=Q?z1(Q.params):null,X=Q?z1(Q.item)??z1(J?.item):null,z=Q?i1(Q.method)??"-":"-";b([`codex-process: APP_SERVER_UNHANDLED_${x}`,`method=${q6(z)}`,`rootKeys=${WJ(Q)}`,`itemKeys=${WJ(X)}`,`payload=${bH(Z)}`].join(" "))}function kH(x,Z,Q){let J=z1(Z),X=a40(Z),z=[`phase=${q6(Q.phase??"event")}`,`method=${q6(x)}`,`sourceMethod=${q6(Q.sourceMethod)}`,`sourceType=${q6(Q.sourceType)}`,`sessionId=${q6(Q.sessionId)}`,`threadId=${q6(Q.threadId)}`,`turnId=${q6(Q.turnId)}`,`itemId=${q6(Q.itemId)}`].join(" ");if(b(`codex-process: CONTEXT_COMPACTION_EVENT ${z} rootKeys=${WJ(J)} itemKeys=${WJ(X)}`),b(`codex-process: CONTEXT_COMPACTION_PATHS ${z} paths=${e40(x60(Z))}`),X)b(`codex-process: CONTEXT_COMPACTION_ITEM ${z} item=${bH(X)}`);b(`codex-process: CONTEXT_COMPACTION_PAYLOAD ${z} payload=${bH(Z)}`)}function Q2(x){if(typeof x!=="string")return null;return t40.has(x)?x:null}function Y60(x,Z){if(Z==="item/started")return"start";if(Z==="item/completed"||Z==="rawResponseItem/completed")return"end";if(x==="compacted")return"start";if(x==="context_compacted"||uT.has(Z))return"end";return"event"}function PH(x,Z){return fT(x,z1(Z)??{})}function gH(x){let Z=z1(x);if(!Z)return null;let Q=i1(Z.method)??i1(Z.type)??"raw_message";return fT(Q,Z)}function fT(x,Z){let Q=z1(Z.payload),J=[Z,z1(Z.event),Q,z1(Z.item),z1(Z.responseItem),z1(Z.rawItem)].filter((K)=>K!=null),X=null;for(let K of J)if(X=Q2(K.type),X)break;if(!uT.has(x)&&!X)return null;let z=z1(Z.item)??z1(Z.responseItem)??z1(Z.rawItem),Y=X==="compacted"&&Q?Q:z&&Q2(z.type)?z:Z,G=z1(Y.item)??z1(Y.responseItem)??z1(Y.rawItem)??z??{};return{...Y,threadId:i1(Y.threadId)??i1(Y.thread_id)??i1(Z.threadId)??i1(Z.thread_id),turnId:i1(Y.turnId)??i1(Y.turn_id)??i1(Z.turnId)??i1(Z.turn_id),itemId:i1(Y.itemId)??i1(Y.item_id)??i1(G.id)??i1(G.itemId)??i1(G.item_id),timestamp:i1(Z.timestamp)??i1(Y.timestamp),recordType:i1(Z.type),phase:Y60(X,x),sourceMethod:x,sourceType:X??x}}var uT,t40,qH=200000,EH=50000,AH=400;var wH=M0(()=>{J1();uT=new Set(["thread/compacted","context/compacted","context_compacted","contextCompacted"]),t40=new Set(["compacted","compaction","compaction_trigger","context_compacted","context_compaction","contextCompaction","ContextCompaction"])});function J2(x){return x!=null&&typeof x==="object"?x:null}function E6(x){return typeof x==="number"&&Number.isFinite(x)?x:void 0}function yT(x){return Object.values(x).some((Z)=>typeof Z==="number"&&Number.isFinite(Z))}function KJ(x,Z){return x?E6(x[Z]):void 0}function m5(x){let Z=J2(x);if(!Z)return null;let Q=J2(Z.inputTokensDetails)??J2(Z.input_tokens_details),J=J2(Z.outputTokensDetails)??J2(Z.output_tokens_details),X={total_tokens:E6(Z.totalTokens??Z.total_tokens),input_tokens:E6(Z.inputTokens??Z.input_tokens),output_tokens:E6(Z.outputTokens??Z.output_tokens),reasoning_output_tokens:E6(Z.reasoningOutputTokens??Z.reasoning_output_tokens??KJ(J,"reasoningTokens")??KJ(J,"reasoning_tokens")),cache_creation_input_tokens:E6(Z.cacheCreationInputTokens??Z.cache_creation_input_tokens),cache_read_input_tokens:E6(Z.cachedInputTokens??Z.cached_input_tokens??Z.cacheReadInputTokens??Z.cache_read_input_tokens??KJ(Q,"cachedTokens")??KJ(Q,"cached_tokens"))};return yT(X)?X:null}function uH(x,Z){let Q=(X)=>{let z=E6(x?.[X]),Y=E6(Z?.[X]);if(z===void 0&&Y===void 0)return;return Math.max(0,(z??0)-(Y??0))},J={total_tokens:Q("total_tokens"),input_tokens:Q("input_tokens"),output_tokens:Q("output_tokens"),reasoning_output_tokens:Q("reasoning_output_tokens"),cache_creation_input_tokens:Q("cache_creation_input_tokens"),cache_read_input_tokens:Q("cache_read_input_tokens")};return yT(J)?J:null}function fH(x){if(!x)return null;if(typeof x.input_tokens==="number"||typeof x.cache_creation_input_tokens==="number"||typeof x.output_tokens==="number")return(x.input_tokens??0)+(x.cache_creation_input_tokens??0)+(x.output_tokens??0);return typeof x.total_tokens==="number"&&Number.isFinite(x.total_tokens)?x.total_tokens:null}import{spawn as Z60}from"node:child_process";import{existsSync as VJ,mkdirSync as Q60,readdirSync as J60,readFileSync as X60,statSync as yH,writeFileSync as z60}from"node:fs";import{homedir as H7}from"node:os";import{delimiter as lT,isAbsolute as W60,join as c4}from"node:path";import{EventEmitter as K60}from"node:events";function A6(){if(process.platform!=="win32"){let x=c4(H7(),".local","npm-global","bin","codex");if(VJ(x))return x;let Z=c4(H7(),".local","bin","codex");if(VJ(Z))return Z}return V60()??"codex"}function V60(){let x=process.env.PATH??"";if(!x)return null;let Z=process.platform==="win32"?["codex.cmd","codex.bat","codex.exe","codex"]:["codex"];for(let Q of x.split(lT)){if(!Q)continue;for(let J of Z){let X=c4(Q,J);if(VJ(X))return X}}return null}function H60(){if(process.platform==="win32")return process.env.PATH??"";return[c4(H7(),".local","npm-global","bin"),c4(H7(),".local","bin"),c4(H7(),".bun","bin"),"/usr/local/bin","/usr/bin","/bin"].join(lT)}function x6(x){return typeof x==="string"&&$60.includes(x)}function F60(x){if(!Array.isArray(x))return[];let Z=new Set,Q=[];for(let J of x){let X=typeof J==="string"?J:typeof J==="object"&&J?J.reasoningEffort:null;if(!x6(X)||Z.has(X))continue;Z.add(X);let z=typeof J==="object"&&J&&typeof J.description==="string"?J.description:"";Q.push({reasoningEffort:X,description:z})}return Q}function U60(x,Z){switch(x.type){case"commandExecution":return{name:"Bash",input:{command:x.command,cwd:x.cwd,source:x.source}};case"fileChange":return{name:"FileChange",input:{changes:x.changes,status:x.status,cwd:Z}};case"mcpToolCall":return{name:"MCP",input:{server:x.server,tool:x.tool,arguments:x.arguments}};case"dynamicToolCall":return{name:x.namespace?`${x.namespace}.${x.tool}`:x.tool,input:x.arguments};case"webSearch":return{name:"WebSearch",input:{query:x.query,action:x.action}};case"imageGeneration":return{name:"ImageGeneration",input:{status:x.status,revisedPrompt:nT(x)}};case"collabAgentToolCall":return{name:"Agent",input:{tool:x.tool,prompt:x.prompt,model:x.model}}}return null}function nT(x){let Z=x?.revisedPrompt??x?.revised_prompt;return typeof Z==="string"&&Z?Z:void 0}function mT(x){if(!x||!VJ(hT))return null;let Z=null,Q=[hT];while(Q.length){let J=Q.pop(),X;try{X=J60(J,{withFileTypes:!0})}catch(z){b(`codex-process: cannot scan Codex session dir ${J}: ${z instanceof Error?z.message:z}`);continue}for(let z of X){let Y=c4(J,z.name);if(z.isDirectory()){Q.push(Y);continue}if(!z.isFile())continue;if(!z.name.startsWith("rollout-")||!z.name.endsWith(`${x}.jsonl`))continue;try{let G=yH(Y).mtimeMs;if(!Z||G>Z.mtimeMs)Z={path:Y,mtimeMs:G}}catch(G){b(`codex-process: cannot stat Codex rollout ${Y}: ${G instanceof Error?G.message:G}`)}}}return Z?.path??null}function dT(x,Z,Q=G60){let J=x?.savedPath??x?.saved_path;if(typeof J==="string"&&J)return J;let X=x?.result;if(typeof X==="string"){let z=L60(x,Z,Q);if(z)return z;if(X.length>2048){let Y=iT(x);return b(`codex-process: image generation inline result could not be decoded id=${Y} length=${X.length}`),`Image generation returned ${X.length} chars of inline data, but Lodestar could not materialize it as an image file.`}return X}if(X&&typeof X==="object"){let z=X.savedPath??X.saved_path??X.path;if(typeof z==="string"&&z)return z;return JSON.stringify(X,null,2)}return""}function L60(x,Z,Q){let J=x?.result;if(typeof J!=="string")return null;let X=N60(J);if(!X)return null;let z=_T(Z??"unknown-thread"),Y=_T(iT(x)),G=c4(Q,z),K=c4(G,`${Y}.${X.ext}`);try{return Q60(G,{recursive:!0}),z60(K,X.buffer),K}catch(H){return b(`codex-process: failed to write image generation result ${K}: ${H instanceof Error?H.message:H}`),null}}function iT(x){let Z=x?.callId??x?.call_id??x?.id;return typeof Z==="string"&&Z?Z:`image-${Date.now()}`}function _T(x){let Z=x.trim().replace(/[^a-zA-Z0-9_.-]/g,"_").replace(/^_+|_+$/g,"");return Z?Z.slice(0,140):"unknown"}function N60(x){let Z=x.trim(),Q=Z,J=null,X=Z.match(/^data:image\/([a-zA-Z0-9.+-]+);base64,(.*)$/s);if(X)J=O60(X[1]),Q=X[2];else{if(Z.length<64)return null;if(!/^[a-zA-Z0-9+/=_\-\s]+$/.test(Z))return null}if(Q=Q.replace(/\s+/g,"").replace(/-/g,"+").replace(/_/g,"/"),!Q||Q.length%4===1)return null;let z=Q.padEnd(Math.ceil(Q.length/4)*4,"="),Y;try{Y=Buffer.from(z,"base64")}catch{return null}if(Y.length<12)return null;let G=D60(Y)??J;if(!G)return null;return{buffer:Y,ext:G}}function D60(x){if(x[0]===137&&x[1]===80&&x[2]===78&&x[3]===71&&x[4]===13&&x[5]===10&&x[6]===26&&x[7]===10)return"png";if(x[0]===255&&x[1]===216&&x[2]===255)return"jpg";let Z=x.subarray(0,6).toString("ascii");if(Z==="GIF87a"||Z==="GIF89a")return"gif";if(x.subarray(0,4).toString("ascii")==="RIFF"&&x.subarray(8,12).toString("ascii")==="WEBP")return"webp";return null}function O60(x){let Z=x.toLowerCase();if(Z==="jpeg"||Z==="jpg")return"jpg";if(Z==="png")return"png";if(Z==="gif")return"gif";if(Z==="webp")return"webp";return null}function B60(x,Z){switch(x.type){case"commandExecution":return{output:x.aggregatedOutput??"",isError:x.exitCode!=null&&x.exitCode!==0};case"fileChange":return{output:JSON.stringify(x.changes??[],null,2),isError:x.status==="failed"};case"mcpToolCall":return{output:x.error?JSON.stringify(x.error,null,2):JSON.stringify(x.result??null,null,2),isError:!!x.error};case"dynamicToolCall":return{output:JSON.stringify(x.contentItems??[],null,2),isError:x.success===!1};case"webSearch":return{output:JSON.stringify(x.action??{},null,2),isError:!1};case"imageGeneration":return{output:dT(x,Z),isError:x.status==="failed"};case"collabAgentToolCall":return{output:JSON.stringify(x.agentsStates??{},null,2),isError:x.status==="failed"}}return null}var hT,G60,$60,X2="xhigh",hH;var _5=M0(()=>{E8();J1();wH();wH();hT=c4(H7(),".codex","sessions"),G60=c4(H7(),".codex","generated_images"),$60=["none","minimal","low","medium","high","xhigh"];hH=class hH extends K60{provider="codex";tokenSourceId;proc;stdoutBuf="";stderrBuf="";requestCounter=0;pending=new Map;serverRequests=new Map;alive=!0;expectedExit=!1;opts;readyPromise=null;catalogInitPromise=null;currentTurnId=null;rolloutFilePath=null;rolloutReadOffset=0;emittedImageGenerationIds=new Set;sessionId=null;lastAssistantUuid=null;lastModel=null;lastEffort=null;lastUsage=null;lastTotalUsage=null;lastResult={cost_usd:null,cost_delta_usd:null,duration_ms:null,num_turns:null,usage:null,subtype:null,is_error:!1};lastContextWindow=null;lastContextTokens=null;constructor(x){super();this.on("error",()=>{}),this.opts=x,this.tokenSourceId=x.tokenSourceId??null;let Z=A6(),Q=["app-server","--listen","stdio://"];b(`codex-process: spawn ${Z} app-server (cwd=${x.workDir})`);let J={...process.env,NPM_CONFIG_LOGLEVEL:"error",PATH:H60(),...a0.codex.env};this.proc=Z60(Z,Q,{cwd:x.workDir,stdio:["pipe","pipe","pipe"],shell:process.platform==="win32",env:x.transformEnv?x.transformEnv(J):J}),this.proc.stdout.on("data",(X)=>this.onStdout(X)),this.proc.stderr.on("data",(X)=>this.onStderr(X)),this.proc.on("exit",(X,z)=>{this.alive=!1;for(let[Y,G]of this.pending)G.reject(Error(`codex app-server exited before ${G.method} response (id=${Y})`));this.pending.clear(),b(`codex-process: exited code=${X} signal=${z} expected=${this.expectedExit}`),this.emit("exit",{code:X,signal:z,expected:this.expectedExit})}),this.proc.on("error",(X)=>{b(`codex-process: spawn error: ${X}`),this.emit("error",X)})}onStdout(x){this.stdoutBuf+=x.toString();let Z;while((Z=this.stdoutBuf.indexOf(`
|
|
123
|
+
`;if(process.stderr.write(Q),!cH())return;try{let J=PT(Z);if(ET!==J)ET=J,wT(N1,Z);AT(gT(Z),Q)}catch{}}var s40=7,IH="daemon-",TH=".log",ET=null;var J1=M0(()=>{B4();if(cH())try{l40(N1,{recursive:!0})}catch{}if(cH()){try{r40()}catch{}try{wT(N1)}catch{}}});function i1(x){return typeof x==="string"&&x?x:void 0}function z1(x){return x!=null&&typeof x==="object"?x:null}function q6(x){if(x==null||x==="")return"-";return String(x).replace(/\s+/g," ").slice(0,300)}function WJ(x){if(!x)return"[]";let Z=Object.keys(x),Q=Z.slice(0,80),J=Z.length>Q.length?`,...+${Z.length-Q.length}`:"";return`[${Q.join(",")}${J}]`}function e40(x){let Z=x.slice(0,AH),Q=x.length>Z.length?`,...+${x.length-Z.length}`:"";return`[${Z.join(",")}${Q}]`}function a40(x){let Z=z1(x);if(!Z)return null;let Q=z1(Z.event),J=z1(Z.payload);return z1(Z.item)??z1(Z.responseItem)??z1(Z.rawItem)??z1(Q?.item)??z1(Q?.responseItem)??z1(Q?.rawItem)??z1(J?.item)??z1(J?.responseItem)??z1(J?.rawItem)??(Q2(Z.type)?Z:null)??(Q&&Q2(Q.type)?Q:null)??(J&&Q2(J.type)?J:null)}function x60(x){let Z=[],Q=new WeakSet,J=(X,z,Y)=>{if(Z.length>=AH||Y>6)return;if(Array.isArray(X)){if(z)Z.push(`${z}[]`);if(X.length>0)J(X[0],z?`${z}[]`:"[]",Y+1);return}if(X==null||typeof X!=="object")return;if(Q.has(X))return;Q.add(X);for(let G of Object.keys(X)){if(Z.length>=AH)return;let K=z?`${z}.${G}`:G;Z.push(K),J(X[G],K,Y+1)}};return J(x,"",0),Z}function bH(x){let Z=new WeakSet,Q;try{Q=JSON.stringify(x,(J,X)=>{if(typeof X==="bigint")return`${X.toString()}n`;if(typeof X==="string"&&X.length>EH)return`${X.slice(0,EH)}...<truncated ${X.length-EH} chars>`;if(X!=null&&typeof X==="object"){if(Z.has(X))return"[Circular]";Z.add(X)}return X})??String(x)}catch(J){Q=`<unserializable: ${J}>`}if(Q.length>qH)return`${Q.slice(0,qH)}...<truncated ${Q.length-qH} chars>`;return Q}function a4(x,Z){let Q=z1(Z),J=Q?z1(Q.params):null,X=Q?z1(Q.item)??z1(J?.item):null,z=Q?i1(Q.method)??"-":"-";b([`codex-process: APP_SERVER_UNHANDLED_${x}`,`method=${q6(z)}`,`rootKeys=${WJ(Q)}`,`itemKeys=${WJ(X)}`,`payload=${bH(Z)}`].join(" "))}function kH(x,Z,Q){let J=z1(Z),X=a40(Z),z=[`phase=${q6(Q.phase??"event")}`,`method=${q6(x)}`,`sourceMethod=${q6(Q.sourceMethod)}`,`sourceType=${q6(Q.sourceType)}`,`sessionId=${q6(Q.sessionId)}`,`threadId=${q6(Q.threadId)}`,`turnId=${q6(Q.turnId)}`,`itemId=${q6(Q.itemId)}`].join(" ");if(b(`codex-process: CONTEXT_COMPACTION_EVENT ${z} rootKeys=${WJ(J)} itemKeys=${WJ(X)}`),b(`codex-process: CONTEXT_COMPACTION_PATHS ${z} paths=${e40(x60(Z))}`),X)b(`codex-process: CONTEXT_COMPACTION_ITEM ${z} item=${bH(X)}`);b(`codex-process: CONTEXT_COMPACTION_PAYLOAD ${z} payload=${bH(Z)}`)}function Q2(x){if(typeof x!=="string")return null;return t40.has(x)?x:null}function Y60(x,Z){if(Z==="item/started")return"start";if(Z==="item/completed"||Z==="rawResponseItem/completed")return"end";if(x==="compacted")return"start";if(x==="context_compacted"||uT.has(Z))return"end";return"event"}function PH(x,Z){return fT(x,z1(Z)??{})}function gH(x){let Z=z1(x);if(!Z)return null;let Q=i1(Z.method)??i1(Z.type)??"raw_message";return fT(Q,Z)}function fT(x,Z){let Q=z1(Z.payload),J=[Z,z1(Z.event),Q,z1(Z.item),z1(Z.responseItem),z1(Z.rawItem)].filter((K)=>K!=null),X=null;for(let K of J)if(X=Q2(K.type),X)break;if(!uT.has(x)&&!X)return null;let z=z1(Z.item)??z1(Z.responseItem)??z1(Z.rawItem),Y=X==="compacted"&&Q?Q:z&&Q2(z.type)?z:Z,G=z1(Y.item)??z1(Y.responseItem)??z1(Y.rawItem)??z??{};return{...Y,threadId:i1(Y.threadId)??i1(Y.thread_id)??i1(Z.threadId)??i1(Z.thread_id),turnId:i1(Y.turnId)??i1(Y.turn_id)??i1(Z.turnId)??i1(Z.turn_id),itemId:i1(Y.itemId)??i1(Y.item_id)??i1(G.id)??i1(G.itemId)??i1(G.item_id),timestamp:i1(Z.timestamp)??i1(Y.timestamp),recordType:i1(Z.type),phase:Y60(X,x),sourceMethod:x,sourceType:X??x}}var uT,t40,qH=200000,EH=50000,AH=400;var wH=M0(()=>{J1();uT=new Set(["thread/compacted","context/compacted","context_compacted","contextCompacted"]),t40=new Set(["compacted","compaction","compaction_trigger","context_compacted","context_compaction","contextCompaction","ContextCompaction"])});function J2(x){return x!=null&&typeof x==="object"?x:null}function E6(x){return typeof x==="number"&&Number.isFinite(x)?x:void 0}function yT(x){return Object.values(x).some((Z)=>typeof Z==="number"&&Number.isFinite(Z))}function KJ(x,Z){return x?E6(x[Z]):void 0}function m5(x){let Z=J2(x);if(!Z)return null;let Q=J2(Z.inputTokensDetails)??J2(Z.input_tokens_details),J=J2(Z.outputTokensDetails)??J2(Z.output_tokens_details),X={total_tokens:E6(Z.totalTokens??Z.total_tokens),input_tokens:E6(Z.inputTokens??Z.input_tokens),output_tokens:E6(Z.outputTokens??Z.output_tokens),reasoning_output_tokens:E6(Z.reasoningOutputTokens??Z.reasoning_output_tokens??KJ(J,"reasoningTokens")??KJ(J,"reasoning_tokens")),cache_creation_input_tokens:E6(Z.cacheCreationInputTokens??Z.cache_creation_input_tokens),cache_read_input_tokens:E6(Z.cachedInputTokens??Z.cached_input_tokens??Z.cacheReadInputTokens??Z.cache_read_input_tokens??KJ(Q,"cachedTokens")??KJ(Q,"cached_tokens"))};return yT(X)?X:null}function uH(x,Z){let Q=(X)=>{let z=E6(x?.[X]),Y=E6(Z?.[X]);if(z===void 0&&Y===void 0)return;return Math.max(0,(z??0)-(Y??0))},J={total_tokens:Q("total_tokens"),input_tokens:Q("input_tokens"),output_tokens:Q("output_tokens"),reasoning_output_tokens:Q("reasoning_output_tokens"),cache_creation_input_tokens:Q("cache_creation_input_tokens"),cache_read_input_tokens:Q("cache_read_input_tokens")};return yT(J)?J:null}function fH(x){if(!x)return null;if(typeof x.input_tokens==="number"||typeof x.cache_creation_input_tokens==="number"||typeof x.output_tokens==="number")return(x.input_tokens??0)+(x.cache_creation_input_tokens??0)+(x.output_tokens??0);return typeof x.total_tokens==="number"&&Number.isFinite(x.total_tokens)?x.total_tokens:null}import{spawn as Z60}from"node:child_process";import{existsSync as VJ,mkdirSync as Q60,readdirSync as J60,readFileSync as X60,statSync as yH,writeFileSync as z60}from"node:fs";import{homedir as H7}from"node:os";import{delimiter as lT,isAbsolute as W60,join as c4}from"node:path";import{EventEmitter as K60}from"node:events";function A6(){if(process.platform!=="win32"){let x=c4(H7(),".local","npm-global","bin","codex");if(VJ(x))return x;let Z=c4(H7(),".local","bin","codex");if(VJ(Z))return Z}return V60()??"codex"}function V60(){let x=process.env.PATH??"";if(!x)return null;let Z=process.platform==="win32"?["codex.cmd","codex.bat","codex.exe","codex"]:["codex"];for(let Q of x.split(lT)){if(!Q)continue;for(let J of Z){let X=c4(Q,J);if(VJ(X))return X}}return null}function H60(){if(process.platform==="win32")return process.env.PATH??"";return[c4(H7(),".local","npm-global","bin"),c4(H7(),".local","bin"),c4(H7(),".bun","bin"),"/usr/local/bin","/usr/bin","/bin"].join(lT)}function x6(x){return typeof x==="string"&&$60.includes(x)}function F60(x){if(!Array.isArray(x))return[];let Z=new Set,Q=[];for(let J of x){let X=typeof J==="string"?J:typeof J==="object"&&J?J.reasoningEffort:null;if(!x6(X)||Z.has(X))continue;Z.add(X);let z=typeof J==="object"&&J&&typeof J.description==="string"?J.description:"";Q.push({reasoningEffort:X,description:z})}return Q}function U60(x,Z){switch(x.type){case"commandExecution":return{name:"Bash",input:{command:x.command,cwd:x.cwd,source:x.source}};case"fileChange":return{name:"FileChange",input:{changes:x.changes,status:x.status,cwd:Z}};case"mcpToolCall":return{name:"MCP",input:{server:x.server,tool:x.tool,arguments:x.arguments}};case"dynamicToolCall":return{name:x.namespace?`${x.namespace}.${x.tool}`:x.tool,input:x.arguments};case"webSearch":return{name:"WebSearch",input:{query:x.query,action:x.action}};case"imageGeneration":return{name:"ImageGeneration",input:{status:x.status,revisedPrompt:nT(x)}};case"collabAgentToolCall":return{name:"Agent",input:{tool:x.tool,prompt:x.prompt,model:x.model}}}return null}function nT(x){let Z=x?.revisedPrompt??x?.revised_prompt;return typeof Z==="string"&&Z?Z:void 0}function mT(x){if(!x||!VJ(hT))return null;let Z=null,Q=[hT];while(Q.length){let J=Q.pop(),X;try{X=J60(J,{withFileTypes:!0})}catch(z){b(`codex-process: cannot scan Codex session dir ${J}: ${z instanceof Error?z.message:z}`);continue}for(let z of X){let Y=c4(J,z.name);if(z.isDirectory()){Q.push(Y);continue}if(!z.isFile())continue;if(!z.name.startsWith("rollout-")||!z.name.endsWith(`${x}.jsonl`))continue;try{let G=yH(Y).mtimeMs;if(!Z||G>Z.mtimeMs)Z={path:Y,mtimeMs:G}}catch(G){b(`codex-process: cannot stat Codex rollout ${Y}: ${G instanceof Error?G.message:G}`)}}}return Z?.path??null}function dT(x,Z,Q=G60){let J=x?.savedPath??x?.saved_path;if(typeof J==="string"&&J)return J;let X=x?.result;if(typeof X==="string"){let z=L60(x,Z,Q);if(z)return z;if(X.length>2048){let Y=iT(x);return b(`codex-process: image generation inline result could not be decoded id=${Y} length=${X.length}`),`Image generation returned ${X.length} chars of inline data, but Lodestar could not materialize it as an image file.`}return X}if(X&&typeof X==="object"){let z=X.savedPath??X.saved_path??X.path;if(typeof z==="string"&&z)return z;return JSON.stringify(X,null,2)}return""}function L60(x,Z,Q){let J=x?.result;if(typeof J!=="string")return null;let X=N60(J);if(!X)return null;let z=_T(Z??"unknown-thread"),Y=_T(iT(x)),G=c4(Q,z),K=c4(G,`${Y}.${X.ext}`);try{return Q60(G,{recursive:!0}),z60(K,X.buffer),K}catch(H){return b(`codex-process: failed to write image generation result ${K}: ${H instanceof Error?H.message:H}`),null}}function iT(x){let Z=x?.callId??x?.call_id??x?.id;return typeof Z==="string"&&Z?Z:`image-${Date.now()}`}function _T(x){let Z=x.trim().replace(/[^a-zA-Z0-9_.-]/g,"_").replace(/^_+|_+$/g,"");return Z?Z.slice(0,140):"unknown"}function N60(x){let Z=x.trim(),Q=Z,J=null,X=Z.match(/^data:image\/([a-zA-Z0-9.+-]+);base64,(.*)$/s);if(X)J=O60(X[1]),Q=X[2];else{if(Z.length<64)return null;if(!/^[a-zA-Z0-9+/=_\-\s]+$/.test(Z))return null}if(Q=Q.replace(/\s+/g,"").replace(/-/g,"+").replace(/_/g,"/"),!Q||Q.length%4===1)return null;let z=Q.padEnd(Math.ceil(Q.length/4)*4,"="),Y;try{Y=Buffer.from(z,"base64")}catch{return null}if(Y.length<12)return null;let G=D60(Y)??J;if(!G)return null;return{buffer:Y,ext:G}}function D60(x){if(x[0]===137&&x[1]===80&&x[2]===78&&x[3]===71&&x[4]===13&&x[5]===10&&x[6]===26&&x[7]===10)return"png";if(x[0]===255&&x[1]===216&&x[2]===255)return"jpg";let Z=x.subarray(0,6).toString("ascii");if(Z==="GIF87a"||Z==="GIF89a")return"gif";if(x.subarray(0,4).toString("ascii")==="RIFF"&&x.subarray(8,12).toString("ascii")==="WEBP")return"webp";return null}function O60(x){let Z=x.toLowerCase();if(Z==="jpeg"||Z==="jpg")return"jpg";if(Z==="png")return"png";if(Z==="gif")return"gif";if(Z==="webp")return"webp";return null}function B60(x,Z){switch(x.type){case"commandExecution":return{output:x.aggregatedOutput??"",isError:x.exitCode!=null&&x.exitCode!==0};case"fileChange":return{output:JSON.stringify(x.changes??[],null,2),isError:x.status==="failed"};case"mcpToolCall":return{output:x.error?JSON.stringify(x.error,null,2):JSON.stringify(x.result??null,null,2),isError:!!x.error};case"dynamicToolCall":return{output:JSON.stringify(x.contentItems??[],null,2),isError:x.success===!1};case"webSearch":return{output:JSON.stringify(x.action??{},null,2),isError:!1};case"imageGeneration":return{output:dT(x,Z),isError:x.status==="failed"};case"collabAgentToolCall":return{output:JSON.stringify(x.agentsStates??{},null,2),isError:x.status==="failed"}}return null}var hT,G60,$60,X2="xhigh",hH;var _5=M0(()=>{E8();J1();wH();wH();hT=c4(H7(),".codex","sessions"),G60=c4(H7(),".codex","generated_images"),$60=["none","minimal","low","medium","high","xhigh","max","ultra"];hH=class hH extends K60{provider="codex";tokenSourceId;proc;stdoutBuf="";stderrBuf="";requestCounter=0;pending=new Map;serverRequests=new Map;alive=!0;expectedExit=!1;opts;readyPromise=null;catalogInitPromise=null;currentTurnId=null;rolloutFilePath=null;rolloutReadOffset=0;emittedImageGenerationIds=new Set;sessionId=null;lastAssistantUuid=null;lastModel=null;lastEffort=null;lastUsage=null;lastTotalUsage=null;lastResult={cost_usd:null,cost_delta_usd:null,duration_ms:null,num_turns:null,usage:null,subtype:null,is_error:!1};lastContextWindow=null;lastContextTokens=null;constructor(x){super();this.on("error",()=>{}),this.opts=x,this.tokenSourceId=x.tokenSourceId??null;let Z=A6(),Q=["app-server","--listen","stdio://"];b(`codex-process: spawn ${Z} app-server (cwd=${x.workDir})`);let J={...process.env,NPM_CONFIG_LOGLEVEL:"error",PATH:H60(),...a0.codex.env};this.proc=Z60(Z,Q,{cwd:x.workDir,stdio:["pipe","pipe","pipe"],shell:process.platform==="win32",env:x.transformEnv?x.transformEnv(J):J}),this.proc.stdout.on("data",(X)=>this.onStdout(X)),this.proc.stderr.on("data",(X)=>this.onStderr(X)),this.proc.on("exit",(X,z)=>{this.alive=!1;for(let[Y,G]of this.pending)G.reject(Error(`codex app-server exited before ${G.method} response (id=${Y})`));this.pending.clear(),b(`codex-process: exited code=${X} signal=${z} expected=${this.expectedExit}`),this.emit("exit",{code:X,signal:z,expected:this.expectedExit})}),this.proc.on("error",(X)=>{b(`codex-process: spawn error: ${X}`),this.emit("error",X)})}onStdout(x){this.stdoutBuf+=x.toString();let Z;while((Z=this.stdoutBuf.indexOf(`
|
|
124
124
|
`))>=0){let Q=this.stdoutBuf.slice(0,Z).trim();if(this.stdoutBuf=this.stdoutBuf.slice(Z+1),!Q)continue;try{this.handleMessage(JSON.parse(Q))}catch(J){b(`codex-process: bad json: ${Q.slice(0,200)} (${J})`)}}}onStderr(x){this.stderrBuf+=x.toString();let Z;while((Z=this.stderrBuf.indexOf(`
|
|
125
125
|
`))>=0){let Q=this.stderrBuf.slice(0,Z);if(this.stderrBuf=this.stderrBuf.slice(Z+1),Q.trim())b(`codex-process[stderr]: ${Q}`)}}handleMessage(x){if(Object.prototype.hasOwnProperty.call(x,"id")&&!x.method){let Q=this.pending.get(x.id);if(!Q){b(`codex-process: response for unknown id=${x.id}`);return}if(this.pending.delete(x.id),x.error)Q.reject(Error(typeof x.error==="string"?x.error:JSON.stringify(x.error)));else Q.resolve(x.result);return}if(Object.prototype.hasOwnProperty.call(x,"id")&&x.method){this.handleServerRequest(x);return}if(x.method){this.handleNotification(x.method,x.params??{});return}let Z=gH(x);if(Z){let Q=this.withSessionId(Z);kH(Z.sourceMethod??"raw_message",x,Q),this.emit("context_compacted",Q);return}a4("RAW_MESSAGE",x),this.emit("raw",x)}handleNotification(x,Z){let Q=PH(x,Z);if(Q){let J=this.withSessionId(Q);kH(x,Z,J),this.emit("context_compacted",J);return}switch(x){case"thread/started":{let J=Z.thread;if(J?.id)this.sessionId=J.id;return}case"thread/settings/updated":{let J=Z.threadSettings;if(typeof J?.model==="string")this.lastModel=J.model;if(x6(J?.effort))this.lastEffort=J.effort;return}case"thread/tokenUsage/updated":{let J=m5(Z.tokenUsage?.last);if(J)this.lastUsage=J,this.lastResult.usage=this.lastUsage;else b("codex-process: tokenUsage notification missing last breakdown");this.lastTotalUsage=m5(Z.tokenUsage?.total);let X=Z.tokenUsage?.modelContextWindow;if(typeof X==="number"&&X>0)this.lastContextWindow=X;this.emit("token_usage",{usage:this.lastUsage,totalUsage:this.lastTotalUsage,contextWindow:this.lastContextWindow,threadId:Z.threadId,turnId:Z.turnId});return}case"turn/started":{this.currentTurnId=Z.turn?.id??null,this.emit("turn_started",{turn_id:this.currentTurnId,thread_id:Z.threadId??this.sessionId});return}case"turn/completed":{this.flushRolloutImageGenerations();let J=Z.turn??{},z=J.status==="failed"||!!J.error,Y=z?J.error?.type??J.error?.message??"failed":"success";this.lastResult={cost_usd:null,cost_delta_usd:null,duration_ms:typeof J.durationMs==="number"?J.durationMs:null,num_turns:1,usage:this.lastUsage,subtype:Y,is_error:z},this.currentTurnId=null,this.emit("result",{subtype:Y,is_error:z,duration_ms:this.lastResult.duration_ms,usage:this.lastUsage});return}case"turn/plan/updated":{this.emit("turn_plan_updated",Z);return}case"item/plan/delta":{this.emit("plan_delta",Z);return}case"thread/goal/updated":{if(Z.goal)this.emit("thread_goal_updated",Z.goal);else b("codex-process: thread/goal/updated missing goal");return}case"thread/goal/cleared":{this.emit("thread_goal_cleared",Z);return}case"item/agentMessage/delta":{if(typeof Z.delta==="string"&&Z.delta.length>0)this.emit("assistant_text",{uuid:Z.itemId,text:Z.delta});else a4("AGENT_MESSAGE_DELTA_EMPTY",{method:x,params:Z});return}case"item/started":{this.handleItemStarted(Z);return}case"item/completed":{this.handleItemCompleted(Z);return}case"mcpServer/startupStatus/updated":{b(`codex-process: mcp ${Z.name} ${Z.status}${Z.error?`: ${Z.error}`:""}`);return}case"account/rateLimits/updated":{this.emit("rate_limits_updated",Z.rateLimits);return}case"configWarning":case"warning":case"guardianWarning":case"deprecationNotice":{b(`codex-process: ${x}: ${Z.summary??Z.message??JSON.stringify(Z).slice(0,200)}`);return}case"error":{b(`codex-process: server error: ${JSON.stringify(Z).slice(0,500)}`),this.emit("error",Error(Z.message??Z.summary??"codex app-server error"));return}}a4("NOTIFICATION",{method:x,params:Z}),this.emit("raw",{method:x,params:Z})}handleItemStarted(x){let Z=x?.item;if(!Z?.id){a4("ITEM_STARTED_MISSING_ID",{method:"item/started",params:x});return}let Q=U60(Z,this.opts.workDir);if(!Q){a4("ITEM_STARTED_UNMAPPED",{method:"item/started",params:x});return}this.emit("tool_use",{id:Z.id,name:Q.name,input:Q.input})}handleItemCompleted(x){let Z=x?.item;if(!Z?.id){a4("ITEM_COMPLETED_MISSING_ID",{method:"item/completed",params:x});return}if(Z.type==="agentMessage"){this.lastAssistantUuid=Z.id,this.emit("assistant_block_stop",{index:Z.id});return}let Q=B60(Z,this.sessionId??void 0);if(!Q){a4("ITEM_COMPLETED_UNMAPPED",{method:"item/completed",params:x});return}if(this.emit("tool_result",{tool_use_id:Z.id,content:Q.output,is_error:Q.isError}),Z.type==="imageGeneration")this.emittedImageGenerationIds.add(Z.id)}primeRolloutImageGenerationScan(){if(this.rolloutFilePath=null,this.rolloutReadOffset=0,this.emittedImageGenerationIds.clear(),!this.sessionId)return;let x=mT(this.sessionId);if(!x)return;this.rolloutFilePath=x;try{this.rolloutReadOffset=yH(x).size,b(`codex-process: image generation rollout scan primed ${x} offset=${this.rolloutReadOffset}`)}catch(Z){b(`codex-process: image generation rollout stat failed ${x}: ${Z instanceof Error?Z.message:Z}`),this.rolloutFilePath=null,this.rolloutReadOffset=0}}flushRolloutImageGenerations(){if(!this.sessionId)return;let x=this.rolloutFilePath??mT(this.sessionId);if(!x){b(`codex-process: image generation rollout file not found for thread=${this.sessionId}`);return}this.rolloutFilePath=x;let Z;try{let Q=yH(x).size;if(Q<=this.rolloutReadOffset)return;Z=X60(x).subarray(this.rolloutReadOffset,Q),this.rolloutReadOffset=Q}catch(Q){b(`codex-process: image generation rollout read failed ${x}: ${Q instanceof Error?Q.message:Q}`);return}for(let Q of Z.toString("utf8").split(/\r?\n/)){if(!Q.trim())continue;let J;try{J=JSON.parse(Q)}catch(Y){b(`codex-process: image generation rollout JSON parse failed ${x}: ${Y instanceof Error?Y.message:Y}`);continue}let X=J?.payload,z=X?.type;if(z!=="image_generation_end"&&z!=="image_generation_call")continue;this.emitRolloutImageGeneration(X)}}emitRolloutImageGeneration(x){let Z=typeof x?.call_id==="string"?x.call_id:typeof x?.id==="string"?x.id:"";if(!Z||this.emittedImageGenerationIds.has(Z))return;let Q=dT(x,this.sessionId??void 0);if(!Q)return;let J=x?.status==="failed",X=x?.status==="generating"&&W60(Q)?"completed":x?.status;this.emittedImageGenerationIds.add(Z),this.emit("tool_use",{id:Z,name:"ImageGeneration",input:{status:X,revisedPrompt:nT(x)}}),this.emit("tool_result",{tool_use_id:Z,content:Q,is_error:J})}withSessionId(x){let Z=x.sessionId??this.sessionId??void 0;return Z?{...x,sessionId:Z}:x}handleServerRequest(x){let Z=String(x.id);switch(this.serverRequests.set(Z,{id:x.id,method:x.method,params:x.params}),x.method){case"item/commandExecution/requestApproval":{let Q=x.params??{};this.emit("can_use_tool",{request_id:Z,tool_name:"Bash",input:{command:Q.command,cwd:Q.cwd,reason:Q.reason},tool_use_id:Q.itemId});return}case"item/fileChange/requestApproval":{let Q=x.params??{};this.emit("can_use_tool",{request_id:Z,tool_name:"FileChange",input:{reason:Q.reason,grantRoot:Q.grantRoot},tool_use_id:Q.itemId});return}case"item/tool/requestUserInput":{let Q=x.params??{},J={questions:(Q.questions??[]).map((X)=>({id:X.id,header:X.header,question:X.question,options:Array.isArray(X.options)&&X.options.length?X.options.map((z)=>({label:z.label,description:z.description})):[{label:"自定义回答",description:X.isSecret?"请直接在群里回复":"可直接在群里回复"}]}))};this.emit("tool_use",{id:Q.itemId,name:"AskUserQuestion",input:J}),this.emit("can_use_tool",{request_id:Z,tool_name:"AskUserQuestion",input:J,tool_use_id:Q.itemId});return}case"item/permissions/requestApproval":{let Q=x.params??{};this.emit("can_use_tool",{request_id:Z,tool_name:"PermissionProfile",input:{cwd:Q.cwd,reason:Q.reason,permissions:Q.permissions},tool_use_id:Q.itemId});return}case"item/tool/call":{let Q=x.params??{};this.emit("tool_use",{id:Q.callId,name:Q.namespace?`${Q.namespace}.${Q.tool}`:Q.tool,input:Q.arguments}),this.respond(Z,{contentItems:[{type:"inputText",text:"Lodestar does not implement this dynamic tool."}],success:!1});return}case"account/chatgptAuthTokens/refresh":case"attestation/generate":case"applyPatchApproval":case"execCommandApproval":default:a4("SERVER_REQUEST_UNSUPPORTED",x),this.respondError(Z,`unsupported server request: ${x.method}`)}}write(x){if(!this.alive){b(`codex-process: write to dead process: ${JSON.stringify(x).slice(0,200)}`);return}try{this.proc.stdin.write(JSON.stringify(x)+`
|
|
126
126
|
`)}catch(Z){b(`codex-process: stdin write failed: ${Z}`)}}request(x,Z){let Q=++this.requestCounter;return this.write({id:Q,method:x,params:Z}),new Promise((J,X)=>{this.pending.set(Q,{resolve:J,reject:X,method:x})})}respond(x,Z){let Q=String(x),J=this.serverRequests.get(Q);this.serverRequests.delete(Q),this.write({id:J?.id??x,result:Z})}respondError(x,Z){let Q=String(x),J=this.serverRequests.get(Q);this.serverRequests.delete(Q),this.write({id:J?.id??x,error:{code:-32601,message:Z}})}sendInitialize(){if(!this.readyPromise){let x=this.initializeAndStartThread();x.catch((Z)=>{b(`codex-process: initialize failed: ${Z}`),this.emit("error",Z)}),this.readyPromise=x}}initializeParams(){return{clientInfo:{name:"lodestar",version:"0.0.0"},capabilities:{experimentalApi:!0,requestAttestation:!1}}}async ensureCatalogReady(){if(this.readyPromise){await this.readyPromise;return}if(!this.catalogInitPromise)this.catalogInitPromise=this.request("initialize",this.initializeParams()).then(()=>{});await this.catalogInitPromise}async initializeAndStartThread(){await this.request("initialize",this.initializeParams());let x=this.threadParams(),Z=this.opts.resumeSessionId?await this.request("thread/resume",{threadId:this.opts.resumeSessionId,...x,excludeTurns:!0,persistExtendedHistory:!1}):await this.request("thread/start",{...x,experimentalRawEvents:!1,persistExtendedHistory:!1}),Q=Z?.thread;if(this.sessionId=Q?.id??this.opts.resumeSessionId??null,Z?.model)this.lastModel=Z.model;if(x6(Z?.reasoningEffort))this.lastEffort=Z.reasoningEffort;else this.lastEffort=this.opts.effort??null;b(`codex-process: thread=${this.sessionId}`),this.primeRolloutImageGenerationScan(),this.emit("init",{session_id:this.sessionId,thread:Q})}threadParams(){return{cwd:this.opts.workDir,runtimeWorkspaceRoots:[this.opts.workDir],approvalPolicy:"never",sandbox:"danger-full-access",config:{"features.default_mode_request_user_input":!0},...this.opts.model?{model:this.opts.model}:{},...this.opts.effort?{effort:this.opts.effort}:{},...this.opts.appendSystemPrompt?{developerInstructions:this.opts.appendSystemPrompt}:{},serviceName:"lodestar"}}sendUserText(x,Z=[]){let Q=Z.length?Z.map((J)=>`[file: ${J}]`).join(" ")+`
|
|
@@ -331,7 +331,7 @@ ${sz(k3(x.error??"unknown error"))}`;let Z=[];if(Z.push(oz(x)?"dirty":"clean"),x
|
|
|
331
331
|
`)}:{}}}function iL0(){let x=process.env.PATH??"";if(!x)return null;let Z=process.platform==="win32"?["agy.cmd","agy.bat","agy.exe","agy"]:["agy"];for(let Q of x.split(_y)){if(!Q)continue;for(let J of Z){let X=aY(Q,J);if(my(X))return X}}return null}async function WW(x,Z){return new Promise((Q)=>{let J=hy("git",Z,{cwd:x,stdio:["ignore","pipe","pipe"],shell:process.platform==="win32",env:{...process.env,PATH:VW()}}),X="",z="",Y=!1,G=setTimeout(()=>{if(Y)return;Y=!0,J.kill("SIGTERM"),Q({ok:!1,stdout:X,stderr:z,error:`git ${Z.join(" ")} timed out after 10s`})},1e4);J.stdout.on("data",(K)=>{X+=K.toString()}),J.stderr.on("data",(K)=>{z+=K.toString()}),J.on("error",(K)=>{if(Y)return;Y=!0,clearTimeout(G),Q({ok:!1,stdout:X,stderr:z,error:K.message})}),J.on("close",(K)=>{if(Y)return;Y=!0,clearTimeout(G);let H=K===0;Q({ok:H,stdout:X,stderr:z,...H?{}:{error:`git ${Z.join(" ")} exited ${K}`}})})})}var xZ="Gemini 3.1 Pro (High)",ly="180m0s",ny=10860000;var qN=()=>{};function $1(x){return x instanceof Error?x.message:String(x)}async function EN(x,Z,Q){let J=null;try{return await Promise.race([x,new Promise((X,z)=>{J=setTimeout(()=>z(Error(`${Q} timed out after ${Z/1000}s`)),Z)})])}finally{if(J)clearTimeout(J)}}import{execFileSync as pL0}from"node:child_process";import{randomUUID as sL0}from"node:crypto";import{StringDecoder as iy}from"node:string_decoder";function ry(x,Z=Date.now()){return((Z-x.startedAt)/1000).toFixed(1)}function eL0(x){let Z=x.proc.pid;if(!Z||process.platform==="win32")return{cpuPercent:x.lastCpuPercent,memBytes:x.lastMemBytes};try{let Q=pL0("ps",["-p",String(Z),"-o","%cpu=,rss="],{encoding:"utf8",timeout:2000,stdio:["ignore","pipe","ignore"]}).trim(),[J,X]=Q.split(/\s+/),z=Number.parseFloat(J??""),Y=Number.parseInt(X??"",10);if(Number.isFinite(z))x.lastCpuPercent=z;if(Number.isFinite(Y))x.lastMemBytes=Y*1024}catch{}return{cpuPercent:x.lastCpuPercent,memBytes:x.lastMemBytes}}function ty(x){let Z=[x.stderr.trim()];if(x.spawnError)Z.push(`spawn error: ${x.spawnError}`);return Z.filter(Boolean).join(`
|
|
332
332
|
`)}function ey(x,Z,Q,J,X){let z=ty(Z),Y=eL0(Z);return{status:Q,model:xZ,cwd:x.workDir,command:TN(),startedAtMs:Z.startedAt,elapsedSec:ry(Z,J??Date.now()),cpuPercent:Y.cpuPercent,memBytes:Y.memBytes,...J?{endedAtMs:J}:{},...X?{exitCode:X.code,signal:X.signal}:{},stdoutBytes:Z.stdoutBytes,stderrBytes:Z.stderrBytes,captureTruncated:Z.captureTruncated,cardTruncated:Z.stdout.length>sy||z.length>oy,hostTimedOut:Z.hostTimedOut}}function HW(x,Z,Q){Q1(Z.cardId,W0.agyStats,oY(ey(x,Z,Q)))}function AN(x,Z,Q){if(!Q)return;let J=Z==="stdout"?x.stdout:x.stderr,X=oL0-J.length;if(X<=0){x.captureTruncated=!0;return}let z=J+Q.slice(0,X);if(Z==="stdout")x.stdout=z;else x.stderr=z;if(Q.length>X)x.captureTruncated=!0}function aL0(x){if(x.decodersEnded)return;x.decodersEnded=!0;let Z=x.stdoutDecoder.end(),Q=x.stderrDecoder.end();if(Z)AN(x,"stdout",Z);if(Q)AN(x,"stderr",Q)}function py(x,Z,Q){if(Z==="stdout")x.stdoutBytes+=Q.length;else x.stderrBytes+=Q.length;let J=Z==="stdout"?x.stdoutDecoder.write(Q):x.stderrDecoder.write(Q);AN(x,Z,J)}function xN0(x,Z,Q){let J=U6(x.stdout).trim(),X=U6(Z).trim(),z=U6(Q).trim(),Y=["agy 返回结果如下,请基于这份结果继续处理。","","原始 agy 任务:",x.prompt.trim(),"","agy 结果:",J||"(无 stdout 输出)"];if(z)Y.push("","agy 状态说明:",z);if(X)Y.push("","agy stderr:",X);if(x.captureTruncated)Y.push("","注意: daemon 捕获的 agy 输出已截断。");return Y.join(`
|
|
333
333
|
`)}function YN0(x,Z,Q,J){let X=sL0();if(x.agyForwardPrompts.set(X,{prompt:xN0(Z,Q,J),used:!1}),x.agyForwardPrompts.size>20){let z=x.agyForwardPrompts.keys().next().value;if(z)x.agyForwardPrompts.delete(z)}return X}function ay(x,Z,Q=""){let J=x.backendLabel(),X=Z.trim(),z=x.agyForwardPrompts.get(X);if(!z)return{ok:!1,message:"agy 结果已过期,请重新运行 agy"};if(z.used)return{ok:!1,message:"agy 结果已转发,请勿重复点击"};if(x.startingAgy||x.runningAgy)return{ok:!1,message:"agy 任务仍在执行,请稍后再转发"};return z.used=!0,(async()=>{try{await x.onUserMessage(z.prompt,[],Q)}catch(Y){z.used=!1;let G=`❌ agy 结果转发 ${J} 失败: ${$1(Y)}`;b(`session "${x.sessionName}": ${G}`),await R1(x.chatId,G)}})(),{ok:!0,message:`已转发 ${J}`}}async function xh(x,Z){if(!Z.trim()){await V0(x.chatId,"用法: agy <任务说明>");return}if(x.startingAgy||x.runningAgy){await V0(x.chatId,"⏳ 当前已有 agy 任务在执行;请等待完成,或发送 stop 打断。");return}if(x.currentTurn||x.openingTurn||x.pendingUserMessageCount>0||x.pendingMidTurnMsgs.length>0){await V0(x.chatId,`⚠️ ${x.backendLabel()} 当前有正在执行或排队的 turn;请先发送 stop,或等待当前 turn 完成后再运行 agy。`);return}x.startingAgy=!0;let Q=Date.now();try{let J=await cN(x.workDir),X={status:"⏳ agy 运行中",model:xZ,cwd:x.workDir,command:TN(),startedAtMs:Q,elapsedSec:"0.0",stdoutBytes:0,stderrBytes:0},z=await E1(x.chatId,VN({sessionName:x.sessionName,prompt:Z,stats:X,beforeGit:J}));if(!z){await R1(x.chatId,"❌ 创建 agy 卡片失败,任务未启动。");return}let Y;try{Y=await H6(z)}catch(O){b(`session "${x.sessionName}": agy card id_convert failed: ${O}`),await R1(x.chatId,`❌ agy 卡片初始化失败,任务未启动: ${$1(O)}`);return}let G=null;y7(Y,5,(O)=>{if(G?.cardWriteFailed)return;if(G)G.cardWriteFailed=!0;let v=`❌ agy 卡片更新失败${O?` code=${O}`:""},请查看 daemon 日志。`;b(`session "${x.sessionName}": ${v}`),R1(x.chatId,v)});let{proc:K,bin:H,args:W}=dy(Z,x.workDir);b(`session "${x.sessionName}": spawn agy ${H} ${W.slice(0,-1).join(" ")} <prompt> cwd=${x.workDir}`);let $,N=new Promise((O)=>{$=O}),D;D={proc:K,cardId:Y,messageId:z,prompt:Z,startedAt:Q,beforeGit:J,stdout:"",stderr:"",stdoutDecoder:new iy("utf8"),stderrDecoder:new iy("utf8"),decodersEnded:!1,stdoutBytes:0,stderrBytes:0,lastCpuPercent:null,lastMemBytes:null,captureTruncated:!1,cardWriteFailed:!1,finished:!1,stopRequested:!1,hostTimedOut:!1,timer:setInterval(()=>HW(x,D,D.stopRequested?"\uD83D\uDED1 正在停止 agy":"⏳ agy 运行中"),tL0),hostTimeout:setTimeout(()=>{if(D.finished)return;D.hostTimedOut=!0,D.stopStatus="❌ agy 超时",HW(x,D,"❌ agy 超时,正在停止"),Yh(D)},ny),done:N,resolveDone:$},G=D,x.runningAgy=D,x.status="working",x.opts.onLifecycleChange?.(),HW(x,D,"⏳ agy 运行中"),K.stdout.on("data",(O)=>py(D,"stdout",O)),K.stderr.on("data",(O)=>py(D,"stderr",O)),K.on("error",(O)=>{D.spawnError=O.message,b(`session "${x.sessionName}": agy spawn error: ${O.message}`)}),K.on("close",(O,v)=>{ZN0(x,D,O,v)})}finally{x.startingAgy=!1}}function Yh(x){if(!x.proc.killed)x.proc.kill("SIGTERM");if(!x.forceKillTimer)x.forceKillTimer=setTimeout(()=>{if(!x.finished)x.proc.kill("SIGKILL")},rL0)}async function Zh(x,Z="\uD83D\uDED1 agy 已打断"){let Q=x.runningAgy;if(!Q)return!1;return Q.stopRequested=!0,Q.stopStatus=Z,HW(x,Q,"\uD83D\uDED1 正在停止 agy"),Yh(Q),await Q.done,!0}async function ZN0(x,Z,Q,J){if(Z.finished)return;if(Z.finished=!0,aL0(Z),clearInterval(Z.timer),clearTimeout(Z.hostTimeout),Z.forceKillTimer)clearTimeout(Z.forceKillTimer);let X="❌ agy 失败";try{let z=Date.now(),Y=await cN(x.workDir),G=ty(Z),K="",H=U6(Z.stdout).trim(),W=U6(G).trim(),$=!H&&!W;if(Q===0&&!J&&!Z.spawnError&&!Z.hostTimedOut&&!Z.stopRequested&&$)K="agy 进程退出码为 0,但没有返回 stdout/stderr。";let N=Q===0&&!J&&!Z.spawnError&&!Z.hostTimedOut&&!Z.stopRequested&&!$;X=Z.stopRequested?Z.stopStatus??"\uD83D\uDED1 agy 已打断":Z.hostTimedOut?"❌ agy 超时":N?"✅ agy 完成":"❌ agy 出错";let D=Z.stdout.length>sy||G.length>oy,O=YN0(x,Z,G,K);await f4(Z.cardId),await Q1(Z.cardId,W0.agyStats,oY(ey(x,Z,X,z,{code:Q,signal:J}))),await Q1(Z.cardId,W0.agyResult,rz({status:X,stdout:Z.stdout,stderr:G,notice:K,cardTruncated:D})),await Q1(Z.cardId,W0.agyForward,HN(O,x.backendLabel())),await Q1(Z.cardId,W0.agyRepo,tz({before:Z.beforeGit,after:Y})),S8(Z.cardId),await g8(Z.cardId,F6({durationSec:ry(Z,z),suffix:X})),await G6(Z.cardId)}catch(z){X=`❌ agy 收尾失败: ${$1(z)}`,b(`session "${x.sessionName}": ${X}`),await R1(x.chatId,X)}finally{if(x.runningAgy===Z)x.runningAgy=null,x.status=x.isRunning()?"idle":"stopped",x.opts.onLifecycleChange?.();b(`session "${x.sessionName}": agy finished status=${X} code=${Q} signal=${J} stdout=${Z.stdoutBytes} stderr=${Z.stderrBytes}`),Z.resolveDone()}}var oL0=1e6,rL0=5000,sy=8000,oy=2000,tL0=30000;var Qh=M0(()=>{h7();L6();l1();J1();qN()});import{isAbsolute as JN0}from"node:path";function j8(x){if(x?.planLiveInserted)return W0.planLive;return x?.taskLiveInserted?W0.taskBoardLive:W0.footer}function XN0(x){return x==="ImageGeneration"||x==="imageGeneration"}function zN0(x,Z,Q){if(Q||!XN0(x))return null;let J=zW(Z.trim());return JN0(J)?J:null}function WN0(x){if(x==="Read")return"read";if(x==="Edit"||x==="MultiEdit"||x==="NotebookEdit")return"edit";return null}function Jh(x,Z,Q){return x==="read"?u9(Z,Q):w9(Z,Q)}function Xh(x,Z,Q,J){if(!x.currentTurn)return;if(x.maybeMidTurnRotate(),x.startWorkingFooter(x.currentTurn),x.currentTurn.currentAssistantSegmentId)x.finalizeCurrentAssistantSegment();let X=WN0(Q);if(X&&x.currentTurn.openBatchI!==null){let K=x.currentTurn.openBatchI,H=x.currentTurn.toolBatches.get(K);if(H&&H.kind===X){let W=H.items.length;H.items.push({toolUseId:Z,input:J,output:null,isError:!1}),x.currentTurn.toolByUseId.set(Z,{i:K,name:Q,input:J,batchSlot:W});let $=X==="read"?u9(K,H.items):w9(K,H.items);Q1(x.currentTurn.cardId,W0.tool(K),$);return}}if(!X)x.currentTurn.openBatchI=null;let z=d7(Q);if(z){let K=x.currentTurn;if(z==="TaskCreate"&&!K.taskBoardResetThisTurn)x.taskBoard=[],K.taskBoardResetThisTurn=!0;if(!K.taskLiveInserted)K.taskLiveInserted=!0,j1(K.cardId,i7(x.taskBoard),{type:"insert_before",targetElementId:W0.footer});else Q1(K.cardId,W0.taskBoardLive,i7(x.taskBoard));let H=z==="TaskCreate";if(H)K.taskUpdateI=null;else K.taskCreateI=null;let W=(H?K.taskCreateI:K.taskUpdateI)===null;if(W)if(H)K.taskCreateI=K.toolCount++;else K.taskUpdateI=K.toolCount++;let $=H?K.taskCreateI:K.taskUpdateI;K.toolByUseId.set(Z,{i:$,name:Q,input:J});let N=g3($,x.taskBoard,{name:z,status:"⏳"});W?j1(K.cardId,N,{type:"insert_before",targetElementId:j8(K)}):Q1(K.cardId,W0.tool($),N);return}x.currentTurn.taskCreateI=null,x.currentTurn.taskUpdateI=null;let Y=x.currentTurn.toolCount++;if(X){x.currentTurn.openBatchI=Y;let K=[{toolUseId:Z,input:J,output:null,isError:!1}];x.currentTurn.toolBatches.set(Y,{kind:X,items:K}),x.currentTurn.toolByUseId.set(Z,{i:Y,name:Q,input:J,batchSlot:0});let H=X==="read"?u9(Y,K):w9(Y,K);j1(x.currentTurn.cardId,H,{type:"insert_before",targetElementId:j8(x.currentTurn)});return}if(x.currentTurn.toolByUseId.set(Z,{i:Y,name:Q,input:J}),Q==="AskUserQuestion"){let K=Array.isArray(J?.questions)?J.questions:[],H=K.length>0?0:void 0,W=new Map;x.pendingAsks.set(Z,{questions:K,i:Y,answers:{},answered:W,currentIdx:H});let $=lY(Y,Z,K,"\uD83E\uDD14",{currentIdx:H,answered:W});if(j1(x.currentTurn.cardId,$,{type:"insert_before",targetElementId:j8(x.currentTurn)}),x.currentTurn.userOpenId&&x.currentTurn.messageId){let N=x.currentTurn,D=K[0]?.question?.trim()??"",O=D.length>40?D.slice(0,40)+"…":D,v=K.length>1?`❓ 待回答 ${K.length} 题${O?`: ${O}`:""}`:O?`❓ ${O}`:"❓ 等你回答问题";(async()=>{S8(N.cardId),await g8(N.cardId,{config:{summary:{content:v}}}),await k9(N.messageId,[N.userOpenId])})()}return}let G=i6(Y,Q,J,null,"⏳");j1(x.currentTurn.cardId,G,{type:"insert_before",targetElementId:j8(x.currentTurn)})}function zh(x,Z,Q,J){if(!x.currentTurn)return;let X=x.currentTurn.toolByUseId.get(Z);if(!X)return;let z=typeof Q==="string"?Q:Array.isArray(Q)?Q.map((H)=>H?.text??JSON.stringify(H)).join(`
|
|
334
|
-
`):JSON.stringify(Q);X.output=z,X.isError=J;let Y=zN0(X.name,z,J);if(Y)x.sendOutboundPath(Y,X.name);if(X.name==="AskUserQuestion"){GW(x);return}if(X.batchSlot!=null){let H=x.currentTurn.toolBatches.get(X.i);if(H){let W=H.items[X.batchSlot];if(W)W.output=z,W.isError=J;let $=Jh(H.kind,X.i,H.items);Q1(x.currentTurn.cardId,W0.tool(X.i),$)}GW(x);return}let G=d7(X.name);if(G){KN0(x,X,G,X.input,z,J,X.resolvedNote);return}let K=i6(X.i,X.name,X.input,z,J?"❌":"✅",X.resolvedNote);Q1(x.currentTurn.cardId,W0.tool(X.i),K),GW(x)}function KN0(x,Z,Q,J,X,z,Y){if(!x.currentTurn)return;if(!z)x.taskBoard=NN(x.taskBoard,Q,J,X);let G=g3(Z.i,x.taskBoard,{name:Q,status:z?"❌":"✅"},Y);if(Q1(x.currentTurn.cardId,W0.tool(Z.i),G),x.currentTurn.taskLiveInserted)Q1(x.currentTurn.cardId,W0.taskBoardLive,i7(x.taskBoard));GW(x)}function GW(x){let Z=x.currentTurn;if(!Z)return;for(let Q of Z.toolByUseId.values())if(Q.output==null)return;x.startThinkingFooter(Z)}function Wh(x,Z,Q,J,X){let z=x.currentTurn;if(!z)return;for(let[Y,G]of J){let K=G.batchSlot??null,H=G.input,W,$;if(K!=null){let j=X.get(G.i)?.items[K];if(!j)continue;H=j.input,W=j.output,$=j.isError}else W=G.output??null,$=G.isError??!1;let N=W!=null,D=PY(Z,W0.tool(G.i));if(N&&!D)continue;if(K!=null){let j=X.get(G.i)?.kind;if(!j)continue;let c=z.toolCount++,I={toolUseId:Y,input:H,output:W,isError:$};z.toolBatches.set(c,{kind:j,items:[I]}),z.toolByUseId.set(Y,{...G,i:c,batchSlot:0}),j1(Q,Jh(j,c,[I]),{type:"insert_before",targetElementId:j8(z)});continue}let O=d7(G.name);if(O){let j=O==="TaskCreate";if(j)z.taskUpdateI=null;else z.taskCreateI=null;let c=(j?z.taskCreateI:z.taskUpdateI)===null;if(c)if(j)z.taskCreateI=z.toolCount++;else z.taskUpdateI=z.toolCount++;let I=j?z.taskCreateI:z.taskUpdateI;z.toolByUseId.set(Y,{...G,i:I});let P=!N?"⏳":$?"❌":"✅",f=g3(I,x.taskBoard,{name:O,status:P},G.resolvedNote);c?j1(Q,f,{type:"insert_before",targetElementId:j8(z)}):Q1(Q,W0.tool(I),f);continue}let v=z.toolCount++;z.toolByUseId.set(Y,{...G,i:v});let B=!N?"⏳":$?"❌":"✅";j1(Q,i6(v,G.name,G.input,W,B,G.resolvedNote),{type:"insert_before",targetElementId:j8(z)})}}var Kh=M0(()=>{SN();h7();L6();l1()});function Vh(x){return x.pendingAsks.size>0}async function Hh(x,Z,Q,J){let X=x.pendingAsks.entries().next();if(X.done){b(`session "${x.sessionName}": onAskMessageAnswer with no pending — falling back to onUserMessage`),await x.onUserMessage(Z,[],Q,J);return}let[z,Y]=X.value;if(Y.currentIdx===void 0){if(Y.requestId){b(`session "${x.sessionName}": pending ask ${z} awaiting finalize — ignoring message`);return}b(`session "${x.sessionName}": pending ask ${z} orphaned (no can_use_tool) — dropping zombie, reprocessing as user message`),x.pendingAsks.delete(z),await x.onUserMessage(Z,[],Q,J);return}if(await bN(x,z,Y.currentIdx,Z,Q)&&J)U4(J,"CheckMark")}async function Gh(x,Z,Q,J,X){let z=x.pendingAsks.get(Z);if(!z){b(`session "${x.sessionName}": stray ask answer for ${Z}`);return}if(Q!==z.currentIdx){b(`session "${x.sessionName}": stale ask click q=${Q} current=${z.currentIdx}`);return}$h(x,Z,{optionIdx:J,user:X})}async function bN(x,Z,Q,J,X){let z=x.pendingAsks.get(Z);if(!z)return b(`session "${x.sessionName}": stray ask custom for ${Z}`),!1;let Y=(J??"").trim();if(!Y)return b(`session "${x.sessionName}": empty custom answer, ignoring`),!1;if(Q!==z.currentIdx)return b(`session "${x.sessionName}": stale ask custom q=${Q} current=${z.currentIdx}`),!1;return $h(x,Z,{customText:Y,user:X}),!0}function $h(x,Z,Q){let J=x.pendingAsks.get(Z);if(!J||J.currentIdx===void 0)return;let X=J.currentIdx,z=J.questions[X];if(!z){b(`session "${x.sessionName}": advanceAsk currentIdx=${X} out of range`);return}let Y;if(Q.customText!==void 0)Y=Q.customText;else if(Q.optionIdx!==void 0){let $=z.options?.[Q.optionIdx];if(!$){b(`session "${x.sessionName}": advanceAsk option ${Q.optionIdx} out of range`);return}Y=$.label}else{b(`session "${x.sessionName}": advanceAsk with neither customText nor optionIdx`);return}J.answers[z.question]=Y,J.answered.set(X,{optionIdx:Q.optionIdx,customText:Q.customText,user:Q.user});let G=J.questions.length,K=void 0;for(let $=X+1;$<G;$++)if(!J.answered.has($)){K=$;break}J.currentIdx=K;let H=x.currentTurn,W=H?.toolByUseId.get(Z);if(H&&W){let $=lY(W.i,Z,J.questions,K===void 0?"✅":"\uD83E\uDD14",{currentIdx:K,answered:J.answered});Q1(H.cardId,W0.tool(W.i),$)}if(K===void 0)if(J.requestId)kN(x,Z);else b(`session "${x.sessionName}": ask ${Z} all answered, waiting for can_use_tool`)}function kN(x,Z){let Q=x.pendingAsks.get(Z);if(!Q||!Q.requestId)return;let J=x.currentTurn?.toolByUseId.get(Z),X=J?.input??{};if(x.proc?.sendPermissionResponse(Q.requestId,"allow",{updatedInput:{...X,answers:Q.answers}}),x.pendingPermissions.delete(Q.requestId),J)J.output=JSON.stringify({answers:Q.answers}),J.isError=!1;if(x.pendingAsks.delete(Z),x.pendingPermissions.size===0&&x.status==="awaiting_permission")x.status="working"}var PN=M0(()=>{h7();L6();l1();J1()});async function Fh(x,Z,Q,J){let X=x.pendingPermissions.get(Z);if(!X){b(`session "${x.sessionName}": stray permission ${Z}`);return}x.pendingPermissions.delete(Z);let z=x.currentTurn,Y=z?.toolByUseId.get(X.toolUseId);if(z&&Y){let K=d7(Y.name);if(Q==="deny"){let H=`\uD83D\uDEAB 已拒绝 by ${J||"匿名"}`,W=K?g3(Y.i,x.taskBoard,{name:K,status:"❌"},H):i6(Y.i,Y.name,Y.input,H,"❌");Q1(z.cardId,W0.tool(Y.i),W)}else{let H=Q==="allow_always"?"始终允许":"已允许";Y.resolvedNote=`✅ **${H}** by ${J||"匿名"}`;let W=K?g3(Y.i,x.taskBoard,{name:K,status:"⏳"},Y.resolvedNote):i6(Y.i,Y.name,Y.input,null,"⏳",Y.resolvedNote);Q1(z.cardId,W0.tool(Y.i),W)}}let G=Q==="deny"?"deny":"allow";if(b(`session "${x.sessionName}": permission decision request=${Z} tool_use_id=${X.toolUseId} decision=${Q}`),x.proc?.sendPermissionResponse(Z,G,Q==="allow_always"?{updatedPermissions:X.permissionSuggestions}:void 0),x.pendingPermissions.size===0&&x.status==="awaiting_permission")x.status="working"}function Uh(x,Z){let Q=x.currentTurn;if(!Q){b(`session "${x.sessionName}": can_use_tool with no current turn — auto-deny req=${Z.request_id}`),x.proc?.sendPermissionResponse(Z.request_id,"deny",{denyMessage:"no active turn"});return}let J=Z.tool_use_id;if(!J){b(`session "${x.sessionName}": can_use_tool without tool_use_id — auto-deny req=${Z.request_id}`),x.proc?.sendPermissionResponse(Z.request_id,"deny",{denyMessage:"no tool_use_id"});return}let X=Q.toolByUseId.get(J);if(!X){b(`session "${x.sessionName}": can_use_tool for unknown tool_use_id=${J} — auto-deny req=${Z.request_id}`),x.proc?.sendPermissionResponse(Z.request_id,"deny",{denyMessage:"unknown tool_use_id"});return}if(X.name==="AskUserQuestion"){let Y=x.pendingAsks.get(J);if(!Y){b(`session "${x.sessionName}": AskUserQuestion ${J} missing pendingAsk — deny`),x.proc?.sendPermissionResponse(Z.request_id,"deny",{denyMessage:"no pending ask"});return}if(Y.requestId=Z.request_id,x.pendingPermissions.set(Z.request_id,{toolUseId:J}),Y.currentIdx===void 0)kN(x,J);return}x.status="awaiting_permission",x.pendingPermissions.set(Z.request_id,{toolUseId:J,permissionSuggestions:Z.permission_suggestions}),b(`session "${x.sessionName}": can_use_tool request=${Z.request_id} tool_use_id=${J} tool=${X.name}`);let z=wz(X.i,X.name,X.input,Z.request_id);if(Q1(Q.cardId,W0.tool(X.i),z),Q.userOpenId&&Q.messageId){let Y=m7(X.name,X.input),G=yY(X.name),K=Y&&Y.length>30?Y.slice(0,30)+"…":Y,H=K?`\uD83D\uDD10 等审批: ${G} · ${K}`:`\uD83D\uDD10 等审批: ${G}`;(async()=>{S8(Q.cardId),await g8(Q.cardId,{config:{summary:{content:H}}}),await k9(Q.messageId,[Q.userOpenId])})()}}var Lh=M0(()=>{h7();L6();l1();J1();PN()});function Nh(x,Z=Oh){return new Promise((Q,J)=>{let X=setTimeout(()=>J(Error(`timeout ${Z}ms`)),Z);x.then((z)=>{clearTimeout(X),Q(z)},(z)=>{clearTimeout(X),J(z)})})}function Dh(x){return typeof x==="string"&&$N0.includes(x)?x:null}async function Bh(){let x=new YW;try{await Nh(x.request("initialize",{clientInfo:{name:"lodestar-models",version:"0.0.0"},capabilities:{experimentalApi:!0,requestAttestation:!1}}));let Z=await Nh(x.request("model/list",{})),Q=Array.isArray(Z?.data)?Z.data:[],J=[];for(let X of Q){if(!X||X.hidden||!X.id)continue;let z=(Array.isArray(X.supportedReasoningEfforts)?X.supportedReasoningEfforts:[]).map((G)=>Dh(G?.reasoningEffort)).filter((G)=>G!==null);if(!z.length)continue;let Y=Dh(X.defaultReasoningEffort)??z[0];J.push({model:String(X.id),display:typeof X.displayName==="string"&&X.displayName?String(X.displayName):String(X.id),efforts:z,defaultEffort:Y})}return J}finally{await x.close()}}async function vh(x,Z){let Q=new URL(x),J=Q.pathname.replace(/\/+$/,""),X=`${Q.protocol}//${Q.host}${J}/v1/models`,z=await fetch(X,{headers:{Authorization:`Bearer ${Z}`},signal:AbortSignal.timeout(Oh)});if(!z.ok)throw Error(`HTTP ${z.status}`);let Y=await z.json();return(Array.isArray(Y?.data)?Y.data:[]).filter((K)=>K&&(K.display_name||K.id)).map((K)=>{let H=String(K.display_name||K.id);return{model:H,display:H,efforts:m4,defaultEffort:"max"}})}var Oh=1e4,$N0,m4;var QZ=M0(()=>{QW();$N0=["none","minimal","low","medium","high","xhigh"];m4=["max","xhigh","high","medium","low"]});import{existsSync as FN0}from"node:fs";import{homedir as UN0}from"node:os";import{join as Mh}from"node:path";function Rh(x,Z,Q){return{kind:Z,label:Q,percent:x.percent,resetsAt:x.resetsAt}}function LN0(x){if(x.state!=="ok")return{state:x.state==="auth_failed"?"no_credentials":x.state==="no_credentials"?"no_credentials":x.state==="rate_limited"?"rate_limited":"network",windows:[]};let Z=[];if(x.fiveHour)Z.push(Rh(x.fiveHour,"fiveHour","5h 窗口"));if(x.weekly)Z.push(Rh(x.weekly,"weekly","周配额"));return{state:"ok",planLabel:x.subscriptionType,windows:Z,fetchedAt:x.fetchedAt}}function NN0(){let x=process.env.CODEX_HOME||Mh(UN0(),".codex");return FN0(Mh(x,"auth.json"))}var Ch=M0(()=>{E8();Q4();QW();QZ();J1();k6({kind:"codex-subscription",configSectionId:"codex-sub",build:(x)=>{let Z=NN0(),Q=x.model?.trim()||void 0,J=x.effort?.trim()||void 0,X={id:"codex-sub",kind:"codex-subscription",agent:"codex",display:x.display?.trim()||"Codex 订阅",capabilities:{resumeSessionAt:!1,fork:!1},enabled:Z,models:[],defaultModel:Q??"",async refreshModels(){if(!X.enabled){X.models=[];return}try{if(X.models=await Bh(),J)for(let z of X.models)z.defaultEffort=J;if(!Q)X.defaultModel=X.models[0]?.model??""}catch(z){b(`codex-sub refreshModels MISS: ${z?.message??z}`),X.models=[]}},spawnEnv(z){let Y=G7(z);return Object.assign(Y,a0.codex.env),Y},resolveSpawnModel(z){return z},async readUsage(){return LN0(await ZW())}};return X}})});function ON0(x){let Z=new URL(x),Q=Z.pathname.replace(/\/+$/,"");return`${Z.protocol}//${Z.host}${Q}/v1/messages`}async function $W(x,Z,Q){try{let J=await fetch(ON0(x),{method:"POST",headers:{"Content-Type":"application/json",...Z},body:JSON.stringify({model:Q,max_tokens:1,messages:[{role:"user",content:"hi"}]}),signal:AbortSignal.timeout(DN0)});if(J.ok)return"exists";if(J.status===400){let X=await J.text();return X.includes("1214")||X.includes("不存在")||X.includes("not exist")?"not_found":"no_verdict"}return b(`model-existence: ${Q} HTTP ${J.status}, no verdict`),"no_verdict"}catch(J){return b(`model-existence: ${Q} MISS (${J?.message??J})`),"no_verdict"}}var DN0=15000;var gN=M0(()=>{J1()});function Sh(x,Z,Q){return{kind:Z,label:Q,percent:x.percent,resetsAt:x.resetsAt}}function BN0(x){return{kind:"monthly",label:"月度工具",percent:x.percent,resetsAt:x.resetsAt,...x.used!=null?{used:x.used}:{},...x.total!=null?{total:x.total}:{}}}function vN0(x){return(x??"").split(",").map((Z)=>Z.trim()).filter(Boolean)}function MN0(x){let Z=(Q)=>{let J=Q.match(/(\d+(?:\.\d+)?)/);return J?Number(J[1]):-1};return[...x].sort((Q,J)=>Z(J)-Z(Q))[0]??""}function RN0(x){let Z={};for(let Q of(x??"").split(",")){let J=Q.indexOf("=");if(J<=0)continue;let X=Q.slice(0,J).trim().toLowerCase(),z=Q.slice(J+1).trim();if((X==="opus"||X==="sonnet"||X==="haiku")&&z)Z[X]=z}return Z}function CN0(x){if(x.state!=="ok")return{state:x.state==="no_credentials"?"no_credentials":x.state==="not_glm"?"not_applicable":x.state==="rate_limited"?"rate_limited":"network",windows:[],...x.state==="network"&&x.reason?{reason:x.reason}:{}};let Z=[];if(x.fiveHour)Z.push(Sh(x.fiveHour,"fiveHour","5h 窗口"));if(x.weekly)Z.push(Sh(x.weekly,"weekly","周额度"));if(x.monthly)Z.push(BN0(x.monthly));return{state:"ok",planLabel:x.level?`${x.level} 套餐`:void 0,windows:Z,fetchedAt:x.fetchedAt}}var jh=M0(()=>{E8();Q4();XW();QZ();Wz();gN();J1();k6({kind:"glm-coding-plan",configSectionId:"glm",build:(x,Z)=>{let Q=x.base_url?.trim()||Z?.base_url?.trim()||"",J=x.auth_token?.trim()||Z?.auth_token?.trim()||"",X=!!(Q&&J)&&JW(Q),z=x.model?.trim()||void 0,Y=RN0(x.slots),G={id:"glm",kind:"glm-coding-plan",agent:"claude",display:x.display?.trim()||"GLM Coding Plan",capabilities:{resumeSessionAt:!0,fork:!0},enabled:X,models:[],defaultModel:z??"",async refreshModels(){if(!G.enabled){G.models=[];return}try{let K=await vh(Q,J),W=vN0(x.models).filter(($)=>!K.some((N)=>N.model.toLowerCase()===$.toLowerCase())).map(($)=>({model:$,display:$,efforts:m4,defaultEffort:"max"}));if(G.models=[...K,...W],!z)G.defaultModel=MN0(G.models.map(($)=>$.model));for(let $ of G.models){let N=zz("glm",$.model);$.context1m=N!=null&&N>=1e6||void 0}}catch(K){b(`glm refreshModels MISS: ${K?.message??K}`),G.models=[]}},spawnEnv(K){let H=G7(K),W={...a0.claude.env};if(W.ANTHROPIC_BASE_URL=Q,W.ANTHROPIC_AUTH_TOKEN=J,Y.opus)W.ANTHROPIC_DEFAULT_OPUS_MODEL=Y.opus;if(Y.sonnet)W.ANTHROPIC_DEFAULT_SONNET_MODEL=Y.sonnet;if(Y.haiku)W.ANTHROPIC_DEFAULT_HAIKU_MODEL=Y.haiku;return{...H,...W}},resolveSpawnModel(K){return Xz("glm",K)},async verifyModel(K){return $W(Q,{Authorization:`Bearer ${J}`},K)},async readUsage(){return CN0(await RN(Q,J))}};return G},setup:{commandSuffix:"glm",hint:(x)=>`启用 ${x}:发送
|
|
334
|
+
`):JSON.stringify(Q);X.output=z,X.isError=J;let Y=zN0(X.name,z,J);if(Y)x.sendOutboundPath(Y,X.name);if(X.name==="AskUserQuestion"){GW(x);return}if(X.batchSlot!=null){let H=x.currentTurn.toolBatches.get(X.i);if(H){let W=H.items[X.batchSlot];if(W)W.output=z,W.isError=J;let $=Jh(H.kind,X.i,H.items);Q1(x.currentTurn.cardId,W0.tool(X.i),$)}GW(x);return}let G=d7(X.name);if(G){KN0(x,X,G,X.input,z,J,X.resolvedNote);return}let K=i6(X.i,X.name,X.input,z,J?"❌":"✅",X.resolvedNote);Q1(x.currentTurn.cardId,W0.tool(X.i),K),GW(x)}function KN0(x,Z,Q,J,X,z,Y){if(!x.currentTurn)return;if(!z)x.taskBoard=NN(x.taskBoard,Q,J,X);let G=g3(Z.i,x.taskBoard,{name:Q,status:z?"❌":"✅"},Y);if(Q1(x.currentTurn.cardId,W0.tool(Z.i),G),x.currentTurn.taskLiveInserted)Q1(x.currentTurn.cardId,W0.taskBoardLive,i7(x.taskBoard));GW(x)}function GW(x){let Z=x.currentTurn;if(!Z)return;for(let Q of Z.toolByUseId.values())if(Q.output==null)return;x.startThinkingFooter(Z)}function Wh(x,Z,Q,J,X){let z=x.currentTurn;if(!z)return;for(let[Y,G]of J){let K=G.batchSlot??null,H=G.input,W,$;if(K!=null){let j=X.get(G.i)?.items[K];if(!j)continue;H=j.input,W=j.output,$=j.isError}else W=G.output??null,$=G.isError??!1;let N=W!=null,D=PY(Z,W0.tool(G.i));if(N&&!D)continue;if(K!=null){let j=X.get(G.i)?.kind;if(!j)continue;let c=z.toolCount++,I={toolUseId:Y,input:H,output:W,isError:$};z.toolBatches.set(c,{kind:j,items:[I]}),z.toolByUseId.set(Y,{...G,i:c,batchSlot:0}),j1(Q,Jh(j,c,[I]),{type:"insert_before",targetElementId:j8(z)});continue}let O=d7(G.name);if(O){let j=O==="TaskCreate";if(j)z.taskUpdateI=null;else z.taskCreateI=null;let c=(j?z.taskCreateI:z.taskUpdateI)===null;if(c)if(j)z.taskCreateI=z.toolCount++;else z.taskUpdateI=z.toolCount++;let I=j?z.taskCreateI:z.taskUpdateI;z.toolByUseId.set(Y,{...G,i:I});let P=!N?"⏳":$?"❌":"✅",f=g3(I,x.taskBoard,{name:O,status:P},G.resolvedNote);c?j1(Q,f,{type:"insert_before",targetElementId:j8(z)}):Q1(Q,W0.tool(I),f);continue}let v=z.toolCount++;z.toolByUseId.set(Y,{...G,i:v});let B=!N?"⏳":$?"❌":"✅";j1(Q,i6(v,G.name,G.input,W,B,G.resolvedNote),{type:"insert_before",targetElementId:j8(z)})}}var Kh=M0(()=>{SN();h7();L6();l1()});function Vh(x){return x.pendingAsks.size>0}async function Hh(x,Z,Q,J){let X=x.pendingAsks.entries().next();if(X.done){b(`session "${x.sessionName}": onAskMessageAnswer with no pending — falling back to onUserMessage`),await x.onUserMessage(Z,[],Q,J);return}let[z,Y]=X.value;if(Y.currentIdx===void 0){if(Y.requestId){b(`session "${x.sessionName}": pending ask ${z} awaiting finalize — ignoring message`);return}b(`session "${x.sessionName}": pending ask ${z} orphaned (no can_use_tool) — dropping zombie, reprocessing as user message`),x.pendingAsks.delete(z),await x.onUserMessage(Z,[],Q,J);return}if(await bN(x,z,Y.currentIdx,Z,Q)&&J)U4(J,"CheckMark")}async function Gh(x,Z,Q,J,X){let z=x.pendingAsks.get(Z);if(!z){b(`session "${x.sessionName}": stray ask answer for ${Z}`);return}if(Q!==z.currentIdx){b(`session "${x.sessionName}": stale ask click q=${Q} current=${z.currentIdx}`);return}$h(x,Z,{optionIdx:J,user:X})}async function bN(x,Z,Q,J,X){let z=x.pendingAsks.get(Z);if(!z)return b(`session "${x.sessionName}": stray ask custom for ${Z}`),!1;let Y=(J??"").trim();if(!Y)return b(`session "${x.sessionName}": empty custom answer, ignoring`),!1;if(Q!==z.currentIdx)return b(`session "${x.sessionName}": stale ask custom q=${Q} current=${z.currentIdx}`),!1;return $h(x,Z,{customText:Y,user:X}),!0}function $h(x,Z,Q){let J=x.pendingAsks.get(Z);if(!J||J.currentIdx===void 0)return;let X=J.currentIdx,z=J.questions[X];if(!z){b(`session "${x.sessionName}": advanceAsk currentIdx=${X} out of range`);return}let Y;if(Q.customText!==void 0)Y=Q.customText;else if(Q.optionIdx!==void 0){let $=z.options?.[Q.optionIdx];if(!$){b(`session "${x.sessionName}": advanceAsk option ${Q.optionIdx} out of range`);return}Y=$.label}else{b(`session "${x.sessionName}": advanceAsk with neither customText nor optionIdx`);return}J.answers[z.question]=Y,J.answered.set(X,{optionIdx:Q.optionIdx,customText:Q.customText,user:Q.user});let G=J.questions.length,K=void 0;for(let $=X+1;$<G;$++)if(!J.answered.has($)){K=$;break}J.currentIdx=K;let H=x.currentTurn,W=H?.toolByUseId.get(Z);if(H&&W){let $=lY(W.i,Z,J.questions,K===void 0?"✅":"\uD83E\uDD14",{currentIdx:K,answered:J.answered});Q1(H.cardId,W0.tool(W.i),$)}if(K===void 0)if(J.requestId)kN(x,Z);else b(`session "${x.sessionName}": ask ${Z} all answered, waiting for can_use_tool`)}function kN(x,Z){let Q=x.pendingAsks.get(Z);if(!Q||!Q.requestId)return;let J=x.currentTurn?.toolByUseId.get(Z),X=J?.input??{};if(x.proc?.sendPermissionResponse(Q.requestId,"allow",{updatedInput:{...X,answers:Q.answers}}),x.pendingPermissions.delete(Q.requestId),J)J.output=JSON.stringify({answers:Q.answers}),J.isError=!1;if(x.pendingAsks.delete(Z),x.pendingPermissions.size===0&&x.status==="awaiting_permission")x.status="working"}var PN=M0(()=>{h7();L6();l1();J1()});async function Fh(x,Z,Q,J){let X=x.pendingPermissions.get(Z);if(!X){b(`session "${x.sessionName}": stray permission ${Z}`);return}x.pendingPermissions.delete(Z);let z=x.currentTurn,Y=z?.toolByUseId.get(X.toolUseId);if(z&&Y){let K=d7(Y.name);if(Q==="deny"){let H=`\uD83D\uDEAB 已拒绝 by ${J||"匿名"}`,W=K?g3(Y.i,x.taskBoard,{name:K,status:"❌"},H):i6(Y.i,Y.name,Y.input,H,"❌");Q1(z.cardId,W0.tool(Y.i),W)}else{let H=Q==="allow_always"?"始终允许":"已允许";Y.resolvedNote=`✅ **${H}** by ${J||"匿名"}`;let W=K?g3(Y.i,x.taskBoard,{name:K,status:"⏳"},Y.resolvedNote):i6(Y.i,Y.name,Y.input,null,"⏳",Y.resolvedNote);Q1(z.cardId,W0.tool(Y.i),W)}}let G=Q==="deny"?"deny":"allow";if(b(`session "${x.sessionName}": permission decision request=${Z} tool_use_id=${X.toolUseId} decision=${Q}`),x.proc?.sendPermissionResponse(Z,G,Q==="allow_always"?{updatedPermissions:X.permissionSuggestions}:void 0),x.pendingPermissions.size===0&&x.status==="awaiting_permission")x.status="working"}function Uh(x,Z){let Q=x.currentTurn;if(!Q){b(`session "${x.sessionName}": can_use_tool with no current turn — auto-deny req=${Z.request_id}`),x.proc?.sendPermissionResponse(Z.request_id,"deny",{denyMessage:"no active turn"});return}let J=Z.tool_use_id;if(!J){b(`session "${x.sessionName}": can_use_tool without tool_use_id — auto-deny req=${Z.request_id}`),x.proc?.sendPermissionResponse(Z.request_id,"deny",{denyMessage:"no tool_use_id"});return}let X=Q.toolByUseId.get(J);if(!X){b(`session "${x.sessionName}": can_use_tool for unknown tool_use_id=${J} — auto-deny req=${Z.request_id}`),x.proc?.sendPermissionResponse(Z.request_id,"deny",{denyMessage:"unknown tool_use_id"});return}if(X.name==="AskUserQuestion"){let Y=x.pendingAsks.get(J);if(!Y){b(`session "${x.sessionName}": AskUserQuestion ${J} missing pendingAsk — deny`),x.proc?.sendPermissionResponse(Z.request_id,"deny",{denyMessage:"no pending ask"});return}if(Y.requestId=Z.request_id,x.pendingPermissions.set(Z.request_id,{toolUseId:J}),Y.currentIdx===void 0)kN(x,J);return}x.status="awaiting_permission",x.pendingPermissions.set(Z.request_id,{toolUseId:J,permissionSuggestions:Z.permission_suggestions}),b(`session "${x.sessionName}": can_use_tool request=${Z.request_id} tool_use_id=${J} tool=${X.name}`);let z=wz(X.i,X.name,X.input,Z.request_id);if(Q1(Q.cardId,W0.tool(X.i),z),Q.userOpenId&&Q.messageId){let Y=m7(X.name,X.input),G=yY(X.name),K=Y&&Y.length>30?Y.slice(0,30)+"…":Y,H=K?`\uD83D\uDD10 等审批: ${G} · ${K}`:`\uD83D\uDD10 等审批: ${G}`;(async()=>{S8(Q.cardId),await g8(Q.cardId,{config:{summary:{content:H}}}),await k9(Q.messageId,[Q.userOpenId])})()}}var Lh=M0(()=>{h7();L6();l1();J1();PN()});function Nh(x,Z=Oh){return new Promise((Q,J)=>{let X=setTimeout(()=>J(Error(`timeout ${Z}ms`)),Z);x.then((z)=>{clearTimeout(X),Q(z)},(z)=>{clearTimeout(X),J(z)})})}function Dh(x){return typeof x==="string"&&$N0.includes(x)?x:null}async function Bh(){let x=new YW;try{await Nh(x.request("initialize",{clientInfo:{name:"lodestar-models",version:"0.0.0"},capabilities:{experimentalApi:!0,requestAttestation:!1}}));let Z=await Nh(x.request("model/list",{})),Q=Array.isArray(Z?.data)?Z.data:[],J=[];for(let X of Q){if(!X||X.hidden||!X.id)continue;let z=(Array.isArray(X.supportedReasoningEfforts)?X.supportedReasoningEfforts:[]).map((G)=>Dh(G?.reasoningEffort)).filter((G)=>G!==null);if(!z.length)continue;let Y=Dh(X.defaultReasoningEffort)??z[0];J.push({model:String(X.id),display:typeof X.displayName==="string"&&X.displayName?String(X.displayName):String(X.id),efforts:z,defaultEffort:Y})}return J}finally{await x.close()}}async function vh(x,Z){let Q=new URL(x),J=Q.pathname.replace(/\/+$/,""),X=`${Q.protocol}//${Q.host}${J}/v1/models`,z=await fetch(X,{headers:{Authorization:`Bearer ${Z}`},signal:AbortSignal.timeout(Oh)});if(!z.ok)throw Error(`HTTP ${z.status}`);let Y=await z.json();return(Array.isArray(Y?.data)?Y.data:[]).filter((K)=>K&&(K.display_name||K.id)).map((K)=>{let H=String(K.display_name||K.id);return{model:H,display:H,efforts:m4,defaultEffort:"max"}})}var Oh=1e4,$N0,m4;var QZ=M0(()=>{QW();$N0=["none","minimal","low","medium","high","xhigh","max","ultra"];m4=["max","xhigh","high","medium","low"]});import{existsSync as FN0}from"node:fs";import{homedir as UN0}from"node:os";import{join as Mh}from"node:path";function Rh(x,Z,Q){return{kind:Z,label:Q,percent:x.percent,resetsAt:x.resetsAt}}function LN0(x){if(x.state!=="ok")return{state:x.state==="auth_failed"?"no_credentials":x.state==="no_credentials"?"no_credentials":x.state==="rate_limited"?"rate_limited":"network",windows:[]};let Z=[];if(x.fiveHour)Z.push(Rh(x.fiveHour,"fiveHour","5h 窗口"));if(x.weekly)Z.push(Rh(x.weekly,"weekly","周配额"));return{state:"ok",planLabel:x.subscriptionType,windows:Z,fetchedAt:x.fetchedAt}}function NN0(){let x=process.env.CODEX_HOME||Mh(UN0(),".codex");return FN0(Mh(x,"auth.json"))}var Ch=M0(()=>{E8();Q4();QW();QZ();J1();k6({kind:"codex-subscription",configSectionId:"codex-sub",build:(x)=>{let Z=NN0(),Q=x.model?.trim()||void 0,J=x.effort?.trim()||void 0,X={id:"codex-sub",kind:"codex-subscription",agent:"codex",display:x.display?.trim()||"Codex 订阅",capabilities:{resumeSessionAt:!1,fork:!1},enabled:Z,models:[],defaultModel:Q??"",async refreshModels(){if(!X.enabled){X.models=[];return}try{if(X.models=await Bh(),J)for(let z of X.models)z.defaultEffort=J;if(!Q)X.defaultModel=X.models[0]?.model??""}catch(z){b(`codex-sub refreshModels MISS: ${z?.message??z}`),X.models=[]}},spawnEnv(z){let Y=G7(z);return Object.assign(Y,a0.codex.env),Y},resolveSpawnModel(z){return z},async readUsage(){return LN0(await ZW())}};return X}})});function ON0(x){let Z=new URL(x),Q=Z.pathname.replace(/\/+$/,"");return`${Z.protocol}//${Z.host}${Q}/v1/messages`}async function $W(x,Z,Q){try{let J=await fetch(ON0(x),{method:"POST",headers:{"Content-Type":"application/json",...Z},body:JSON.stringify({model:Q,max_tokens:1,messages:[{role:"user",content:"hi"}]}),signal:AbortSignal.timeout(DN0)});if(J.ok)return"exists";if(J.status===400){let X=await J.text();return X.includes("1214")||X.includes("不存在")||X.includes("not exist")?"not_found":"no_verdict"}return b(`model-existence: ${Q} HTTP ${J.status}, no verdict`),"no_verdict"}catch(J){return b(`model-existence: ${Q} MISS (${J?.message??J})`),"no_verdict"}}var DN0=15000;var gN=M0(()=>{J1()});function Sh(x,Z,Q){return{kind:Z,label:Q,percent:x.percent,resetsAt:x.resetsAt}}function BN0(x){return{kind:"monthly",label:"月度工具",percent:x.percent,resetsAt:x.resetsAt,...x.used!=null?{used:x.used}:{},...x.total!=null?{total:x.total}:{}}}function vN0(x){return(x??"").split(",").map((Z)=>Z.trim()).filter(Boolean)}function MN0(x){let Z=(Q)=>{let J=Q.match(/(\d+(?:\.\d+)?)/);return J?Number(J[1]):-1};return[...x].sort((Q,J)=>Z(J)-Z(Q))[0]??""}function RN0(x){let Z={};for(let Q of(x??"").split(",")){let J=Q.indexOf("=");if(J<=0)continue;let X=Q.slice(0,J).trim().toLowerCase(),z=Q.slice(J+1).trim();if((X==="opus"||X==="sonnet"||X==="haiku")&&z)Z[X]=z}return Z}function CN0(x){if(x.state!=="ok")return{state:x.state==="no_credentials"?"no_credentials":x.state==="not_glm"?"not_applicable":x.state==="rate_limited"?"rate_limited":"network",windows:[],...x.state==="network"&&x.reason?{reason:x.reason}:{}};let Z=[];if(x.fiveHour)Z.push(Sh(x.fiveHour,"fiveHour","5h 窗口"));if(x.weekly)Z.push(Sh(x.weekly,"weekly","周额度"));if(x.monthly)Z.push(BN0(x.monthly));return{state:"ok",planLabel:x.level?`${x.level} 套餐`:void 0,windows:Z,fetchedAt:x.fetchedAt}}var jh=M0(()=>{E8();Q4();XW();QZ();Wz();gN();J1();k6({kind:"glm-coding-plan",configSectionId:"glm",build:(x,Z)=>{let Q=x.base_url?.trim()||Z?.base_url?.trim()||"",J=x.auth_token?.trim()||Z?.auth_token?.trim()||"",X=!!(Q&&J)&&JW(Q),z=x.model?.trim()||void 0,Y=RN0(x.slots),G={id:"glm",kind:"glm-coding-plan",agent:"claude",display:x.display?.trim()||"GLM Coding Plan",capabilities:{resumeSessionAt:!0,fork:!0},enabled:X,models:[],defaultModel:z??"",async refreshModels(){if(!G.enabled){G.models=[];return}try{let K=await vh(Q,J),W=vN0(x.models).filter(($)=>!K.some((N)=>N.model.toLowerCase()===$.toLowerCase())).map(($)=>({model:$,display:$,efforts:m4,defaultEffort:"max"}));if(G.models=[...K,...W],!z)G.defaultModel=MN0(G.models.map(($)=>$.model));for(let $ of G.models){let N=zz("glm",$.model);$.context1m=N!=null&&N>=1e6||void 0}}catch(K){b(`glm refreshModels MISS: ${K?.message??K}`),G.models=[]}},spawnEnv(K){let H=G7(K),W={...a0.claude.env};if(W.ANTHROPIC_BASE_URL=Q,W.ANTHROPIC_AUTH_TOKEN=J,Y.opus)W.ANTHROPIC_DEFAULT_OPUS_MODEL=Y.opus;if(Y.sonnet)W.ANTHROPIC_DEFAULT_SONNET_MODEL=Y.sonnet;if(Y.haiku)W.ANTHROPIC_DEFAULT_HAIKU_MODEL=Y.haiku;return{...H,...W}},resolveSpawnModel(K){return Xz("glm",K)},async verifyModel(K){return $W(Q,{Authorization:`Bearer ${J}`},K)},async readUsage(){return CN0(await RN(Q,J))}};return G},setup:{commandSuffix:"glm",hint:(x)=>`启用 ${x}:发送
|
|
335
335
|
\`\`\`
|
|
336
336
|
glm-setup <base_url> <token>
|
|
337
337
|
\`\`\``,parseArgs:(x)=>{let Z=x.trim().split(/\s+/);if(Z.length<2)return{error:"用法:`glm-setup <base_url> <token>`"};return{config:{agent:"claude",base_url:Z[0],auth_token:Z[1]}}}},detect:{fromSettingsEnv(x){let Z=x.ANTHROPIC_BASE_URL?.trim()??"";if(!JW(Z))return null;let Q=x.ANTHROPIC_AUTH_TOKEN?.trim()??"";return Q?{base_url:Z,auth_token:Q}:null}}})});var Ih;var Th=M0(()=>{Q4();QZ();Ih=[{model:"fable",display:"Fable",efforts:m4,defaultEffort:"max"},{model:"opus",display:"Opus",efforts:m4,defaultEffort:"high"},{model:"sonnet",display:"Sonnet",efforts:m4,defaultEffort:"medium"},{model:"haiku",display:"Haiku",efforts:m4,defaultEffort:"medium"}];k6({kind:"claude-native",build:(x)=>{let Z={id:"claude-native",kind:"claude-native",agent:"claude",display:"Claude",capabilities:{resumeSessionAt:!0,fork:!0},enabled:!1,models:Ih,defaultModel:"opus",settingSources:["user","project","local"],async refreshModels(){Z.models=Ih},spawnEnv(Q){return Q},resolveSpawnModel(Q){return Q},async readUsage(){return{state:"not_applicable",windows:[]}}};return Z}})});function jN0(x){return(x??"").split(",").map((Z)=>Z.trim()).filter(Boolean)}function IN0(x){let Z=(Q)=>{let J=Q.match(/(\d+(?:\.\d+)?)/);return J?Number(J[1]):-1};return[...x].sort((Q,J)=>Z(J)-Z(Q))[0]??""}function TN0(x){let Z={};for(let Q of(x??"").split(",")){let J=Q.indexOf("=");if(J<=0)continue;let X=Q.slice(0,J).trim().toLowerCase(),z=Q.slice(J+1).trim();if((X==="opus"||X==="sonnet"||X==="haiku")&&z)Z[X]=z}return Z}function cN0(x){try{return new URL(x).hostname.toLowerCase()==="api.deepseek.com"}catch{return!1}}async function qN0(x,Z){let Q=new URL(x).origin,J=await fetch(`${Q}/models`,{headers:{Authorization:`Bearer ${Z}`},signal:AbortSignal.timeout(1e4)});if(!J.ok)throw Error(`HTTP ${J.status}`);let X=await J.json();return(Array.isArray(X?.data)?X.data:[]).filter((Y)=>Y&&typeof Y.id==="string"&&Y.id).map((Y)=>({model:Y.id,display:Y.id,efforts:m4,defaultEffort:"high"}))}async function AN0(x,Z){let Q;try{Q=new URL(x).origin}catch{return{state:"network",windows:[],reason:"bad base_url"}}try{let J=await fetch(`${Q}/user/balance`,{headers:{Authorization:`Bearer ${Z}`},signal:AbortSignal.timeout(EN0)});if(!J.ok)return{state:"network",windows:[],reason:`HTTP ${J.status}`};let X=await J.json(),Y=(Array.isArray(X?.balance_infos)?X.balance_infos:[])[0],G=typeof Y?.currency==="string"?Y.currency:"",K=G==="CNY"?"¥":G==="USD"?"$":G?`${G} `:"",H=Y?.total_balance;if(typeof H!=="string"&&typeof H!=="number")return{state:"ok",windows:[],planLabel:"余额 —(无明细)"};let W=X?.is_available!==!1;return{state:"ok",windows:[],planLabel:W?`剩余 ${K}${H}`:`⚠️ 余额不足 ${K}${H}`}}catch(J){return b(`deepseek readUsage MISS: ${J?.message??J}`),{state:"network",windows:[],reason:J?.message??String(J)}}}var SN0="https://api.deepseek.com/anthropic",EN0=1e4;var ch=M0(()=>{E8();Q4();QZ();Wz();gN();J1();k6({kind:"deepseek",configSectionId:"deepseek",build:(x,Z)=>{let Q=x.base_url?.trim()||Z?.base_url?.trim()||SN0,J=x.api_key?.trim()||Z?.api_key?.trim()||"",X=!!J,z=x.model?.trim()||void 0,Y=TN0(x.slots),G={id:"deepseek",kind:"deepseek",agent:"claude",display:x.display?.trim()||"DeepSeek",capabilities:{resumeSessionAt:!0,fork:!0},enabled:X,models:[],defaultModel:z??"",async refreshModels(){if(!G.enabled){G.models=[];return}try{let K=await qN0(Q,J),W=jN0(x.models).filter(($)=>!K.some((N)=>N.model.toLowerCase()===$.toLowerCase())).map(($)=>({model:$,display:$,efforts:m4,defaultEffort:"high"}));if(G.models=[...K,...W],!z)G.defaultModel=IN0(G.models.map(($)=>$.model));for(let $ of G.models){let N=zz("deepseek",$.model);$.context1m=N!=null&&N>=1e6||void 0}}catch(K){b(`deepseek refreshModels MISS: ${K?.message??K}`),G.models=[]}},spawnEnv(K){let H=G7(K),W={...a0.claude.env};if(W.ANTHROPIC_BASE_URL=Q,W.ANTHROPIC_API_KEY=J,Y.opus)W.ANTHROPIC_DEFAULT_OPUS_MODEL=Y.opus;if(Y.sonnet)W.ANTHROPIC_DEFAULT_SONNET_MODEL=Y.sonnet;if(Y.haiku)W.ANTHROPIC_DEFAULT_HAIKU_MODEL=Y.haiku;return{...H,...W}},resolveSpawnModel(K){return Xz("deepseek",K)},async verifyModel(K){return $W(Q,{"x-api-key":J},K)},async readUsage(){if(!J)return{state:"no_credentials",windows:[]};return AN0(Q,J)}};return G},setup:{commandSuffix:"deepseek",hint:(x)=>`启用 ${x}:发送
|