@leviyuan/lodestar 0.13.2 → 0.13.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.
Files changed (2) hide show
  1. package/dist/lodestar.js +3 -3
  2. package/package.json +1 -1
package/dist/lodestar.js CHANGED
@@ -126,7 +126,7 @@ ${z.join(`
126
126
  `)}catch(Z){k(`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:{message:Z}})}sendInitialize(){if(!this.readyPromise){let x=this.initializeAndStartThread();x.catch((Z)=>{k(`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(Y6(Z?.reasoningEffort))this.lastEffort=Z.reasoningEffort;else this.lastEffort=this.opts.effort??null;k(`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",...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(" ")+`
127
127
 
128
128
  `:"";this.startTurn(Q+x).catch((J)=>this.failTurnStart(J))}async listModels(){await this.ensureCatalogReady();let x=[],Z=null;do{let Q=await this.request("model/list",{cursor:Z,limit:100,includeHidden:!1});if(!Array.isArray(Q?.data))throw Error("model/list returned no data array");for(let J of Q.data){if(typeof J?.model!=="string"||!J.model)continue;x.push({id:typeof J.id==="string"&&J.id?J.id:J.model,model:J.model,displayName:typeof J.displayName==="string"&&J.displayName?J.displayName:J.model,description:typeof J.description==="string"?J.description:"",hidden:J.hidden===!0,isDefault:J.isDefault===!0,supportedReasoningEfforts:Q60(J.supportedReasoningEfforts),defaultReasoningEffort:Y6(J.defaultReasoningEffort)?J.defaultReasoningEffort:null})}Z=typeof Q?.nextCursor==="string"&&Q.nextCursor?Q.nextCursor:null}while(Z);return x}async injectThreadItems(x){if(!Array.isArray(x)||x.length===0)return;if(!this.readyPromise)this.sendInitialize();if(await this.readyPromise,!this.sessionId)throw Error("codex thread not initialized");await this.request("thread/inject_items",{threadId:this.sessionId,items:x})}async setModelSettings(x,Z){k("codex-process: setModelSettings no-op (codex model/effort governed by ~/.codex/config.toml)")}async setModel(x){k("codex-process: setModel no-op (codex model governed by ~/.codex/config.toml)")}async compactThread(){if(!this.readyPromise)throw Error("codex thread not initialized");if(await this.readyPromise,!this.sessionId)throw Error("codex thread not initialized");await this.request("thread/compact/start",{threadId:this.sessionId})}failTurnStart(x){let Z=x instanceof Error?x.message:String(x);k(`codex-process: turn/start failed: ${Z}`),this.lastResult={cost_usd:null,cost_delta_usd:null,duration_ms:null,num_turns:null,usage:this.lastUsage,subtype:"codex_turn_start_failed",is_error:!0},this.currentTurnId=null,this.emit("result",{subtype:this.lastResult.subtype,is_error:!0,duration_ms:null,usage:this.lastUsage,error:Z})}async startTurn(x){if(!this.readyPromise)this.sendInitialize();if(await this.readyPromise,!this.sessionId)throw Error("codex thread not initialized");await this.request("turn/start",{threadId:this.sessionId,input:[{type:"text",text:x,text_elements:[]}],cwd:this.opts.workDir,approvalPolicy:"never",sandboxPolicy:{type:"dangerFullAccess"}})}sendInterrupt(){if(!this.sessionId||!this.currentTurnId)return;this.request("turn/interrupt",{threadId:this.sessionId,turnId:this.currentTurnId}).catch((x)=>k(`codex-process: interrupt failed: ${x}`))}sendPermissionResponse(x,Z,Q){let J=this.serverRequests.get(String(x));if(!J){k(`codex-process: permission response for unknown request ${x}`);return}let X=Z==="allow";switch(J.method){case"item/commandExecution/requestApproval":this.respond(x,{decision:X?"accept":"decline"});return;case"item/fileChange/requestApproval":this.respond(x,{decision:X?"accept":"decline"});return;case"item/permissions/requestApproval":if(X)this.respond(x,{permissions:J.params?.permissions??{},scope:"session"});else this.respondError(x,Q?.denyMessage??"denied by user");return;case"item/tool/requestUserInput":{if(!X){this.respondError(x,Q?.denyMessage??"denied by user");return}let z=Q?.updatedInput?.answers??{},Y={};for(let G of J.params?.questions??[]){let K=z[G.question]??z[G.id];if(K!==void 0)Y[G.id]={answers:[String(K)]}}this.respond(x,{answers:Y});return}default:x6("APPROVAL_RESPONSE_UNSUPPORTED",{requestId:x,method:J.method,params:J.params,decision:Z,payload:Q}),this.respondError(x,Q?.denyMessage??"unsupported approval request")}}sendToolResult(x,Z,Q=!1){k("codex-process: sendToolResult ignored; Codex app-server server requests are answered via sendPermissionResponse")}sendHookResponse(x,Z={}){this.respond(x,Z)}isAlive(){return this.alive}async kill(x=5000){if(!this.alive)return;this.expectedExit=!0,k(`codex-process: SIGTERM (timeout=${x}ms)`);try{this.proc.kill("SIGTERM")}catch{}let Z=Date.now();while(this.alive&&Date.now()-Z<x)await new Promise((Q)=>setTimeout(Q,100));if(this.alive){k("codex-process: SIGKILL (graceful timeout)");try{this.proc.kill("SIGKILL")}catch{}}}}});function ET(x,Z){if(!x)return x;let Q=/(`{3,})[\s\S]*?\1|`[^`\n]*`/g,J="",X=0,z;while((z=Q.exec(x))!==null){if(z.index>X)J+=Z(x.slice(X,z.index));J+=z[0],X=z.index+z[0].length}if(X<x.length)J+=Z(x.slice(X));return J}function H60(x){return x.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function bT(x){return x.replace(/!\[([^\]]*)\]\(([^)]*)\)/g,(Z,Q,J)=>{let X=J.trim();return Q.trim()?`\uD83D\uDDBC️ ${Q.trim()} (${X})`:`\uD83D\uDDBC️ ${X}`})}function c8(x){return ET(x,(Z)=>bT(H60(Z)))}function kT(x){return ET(x,bT)}var F0;var Z6=R0(()=>{F0={userInput:"user_input",footer:"footer",taskBoardLive:"task_board_live",tool:(x)=>`tool_${x}`,planUpdate:(x)=>`plan_update_${x}`,goalUpdate:(x)=>`goal_update_${x}`,contextCompact:(x)=>`context_compact_${x}`,assistant:(x)=>`assistant_${x}`,consoleCurrentModel:"console_current_model",consoleProjects:"console_projects",consoleHost:"console_host",consoleUsage:"console_usage",modelPanel:"model_panel",agyPrompt:"agy_prompt",agyStats:"agy_stats",agyResult:"agy_result",agyForward:"agy_forward",agyRepo:"agy_repo",tasklistPanel:"tasklist_panel"}});function G60(x,Z){let Q=x??"";if(Q==="subagent"||Q==="local_agent")return"subagent";if(Q==="shell"||Q==="local_bash"||Q==="local_shell")return"shell";if(Q==="monitor"||Q==="local_monitor")return"monitor";if(Q==="workflow"||Q==="local_workflow")return"workflow";if(Z)return"subagent";return"unknown"}function gT(x){return x==="workflow"||x==="monitor"}function Q6(x){return x.status==="completed"||x.status==="failed"||x.status==="killed"}function l7(x){return x.some((Z)=>!Q6(Z))}function uH(x,Z,Q=Date.now()){let J=G60(Z.task_type,Z.subagent_type),X=x.active.some((G)=>G.id===Z.task_id),z=x.pending.some((G)=>G.id===Z.task_id);if(X||z){let G=(K)=>({...K,type:J,toolUseId:Z.tool_use_id??K.toolUseId,description:Z.description||K.description,subagentType:Z.subagent_type??K.subagentType,workflowName:Z.workflow_name??K.workflowName,prompt:Z.prompt??K.prompt});return{active:X?x.active.map((K)=>K.id===Z.task_id?G(K):K):x.active,pending:z?x.pending.map((K)=>K.id===Z.task_id?G(K):K):x.pending}}let Y={id:Z.task_id,toolUseId:Z.tool_use_id,type:J,description:Z.description,subagentType:Z.subagent_type,workflowName:Z.workflow_name,prompt:Z.prompt,status:"running",startedAt:Q,steps:[],...gT(J)?{isBackgrounded:!0}:{}};return gT(J)?{active:[...x.active,Y],pending:x.pending}:{active:x.active,pending:[...x.pending,Y]}}function fH(x,Z){let Q=x.active.some((z)=>z.id===Z.task_id),J=x.pending.some((z)=>z.id===Z.task_id);if(!Q&&!J)return x;let X=(z)=>({...z,description:Z.description??z.description,subagentType:Z.subagent_type??z.subagentType,usage:Z.usage??z.usage,lastToolName:Z.last_tool_name??z.lastToolName,summary:Z.summary??z.summary,status:z.status==="pending"?"running":z.status});return{active:Q?x.active.map((z)=>z.id===Z.task_id?X(z):z):x.active,pending:J?x.pending.map((z)=>z.id===Z.task_id?X(z):z):x.pending}}function yH(x,Z){let Q=x.pending.findIndex((Y)=>Y.id===Z.task_id),J=Z.patch;if(J.is_backgrounded===!0&&Q>=0){let Y=x.pending[Q],G={...Y,isBackgrounded:!0,status:J.status??Y.status,description:J.description??Y.description,error:J.error??Y.error,endTime:J.end_time??Y.endTime};return{active:[...x.active,G],pending:x.pending.filter((K)=>K.id!==Z.task_id)}}let X=x.active.some((Y)=>Y.id===Z.task_id),z=Q>=0;if(X||z){let Y=(G)=>({...G,status:J.status??G.status,description:J.description??G.description,error:J.error??G.error,isBackgrounded:J.is_backgrounded??G.isBackgrounded,endTime:J.end_time??G.endTime});return{active:X?x.active.map((G)=>G.id===Z.task_id?Y(G):G):x.active,pending:z?x.pending.map((G)=>G.id===Z.task_id?Y(G):G):x.pending}}return x}function hH(x){if(x.pending.length===0)return x;return{active:[...x.active,...x.pending.map((Z)=>({...Z,isBackgrounded:!0}))],pending:[]}}function mH(x,Z,Q=Date.now()){let J=Z.status==="completed"?"completed":Z.status==="failed"?"failed":"killed";if(x.pending.some((X)=>X.id===Z.task_id))return{active:x.active,pending:x.pending.filter((X)=>X.id!==Z.task_id)};if(x.active.some((X)=>X.id===Z.task_id))return{active:x.active.map((X)=>X.id===Z.task_id?{...X,status:J,usage:Z.usage??X.usage,summary:Z.summary??X.summary,endTime:X.endTime??Q}:X),pending:x.pending};return x}function wT(x){let Z=0,Q=0;for(let J=x.length-1;J>=0;J--)if(Z+=x[J].brief.length+5,Z>$60){Q=J+1;break}return Q===0?x:x.slice(Q)}function F60(x,Z){let Q=(J)=>typeof J==="string"?J:"";switch(x){case"Bash":return`\`${Q(Z?.command).slice(0,60)}\``;case"Read":return Q(Z?.file_path);case"Edit":return Q(Z?.file_path);case"Write":return Q(Z?.file_path);case"Grep":return`"${Q(Z?.pattern)}" in ${Q(Z?.path??".")}`;case"Glob":return`"${Q(Z?.pattern)}"`;case"Task":return Q(Z?.description);case"WebSearch":return`"${Q(Z?.query)}"`;default:return JSON.stringify(Z??{}).replace(/\s+/g," ").slice(0,60)}}function U60(x,Z){let Q=(x??"").replace(/\s+/g," ").trim();return Z?`❌ ${Q.slice(0,80)}`:Q.slice(0,80)}function _H(x,Z,Q,J,X){if(!Z)return x;let z=x.active.some((K)=>K.toolUseId===Z),Y=x.pending.some((K)=>K.toolUseId===Z);if(!z&&!Y)return x;let G=(K)=>K.map((H)=>H.toolUseId===Z?{...H,steps:wT([...H.steps,{toolUseId:Q,tool:J,brief:`${J} ${F60(J,X)}`.trim()}])}:H);return{active:z?G(x.active):x.active,pending:Y?G(x.pending):x.pending}}function lH(x,Z,Q,J,X){if(!Z)return x;let z=x.active.some((K)=>K.toolUseId===Z),Y=x.pending.some((K)=>K.toolUseId===Z);if(!z&&!Y)return x;let G=(K)=>K.map((H)=>{if(H.toolUseId!==Z)return H;let W=!1,L=H.steps.map((N)=>{if(W||N.toolUseId!==Q)return N;return W=!0,{...N,brief:`${N.brief} → ${U60(J,X)}`}});return{...H,steps:wT(L)}});return{active:z?G(x.active):x.active,pending:Y?G(x.pending):x.pending}}function gH(x){if(!x||x<0)return"0s";let Z=Math.floor(x/1000);if(Z<60)return`${Z}s`;let Q=Math.floor(Z/60);if(Q<60)return`${Q}m${Z%60}s`;return`${Math.floor(Q/60)}h${Q%60}m`}function fT(x){let Z=Number.isFinite(x)?Math.max(0,x):0;for(let z of D60)if(Z<z.limit)return{label:z.label,nextDelayMs:z.limit-Z};let Q=600000,J=Math.floor((Z-600000)/Q),X=600000+(J+1)*Q;return{label:`${(J+1)*10}m+`,nextDelayMs:X-Z}}function F3(x,Z="bucket"){if(Z==="second"){let Q=Number.isFinite(x)?Math.max(0,x):0;if(Q>=PH){let J=Math.floor((Q-PH)/PT),X=PH+(J+1)*PT;return{label:`${10+J*5}m+`,nextDelayMs:X-Q}}return{label:`${Math.floor(Q/1000)}s`,nextDelayMs:uT}}return fT(x)}function O60(x){return x.subagentType??x.workflowName??N60[x.type]}function wH(x){if(x.usage?.duration_ms)return x.usage.duration_ms;if(x.endTime&&x.endTime>x.startedAt)return x.endTime-x.startedAt;return 0}function B60(x,Z,Q="bucket"){let J=(X)=>F3(X,Q).label;switch(x.status){case"running":return`\uD83D\uDFE1 运行中 (${J(Z-x.startedAt)})`;case"paused":return`⏸️ 已暂停 (${J(Z-x.startedAt)})`;case"pending":return"⚪ 等待中";case"completed":return`✅ 用时 ${gH(wH(x))}`;case"failed":return`❌ 失败 ${gH(wH(x))}`;case"killed":return`\uD83D\uDC80 已终止 ${gH(wH(x))}`}}function yT(x){let Z=x.filter((J)=>!Q6(J)).length,Q=x.length-Z;if(Z>0)return`${Z} 进行中${Q?` · ${Q} 已结束`:""}`;return Q?`${Q} 已结束`:"空"}function zJ(x){return`\uD83E\uDDED 后台任务 · ${yT(x)}`}function v60(x){let Z=[];if(x.error)Z.push(`⚠ ${x.error}`);for(let Q=0;Q<x.steps.length;Q++)Z.push(`${Q+1}. ${x.steps[Q].brief}`);return c8(Z.length>0?Z.join(`
129
- `):"_(暂无执行记录)_")}function n7(x,Z=Date.now(),Q="bucket"){return{tag:"collapsible_panel",element_id:Q2.panel(x.id),header:{title:{tag:"plain_text",content:`${L60[x.type]} ${O60(x)} · ${x.description||"(无描述)"} — ${B60(x,Z,Q)}`}},expanded:!1,elements:[{tag:"markdown",element_id:Q2.body(x.id),content:v60(x)}]}}function nH(x,Z=Date.now(),Q="bucket"){return{schema:"2.0",config:{streaming_mode:!0,summary:{content:zJ(x)}},body:{elements:x.map((J)=>n7(J,Z,Q))}}}function WJ(x,Z=Date.now(),Q="bucket"){let J=x.filter(Q6);return{schema:"2.0",config:{streaming_mode:!1,summary:{content:`\uD83E\uDDED 后台任务(历史) · ${J.length} 已结束`}},body:{elements:J.map((X)=>n7(X,Z,Q))}}}function dH(){return{schema:"2.0",config:{streaming_mode:!1,summary:{content:"↪ 后台任务进行中"}},body:{elements:[{tag:"markdown",element_id:"bg_marker",content:"↪ 本轮后台任务仍在进行,进度已迁至最新卡片"}]}}}var Q2,$60=1000,L60,N60,D60,uT=1000,PH=600000,PT=300000;var iH=R0(()=>{Z6();Q2={panel:(x)=>`bg_${x}`,body:(x)=>`bg_body_${x}`};L60={subagent:"\uD83D\uDFE2",shell:"⚙️",monitor:"\uD83D\uDCE1",workflow:"\uD83D\uDD01",unknown:"\uD83D\uDD39"},N60={subagent:"子agent",shell:"shell",monitor:"监控",workflow:"工作流",unknown:"任务"};D60=[{limit:30000,label:"<30s"},{limit:60000,label:"<1m"},{limit:180000,label:"<3m"},{limit:300000,label:"<5m"},{limit:600000,label:"<10m"}]});function L3(x){return typeof x==="string"&&M60.includes(x)}function d7(x){return x?.startsWith("claude:")?"claude":"codex"}function b6(x){return x==="claude"?"Claude":"Codex"}var M60,U3="max",J2;var i7=R0(()=>{M60=["low","medium","high","xhigh","max"];J2=class J2 extends Error{constructor(x="上下文不足,无需压缩"){super(x);this.name="NothingToCompactError"}}});var _T={};GZ(_T,{tokenSourceFactories:()=>p7,setDefaultTokenSource:()=>sH,scrubAnthropicEnv:()=>Fx,resetTokenSourceRegistry:()=>oH,registerTokenSourceFactory:()=>k6,registerTokenSource:()=>pH,refreshAllTokenSourceModels:()=>K2,listTokenSourcesByAgent:()=>mT,listTokenSources:()=>W2,listEnabledTokenSourcesByAgent:()=>KJ,getTokenSource:()=>J4,defaultTokenSourceId:()=>C60});function Fx(x){let Z={...x};for(let Q of R60)delete Z[Q];return Z}function k6(x){hT.set(x.kind,x)}function p7(){return[...hT.values()]}function pH(x,Z){if(z2.set(x.id,x),Z?.default||X2===null)X2=x.id}function J4(x){return x?z2.get(x):void 0}function W2(){return[...z2.values()]}function mT(x){return W2().filter((Z)=>Z.agent===x)}function KJ(x){return mT(x).filter((Z)=>Z.enabled)}function C60(){return X2}function sH(x){if(z2.has(x))X2=x}function oH(){z2.clear(),X2=null}async function K2(){await Promise.allSettled(W2().map(async(x)=>{await x.refreshModels(),k(`token-source ${x.id}: ${x.models.length} models loaded`)}))}var R60,hT,z2,X2=null;var c4=R0(()=>{X1();R60=["ANTHROPIC_API_KEY","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_BASE_URL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL"];hT=new Map;z2=new Map});import{exec as S60}from"node:child_process";function nT(){S60(`systemctl --user stop ${lT}.timer ${lT}.service 2>/dev/null`,()=>{})}var lT="cc-feishu-rollback-watchdog";var dT=()=>{};import{createRequire as j60}from"node:module";import{execFile as Kx0}from"child_process";import{randomUUID as Vx0}from"crypto";import{createReadStream as XR0,realpathSync as Hx0}from"fs";import{copyFile as Gx0,mkdir as rH,readdir as WR0,readFile as $x0,rm as Fx0,writeFile as LA}from"fs/promises";import{createRequire as Ux0}from"module";import{homedir as BG,tmpdir as Lx0}from"os";import{dirname as pT,isAbsolute as NA,join as q4,relative as Nx0,resolve as gJ,sep as DA}from"path";import{fileURLToPath as Dx0}from"url";import{setMaxListeners as Ox0}from"events";import{spawn as jx0}from"child_process";import{existsSync as Ix0}from"fs";import{createInterface as Tx0}from"readline";import{homedir as z50}from"os";import{join as W50}from"path";import{randomUUID as N90}from"crypto";import{join as qc}from"path";import{AsyncLocalStorage as D90}from"async_hooks";import{appendFile as O90,copyFile as B90,mkdir as v90,open as Ac,readdir as Ec,readFile as bc,stat as M90,unlink as R90,writeFile as KG}from"fs/promises";import{randomBytes as C90}from"crypto";import{chmod as S90,copyFile as j90,rename as I90,unlink as VG,writeFile as T90}from"fs/promises";import{realpathSync as lc}from"fs";import{cwd as QZ0}from"process";import{randomUUID as qG}from"crypto";import{appendFile as pc,mkdir as UZ0,rename as sc,stat as LZ0,symlink as NZ0,unlink as AG}from"fs/promises";import{dirname as ME,join as p$,resolve as DZ0}from"path";import*as u0 from"fs";import{lstat as IZ0,mkdir as TZ0,open as cZ0,readdir as qZ0,readFile as oc,rename as AZ0,rmdir as EZ0,rm as bZ0,stat as kZ0,unlink as gZ0}from"fs/promises";import{existsSync as VQ0}from"fs";import{once as Qq}from"events";import{createWriteStream as NQ0}from"fs";import{execFile as DQ0}from"child_process";import{promisify as OQ0}from"util";import{createHash as IQ0}from"crypto";import{homedir as eR0,userInfo as TQ0}from"os";import q1 from"node:path";import $w from"node:os";import hG from"node:process";import{join as sV0}from"path";import{readdir as GS0,readFile as oV0}from"fs/promises";import{release as Ow}from"os";import{isAbsolute as yq}from"path";function A60(x){return this[x]}function g60(x,Z){this[x]=k60.bind(null,Z)}function vG(x=Bx0){let Z=new AbortController;return Ox0(x,Z.signal),Z}function OA(x){return process.platform==="darwin"?x.normalize("NFC"):x}function vx0(x){return/^[\\/]{2}/.test(x)}function Mx0(x){return/^[\\/]{2}wsl(\$|\.localhost)[\\/]/i.test(x)}function Rx0(x){if(x.startsWith("\\\\?\\UNC\\"))return"\\\\"+x.slice(8);if(x.startsWith("\\\\?\\")&&x.length>=7&&x[5]===":")return x.slice(4);return x}function Cx0(x){if(/^\\\\\?\\volume\{/i.test(x))return sT(x);let Z=Rx0(x);if(Z!==x&&sT(Z))return!0;return vx0(Z)&&!Mx0(Z)}function sT(x){return/(^|[\\/])\.{1,2}([\\/]|$)/.test(x)||x.includes("/")}function BA(x,Z,Q){return new Promise((J,X)=>{if(Z?.aborted){if(Q?.throwOnAbort||Q?.abortError)X(Q.abortError?.()??Error("aborted"));else J();return}let z=setTimeout((G,K,H)=>{G?.removeEventListener("abort",K),H()},x,Z,Y,J);function Y(){if(clearTimeout(z),Q?.throwOnAbort||Q?.abortError)X(Q.abortError?.()??Error("aborted"));else J()}if(Z?.addEventListener("abort",Y,{once:!0}),Q?.unref)z.unref()})}function Sx0(x,Z){x(Error(Z))}function g2(x,Z,Q){let J,X=new Promise((z,Y)=>{J=setTimeout(Sx0,Z,Y,Q)});return Promise.race([x,X]).finally(()=>{if(J!==void 0)clearTimeout(J)})}function MA(){return process.versions.bun!==void 0}function A8(x){if(!x)return!1;if(typeof x==="boolean")return x;let Z=String(x).toLowerCase().trim();return["1","true","yes","on"].includes(Z)}function zY(){let x=new Set;return{subscribe(Z){return x.add(Z),()=>{x.delete(Z)}},emit(...Z){let Q;for(let J of x)try{J(...Z)}catch(X){(Q??=[]).push(X)}if(Q)throw Q.length===1?Q[0]:AggregateError(Q,"Signal listener(s) threw")},clear(){x.clear()}}}function gx0(x){var Z=bx0.call(x,V2),Q=x[V2];try{x[V2]=void 0;var J=!0}catch(z){}var X=kx0.call(x);if(J)if(Z)x[V2]=Q;else delete x[V2];return X}function fx0(x){return ux0.call(x)}function _x0(x){if(x==null)return x===void 0?mx0:hx0;return oT&&oT in Object(x)?Px0(x):yx0(x)}function lx0(x){var Z=typeof x;return x!=null&&(Z=="object"||Z=="function")}function sx0(x){if(!_6(x))return!1;var Z=WY(x);return Z==dx0||Z==ix0||Z==nx0||Z==px0}function rx0(x){return!!rT&&rT in x}function x70(x){if(x!=null){try{return ax0.call(x)}catch(Z){}try{return x+""}catch(Z){}}return""}function V70(x){if(!_6(x)||tx0(x))return!1;var Z=Y$(x)?K70:Q70;return Z.test(Y70(x))}function G70(x,Z){return x==null?void 0:x[Z]}function F70(x,Z){var Q=$70(x,Z);return H70(Q)?Q:void 0}function L70(){this.__data__=h2?h2(null):{},this.size=0}function D70(x){var Z=this.has(x)&&delete this.__data__[x];return this.size-=Z?1:0,Z}function R70(x){var Z=this.__data__;if(h2){var Q=Z[x];return Q===B70?void 0:Q}return M70.call(Z,x)?Z[x]:void 0}function I70(x){var Z=this.__data__;return h2?Z[x]!==void 0:j70.call(Z,x)}function q70(x,Z){var Q=this.__data__;return this.size+=this.has(x)?0:1,Q[x]=h2&&Z===void 0?c70:Z,this}function B5(x){var Z=-1,Q=x==null?0:x.length;this.clear();while(++Z<Q){var J=x[Z];this.set(J[0],J[1])}}function E70(){this.__data__=[],this.size=0}function k70(x,Z){return x===Z||x!==x&&Z!==Z}function g70(x,Z){var Q=x.length;while(Q--)if(DX(x[Q][0],Z))return Q;return-1}function u70(x){var Z=this.__data__,Q=OX(Z,x);if(Q<0)return!1;var J=Z.length-1;if(Q==J)Z.pop();else w70.call(Z,Q,1);return--this.size,!0}function y70(x){var Z=this.__data__,Q=OX(Z,x);return Q<0?void 0:Z[Q][1]}function m70(x){return OX(this.__data__,x)>-1}function l70(x,Z){var Q=this.__data__,J=OX(Q,x);if(J<0)++this.size,Q.push([x,Z]);else Q[J][1]=Z;return this}function v5(x){var Z=-1,Q=x==null?0:x.length;this.clear();while(++Z<Q){var J=x[Z];this.set(J[0],J[1])}}function i70(){this.size=0,this.__data__={hash:new tT,map:new(SA||BX),string:new tT}}function s70(x){var Z=typeof x;return Z=="string"||Z=="number"||Z=="symbol"||Z=="boolean"?x!=="__proto__":x===null}function r70(x,Z){var Q=x.__data__;return o70(Z)?Q[typeof Z=="string"?"string":"hash"]:Q.map}function t70(x){var Z=vX(this,x).delete(x);return this.size-=Z?1:0,Z}function a70(x){return vX(this,x).get(x)}function Y50(x){return vX(this,x).has(x)}function Q50(x,Z){var Q=vX(this,x),J=Q.size;return Q.set(x,Z),this.size+=Q.size==J?0:1,this}function M5(x){var Z=-1,Q=x==null?0:x.length;this.clear();while(++Z<Q){var J=x[Z];this.set(J[0],J[1])}}function J$(x,Z){if(typeof x!="function"||Z!=null&&typeof Z!="function")throw TypeError(X50);var Q=function(){var J=arguments,X=Z?Z.apply(this,J):J[0],z=Q.cache;if(z.has(X))return z.get(X);var Y=x.apply(this,J);return Q.cache=z.set(X,Y)||z,Y};return Q.cache=new(J$.Cache||Q$),Q}function N0(x,Z,Q,J,X){if(J==="m")throw TypeError("Private method is not writable");if(J==="a"&&!X)throw TypeError("Private accessor was defined without a setter");if(typeof Z==="function"?x!==Z||!X:!Z.has(x))throw TypeError("Cannot write private member to an object whose class did not declare it");return J==="a"?X.call(x,Q):X?X.value=Q:Z.set(x,Q),Q}function r(x,Z,Q,J){if(Q==="a"&&!J)throw TypeError("Private accessor was defined without a getter");if(typeof Z==="function"?x!==Z||!J:!Z.has(x))throw TypeError("Cannot read private member from an object whose class did not declare it");return Q==="m"?J:Q==="a"?J.call(x):J?J.value:Z.get(x)}function m2(x){return typeof x==="object"&&x!==null&&(("name"in x)&&x.name==="AbortError"||("message"in x)&&String(x.message).includes("FetchRequestCanceledException"))}function CG(x){if(typeof x!=="object")return{};return x??{}}function aT(x){if(!x)return!0;for(let Z in x)return!1;return!0}function H50(x,Z){return Object.prototype.hasOwnProperty.call(x,Z)}function U50(){if(typeof Deno<"u"&&Deno.build!=null)return"deno";if(typeof EdgeRuntime<"u")return"edge";if(Object.prototype.toString.call(typeof globalThis.process<"u"?globalThis.process:0)==="[object process]")return"node";return"unknown"}function N50(){if(typeof navigator>"u"||!navigator)return null;let x=[{key:"edge",pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"chrome",pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"firefox",pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"safari",pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}];for(let{key:Z,pattern:Q}of x){let J=Q.exec(navigator.userAgent);if(J){let X=J[1]||0,z=J[2]||0,Y=J[3]||0;return{browser:Z,version:`${X}.${z}.${Y}`}}}return null}function D50(){if(typeof fetch<"u")return fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function TA(...x){let Z=globalThis.ReadableStream;if(typeof Z>"u")throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new Z(...x)}function cA(x){let Z=Symbol.asyncIterator in x?x[Symbol.asyncIterator]():x[Symbol.iterator]();return TA({start(){},async pull(Q){let{done:J,value:X}=await Z.next();if(J)Q.close();else Q.enqueue(X)},async cancel(){await Z.return?.()}})}function N$(x){if(x[Symbol.asyncIterator])return x;let Z=x.getReader();return{async next(){try{let Q=await Z.read();if(Q?.done)Z.releaseLock();return Q}catch(Q){throw Z.releaseLock(),Q}},async return(){let Q=Z.cancel();return Z.releaseLock(),await Q,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function O50(x){if(x===null||typeof x!=="object")return;if(x[Symbol.asyncIterator]){await x[Symbol.asyncIterator]().return?.();return}let Z=x.getReader(),Q=Z.cancel();Z.releaseLock(),await Q}function v50(x){return Object.entries(x).filter(([Z,Q])=>typeof Q<"u").map(([Z,Q])=>{if(typeof Q==="string"||typeof Q==="number"||typeof Q==="boolean")return`${encodeURIComponent(Z)}=${encodeURIComponent(Q)}`;if(Q===null)return`${encodeURIComponent(Z)}=`;throw new q0(`Cannot stringify type ${typeof Q}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join("&")}function AA(x){if(!x)return;let Z;try{Z=new URL(x)}catch(J){throw new U1(`Invalid token endpoint base URL "${x}": ${J}`)}if(Z.protocol==="https:")return;let Q=Z.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(Z.protocol==="http:"&&(Q==="localhost"||Q==="127.0.0.1"||Q==="::1"))return;throw new U1(`Refusing to send credential over non-https token endpoint "${x}"`)}async function EA(x,Z){let Q=await T50(x),J;try{J=JSON.parse(Q)}catch{throw new U1(`Token endpoint returned non-JSON response (status ${x.status})`,x.status,H4(Q),Z)}if(!J.access_token)throw new U1(`Token endpoint response missing access_token: ${JSON.stringify(H4(J))}`,x.status,H4(J),Z);if(J.token_type&&J.token_type.toLowerCase()!=="bearer")throw new U1(`Token endpoint response: unsupported token_type "${J.token_type}" (want Bearer)`,x.status,H4(J),Z);return J}function H4(x){if(x==null)return x;if(typeof x==="string"){let Z;try{Z=JSON.parse(x)}catch{if(x.length<=eH)return x;return x.slice(0,eH)+`... <${x.length-eH} more chars>`}return JSON.stringify(H4(Z))}if(typeof x==="object"&&!Array.isArray(x)){let Z={};for(let[Q,J]of Object.entries(x))if(I50.has(Q))Z[Q]=J;return Z}return null}async function bA(x,Z=(Q)=>console.warn(`anthropic-sdk: ${Q}`)){if(typeof process>"u"||process.platform==="win32")return;let Q=await import("node:fs"),J=x,X;try{J=await Q.promises.realpath(x),X=await Q.promises.stat(J)}catch{return}let z=X.mode&511;if(z&18)throw new U1(`Credentials file at ${J} is group/world-writable (mode 0o${z.toString(8)}); this allows other local users to plant tokens. Run \`chmod 600 ${J}\`.`);if(z&36)throw new U1(`Credentials file at ${J} is group/world-readable (mode 0o${z.toString(8)}); run \`chmod 600 ${J}\` before retrying.`);if(typeof process.getuid==="function"&&X.uid!==process.getuid())Z(`credentials file at ${J} is owned by uid ${X.uid} (current process uid ${process.getuid()}); verify this is intentional.`)}async function kA(x,Z){let Q=await import("node:fs"),J=(await import("node:path")).dirname(x);await Q.promises.mkdir(J,{recursive:!0,mode:448});let X=`${x}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;try{let z=await Q.promises.open(X,"w",384);try{await z.writeFile(JSON.stringify(Z,null,2)),await z.sync()}finally{await z.close()}await Q.promises.rename(X,x)}catch(z){throw await Q.promises.unlink(X).catch(()=>{}),z}try{let z=await Q.promises.open(J,"r");try{await z.sync()}finally{await z.close()}}catch{}}async function T50(x){if(!x.body)return"";let Z=x.body.getReader(),Q=[],J=0;for(;;){let{done:z,value:Y}=await Z.read();if(z)break;if(J+Y.length>Qc){let G=Qc-J;if(G>0)Q.push(Y.subarray(0,G));await Z.cancel();break}Q.push(Y),J+=Y.length}let X;if(Q.length===1)X=Q[0];else{X=new Uint8Array(Q.reduce((Y,G)=>Y+G.length,0));let z=0;for(let Y of Q)X.set(Y,z),z+=Y.length}return new TextDecoder("utf-8").decode(X)}function Bx(){return Math.floor(Date.now()/1000)}class gA{constructor(x,Z){this.cached=null,this.pendingRefresh=null,this.nextForce=!1,this.lastAdvisoryError=0,this.provider=x,this.onAdvisoryRefreshError=Z}async getToken(){let x=this.nextForce;this.nextForce=!1;let Z=this.cached;if(x||Z==null)return(await this.refresh(x)).token;if(Z.expiresAt==null)return Z.token;let Q=Z.expiresAt-Bx();if(Q>S50)return Z.token;if(Q>D$)return this.backgroundRefresh(),Z.token;return(await this.refresh()).token}invalidate(){this.cached=null,this.nextForce=!0}refresh(x=!1){if(this.pendingRefresh&&!x)return this.pendingRefresh;return this.doRefresh(x)}backgroundRefresh(){if(this.pendingRefresh)return;if(Bx()-this.lastAdvisoryError<j50)return;this.doRefresh().catch((x)=>{this.lastAdvisoryError=Bx(),this.onAdvisoryRefreshError?.(x)})}doRefresh(x=!1){return this.pendingRefresh=this.provider(x?{forceRefresh:!0}:void 0).then((Z)=>(this.cached=Z,this.pendingRefresh=null,Z),(Z)=>{throw this.pendingRefresh=null,Z}),this.pendingRefresh}}function c50(x){let Z=0;for(let X of x)Z+=X.length;let Q=new Uint8Array(Z),J=0;for(let X of x)Q.set(X,J),J+=X.length;return Q}function O$(x){let Z;return(Jc??(Z=new globalThis.TextEncoder,Jc=Z.encode.bind(Z)))(x)}function zc(x){let Z;return(Xc??(Z=new globalThis.TextDecoder,Xc=Z.decode.bind(Z)))(x)}function T2(){}function VJ(x,Z,Q){if(!Z||wJ[x]>wJ[Q])return T2;else return Z[x].bind(Z)}function x8(x){let Z=x.logger,Q=x.logLevel??"off";if(!Z)return q50;let J=Kc.get(Z);if(J&&J[0]===Q)return J[1];let X={error:VJ("error",Z,Q),warn:VJ("warn",Z,Q),info:VJ("info",Z,Q),debug:VJ("debug",Z,Q)};return Kc.set(Z,[Q,X]),X}function wA(x){if(!x)throw Error("profile name is empty");if(x==="."||x==="..")throw Error(`profile name "${x}" is not allowed`);if(x.includes("/")||x.includes("\\"))throw Error(`profile name "${x}" must not contain path separators`);if(!A50.test(x))throw Error(`profile name "${x}" contains disallowed characters (allowed: letters, digits, '_', '.', '-')`)}function Vc(x){if(!x)throw new q0("Identity token file path is empty");return async()=>{let Z=await import("node:fs"),Q;try{Q=await Z.promises.readFile(x,"utf-8")}catch(X){throw new q0(`Failed to read identity token file at ${x}: ${X}`)}let J=Q.trim();if(!J)throw new q0(`Identity token file at ${x} is empty`);return J}}function g50(x){if(!x)throw new q0("Identity token value is empty");return()=>x}function P50(x){return async()=>{AA(x.baseURL);let Z=await x.identityTokenProvider();if(Z.length>16384)throw new U1(`Identity token is ${Math.ceil(Z.length/1024)} KiB, exceeds the 16 KiB assertion limit`);let Q={grant_type:M50,assertion:Z,federation_rule_id:x.federationRuleId,organization_id:x.organizationId};if(x.serviceAccountId)Q.service_account_id=x.serviceAccountId;if(x.workspaceId)Q.workspace_id=x.workspaceId;let J=`${x.baseURL}${qA}`,X;try{X=await x.fetch(J,{method:"POST",headers:{"Content-Type":"application/json","anthropic-beta":`${PJ},${C50}`,"User-Agent":x.userAgent||`anthropic-sdk-typescript/${M3} oidcFederationProvider`},body:JSON.stringify(Q)})}catch(K){throw new U1(`Failed to reach token endpoint ${J}: ${K}`)}let z=X.headers.get("Request-Id");if(!X.ok){let K=await X.text().catch(()=>""),H=H4(K),W="";if(X.status===401)W=` Ensure your federation rule matches your identity token. ${x.workspaceId?"":"If your federation rule is scoped to multiple workspaces, set the ANTHROPIC_WORKSPACE_ID environment variable, the 'workspace_id' config key, or the `workspaceId` option. "}View your authentication events in the Workload identity page of Claude Console for more details.`;throw new U1(`Token exchange failed with status ${X.status}${z?` (request-id ${z})`:""}: ${H}${W}`,X.status,H,z)}let Y=await EA(X,z),G=Number(Y.expires_in);if(!Number.isFinite(G))throw new U1(`Token endpoint response missing required fields: ${JSON.stringify(H4(Y))}`,X.status,H4(Y),z);return{token:Y.access_token,expiresAt:Bx()+G}}}function w50(x){return async(Z)=>{let Q=await import("node:fs");await bA(x.credentialsPath,x.onSafetyWarning);let J;try{J=await Q.promises.readFile(x.credentialsPath,"utf-8")}catch(B){throw new U1(`Credentials file not found at ${x.credentialsPath}: ${B}`)}let X;try{X=JSON.parse(J)}catch(B){throw new U1(`Credentials file at ${x.credentialsPath} is not valid JSON: ${B}`)}let z=X.access_token;if(!z)throw new U1(`Credentials file at ${x.credentialsPath} must include 'access_token'`);let Y=X.expires_at;if(!Z?.forceRefresh&&(Y==null||Bx()<Y-D$))return{token:z,expiresAt:Y??null};let G=X.refresh_token;if(!x.clientId||!G)throw new U1(`Access token at ${x.credentialsPath} has expired and no refresh is available (client_id ${x.clientId?"set":"empty"}, refresh_token ${G?"set":"empty"})`);AA(x.baseURL);let K={grant_type:R50,refresh_token:G,client_id:x.clientId},H=`${x.baseURL}${qA}`,W;try{W=await x.fetch(H,{method:"POST",headers:{"Content-Type":"application/json","anthropic-beta":PJ,"User-Agent":x.userAgent||`anthropic-sdk-typescript/${M3} userOAuthProvider`},body:JSON.stringify(K)})}catch(B){throw new U1(`User OAuth refresh failed to reach token endpoint: ${B}`)}let L=W.headers.get("Request-Id");if(!W.ok){let B=await W.text().catch(()=>"");throw new U1(`User OAuth refresh failed (HTTP ${W.status}): ${H4(B)}`,W.status,H4(B),L)}let N=await EA(W,L),D=Number(N.expires_in);if(!Number.isFinite(D))throw new U1(`User OAuth refresh response missing or invalid expires_in: ${JSON.stringify(H4(N))}`,W.status,H4(N),L);let O=Bx()+D,v=N.refresh_token||G;return await kA(x.credentialsPath,{...X,version:PA,type:"oauth_token",access_token:N.access_token,expires_at:O,refresh_token:v}),{token:N.access_token,expiresAt:O}}}function fA(x,Z){let Q=x.authentication.credentials_path??null,J=(x.base_url||Z.baseURL).replace(/\/+$/,""),X=f50(x,Q,J,Z),z={};if(x.workspace_id&&x.authentication.type==="user_oauth")z["anthropic-workspace-id"]=x.workspace_id;return{provider:X,extraHeaders:z,baseURL:x.base_url||void 0}}async function u50(x,Z){let Q=await E50(Z);if(!Q)return null;let{config:J,fromFile:X}=Q,z=J.authentication.credentials_path||!X?J:{...J,authentication:{...J.authentication,credentials_path:await b50(J,Z)??void 0}};return fA(z,x)}function f50(x,Z,Q,J){switch(x.authentication.type){case"oidc_federation":{let X=x.authentication,z=y50(X);if(!z)throw new U1("oidc_federation config requires an identity token (set authentication.identity_token, ANTHROPIC_IDENTITY_TOKEN_FILE, or ANTHROPIC_IDENTITY_TOKEN)");if(!X.federation_rule_id)throw new U1("oidc_federation config requires 'federation_rule_id'. Set it in authentication.federation_rule_id in your profile, or via ANTHROPIC_FEDERATION_RULE_ID (profile takes precedence).");if(!x.organization_id)throw new U1("oidc_federation config requires organization_id (set ANTHROPIC_ORGANIZATION_ID or config.organization_id)");let Y=P50({identityTokenProvider:z,federationRuleId:X.federation_rule_id,organizationId:x.organization_id,serviceAccountId:X.service_account_id,workspaceId:x.workspace_id,baseURL:Q,fetch:J.fetch,userAgent:J.userAgent});if(Z)return h50(Y,Z,J.onCacheWriteError,J.onSafetyWarning);return Y}case"user_oauth":{if(!Z)throw new U1("user_oauth config requires authentication.credentials_path (or load via a profile so it defaults to <config_dir>/credentials/<profile>.json)");return w50({credentialsPath:Z,clientId:x.authentication.client_id,baseURL:Q,fetch:J.fetch,userAgent:J.userAgent,onSafetyWarning:J.onSafetyWarning})}default:{let X=x.authentication.type;throw new U1(`authentication.type "${X}" is not a known authentication type`)}}}function y50(x){if(x.identity_token){let J=x.identity_token.source;if(J!=="file")throw new U1(`identity_token.source "${J}" is not supported by this SDK version (only "file")`);if(!x.identity_token.path)throw new U1('identity_token.source "file" requires a non-empty path');return Vc(x.identity_token.path)}let Z=V1("ANTHROPIC_IDENTITY_TOKEN_FILE");if(Z)return Vc(Z);let Q=V1("ANTHROPIC_IDENTITY_TOKEN");if(Q)return g50(Q);return null}function h50(x,Z,Q,J){return async(X)=>{let z=await import("node:fs");await bA(Z,J);let Y;try{let K=await z.promises.readFile(Z,"utf-8");Y=JSON.parse(K);let H=Y?.access_token;if(H&&!X?.forceRefresh){let W=Y?.expires_at;if(W==null||Bx()<W-D$)return{token:H,expiresAt:W??null}}}catch(K){if(K?.code!=="ENOENT"&&!(K instanceof SyntaxError))Q?.(K)}let G=await x(X);try{await kA(Z,{...Y??{},version:PA,type:"oauth_token",access_token:G.token,expires_at:G.expiresAt})}catch(K){Q?.(K)}return G}}class R5{constructor(){l8.set(this,void 0),n8.set(this,void 0),N0(this,l8,new Uint8Array,"f"),N0(this,n8,null,"f")}decode(x){if(x==null)return[];let Z=x instanceof ArrayBuffer?new Uint8Array(x):typeof x==="string"?O$(x):x;N0(this,l8,c50([r(this,l8,"f"),Z]),"f");let Q=[],J;while((J=m50(r(this,l8,"f"),r(this,n8,"f")))!=null){if(J.carriage&&r(this,n8,"f")==null){N0(this,n8,J.index,"f");continue}if(r(this,n8,"f")!=null&&(J.index!==r(this,n8,"f")+1||J.carriage)){Q.push(zc(r(this,l8,"f").subarray(0,r(this,n8,"f")-1))),N0(this,l8,r(this,l8,"f").subarray(r(this,n8,"f")),"f"),N0(this,n8,null,"f");continue}let X=r(this,n8,"f")!==null?J.preceding-1:J.preceding,z=zc(r(this,l8,"f").subarray(0,X));Q.push(z),N0(this,l8,r(this,l8,"f").subarray(J.index),"f"),N0(this,n8,null,"f")}return Q}flush(){if(!r(this,l8,"f").length)return[];return this.decode(`
129
+ `):"_(暂无执行记录)_")}function n7(x,Z=Date.now(),Q="bucket"){return{tag:"collapsible_panel",element_id:Q2.panel(x.id),header:{title:{tag:"plain_text",content:`${L60[x.type]} ${O60(x)} · ${x.description||"(无描述)"} — ${B60(x,Z,Q)}`}},expanded:!1,elements:[{tag:"markdown",element_id:Q2.body(x.id),content:v60(x)}]}}function nH(x,Z=Date.now(),Q="bucket"){return{schema:"2.0",config:{streaming_mode:!0,summary:{content:zJ(x)}},body:{elements:x.map((J)=>n7(J,Z,Q))}}}function WJ(x,Z=Date.now(),Q="bucket"){let J=x.filter(Q6);return{schema:"2.0",config:{streaming_mode:!1,summary:{content:`\uD83E\uDDED 后台任务(历史) · ${J.length} 已结束`}},body:{elements:J.map((X)=>n7(X,Z,Q))}}}function dH(){return{schema:"2.0",config:{streaming_mode:!1,summary:{content:"↪ 后台任务进行中"}},body:{elements:[{tag:"markdown",element_id:"bg_marker",content:"↪ 本轮后台任务仍在进行,进度已迁至最新卡片"}]}}}var Q2,$60=1000,L60,N60,D60,uT=1000,PH=600000,PT=300000;var iH=R0(()=>{Z6();Q2={panel:(x)=>`bg_${x}`,body:(x)=>`bg_body_${x}`};L60={subagent:"\uD83D\uDFE2",shell:"⚙️",monitor:"\uD83D\uDCE1",workflow:"\uD83D\uDD01",unknown:"\uD83D\uDD39"},N60={subagent:"子agent",shell:"shell",monitor:"监控",workflow:"工作流",unknown:"任务"};D60=[{limit:30000,label:"<30s"},{limit:60000,label:"<1m"},{limit:180000,label:"<3m"},{limit:300000,label:"<5m"},{limit:600000,label:"<10m"}]});function L3(x){return typeof x==="string"&&M60.includes(x)}function d7(x){return x?.startsWith("claude:")?"claude":"codex"}function b6(x){return x==="claude"?"Claude":"Codex"}var M60,U3="max",J2;var i7=R0(()=>{M60=["low","medium","high","xhigh","max"];J2=class J2 extends Error{constructor(x="上下文窗口充足,无需压缩"){super(x);this.name="NothingToCompactError"}}});var _T={};GZ(_T,{tokenSourceFactories:()=>p7,setDefaultTokenSource:()=>sH,scrubAnthropicEnv:()=>Fx,resetTokenSourceRegistry:()=>oH,registerTokenSourceFactory:()=>k6,registerTokenSource:()=>pH,refreshAllTokenSourceModels:()=>K2,listTokenSourcesByAgent:()=>mT,listTokenSources:()=>W2,listEnabledTokenSourcesByAgent:()=>KJ,getTokenSource:()=>J4,defaultTokenSourceId:()=>C60});function Fx(x){let Z={...x};for(let Q of R60)delete Z[Q];return Z}function k6(x){hT.set(x.kind,x)}function p7(){return[...hT.values()]}function pH(x,Z){if(z2.set(x.id,x),Z?.default||X2===null)X2=x.id}function J4(x){return x?z2.get(x):void 0}function W2(){return[...z2.values()]}function mT(x){return W2().filter((Z)=>Z.agent===x)}function KJ(x){return mT(x).filter((Z)=>Z.enabled)}function C60(){return X2}function sH(x){if(z2.has(x))X2=x}function oH(){z2.clear(),X2=null}async function K2(){await Promise.allSettled(W2().map(async(x)=>{await x.refreshModels(),k(`token-source ${x.id}: ${x.models.length} models loaded`)}))}var R60,hT,z2,X2=null;var c4=R0(()=>{X1();R60=["ANTHROPIC_API_KEY","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_BASE_URL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL"];hT=new Map;z2=new Map});import{exec as S60}from"node:child_process";function nT(){S60(`systemctl --user stop ${lT}.timer ${lT}.service 2>/dev/null`,()=>{})}var lT="cc-feishu-rollback-watchdog";var dT=()=>{};import{createRequire as j60}from"node:module";import{execFile as Kx0}from"child_process";import{randomUUID as Vx0}from"crypto";import{createReadStream as XR0,realpathSync as Hx0}from"fs";import{copyFile as Gx0,mkdir as rH,readdir as WR0,readFile as $x0,rm as Fx0,writeFile as LA}from"fs/promises";import{createRequire as Ux0}from"module";import{homedir as BG,tmpdir as Lx0}from"os";import{dirname as pT,isAbsolute as NA,join as q4,relative as Nx0,resolve as gJ,sep as DA}from"path";import{fileURLToPath as Dx0}from"url";import{setMaxListeners as Ox0}from"events";import{spawn as jx0}from"child_process";import{existsSync as Ix0}from"fs";import{createInterface as Tx0}from"readline";import{homedir as z50}from"os";import{join as W50}from"path";import{randomUUID as N90}from"crypto";import{join as qc}from"path";import{AsyncLocalStorage as D90}from"async_hooks";import{appendFile as O90,copyFile as B90,mkdir as v90,open as Ac,readdir as Ec,readFile as bc,stat as M90,unlink as R90,writeFile as KG}from"fs/promises";import{randomBytes as C90}from"crypto";import{chmod as S90,copyFile as j90,rename as I90,unlink as VG,writeFile as T90}from"fs/promises";import{realpathSync as lc}from"fs";import{cwd as QZ0}from"process";import{randomUUID as qG}from"crypto";import{appendFile as pc,mkdir as UZ0,rename as sc,stat as LZ0,symlink as NZ0,unlink as AG}from"fs/promises";import{dirname as ME,join as p$,resolve as DZ0}from"path";import*as u0 from"fs";import{lstat as IZ0,mkdir as TZ0,open as cZ0,readdir as qZ0,readFile as oc,rename as AZ0,rmdir as EZ0,rm as bZ0,stat as kZ0,unlink as gZ0}from"fs/promises";import{existsSync as VQ0}from"fs";import{once as Qq}from"events";import{createWriteStream as NQ0}from"fs";import{execFile as DQ0}from"child_process";import{promisify as OQ0}from"util";import{createHash as IQ0}from"crypto";import{homedir as eR0,userInfo as TQ0}from"os";import q1 from"node:path";import $w from"node:os";import hG from"node:process";import{join as sV0}from"path";import{readdir as GS0,readFile as oV0}from"fs/promises";import{release as Ow}from"os";import{isAbsolute as yq}from"path";function A60(x){return this[x]}function g60(x,Z){this[x]=k60.bind(null,Z)}function vG(x=Bx0){let Z=new AbortController;return Ox0(x,Z.signal),Z}function OA(x){return process.platform==="darwin"?x.normalize("NFC"):x}function vx0(x){return/^[\\/]{2}/.test(x)}function Mx0(x){return/^[\\/]{2}wsl(\$|\.localhost)[\\/]/i.test(x)}function Rx0(x){if(x.startsWith("\\\\?\\UNC\\"))return"\\\\"+x.slice(8);if(x.startsWith("\\\\?\\")&&x.length>=7&&x[5]===":")return x.slice(4);return x}function Cx0(x){if(/^\\\\\?\\volume\{/i.test(x))return sT(x);let Z=Rx0(x);if(Z!==x&&sT(Z))return!0;return vx0(Z)&&!Mx0(Z)}function sT(x){return/(^|[\\/])\.{1,2}([\\/]|$)/.test(x)||x.includes("/")}function BA(x,Z,Q){return new Promise((J,X)=>{if(Z?.aborted){if(Q?.throwOnAbort||Q?.abortError)X(Q.abortError?.()??Error("aborted"));else J();return}let z=setTimeout((G,K,H)=>{G?.removeEventListener("abort",K),H()},x,Z,Y,J);function Y(){if(clearTimeout(z),Q?.throwOnAbort||Q?.abortError)X(Q.abortError?.()??Error("aborted"));else J()}if(Z?.addEventListener("abort",Y,{once:!0}),Q?.unref)z.unref()})}function Sx0(x,Z){x(Error(Z))}function g2(x,Z,Q){let J,X=new Promise((z,Y)=>{J=setTimeout(Sx0,Z,Y,Q)});return Promise.race([x,X]).finally(()=>{if(J!==void 0)clearTimeout(J)})}function MA(){return process.versions.bun!==void 0}function A8(x){if(!x)return!1;if(typeof x==="boolean")return x;let Z=String(x).toLowerCase().trim();return["1","true","yes","on"].includes(Z)}function zY(){let x=new Set;return{subscribe(Z){return x.add(Z),()=>{x.delete(Z)}},emit(...Z){let Q;for(let J of x)try{J(...Z)}catch(X){(Q??=[]).push(X)}if(Q)throw Q.length===1?Q[0]:AggregateError(Q,"Signal listener(s) threw")},clear(){x.clear()}}}function gx0(x){var Z=bx0.call(x,V2),Q=x[V2];try{x[V2]=void 0;var J=!0}catch(z){}var X=kx0.call(x);if(J)if(Z)x[V2]=Q;else delete x[V2];return X}function fx0(x){return ux0.call(x)}function _x0(x){if(x==null)return x===void 0?mx0:hx0;return oT&&oT in Object(x)?Px0(x):yx0(x)}function lx0(x){var Z=typeof x;return x!=null&&(Z=="object"||Z=="function")}function sx0(x){if(!_6(x))return!1;var Z=WY(x);return Z==dx0||Z==ix0||Z==nx0||Z==px0}function rx0(x){return!!rT&&rT in x}function x70(x){if(x!=null){try{return ax0.call(x)}catch(Z){}try{return x+""}catch(Z){}}return""}function V70(x){if(!_6(x)||tx0(x))return!1;var Z=Y$(x)?K70:Q70;return Z.test(Y70(x))}function G70(x,Z){return x==null?void 0:x[Z]}function F70(x,Z){var Q=$70(x,Z);return H70(Q)?Q:void 0}function L70(){this.__data__=h2?h2(null):{},this.size=0}function D70(x){var Z=this.has(x)&&delete this.__data__[x];return this.size-=Z?1:0,Z}function R70(x){var Z=this.__data__;if(h2){var Q=Z[x];return Q===B70?void 0:Q}return M70.call(Z,x)?Z[x]:void 0}function I70(x){var Z=this.__data__;return h2?Z[x]!==void 0:j70.call(Z,x)}function q70(x,Z){var Q=this.__data__;return this.size+=this.has(x)?0:1,Q[x]=h2&&Z===void 0?c70:Z,this}function B5(x){var Z=-1,Q=x==null?0:x.length;this.clear();while(++Z<Q){var J=x[Z];this.set(J[0],J[1])}}function E70(){this.__data__=[],this.size=0}function k70(x,Z){return x===Z||x!==x&&Z!==Z}function g70(x,Z){var Q=x.length;while(Q--)if(DX(x[Q][0],Z))return Q;return-1}function u70(x){var Z=this.__data__,Q=OX(Z,x);if(Q<0)return!1;var J=Z.length-1;if(Q==J)Z.pop();else w70.call(Z,Q,1);return--this.size,!0}function y70(x){var Z=this.__data__,Q=OX(Z,x);return Q<0?void 0:Z[Q][1]}function m70(x){return OX(this.__data__,x)>-1}function l70(x,Z){var Q=this.__data__,J=OX(Q,x);if(J<0)++this.size,Q.push([x,Z]);else Q[J][1]=Z;return this}function v5(x){var Z=-1,Q=x==null?0:x.length;this.clear();while(++Z<Q){var J=x[Z];this.set(J[0],J[1])}}function i70(){this.size=0,this.__data__={hash:new tT,map:new(SA||BX),string:new tT}}function s70(x){var Z=typeof x;return Z=="string"||Z=="number"||Z=="symbol"||Z=="boolean"?x!=="__proto__":x===null}function r70(x,Z){var Q=x.__data__;return o70(Z)?Q[typeof Z=="string"?"string":"hash"]:Q.map}function t70(x){var Z=vX(this,x).delete(x);return this.size-=Z?1:0,Z}function a70(x){return vX(this,x).get(x)}function Y50(x){return vX(this,x).has(x)}function Q50(x,Z){var Q=vX(this,x),J=Q.size;return Q.set(x,Z),this.size+=Q.size==J?0:1,this}function M5(x){var Z=-1,Q=x==null?0:x.length;this.clear();while(++Z<Q){var J=x[Z];this.set(J[0],J[1])}}function J$(x,Z){if(typeof x!="function"||Z!=null&&typeof Z!="function")throw TypeError(X50);var Q=function(){var J=arguments,X=Z?Z.apply(this,J):J[0],z=Q.cache;if(z.has(X))return z.get(X);var Y=x.apply(this,J);return Q.cache=z.set(X,Y)||z,Y};return Q.cache=new(J$.Cache||Q$),Q}function N0(x,Z,Q,J,X){if(J==="m")throw TypeError("Private method is not writable");if(J==="a"&&!X)throw TypeError("Private accessor was defined without a setter");if(typeof Z==="function"?x!==Z||!X:!Z.has(x))throw TypeError("Cannot write private member to an object whose class did not declare it");return J==="a"?X.call(x,Q):X?X.value=Q:Z.set(x,Q),Q}function r(x,Z,Q,J){if(Q==="a"&&!J)throw TypeError("Private accessor was defined without a getter");if(typeof Z==="function"?x!==Z||!J:!Z.has(x))throw TypeError("Cannot read private member from an object whose class did not declare it");return Q==="m"?J:Q==="a"?J.call(x):J?J.value:Z.get(x)}function m2(x){return typeof x==="object"&&x!==null&&(("name"in x)&&x.name==="AbortError"||("message"in x)&&String(x.message).includes("FetchRequestCanceledException"))}function CG(x){if(typeof x!=="object")return{};return x??{}}function aT(x){if(!x)return!0;for(let Z in x)return!1;return!0}function H50(x,Z){return Object.prototype.hasOwnProperty.call(x,Z)}function U50(){if(typeof Deno<"u"&&Deno.build!=null)return"deno";if(typeof EdgeRuntime<"u")return"edge";if(Object.prototype.toString.call(typeof globalThis.process<"u"?globalThis.process:0)==="[object process]")return"node";return"unknown"}function N50(){if(typeof navigator>"u"||!navigator)return null;let x=[{key:"edge",pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"chrome",pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"firefox",pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"safari",pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}];for(let{key:Z,pattern:Q}of x){let J=Q.exec(navigator.userAgent);if(J){let X=J[1]||0,z=J[2]||0,Y=J[3]||0;return{browser:Z,version:`${X}.${z}.${Y}`}}}return null}function D50(){if(typeof fetch<"u")return fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function TA(...x){let Z=globalThis.ReadableStream;if(typeof Z>"u")throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new Z(...x)}function cA(x){let Z=Symbol.asyncIterator in x?x[Symbol.asyncIterator]():x[Symbol.iterator]();return TA({start(){},async pull(Q){let{done:J,value:X}=await Z.next();if(J)Q.close();else Q.enqueue(X)},async cancel(){await Z.return?.()}})}function N$(x){if(x[Symbol.asyncIterator])return x;let Z=x.getReader();return{async next(){try{let Q=await Z.read();if(Q?.done)Z.releaseLock();return Q}catch(Q){throw Z.releaseLock(),Q}},async return(){let Q=Z.cancel();return Z.releaseLock(),await Q,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function O50(x){if(x===null||typeof x!=="object")return;if(x[Symbol.asyncIterator]){await x[Symbol.asyncIterator]().return?.();return}let Z=x.getReader(),Q=Z.cancel();Z.releaseLock(),await Q}function v50(x){return Object.entries(x).filter(([Z,Q])=>typeof Q<"u").map(([Z,Q])=>{if(typeof Q==="string"||typeof Q==="number"||typeof Q==="boolean")return`${encodeURIComponent(Z)}=${encodeURIComponent(Q)}`;if(Q===null)return`${encodeURIComponent(Z)}=`;throw new q0(`Cannot stringify type ${typeof Q}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join("&")}function AA(x){if(!x)return;let Z;try{Z=new URL(x)}catch(J){throw new U1(`Invalid token endpoint base URL "${x}": ${J}`)}if(Z.protocol==="https:")return;let Q=Z.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(Z.protocol==="http:"&&(Q==="localhost"||Q==="127.0.0.1"||Q==="::1"))return;throw new U1(`Refusing to send credential over non-https token endpoint "${x}"`)}async function EA(x,Z){let Q=await T50(x),J;try{J=JSON.parse(Q)}catch{throw new U1(`Token endpoint returned non-JSON response (status ${x.status})`,x.status,H4(Q),Z)}if(!J.access_token)throw new U1(`Token endpoint response missing access_token: ${JSON.stringify(H4(J))}`,x.status,H4(J),Z);if(J.token_type&&J.token_type.toLowerCase()!=="bearer")throw new U1(`Token endpoint response: unsupported token_type "${J.token_type}" (want Bearer)`,x.status,H4(J),Z);return J}function H4(x){if(x==null)return x;if(typeof x==="string"){let Z;try{Z=JSON.parse(x)}catch{if(x.length<=eH)return x;return x.slice(0,eH)+`... <${x.length-eH} more chars>`}return JSON.stringify(H4(Z))}if(typeof x==="object"&&!Array.isArray(x)){let Z={};for(let[Q,J]of Object.entries(x))if(I50.has(Q))Z[Q]=J;return Z}return null}async function bA(x,Z=(Q)=>console.warn(`anthropic-sdk: ${Q}`)){if(typeof process>"u"||process.platform==="win32")return;let Q=await import("node:fs"),J=x,X;try{J=await Q.promises.realpath(x),X=await Q.promises.stat(J)}catch{return}let z=X.mode&511;if(z&18)throw new U1(`Credentials file at ${J} is group/world-writable (mode 0o${z.toString(8)}); this allows other local users to plant tokens. Run \`chmod 600 ${J}\`.`);if(z&36)throw new U1(`Credentials file at ${J} is group/world-readable (mode 0o${z.toString(8)}); run \`chmod 600 ${J}\` before retrying.`);if(typeof process.getuid==="function"&&X.uid!==process.getuid())Z(`credentials file at ${J} is owned by uid ${X.uid} (current process uid ${process.getuid()}); verify this is intentional.`)}async function kA(x,Z){let Q=await import("node:fs"),J=(await import("node:path")).dirname(x);await Q.promises.mkdir(J,{recursive:!0,mode:448});let X=`${x}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;try{let z=await Q.promises.open(X,"w",384);try{await z.writeFile(JSON.stringify(Z,null,2)),await z.sync()}finally{await z.close()}await Q.promises.rename(X,x)}catch(z){throw await Q.promises.unlink(X).catch(()=>{}),z}try{let z=await Q.promises.open(J,"r");try{await z.sync()}finally{await z.close()}}catch{}}async function T50(x){if(!x.body)return"";let Z=x.body.getReader(),Q=[],J=0;for(;;){let{done:z,value:Y}=await Z.read();if(z)break;if(J+Y.length>Qc){let G=Qc-J;if(G>0)Q.push(Y.subarray(0,G));await Z.cancel();break}Q.push(Y),J+=Y.length}let X;if(Q.length===1)X=Q[0];else{X=new Uint8Array(Q.reduce((Y,G)=>Y+G.length,0));let z=0;for(let Y of Q)X.set(Y,z),z+=Y.length}return new TextDecoder("utf-8").decode(X)}function Bx(){return Math.floor(Date.now()/1000)}class gA{constructor(x,Z){this.cached=null,this.pendingRefresh=null,this.nextForce=!1,this.lastAdvisoryError=0,this.provider=x,this.onAdvisoryRefreshError=Z}async getToken(){let x=this.nextForce;this.nextForce=!1;let Z=this.cached;if(x||Z==null)return(await this.refresh(x)).token;if(Z.expiresAt==null)return Z.token;let Q=Z.expiresAt-Bx();if(Q>S50)return Z.token;if(Q>D$)return this.backgroundRefresh(),Z.token;return(await this.refresh()).token}invalidate(){this.cached=null,this.nextForce=!0}refresh(x=!1){if(this.pendingRefresh&&!x)return this.pendingRefresh;return this.doRefresh(x)}backgroundRefresh(){if(this.pendingRefresh)return;if(Bx()-this.lastAdvisoryError<j50)return;this.doRefresh().catch((x)=>{this.lastAdvisoryError=Bx(),this.onAdvisoryRefreshError?.(x)})}doRefresh(x=!1){return this.pendingRefresh=this.provider(x?{forceRefresh:!0}:void 0).then((Z)=>(this.cached=Z,this.pendingRefresh=null,Z),(Z)=>{throw this.pendingRefresh=null,Z}),this.pendingRefresh}}function c50(x){let Z=0;for(let X of x)Z+=X.length;let Q=new Uint8Array(Z),J=0;for(let X of x)Q.set(X,J),J+=X.length;return Q}function O$(x){let Z;return(Jc??(Z=new globalThis.TextEncoder,Jc=Z.encode.bind(Z)))(x)}function zc(x){let Z;return(Xc??(Z=new globalThis.TextDecoder,Xc=Z.decode.bind(Z)))(x)}function T2(){}function VJ(x,Z,Q){if(!Z||wJ[x]>wJ[Q])return T2;else return Z[x].bind(Z)}function x8(x){let Z=x.logger,Q=x.logLevel??"off";if(!Z)return q50;let J=Kc.get(Z);if(J&&J[0]===Q)return J[1];let X={error:VJ("error",Z,Q),warn:VJ("warn",Z,Q),info:VJ("info",Z,Q),debug:VJ("debug",Z,Q)};return Kc.set(Z,[Q,X]),X}function wA(x){if(!x)throw Error("profile name is empty");if(x==="."||x==="..")throw Error(`profile name "${x}" is not allowed`);if(x.includes("/")||x.includes("\\"))throw Error(`profile name "${x}" must not contain path separators`);if(!A50.test(x))throw Error(`profile name "${x}" contains disallowed characters (allowed: letters, digits, '_', '.', '-')`)}function Vc(x){if(!x)throw new q0("Identity token file path is empty");return async()=>{let Z=await import("node:fs"),Q;try{Q=await Z.promises.readFile(x,"utf-8")}catch(X){throw new q0(`Failed to read identity token file at ${x}: ${X}`)}let J=Q.trim();if(!J)throw new q0(`Identity token file at ${x} is empty`);return J}}function g50(x){if(!x)throw new q0("Identity token value is empty");return()=>x}function P50(x){return async()=>{AA(x.baseURL);let Z=await x.identityTokenProvider();if(Z.length>16384)throw new U1(`Identity token is ${Math.ceil(Z.length/1024)} KiB, exceeds the 16 KiB assertion limit`);let Q={grant_type:M50,assertion:Z,federation_rule_id:x.federationRuleId,organization_id:x.organizationId};if(x.serviceAccountId)Q.service_account_id=x.serviceAccountId;if(x.workspaceId)Q.workspace_id=x.workspaceId;let J=`${x.baseURL}${qA}`,X;try{X=await x.fetch(J,{method:"POST",headers:{"Content-Type":"application/json","anthropic-beta":`${PJ},${C50}`,"User-Agent":x.userAgent||`anthropic-sdk-typescript/${M3} oidcFederationProvider`},body:JSON.stringify(Q)})}catch(K){throw new U1(`Failed to reach token endpoint ${J}: ${K}`)}let z=X.headers.get("Request-Id");if(!X.ok){let K=await X.text().catch(()=>""),H=H4(K),W="";if(X.status===401)W=` Ensure your federation rule matches your identity token. ${x.workspaceId?"":"If your federation rule is scoped to multiple workspaces, set the ANTHROPIC_WORKSPACE_ID environment variable, the 'workspace_id' config key, or the `workspaceId` option. "}View your authentication events in the Workload identity page of Claude Console for more details.`;throw new U1(`Token exchange failed with status ${X.status}${z?` (request-id ${z})`:""}: ${H}${W}`,X.status,H,z)}let Y=await EA(X,z),G=Number(Y.expires_in);if(!Number.isFinite(G))throw new U1(`Token endpoint response missing required fields: ${JSON.stringify(H4(Y))}`,X.status,H4(Y),z);return{token:Y.access_token,expiresAt:Bx()+G}}}function w50(x){return async(Z)=>{let Q=await import("node:fs");await bA(x.credentialsPath,x.onSafetyWarning);let J;try{J=await Q.promises.readFile(x.credentialsPath,"utf-8")}catch(B){throw new U1(`Credentials file not found at ${x.credentialsPath}: ${B}`)}let X;try{X=JSON.parse(J)}catch(B){throw new U1(`Credentials file at ${x.credentialsPath} is not valid JSON: ${B}`)}let z=X.access_token;if(!z)throw new U1(`Credentials file at ${x.credentialsPath} must include 'access_token'`);let Y=X.expires_at;if(!Z?.forceRefresh&&(Y==null||Bx()<Y-D$))return{token:z,expiresAt:Y??null};let G=X.refresh_token;if(!x.clientId||!G)throw new U1(`Access token at ${x.credentialsPath} has expired and no refresh is available (client_id ${x.clientId?"set":"empty"}, refresh_token ${G?"set":"empty"})`);AA(x.baseURL);let K={grant_type:R50,refresh_token:G,client_id:x.clientId},H=`${x.baseURL}${qA}`,W;try{W=await x.fetch(H,{method:"POST",headers:{"Content-Type":"application/json","anthropic-beta":PJ,"User-Agent":x.userAgent||`anthropic-sdk-typescript/${M3} userOAuthProvider`},body:JSON.stringify(K)})}catch(B){throw new U1(`User OAuth refresh failed to reach token endpoint: ${B}`)}let L=W.headers.get("Request-Id");if(!W.ok){let B=await W.text().catch(()=>"");throw new U1(`User OAuth refresh failed (HTTP ${W.status}): ${H4(B)}`,W.status,H4(B),L)}let N=await EA(W,L),D=Number(N.expires_in);if(!Number.isFinite(D))throw new U1(`User OAuth refresh response missing or invalid expires_in: ${JSON.stringify(H4(N))}`,W.status,H4(N),L);let O=Bx()+D,v=N.refresh_token||G;return await kA(x.credentialsPath,{...X,version:PA,type:"oauth_token",access_token:N.access_token,expires_at:O,refresh_token:v}),{token:N.access_token,expiresAt:O}}}function fA(x,Z){let Q=x.authentication.credentials_path??null,J=(x.base_url||Z.baseURL).replace(/\/+$/,""),X=f50(x,Q,J,Z),z={};if(x.workspace_id&&x.authentication.type==="user_oauth")z["anthropic-workspace-id"]=x.workspace_id;return{provider:X,extraHeaders:z,baseURL:x.base_url||void 0}}async function u50(x,Z){let Q=await E50(Z);if(!Q)return null;let{config:J,fromFile:X}=Q,z=J.authentication.credentials_path||!X?J:{...J,authentication:{...J.authentication,credentials_path:await b50(J,Z)??void 0}};return fA(z,x)}function f50(x,Z,Q,J){switch(x.authentication.type){case"oidc_federation":{let X=x.authentication,z=y50(X);if(!z)throw new U1("oidc_federation config requires an identity token (set authentication.identity_token, ANTHROPIC_IDENTITY_TOKEN_FILE, or ANTHROPIC_IDENTITY_TOKEN)");if(!X.federation_rule_id)throw new U1("oidc_federation config requires 'federation_rule_id'. Set it in authentication.federation_rule_id in your profile, or via ANTHROPIC_FEDERATION_RULE_ID (profile takes precedence).");if(!x.organization_id)throw new U1("oidc_federation config requires organization_id (set ANTHROPIC_ORGANIZATION_ID or config.organization_id)");let Y=P50({identityTokenProvider:z,federationRuleId:X.federation_rule_id,organizationId:x.organization_id,serviceAccountId:X.service_account_id,workspaceId:x.workspace_id,baseURL:Q,fetch:J.fetch,userAgent:J.userAgent});if(Z)return h50(Y,Z,J.onCacheWriteError,J.onSafetyWarning);return Y}case"user_oauth":{if(!Z)throw new U1("user_oauth config requires authentication.credentials_path (or load via a profile so it defaults to <config_dir>/credentials/<profile>.json)");return w50({credentialsPath:Z,clientId:x.authentication.client_id,baseURL:Q,fetch:J.fetch,userAgent:J.userAgent,onSafetyWarning:J.onSafetyWarning})}default:{let X=x.authentication.type;throw new U1(`authentication.type "${X}" is not a known authentication type`)}}}function y50(x){if(x.identity_token){let J=x.identity_token.source;if(J!=="file")throw new U1(`identity_token.source "${J}" is not supported by this SDK version (only "file")`);if(!x.identity_token.path)throw new U1('identity_token.source "file" requires a non-empty path');return Vc(x.identity_token.path)}let Z=V1("ANTHROPIC_IDENTITY_TOKEN_FILE");if(Z)return Vc(Z);let Q=V1("ANTHROPIC_IDENTITY_TOKEN");if(Q)return g50(Q);return null}function h50(x,Z,Q,J){return async(X)=>{let z=await import("node:fs");await bA(Z,J);let Y;try{let K=await z.promises.readFile(Z,"utf-8");Y=JSON.parse(K);let H=Y?.access_token;if(H&&!X?.forceRefresh){let W=Y?.expires_at;if(W==null||Bx()<W-D$)return{token:H,expiresAt:W??null}}}catch(K){if(K?.code!=="ENOENT"&&!(K instanceof SyntaxError))Q?.(K)}let G=await x(X);try{await kA(Z,{...Y??{},version:PA,type:"oauth_token",access_token:G.token,expires_at:G.expiresAt})}catch(K){Q?.(K)}return G}}class R5{constructor(){l8.set(this,void 0),n8.set(this,void 0),N0(this,l8,new Uint8Array,"f"),N0(this,n8,null,"f")}decode(x){if(x==null)return[];let Z=x instanceof ArrayBuffer?new Uint8Array(x):typeof x==="string"?O$(x):x;N0(this,l8,c50([r(this,l8,"f"),Z]),"f");let Q=[],J;while((J=m50(r(this,l8,"f"),r(this,n8,"f")))!=null){if(J.carriage&&r(this,n8,"f")==null){N0(this,n8,J.index,"f");continue}if(r(this,n8,"f")!=null&&(J.index!==r(this,n8,"f")+1||J.carriage)){Q.push(zc(r(this,l8,"f").subarray(0,r(this,n8,"f")-1))),N0(this,l8,r(this,l8,"f").subarray(r(this,n8,"f")),"f"),N0(this,n8,null,"f");continue}let X=r(this,n8,"f")!==null?J.preceding-1:J.preceding,z=zc(r(this,l8,"f").subarray(0,X));Q.push(z),N0(this,l8,r(this,l8,"f").subarray(J.index),"f"),N0(this,n8,null,"f")}return Q}flush(){if(!r(this,l8,"f").length)return[];return this.decode(`
130
130
  `)}}function m50(x,Z){for(let Q=Z??0;Q<x.length;Q++){if(x[Q]===10)return{preceding:Q,index:Q+1,carriage:!1};if(x[Q]===13)return{preceding:Q,index:Q+1,carriage:!0}}return null}function _50(x){for(let Z=0;Z<x.length-1;Z++){if(x[Z]===10&&x[Z+1]===10)return Z+2;if(x[Z]===13&&x[Z+1]===13)return Z+2;if(x[Z]===13&&x[Z+1]===10&&Z+3<x.length&&x[Z+2]===13&&x[Z+3]===10)return Z+4}return-1}async function*l50(x,Z){if(!x.body){if(Z.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative")throw new q0("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api");throw new q0("Attempted to iterate over a response with no body")}let Q=new yA,J=new R5,X=N$(x.body);for await(let z of n50(X))for(let Y of J.decode(z)){let G=Q.decode(Y);if(G)yield G}for(let z of J.flush()){let Y=Q.decode(z);if(Y)yield Y}}async function*n50(x){let Z=new Uint8Array;for await(let Q of x){if(Q==null)continue;let J=Q instanceof ArrayBuffer?new Uint8Array(Q):typeof Q==="string"?O$(Q):Q,X=new Uint8Array(Z.length+J.length);X.set(Z),X.set(J,Z.length),Z=X;let z;while((z=_50(Z))!==-1)yield Z.slice(0,z),Z=Z.slice(z)}if(Z.length>0)yield Z}class yA{constructor(){this.event=null,this.data=[],this.chunks=[]}decode(x){if(x.endsWith("\r"))x=x.substring(0,x.length-1);if(!x){if(!this.event&&!this.data.length)return null;let X={event:this.event,data:this.data.join(`
131
131
  `),raw:this.chunks};return this.event=null,this.data=[],this.chunks=[],X}if(this.chunks.push(x),x.startsWith(":"))return null;let[Z,Q,J]=d50(x,":");if(J.startsWith(" "))J=J.substring(1);if(Z==="event")this.event=J;else if(Z==="data")this.data.push(J);return null}}function d50(x,Z){let Q=x.indexOf(Z);if(Q!==-1)return[x.substring(0,Q),Z,x.substring(Q+Z.length)];return[x,"",""]}async function hA(x,Z){let{response:Q,requestLogID:J,retryOfRequestLogID:X,startTime:z}=Z,Y=await(async()=>{if(Z.options.stream){if(x8(x).debug("response",Q.status,Q.url,Q.headers,Q.body),Z.options.__streamClass)return Z.options.__streamClass.fromSSEResponse(Q,Z.controller);return X6.fromSSEResponse(Q,Z.controller)}if(Q.status===204)return null;if(Z.options.__binaryResponse)return Q;let G=Q.headers.get("content-type")?.split(";")[0]?.trim();if(G?.includes("application/json")||G?.endsWith("+json")){if(Q.headers.get("content-length")==="0")return;let K=await Q.json();return mA(K,Q)}return await Q.text()})();return x8(x).debug(`[${J}] response parsed`,Dx({retryOfRequestLogID:X,url:Q.url,status:Q.status,body:Y,durationMs:Date.now()-z})),Y}function mA(x,Z){if(!x||typeof x!=="object"||Array.isArray(x))return x;return Object.defineProperty(x,"_request_id",{value:Z.headers.get("request-id"),enumerable:!1})}function z5(x,Z,Q){return lA(),new File(x,Z??"unknown_file",Q)}function cJ(x,Z){let Q=typeof x==="object"&&x!==null&&(("name"in x)&&x.name&&String(x.name)||("url"in x)&&x.url&&String(x.url)||("filename"in x)&&x.filename&&String(x.filename)||("path"in x)&&x.path&&String(x.path))||"";return Z?Q.split(/[\\/]/).pop()||void 0:Q}function i50(x){let Z=typeof x==="function"?x:x.fetch,Q=Hc.get(Z);if(Q)return Q;let J=(async()=>{try{let X="Response"in Z?Z.Response:(await Z("data:,")).constructor,z=new FormData;if(z.toString()===await new X(z).text())return!1;return!0}catch{return!0}})();return Hc.set(Z,J),J}async function t50(x,Z,Q){if(lA(),x=await x,Z||(Z=cJ(x,!0)),o50(x)){if(x instanceof File&&Z==null&&Q==null)return x;return z5([await x.arrayBuffer()],Z??x.name,{type:x.type,lastModified:x.lastModified,...Q})}if(r50(x)){let X=await x.blob();return Z||(Z=new URL(x.url).pathname.split(/[\\/]/).pop()),z5(await jG(X),Z,Q)}let J=await jG(x);if(!Q?.type){let X=J.find((z)=>typeof z==="object"&&("type"in z)&&z.type);if(typeof X==="string")Q={...Q,type:X}}return z5(J,Z,Q)}async function jG(x){let Z=[];if(typeof x==="string"||ArrayBuffer.isView(x)||x instanceof ArrayBuffer)Z.push(x);else if(dA(x))Z.push(x instanceof Blob?x:await x.arrayBuffer());else if(nA(x))for await(let Q of x)Z.push(...await jG(Q));else{let Q=x?.constructor?.name;throw Error(`Unexpected data type: ${typeof x}${Q?`; constructor: ${Q}`:""}${e50(x)}`)}return Z}function e50(x){if(typeof x!=="object"||x===null)return"";return`; props: [${Object.getOwnPropertyNames(x).map((Z)=>`"${Z}"`).join(", ")}]`}class j1{constructor(x){this._client=x}}function*a50(x){if(!x)return;if(iA in x){let{values:J,nulls:X}=x;yield*J.entries();for(let z of X)yield[z,null];return}let Z=!1,Q;if(x instanceof Headers)Q=x.entries();else if(eT(x))Q=x;else Z=!0,Q=Object.entries(x??{});for(let J of Q){let X=J[0];if(typeof X!=="string")throw TypeError("expected header name to be a string");let z=eT(J[1])?J[1]:[J[1]],Y=!1;for(let G of z){if(G===void 0)continue;if(Z&&!Y)Y=!0,yield[X,null];yield[X,G]}}}function pA(x){return x.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}function qJ(x){return typeof x==="object"&&x!==null&&P2 in x}function sA(x,Z){let Q=new Set;if(x){for(let J of x)if(qJ(J))Q.add(J[P2])}if(Z)for(let J of Z){if(qJ(J))Q.add(J[P2]);if(Array.isArray(J.content)){for(let X of J.content)if(qJ(X))Q.add(X[P2])}}return Array.from(Q)}function oA(x,Z){let Q=sA(x,Z);if(Q.length===0)return{};return{"x-stainless-helper":Q.join(", ")}}function Y90(x){if(qJ(x))return{"x-stainless-helper":x[P2]};return{}}function tA(x){return x?.output_format??x?.output_config?.format}function $c(x,Z,Q){let J=tA(Z);if(!Z||!("parse"in(J??{})))return{...x,content:x.content.map((X)=>{if(X.type==="text"){let z=Object.defineProperty({...X},"parsed_output",{value:null,enumerable:!1});return Object.defineProperty(z,"parsed",{get(){return Q.logger.warn("The `parsed` property on `text` blocks is deprecated, please use `parsed_output` instead."),null},enumerable:!1})}return X}),parsed_output:null};return eA(x,Z,Q)}function eA(x,Z,Q){let J=null,X=x.content.map((z)=>{if(z.type==="text"){let Y=Z90(Z,z.text);if(J===null)J=Y;let G=Object.defineProperty({...z},"parsed_output",{value:Y,enumerable:!1});return Object.defineProperty(G,"parsed",{get(){return Q.logger.warn("The `parsed` property on `text` blocks is deprecated, please use `parsed_output` instead."),Y},enumerable:!1})}return z});return{...x,content:X,parsed_output:J}}function Z90(x,Z){let Q=tA(x);if(Q?.type!=="json_schema")return null;try{if("parse"in Q)return Q.parse(Z);return JSON.parse(Z)}catch(J){throw new q0(`Failed to parse structured output: ${J}`)}}function Nc(x){return x.type==="tool_use"||x.type==="server_tool_use"||x.type==="mcp_tool_use"}function Dc(x){}function Bc(){let x,Z;return{promise:new Promise((Q,J)=>{x=Q,Z=J}),resolve:x,reject:Z}}async function K90(x,Z=x.messages.at(-1),Q){if(!Z||Z.role!=="assistant"||!Z.content||typeof Z.content==="string")return null;let J=Z.content.filter((X)=>X.type==="tool_use");if(J.length===0)return null;return{role:"user",content:await Promise.all(J.map(async(X)=>{let z=x.tools.find((Y)=>("name"in Y?Y.name:Y.mcp_server_name)===X.name);if(!z||!("run"in z))return{type:"tool_result",tool_use_id:X.id,content:`Error: Tool '${X.name}' not found`,is_error:!0};try{let Y=X.input;if("parse"in z&&z.parse)Y=z.parse(Y);let G=await z.run(Y,{toolUseBlock:X,signal:Q?.signal});return{type:"tool_result",tool_use_id:X.id,content:G}}catch(Y){return{type:"tool_result",tool_use_id:X.id,content:Y instanceof A$?Y.content:`Error: ${Y instanceof Error?Y.message:String(Y)}`,is_error:!0}}}))}}function Mc(x){if(!x.output_format)return x;if(x.output_config?.format)throw new q0("Both output_format and output_config.format were provided. Please use only output_config.format (output_format is deprecated).");let{output_format:Z,...Q}=x;return{...Q,output_config:{...x.output_config,format:Z}}}function xE(x){return x?.output_config?.format}function Rc(x,Z,Q){let J=xE(Z);if(!Z||!("parse"in(J??{})))return{...x,content:x.content.map((X)=>{if(X.type==="text")return Object.defineProperty({...X},"parsed_output",{value:null,enumerable:!1});return X}),parsed_output:null};return YE(x,Z,Q)}function YE(x,Z,Q){let J=null,X=x.content.map((z)=>{if(z.type==="text"){let Y=H90(Z,z.text);if(J===null)J=Y;return Object.defineProperty({...z},"parsed_output",{value:Y,enumerable:!1})}return z});return{...x,content:X,parsed_output:J}}function H90(x,Z){let Q=xE(x);if(Q?.type!=="json_schema")return null;try{if("parse"in Q)return Q.parse(Z);return JSON.parse(Z)}catch(J){throw new q0(`Failed to parse structured output: ${J}`)}}function Ic(x){return x.type==="tool_use"||x.type==="server_tool_use"}function Tc(x){}class f1{get credentials(){return this._authState.provider}constructor({baseURL:x=V1("ANTHROPIC_BASE_URL"),apiKey:Z,authToken:Q,...J}={}){if(TG.add(this),this._requestAuthFlags=new WeakMap,AJ.set(this,void 0),Z===void 0)Z=J.profile!=null?null:V1("ANTHROPIC_API_KEY")??null;if(Q===void 0)Q=J.profile!=null?null:V1("ANTHROPIC_AUTH_TOKEN")??null;if(J.profile!=null&&(J.credentials!=null||J.config!=null))throw TypeError("Pass at most one of `profile`, `credentials`, or `config`.");let X={apiKey:Z,authToken:Q,...J,baseURL:x||"https://api.anthropic.com"};if(!X.dangerouslyAllowBrowser&&F50())throw new q0(`It looks like you're running in a browser-like environment.
132
132
 
@@ -228,7 +228,7 @@ Please migrate to a newer model. Visit https://docs.anthropic.com/en/docs/resour
228
228
 
229
229
  `)+`
230
230
 
231
- `:"";try{this.input.push({type:"user",session_id:this.sessionId??"",message:{role:"user",content:[{type:"text",text:J+Q+x}]},parent_tool_use_id:null,priority:"now"})}catch(X){let z=X instanceof Error?X:Error(String(X));k(`claude-agent-process: sendUserText failed: ${z.message}`),this.failTurnStart(z)}}sendInterrupt(){this.query?.interrupt().catch((x)=>k(`claude-agent-process: interrupt failed: ${x}`))}sendPermissionResponse(x,Z,Q){let J=this.pendingPermissions.get(String(x));if(!J){k(`claude-agent-process: permission response for unknown request ${x}`);return}if(this.pendingPermissions.delete(String(x)),J.cleanup?.(),Z==="allow")J.resolve({behavior:"allow",updatedInput:Q?.updatedInput??{}});else J.resolve({behavior:"deny",message:Q?.denyMessage??""})}sendToolResult(x,Z,Q=!1){k("claude-agent-process: sendToolResult ignored; Claude Agent SDK executes built-in tools internally")}sendHookResponse(x,Z={}){k("claude-agent-process: sendHookResponse ignored; hooks are handled by SDK callbacks")}isAlive(){return this.alive}async kill(x=5000){if(!this.alive)return;this.expectedExit=!0,this.input.close();try{this.query?.close()}catch{}let Z=Date.now();while(this.alive&&Date.now()-Z<x)await new Promise((Q)=>setTimeout(Q,100));if(this.alive)this.alive=!1,this.emit("exit",{code:null,signal:"SIGKILL",expected:this.expectedExit})}async listModels(){if(!this.started)this.sendInitialize();if(!this.query)throw Error("claude-agent-process: SDK query not initialized (sendInitialize failed or not called)");return(await this.query.supportedModels()).map(r$0)}async setModelSettings(x,Z){let Q=aU(x);if(!L3(Z))throw Error(`invalid Claude effort: ${String(Z)}`);if(!this.started)this.sendInitialize();if(!this.query)throw Error("claude-agent-process: SDK query not initialized (sendInitialize failed or not called)");if(Q)await this.query.setModel(Q);if(Z==="max")await this.query.applyFlagSettings({ultracode:!0,effortLevel:null});else await this.query.applyFlagSettings({effortLevel:Z,ultracode:null});this.opts.model=x,this.opts.effort=Z,this.lastModel=Q?c3(x):"claude:default",this.lastEffort=Z}async setModel(x){await this.setModelSettings(x,this.opts.effort)}async compactThread(){if(!this.input)throw Error("claude thread not initialized");return this.input.push({type:"user",session_id:this.sessionId??"",message:{role:"user",content:[{type:"text",text:"/compact"}]},parent_tool_use_id:null,priority:"now"}),new Promise((x,Z)=>{let J=!1,X=()=>{clearTimeout(z),this.off("context_compacted",Y),this.off("result",G)},z=setTimeout(()=>{if(J)return;J=!0,X(),Z(Error("claude /compact timed out (no compact_boundary, no result)"))},60000),Y=()=>{if(J)return;J=!0,X(),x()},G=()=>{if(J)return;J=!0,X(),Z(new J2)};this.on("context_compacted",Y),this.on("result",G)})}async injectThreadItems(x){if(!Array.isArray(x)||x.length===0)return;this.pendingInjectedContext.push(["Host-injected prior tool context for this continuation:",JSON.stringify(x,null,2)].join(`
231
+ `:"";try{this.input.push({type:"user",session_id:this.sessionId??"",message:{role:"user",content:[{type:"text",text:J+Q+x}]},parent_tool_use_id:null,priority:"now"})}catch(X){let z=X instanceof Error?X:Error(String(X));k(`claude-agent-process: sendUserText failed: ${z.message}`),this.failTurnStart(z)}}sendInterrupt(){this.query?.interrupt().catch((x)=>k(`claude-agent-process: interrupt failed: ${x}`))}sendPermissionResponse(x,Z,Q){let J=this.pendingPermissions.get(String(x));if(!J){k(`claude-agent-process: permission response for unknown request ${x}`);return}if(this.pendingPermissions.delete(String(x)),J.cleanup?.(),Z==="allow")J.resolve({behavior:"allow",updatedInput:Q?.updatedInput??{}});else J.resolve({behavior:"deny",message:Q?.denyMessage??""})}sendToolResult(x,Z,Q=!1){k("claude-agent-process: sendToolResult ignored; Claude Agent SDK executes built-in tools internally")}sendHookResponse(x,Z={}){k("claude-agent-process: sendHookResponse ignored; hooks are handled by SDK callbacks")}isAlive(){return this.alive}async kill(x=5000){if(!this.alive)return;this.expectedExit=!0,this.input.close();try{this.query?.close()}catch{}let Z=Date.now();while(this.alive&&Date.now()-Z<x)await new Promise((Q)=>setTimeout(Q,100));if(this.alive)this.alive=!1,this.emit("exit",{code:null,signal:"SIGKILL",expected:this.expectedExit})}async listModels(){if(!this.started)this.sendInitialize();if(!this.query)throw Error("claude-agent-process: SDK query not initialized (sendInitialize failed or not called)");return(await this.query.supportedModels()).map(r$0)}async setModelSettings(x,Z){let Q=aU(x);if(!L3(Z))throw Error(`invalid Claude effort: ${String(Z)}`);if(!this.started)this.sendInitialize();if(!this.query)throw Error("claude-agent-process: SDK query not initialized (sendInitialize failed or not called)");if(Q)await this.query.setModel(Q);if(Z==="max")await this.query.applyFlagSettings({ultracode:!0,effortLevel:null});else await this.query.applyFlagSettings({effortLevel:Z,ultracode:null});this.opts.model=x,this.opts.effort=Z,this.lastModel=Q?c3(x):"claude:default",this.lastEffort=Z}async setModel(x){await this.setModelSettings(x,this.opts.effort)}async compactThread(){if(!this.input)throw Error("claude thread not initialized");return this.input.push({type:"user",session_id:this.sessionId??"",message:{role:"user",content:[{type:"text",text:"/compact"}]},parent_tool_use_id:null,priority:"now"}),new Promise((x,Z)=>{let J=!1,X=()=>{clearTimeout(z),this.off("context_compacted",Y),this.off("result",G)},z=setTimeout(()=>{if(J)return;J=!0,X(),Z(Error("claude /compact timed out (no compact_boundary, no result)"))},600000),Y=()=>{if(J)return;J=!0,X(),x()},G=()=>{if(J)return;J=!0,X(),Z(new J2)};this.on("context_compacted",Y),this.on("result",G)})}async injectThreadItems(x){if(!Array.isArray(x)||x.length===0)return;this.pendingInjectedContext.push(["Host-injected prior tool context for this continuation:",JSON.stringify(x,null,2)].join(`
232
232
  `))}canUseTool(x,Z,Q){if(x!=="AskUserQuestion")return Promise.resolve({behavior:"allow",updatedInput:Z});let J=YF0(Z);if(J.length===0)return k("claude-agent-process: AskUserQuestion 无有效 questions — allow 原样"),Promise.resolve({behavior:"allow",updatedInput:Z});let X={...Z,questions:J},z=`claude_perm_${++this.requestCounter}`,Y=Q.toolUseID||z,G={request_id:z,tool_name:"AskUserQuestion",input:X,tool_use_id:Y},K=new Promise((H)=>{let W=(N)=>{Q.signal.removeEventListener("abort",L),H(N)},L=()=>{if(!this.pendingPermissions.delete(z))return;W({behavior:"deny",message:"aborted"})};Q.signal.addEventListener("abort",L,{once:!0}),this.pendingPermissions.set(z,{kind:"dialog",resolve:W,request:G})});return this.emitToolUseOnce(Y,"AskUserQuestion",X,null),this.emit("can_use_tool",G),K}async readLoop(x){try{for await(let Z of x)this.handleMessage(Z);this.finishExit(null,null)}catch(Z){let Q=Z instanceof Error?Z:Error(String(Z));k(`claude-agent-process: read loop failed: ${Q.message}`),this.emit("error",Q),this.finishExit(1,null)}}finishExit(x,Z){if(!this.alive)return;this.alive=!1,this.turnActive=!1;for(let[Q,J]of this.pendingPermissions)J.cleanup?.(),J.resolve({behavior:"cancelled"}),this.pendingPermissions.delete(Q);k(`claude-agent-process: exited code=${x} signal=${Z} expected=${this.expectedExit}`),this.emit("exit",{code:x,signal:Z,expected:this.expectedExit})}handleMessage(x){let Z=x;if(typeof Z.session_id==="string"&&Z.session_id)this.sessionId=Z.session_id;switch(Z.type){case"system":this.handleSystemMessage(Z);return;case"assistant":this.handleAssistantMessage(Z);return;case"user":this.handleUserMessage(Z);return;case"result":this.handleResultMessage(Z);return;case"rate_limit_event":this.emit("rate_limits_updated",Z.rate_limit_info);return;case"stream_event":return;default:k(`claude-agent-process: unhandled message type=${Z.type??"unknown"} subtype=${Z.subtype??""}`)}}handleSystemMessage(x){switch(x.subtype){case"init":if(typeof x.model==="string"&&x.model)this.lastModel=c3(x.model);this.lastEffort=this.opts.effort,this.emit("init",{session_id:this.sessionId,raw:x});return;case"session_state_changed":if(x.state==="running"&&!this.turnActive)this.turnActive=!0,this.emit("turn_started",{turn_id:x.uuid,thread_id:this.sessionId});else if(x.state==="idle")this.turnActive=!1;return;case"compact_boundary":this.emit("context_compacted",{threadId:x.session_id??this.sessionId??void 0,sessionId:x.session_id??this.sessionId??void 0,itemId:x.uuid,phase:"event",sourceMethod:"claude_agent_sdk",sourceType:"compact_boundary",preTokens:x.compact_metadata?.pre_tokens,trigger:x.compact_metadata?.trigger});return;case"api_retry":k(`claude-agent-process: api retry attempt=${x.attempt}/${x.max_retries} status=${x.error_status} error=${x.error}`);return;case"permission_denied":k(`claude-agent-process: permission denied ${x.tool_name} ${x.tool_use_id}: ${x.message}`);return;case"task_started":this.emit("bg_task_started",{task_id:String(x.task_id??""),tool_use_id:typeof x.tool_use_id==="string"?x.tool_use_id:void 0,task_type:typeof x.task_type==="string"?x.task_type:void 0,description:String(x.description??""),subagent_type:typeof x.subagent_type==="string"?x.subagent_type:void 0,workflow_name:typeof x.workflow_name==="string"?x.workflow_name:void 0,prompt:typeof x.prompt==="string"?x.prompt:void 0});return;case"task_progress":this.emit("bg_task_progress",{task_id:String(x.task_id??""),description:typeof x.description==="string"?x.description:void 0,subagent_type:typeof x.subagent_type==="string"?x.subagent_type:void 0,usage:x.usage,last_tool_name:typeof x.last_tool_name==="string"?x.last_tool_name:void 0,summary:typeof x.summary==="string"?x.summary:void 0});return;case"task_updated":this.emit("bg_task_updated",{task_id:String(x.task_id??""),patch:x.patch&&typeof x.patch==="object"?x.patch:{}});return;case"task_notification":this.emit("bg_task_settled",{task_id:String(x.task_id??""),tool_use_id:typeof x.tool_use_id==="string"?x.tool_use_id:void 0,status:x.status==="completed"||x.status==="failed"||x.status==="stopped"?x.status:"completed",summary:typeof x.summary==="string"?x.summary:void 0,usage:x.usage});return;default:return}}handleAssistantMessage(x){let Z=x.message;if(typeof x.uuid==="string")this.lastAssistantUuid=x.uuid;if(typeof Z?.model==="string"&&Z.model)this.lastModel=c3(Z.model);let Q=Array.isArray(Z?.content)?Z.content:[];for(let J of Q){if(!J||typeof J!=="object")continue;if(J.type==="text"&&typeof J.text==="string"&&J.text.length>0){let X=s$0(J.text);if(X){if(this.pendingServerToolInputs.push(X),this.pendingServerToolInputs.length>20)this.pendingServerToolInputs.shift()}if(o$0(J.text))continue;let z=x.uuid??Z?.id;this.emit("assistant_text",{uuid:z,text:J.text}),this.emit("assistant_block_stop",{index:z})}else if(J.type==="tool_use"&&typeof J.id==="string"&&typeof J.name==="string")this.emitToolUseOnce(J.id,J.name,J.input??{},x.parent_tool_use_id??null);else if(J.type==="server_tool_use"&&typeof J.id==="string"&&typeof J.name==="string")this.emitToolUseOnce(J.id,p$0(J.name),{tool:J.name,input:this.serverToolInput(J.name,J.input??{})},x.parent_tool_use_id??null);else if(J.type==="tool_result"&&typeof J.tool_use_id==="string")this.emitToolResultOnce(J.tool_use_id,i$0(J.content),J.is_error===!0,x.parent_tool_use_id??null)}}emitToolUseOnce(x,Z,Q,J){if(this.emittedToolUseIds.has(x))return;this.emittedToolUseIds.add(x),this.emit("tool_use",{id:x,name:Z,input:Q,parentToolUseId:J})}serverToolInput(x,Z){let Q=SY(Z);if(Q&&typeof Q==="object"&&!Array.isArray(Q)&&Object.keys(Q).length>0)return Q;let J=this.pendingServerToolInputs.findIndex((X)=>X.name===x);if(J>=0){let[X]=this.pendingServerToolInputs.splice(J,1);return X.input}return Q}emitToolResultOnce(x,Z,Q,J){if(this.emittedToolResultIds.has(x))return;this.emittedToolResultIds.add(x),this.emit("tool_result",{tool_use_id:x,content:Z,is_error:Q,parentToolUseId:J})}handleUserMessage(x){let Z=Array.isArray(x.message?.content)?x.message.content:[];for(let Q of Z){if(!Q||typeof Q!=="object")continue;if(Q.type!=="tool_result"||typeof Q.tool_use_id!=="string")continue;let J=x.tool_use_result,X=Ju(Q.content),z=J&&typeof J==="object"?[typeof J.stdout==="string"?J.stdout:"",typeof J.stderr==="string"?J.stderr:""].filter(Boolean).join(`
233
233
  `):"",Y=X||z;this.emitToolResultOnce(Q.tool_use_id,Y,Q.is_error===!0||J?.interrupted===!0,x.parent_tool_use_id??null)}}handleResultMessage(x){if(typeof x.session_id==="string"&&x.session_id)this.sessionId=x.session_id;this.turnActive=!1;let Z=m$0(x.usage),Q=x.modelUsage??x.model_usage,J=n$0(Q);if(!Z&&!J.usage)k(`claude-agent-process: result usage missing rootKeys=${xL(x).join(",")||"-"} usageKeys=${xL(x.usage).join(",")||"-"} modelUsageKeys=${xL(Q).join(",")||"-"}`);if(this.lastUsage=Z,J.usage)this.cumulativeUsageFromResults=Yz(J.usage),this.lastTotalUsage=Yz(J.usage);else if(Z)this.cumulativeUsageFromResults=d$0(this.cumulativeUsageFromResults,Z),this.lastTotalUsage=Yz(this.cumulativeUsageFromResults);else this.lastTotalUsage=this.cumulativeUsageFromResults?Yz(this.cumulativeUsageFromResults):null;if(J.contextWindow!=null){let G=ew(this.opts.model),K=RY.get(G)??0;if(J.contextWindow>K)RY.set(G,J.contextWindow),k(`claude-agent-process: SDK contextWindow ${J.contextWindow} (global max for ${G}, prev ${K||"-"})`);else if(J.contextWindow<(RY.get(G)??0))k(`claude-agent-process: SDK contextWindow ${J.contextWindow} ignored (global max ${RY.get(G)} locked for ${G})`)}this.lastContextWindow=RY.get(ew(this.opts.model))??J.contextWindow??null;let X=_$0(this.opts.workDir,this.sessionId??""),z=l$0(X);if(this.lastContextTokens=tw(z)??(Zz(X)?tw(Z):null),this.lastTotalUsage||this.lastUsage)this.emit("token_usage",{usage:this.lastUsage,totalUsage:this.lastTotalUsage,contextWindow:this.lastContextWindow,threadId:this.sessionId??void 0,turnId:x.uuid});let Y=typeof x.subtype==="string"?x.subtype:x.is_error?"error":"success";this.lastResult={cost_usd:null,cost_delta_usd:null,duration_ms:typeof x.duration_ms==="number"?x.duration_ms:null,num_turns:typeof x.num_turns==="number"?x.num_turns:1,usage:this.lastUsage,subtype:Y,is_error:x.is_error===!0||Y!=="success"},this.emit("result",{subtype:Y,is_error:this.lastResult.is_error,duration_ms:this.lastResult.duration_ms,usage:this.lastUsage})}failTurnStart(x){this.turnActive=!1,this.lastResult={cost_usd:null,cost_delta_usd:null,duration_ms:null,num_turns:null,usage:this.lastUsage,subtype:"claude_turn_start_failed",is_error:!0},this.emit("result",{subtype:this.lastResult.subtype,is_error:!0,duration_ms:null,usage:this.lastUsage,error:x.message})}}});import{randomUUID as JF0}from"node:crypto";async function Xu(x){let Z=await H8("feishu chat.get",()=>K1.im.chat.get({path:{chat_id:x},params:{user_id_type:"open_id"}}));if(Z.code&&Z.code!==0)W8("feishu chat.get",Z);let Q=Z.data?.owner_id;if(!Q)throw Error("feishu chat.get returned no owner_id; cannot add project group owner to tasklist");return Q}async function zu(x,Z){let Q=await H8("feishu tasklist.create",()=>K1.task.v2.tasklist.create({params:{user_id_type:"open_id"},data:{name:x,members:[{id:Z,type:"user",role:"editor"}]}}));if(Q.code&&Q.code!==0)W8("feishu tasklist.create",Q);let J=Q.data?.tasklist,X=J?.guid;if(!X)throw Error("feishu tasklist.create returned no guid");return{guid:X,name:J?.name||x,url:J?.url??"",createdAt:J?.created_at}}async function Wu(x){let Z=await H8("feishu tasklist.delete",()=>K1.task.v2.tasklist.delete({path:{tasklist_guid:x}}));if(Z.code&&Z.code!==0)W8("feishu tasklist.delete",Z)}async function Qz(x){let Z=[],Q;do{let J=await H8("feishu section.list",()=>K1.task.v2.section.list({params:{resource_type:"tasklist",resource_id:x,page_size:50,...Q?{page_token:Q}:{}}}));if(J.code&&J.code!==0)W8("feishu section.list",J);for(let X of J.data?.items??[]){if(!X.guid||!X.name)continue;Z.push({guid:X.guid,name:X.name,isDefault:X.is_default})}Q=J.data?.has_more?J.data?.page_token:void 0}while(Q);return Z}async function Ku(x){let Z=await H8("feishu section.create",()=>K1.task.v2.section.create({data:{resource_type:"tasklist",resource_id:x.tasklistGuid,name:x.name,...x.insertAfter?{insert_after:x.insertAfter}:{}}}));if(Z.code&&Z.code!==0)W8("feishu section.create",Z);let Q=Z.data?.section?.guid;if(!Q)throw Error(`feishu section.create returned no guid for "${x.name}"`);return Q}async function zL(x){let Z=await H8("feishu section.get",()=>K1.task.v2.section.get({path:{section_guid:x},params:{user_id_type:"open_id"}}));if(Z.code&&Z.code!==0)W8("feishu section.get",Z);let Q=Z.data?.section;if(!Q?.guid)throw Error(`feishu section.get returned no section: ${x}`);return{guid:Q.guid,name:Q.name??"",isDefault:Q.is_default,tasklistGuid:Q.tasklist?.guid}}async function Vu(x,Z){let Q=await H8("feishu section.patch",()=>K1.task.v2.section.patch({path:{section_guid:x},params:{user_id_type:"open_id"},data:{section:{name:Z},update_fields:["name"]}}));if(Q.code&&Q.code!==0)W8("feishu section.patch",Q);let J=Q.data?.section;if(!J?.guid)throw Error(`feishu section.patch returned no section: ${x}`);return{guid:J.guid,name:J.name??"",isDefault:J.is_default,tasklistGuid:J.tasklist?.guid}}async function Hu(x){let Z=await H8("feishu section.delete",()=>K1.task.v2.section.delete({path:{section_guid:x}}));if(Z.code&&Z.code!==0)W8("feishu section.delete",Z)}async function q3(x,Z){let Q=[],J;do{let X=await H8("feishu section.tasks",()=>K1.task.v2.section.tasks({path:{section_guid:x},params:{page_size:50,...typeof Z==="boolean"?{completed:Z}:{},...J?{page_token:J}:{}}}));if(X.code&&X.code!==0)W8("feishu section.tasks",X);for(let z of X.data?.items??[]){if(!z.guid)continue;Q.push({guid:z.guid,summary:z.summary??"",completedAt:z.completed_at,subtaskCount:z.subtask_count})}J=X.data?.has_more?X.data?.page_token:void 0}while(J);return Q}async function Gu(x,Z){let Q=[],J;do{let X=await H8("feishu tasklist.tasks",()=>K1.task.v2.tasklist.tasks({path:{tasklist_guid:x},params:{page_size:50,user_id_type:"open_id",...typeof Z==="boolean"?{completed:Z}:{},...J?{page_token:J}:{}}}));if(X.code&&X.code!==0)W8("feishu tasklist.tasks",X);for(let z of X.data?.items??[]){if(!z.guid)continue;Q.push({guid:z.guid,summary:z.summary??"",completedAt:z.completed_at,subtaskCount:z.subtask_count})}J=X.data?.has_more?X.data?.page_token:void 0}while(J);return Q}async function $u(x){let Z=`lodestar-default-section-discovery-${Date.now()}-${JF0().slice(0,8)}`,Q="";try{let J=await H8("feishu task.create",()=>K1.task.v2.task.create({params:{user_id_type:"open_id"},data:{summary:Z,tasklists:[{tasklist_guid:x}]}}));if(J.code&&J.code!==0)W8("feishu task.create",J);let X=J.data?.task;if(Q=X?.guid??"",!Q)throw Error("feishu task.create returned no guid during default section discovery");let z=X.tasklists?.find((K)=>K.tasklist_guid===x)?.section_guid;if(z)return z;let G=(await Jz(Q)).tasklists?.find((K)=>K.tasklist_guid===x)?.section_guid;if(!G)throw Error(`failed to discover default section guid for tasklist ${x}`);return G}finally{if(Q)await XF0(Q)}}async function XF0(x){let Z=await H8("feishu task.delete",()=>K1.task.v2.task.delete({path:{task_guid:x}}));if(Z.code&&Z.code!==0)W8("feishu task.delete",Z)}async function Jz(x){let Z=await H8("feishu task.get",()=>K1.task.v2.task.get({path:{task_guid:x},params:{user_id_type:"open_id"}}));if(Z.code&&Z.code!==0)W8("feishu task.get",Z);let Q=Z.data?.task;if(!Q)throw Error(`feishu task.get returned no task: ${x}`);return Q}async function Fu(x){let Z=[],Q;do{let J=await H8("feishu comment.list",()=>K1.task.v2.comment.list({params:{resource_type:"task",resource_id:x,direction:"asc",page_size:50,user_id_type:"open_id",...Q?{page_token:Q}:{}}}));if(J.code&&J.code!==0)W8("feishu comment.list",J);for(let X of J.data?.items??[]){if(!X.id)continue;Z.push({id:X.id,content:X.content??"",createdAt:X.created_at,updatedAt:X.updated_at,creator:X.creator})}Q=J.data?.has_more?J.data?.page_token:void 0}while(Q);return Z}async function Ex(x,Z){let Q=await H8("feishu comment.create",()=>K1.task.v2.comment.create({data:{resource_type:"task",resource_id:x,content:Z},params:{user_id_type:"open_id"}}));if(Q.code&&Q.code!==0)W8("feishu comment.create",Q);let J=Q.data?.comment?.id;if(!J)throw Error(`feishu comment.create returned no id for task ${x}`);return J}async function Xz(x,Z,Q){let J=await H8("feishu task.addTasklist",()=>K1.task.v2.task.addTasklist({path:{task_guid:x},data:{tasklist_guid:Z,section_guid:Q},params:{user_id_type:"open_id"}}));if(J.code&&J.code!==0)W8("feishu task.addTasklist",J)}function zF0(x,Z){let Q=Z&&typeof Z==="object"?Z:{},J=Q.response?.data&&typeof Q.response.data==="object"?Q.response.data:Q.data&&typeof Q.data==="object"?Q.data:Q,X=J.code??Q.code,z=J.msg??J.message??Q.msg??Q.message??"unknown error",Y=J.error?.permission_violations??J.permission_violations??Q.error?.permission_violations,G=Array.isArray(Y)?Y.map((K)=>K?.scope??K?.subject??K?.name??K).filter(Boolean).join(", "):"";return`${x} failed code=${X??"unknown"} msg=${z}${G?` missing_scopes=${G}`:""}`}async function H8(x,Z){try{return await Z()}catch(Q){W8(x,Q)}}function W8(x,Z){throw Error(zF0(x,Z))}var Uu=R0(()=>{h1()});import{execSync as vu}from"node:child_process";import{randomUUID as Mu}from"node:crypto";import{existsSync as WF0,mkdirSync as kx,readFileSync as b5,statSync as Ru,writeFileSync as gx}from"node:fs";import{readFile as Cu}from"node:fs/promises";import{homedir as Lu}from"node:os";import{basename as bx,extname as KF0,join as WL}from"node:path";function VL(x){return Z1.projects[x]}async function E3(){if(zz&&Date.now()<Nu)return zz;let Z=await(await fetch("https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({app_id:Su,app_secret:ju})})).json();if(!Z.tenant_access_token)throw Error("feishu: failed to obtain tenant token");return zz=Z.tenant_access_token,Nu=Date.now()+((Z.expire??7200)-60)*1000,zz}function Iu(){try{let x=JSON.parse(b5(jW,"utf8"));for(let[Z,Q]of Object.entries(x))if(typeof Q==="string")s8.set(Z,Q);k(`feishu: loaded ${s8.size} session→chat bindings`)}catch{}}function Tu(){try{let x={};for(let[Z,Q]of s8)x[Z]=Q;kx(C1,{recursive:!0}),gx(jW,JSON.stringify(x,null,2))}catch(x){k(`feishu: save session-chat-map failed: ${x}`)}}function Kz(x,Z){if(s8.get(x)===Z)return;let Q=s8.get(x);s8.set(x,Z),Tu(),k(`feishu: bound session "${x}" → ${Z}${Q?` (was ${Q})`:""}`)}function KL(x){let Z=s8.get(x);if(!Z)return;s8.delete(x),Tu(),k(`feishu: unbound session "${x}" from ${Z}`)}function Wz(x,Z,Q){let J=E5.get(x)??{};J[Z]=Q,E5.set(x,J)}function cu(){try{let x=JSON.parse(b5(IW,"utf8"));for(let[Z,Q]of Object.entries(x)){if(typeof Q==="string"&&Q.trim()){Wz(Z,"codex",Q);continue}if(!Q||typeof Q!=="object")continue;let J=Q,X=J.provider==="claude"||J.provider==="codex"?J.provider:null,z=typeof J.sessionId==="string"?J.sessionId:typeof J.session_id==="string"?J.session_id:null;if(X&&z?.trim()){Wz(Z,X,z);continue}for(let Y of["codex","claude"]){let G=J[Y];if(typeof G==="string"&&G.trim())Wz(Z,Y,G)}}k(`feishu: loaded ${E5.size} session→resume bindings`)}catch{}}function VF0(){try{let x={};for(let[Z,Q]of E5)x[Z]={...Q};kx(C1,{recursive:!0}),gx(IW,JSON.stringify(x,null,2))}catch(x){k(`feishu: save session-resume-map failed: ${x}`)}}function qu(x,Z,Q="codex"){if(E5.get(x)?.[Q]===Z)return;Wz(x,Q,Z),VF0()}function HL(x,Z="codex"){return E5.get(x)?.[Z]??null}function Au(){try{let x=JSON.parse(b5(TW,"utf8")),Z=0;for(let[Q,J]of Object.entries(x)){if(!Array.isArray(J))continue;let X=J.filter((z)=>z&&typeof z.uuid==="string"&&typeof z.ts==="number").map((z)=>({uuid:String(z.uuid),sid:String(z.sid??""),preview:String(z.preview??""),ts:Number(z.ts),writes:Array.isArray(z.writes)?z.writes.filter((Y)=>Y&&typeof Y.path==="string").map((Y)=>({tool:String(Y.tool??"Write"),path:String(Y.path),body:String(Y.body??"")})).filter((Y)=>Y.path!==""||Y.body!==""):[]}));if(X.length)w4.set(Q,X),Z+=X.length}k(`feishu: loaded ${Z} turn anchors across ${w4.size} sessions`)}catch(x){if(x?.code!=="ENOENT")k(`feishu: load session-turns-map failed: ${x?.message??x}`)}}function GL(){try{let x={};for(let[Z,Q]of w4)x[Z]=Q;kx(C1,{recursive:!0}),gx(TW,JSON.stringify(x,null,2))}catch(x){k(`feishu: save session-turns-map failed: ${x}`)}}function Eu(x,Z){let Q=w4.get(x)??[];if(Q.push(Z),Q.length>Du)Q.splice(0,Q.length-Du);w4.set(x,Q),GL()}function IY(x){return w4.get(x)??[]}function bu(x,Z){let Q=w4.get(x);if(!Q||Q.length<=Z)return;w4.set(x,Q.slice(0,Z)),GL()}function wx(x){if(!w4.has(x))return;w4.delete(x),GL()}function ux(x){return Ou.test(x)?x.replace(Ou,""):null}function $L(x){let Z=new Date,Q=(Y)=>String(Y).padStart(2,"0"),J=`${Q(Z.getMonth()+1)}${Q(Z.getDate())}-${Q(Z.getHours())}${Q(Z.getMinutes())}`,X=new Set([...M8.values(),...w4.keys()]),z=`${x}*${J}`;for(let Y=2;X.has(z);Y++)z=`${x}*${J}-${Y}`;return z}function ku(){try{let x=JSON.parse(b5(cW,"utf8"));for(let[Z,Q]of Object.entries(x)){if(typeof Q==="string"&&Q.trim()){A3.set(Z,{provider:d7(Q),model:Q,effort:null});continue}if(!Q||typeof Q!=="object")continue;let{model:J,provider:X}=Q,z=X==="claude"||X==="codex"?X:typeof J==="string"&&J.trim()?d7(J):"claude",Y=typeof J==="string"&&J.trim()?J:null;if(z==="claude"&&!Y)continue;let{effort:G,tokenSourceId:K}=Q,H=typeof K==="string"&&K.trim()?K.trim():null,W=z==="claude"?L3(G)?G:null:Y6(G)?G:null;A3.set(Z,{provider:z,model:Y,effort:W,...H?{tokenSourceId:H}:{}})}k(`feishu: loaded ${A3.size} session→model bindings`)}catch{}}function HF0(){try{let x={};for(let[Z,Q]of A3)x[Z]=Q;kx(C1,{recursive:!0}),gx(cW,JSON.stringify(x,null,2))}catch(x){k(`feishu: save session-model-map failed: ${x}`)}}function gu(x,Z,Q,J,X){let z=A3.get(x);if(z?.provider===Z&&z.model===Q&&z.effort===J&&(z.tokenSourceId??null)===(X??null))return;A3.set(x,{provider:Z,model:Q,effort:J,...X?{tokenSourceId:X}:{}}),HF0()}function Pu(x){let Z=A3.get(x);if(Z)return Z;let Q=ux(x);return Q?A3.get(Q)??null:null}function FL(x){try{gx(UZ,JSON.stringify(x,null,2))}catch(Z){k(`feishu: write alive marker failed: ${Z}`)}}function wu(){if(!WF0(UZ))return[];try{let x=b5(UZ,"utf8"),Z=JSON.parse(x);return Array.isArray(Z)?Z.filter((Q)=>typeof Q==="string"):[]}catch(x){return k(`feishu: read alive marker failed: ${x}`),[]}}function TY(x){let Z=s8.get(x);if(Z){let J=M8.get(Z);if(J&&J!==x)k(`feishu: chatIdForSession("${x}"): persisted binding ${Z} has cached name "${J}", using persisted binding`);return Z}let Q=[];for(let[J,X]of M8)if(X===x)Q.push(J);if(Q.length===1)return Q[0];if(Q.length>1)k(`feishu: chatIdForSession("${x}"): ${Q.length} candidates with no binding — [${Q.join(", ")}]`);return null}async function Vz(){try{let x;do{let Z=await K1.im.chat.list({params:{page_size:100,...x?{page_token:x}:{}}});for(let Q of Z.data?.items??[])if(Q.chat_id&&Q.name)M8.set(Q.chat_id,Q.name);x=Z.data?.page_token}while(x);k(`feishu: refreshed chat list — ${M8.size} groups`)}catch(x){k(`feishu: refresh chat list failed: ${x}`)}}async function UL(){let x=new Map,Z;do{let Q=await K1.im.chat.list({params:{page_size:100,...Z?{page_token:Z}:{}}});if(Q.code&&Q.code!==0)throw Error(`feishu chat.list failed code=${Q.code} msg=${Q.msg}`);for(let J of Q.data?.items??[]){if(!J.chat_id||!J.name)continue;if(J.chat_status&&J.chat_status!=="normal")continue;M8.set(J.chat_id,J.name);let X=x.get(J.name)??[];X.push(J.chat_id),x.set(J.name,X)}Z=Q.data?.page_token}while(Z);return x}async function uu(x){let Z=s8.get(x);if(Z&&M8.get(Z)===x){let z=await $F0(Z);if(z.name===x&&FF0(z.status))return Z;M8.delete(Z),KL(x)}let J=(await UL()).get(x)??[];if(J.length===0)return null;let X=s8.get(x);if(X&&J.includes(X))return X;if(J.length===1)return J[0];throw Error(`multiple Feishu groups named "${x}": ${J.join(", ")}`)}async function Hz(x,Z){if(!Z)throw Error("missing sender open_id; cannot add user to worktree group");let Q=await uu(x);if(Q){let z=await GF0(Q,Z);return Kz(x,Q),{chatId:Q,created:!1,joined:z}}let J=await K1.im.chat.create({params:{user_id_type:"open_id",uuid:Mu()},data:{name:x,user_id_list:[Z],group_message_type:"chat"}});if(J.code&&J.code!==0)throw Error(`feishu chat.create failed code=${J.code} msg=${J.msg}`);let X=J.data?.chat_id;if(!X)throw Error("feishu chat.create returned no chat_id");return M8.set(X,x),Kz(x,X),{chatId:X,created:!0,joined:!0}}async function cY(x){let Z=await uu(x);if(!Z)return KL(x),{chatId:null,disbanded:!1};let Q=await K1.im.chat.delete({path:{chat_id:Z}});if(Q.code&&Q.code!==0)throw Error(`feishu chat.delete failed code=${Q.code} msg=${Q.msg}`);return M8.delete(Z),KL(x),{chatId:Z,disbanded:!0}}async function GF0(x,Z){let Q;do{let X=await K1.im.chatMembers.get({path:{chat_id:x},params:{member_id_type:"open_id",page_size:100,...Q?{page_token:Q}:{}}});if(X.code&&X.code!==0)throw Error(`feishu chatMembers.get failed code=${X.code} msg=${X.msg}`);for(let z of X.data?.items??[])if(z.member_id===Z)return!1;Q=X.data?.page_token}while(Q);let J=await K1.im.chatMembers.create({path:{chat_id:x},params:{member_id_type:"open_id"},data:{id_list:[Z]}});if(J.code&&J.code!==0)throw Error(`feishu chatMembers.create failed code=${J.code} msg=${J.msg}`);return!0}async function fu(x){try{let Z=await E3(),J=await(await fetch(`https://open.feishu.cn/open-apis/im/v1/chats/${encodeURIComponent(x)}`,{headers:{Authorization:`Bearer ${Z}`}})).json();if(J?.code!==0)return k(`feishu: fetchChatName ${x} code=${J?.code} msg=${J?.msg}`),null;let X=J.data?.name;if(typeof X==="string"&&X)return M8.set(x,X),k(`feishu: fetchChatName ${x} → "${X}" (point lookup)`),X;return k(`feishu: fetchChatName ${x} — chat has no name (unnamed group?)`),null}catch(Z){return k(`feishu: fetchChatName ${x} failed: ${Z}`),null}}async function yu(x,Z,Q,J){let X=Mu(),z=null;for(let Y=0;Y<jY.length;Y++){if(jY[Y]>0)await new Promise((G)=>setTimeout(G,jY[Y]));try{let G=await K1.im.message.create({params:{receive_id_type:"chat_id"},data:{receive_id:Z,msg_type:Q,content:J,uuid:X}});if(G?.code&&G.code!==0)return k(`feishu: send${x==="text"?"Text":"Card"} rejected chat=${Z} code=${G.code} msg=${G.msg}`),null;return G?.data?.message_id??null}catch(G){z=G,k(`feishu: send${x==="text"?"Text":"Card"} attempt ${Y+1}/${jY.length} chat=${Z} failed: ${G}`)}}return k(`feishu: send${x==="text"?"Text":"Card"} chat=${Z} EXHAUSTED ${jY.length} retries: ${z}`),null}async function $F0(x){let Z=await K1.im.chat.get({path:{chat_id:x}});if(Z.code&&Z.code!==0)throw Error(`feishu chat.get failed code=${Z.code} msg=${Z.msg}`);return{name:Z.data?.name??null,status:Z.data?.chat_status??null}}function FF0(x){return x===null||x==="normal"}async function W0(x,Z){return yu("text",x,"text",JSON.stringify({text:Z}))}async function M1(x,Z){return yu("card",x,"interactive",JSON.stringify(Z))}async function fx(x,Z){let Q=await K1.im.v1.message.patch({path:{message_id:x},data:{content:JSON.stringify(Z)}});if(Q?.code&&Q.code!==0)throw Error(`feishu message.patch failed code=${Q.code} msg=${Q.msg}`)}async function R1(x,Z){try{let Q=await E3(),X=await(await fetch("https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id",{method:"POST",headers:{Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},body:JSON.stringify({receive_id:x,msg_type:"text",content:JSON.stringify({text:Z})})})).json();if(X?.code!==0)return k(`feishu: sendTextRaw rejected chat=${x} code=${X?.code} msg=${X?.msg}`),null;return X.data?.message_id??null}catch(Q){return k(`feishu: sendTextRaw chat=${x} failed: ${Q}`),null}}async function k8(x,Z){if(!x)return null;try{return(await K1.im.messageReaction.create({path:{message_id:x},data:{reaction_type:{emoji_type:Z}}}))?.data?.reaction_id??null}catch(Q){return k(`feishu: addReaction ${Z} on ${x} failed: ${Q}`),null}}async function u4(x,Z){if(!x||!Z)return;try{await K1.im.messageReaction.delete({path:{message_id:x,reaction_id:Z}})}catch(Q){k(`feishu: deleteReaction ${Z} on ${x} failed: ${Q}`)}}async function k5(x,Z){if(!x){k("feishu: urgentApp skip — missing messageId");return}if(Z.length===0){k(`feishu: urgentApp skip — empty openIds (msg=${x})`);return}let Q=await E3(),J=`https://open.feishu.cn/open-apis/im/v1/messages/${x}/urgent_app?user_id_type=open_id`;try{let z=await(await fetch(J,{method:"PATCH",headers:{Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},body:JSON.stringify({user_id_list:Z})})).json();if(z?.code!==0){k(`feishu: urgentApp ${x} code=${z?.code} msg=${z?.msg}`);return}let Y=z.data?.invalid_user_id_list??[],G=Z.length-Y.length;k(`feishu: urgentApp ${x} ok — delivered=${G}${Y.length?` invalid=${Y.length}`:""}`)}catch(X){k(`feishu: urgentApp ${x} failed: ${X}`)}}async function qY(x,Z,Q,J){try{let X=await E3(),z=`https://open.feishu.cn/open-apis/im/v1/messages/${x}/resources/${Z}?type=${Q}`,Y=await fetch(z,{headers:{Authorization:`Bearer ${X}`}});if(!Y.ok){k(`feishu: download ${Q} HTTP ${Y.status}: ${(await Y.text()).slice(0,200)}`);return}let G=Buffer.from(await Y.arrayBuffer());kx(qW,{recursive:!0});let K=J?J.replace(/[^a-zA-Z0-9._-]/g,"_"):`${Z.replace(/[^a-zA-Z0-9_-]/g,"_")}.png`,H=WL(qW,`${Date.now()}-${K}`);return gx(H,G),k(`feishu: downloaded ${Q} ${H} (${G.length}B)`),H}catch(X){k(`feishu: download ${Q} failed: ${X instanceof Error?X.message:X}`);return}}function LF0(x){return UF0.has(KF0(x).toLowerCase())}async function mu(x){let Z=await E3(),Q=new Blob([await Cu(x)]),J=new FormData;J.append("image_type","message"),J.append("image",Q,bx(x));let z=await(await fetch("https://open.feishu.cn/open-apis/im/v1/images",{method:"POST",headers:{Authorization:`Bearer ${Z}`},body:J})).json();if(z?.code!==0)return k(`feishu: uploadImage ${x} code=${z.code} msg=${z.msg}`),null;return z.data?.image_key??null}async function _u(x){try{let Z=Ru(x);if(!Z.isFile())return k(`feishu: uploadImageKey not a file — ${x}`),null;if(Z.size>hu)return k(`feishu: uploadImageKey oversize — ${x} (${(Z.size/1024/1024).toFixed(1)} MB)`),null}catch(Z){return k(`feishu: uploadImageKey stat failed — ${x}: ${Z}`),null}return mu(x)}async function NF0(x){let Z=await E3(),Q=new Blob([await Cu(x)]),J=new FormData;J.append("file_type","stream"),J.append("file_name",bx(x)),J.append("file",Q,bx(x));let z=await(await fetch("https://open.feishu.cn/open-apis/im/v1/files",{method:"POST",headers:{Authorization:`Bearer ${Z}`},body:J})).json();if(z?.code!==0)return k(`feishu: uploadFile ${x} code=${z.code} msg=${z.msg}`),null;return z.data?.file_key??null}async function DF0(x,Z){try{let Q=await K1.im.message.create({params:{receive_id_type:"chat_id"},data:{receive_id:x,msg_type:"image",content:JSON.stringify({image_key:Z})}});if(Q?.code&&Q.code!==0)return k(`feishu: sendImage rejected chat=${x} code=${Q.code} msg=${Q.msg}`),null;return Q?.data?.message_id??null}catch(Q){return k(`feishu: sendImage failed chat=${x}: ${Q}`),null}}async function OF0(x,Z){try{let Q=await K1.im.message.create({params:{receive_id_type:"chat_id"},data:{receive_id:x,msg_type:"file",content:JSON.stringify({file_key:Z})}});if(Q?.code&&Q.code!==0)return k(`feishu: sendFile rejected chat=${x} code=${Q.code} msg=${Q.msg}`),null;return Q?.data?.message_id??null}catch(Q){return k(`feishu: sendFile failed chat=${x}: ${Q}`),null}}async function lu(x,Z){try{let J=Ru(Z);if(!J.isFile())return await W0(x,`❌ 出站文件: 路径不是文件 — ${Z}`),!1;if(J.size>hu)return await W0(x,`❌ 出站文件: ${bx(Z)} 超过 30 MB (${(J.size/1024/1024).toFixed(1)} MB)`),!1}catch(J){return await W0(x,`❌ 出站文件: 无法读取 ${Z} (${J})`),!1}let Q=LF0(Z);try{if(Q){let J=await mu(Z);if(!J)return await W0(x,`❌ 出站图片上传失败: ${bx(Z)}`),!1;return await DF0(x,J)!=null}else{let J=await NF0(Z);if(!J)return await W0(x,`❌ 出站文件上传失败: ${bx(Z)}`),!1;return await OF0(x,J)!=null}}catch(J){return k(`feishu: uploadAndSend ${Z} failed: ${J}`),await W0(x,`❌ 出站文件异常: ${bx(Z)} — ${J}`),!1}}function nu(x){kx(x,{recursive:!0}),k(`feishu: provisioned ${x}`);let Z=WL(Lu(),".codex","config.toml");try{kx(WL(Lu(),".codex"),{recursive:!0});let Q="";try{Q=b5(Z,"utf8")}catch{}let J=`[projects.${JSON.stringify(x)}]`;if(!Q.includes(J)){let X=Q.trimEnd();Q=`${X}${X?`
234
234
 
@@ -340,7 +340,7 @@ deepseek-setup <api_key>
340
340
  `)?"":`
341
341
  `;LN0(L8,J+X+`
342
342
  `+ON0(x,Z)+`
343
- `),BN0()}var jh=R0(()=>{n4();m8();RN();c4()});var CN={};GZ(CN,{runTokenSourceSetup:()=>MN0,onTokenSourceEnable:()=>vN0});async function vN0(x,Z){let Q=J4(Z);if(!Q){await W0(x.chatId,`❌ 未知 token source: ${Z}`);return}if(Q.enabled){await W0(x.chatId,`${Q.display} 已启用,发 \`model\` 选择。`);return}let J=p7().find((X)=>X.setup?.commandSuffix===Z||X.configSectionId===Z);if(J?.setup)await W0(x.chatId,J.setup.hint(Q.display));else if(Q.kind==="codex-subscription")await W0(x.chatId,`${Q.display} 需要 ChatGPT 登录:在服务器执行 \`codex login\`,完成后重启 daemon(\`systemctl --user restart feishu-daemon\`)或重发 \`model\` 刷新。`);else if(Q.kind==="claude-native")await W0(x.chatId,`${Q.display} 直接使用本机 Claude Code 配置,无需单独启用。`)}async function MN0(x,Z,Q){let J=p7().find((z)=>z.setup?.commandSuffix===Z);if(!J?.setup||!J.configSectionId){await W0(x.chatId,`❌ 未知或不可配置的 source: ${Z}`);return}let X=J.setup.parseArgs(Q);if("error"in X){await W0(x.chatId,X.error);return}try{Sh(J.configSectionId,X.config),await K2();let z=J4(J.configSectionId);await W0(x.chatId,`✅ ${z?.display??Z} 已启用。发 \`model\` 重新选择。`)}catch(z){await W0(x.chatId,`❌ 启用失败: ${z?.message??z}`)}}var SN=R0(()=>{h1();c4();jh()});async function Ih(x,Z,Q=""){let J=Z.trim().match(/^(?:wt|worktree)(?:\s+(.+))?$/i);if(J){if(x.startingAgy||x.runningAgy)return await W0(x.chatId,"⏳ agy 任务正在执行;请等待完成,或发送 stop 打断后再使用 wt。"),!0;return await x.runWorktreeCommand((J[1]??"").trim(),Q),!0}if(Z.trim().match(/^btw$/i)){if(x.startingAgy||x.runningAgy)return await W0(x.chatId,"⏳ agy 任务正在执行;请等待完成,或发送 stop 打断后再使用 btw。"),!0;return await x.runBtwCommand(Q),!0}if(Z.trim().match(/^bye$/i))return await x.runByeCommand(),!0;if(Z.trim().match(/^(?:fk|fork)$/i)){if(x.startingAgy||x.runningAgy)return await W0(x.chatId,"⏳ agy 任务正在执行;请等待完成,或发送 stop 打断后再使用 fk。"),!0;return await x.showForkList(),!0}if(Z.trim().match(/^(?:bk|back)$/i)){if(x.startingAgy||x.runningAgy)return await W0(x.chatId,"⏳ agy 任务正在执行;请等待完成,或发送 stop 打断后再使用 bk。"),!0;if(x.isRunning())await x.stop("回滚前终止",{announce:!1});return await x.showBackList(),!0}let X=Z.trim().match(/^agy(?:\s+([\s\S]+))?$/i);if(X)return await x.runAgyCommand((X[1]??"").trim()),!0;if(Z.trim().toLowerCase()==="task")return await x.showTasklistPanel(),!0;let z=Z.trim().match(/^(\w+)-setup\s+([\s\S]+)$/i);if(z){let{runTokenSourceSetup:G}=await Promise.resolve().then(() => (SN(),CN));return await G(x,z[1].trim(),z[2].trim()),!0}let Y=RN0.get(Z.trim().toLowerCase());if(!Y)return!1;if((x.startingAgy||x.runningAgy)&&!["stop","kill","restart","hi","model"].includes(Y))return await W0(x.chatId,`⏳ agy 任务正在执行;请等待完成,或发送 stop 打断后再执行 ${Y}。`),!0;switch(Y){case"model":return await x.showModelPanel(),!0;case"compact":return await x.runCompactCommand(),!0;case"hi":{let K=!x.isRunning(),H=x.backendLabel(),W=K?await x.openStatusCard("hi",x.withModel(`\uD83D\uDE80 启动 ${H}`)):null,L=x.withModel(`\uD83D\uDE80 启动 ${H}`);if(!(K?await x.start({announce:!W,onStatus:(D)=>{L=D,x.setStatusCard(W,D)}}):!0))return await x.closeStatusCard(W,L.startsWith("❌")?L:"❌ 启动失败"),!0;if(W)return await x.replaceStatusCardWithConsole(W,x.withModel(x.withWorktreeInstructionNotice(`✅ ${x.backendLabel()} 已就绪`))),!0;if(K)await x.closeStatusCard(W,x.withModel(x.withWorktreeInstructionNotice(`✅ ${x.backendLabel()} 已就绪`)))}return await x.showConsole(),!0;case"stop":if(x.runningAgy)return await x.stopAgyTask("\uD83D\uDED1 agy 已打断"),!0;if(x.clearStaleIdleQueueState("stop"),x.clearMultiMsgBuffer("stop command"),!x.currentTurn&&x.pendingUserMessageCount===0&&x.pendingMidTurnMsgs.length===0){let K=await x.openStatusCard("stop","⚪ 当前没有正在执行的 turn","grey");if(K)await x.closeStatusCard(K,"⚪ 无正在执行的 turn");else await W0(x.chatId,"⚪ 当前没有正在执行的 turn");return!0}k(`session "${x.sessionName}": stop command — interrupt + drop count=${x.pendingUserMessageCount} midBuffer=${x.pendingMidTurnMsgs.length}`);let G=new Set;for(let[K,H]of[...x.pendingReactionIds.entries(),...x.currentBatchReactionIds.entries()]){if(H)u4(K,H);k8(K,"CrossMark"),G.add(K)}for(let K of x.pendingMidTurnMsgs)if(K.msgId&&!G.has(K.msgId))k8(K.msgId,"CrossMark");return x.pendingUserMessageCount=0,x.pendingMidTurnMsgs=[],x.pendingTurnInputs=[],x.lastUserOpenId="",x.pendingReactionIds=new Map,x.currentBatchReactionIds=new Map,x.userInterrupted=!0,x.interrupt(),await x.closeTurnCard("\uD83D\uDED1 打断"),!0;case"kill":{if(x.runningAgy)await x.stopAgyTask("\uD83D\uDED1 agy 已终止");let K=x.isRunning(),H=x.backendLabel(x.proc?.provider??x.currentProvider()),W=K?`\uD83D\uDED1 停止 ${H}`:"⚪ session 当前未运行",L=await x.openStatusCard("kill",W,K?"red":"grey");await x.stop("已终止",{announce:!L,onStatus:(N)=>{x.setStatusCard(L,N)}}),await x.closeStatusCard(L,K?`✅ ${H} 已终止`:`⚪ ${H} 未运行`)}return!0;case"restart":if(!x.isRunning()&&x.selectedProvider!=="codex")return await x.showResumeList(),!0;{let K=x.lastSessionId?x.lastSessionId.slice(0,8):"",H=x.backendLabel(x.proc?.provider??x.currentProvider()),W=x.isRunning()?x.withModel(`\uD83D\uDD01 重启 ${H}`):K?x.withModel(`\uD83D\uDD01 恢复上一会话 thread=${K}…`):x.withModel(`\uD83D\uDD01 启动 ${H}`),L=await x.openStatusCard("restart",W);if(x.runningAgy)x.setStatusCard(L,"\uD83D\uDED1 restart 前终止 agy"),await x.stopAgyTask("\uD83D\uDED1 restart 前已终止 agy");let N=W,D=await x.restart(!0,{announce:!L,onStatus:(v)=>{N=v,x.setStatusCard(L,v)}}),O=D?N.startsWith("✅")?N:x.withWorktreeInstructionNotice(K?"✅ 已恢复上一会话":`✅ ${x.backendLabel()} 已就绪`):N.startsWith("❌")?N:"❌ 重启失败";await x.closeStatusCard(L,D?x.withModel(O):O)}return!0;case"clear":if(!x.isRunning()){x.status="stopped",x.opts.onLifecycleChange?.();let K=await x.openStatusCard("clear","⚪ session 当前未运行","grey");if(K)await x.closeStatusCard(K,`⚪ ${x.backendLabel()} 未运行,clear 无效`);else await W0(x.chatId,`⚪ session "${x.sessionName}" 当前未运行,clear 无效;用 \`hi\` 启动或 \`restart\` 恢复上一会话`);return!0}{let K=await x.openStatusCard("clear","\uD83E\uDDF9 清空并启动新会话","orange"),H="\uD83E\uDDF9 清空并启动新会话",W=await x.restart(!1,{announce:!K,onStatus:(L)=>{H=L,x.setStatusCard(K,L)}});await x.closeStatusCard(K,W?x.withModel(x.withWorktreeInstructionNotice("✅ 已清空并启动新会话")):H.startsWith("❌")?H:"❌ 清空失败")}return!0}}var RN0;var Th=R0(()=>{h1();X1();RN0=new Map([["hi","hi"],["stop","stop"],["st","stop"],["kill","kill"],["kl","kill"],["restart","restart"],["rs","restart"],["clear","clear"],["cl","clear"],["compact","compact"],["cm","compact"],["model","model"],["md","model"]])});function IN0(x,Z){let Q=!1,J=null,X=()=>{},z=()=>{},Y=x.sessionId,G=()=>{if(J)clearTimeout(J),J=null;x.off("context_compacted",W),x.off("exit",L),x.off("error",N)},K=(O)=>{if(Q)return;Q=!0,G(),X(O)},H=(O)=>{if(Q)return;Q=!0,G(),z(O)},W=(O)=>{if(O.phase==="start")return;if(O.threadId&&Y&&O.threadId!==Y)return;K(O)},L=()=>H(Error("codex app-server exited before context compaction completed")),N=(O)=>H(O instanceof Error?O:Error(String(O))),D=new Promise((O,v)=>{X=O,z=v,J=setTimeout(()=>{H(Error(`context compaction completion timed out after ${Z/1000}s`))},Z)});return x.on("context_compacted",W),x.once("exit",L),x.once("error",N),{promise:D,cancel(){if(Q)return;Q=!0,G()}}}function TN0(x,Z){let Q=[],J=new Set,X=(G,K)=>{let H=K.threadId??Z;if(H&&G.threadId&&G.threadId!==H)return!1;if(K.turnId)return G.turnId===K.turnId;return!0},z=(G)=>{for(let K=Q.length-1;K>=0;K--){let H=Q[K];if(H&&X(H,G))return H}return null},Y=(G)=>{if(Z&&G.threadId&&G.threadId!==Z)return;let K={usage:G.usage,contextWindow:G.contextWindow,threadId:G.threadId,turnId:G.turnId};Q.push(K);for(let H of[...J])if(X(K,H.notice))H.finish(K)};return x.on("token_usage",Y),{waitFor(G,K){let H=z(G);if(H)return Promise.resolve(H);return new Promise((W)=>{let L=null,N={notice:G,finish:(D)=>{if(L)clearTimeout(L);J.delete(N),W(D)}};L=setTimeout(()=>N.finish(null),K),J.add(N)})},cancel(){x.off("token_usage",Y);for(let G of[...J])G.finish(null)}}}function cN0(x){if(!x)return" · \uD83E\uDDE0 MISS";let Z=Fz(x.usage);if(Z==null)return" · \uD83E\uDDE0 MISS";let Q=Uz(x.contextWindow);return` · \uD83E\uDDE0 ${tu(Z,Q)} (${Lz(Z,Q)})`}async function ch(x){x.clearStaleIdleQueueState("compact");let Z=!x.currentTurn&&x.pendingUserMessageCount===0&&x.pendingMidTurnMsgs.length===0&&!x.openingTurn;if(!x.isRunning()||!x.proc){x.status="stopped",x.opts.onLifecycleChange?.();let H=await x.openStatusCard("compact","⚪ session 当前未运行","grey");if(H)await x.closeStatusCard(H,"⚪ 后端未运行,compact 无效");else await W0(x.chatId,`⚪ session "${x.sessionName}" 当前未运行,compact 无效;用 \`hi\` 启动或 \`restart\` 恢复上一会话`);return}if(!Z){let H=await x.openStatusCard("compact","⚠️ 当前 turn 正在执行","grey");if(H)await x.closeStatusCard(H,"⚠️ 先 stop 当前 turn,再 compact");else await W0(x.chatId,"⚠️ 当前 turn 正在执行,先 `stop` 后再 `compact`。");return}if(x.manualContextCompactionPending){let H=await x.openStatusCard("compact","⏳ 上下文压缩已在进行中","grey");if(H)await x.closeStatusCard(H,"⏳ 上下文压缩已在进行中");else await W0(x.chatId,"⏳ 上下文压缩已在进行中。");return}let Q=x.proc,J=Q.sessionId?Q.sessionId.slice(0,8):"",X=x.withModel(J?`\uD83E\uDDE0 压缩上下文 thread=${J}…`:"\uD83E\uDDE0 压缩上下文…"),z=await x.openStatusCard("compact",X,"orange"),Y=async(H)=>{if(z)await x.closeStatusCard(z,H);else await W0(x.chatId,H)},G=IN0(Q,SN0),K=TN0(Q,Q.sessionId);x.manualContextCompactionPending=!0;try{x.setStatusCard(z,x.withModel("\uD83E\uDDE0 发起上下文压缩")),await Q.compactThread(),x.setStatusCard(z,x.withModel("⏳ 等待压缩完成事件"));let H=await G.promise,W=await K.waitFor(H,jN0),L=H.threadId?` thread=${H.threadId.slice(0,8)}…`:"";await Y(x.withModel(`✅ 上下文已压缩${L}${cN0(W)}`))}catch(H){if(G.cancel(),H instanceof J2)await Y(x.withModel(`ⓘ ${H.message}`));else await Y(`❌ 上下文压缩失败: ${$1(H)}`)}finally{K.cancel(),x.manualContextCompactionPending=!1}}var SN0=120000,jN0=1500;var qh=R0(()=>{i7();h1()});import{randomUUID as AN0}from"node:crypto";function EN0(x){let Z=x.currentTokenSource(),Q=x.currentModelLabel();return W2().filter((J)=>J.enabled||J.kind!=="claude-native").map((J)=>({provider:J.agent,sourceId:J.id,display:J.display+(Z?.id===J.id&&Q?` · ${Q}`:""),enabled:J.enabled,modelCount:J.models.length,selected:Z?.id===J.id}))}function bN0(x,Z){let Q=x.currentModelLabel(),J=x.currentEffortLabel(),X=x.currentTokenSource()?.id===Z.id;return Z.models.map((z)=>{let Y=X&&Q===z.model;return{provider:Z.agent,sourceId:Z.id,model:z.model,displayName:z.display,description:Z.display,enabled:!0,isDefault:!1,selected:Y,efforts:z.efforts.map((G)=>({effort:G,description:"",isDefault:G===z.defaultEffort,selected:Y&&J===G}))}})}async function Ah(x){let Z=AN0(),Q=EN0(x);if(x.modelPanels.set(Z,{models:[]}),!await M1(x.chatId,yL({sessionName:x.sessionName,panelId:Z,currentDisplay:x.currentTokenSource()?.display??x.currentModelLabel(),providers:Q})))x.modelPanels.delete(Z),await R1(x.chatId,"❌ 模型面板发送失败")}async function Eh(x,Z,Q=""){let J=Z.trim(),X=J4(J);if(!X)return{ok:!1,message:`未知账号: ${J}`};if(!X.enabled)return{ok:!1,message:`${X.display} 未配置,请先点「启用」`};let z=Q.trim(),Y=bN0(x,X);return x.modelPanels.set(z,{models:Y}),{ok:!0,message:"",card:hL({sessionName:x.sessionName,panelId:z,currentModel:x.currentModelLabel(),currentEffort:x.currentEffortLabel(),models:Y})}}function kN0(x,Z){return Z?.provider==="claude"||Z?.provider==="codex"?Z.provider:d7(x)}function gN0(x,Z){if(x.currentTurn)return"当前 turn 不变,后续新 turn 使用。";if(x.proc?.isAlive()&&x.proc.provider===Z)return Z==="codex"?"Codex 需重启进程生效(发 restart)。":"下一轮开始使用。";return`下次启动 ${b6(Z)} 时使用。`}async function bh(x,Z,Q="",J="",X=null){let z=Z.trim();if(!z)return await W0(x.chatId,`❌ ${"模型为空"}`),{ok:!1,message:"模型为空"};let Y=kN0(z,X),G=x.modelPanels.get(Q.trim())?.models.find((K)=>K.model===z&&(K.provider??"codex")===Y);if(!G)return{ok:!1,message:"模型不在当前选项中,请重新发送 model"};if(G.enabled===!1)return{ok:!1,message:`${G.displayName} 未配置,请先点「启用」`};if(G.efforts.length===0)return{ok:!1,message:"模型未返回 effort"};return{ok:!0,message:"",card:mL({sessionName:x.sessionName,panelId:Q.trim(),currentModel:x.currentModelLabel(),currentEffort:x.currentEffortLabel(),model:G})}}async function kh(x,Z,Q,J="",X="",z=""){let Y=Z.trim(),G=Q.trim();if(!Y)return{ok:!1,message:"模型为空"};let K=J.trim(),H=x.modelPanels.get(K),W=z==="claude"||z==="codex"?z:H?.models.find((c)=>c.model===Y)?.provider??d7(Y);if(W==="claude"){if(!L3(G))return{ok:!1,message:"Claude reasoning effort 无效"}}else if(!Y6(G))return{ok:!1,message:"Codex reasoning effort 无效"};let L=G,N=H?.models.find((c)=>c.model===Y&&(c.provider??"codex")===W);if(!N||!N.efforts.some((c)=>c.effort===L))return{ok:!1,message:`${b6(W)} · ${Y}/${L} 不在选项中`};let D=!!N.sourceId&&x.currentTokenSource()?.id!==N.sourceId;if(x.currentProvider()===W&&!D&&x.currentModelLabel()===Y&&x.currentEffortLabel()===L)return x.modelPanels.delete(K),{ok:!0,message:`当前已是 ${b6(W)} · ${Y} / ${L}`,card:uz({sessionName:x.sessionName,provider:W,model:Y,effort:L,scope:"当前已是此设置,无需变更。"})};if(x.proc?.isAlive()&&x.proc.provider!==W&&(x.currentTurn||x.openingTurn||x.pendingUserMessageCount>0||x.pendingMidTurnMsgs.length>0))return{ok:!1,message:`当前 ${x.backendLabel(x.proc.provider)} turn 正在执行或排队;请等结束或 stop 后再切换到 ${b6(W)}`};let B=x.currentModelLabel()!==Y||D,j=!!(x.currentTurn||x.openingTurn||x.pendingUserMessageCount>0||x.pendingMidTurnMsgs.length>0);if(W==="claude"&&x.proc?.isAlive()&&x.proc.provider==="claude"&&B&&j)return{ok:!1,message:"当前 Claude turn 正在执行或排队;Claude 模型 profile 通过 env 生效,请等结束或 stop 后再切换"};try{if(x.proc?.isAlive()&&x.proc.provider===W){let I=N.sourceId?J4(N.sourceId)?.resolveSpawnModel(Y)??Y:Y;await qy(x.proc.setModelSettings(I,L),20000,"thread/settings/update")}await x.applyModelSelection(W,Y,L,N.sourceId);let c=gN0(x,W);return x.modelPanels.delete(K),{ok:!0,message:`已选择 ${b6(W)} · ${Y} / ${L}`,card:uz({sessionName:x.sessionName,provider:W,model:Y,effort:L,scope:c})}}catch(c){let I=`模型切换失败: ${$1(c)}`;return k(`session "${x.sessionName}": set model settings failed: ${$1(c)}`),await W0(x.chatId,`❌ ${I}`),{ok:!1,message:I}}}var gh=R0(()=>{c4();_7();i7();m4();h1();X1()});function f3(x,Z,Q=!1){let J=x.worktreeProjectName();return xN({projectName:J,tasklistName:tL(J),binding:N4(J),notice:Z,confirmDelete:Q})}async function Ph(x){if(!await M1(x.chatId,f3(x)))await R1(x.chatId,"❌ task 面板发送失败")}async function wh(x){let Z=x.worktreeProjectName();try{let Q=N4(Z),J=await rf(Z,x.chatId),X=Q?"已启用":`已启用 ${J.name}`;return{ok:!0,message:X,card:f3(x,{type:"success",content:`✅ ${X}`})}}catch(Q){let J=`启用失败: ${$1(Q)}`;return k(`session "${x.sessionName}": tasklist enable failed: ${$1(Q)}`),{ok:!1,message:J,card:f3(x,{type:"error",content:`❌ ${J}`})}}}function uh(x,Z){let Q=x.worktreeProjectName(),J=N4(Q),X=Z.trim();if(!J)return{ok:!1,message:"未启用",card:f3(x,{type:"error",content:"❌ 未启用"})};if(J.guid!==X)return{ok:!1,message:"清单绑定已变化",card:f3(x,{type:"error",content:"❌ 清单绑定已变化,请重新打开 task 面板"})};return{ok:!0,message:"请再次确认删除",card:f3(x,{type:"error",content:"⚠️ 删除会删除所有清单内任务"},!0)}}async function fh(x,Z){let Q=x.worktreeProjectName(),J=Z.trim();try{let z=`已删除 ${(await tf(Q,J)).name}`;return{ok:!0,message:z,card:f3(x,{type:"success",content:`✅ ${z}`})}}catch(X){let z=`删除失败: ${$1(X)}`;return k(`session "${x.sessionName}": tasklist delete failed: ${$1(X)}`),{ok:!1,message:z,card:f3(x,{type:"error",content:`❌ ${z}`})}}}var yh=R0(()=>{m4();h1();X1();iz()});var hh,mh,_h,lh;var nh=R0(()=>{hh=["- 以 `[file: /abs/path]` 开头的文本表示该路径上挂着一个文件,相关时去读它。","- 在回复任意位置,独占一行写 `[[send: /abs/path]]` 即可把该文件作为单独一条消息送出。只在用户主动要文件、或你要交付最终产物时才发。"],mh=["- 判断是否该发文件:导出附件/数据集、用户明确要文件或下载物时,应先写到本机绝对路径,再用独占一行的 `[[send: /abs/path]]` 发给用户;短总结、普通说明、无需留存的正文答复不要为了发文件而发文件。","- 使用图片生成工具生成图片后,不要再补充说明文字或 `[[send: ...]]`;Lodestar 会根据工具返回的本机图片路径自动发给用户。若你用脚本或文件编辑生成图片,按上一条用 `[[send: /abs/path]]` 发出。","- 每次调用 Bash / shell 命令时,第一行都必须写 shell 注释 `# desc: <一句中文说明>`,再写真正命令。这个注释只给 Lodestar 卡片做摘要,不要依赖它改变命令行为。"],_h=[...hh,'- 当你有问题需要澄清时,输出单独一行 `[[askusr: {...}]]`。JSON 必须单行、合法、紧凑。格式是 `{ "questions": [{ "question": "完整问题1", "options": ["问题1的可选方案A","问题1的可选方案B"] }, { "question": "完整问题2", "options": [...] }] }`。每个问题都必须提供 `options`,且每题至少 2 个选项;',"- 一旦输出 `[[askusr: ...]]`,立刻停止继续推理和继续回答,等待用户先回答。需要澄清时,应一次性把当前继续执行所需的所有问题都放进这一个 askusr 标记里,不要拆成多轮连续追问。",...mh].join(`
343
+ `),BN0()}var jh=R0(()=>{n4();m8();RN();c4()});var CN={};GZ(CN,{runTokenSourceSetup:()=>MN0,onTokenSourceEnable:()=>vN0});async function vN0(x,Z){let Q=J4(Z);if(!Q){await W0(x.chatId,`❌ 未知 token source: ${Z}`);return}if(Q.enabled){await W0(x.chatId,`${Q.display} 已启用,发 \`model\` 选择。`);return}let J=p7().find((X)=>X.setup?.commandSuffix===Z||X.configSectionId===Z);if(J?.setup)await W0(x.chatId,J.setup.hint(Q.display));else if(Q.kind==="codex-subscription")await W0(x.chatId,`${Q.display} 需要 ChatGPT 登录:在服务器执行 \`codex login\`,完成后重启 daemon(\`systemctl --user restart feishu-daemon\`)或重发 \`model\` 刷新。`);else if(Q.kind==="claude-native")await W0(x.chatId,`${Q.display} 直接使用本机 Claude Code 配置,无需单独启用。`)}async function MN0(x,Z,Q){let J=p7().find((z)=>z.setup?.commandSuffix===Z);if(!J?.setup||!J.configSectionId){await W0(x.chatId,`❌ 未知或不可配置的 source: ${Z}`);return}let X=J.setup.parseArgs(Q);if("error"in X){await W0(x.chatId,X.error);return}try{Sh(J.configSectionId,X.config),await K2();let z=J4(J.configSectionId);await W0(x.chatId,`✅ ${z?.display??Z} 已启用。发 \`model\` 重新选择。`)}catch(z){await W0(x.chatId,`❌ 启用失败: ${z?.message??z}`)}}var SN=R0(()=>{h1();c4();jh()});async function Ih(x,Z,Q=""){let J=Z.trim().match(/^(?:wt|worktree)(?:\s+(.+))?$/i);if(J){if(x.startingAgy||x.runningAgy)return await W0(x.chatId,"⏳ agy 任务正在执行;请等待完成,或发送 stop 打断后再使用 wt。"),!0;return await x.runWorktreeCommand((J[1]??"").trim(),Q),!0}if(Z.trim().match(/^btw$/i)){if(x.startingAgy||x.runningAgy)return await W0(x.chatId,"⏳ agy 任务正在执行;请等待完成,或发送 stop 打断后再使用 btw。"),!0;return await x.runBtwCommand(Q),!0}if(Z.trim().match(/^bye$/i))return await x.runByeCommand(),!0;if(Z.trim().match(/^(?:fk|fork)$/i)){if(x.startingAgy||x.runningAgy)return await W0(x.chatId,"⏳ agy 任务正在执行;请等待完成,或发送 stop 打断后再使用 fk。"),!0;return await x.showForkList(),!0}if(Z.trim().match(/^(?:bk|back)$/i)){if(x.startingAgy||x.runningAgy)return await W0(x.chatId,"⏳ agy 任务正在执行;请等待完成,或发送 stop 打断后再使用 bk。"),!0;if(x.isRunning())await x.stop("回滚前终止",{announce:!1});return await x.showBackList(),!0}let X=Z.trim().match(/^agy(?:\s+([\s\S]+))?$/i);if(X)return await x.runAgyCommand((X[1]??"").trim()),!0;if(Z.trim().toLowerCase()==="task")return await x.showTasklistPanel(),!0;let z=Z.trim().match(/^(\w+)-setup\s+([\s\S]+)$/i);if(z){let{runTokenSourceSetup:G}=await Promise.resolve().then(() => (SN(),CN));return await G(x,z[1].trim(),z[2].trim()),!0}let Y=RN0.get(Z.trim().toLowerCase());if(!Y)return!1;if((x.startingAgy||x.runningAgy)&&!["stop","kill","restart","hi","model"].includes(Y))return await W0(x.chatId,`⏳ agy 任务正在执行;请等待完成,或发送 stop 打断后再执行 ${Y}。`),!0;switch(Y){case"model":return await x.showModelPanel(),!0;case"compact":return await x.runCompactCommand(),!0;case"hi":{let K=!x.isRunning(),H=x.backendLabel(),W=K?await x.openStatusCard("hi",x.withModel(`\uD83D\uDE80 启动 ${H}`)):null,L=x.withModel(`\uD83D\uDE80 启动 ${H}`);if(!(K?await x.start({announce:!W,onStatus:(D)=>{L=D,x.setStatusCard(W,D)}}):!0))return await x.closeStatusCard(W,L.startsWith("❌")?L:"❌ 启动失败"),!0;if(W)return await x.replaceStatusCardWithConsole(W,x.withModel(x.withWorktreeInstructionNotice(`✅ ${x.backendLabel()} 已就绪`))),!0;if(K)await x.closeStatusCard(W,x.withModel(x.withWorktreeInstructionNotice(`✅ ${x.backendLabel()} 已就绪`)))}return await x.showConsole(),!0;case"stop":if(x.runningAgy)return await x.stopAgyTask("\uD83D\uDED1 agy 已打断"),!0;if(x.clearStaleIdleQueueState("stop"),x.clearMultiMsgBuffer("stop command"),!x.currentTurn&&x.pendingUserMessageCount===0&&x.pendingMidTurnMsgs.length===0){let K=await x.openStatusCard("stop","⚪ 当前没有正在执行的 turn","grey");if(K)await x.closeStatusCard(K,"⚪ 无正在执行的 turn");else await W0(x.chatId,"⚪ 当前没有正在执行的 turn");return!0}k(`session "${x.sessionName}": stop command — interrupt + drop count=${x.pendingUserMessageCount} midBuffer=${x.pendingMidTurnMsgs.length}`);let G=new Set;for(let[K,H]of[...x.pendingReactionIds.entries(),...x.currentBatchReactionIds.entries()]){if(H)u4(K,H);k8(K,"CrossMark"),G.add(K)}for(let K of x.pendingMidTurnMsgs)if(K.msgId&&!G.has(K.msgId))k8(K.msgId,"CrossMark");return x.pendingUserMessageCount=0,x.pendingMidTurnMsgs=[],x.pendingTurnInputs=[],x.lastUserOpenId="",x.pendingReactionIds=new Map,x.currentBatchReactionIds=new Map,x.userInterrupted=!0,x.interrupt(),await x.closeTurnCard("\uD83D\uDED1 打断"),!0;case"kill":{if(x.runningAgy)await x.stopAgyTask("\uD83D\uDED1 agy 已终止");let K=x.isRunning(),H=x.backendLabel(x.proc?.provider??x.currentProvider()),W=K?`\uD83D\uDED1 停止 ${H}`:"⚪ session 当前未运行",L=await x.openStatusCard("kill",W,K?"red":"grey");await x.stop("已终止",{announce:!L,onStatus:(N)=>{x.setStatusCard(L,N)}}),await x.closeStatusCard(L,K?`✅ ${H} 已终止`:`⚪ ${H} 未运行`)}return!0;case"restart":if(!x.isRunning()&&x.selectedProvider!=="codex")return await x.showResumeList(),!0;{let K=x.lastSessionId?x.lastSessionId.slice(0,8):"",H=x.backendLabel(x.proc?.provider??x.currentProvider()),W=x.isRunning()?x.withModel(`\uD83D\uDD01 重启 ${H}`):K?x.withModel(`\uD83D\uDD01 恢复上一会话 thread=${K}…`):x.withModel(`\uD83D\uDD01 启动 ${H}`),L=await x.openStatusCard("restart",W);if(x.runningAgy)x.setStatusCard(L,"\uD83D\uDED1 restart 前终止 agy"),await x.stopAgyTask("\uD83D\uDED1 restart 前已终止 agy");let N=W,D=await x.restart(!0,{announce:!L,onStatus:(v)=>{N=v,x.setStatusCard(L,v)}}),O=D?N.startsWith("✅")?N:x.withWorktreeInstructionNotice(K?"✅ 已恢复上一会话":`✅ ${x.backendLabel()} 已就绪`):N.startsWith("❌")?N:"❌ 重启失败";await x.closeStatusCard(L,D?x.withModel(O):O)}return!0;case"clear":if(!x.isRunning()){x.status="stopped",x.opts.onLifecycleChange?.();let K=await x.openStatusCard("clear","⚪ session 当前未运行","grey");if(K)await x.closeStatusCard(K,`⚪ ${x.backendLabel()} 未运行,clear 无效`);else await W0(x.chatId,`⚪ session "${x.sessionName}" 当前未运行,clear 无效;用 \`hi\` 启动或 \`restart\` 恢复上一会话`);return!0}{let K=await x.openStatusCard("clear","\uD83E\uDDF9 清空并启动新会话","orange"),H="\uD83E\uDDF9 清空并启动新会话",W=await x.restart(!1,{announce:!K,onStatus:(L)=>{H=L,x.setStatusCard(K,L)}});await x.closeStatusCard(K,W?x.withModel(x.withWorktreeInstructionNotice("✅ 已清空并启动新会话")):H.startsWith("❌")?H:"❌ 清空失败")}return!0}}var RN0;var Th=R0(()=>{h1();X1();RN0=new Map([["hi","hi"],["stop","stop"],["st","stop"],["kill","kill"],["kl","kill"],["restart","restart"],["rs","restart"],["clear","clear"],["cl","clear"],["compact","compact"],["cm","compact"],["model","model"],["md","model"]])});function IN0(x,Z){let Q=!1,J=null,X=()=>{},z=()=>{},Y=x.sessionId,G=()=>{if(J)clearTimeout(J),J=null;x.off("context_compacted",W),x.off("exit",L),x.off("error",N)},K=(O)=>{if(Q)return;Q=!0,G(),X(O)},H=(O)=>{if(Q)return;Q=!0,G(),z(O)},W=(O)=>{if(O.phase==="start")return;if(O.threadId&&Y&&O.threadId!==Y)return;K(O)},L=()=>H(Error("codex app-server exited before context compaction completed")),N=(O)=>H(O instanceof Error?O:Error(String(O))),D=new Promise((O,v)=>{X=O,z=v,J=setTimeout(()=>{H(Error(`context compaction completion timed out after ${Z/1000}s`))},Z)});return x.on("context_compacted",W),x.once("exit",L),x.once("error",N),{promise:D,cancel(){if(Q)return;Q=!0,G()}}}function TN0(x,Z){let Q=[],J=new Set,X=(G,K)=>{let H=K.threadId??Z;if(H&&G.threadId&&G.threadId!==H)return!1;if(K.turnId)return G.turnId===K.turnId;return!0},z=(G)=>{for(let K=Q.length-1;K>=0;K--){let H=Q[K];if(H&&X(H,G))return H}return null},Y=(G)=>{if(Z&&G.threadId&&G.threadId!==Z)return;let K={usage:G.usage,contextWindow:G.contextWindow,threadId:G.threadId,turnId:G.turnId};Q.push(K);for(let H of[...J])if(X(K,H.notice))H.finish(K)};return x.on("token_usage",Y),{waitFor(G,K){let H=z(G);if(H)return Promise.resolve(H);return new Promise((W)=>{let L=null,N={notice:G,finish:(D)=>{if(L)clearTimeout(L);J.delete(N),W(D)}};L=setTimeout(()=>N.finish(null),K),J.add(N)})},cancel(){x.off("token_usage",Y);for(let G of[...J])G.finish(null)}}}function cN0(x){if(!x)return" · \uD83E\uDDE0 MISS";let Z=Fz(x.usage);if(Z==null)return" · \uD83E\uDDE0 MISS";let Q=Uz(x.contextWindow);return` · \uD83E\uDDE0 ${tu(Z,Q)} (${Lz(Z,Q)})`}async function ch(x){x.clearStaleIdleQueueState("compact");let Z=!x.currentTurn&&x.pendingUserMessageCount===0&&x.pendingMidTurnMsgs.length===0&&!x.openingTurn;if(!x.isRunning()||!x.proc){x.status="stopped",x.opts.onLifecycleChange?.();let H=await x.openStatusCard("compact","⚪ session 当前未运行","grey");if(H)await x.closeStatusCard(H,"⚪ 后端未运行,compact 无效");else await W0(x.chatId,`⚪ session "${x.sessionName}" 当前未运行,compact 无效;用 \`hi\` 启动或 \`restart\` 恢复上一会话`);return}if(!Z){let H=await x.openStatusCard("compact","⚠️ 当前 turn 正在执行","grey");if(H)await x.closeStatusCard(H,"⚠️ 先 stop 当前 turn,再 compact");else await W0(x.chatId,"⚠️ 当前 turn 正在执行,先 `stop` 后再 `compact`。");return}if(x.manualContextCompactionPending){let H=await x.openStatusCard("compact","⏳ 上下文压缩已在进行中","grey");if(H)await x.closeStatusCard(H,"⏳ 上下文压缩已在进行中");else await W0(x.chatId,"⏳ 上下文压缩已在进行中。");return}let Q=x.proc,J=Q.sessionId?Q.sessionId.slice(0,8):"",X=x.withModel(J?`\uD83E\uDDE0 压缩上下文 thread=${J}…`:"\uD83E\uDDE0 压缩上下文…"),z=await x.openStatusCard("compact",X,"orange"),Y=async(H)=>{if(z)await x.closeStatusCard(z,H);else await W0(x.chatId,H)},G=IN0(Q,SN0),K=TN0(Q,Q.sessionId);x.manualContextCompactionPending=!0;try{x.setStatusCard(z,x.withModel("\uD83E\uDDE0 发起上下文压缩")),await Q.compactThread(),x.setStatusCard(z,x.withModel("⏳ 等待压缩完成事件"));let H=await G.promise,W=await K.waitFor(H,jN0),L=H.threadId?` thread=${H.threadId.slice(0,8)}…`:"";await Y(x.withModel(`✅ 上下文已压缩${L}${cN0(W)}`))}catch(H){if(G.cancel(),H instanceof J2)await Y(x.withModel(`ⓘ ${H.message}`));else await Y(`❌ 上下文压缩失败: ${$1(H)}`)}finally{K.cancel(),x.manualContextCompactionPending=!1}}var SN0=600000,jN0=1500;var qh=R0(()=>{i7();h1()});import{randomUUID as AN0}from"node:crypto";function EN0(x){let Z=x.currentTokenSource(),Q=x.currentModelLabel();return W2().filter((J)=>J.enabled||J.kind!=="claude-native").map((J)=>({provider:J.agent,sourceId:J.id,display:J.display+(Z?.id===J.id&&Q?` · ${Q}`:""),enabled:J.enabled,modelCount:J.models.length,selected:Z?.id===J.id}))}function bN0(x,Z){let Q=x.currentModelLabel(),J=x.currentEffortLabel(),X=x.currentTokenSource()?.id===Z.id;return Z.models.map((z)=>{let Y=X&&Q===z.model;return{provider:Z.agent,sourceId:Z.id,model:z.model,displayName:z.display,description:Z.display,enabled:!0,isDefault:!1,selected:Y,efforts:z.efforts.map((G)=>({effort:G,description:"",isDefault:G===z.defaultEffort,selected:Y&&J===G}))}})}async function Ah(x){let Z=AN0(),Q=EN0(x);if(x.modelPanels.set(Z,{models:[]}),!await M1(x.chatId,yL({sessionName:x.sessionName,panelId:Z,currentDisplay:x.currentTokenSource()?.display??x.currentModelLabel(),providers:Q})))x.modelPanels.delete(Z),await R1(x.chatId,"❌ 模型面板发送失败")}async function Eh(x,Z,Q=""){let J=Z.trim(),X=J4(J);if(!X)return{ok:!1,message:`未知账号: ${J}`};if(!X.enabled)return{ok:!1,message:`${X.display} 未配置,请先点「启用」`};let z=Q.trim(),Y=bN0(x,X);return x.modelPanels.set(z,{models:Y}),{ok:!0,message:"",card:hL({sessionName:x.sessionName,panelId:z,currentModel:x.currentModelLabel(),currentEffort:x.currentEffortLabel(),models:Y})}}function kN0(x,Z){return Z?.provider==="claude"||Z?.provider==="codex"?Z.provider:d7(x)}function gN0(x,Z){if(x.currentTurn)return"当前 turn 不变,后续新 turn 使用。";if(x.proc?.isAlive()&&x.proc.provider===Z)return Z==="codex"?"Codex 需重启进程生效(发 restart)。":"下一轮开始使用。";return`下次启动 ${b6(Z)} 时使用。`}async function bh(x,Z,Q="",J="",X=null){let z=Z.trim();if(!z)return await W0(x.chatId,`❌ ${"模型为空"}`),{ok:!1,message:"模型为空"};let Y=kN0(z,X),G=x.modelPanels.get(Q.trim())?.models.find((K)=>K.model===z&&(K.provider??"codex")===Y);if(!G)return{ok:!1,message:"模型不在当前选项中,请重新发送 model"};if(G.enabled===!1)return{ok:!1,message:`${G.displayName} 未配置,请先点「启用」`};if(G.efforts.length===0)return{ok:!1,message:"模型未返回 effort"};return{ok:!0,message:"",card:mL({sessionName:x.sessionName,panelId:Q.trim(),currentModel:x.currentModelLabel(),currentEffort:x.currentEffortLabel(),model:G})}}async function kh(x,Z,Q,J="",X="",z=""){let Y=Z.trim(),G=Q.trim();if(!Y)return{ok:!1,message:"模型为空"};let K=J.trim(),H=x.modelPanels.get(K),W=z==="claude"||z==="codex"?z:H?.models.find((c)=>c.model===Y)?.provider??d7(Y);if(W==="claude"){if(!L3(G))return{ok:!1,message:"Claude reasoning effort 无效"}}else if(!Y6(G))return{ok:!1,message:"Codex reasoning effort 无效"};let L=G,N=H?.models.find((c)=>c.model===Y&&(c.provider??"codex")===W);if(!N||!N.efforts.some((c)=>c.effort===L))return{ok:!1,message:`${b6(W)} · ${Y}/${L} 不在选项中`};let D=!!N.sourceId&&x.currentTokenSource()?.id!==N.sourceId;if(x.currentProvider()===W&&!D&&x.currentModelLabel()===Y&&x.currentEffortLabel()===L)return x.modelPanels.delete(K),{ok:!0,message:`当前已是 ${b6(W)} · ${Y} / ${L}`,card:uz({sessionName:x.sessionName,provider:W,model:Y,effort:L,scope:"当前已是此设置,无需变更。"})};if(x.proc?.isAlive()&&x.proc.provider!==W&&(x.currentTurn||x.openingTurn||x.pendingUserMessageCount>0||x.pendingMidTurnMsgs.length>0))return{ok:!1,message:`当前 ${x.backendLabel(x.proc.provider)} turn 正在执行或排队;请等结束或 stop 后再切换到 ${b6(W)}`};let B=x.currentModelLabel()!==Y||D,j=!!(x.currentTurn||x.openingTurn||x.pendingUserMessageCount>0||x.pendingMidTurnMsgs.length>0);if(W==="claude"&&x.proc?.isAlive()&&x.proc.provider==="claude"&&B&&j)return{ok:!1,message:"当前 Claude turn 正在执行或排队;Claude 模型 profile 通过 env 生效,请等结束或 stop 后再切换"};try{if(x.proc?.isAlive()&&x.proc.provider===W){let I=N.sourceId?J4(N.sourceId)?.resolveSpawnModel(Y)??Y:Y;await qy(x.proc.setModelSettings(I,L),20000,"thread/settings/update")}await x.applyModelSelection(W,Y,L,N.sourceId);let c=gN0(x,W);return x.modelPanels.delete(K),{ok:!0,message:`已选择 ${b6(W)} · ${Y} / ${L}`,card:uz({sessionName:x.sessionName,provider:W,model:Y,effort:L,scope:c})}}catch(c){let I=`模型切换失败: ${$1(c)}`;return k(`session "${x.sessionName}": set model settings failed: ${$1(c)}`),await W0(x.chatId,`❌ ${I}`),{ok:!1,message:I}}}var gh=R0(()=>{c4();_7();i7();m4();h1();X1()});function f3(x,Z,Q=!1){let J=x.worktreeProjectName();return xN({projectName:J,tasklistName:tL(J),binding:N4(J),notice:Z,confirmDelete:Q})}async function Ph(x){if(!await M1(x.chatId,f3(x)))await R1(x.chatId,"❌ task 面板发送失败")}async function wh(x){let Z=x.worktreeProjectName();try{let Q=N4(Z),J=await rf(Z,x.chatId),X=Q?"已启用":`已启用 ${J.name}`;return{ok:!0,message:X,card:f3(x,{type:"success",content:`✅ ${X}`})}}catch(Q){let J=`启用失败: ${$1(Q)}`;return k(`session "${x.sessionName}": tasklist enable failed: ${$1(Q)}`),{ok:!1,message:J,card:f3(x,{type:"error",content:`❌ ${J}`})}}}function uh(x,Z){let Q=x.worktreeProjectName(),J=N4(Q),X=Z.trim();if(!J)return{ok:!1,message:"未启用",card:f3(x,{type:"error",content:"❌ 未启用"})};if(J.guid!==X)return{ok:!1,message:"清单绑定已变化",card:f3(x,{type:"error",content:"❌ 清单绑定已变化,请重新打开 task 面板"})};return{ok:!0,message:"请再次确认删除",card:f3(x,{type:"error",content:"⚠️ 删除会删除所有清单内任务"},!0)}}async function fh(x,Z){let Q=x.worktreeProjectName(),J=Z.trim();try{let z=`已删除 ${(await tf(Q,J)).name}`;return{ok:!0,message:z,card:f3(x,{type:"success",content:`✅ ${z}`})}}catch(X){let z=`删除失败: ${$1(X)}`;return k(`session "${x.sessionName}": tasklist delete failed: ${$1(X)}`),{ok:!1,message:z,card:f3(x,{type:"error",content:`❌ ${z}`})}}}var yh=R0(()=>{m4();h1();X1();iz()});var hh,mh,_h,lh;var nh=R0(()=>{hh=["- 以 `[file: /abs/path]` 开头的文本表示该路径上挂着一个文件,相关时去读它。","- 在回复任意位置,独占一行写 `[[send: /abs/path]]` 即可把该文件作为单独一条消息送出。只在用户主动要文件、或你要交付最终产物时才发。"],mh=["- 判断是否该发文件:导出附件/数据集、用户明确要文件或下载物时,应先写到本机绝对路径,再用独占一行的 `[[send: /abs/path]]` 发给用户;短总结、普通说明、无需留存的正文答复不要为了发文件而发文件。","- 使用图片生成工具生成图片后,不要再补充说明文字或 `[[send: ...]]`;Lodestar 会根据工具返回的本机图片路径自动发给用户。若你用脚本或文件编辑生成图片,按上一条用 `[[send: /abs/path]]` 发出。","- 每次调用 Bash / shell 命令时,第一行都必须写 shell 注释 `# desc: <一句中文说明>`,再写真正命令。这个注释只给 Lodestar 卡片做摘要,不要依赖它改变命令行为。"],_h=[...hh,'- 当你有问题需要澄清时,输出单独一行 `[[askusr: {...}]]`。JSON 必须单行、合法、紧凑。格式是 `{ "questions": [{ "question": "完整问题1", "options": ["问题1的可选方案A","问题1的可选方案B"] }, { "question": "完整问题2", "options": [...] }] }`。每个问题都必须提供 `options`,且每题至少 2 个选项;',"- 一旦输出 `[[askusr: ...]]`,立刻停止继续推理和继续回答,等待用户先回答。需要澄清时,应一次性把当前继续执行所需的所有问题都放进这一个 askusr 标记里,不要拆成多轮连续追问。",...mh].join(`
344
344
  `),lh=[...hh,"- 当你有问题需要澄清时,使用 Claude Code 自带的 AskUserQuestion 工具向用户提问;不要输出 Codex 专属的 host-marker 文本协议。",...mh].join(`
345
345
  `)});import{execFileSync as uN0}from"node:child_process";import{existsSync as px,readdirSync as fN0,readFileSync as yN0,realpathSync as dh,statSync as hN0}from"node:fs";import{dirname as mN0,join as ph,resolve as WW}from"node:path";function sx(x){let Z=x.trim();if(!_N0.test(Z))return null;return Z}function xZ(x){return x.startsWith(lN0)}function sh(x){return x.match(/^(.+)\[[^\[\]]+\]$/)?.[1]??x}function _5(x,Z){return`${x}[${Z}]`}function oh(x){return`${m5}${x}`}function KW(x,Z,Q){return ph(mN0(x),_5(Z,Q))}function rh(x,Z,Q){let J=nN0(x,Z,Q);if(!J)return null;let X=yN0(J.path,"utf8").trim();if(!X)return null;return{path:J.path,content:X,slug:J.slug}}function th(x,Z){IN(x);let Q=G8(x,["for-each-ref","--format=%(refname:short)",`refs/heads/${m5}`]).split(`
346
346
  `).map((z)=>z.trim()).filter(Boolean).filter((z)=>z.startsWith(m5)),J=TN(x),X=[];for(let z of Q){let Y=z.slice(m5.length);if(!sx(Y))continue;if(xZ(Y))continue;let G=_5(Z,Y),K=KW(x,Z,Y),H=J.get(z)??null,W=H??K,L=!!H&&px(H),N=Ym(x,z,L),D={slug:Y,chatName:G,branch:z,state:N,expectedPath:K,worktreePath:L?H:null,mounted:L,dirtyCount:null,statusLine:null,error:null};if(H&&px(H))try{let v=G8(H,["status","--porcelain=v1","--branch"]).split(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leviyuan/lodestar",
3
- "version": "0.13.2",
3
+ "version": "0.13.3",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },