billion-context 0.1.168 → 0.1.169
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2287,7 +2287,7 @@ Content-Length: ${Buffer.byteLength(body)}\r
|
|
|
2287
2287
|
`+body)});const katRaw=Number(process.env.BILI_KEEP_ALIVE_TIMEOUT_MS);const keepAliveTimeoutMs=Number.isInteger(katRaw)&&katRaw>0?katRaw:5e3;server.keepAliveTimeout=keepAliveTimeoutMs;const backstopRaw=Number(process.env.BILI_CLIENT_ERROR_BACKSTOP_MS);const clientErrorBackstopMs=Number.isInteger(backstopRaw)&&backstopRaw>=0?backstopRaw:3e4;log2("info",`[conn] keepAliveTimeout=${keepAliveTimeoutMs}ms clientErrorBackstop=${clientErrorBackstopMs}ms`);const connRecords=new Map;let connSeq=0;server.on("connection",socket=>{const rec={id:++connSeq,kind:socket instanceof tls4.TLSSocket?"tls":"tcp",openedAt:Date.now(),requests:0,lastResponseEndAt:null,errored:null,serverEndAt:null,peerFinAt:null,drainArmed:false,backstopAt:null};connRecords.set(socket,rec);socket.on("prefinish",()=>{rec.serverEndAt=performance2.now()});socket.on("end",()=>{rec.peerFinAt=performance2.now()});socket.on("error",err2=>{const code=err2.code;rec.errored=code??err2.message});socket.on("close",()=>{connRecords.delete(socket);const now=Date.now();const idleForBudget=rec.requests>0&&rec.lastResponseEndAt!==null&&now-rec.lastResponseEndAt>=keepAliveTimeoutMs;const reason=rec.backstopAt!==null?"clienterror-backstop":rec.errored?`error(${rec.errored})`:rec.peerFinAt!==null&&(rec.serverEndAt===null||rec.peerFinAt<=rec.serverEndAt)?"peer-fin":idleForBudget?"idle-timeout":rec.serverEndAt!==null?"server-end":"destroyed";log2("debug",`[conn#${rec.id}] ${rec.kind} closed reason=${reason} age=${now-rec.openedAt}ms reqs=${rec.requests}`)})});server.on("clientError",(err2,socket)=>{if(socket.destroyed)return;const rec=socket instanceof net2.Socket?connRecords.get(socket):void 0;if(rec?.drainArmed)return;if(rec)rec.drainArmed=true;log2("warn",`[conn] clientError: ${err2.message} \u2014 draining then closing`);socket.on("error",()=>{});socket.resume();socket.once("end",()=>socket.end());const bail=setTimeout(()=>{if(socket.destroyed||socket.writableEnded)return;socket.end();if(clientErrorBackstopMs>0){const backstop=setTimeout(()=>{if(socket.destroyed||socket.readableEnded)return;if(rec){rec.backstopAt=performance2.now();log2("warn",`[conn#${rec.id}] clientError backstop: no peer FIN ${clientErrorBackstopMs}ms after drain-end \u2014 destroying`)}else{log2("warn",`[conn] clientError backstop: no peer FIN ${clientErrorBackstopMs}ms after drain-end \u2014 destroying`)}socket.destroy()},clientErrorBackstopMs);backstop.unref?.()}},300);bail.unref?.()});const exposureRaw=Number(process.env.BILI_EXPOSURE_LOG_INTERVAL_MS);const exposureIntervalMs=Number.isInteger(exposureRaw)?Math.max(0,exposureRaw):36e5;if(exposureIntervalMs>0){const exposureStartedAt=Date.now();const exposureTimer=setInterval(()=>{const handles=process.getActiveResourcesInfo();const tcpHandles=handles.reduce((n,h)=>n+(h==="TCPWrap"||h==="TLSSocket"?1:0),0);log2("info",`[exposure] uptime=${Math.round((Date.now()-exposureStartedAt)/36e5*10)/10}h liveConns=${connRecords.size} tcpHandles=${tcpHandles} handles=${handles.length} sessions=${listSessions().length} blindTunnels=${liveBlindTunnels()} inFlight=${totalInFlight()}`)},exposureIntervalMs);exposureTimer.unref?.()}setMaskHostsEnabled(opts.maskHosts??true);if(opts.mitm.enabled){const allowRemoteConnect=opts.host==="0.0.0.0"||opts.host==="::"||!isLoopbackAddress(opts.host);setupMitm(server,opts.mitm.domains,msg=>log2("info",msg),host=>resolveProxy(opts.routes,opts.proxy,`https://${host}`,opts.auxProxyFallback??opts.proxyFallback),allowRemoteConnect)}const launchToken=process.env.BILI_LAUNCH_TOKEN?.trim();const strictPort=process.env.BILI_STRICT_PORT==="1";const launcherLane=process.env.BILI_LAUNCHER_LANE?.trim()||void 0;const ownFingerprint=entryScriptFingerprint(process.argv[1]);const MAX_LISTEN_ATTEMPTS=17;let listenAttempts=0;let lastTriedPort=opts.port;const announceListening=()=>{const actualPort=server.address()===null?opts.port:server.address().port;const nonLoopbackBind=opts.host==="0.0.0.0"||opts.host==="::"||!isLoopbackAddress(opts.host);const displayHost=nonLoopbackBind?opts.host:opts.host==="0.0.0.0"?"localhost":opts.host;const originHost=opts.host==="0.0.0.0"||opts.host==="::"||opts.host==="localhost"?"127.0.0.1":opts.host.includes(":")&&!opts.host.startsWith("[")?`[${opts.host}]`:opts.host;const origin=`http://${originHost}:${actualPort}`;const instanceRecord={origin,instanceId,pid:process.pid,startedAt:instanceStartedAt,host:opts.host,port:actualPort,passthrough:opts.passthrough,mitmDomains:opts.mitm.enabled?opts.mitm.domains:[],modelWindows:{...LAUNCHER_MODEL_WINDOWS},modelMaxOutputs:Object.keys(LAUNCHER_MODEL_MAX_OUTPUTS).length>0?{...LAUNCHER_MODEL_MAX_OUTPUTS}:void 0,launchToken:launchToken||void 0,lane:launcherLane,codeFingerprint:ownFingerprint};try{fs12.mkdirSync(stateDir(),{recursive:true});hydratePrefixAffinity();atomicWriteInstanceFile(instanceRecord)}catch{}const registryRecord={...instanceRecord};delete registryRecord.launchToken;registerInstanceAndWarn(registryRecord,msg=>log2("warn",`[instances] ${msg}`));const nOverrides=Object.keys(opts.routes).length;log2("info",`acp-proxy listening on http://${displayHost}:${actualPort} \u2014 web UI: http://${displayHost}:${actualPort}/__bili/ \u2014 zero-config: prefix any baseURL with http://${displayHost}:${actualPort}/bili/`+(nOverrides?` \u2014 context overrides for ${nOverrides} upstream URL(s)`:"")+(opts.mitm.enabled?` \u2014 MITM proxy on (whitelist)${opts.mitm.domains.length?` +${opts.mitm.domains.join(",")}`:""}`:"")+(opts.passthrough?" \u2014 PASSTHROUGH (compression OFF)":""));if(opts.passthrough){log2("warn",`[passthrough] compression is OFF \u2014 every request is forwarded verbatim, no tokens are saved (source: ${opts.passthroughSource==="env"?"ACP_PASSTHROUGH env var or --passthrough flag":`config file ${configFile()}`}). `+(opts.passthroughSource==="env"?"Unset ACP_PASSTHROUGH (or drop --passthrough) and restart to re-enable compression.":'Clear it in the web UI (\u6982\u89C8 page) or remove "passthrough": true from the config file to re-enable compression.'))}const envKnobs=[];if(process.env.ACP_PASSTHROUGH!==void 0)envKnobs.push(`ACP_PASSTHROUGH=${process.env.ACP_PASSTHROUGH}`);if(process.env.ACP_MODEL_CONTEXT_LIMIT!==void 0)envKnobs.push(`ACP_MODEL_CONTEXT_LIMIT=${process.env.ACP_MODEL_CONTEXT_LIMIT}`);if(process.env.ACP_COMPRESS_TOOL!==void 0)envKnobs.push(`ACP_COMPRESS_TOOL=${process.env.ACP_COMPRESS_TOOL}`);if(process.env.ACP_COMPRESS_NUDGE!==void 0)envKnobs.push(`ACP_COMPRESS_NUDGE=${process.env.ACP_COMPRESS_NUDGE}`);if(process.env.BILI_PERSIST!==void 0)envKnobs.push(`BILI_PERSIST=${process.env.BILI_PERSIST}`);if(envKnobs.length>0){log2("info",`[config] env overrides active (win over the config file): ${envKnobs.join(", ")}`)}if(nonLoopbackBind){log2("warn",`[security] bound to ${opts.host} \u2014 proxy endpoints (/bili/, CONNECT for whitelisted model hosts) are reachable from the network with NO authentication; /__bili/ management endpoints stay loopback-only. Restrict access with a firewall on untrusted networks. Remote agents: point baseURL at http://<this-host>:${actualPort}/bili/`)}if(opts.debug){log2("info",`[debug] build features: raw-HTTP-capture(${bodyDumpEnabled()?"on":"off"}) | remote_compaction_v2-strip(on) | cert-MITM-launcher(on) | strip-acp-summary(on) \u2014 seeing this line confirms the launcher build (not registry 0.1.34)`)}};const attemptListen=port=>{lastTriedPort=port;server.listen(port,opts.host,announceListening)};attemptListen(opts.port);server.on("error",err2=>{if(err2.code==="EADDRINUSE"&&launchToken&&!strictPort&&listenAttempts<MAX_LISTEN_ATTEMPTS){listenAttempts+=1;const next=listenAttempts===MAX_LISTEN_ATTEMPTS?0:lastTriedPort+1;log2("warn",`port ${lastTriedPort} busy \u2014 ${next===0?"retrying on an ephemeral port":`retrying on port ${next}`}`);attemptListen(next);return}const hint=err2.code==="EADDRINUSE"?strictPort?` \u2014 port ${lastTriedPort} is pinned (strict-port mode) but already in use. Free it or point the client at another port (e.g. BILI_CLAUDE_NATIVE_PORT for the claude native posture).`:` \u2014 port ${lastTriedPort} is already in use. Stop the other process or use --port <N>.`:err2.code==="EACCES"?` \u2014 port ${lastTriedPort} requires privileges. Use a port >= 1024.`:"";log2("error",`listen failed: ${err2.code??""} ${err2.message}${hint}`);shuttingDown=true;server.close();flushConversations();void flushAllSessions().finally(()=>{closeLogger();process.exit(1)})});let suppressedWriteErrors=0;process.on("uncaughtException",err2=>{if(isStreamWriteError(err2)){if(suppressedWriteErrors===0){log2("error",`uncaughtException (stream-write; suppressing repeats): ${String(err2?.stack??err2)}`)}else{suppressedWriteErrors+=1}return}log2("error",`uncaughtException: ${String(err2?.stack??err2)}`)});process.on("unhandledRejection",reason=>{log2("error",`unhandledRejection: ${String(reason)}`)});let shuttingDown=false;const finishShutdown=()=>{flushPrefixAffinity();clearProxyInstanceFile(instanceId);unregisterInstance(instanceId);closeLogger();process.exit(0)};const shutdown=sig=>{if(shuttingDown)return;shuttingDown=true;log2("info",`${sig} received \u2014 flushing sessions\u2026`);server.close(()=>{flushConversations();void flushAllSessions().finally(finishShutdown)});setTimeout(()=>{log2("warn",`shutdown grace window elapsed; forcing exit (liveConns=${connRecords.size})`);flushConversations();void flushAllSessions().finally(finishShutdown)},1e4).unref?.()};process.on("SIGTERM",()=>shutdown("SIGTERM"));process.on("SIGINT",()=>shutdown("SIGINT"));if(process.platform==="win32"){process.on("SIGBREAK",()=>shutdown("SIGBREAK"))}if(initialWatcherPid!==null){let idleSince=null;let lastDead=[];const watcher=setInterval(()=>{const dead=[];for(const pid of proxyWatchers){if(!isPidAlive(pid)){proxyWatchers.delete(pid);dead.push(pid)}}if(dead.length>0)lastDead=dead;if(proxyWatchers.size>0){idleSince=null;return}if(idleSince===null){idleSince=Date.now();return}if(Date.now()-idleSince>=WATCHER_IDLE_GRACE_MS){const reason=lastDead.length===1&&lastDead[0]===initialWatcherPid?`parent-gone (pid ${lastDead[0]})`:`watchers-gone (pids: ${lastDead.join(", ")})`;shutdown(reason)}},2e3);watcher.unref?.()}return server}function imageBillingFor(opts,upstreamUrl){const env=process.env.BILI_IMAGE_BILLING;const configured=env==="pixels"||env==="bytes"?env:findRoute(opts.routes,upstreamUrl)?.imageBilling??opts.imageBilling??"auto";return resolveImageBilling(configured,upstreamUrl)}function normalizeAdminHostname(value){if(!value)return void 0;const v2=value.trim().toLowerCase();if(!v2)return void 0;if(v2.startsWith("[")){const end=v2.indexOf("]");if(end===-1)return void 0;return v2.slice(1,end)}if((v2.match(/:/g)??[]).length>1)return v2;const idx=v2.lastIndexOf(":");if(idx!==-1)return v2.slice(0,idx);return v2}function isTrustedAdminOrigin(origin,host,trustedHostnames){const hn2=normalizeAdminHostname(host);if(!hn2||!trustedHostnames.has(hn2))return false;if(!origin)return true;try{const parsed=new URL(origin);if(parsed.protocol!=="http:"&&parsed.protocol!=="https:")return false;const ohn=normalizeAdminHostname(parsed.hostname);return ohn!==void 0&&trustedHostnames.has(ohn)}catch{return false}}function adminTrustedHostnames(bindHost){const names=["localhost","127.0.0.1","::1"];const bound=normalizeAdminHostname(bindHost);if(bound&&bound!=="0.0.0.0"&&bound!=="::"&&!names.includes(bound)){names.push(bound)}return new Set(names)}var headroomFallbackLogged=new Set;var WATCHER_IDLE_GRACE_MS=5e3;async function handle(req,res,opts,core,config,log2,instanceId,instanceStartedAt,proxyWatchers,initialWatcherPid){const selfProbePath=selfAdminProbePath(req.url??"",req.socket.localPort);if(selfProbePath!==void 0)req.url=selfProbePath;const isAdminPath=req.url==="/__bili/"||req.url?.startsWith("/__bili/")||req.url==="/__acp/"||req.url?.startsWith("/__acp/");if(isAdminPath&&headerValue2(req,BILI_TUNNEL_HEADER)!==void 0){res.writeHead(403,{"content-type":"application/json"});res.end(JSON.stringify({error:"management endpoints are not reachable through the bili tunnel"}));return}if(isAdminPath&&!isLoopbackAddress(req.socket.remoteAddress)){res.writeHead(403,{"content-type":"application/json"});res.end(JSON.stringify({error:"management endpoints are loopback-only; access denied for "+(req.socket.remoteAddress??"unknown")}));return}if(isAdminPath&&!isTrustedAdminOrigin(req.headers.origin,req.headers.host,adminTrustedHostnames(opts.host))){res.writeHead(403,{"content-type":"application/json"});res.end(JSON.stringify({error:"management request origin does not match the local bili UI"}));return}if(req.method==="GET"&&req.url==="/__bili/stats")return sendStats(res);if(req.method==="GET"&&req.url?.startsWith("/__bili/cache-report"))return sendCacheReport(res,req.url);if(req.method==="GET"&&req.url==="/__bili/status")return sendStatus(res,opts);if(req.method==="GET"&&req.url==="/__bili/overview")return sendOverview(res,opts);if(req.method==="GET"&&req.url==="/__bili/sessions")return sendWebSessions(res);if(req.method==="GET"&&req.url?.startsWith("/__bili/logs"))return sendWebLogs(res,req);if(req.method==="GET"&&req.url?.startsWith("/__bili/sessions/")&&req.url.endsWith("/detail"))return sendWebSessionDetail(res,req.url);if(req.method==="GET"&&req.url==="/"){const accept=req.headers.accept??"";if(accept.includes("text/html")){res.writeHead(302,{location:"/__bili/"});res.end();return}res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({ok:true,upstream:opts.upstream}));return}if(req.method==="GET"&&req.url==="/__bili/health"){res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({ok:true,upstream:opts.upstream,instanceId,pid:process.pid,startedAt:instanceStartedAt,blindTunnels:getBlindTunnelStats(),watchdog:{armed:initialWatcherPid!==null,parentPid:initialWatcherPid??void 0,watchers:[...proxyWatchers]}}));return}if(req.method==="GET"&&req.url==="/__bili/"){const origin=`http://${opts.host==="0.0.0.0"?"localhost":opts.host}:${opts.port}`;res.writeHead(200,{"content-type":"text/html; charset=utf-8"});res.end(renderUI(origin));return}if(req.method==="GET"&&req.url==="/__bili/config")return handleConfigGet(res);if(req.method==="PUT"&&req.url==="/__bili/config"){return handleConfigPut(req,res,()=>{const fresh=loadOptions();if(fresh.passthrough!==opts.passthrough){log2(fresh.passthrough?"warn":"info",`[passthrough] ${fresh.passthrough?"compression turned OFF via web config \u2014 forwarding verbatim":"compression re-enabled via web config"}`)}opts.passthrough=fresh.passthrough;opts.passthroughSource=fresh.passthroughSource;opts.proxy=fresh.proxy;opts.proxyMode=fresh.proxyMode;opts.proxySource=fresh.proxySource;opts.proxyFallback=fresh.proxyFallback;opts.auxProxyFallback=fresh.auxProxyFallback;opts.compress=fresh.compress;opts.compat=fresh.compat;resetProxyCache();for(const k2 of Object.keys(opts.routes))delete opts.routes[k2];Object.assign(opts.routes,loadRoutes())},opts.port)}if(req.method==="POST"&&req.url==="/__bili/config/reload")return handleConfigReload(opts,res,log2);if(req.method==="GET"&&req.url==="/__bili/upstream"){const target=opts.upstream;const decision=resolveProxyDecision(opts.routes,opts.proxy,target,opts.proxyFallback);const connection=getUpstreamConnectionStatus();const connectionMatchesTarget=(()=>{if(!connection.url)return false;try{return new URL(connection.url).origin===new URL(target).origin}catch{return false}})();res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({target,proxy:decision.proxy??null,source:decision.source,mode:opts.proxyMode??"auto",autoConfigUrl:decision.autoConfigUrl??null,connected:connectionMatchesTarget?connection.connected:void 0,error:connectionMatchesTarget?connection.error:void 0,checkedAt:connectionMatchesTarget?connection.checkedAt:void 0,connectionUrl:connection.url,connectionProxy:connection.proxy}));return}if(req.method==="POST"&&req.url==="/__bili/upstream/test"){const target=opts.upstream;const targetUrl2=new URL(target).origin;const proxyUrl=resolveProxyDecision(opts.routes,opts.proxy,target,opts.proxyFallback).proxy;try{const result=await fetchWithTimeout(targetUrl2,{method:"HEAD",redirect:"follow",...proxyUrl?{dispatcher:proxyDispatcher(proxyUrl,15e3)}:{}},15e3);result.clearTimer();recordUpstreamConnection(targetUrl2,proxyUrl);res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({ok:true,status:result.response.status,target:targetUrl2,proxy:proxyUrl??null}))}catch(error){recordUpstreamConnection(targetUrl2,proxyUrl,error);res.writeHead(502,{"content-type":"application/json"});res.end(JSON.stringify({error:formatUpstreamError(error,targetUrl2,proxyUrl)}))}return}if(req.method==="GET"&&req.url==="/__bili/plugin/manifest"){return handlePluginManifest(res,applyCompressSettings(config,opts.modelContextLimit,opts.compress))}if(req.method==="GET"&&req.url?.startsWith("/__bili/plugin/status")){const query=req.url.slice(req.url.indexOf("?")+1);const params=new URLSearchParams(query);const conversationId2=params.get("conversationId")?.trim()??"";if(!conversationId2){res.writeHead(400,{"content-type":"application/json"});res.end(JSON.stringify({ok:false,error:"conversationId query parameter is required"}));return}const webOrigin=`http://${opts.host==="0.0.0.0"?"localhost":opts.host}:${req.socket?.localPort??opts.port}`;return handlePluginStatus(conversationId2,res,{core,config,log:log2,webOrigin},params.get("fallback")==="latest")}if(req.method==="POST"&&req.url==="/__bili/watcher"){try{const body=await readBody(req);const parsed2=JSON.parse(body.toString("utf8"));const pid=parsed2.pid;if(typeof pid!=="number"||!Number.isInteger(pid)||pid<=1||pid===process.pid){res.writeHead(400,{"content-type":"application/json"});res.end(JSON.stringify({ok:false,error:"expected { pid: <integer> }"}))}else if(initialWatcherPid===null){res.writeHead(409,{"content-type":"application/json"});res.end(JSON.stringify({ok:false,error:"watchdog not armed (no parent pid) \u2014 this proxy does not take watchers"}))}else{proxyWatchers.add(pid);res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({ok:true,watchers:proxyWatchers.size}))}return}catch(err2){res.writeHead(err2 instanceof BodyTooLargeError?413:400,{"content-type":"application/json"});res.end(JSON.stringify({ok:false,error:String(err2)}));return}}if(req.method==="POST"&&req.url==="/__bili/plugin/tool"){try{const body=await readBody(req);const webOrigin=`http://${opts.host==="0.0.0.0"?"localhost":opts.host}:${req.socket?.localPort??opts.port}`;return await handlePluginTool(body.toString("utf8"),res,{core,config,log:log2,webOrigin})}catch(err2){res.writeHead(err2 instanceof BodyTooLargeError?413:400,{"content-type":"application/json"});res.end(JSON.stringify({ok:false,error:String(err2)}));return}}if(req.method==="POST"&&req.url==="/__bili/plugin/register"){try{const body=await readBody(req);handlePluginRegister(body.toString("utf8"),res);return}catch(err2){res.writeHead(err2 instanceof BodyTooLargeError?413:400,{"content-type":"application/json"});res.end(JSON.stringify({ok:false,error:String(err2)}));return}}if(req.method==="POST"&&req.url==="/__bili/plugin/runtime-info"){try{const body=await readBody(req);handlePluginRuntimeInfo(body.toString("utf8"),res);return}catch(err2){res.writeHead(err2 instanceof BodyTooLargeError?413:400,{"content-type":"application/json"});res.end(JSON.stringify({ok:false,error:String(err2)}));return}}if(req.method==="POST"&&req.url==="/__bili/plugin/compact"){try{const body=await readBody(req);handlePluginCompact(body.toString("utf8"),res);return}catch(err2){res.writeHead(err2 instanceof BodyTooLargeError?413:400,{"content-type":"application/json"});res.end(JSON.stringify({ok:false,error:String(err2)}));return}}if(isAdminPath){res.writeHead(404,{"content-type":"application/json"});res.end(JSON.stringify({error:{type:"not_found",message:"no such management endpoint"}}));return}let bodyBuffer;let urlPath;let responsesCompact;let route;let upstreamOrigin;let protocol;let googleModel;const reqT0=performance2.now();let inboundBytes=0;const passthroughMark=headerValue2(req,BILI_PASSTHROUGH_HEADER)==="1";try{bodyBuffer=await readBody(req);inboundBytes=bodyBuffer.length;const url=req.url??"";urlPath=url.split("?",2)[0];responsesCompact=urlPath.endsWith("/responses/compact");route=resolveUpstream(opts,req.url??"",req);if(route?.tunnel){const verdict=await checkTunnelDestination(route.upstream,{selfPort:req.socket.localPort??void 0,clientLoopback:isLoopbackAddress(req.socket.remoteAddress),allowlist:tunnelAllowlistFromEnv()});if(!verdict.ok){log2("warn",`[tunnel] denied ${maskUrlsInText(route.upstream)}: ${verdict.message}`);res.writeHead(403,{"content-type":"application/json"});res.end(JSON.stringify({error:verdict.message,code:"tunnel_destination_denied",detail:verdict.code}));return}}upstreamOrigin=route?route.upstream:/^https?:\/\//i.test(url)?new URL(url).origin:opts.upstream;protocol=route?.explicitProtocol??(req.method==="POST"&&bodyBuffer.length>0?urlPath.endsWith("/chat/completions")||urlPath.endsWith("/llm_raw_chat")?"openai":urlPath.endsWith("/v1/messages")||urlPath.endsWith("/messages")?"anthropic":urlPath.endsWith("/responses")||responsesCompact?"responses":googlePathKind(urlPath)!==null?"google":null:null);googleModel=protocol==="google"?googleModelFromPath(urlPath):void 0;if(!passthroughMark&&protocol!==null&&bodyBuffer.length>0){try{const decoded=await decodeRequestBody(headerValue2(req,"content-encoding"),bodyBuffer,MAX_REQUEST_BYTES);bodyBuffer=decoded.body;if(decoded.decoded)delete req.headers["content-encoding"]}catch(decErr){if(decErr instanceof DecompressedTooLargeError)throw decErr;protocol=null;log2("warn",`decode body failed (${String(decErr)}) - forwarding raw body verbatim to ${upstreamOrigin}`)}}}catch(err2){if(err2 instanceof BodyTooLargeError||err2 instanceof DecompressedTooLargeError){log2("warn",`413: request body exceeds ${err2.limit} bytes`);res.writeHead(413,{"content-type":"application/json"});res.end(JSON.stringify({error:{type:"request_too_large",message:err2.message}}));return}log2("warn",`failed to prepare inbound request (${String(err2)}) - 400`);res.writeHead(400,{"content-type":"application/json"});res.end(JSON.stringify({error:{type:"invalid_request",message:String(err2)}}));return}if(passthroughMark){log2("debug",`passthrough: ${req.method??"?"} ${maskUrlForLog(req.url??"")} \u2014 unattributed in-process caller (#1117), relaying verbatim`);await forward(req,res,opts,scrubAnthropicPck(protocol,bodyBuffer,log2),null,core,config,log2,route,instanceId,void 0);return}const hopMarker=headerValue2(req,BILI_HOP_HEADER);if(hopMarker!==void 0){const selfLoop=hopMarker===instanceId;log2("warn",selfLoop?`[chain] inbound request carries THIS instance's ${BILI_HOP_HEADER} marker (${hopMarker}) \u2014 self-loop detected. Passing through without processing; check your upstream config (it may point back to this instance).`:`[chain] inbound request carries ${BILI_HOP_HEADER} from another bili instance (${hopMarker}) \u2014 bili\u2192bili chain detected. Passing through without processing to avoid double compression; keep only one bili instance in the chain.`)}const artifactSeed=hopMarker===void 0&&bodyBuffer.length>0&&opts.chainContentDetection!==false&&getStore().enabled&&artifactSeedHit(bodyBuffer);if(headerValue2(req,BILI_PLUGIN_BYPASS_HEADER)==="1"){log2("debug",`bypass: ${req.method??"?"} ${maskUrlForLog(req.url??"")} \u2014 raw passthrough (legacy in-process compression)`);await forward(req,res,opts,scrubAnthropicPck(protocol,bodyBuffer,log2),null,core,config,log2,route,instanceId,void 0);return}const countTokens=isCountTokensRequest(req.method??"GET",urlPath,bodyBuffer.length>0);let parsed=null;if(protocol&&bodyBuffer.length>0){try{parsed=JSON.parse(bodyBuffer.toString("utf8"))}catch{parsed=null}}const inboundMsgs=(()=>{if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return null;const p2=parsed;if(Array.isArray(p2.messages))return p2.messages.length;if(Array.isArray(p2.input))return p2.input.length;return null})();let chainSkip=false;if(protocol&&hopMarker===void 0&&opts.chainContentDetection!==false&&parsed!==null&&typeof parsed==="object"){try{const chainCtx=evaluateChain(parsed,protocol);if(chainCtx.verdict!=="none"){const sel=chainCtx.selected;const selTxt=sel?` (v=${sel.v} processor=${sel.processor} issued-at=${sel.issuedAt} request-id=${sel.requestId})`:"";const malTxt=chainCtx.malformed>0?` malformed=${chainCtx.malformed}`:"";const head=`[chain] inbound ${protocol} request carries ${chainCtx.candidates.length} chain checkpoint(s) \u2014 verdict=${chainCtx.verdict}${selTxt}${malTxt}`;switch(chainCtx.verdict){case"valid":chainSkip=true;log2("info",`${head}; first-processor-wins: forwarding verbatim, pipeline skipped (#1421)`);break;case"recent-mismatch":chainSkip=true;log2("warn",`${head}; interop: forwarding verbatim + warn (well-formed fresh checkpoint, no digest match \u2014 body may have drifted since stamp) (#1421)`);break;case"stale":if(chainCtx.selectedMatched){chainSkip=true;log2("warn",`${head}; digest match but out-of-window/future timestamp \u2014 forwarding verbatim + warn (replay or clock skew) (#1421)`)}else{parsed=extractChainCarriers(parsed,protocol).stripped;log2("info",`${head}; no digest match \u2014 stripping stale checkpoint(s), processing normally (#1421)`)}break;case"invalid":log2("warn",`${head}; never trusted \u2014 processing normally (#1421)`);break}}}catch(err2){log2("debug",`[chain] evaluation failed (${String(err2)}); ignoring`)}}if((protocol==="anthropic"||protocol==="openai")&&parsed!==null){const p2=typeof parsed==="object"&&!Array.isArray(parsed)?parsed:void 0;if(!p2||!Array.isArray(p2.messages)){const relayKey=`${upstreamOrigin}${urlPath}`;if(!nonConversationRelayWarned.has(relayKey)){nonConversationRelayWarned.add(relayKey);if(nonConversationRelayWarned.size>NON_CONVERSATION_RELAY_WARN_CAP){nonConversationRelayWarned.delete(nonConversationRelayWarned.values().next().value)}log2("warn",`[${protocol}] body has no "messages" array \u2014 not a model conversation; relaying verbatim to ${maskUrlsInText(upstreamOrigin)} instead of rejecting (#1284) \u2014 ${req.method??"?"} ${maskUrlForLog(req.url??"")}`)}await forward(req,res,opts,scrubAnthropicPck(protocol,bodyBuffer,log2),null,core,config,log2,route,instanceId,void 0);return}}const bodyModel=parsed&&typeof parsed==="object"&&"model"in parsed&&typeof parsed.model==="string"?parsed.model:void 0;const requestModel=bodyModel??googleModel;if(opts.debug&&parsed&&typeof parsed==="object"){const p2=parsed;const hasPrev=p2.previous_response_id!==void 0;const inLen=Array.isArray(p2.input)?p2.input.length:0;log2("info",`[debug] INCOMING previous_response_id=${hasPrev?String(p2.previous_response_id).slice(0,16):"absent"} input_items=${inLen} instructions=${p2.instructions!==void 0?"present":"absent"}`)}let reqConfig=config;let resolvedNativeWindow;let windowShrinkReason;let nativeFromFallback=false;let reqPrompts=defaultPrompts;let reqSurface={};let reqSurfacePack="default";let wsSourceForLog;let resolvedCcrCfg;let resolvedImageCompressionCfg;let resolvedSearchPlanAware=false;let reqModelId;if(parsed&&typeof parsed==="object"){const model=requestModel;reqModelId=typeof model==="string"?model:void 0;if(model){const embeddedUrl=route?.rewrittenUrl;const host=(()=>{try{return embeddedUrl?new URL(embeddedUrl).host:void 0}catch{return void 0}})();const betaWindow=anthropicBetaContextWindow(req.headers);const suffixWindow=expandedContextSuffixWindow(model);const hasTierEvidence=betaWindow!==void 0||suffixWindow!==void 0;const pluginWindow=pluginHeadersMatchModel(req.headers,model)?pluginReportedContextWindow(req.headers):void 0;const runtimeAgent=pluginAgentHeader(req.headers);const runtimeEntry=runtimeAgent!==void 0?pluginRuntimeInfoFor(runtimeAgent,model):pluginRuntimeInfoForConversation(runtimeConversationId(req.headers,parsed,opts.sessionHeader),model);const runtimeWindow=pluginWindow===void 0?runtimeEntry?.contextWindow:void 0;const launcherWindow=launcherContextWindow(model);const configuredWindow=resolveConfiguredContextLimit(opts.routes,embeddedUrl,model);const operatorWindowTuned=resolveCompress(opts.routes,embeddedUrl,model,opts.compress).modelContextLimit!==void 0;const peekWindow=capRegistryWindowByStandard(model,peekRegistryContext(model,host),hasTierEvidence);let native=betaWindow??suffixWindow??pluginWindow??runtimeWindow??launcherWindow??configuredWindow??peekWindow??lookupContextLimit(model);nativeFromFallback=!betaWindow&&!suffixWindow&&!pluginWindow&&!runtimeWindow&&!launcherWindow&&!peekWindow&&!configuredWindow&&!operatorWindowTuned;if(!native){native=capRegistryWindowByStandard(model,await contextFromRegistry(model,host),hasTierEvidence);if(native)nativeFromFallback=false}reqConfig=resolveRequestConfig(config,opts.routes,embeddedUrl,model,native,opts.compress);{const wsSource=betaWindow?"anthropic-beta":suffixWindow?"model-suffix":pluginWindow?"plugin":runtimeWindow?"runtime-info":launcherWindow?"launcher":configuredWindow?"configured":peekWindow?"registry-peek":native?"table-or-registry":"default";wsSourceForLog=wsSource;if(!windowSourceLogged.has(model)){windowSourceLogged.add(model);log2("info",`[window] model=${model} source=${wsSource} native=${native??"none"} effective=${reqConfig.modelContextLimit} launcher=${launcherWindow??"none"} configured=${configuredWindow??"none"} peek=${peekWindow??"none"} fallback=${nativeFromFallback}`)}}resolvedNativeWindow=native;const aligned=operatorWindowTuned?{limit:reqConfig.modelContextLimit,clamped:false}:codexAlignedWindow(reqConfig.modelContextLimit,model,req.headers);if(aligned.clamped){const before=reqConfig.modelContextLimit;reqConfig={...reqConfig,modelContextLimit:aligned.limit};nativeFromFallback=false;windowShrinkReason="codex";log2("info",`[codex] effective window clamped ${before} \u2192 ${aligned.limit} (codex's own perception for model=${model}; ACP now compresses before codex's native auto-compact)`)}else if(operatorWindowTuned&&native!==void 0&&reqConfig.modelContextLimit<native){windowShrinkReason="operator"}const compressCfg=resolveCompress(opts.routes,embeddedUrl,model,opts.compress);resolvedCcrCfg=compressCfg.ccr;resolvedImageCompressionCfg=compressCfg.imageCompression;resolvedSearchPlanAware=compressCfg.search?.planAware===true;reqPrompts=resolveCompressPrompts(compressCfg);const surfaceRes=resolveCompressSurfaceDetailed(compressCfg);reqSurface=surfaceRes.surface;reqSurfacePack=surfaceRes.packName}}let prepared=null;let forwarded=false;const routePassthrough=!opts.passthrough&&findRoute(opts.routes,route?.rewrittenUrl)?.passthrough===true;if(routePassthrough&&hopMarker===void 0&&protocol&&parsed){log2("info",`[route-passthrough] ${maskUrlsInText(route?.rewrittenUrl??"")} matches a passthrough route \u2014 forwarding verbatim, kernel bypassed`)}if(!opts.passthrough&&!routePassthrough&&!chainSkip&&hopMarker===void 0&&protocol&&parsed&&typeof parsed==="object"){const sessionHeader=headerValue2(req,opts.sessionHeader);let pluginAgent=pluginAgentHeader(req.headers);let pluginConversation=pluginConversationHeader(req.headers);const clientConv=clientConversationHeader(req.headers);const convHeader=clientConv??sessionHeader;const codexTurn=protocol==="responses"?codexTurnIdentity(req.headers):void 0;const systemTextsForSplit=typeof parsed.system==="string"?[parsed.system]:Array.isArray(parsed.system)?parsed.system.map(b2=>typeof b2?.text==="string"?b2.text:"").filter(t=>t.length>0):[];const claudeSub=protocol==="anthropic"?claudeSubagentAgentId(req.headers,systemTextsForSplit):void 0;const responsesIdentity=protocol==="responses"?codexTurn?{value:codexTurn.value,source:"header",clientProvided:true}:preferPromptCacheKeyIdentity(conversationIdentityResponses(parsed,convHeader),parsed):void 0;const openaiSignal=protocol==="openai"?conversationSignalOpenai(parsed,convHeader):"";const openaiIdentity=protocol==="openai"?preferPromptCacheKeyIdentity(convHeader?{value:openaiSignal,source:"header",clientProvided:true}:{value:openaiSignal,source:"content-fingerprint",clientProvided:false},parsed):void 0;const anthropicSignal=protocol==="anthropic"?conversationSignalAnthropic(parsed,convHeader):"";const anthropicIdentity=protocol==="anthropic"?preferPromptCacheKeyIdentity(convHeader?{value:anthropicSignal,source:"header",clientProvided:true}:{value:anthropicSignal,source:"content-fingerprint",clientProvided:false},parsed):void 0;const googleSignal=protocol==="google"?conversationSignalGoogle(parsed,convHeader):"";const googleIdentity=protocol==="google"?{value:googleSignal,source:convHeader?"header":"content-fingerprint",clientProvided:!!convHeader}:void 0;const conversation=protocol==="google"?googleIdentity?.value??googleSignal:protocol==="anthropic"?claudeSub!==void 0&&opts.subagentSplit!==false?claudeSubagentSplit(anthropicIdentity?.value??anthropicSignal,req.headers,systemTextsForSplit):anthropicIdentity?.value??anthropicSignal:protocol==="openai"?openaiIdentity?.value??openaiSignal:codexTurn?codexTurn.value:opts.stableSystemAnchor&&pluginAgentHeader(req.headers)===void 0?responsesIdentity?.value??conversationSignalResponses(parsed,convHeader):instructionsFingerprintApplies(req.headers)?subagentNamespace(responsesIdentity?.value??conversationSignalResponses(parsed,convHeader),parsed.instructions):responsesIdentity?.value??conversationSignalResponses(parsed,convHeader);const clientProvided=protocol==="responses"?responsesIdentity?.clientProvided??false:protocol==="openai"?openaiIdentity?.clientProvided??false:protocol==="anthropic"?anthropicIdentity?.clientProvided??false:protocol==="google"?googleIdentity?.clientProvided??false:!!convHeader;let affinityMessagesCache=null;const affinityMessageList=()=>{if(affinityMessagesCache!==null)return affinityMessagesCache;const raw=protocol==="responses"?parsed.input??[]:protocol==="google"?parsed.contents??[]:parsed.messages??[];affinityMessagesCache=Array.isArray(raw)?raw:[];return affinityMessagesCache};let anonAffinity=null;if(!clientProvided){anonAffinity=prefixAffinity.resolve(affinityMessageList());if(!anonAffinity){log2("warn",`400: no stable conversation identity on ${protocol} request \u2192 ${upstreamOrigin}; refusing to create a content-fingerprint session (#286)`);res.writeHead(400,{"content-type":"application/json"});res.end(JSON.stringify(protocol==="anthropic"?{type:"error",error:{type:"invalid_request_error",message:NO_IDENTITY_MESSAGE}}:{error:{type:"invalid_request_error",message:NO_IDENTITY_MESSAGE}}));return}if(anonAffinity.matchedDepth>0){log2("info",`[prefix-affinity] anonymous ${protocol} request \u2192 session ${anonAffinity.sessionId} (prefix match depth=${anonAffinity.matchedDepth}/${anonAffinity.incomingDepth}, tail=${anonAffinity.tailHash.slice(0,8)}; fork semantics: diverged histories split on their next request)`);log("info",`[prefix-affinity] session ${anonAffinity.sessionId} matched at depth ${anonAffinity.matchedDepth}/${anonAffinity.incomingDepth} (tail=${anonAffinity.tailHash.slice(0,8)})`)}else{const lineage=anonAffinity.lineage?`; lineage=${anonAffinity.lineage.reason} of ${anonAffinity.lineage.parents.join(",")}`:"";log2("info",`[prefix-affinity] new anonymous session ${anonAffinity.sessionId} (depth=${anonAffinity.incomingDepth}, tail=${anonAffinity.tailHash.slice(0,8)}${lineage})`);log("info",`[prefix-affinity] new session ${anonAffinity.sessionId} at depth ${anonAffinity.incomingDepth} (tail=${anonAffinity.tailHash.slice(0,8)}${lineage})`)}}const sessionId=anonAffinity?anonAffinity.sessionId:conversation;if(artifactSeed){const artifactKind=detectAcpArtifacts(bodyBuffer,parsed);const pluginAnnounced=pluginAgentHeader(req.headers)!==void 0;if(artifactKind!==null&&!pluginAnnounced&&!hasProcessedState(sessionId,{protocol})){const firstVerdict=recordChainVerdict(sessionId,artifactKind,protocol);if(clientConv!==void 0&&clientConv!==sessionId)recordChainVerdict(clientConv,artifactKind,protocol);if(firstVerdict){log2("warn",`[chain] inbound ${protocol} request carries ACP compression artifacts (${artifactKind}) but neither ${BILI_HOP_HEADER} nor local compression state for session ${sessionId}. Historical ACP content is advisory-only \u2014 continuing to processTurn so this session establishes ownership (#1357); a header-stripping bili\u2192bili relay may now double-process until both sides ship the request checkpoint (#1421).`)}}else if(artifactKind!==null){log2("debug",`[chain] ACP artifacts (${artifactKind}) belong to this instance's own session ${sessionId} \u2014 self-produced, processing normally (#1086)`)}}const bodyIdentity=responsesIdentity??openaiIdentity??anthropicIdentity??googleIdentity;const affinity=affinityToken(bodyIdentity??{value:clientConv??conversation,source:clientConv?"header":"generated",clientProvided:!!clientConv});const clientLabel=bodyIdentity?.clientProvided?bodyIdentity.value:clientConversationHeader(req.headers);const session=getSession(sessionId,{protocol,upstreamOrigin,label:clientLabel??(anonAffinity?"prefix-affinity":void 0)});session.meta.activePack=reqSurfacePack;if(parsed!==null&&typeof parsed==="object"){session.metadata.rawInputTokens=estimateRawBodyTokens(parsed)+imageTokensInParsedBody(protocol,parsed)}if(anonAffinity){prefixAffinity.note(sessionId,anonAffinity.incomingDepth,anonAffinity.tailHash,anonAffinity.itemHashes);scheduleAffinityPersist();session.metadata.anonymousPrefixAffinity={depth:anonAffinity.incomingDepth,tailHash:anonAffinity.tailHash,via:anonAffinity.via,...anonAffinity.lineage?{lineage:anonAffinity.lineage}:{}}}else if(clientProvided){const fp=prefixAffinity.chainFingerprint(affinityMessageList());if(fp){const tracked=prefixAffinity.peekChain(sessionId);if(!tracked||fp.depth>=tracked.depth){prefixAffinity.note(sessionId,fp.depth,fp.tailHash,fp.itemHashes,true);scheduleAffinityPersist()}}}if(anonAffinity?.via==="new"&&anonAffinity.lineage?.reason==="forked"&&session.stats.requests===0){try{maybeAdoptForkBlocks({session,parentId:anonAffinity.lineage.parents[0],protocol,parsed,upstreamOrigin,enabled:opts.forkAdoption===true,log:log2})}catch(err2){log2("warn",`[fork-adoption] failed (${String(err2)}); continuing with fresh state (#629)`)}}let derivedParent;if(!pluginAgent&&!anonAffinity){const identityAgent=consumePluginRegisterFor(clientConv??conversation);if(identityAgent){pluginAgent=identityAgent.agent;pluginConversation=clientConv??conversation;derivedParent=identityAgent.parentConversationId}}if(!pluginAgent&&session.stats.requests===0&&codexTurnIdentity(req.headers)===void 0&&claudeSub===void 0){const pending=takePendingPluginRegister();if(pending){pluginAgent=pending.agent;pluginConversation=pending.conversationId;derivedParent=pending.parentConversationId}}if(!pluginAgent&&typeof session.metadata.pluginAgent==="string")pluginAgent=session.metadata.pluginAgent;if(pluginAgent&&!pluginConversation)pluginConversation=conversation;if(!pluginAgent&&!session.metadata.clientHint){const uaRaw=req.headers["user-agent"];const ua=typeof uaRaw==="string"?uaRaw:Array.isArray(uaRaw)?String(uaRaw[0]??""):"";const hint=sniffScanClient(req.headers)??(ua?ua.slice(0,120):void 0);if(hint)session.metadata.clientHint=hint}if(derivedParent===void 0&&pluginAgent!==void 0&&pluginConversation!==void 0&&!anonAffinity){const stamped=consumePluginRegisterFor(pluginConversation);if(stamped?.parentConversationId!==void 0)derivedParent=stamped.parentConversationId}if(pluginAgent){if(session.metadata.pluginAgent!==pluginAgent)session.metadata.pluginAgent=pluginAgent;recordPluginSession(claudeSub!==void 0?conversation:pluginConversation??conversation,session.id)}if(session.stats.requests===0&&conflictScanEnabled(process.env)){try{const client=pluginAgent??sniffScanClient(req.headers);if(client!==void 0){const res2=scanClientPlugins(client,{env:process.env,cwd:process.cwd()});for(const f2 of res2.findings){if(isDesignAbsorbed(f2,pluginAgent))continue;const risk=f2.match==="known"?"it is bili's sibling compressor \u2014 two compressors on one conversation will double-compress and corrupt message refs":"its name matches compression keywords \u2014 IF it also compresses context, the two compressors will double-compress and corrupt message refs";recordConflict(session,"third-party-plugin",`${f2.client}: ${f2.entry} (${f2.source})${f2.match==="keyword"?" [suspected]":""}`);log2("warn",`[conflict] co-resident compression plugin detected on ${f2.client}: ${f2.entry} (${f2.source}) \u2014 ${risk} (#1206). Remove or disable the other plugin, or route this client exclusively through bili.`)}}}catch(err2){log2("warn",`[conflict] third-party plugin scan failed: ${String(err2)} (#1206)`)}}if(derivedParent!==void 0&&session.metadata.derivedFromSessionId===void 0){try{const parentSession=resolveConversation(derivedParent)?.session;if(parentSession){session.metadata.derivedFrom=derivedParent;session.metadata.derivedFromSessionId=parentSession.id;markDirty(session);log2("info",`[${session.id}] [derived] linked to parent session ${parentSession.id} (conversation ${derivedParent}) \u2014 decompress/search_context fall back to it read-only (#1333)`)}else if(session.metadata.derivedLinkMissLogged!==true){session.metadata.derivedLinkMissLogged=true;log2("warn",`[${session.id}] [derived] parent conversation ${derivedParent} is unknown to this proxy \u2014 no inheritance; continuing fresh (#1333)`)}}catch(err2){if(session.metadata.derivedLinkMissLogged!==true)session.metadata.derivedLinkMissLogged=true;log2("warn",`[${session.id}] [derived] parent link from ${derivedParent} failed (${String(err2)}); continuing fresh (#1333)`)}}if(clientProvided&&!anonAffinity&&session.stats.requests===0&&session.metadata.derivedFromSessionId===void 0&&opts.resumeInheritance!==false){const resume=prefixAffinity.findResumeParent(affinityMessageList(),sessionId);if(resume){const resumeParent=peekSession(resume.sessionId)??getStore().loadSync(resume.sessionId,{protocol,upstreamOrigin})??void 0;if(resumeParent&&resumeParent!==session){session.metadata.derivedFrom=resumeParent.id;session.metadata.derivedFromSessionId=resumeParent.id;markDirty(session);log2("info",`[${sessionId}] [resume-inheritance] ${resume.sharedDepth} msg(s) byte-exact prefix of ${resumeParent.id} \u2014 inheriting refs/blocks/lineage (#1486)`);try{maybeAdoptResume({session,parent:resumeParent,sharedDepth:resume.sharedDepth,protocol,parsed,upstreamOrigin,blocksEnabled:opts.forkAdoption===true,log:log2})}catch(err2){log2("warn",`[resume-inheritance] failed (${String(err2)}); continuing with fresh state (#1486)`)}}else{log2("info",`[${sessionId}] [resume-inheritance] matched tracked chain ${resume.sessionId} but the parent session is not loadable \u2014 starting fresh (#1486)`)}}}if(protocol==="responses"||protocol==="openai"||protocol==="anthropic"){const pck=parsed.prompt_cache_key;if(typeof pck==="string"&&pck.trim().length>0){recordPluginSession(pck.trim(),session.id)}}const pluginMode=pluginAgent!==void 0;const storeChannelOk=protocol!=="responses"||!process.env.ACP_NO_INJECT_TOOL&&!FORCE_TEXT_PROTOCOL&&resolveCompressProtocol(opts.routes,upstreamOrigin)!=="marker";const pluginCcrStamp=pluginMode?ccrPluginWireOk(protocol)&&opts.compress.ccr?.enabled===true?opts.compress.ccr:void 0:resolvedCcrCfg?.enabled===true?resolvedCcrCfg:void 0;storeEffectiveCcr(session,opts.compress.injectTool&&storeChannelOk?pluginCcrStamp:void 0);storeEffectiveImageCompression(session,opts.compress.injectTool&&!pluginMode&&storeChannelOk&&resolvedImageCompressionCfg?.enabled===true?resolvedImageCompressionCfg:void 0);storeEffectiveSearchPlanAware(session,resolvedSearchPlanAware);restoreOutputBudget(parsed,session,log2);const headroomCap=resolveOutputHeadroomCap(resolveCompress(opts.routes,route?.rewrittenUrl,parsed.model,opts.compress).outputHeadroomMaxPct);if(!countTokens&&!responsesCompact&&protocol!==null&&isSideRequest(parsed)){const reqModel=requestModel;const armedForGuard=typeof session.stats.overflowArmTokens==="number"&&session.stats.overflowArmTokens>0?session.stats.overflowArmTokens:0;const guard=sideRequestGuard(parsed,protocol,reqConfig.modelContextLimit,imageBillingFor(opts,route?.rewrittenUrl??upstreamOrigin),headroomCap,armedForGuard);if(guard.blocked){log2("warn",`[${session.id}] side request (~${guard.estimate} tokens) \u2265 effective window ${guard.limit} (model=${reqModel??"?"}) \u2014 NOT forwarded: guaranteed upstream 400 (side requests bypass preflight by design, #388)`);if(!res.headersSent&&!res.writableEnded&&!res.destroyed){res.writeHead(413,{"content-type":"application/json"});res.end(JSON.stringify({error:{type:"server_error",code:"side_request_payload_too_large",message:`side request payload ~${guard.estimate} tokens reaches the effective context window ${guard.limit} (model=${reqModel??"unknown"}); NOT forwarded \u2014 side requests (max_tokens<=${SIDE_REQUEST_MAX_TOKENS}) bypass compression by design (#388). Shrink the conversation or raise the model's context window.`,retryable:false}}))}logRequestCost(log2,session.id,inboundMsgs,inboundBytes,reqT0);return}log2("info",`[${session.id}] side request (max_tokens<=${SIDE_REQUEST_MAX_TOKENS}) \u2192 passthrough + tag strip only, kernel state untouched`);const sideBody=scrubAnthropicPck(protocol,bodyBuffer,log2);const sidePrepared={body:sideBody,session,processedMessages:[],originalMessages:[],protocol,stream:parsed.stream===true,compressInjected:false,sidePassthrough:true};logRequestCost(log2,session.id,inboundMsgs,inboundBytes,reqT0,bodyBuffer);await forward(req,res,opts,sideBody,sidePrepared,core,reqConfig,log2,route,instanceId,affinity);return}const nativeWindow=reqConfig.modelContextLimit;if(shouldReserveOutputHeadroom(protocol)){const p2=parsed;const rawMax=p2.max_tokens??p2.max_completion_tokens??p2.max_output_tokens;let maxOutput=typeof rawMax==="number"?rawMax:0;if(!(maxOutput>0)){const fbModel0=parsed.model;const fbAgent=pluginAgentHeader(req.headers);const runtimeMax=(pluginHeadersMatchModel(req.headers,fbModel0)?pluginReportedMaxOutput(req.headers):void 0)??(fbAgent!==void 0?pluginRuntimeInfoFor(fbAgent,fbModel0)?.maxOutput:pluginRuntimeInfoForConversation(runtimeConversationId(req.headers,parsed,opts.sessionHeader),fbModel0)?.maxOutput);if(typeof runtimeMax==="number"&&runtimeMax>0){maxOutput=runtimeMax;if(!headroomFallbackLogged.has(`${fbModel0??"?"}|runtime-info`)){headroomFallbackLogged.add(`${fbModel0??"?"}|runtime-info`);log2("info",`[headroom] model=${fbModel0??"?"}: request carries no output budget; reserving against runtime-info max output ${runtimeMax} (#955)`)}}}if(!(maxOutput>0)){const fbLauncher=parsed.model;const launcherMax=fbLauncher!==void 0?launcherMaxOutput(fbLauncher):void 0;if(typeof launcherMax==="number"&&launcherMax>0){maxOutput=launcherMax;if(!headroomFallbackLogged.has(`${fbLauncher}|launcher`)){headroomFallbackLogged.add(`${fbLauncher}|launcher`);log2("info",`[headroom] model=${fbLauncher}: request carries no output budget; reserving against launcher max output ${launcherMax} (#971)`)}}}if(!(maxOutput>0)){const fbModel=parsed.model;if(fbModel){let host;try{host=route?.rewrittenUrl?new URL(route.rewrittenUrl).host:void 0}catch{host=void 0}const cfgOut=resolveConfiguredOutputLimit(opts.routes,route?.rewrittenUrl,fbModel);const regOut=peekRegistryOutputLimit(fbModel,host);const budget=cfgOut!==void 0?cfgOut:regOut;if(typeof budget==="number"&&budget>0){maxOutput=budget;const source=cfgOut!==void 0?"configured":"registry";if(!headroomFallbackLogged.has(`${fbModel}|${source}`)){headroomFallbackLogged.add(`${fbModel}|${source}`);log2("info",`[headroom] model=${fbModel}: request carries no output budget; reserving against ${source} max output ${budget} (#924)`)}}}}let reserved=reserveOutputHeadroom(reqConfig.modelContextLimit,maxOutput,headroomCap);if(nativeFromFallback&&reserved<FALLBACK_EFFECTIVE_WINDOW_FLOOR){log2("info",`[${session.id}] fallback context window floored: ${reserved} \u2192 ${FALLBACK_EFFECTIVE_WINDOW_FLOOR} (model=${String(p2.model??"?")} not authoritatively identified; self-heal corrects it if the real window is smaller)`);reserved=FALLBACK_EFFECTIVE_WINDOW_FLOOR}if(reserved!==reqConfig.modelContextLimit)reqConfig={...reqConfig,modelContextLimit:reserved}}session.metadata.effectiveContextLimit=reqConfig.modelContextLimit;if(reqModelId!==void 0)session.metadata.lastModel=reqModelId;session.metadata.lastWindowSource=wsSourceForLog??null;storeEffectiveConfig(session,reqConfig);acquireInFlight(session);try{const runPreparedPipeline=async(respondFailFast,overflowWindow)=>{const runPrepare=async()=>{const cs2=resolveCompress(opts.routes,route?.rewrittenUrl,requestModel,opts.compress);if(cs2.priceProfile!==void 0&&Object.keys(cs2.priceProfile).length>0)session.metadata.cachePriceProfile=cs2.priceProfile;else{const priceHost=(()=>{try{return new URL(route?.rewrittenUrl??upstreamOrigin).host}catch{return void 0}})();const registryProfile=peekRegistryPriceProfile(requestModel,priceHost);if(registryProfile!==void 0)session.metadata.cachePriceProfile=registryProfile;else delete session.metadata.cachePriceProfile}const visibilityMarkers=cs2.visibilityMarkers??true;const reasoningCfg=cs2.reasoning;const keepRecent=cs2.stripImagesKeepRecent??DEFAULT_STRIP_IMAGES_KEEP_RECENT;const stripped=cs2.stripImages?stripHistoricalImages(parsed,protocol,keepRecent):{body:parsed,removed:0};if(opts.debug&&stripped.removed>0){log2("info",`[debug] strip-images: dropped ${stripped.removed} historical image part(s), kept last ${keepRecent} (session=${session.id})`)}const work=stripped.body;if(countTokens){return protocol==="google"?prepareGoogleCountTokens(work,core,reqConfig,log2,session):prepareCountTokens(work,core,reqConfig,log2,session)}if(protocol==="google"){return await prepareGoogle(work,opts,core,reqConfig,reqPrompts,reqSurface,log2,session,pluginMode,nativeWindow,googleModel,googlePathKind(urlPath)==="stream-generate",visibilityMarkers,upstreamOrigin)}return protocol==="anthropic"?await prepareAnthropic(work,req,opts,core,reqConfig,reqPrompts,reqSurface,log2,session,pluginMode,upstreamOrigin,reasoningCfg,visibilityMarkers):protocol==="openai"?await prepareOpenai(work,req,opts,core,reqConfig,reqPrompts,reqSurface,log2,session,pluginMode,upstreamOrigin,nativeWindow,reasoningCfg,visibilityMarkers,route?.rewrittenUrl):responsesCompact?prepareResponsesCompact(stripped.removed>0?Buffer.from(JSON.stringify(work)):bodyBuffer,work,session,req,core,reqConfig,log2):await prepareResponses(work,req,opts,core,reqConfig,reqPrompts,reqSurface,log2,session,responsesIdentity,pluginMode,upstreamOrigin,nativeWindow,reasoningCfg,visibilityMarkers,route?.rewrittenUrl)};const isCodexCompactTrigger=protocol==="responses"&&!responsesCompact&&isCodexClient(req.headers)&&hasCompactionTrigger(parsed.input);if(isCodexCompactTrigger){const mode=codexCompactMode();const gatePre=codexCompactGatePre(session,reqConfig.modelContextLimit);if(mode==="intercept"&&gatePre)prepared=await runPrepare();if(prepared?.codexForge){logRequestCost(log2,session.id,inboundMsgs,inboundBytes,reqT0,prepared.body);return{body:prepared.body,prepared}}const original=JSON.parse(bodyBuffer.toString("utf8"));const{items,replaced,dropped}=replaceBiliCompactionItems(Array.isArray(original.input)?original.input:[]);const normalized=replaced+dropped>0;const forwardBody=normalized?Buffer.from(JSON.stringify({...original,input:items})):bodyBuffer;const why=mode!=="intercept"?"BILI_CODEX_COMPACT=pass":!gatePre?"gate preconditions not met":"transform/forge failed";log2("info",`[${session.id}] codex compaction_trigger request not intercepted (${why}) \u2014 forwarding ${normalized?`with bili summaries normalized (replaced=${replaced}, dropped=${dropped})`:"verbatim"} (no preflight, no rebuild, no window clamp)`);logRequestCost(log2,session.id,inboundMsgs,inboundBytes,reqT0,forwardBody);return{body:forwardBody,prepared:null}}prepared=await runPrepare();if(!countTokens&&!responsesCompact){const outcome=await preflightCompressIfNeeded(prepared,runPrepare,req,bodyBuffer,res,opts,core,overflowWindow!==void 0?{...reqConfig,modelContextLimit:overflowWindow}:reqConfig,nativeWindow,requestModel,resolvedNativeWindow,windowShrinkReason,route,affinity,anonAffinity!==null,log2,instanceId);if(isPreflightFailFast(outcome)){if(respondFailFast&&outcome.respond&&!res.destroyed){if(res.headersSent){if(prepared.stream){emitPreflightError(res,prepared.protocol,{message:outcome.message,retryable:outcome.retryable},m2=>log2("warn",m2))}else{try{res.end(JSON.stringify({error:{type:"server_error",code:"preflight_compress_failed",message:outcome.message,retryable:outcome.retryable}}))}catch{}}}else{res.writeHead(outcome.status,{"content-type":"application/json",...outcome.status===503?{"retry-after":"30"}:{}});res.end(JSON.stringify({error:{type:"server_error",code:"preflight_compress_failed",message:outcome.message,retryable:outcome.retryable}}))}}logRequestCost(log2,session.id,inboundMsgs,inboundBytes,reqT0);return null}prepared=outcome}if(bodyDumpEnabled()&&parsed&&typeof parsed==="object"){try{const rawDir=process.env.ACP_RAW_DUMP_DIR||path23.join(stateDir(),"raw");try{fs12.mkdirSync(rawDir,{recursive:true})}catch{}const hdrs=maskHeadersForLog(Object.fromEntries(Object.entries(req.headers).map(([k2,v2])=>[k2,Array.isArray(v2)?v2.join(","):String(v2)])));const hdrText=Object.entries(hdrs).map(([k2,v2])=>`${k2}: ${v2}`).join("\n");fs12.writeFileSync(path23.join(rawDir,`${Date.now()}-${safeSessionId(session.id)}-INCOMING.txt`),`${req.method} ${maskUrlsInText(req.url??"")}
|
|
2288
2288
|
${hdrText}
|
|
2289
2289
|
|
|
2290
|
-
${bodyBuffer.toString("utf8")}`)}catch(err2){logDumpFailure("INCOMING dump",err2)}}logRequestCost(log2,session.id,inboundMsgs,inboundBytes,reqT0,prepared.body);return{body:prepared.body,prepared}};const pendingForward=await withSessionLock(session,()=>runPreparedPipeline(true));if(pendingForward){forwarded=true;const overflowRefold=pendingForward.prepared?async realWindow=>{const next=await withSessionLock(session,()=>runPreparedPipeline(false,realWindow));if(!next||String(next.body)===String(pendingForward.body))return null;pendingForward.body=next.body;pendingForward.prepared=next.prepared;return next.body}:void 0;await forward(req,res,opts,pendingForward.body,pendingForward.prepared,core,reqConfig,log2,route,instanceId,affinity,overflowRefold);if(pendingForward.prepared){const preparedToRemember=pendingForward.prepared;await withSessionLock(session,()=>rememberPluginMessages(sessionId,preparedToRemember.processedMessages,preparedToRemember.originalMessages,preparedToRemember.nudge))}}}finally{releaseInFlight(session)}}if(!prepared&&!forwarded){if(protocol===null&&!opts.passthrough&&!routePassthrough&&!isModelDiscoveryPath(urlPath)){logUnrecognizedPath(log2,req.url??"")}await forward(req,res,opts,scrubAnthropicPck(protocol,bodyBuffer,log2),null,core,reqConfig,log2,route,instanceId,void 0)}}var ACP_TAG_MARK="<acp ";function withReasoningDrop(msgs,reasoning,log2,sessionId,strictEcho){if(strictEcho)return msgs;const out=dropCompressReasoning(msgs,reasoning);if(out.length!==msgs.length){log2("info",`[${sessionId}] compress-reasoning: dropped ${msgs.length-out.length} reasoning message(s) from closed compress turns (#651)`)}return out}function warnReasoningPairs(wireMessages,log2,sessionId){let withRc=0;let split=0;for(const m2 of wireMessages){const msg=m2;if(msg?.role!=="assistant")continue;const hasRc=typeof msg.reasoning_content==="string";if(hasRc)withRc++;else if(Array.isArray(msg.tool_calls)&&msg.tool_calls.length>0)split++}if(withRc>0&&split>0){log2("warn",`[${sessionId}] reasoning-pair-violated: ${split} assistant tool-call message(s) lack reasoning_content while ${withRc} carry it \u2014 strict-echo upstreams (DeepSeek thinking mode) will reject the request (#684)`)}}function warnAnthropicThinkingPairs(inboundMessages,outboundMessages,log2,sessionId){const thinkingIds=new Set;for(const m2 of inboundMessages){const msg=m2;if(msg?.role!=="assistant"||!Array.isArray(msg.content))continue;if(!msg.content.some(b2=>b2?.type==="thinking"))continue;for(const b2 of msg.content){if(b2?.type==="tool_use"&&typeof b2.id==="string")thinkingIds.add(b2.id)}}if(thinkingIds.size===0)return;let lost=0;const lostIds=[];for(const m2 of outboundMessages){const msg=m2;if(msg?.role!=="assistant"||!Array.isArray(msg.content))continue;if(msg.content.some(b2=>b2?.type==="thinking"))continue;for(const b2 of msg.content){if(b2?.type==="tool_use"&&typeof b2.id==="string"&&thinkingIds.has(b2.id)){lost++;lostIds.push(b2.id)}}}if(lost>0){log2("warn",`[${sessionId}] thinking-pair-violated: ${lost} tool_use block(s) lost their inbound thinking block in the outbound rebuild (${[...new Set(lostIds)].slice(0,3).join(", ")}) \u2014 a stripped signature pair is rejected by the API (#684)`)}}function warnResponsesReasoningPairs(input,log2,sessionId){let withReasoning=0;let split=0;let runs=0;const orphans=[];let runCalls=0;let runReasoning=0;let runIds=[];const closeRun=()=>{if(runCalls>0&&runReasoning===0){split+=runCalls;runs++;orphans.push(...runIds)}runCalls=0;runReasoning=0;runIds=[]};for(const item of input){const it2=item;const t=it2?.type;if(t==="reasoning"){withReasoning++;runReasoning++;continue}if(t==="function_call"||t==="custom_tool_call"){runCalls++;if(typeof it2.call_id==="string"&&it2.call_id)runIds.push(it2.call_id);continue}if(t==="function_call_output"||t==="custom_tool_call_output")continue;if(t==="message"&&it2.role==="assistant")continue;closeRun()}closeRun();if(withReasoning>0&&split>0){const named=orphans.slice(0,3).join(", ")+(orphans.length>3?`, \u2026+${orphans.length-3}`:"");log2("warn",`[${sessionId}] reasoning-pair-violated: ${split} tool-call item(s) in ${runs} assistant run(s) lack any reasoning item while ${withReasoning} exist (${named}) \u2014 strict-echo upstreams will reject the request (#684)`)}}function stripKernelSummaries(messages,state2){const carried=new Set;for(const b2 of state2.blocks){if(!b2.active||!b2.compressCallId)continue;if(messages.some(m2=>m2.contentType==="tool-call"&&m2.toolCallId===b2.compressCallId)){carried.add(`acp_summary_${b2.blockId}`)}}return messages.filter(m2=>!(m2.id??"").startsWith("acp_summary_")||!carried.has(m2.id))}var RESPONSES_TURN_SEPARATOR="[The exchange between these two assistant turns was compressed.]";function repairResponsesAssistantOrdering(folded,original){const runOf=new Map;const runHasBody=new Map;let run=0;let inRun=false;for(const m2 of original){if(m2.role==="assistant"){if(!inRun){run++;inRun=true}runOf.set(m2.id,run);if(m2.contentType!=="reasoning")runHasBody.set(run,true)}else{inRun=false}}const survivorCount=new Map;for(const m2 of folded){const r=m2.role==="assistant"?runOf.get(m2.id):void 0;if(r!==void 0)survivorCount.set(r,(survivorCount.get(r)??0)+1)}const out=[];let phase=-1;let seenReasoning=false;let sepSeq=0;const pushSeparator=()=>{sepSeq++;out.push({id:`acp_turn_sep_${sepSeq}`,role:"user",contentType:"text",text:RESPONSES_TURN_SEPARATOR});phase=-1;seenReasoning=false};for(const m2 of folded){if(m2.role!=="assistant"){out.push(m2);phase=-1;seenReasoning=false;continue}const kind=m2.contentType==="reasoning"?"reasoning":m2.contentType==="tool-call"?"tool-call":"message";const r=runOf.get(m2.id);if(kind==="reasoning"&&r!==void 0&&runHasBody.get(r)&&survivorCount.get(r)===1)continue;if(kind==="reasoning"&&(phase>0||seenReasoning)||kind==="message"&&phase===2)pushSeparator();out.push(m2);if(kind==="reasoning"){phase=Math.max(phase,0);seenReasoning=true}else if(kind==="message")phase=Math.max(phase,1);else phase=Math.max(phase,2)}return out}function diagTagSummary(messages,sessionId,strategy){let textTagged=0;let toolTagged=0;for(const m2 of messages){const hasTag=(m2.text??"").includes(ACP_TAG_MARK);if(!hasTag)continue;if(m2.contentType==="tool-call"||m2.contentType==="tool-result")toolTagged++;else textTagged++}return`[${sessionId}] processTurn: ${messages.length} msgs, renderTags=${strategy}, ${textTagged} text tagged, ${toolTagged} tool tagged (should be 0 with text-only)`}function diagNudge(turn,sessionId,tokenCount,limit,model,willInject){const n=turn.nudge;if(!n)return`[${sessionId}] nudge: unavailable`;const b2=n.breakdown??{};const pct2=limit>0?`${Math.round(tokenCount/limit*100)}%`:"?";const growth=b2["growth"]??0;const floor=b2["growthFloor"]??0;const interval=b2["nudgeGrowthTokens"]??0;const pendingT1=b2["pendingT1"]??0;const ref=b2["growthReference"]??0;const inject=willInject?n.shouldInject?`INJECT T${n.tier??"?"}`:`INJECT-ESC T${n.tier??"?"}`:n.shouldInject?`ARMED-SUPPRESSED T${n.tier??"?"}`:"idle";const modelTag=model?` model=${model}`:"";return`[${sessionId}] nudge ${inject}: usage=${pct2} (${tokenCount}/${limit}), growth=${growth}/${floor} (ref=${ref}, interval=${interval}), pendingT1=${pendingT1}/${interval}${modelTag}, reason="${n.reason.slice(0,120)}"`}function effectiveTokenCount(session,msgs,inboundImageTokens=0){if(session.stats.lastInputTokens>0&&session.stats.lastInputTokensSource==="usage")return session.stats.lastInputTokens;const raw=estimateCoreMessagesUpper(msgs)+inboundImageTokens;if(session.metadata.anonymousPrefixAffinity)return raw;const est=session.stats.localInputEstimate??0;if(est<=0)return 0;return Math.min(est,raw)}function usageGradeInputBaseline(session){return session.stats.lastInputTokensSource==="usage"?session.stats.lastInputTokens:0}function scrubAnthropicPck(protocol,bodyBuffer,log2){if(protocol!=="anthropic"||bodyBuffer.length===0)return bodyBuffer;let parsed;try{parsed=JSON.parse(bodyBuffer.toString("utf8"))}catch{return bodyBuffer}if(parsed===null||typeof parsed!=="object"||Array.isArray(parsed))return bodyBuffer;const p2=parsed;if(!Object.prototype.hasOwnProperty.call(p2,"prompt_cache_key"))return bodyBuffer;delete p2.prompt_cache_key;log2("debug",`stripped prompt_cache_key from verbatim anthropic forward (#1403)`);return Buffer.from(JSON.stringify(p2),"utf8")}async function prepareAnthropic(parsed,req,opts,core,config,prompts,surface,log2,session,pluginMode,upstreamOrigin,reasoning,visibilityMarkers){const sessionId=session.id;const stream2=parsed.stream===true;++session.stats.requests;const injectTools=opts.compress.injectTool&&!pluginMode;const stripReasoning=msgs=>withReasoningDrop(msgs,reasoning,log2,sessionId,isStrictReasoningEcho(session,upstreamOrigin,modelIdOf(parsed)));if(isAutoModeClassifier(parsed)){log2("info",`[${sessionId}] auto-mode classifier passthrough (skipping compress injection)`);return{body:JSON.stringify(parsed),session,processedMessages:[],originalMessages:[],anthropicSystem:parsed.system,protocol:"anthropic",stream:stream2,compressInjected:false,pluginMode,nudge:void 0,prompts,surface}}let processedMessages=[];let attachedRetrievals=[];let attachedRetrievalNoteIds=[];let originalMessages=[];let nudge;let rebuiltMessages=parsed.messages;let systemOut=parsed.system;let toolsOut=parsed.tools;let sysNotes=[];if(opts.stableSystemAnchor&&!pluginMode){const fresh=extractSystem(parsed.system);const outcome=reconcileSystemAnchor(session,"anthropic",fresh,sessionId,log2);sysNotes=outcome.notes;if(outcome.outbound!==fresh){parsed.system=buildSystem(outcome.outbound,parsed.system)}}const strippedPanels=stripAcpPanelMessages(parsed.messages);if(strippedPanels>0){log2("info",`[${sessionId}] stripped ${strippedPanels} ACP panel message(s) before projection (UI-only, issue #359)`)}const strippedMarkerLines=stripAcpStatusMarkers(parsed.messages);if(strippedMarkerLines>0){log2("info",`[${sessionId}] stripped ${strippedMarkerLines} ACP status marker line(s) from incoming history (ephemeral proxy status, issue #1029)`)}const strippedCarriers=stripEmbeddedChainCarriers(parsed,"anthropic");if(strippedCarriers>0){log2("info",`[${sessionId}] stripped ${strippedCarriers} embedded chain checkpoint(s) from incoming history (leaked egress control data, issue #1542)`)}try{const{msgs,cacheControls}=anthropicToCore(parsed);originalMessages=msgs;const inboundImageTokens=imageTokensInParsedBody("anthropic",parsed,imageBillingFor(opts,upstreamOrigin));projectThinkingMass(msgs,{providerInputTokens:session.stats.lastInputTokens,measured:session.stats.lastInputTokensSource==="usage",systemText:extractSystem(parsed.system),tools:parsed.tools,imageTokens:inboundImageTokens,storedOverhead:typeof session.metadata.systemPromptTokens==="number"?session.metadata.systemPromptTokens:void 0});const knownRefsBefore=new Set(Object.keys(session.state.messageRefs.byRaw));extractSystem(parsed.system);const tokenCount=effectiveTokenCount(session,msgs,inboundImageTokens);const activeBefore=new Set(session.state.blocks.filter(b2=>b2.active).map(b2=>b2.blockId));const absorbBlock=effectiveAbsorbBlock(pluginMode,config,opts.compress.absorb);const absorbTools=absorbToolsFor(absorbBlock?.toolName??ABSORB_TOOL_NAME);const absorbActive=absorbBlock?.enabled===true&&opts.compress.injectTool;const rulesActive=rulesEnabled(config)&&opts.compress.injectTool;const loopConfig=ccrLoopConfig(session,{...config,absorb:absorbActive?absorbBlock:void 0});const foldCoveredBefore=session.stats.pendingFoldUsage===true?new Set(session.state.blocks.flatMap(b2=>b2.active?b2.effectiveMessageIds:[])):null;const turn=core.processTurn({messages:msgs,state:session.state,config:loopConfig,tokenCount,renderTags:process.env.ACP_RENDER_NONE?"none":"text-only",contentStore:contentStoreOf(session)});session.state=turn.state;adoptContentStore(session,turn.contentStore);session.stats.compressCreditTokens=0;if(foldCoveredBefore!==null&&msgs.length>=REWRITE_MIN_INCOMING_TOTAL){const gap=foldCoverage(foldCoveredBefore,msgs.map(m2=>m2.id));if(gap)log2("warn",`[${sessionId}] [acp-drift] fold coverage mismatch: ${gap.matched}/${gap.expected} covered message id(s) present in resent history \u2014 ${gap.expected-gap.matched} covered id(s) missing from resent history \u2014 mutation (content edit invalidates content-hash refs, fold silently lost) or client-side deletion/truncation (benign, message no longer on the wire); observability complement to the #1328 overflow rescue (#1195)`)}storeEffectiveAbsorb(session,loopConfig);storeEffectiveRules(session,config);turn.messages=applyAbsorbView(turn.messages,session.state,loopConfig,tokenCount);if(turn.nudge)turn.nudge.compressibleRanges=viableRanges(turn.nudge.compressibleRanges);nudge=turn.nudge;session.stats.contextTokens=tokenCount;if(!session.meta.title){const t=deriveTitle(msgs);if(t)session.meta.title=t}log2("info",diagTagSummary(turn.messages,sessionId,"text-only"));const willInjectNudge=opts.compress.injectNudge&&!!turn.nudge&&(turn.nudge.shouldInject||emergencyNudge(turn.nudge));log2("info",diagNudge(turn,sessionId,tokenCount,config.modelContextLimit,parsed.model,willInjectNudge));processedMessages=stripReasoning(stripKernelSummaries(turn.messages,turn.state));{const rewrite=detectUnannouncedHistoryRewrite(session,knownRefsBefore,msgs.map(m2=>m2.id));if(rewrite.detected){log2("warn",`[${sessionId}] unannounced client history rewrite detected (${rewrite.knownIncoming}/${rewrite.incomingTotal} incoming message(s) carry pre-turn refs of ${rewrite.knownBefore} known) \u2014 marking compaction boundary (#1001)`);recordConflict(session,"unannounced-rewrite",`${rewrite.knownIncoming}/${rewrite.incomingTotal} incoming message(s) carry pre-turn refs of ${rewrite.knownBefore} known`);markCompactionBoundary(session)}}applyCompactionArchive(session,activeBefore,new Set(msgs.map(m2=>m2.id)),log2);reapOrphansLogged(session,msgs,log2,sessionId);await applyImageCompressionPass(session,processedMessages,{config,billing:imageBillingFor(opts,upstreamOrigin),log:log2});if(pluginMode&&ccrEnabled(session)){reconcileReloadedRetrievals(session);pruneExpiredRetrievals(session);attachedRetrievals=snapshotPendingRetrievals(session);if(attachedRetrievals.length>0)processedMessages=[...processedMessages,...attachedRetrievals.map(i=>i.injection)]}rebuiltMessages=coreToAnthropic(processedMessages,cacheControls);if(sysNotes.length>0){rebuiltMessages=[...rebuiltMessages,...sysNotes.map(text=>({role:"user",content:text}))]}systemOut=injectSystem(parsed,opts,prompts,loopConfig,ensureCanonicalId(session),surface,visibilityMarkers);if(injectTools){toolsOut=injectTool(parsed.tools,[...absorbActive?[absorbTools.anthropic]:[],...rulesActive?[RULE_TOOL]:[],...ccrEnabled(session)?[retrieveToolsFor(retrieveToolName(session)).anthropic]:[],...imageCompressionEnabled(session)?[IMAGE_FULL_TOOL]:[]],surface?.toolPrompts)}if(willInjectNudge&&turn.nudge){try{const rendered=renderNudgeText(turn.nudge,prompts,surface?.nudgeSections);if(rendered.text){rebuiltMessages=[...rebuiltMessages,{role:"user",content:withMarkerIntegrityNote(withSummaryBudgetNote(withStagedCompressGuidance(rendered.text)),visibilityMarkers)}]}}catch{}}const imgNote=imageFullTrailingNote(session);if(imgNote)rebuiltMessages=[...rebuiltMessages,{role:"user",content:imgNote}];const retrNotes=snapshotRetrievalNotes(session);const retrNote=renderRetrievalNotes(retrNotes);if(retrNote){rebuiltMessages=[...rebuiltMessages,{role:"user",content:retrNote}];attachedRetrievalNoteIds=retrNotes.map(n=>n.id)}}catch(err2){log2("warn",`[${sessionId}] kernel transform failed, forwarding unchanged: ${String(err2)}`);if(attachedRetrievals.length>0)dropRetrievals(session,attachedRetrievals.map(i=>i.ref),"prepare failed; forwarded unprocessed");processedMessages=[]}session.metadata.systemPromptTokens=countSystemAndToolsTokens(extractSystem(systemOut),toolsOut);snapshotMessages(session,originalMessages);markDirty(session);const rebuilt={...parsed,messages:rebuiltMessages,system:systemOut,tools:toolsOut};warnAnthropicThinkingPairs(parsed.messages,rebuiltMessages,log2,sessionId);delete rebuilt.prompt_cache_key;session.stats.localInputEstimate=estimateCoreMessagesUpper(processedMessages.length>0?processedMessages:originalMessages)+countSystemAndToolsTokens(extractSystem(systemOut),toolsOut)+imageTokensInParsedBody("anthropic",rebuilt,imageBillingFor(opts,upstreamOrigin));return{body:JSON.stringify(rebuilt),session,attachedRetrievals,attachedRetrievalNoteIds,processedMessages,originalMessages,anthropicSystem:parsed.system,systemNotes:sysNotes,protocol:"anthropic",stream:stream2,compressInjected:injectTools,pluginMode,nudge,prompts,surface,renderTags:process.env.ACP_RENDER_NONE?"none":"text-only"}}async function prepareOpenai(parsed,req,opts,core,config,prompts,surface,log2,session,pluginMode,upstreamOrigin,nativeWindow,reasoning,visibilityMarkers,billingUpstream){const sessionId=session.id;const stream2=parsed.stream===true;++session.stats.requests;let openaiSystemText="";let sysNotes=[];const stripReasoning=msgs=>withReasoningDrop(msgs,reasoning,log2,sessionId,isStrictReasoningEcho(session,upstreamOrigin,modelIdOf(parsed)));let openaiOutboundSystem;let processedMessages=[];let attachedRetrievals=[];let attachedRetrievalNoteIds=[];let originalMessages=[];let nudge;let rebuiltMessages=parsed.messages;let toolsOut=parsed.tools;const maxTokens=typeof parsed.max_tokens==="number"?parsed.max_tokens:8192;const isTitleGen=maxTokens<=200;const shouldInject=opts.compress.injectTool&&!isTitleGen;const injectTools=shouldInject&&!pluginMode;const strippedPanels=stripAcpPanelMessages(parsed.messages);if(strippedPanels>0){log2("info",`[${sessionId}] stripped ${strippedPanels} ACP panel message(s) before projection (UI-only, issue #359)`)}const strippedMarkerLines=stripAcpStatusMarkers(parsed.messages);if(strippedMarkerLines>0){log2("info",`[${sessionId}] stripped ${strippedMarkerLines} ACP status marker line(s) from incoming history (ephemeral proxy status, issue #1029)`)}const strippedCarriers=stripEmbeddedChainCarriers(parsed,"openai");if(strippedCarriers>0){log2("info",`[${sessionId}] stripped ${strippedCarriers} embedded chain checkpoint(s) from incoming history (leaked egress control data, issue #1542)`)}try{const{msgs,systemText}=openaiToCore(parsed);openaiSystemText=systemText;warnDroppedOpenaiParts(parsed,sessionId,log2);if(opts.stableSystemAnchor&&!pluginMode&&!isTitleGen){const outcome=reconcileSystemAnchor(session,"openai",systemText,sessionId,log2);sysNotes=outcome.notes;openaiSystemText=outcome.outbound}originalMessages=msgs;const knownRefsBefore=new Set(Object.keys(session.state.messageRefs.byRaw));const tokenCount=effectiveTokenCount(session,msgs,imageTokensInParsedBody("openai",parsed,imageBillingFor(opts,billingUpstream??upstreamOrigin)));const activeBefore=new Set(session.state.blocks.filter(b2=>b2.active).map(b2=>b2.blockId));const absorbBlock=effectiveAbsorbBlock(pluginMode,config,opts.compress.absorb);const absorbTools=absorbToolsFor(absorbBlock?.toolName??ABSORB_TOOL_NAME);const absorbActive=absorbBlock?.enabled===true&&shouldInject;const rulesActive=rulesEnabled(config)&&shouldInject;const loopConfig=ccrLoopConfig(session,{...config,absorb:absorbActive?absorbBlock:void 0});const foldCoveredBefore=session.stats.pendingFoldUsage===true?new Set(session.state.blocks.flatMap(b2=>b2.active?b2.effectiveMessageIds:[])):null;const turn=core.processTurn({messages:msgs,state:session.state,config:loopConfig,tokenCount,renderTags:process.env.ACP_RENDER_NONE?"none":"text-only",contentStore:contentStoreOf(session)});session.state=turn.state;adoptContentStore(session,turn.contentStore);session.stats.compressCreditTokens=0;if(foldCoveredBefore!==null&&!isTitleGen&&msgs.length>=REWRITE_MIN_INCOMING_TOTAL){const gap=foldCoverage(foldCoveredBefore,msgs.map(m2=>m2.id));if(gap)log2("warn",`[${sessionId}] [acp-drift] fold coverage mismatch: ${gap.matched}/${gap.expected} covered message id(s) present in resent history \u2014 ${gap.expected-gap.matched} covered id(s) missing from resent history \u2014 mutation (content edit invalidates content-hash refs, fold silently lost) or client-side deletion/truncation (benign, message no longer on the wire); observability complement to the #1328 overflow rescue (#1195)`)}storeEffectiveAbsorb(session,loopConfig);storeEffectiveRules(session,config);turn.messages=applyAbsorbView(turn.messages,session.state,loopConfig,tokenCount);if(turn.nudge)turn.nudge.compressibleRanges=viableRanges(turn.nudge.compressibleRanges);nudge=turn.nudge;session.stats.contextTokens=tokenCount;if(!session.meta.title){const t=deriveTitle(msgs);if(t)session.meta.title=t}log2("info",diagTagSummary(turn.messages,sessionId,"text-only"));const willInjectNudge=opts.compress.injectNudge&&!!turn.nudge&&shouldInject&&(turn.nudge.shouldInject||emergencyNudge(turn.nudge));log2("info",diagNudge(turn,sessionId,tokenCount,config.modelContextLimit,parsed.model,willInjectNudge));processedMessages=stripReasoning(stripKernelSummaries(turn.messages,turn.state));{const rewrite=detectUnannouncedHistoryRewrite(session,knownRefsBefore,msgs.map(m2=>m2.id));if(rewrite.detected){log2("warn",`[${sessionId}] unannounced client history rewrite detected (${rewrite.knownIncoming}/${rewrite.incomingTotal} incoming message(s) carry pre-turn refs of ${rewrite.knownBefore} known) \u2014 marking compaction boundary (#1001)`);recordConflict(session,"unannounced-rewrite",`${rewrite.knownIncoming}/${rewrite.incomingTotal} incoming message(s) carry pre-turn refs of ${rewrite.knownBefore} known`);markCompactionBoundary(session)}}applyCompactionArchive(session,activeBefore,new Set(msgs.map(m2=>m2.id)),log2);reapOrphansLogged(session,msgs,log2,sessionId);await applyImageCompressionPass(session,processedMessages,{config,billing:imageBillingFor(opts,billingUpstream??upstreamOrigin),log:log2});if(pluginMode&&ccrEnabled(session)){reconcileReloadedRetrievals(session);pruneExpiredRetrievals(session);attachedRetrievals=snapshotPendingRetrievals(session);if(attachedRetrievals.length>0)processedMessages=[...processedMessages,...attachedRetrievals.map(i=>i.injection)]}rebuiltMessages=systemToUser(hardenOpenaiAssistantContent(coreToOpenai(processedMessages)));const sysParts=[];if(openaiSystemText)sysParts.push(openaiSystemText);if(shouldInject)sysParts.push(withConversationIdNote(withMarkerIntegrityNote(withSummaryBudgetNote(buildCompressSystemPrompt(prompts,surface?.promptSections)),visibilityMarkers),ensureCanonicalId(session)));if(absorbActive)sysParts.push(buildAbsorbSystemPrompt(absorbToolName(loopConfig)));rebuiltMessages=injectOpenaiSystem(rebuiltMessages,sysParts);if(sysNotes.length>0){rebuiltMessages=[...rebuiltMessages,...sysNotes.map(text=>({role:"user",content:text}))]}openaiOutboundSystem=sysParts.join("\n\n");if(injectTools){toolsOut=injectOpenaiTool(parsed.tools,[...absorbActive?[absorbTools.openai]:[],...rulesActive?[RULE_TOOL_OPENAI]:[],...ccrEnabled(session)?[retrieveToolsFor(retrieveToolName(session)).openai]:[],...imageCompressionEnabled(session)?[IMAGE_FULL_TOOL_OPENAI]:[]],surface?.toolPrompts)}if(willInjectNudge&&turn.nudge){try{const rendered=renderNudgeText(turn.nudge,prompts,surface?.nudgeSections);if(rendered.text){rebuiltMessages=[...rebuiltMessages,{role:"user",content:withMarkerIntegrityNote(withSummaryBudgetNote(withStagedCompressGuidance(rendered.text)),visibilityMarkers)}]}}catch{}}const imgNote=imageFullTrailingNote(session);if(imgNote)rebuiltMessages=[...rebuiltMessages,{role:"user",content:imgNote}];const retrNotes=snapshotRetrievalNotes(session);const retrNote=renderRetrievalNotes(retrNotes);if(retrNote){rebuiltMessages=[...rebuiltMessages,{role:"user",content:retrNote}];attachedRetrievalNoteIds=retrNotes.map(n=>n.id)}}catch(err2){log2("warn",`[${sessionId}] kernel transform failed, forwarding unchanged: ${String(err2)}`);if(attachedRetrievals.length>0)dropRetrievals(session,attachedRetrievals.map(i=>i.ref),"prepare failed; forwarded unprocessed");processedMessages=[]}rebuiltMessages=normalizeStrictEchoReasoning(rebuiltMessages,isStrictReasoningEcho(session,upstreamOrigin,modelIdOf(parsed)),log2,sessionId);const rebuilt={...parsed,messages:rebuiltMessages,tools:toolsOut};warnReasoningPairs(rebuiltMessages,log2,sessionId);clampOutgoingOutput(rebuilt,typeof parsed.max_completion_tokens==="number"?"max_completion_tokens":"max_tokens",{systemText:openaiSystemText,tools:toolsOut,processedMessages,lastInputTokens:session.stats.lastInputTokens,lastInputTokensSource:session.stats.lastInputTokensSource,nativeWindow,imageTokens:imageTokensInParsedBody("openai",rebuilt,imageBillingFor(opts,billingUpstream??upstreamOrigin))},sessionId,log2);delete rebuilt.prompt_cache_retention;if(stream2&&rebuilt.stream_options===void 0){rebuilt.stream_options={include_usage:true}}if(!isTitleGen&&openaiOutboundSystem!==void 0){session.metadata.systemPromptTokens=countSystemAndToolsTokens(openaiOutboundSystem,toolsOut)}if(!isTitleGen){session.stats.localInputEstimate=estimateCoreMessagesUpper(processedMessages.length>0?processedMessages:originalMessages)+countSystemAndToolsTokens(openaiOutboundSystem||openaiSystemText,toolsOut)+imageTokensInParsedBody("openai",rebuilt,imageBillingFor(opts,billingUpstream??upstreamOrigin))}snapshotMessages(session,originalMessages);markDirty(session);return{body:JSON.stringify(rebuilt),session,attachedRetrievals,attachedRetrievalNoteIds,processedMessages,originalMessages,protocol:"openai",stream:stream2,compressInjected:injectTools,pluginMode,nudge,prompts,surface,openaiSystemText,systemNotes:sysNotes,renderTags:process.env.ACP_RENDER_NONE?"none":"text-only"}}function appendGoogleNudge(contents,text){const last=contents[contents.length-1];if(last&&(last.role??"user")!=="model"){const parts=Array.isArray(last.parts)?last.parts:[];return[...contents.slice(0,-1),{...last,parts:[...parts,{text}]}]}return[...contents,{role:"user",parts:[{text}]}]}async function prepareGoogle(parsed,opts,core,config,prompts,surface,log2,session,pluginMode,nativeWindow,model,stream2,visibilityMarkers,upstreamOrigin){const sessionId=session.id;++session.stats.requests;let googleClientSystem="";let sysNotes=[];let googleOutboundSystem;let systemInstruction=parsed.systemInstruction;let processedMessages=[];let originalMessages=[];let nudge;let rebuiltContents=Array.isArray(parsed.contents)?parsed.contents:[];let toolsOut=parsed.tools;const genConfig=parsed.generationConfig;const declaredMax=genConfig?genConfig.maxOutputTokens:void 0;const maxTokens=typeof declaredMax==="number"?declaredMax:8192;const isTitleGen=maxTokens<=200;const shouldInject=opts.compress.injectTool&&!isTitleGen;const injectTools=shouldInject&&!pluginMode;const strippedCarriers=stripEmbeddedChainCarriers(parsed,"google");if(strippedCarriers>0){log2("info",`[${sessionId}] stripped ${strippedCarriers} embedded chain checkpoint(s) from incoming history (leaked egress control data, issue #1542)`)}try{const{msgs,systemText}=googleToCore(parsed);googleClientSystem=systemText;if(opts.stableSystemAnchor&&!pluginMode&&!isTitleGen){const outcome=reconcileSystemAnchor(session,"google",systemText,sessionId,log2);sysNotes=outcome.notes;googleClientSystem=outcome.outbound}originalMessages=msgs;const tokenCount=effectiveTokenCount(session,msgs,imageTokensInParsedBody("google",parsed,imageBillingFor(opts,upstreamOrigin)));const activeBefore=new Set(session.state.blocks.filter(b2=>b2.active).map(b2=>b2.blockId));const absorbBlock=effectiveAbsorbBlock(pluginMode,config,opts.compress.absorb);const absorbTools=absorbToolsFor(absorbBlock?.toolName??ABSORB_TOOL_NAME);const absorbActive=absorbBlock?.enabled===true&&shouldInject;const rulesActive=rulesEnabled(config)&&shouldInject;const loopConfig=ccrLoopConfig(session,{...config,absorb:absorbActive?absorbBlock:void 0});const foldCoveredBefore=session.stats.pendingFoldUsage===true?new Set(session.state.blocks.flatMap(b2=>b2.active?b2.effectiveMessageIds:[])):null;const turn=core.processTurn({messages:msgs,state:session.state,config:loopConfig,tokenCount,renderTags:"text-only",contentStore:contentStoreOf(session)});session.state=turn.state;adoptContentStore(session,turn.contentStore);session.stats.compressCreditTokens=0;if(foldCoveredBefore!==null&&!isTitleGen&&msgs.length>=REWRITE_MIN_INCOMING_TOTAL){const gap=foldCoverage(foldCoveredBefore,msgs.map(m2=>m2.id));if(gap)log2("warn",`[${sessionId}] [acp-drift] fold coverage mismatch: ${gap.matched}/${gap.expected} covered message id(s) present in resent history \u2014 ${gap.expected-gap.matched} covered id(s) missing from resent history \u2014 mutation (content edit invalidates content-hash refs, fold silently lost) or client-side deletion/truncation (benign, message no longer on the wire); observability complement to the #1328 overflow rescue (#1195)`)}storeEffectiveAbsorb(session,loopConfig);storeEffectiveRules(session,config);turn.messages=applyAbsorbView(turn.messages,session.state,loopConfig,tokenCount);if(turn.nudge)turn.nudge.compressibleRanges=viableRanges(turn.nudge.compressibleRanges);nudge=turn.nudge;session.stats.contextTokens=tokenCount;if(!session.meta.title){const t=deriveTitle(msgs);if(t)session.meta.title=t}log2("info",diagTagSummary(turn.messages,sessionId,"text-only"));const willInjectNudge=opts.compress.injectNudge&&!!turn.nudge&&shouldInject&&(turn.nudge.shouldInject||emergencyNudge(turn.nudge));log2("info",diagNudge(turn,sessionId,tokenCount,config.modelContextLimit,model,willInjectNudge));processedMessages=stripKernelSummaries(turn.messages,turn.state);applyCompactionArchive(session,activeBefore,new Set(msgs.map(m2=>m2.id)),log2);reapOrphansLogged(session,msgs,log2,sessionId);await applyImageCompressionPass(session,processedMessages,{config,billing:imageBillingFor(opts,upstreamOrigin),log:log2});rebuiltContents=coreToGoogle(processedMessages);const sysParts=[];if(googleClientSystem)sysParts.push(googleClientSystem);if(shouldInject)sysParts.push(withConversationIdNote(withMarkerIntegrityNote(withSummaryBudgetNote(buildCompressSystemPrompt(prompts,surface?.promptSections)),visibilityMarkers),ensureCanonicalId(session)));if(absorbActive)sysParts.push(buildAbsorbSystemPrompt(absorbToolName(loopConfig)));googleOutboundSystem=sysParts.join("\n\n");const extraSystemParts=sysParts.slice(googleClientSystem?1:0);systemInstruction=extraSystemParts.length>0?{parts:sysParts.map(text=>({text}))}:parsed.systemInstruction;if(injectTools){toolsOut=injectGoogleTool(parsed.tools,[...absorbActive?[absorbTools.google]:[],...rulesActive?[RULE_TOOL_GOOGLE]:[],...ccrEnabled(session)?[retrieveToolsFor(retrieveToolName(session)).google]:[],...imageCompressionEnabled(session)?[IMAGE_FULL_TOOL_GOOGLE]:[]],surface?.toolPrompts)}if(sysNotes.length>0){rebuiltContents=appendGoogleNudge(rebuiltContents,sysNotes.join("\n\n---\n\n"))}if(willInjectNudge&&turn.nudge){try{const rendered=renderNudgeText(turn.nudge,prompts,surface?.nudgeSections);if(rendered.text){rebuiltContents=appendGoogleNudge(rebuiltContents,withMarkerIntegrityNote(withStagedCompressGuidance(rendered.text),visibilityMarkers))}}catch{}}const imgNote=imageFullTrailingNote(session);if(imgNote)rebuiltContents=appendGoogleNudge(rebuiltContents,imgNote)}catch(err2){log2("warn",`[${sessionId}] kernel transform failed, forwarding unchanged: ${String(err2)}`);processedMessages=[]}const rebuilt={...parsed,contents:rebuiltContents,tools:toolsOut,systemInstruction};clampOutgoingOutput(rebuilt,"generationConfig.maxOutputTokens",{systemText:googleClientSystem,tools:toolsOut,processedMessages,lastInputTokens:session.stats.lastInputTokens,lastInputTokensSource:session.stats.lastInputTokensSource,nativeWindow,imageTokens:imageTokensInParsedBody("google",rebuilt)},sessionId,log2);if(!isTitleGen&&googleOutboundSystem!==void 0){session.metadata.systemPromptTokens=countSystemAndToolsTokens(googleOutboundSystem,toolsOut)}snapshotMessages(session,originalMessages);markDirty(session);return{body:JSON.stringify(rebuilt),session,processedMessages,originalMessages,protocol:"google",stream:stream2,compressInjected:injectTools,pluginMode,nudge,prompts,surface,google:{system:googleClientSystem,model},systemNotes:sysNotes,renderTags:"text-only"}}function prepareGoogleCountTokens(parsed,core,config,log2,session){const sessionId=session.id;try{const{msgs}=googleToCore(parsed);const turn=core.processTurn({messages:msgs,state:session.state,config:ccrLoopConfig(session,config),tokenCount:usageGradeInputBaseline(session),renderTags:"text-only",contentStore:contentStoreOf(session)});const stripped=stripKernelSummaries(turn.messages,turn.state);const rebuilt={...parsed,contents:coreToGoogle(stripped)};log2("info",`[${sessionId}] countTokens pruned: ${msgs.length} \u2192 ${stripped.length} msgs`);return{body:JSON.stringify(rebuilt),session,processedMessages:[],originalMessages:msgs,protocol:"google",stream:false,compressInjected:false}}catch(err2){log2("warn",`[${sessionId}] countTokens prune failed, forwarding unchanged: ${String(err2)}`);return{body:JSON.stringify({...parsed}),session,processedMessages:[],originalMessages:[],protocol:"google",stream:false,compressInjected:false}}}async function prepareResponses(parsed,req,opts,core,config,prompts,surface,log2,session,identity,pluginMode,upstreamOrigin,nativeWindow,reasoning,visibilityMarkers,billingUpstream){const sessionId=session.id;const stream2=parsed.stream===true;++session.stats.requests;const stripReasoning=msgs=>withReasoningDrop(msgs,reasoning,log2,sessionId,isStrictReasoningEcho(session,upstreamOrigin,modelIdOf(parsed)));if(reconcileNativeCompactionBoundary(session)){log2("info",`[${sessionId}] reconciled ACP state after native Responses compact boundary`)}let echoReplaced=false;if(Array.isArray(parsed.input)){const{items,replaced,dropped}=replaceBiliCompactionItems(parsed.input);if(replaced+dropped>0){if(replaced>0)echoReplaced=true;log2("info",`[${sessionId}] replaced ${replaced} echoed bili compaction item(s) with summary handoff message(s)${dropped>0?`, dropped ${dropped} legacy marker item(s)`:""}`);parsed.input=items}}let processedMessages=[];let originalMessages=[];let nudge;let responsesProjection;let rebuiltInput=parsed.input;let toolsOut=parsed.tools;let transformOk=false;let responsesDevContent;let sysNotes=[];const typedItems=normalizeResponsesMessageItems(parsed.input);if(typedItems>0){log2("info",`[${sessionId}] stamped type:"message" on ${typedItems} type-less input item(s) before projection (omp wire form)`)}sanitizeResponsesInputIds(parsed.input);const droppedEmpty=dropWhitespaceResponsesMessages(parsed.input);if(droppedEmpty>0){log2("info",`[${sessionId}] dropped ${droppedEmpty} whitespace-only message item(s) before projection (flattened-turn artifact)`)}const strippedPanels=stripAcpPanelResponsesInput(parsed.input);if(strippedPanels>0){log2("info",`[${sessionId}] stripped ${strippedPanels} ACP panel message(s) before projection (UI-only, issue #359)`)}const strippedMarkerLines=stripAcpStatusMarkers(parsed.input);if(strippedMarkerLines>0){log2("info",`[${sessionId}] stripped ${strippedMarkerLines} ACP status marker line(s) from incoming history (ephemeral proxy status, issue #1029)`)}const strippedCarriers=stripEmbeddedChainCarriers(parsed,"responses");if(strippedCarriers>0){log2("info",`[${sessionId}] stripped ${strippedCarriers} embedded chain checkpoint(s) from incoming history (leaked egress control data, issue #1542)`)}const shouldInject=opts.compress.injectTool;const injectTools=shouldInject&&!pluginMode;const isCompactionTrigger=hasCompactionTrigger(parsed.input);const responsesTextProtocol=FORCE_TEXT_PROTOCOL||resolveCompressProtocol(opts.routes,upstreamOrigin)==="marker";const renderTags=process.env.ACP_RENDER_NONE||isCompactionTrigger?"none":"text-only";try{const projection=responsesToCoreWithToolImages(parsed);responsesProjection=projection;if(opts.stableSystemAnchor&&!pluginMode&&!isCompactionTrigger){const fresh=projection.systemParts.join("\n\n---\n\n");const outcome=reconcileSystemAnchor(session,"responses",fresh,sessionId,log2);sysNotes=outcome.notes;if(outcome.outbound!==fresh)projection.systemParts=outcome.outbound?[outcome.outbound]:[]}const{msgs}=projection;originalMessages=msgs;if(process.env.ACP_DEBUG){log2("info",`[${sessionId}] input items: ${Array.isArray(parsed.input)?parsed.input.map(i=>i.type).join(","):"(string)"}`)}const tokenCount=effectiveTokenCount(session,msgs,imageTokensInParsedBody("responses",parsed,imageBillingFor(opts,billingUpstream??upstreamOrigin)));const absorbBlock=effectiveAbsorbBlock(pluginMode,config,opts.compress.absorb);const absorbTools=absorbToolsFor(absorbBlock?.toolName??ABSORB_TOOL_NAME);const absorbActive=absorbBlock?.enabled===true&&shouldInject&&!isCompactionTrigger&&!responsesTextProtocol;const rulesActive=rulesEnabled(config)&&shouldInject&&!isCompactionTrigger&&!responsesTextProtocol;const loopConfig=ccrLoopConfig(session,{...config,absorb:absorbActive?absorbBlock:void 0});const foldCoveredBefore=session.stats.pendingFoldUsage===true?new Set(session.state.blocks.flatMap(b2=>b2.active?b2.effectiveMessageIds:[])):null;const turn=core.processTurn({messages:msgs,state:session.state,config:loopConfig,tokenCount,renderTags,contentStore:contentStoreOf(session)});session.state=turn.state;adoptContentStore(session,turn.contentStore);session.stats.compressCreditTokens=0;if(foldCoveredBefore!==null&&!isCompactionTrigger&&msgs.length>=REWRITE_MIN_INCOMING_TOTAL){const gap=foldCoverage(foldCoveredBefore,msgs.map(m2=>m2.id));if(gap)log2("warn",`[${sessionId}] [acp-drift] fold coverage mismatch: ${gap.matched}/${gap.expected} covered message id(s) present in resent history \u2014 ${gap.expected-gap.matched} covered id(s) missing from resent history \u2014 mutation (content edit invalidates content-hash refs, fold silently lost) or client-side deletion/truncation (benign, message no longer on the wire); observability complement to the #1328 overflow rescue (#1195)`)}storeEffectiveAbsorb(session,loopConfig);storeEffectiveRules(session,config);turn.messages=applyAbsorbView(turn.messages,session.state,loopConfig,tokenCount);if(turn.nudge)turn.nudge.compressibleRanges=viableRanges(turn.nudge.compressibleRanges);nudge=turn.nudge;session.stats.contextTokens=tokenCount;if(!session.meta.title){const t=deriveTitle(msgs);if(t)session.meta.title=t}log2("info",diagTagSummary(turn.messages,sessionId,"text-only"));const willInjectNudge=opts.compress.injectNudge&&!!turn.nudge&&shouldInject&&!isCompactionTrigger&&(turn.nudge.shouldInject||emergencyNudge(turn.nudge));log2("info",diagNudge(turn,sessionId,tokenCount,config.modelContextLimit,parsed.model,willInjectNudge));processedMessages=repairResponsesAssistantOrdering(stripReasoning(stripKernelSummaries(turn.messages,turn.state)),originalMessages);reapOrphansLogged(session,msgs,log2,sessionId);await applyImageCompressionPass(session,processedMessages,{config,billing:imageBillingFor(opts,billingUpstream??upstreamOrigin),log:log2});rebuiltInput=patchResponsesInputWithToolImages(projection,processedMessages);if(Array.isArray(rebuiltInput))rebuiltInput=hoistTrappedToolItems(rebuiltInput);const forgedSummaries=echoReplaced?[]:session.metadata.codexForgedSummaries??[];if(shouldInject&&!isCompactionTrigger&&!process.env.ACP_NO_COMPRESS_PROMPT){const prompt=withConversationIdNote(withMarkerIntegrityNote(withSummaryBudgetNote(responsesTextProtocol?buildCompressHybridSystemPrompt(prompts,surface?.promptSections):buildCompressSystemPrompt(prompts,surface?.promptSections)),visibilityMarkers),ensureCanonicalId(session));const devParts=[...projection.systemParts,...forgedSummaries,prompt];if(absorbActive)devParts.push(buildAbsorbSystemPrompt(absorbToolName(loopConfig)));const devContent=devParts.join("\n\n---\n\n");responsesDevContent=devContent;rebuiltInput=injectResponsesDeveloperMessage(rebuiltInput,devContent);if(!process.env.ACP_NO_INJECT_TOOL&&injectTools){const respExtra=[...absorbActive?[absorbTools.responses]:[],...rulesActive?[RULE_TOOL_RESPONSES]:[],...ccrEnabled(session)?[retrieveToolsFor(retrieveToolName(session)).responses]:[],...imageCompressionEnabled(session)?[IMAGE_FULL_TOOL_RESPONSES]:[]];toolsOut=responsesTextProtocol?injectResponsesTool(parsed.tools,BILI_ACP_READONLY_TOOLS_RESPONSES,surface?.toolPrompts):injectResponsesTool(parsed.tools,respExtra.length>0?[...BILI_ACP_TOOLS_RESPONSES,...respExtra]:BILI_ACP_TOOLS_RESPONSES,surface?.toolPrompts)}}else if(projection.systemParts.length>0||forgedSummaries.length>0){const devContent=[...projection.systemParts,...forgedSummaries].join("\n\n---\n\n");responsesDevContent=devContent;rebuiltInput=injectResponsesDeveloperMessage(rebuiltInput,devContent)}if(sysNotes.length>0){const inputItems=typeof rebuiltInput==="string"?[{type:"message",role:"user",content:rebuiltInput}]:rebuiltInput;for(const text of sysNotes){inputItems.push({type:"message",role:"user",content:text})}rebuiltInput=inputItems}if(willInjectNudge&&turn.nudge){try{const rendered=renderNudgeText(turn.nudge,prompts,surface?.nudgeSections);if(rendered.text){const inputItems=typeof rebuiltInput==="string"?[{type:"message",role:"user",content:rebuiltInput}]:rebuiltInput;inputItems.push({type:"message",role:"user",content:withMarkerIntegrityNote(withSummaryBudgetNote(withStagedCompressGuidance(rendered.text)),visibilityMarkers)});rebuiltInput=inputItems}}catch{}}const imgNote=imageFullTrailingNote(session);if(imgNote&&!isCompactionTrigger){const inputItems=typeof rebuiltInput==="string"?[{type:"message",role:"user",content:rebuiltInput}]:rebuiltInput;inputItems.push({type:"message",role:"user",content:imgNote});rebuiltInput=inputItems}transformOk=true}catch(err2){log2("warn",`[${sessionId}] kernel transform failed, forwarding unchanged: ${String(err2)}`);processedMessages=[]}let codexForge;if(transformOk&&codexCompactMode()==="intercept"&&isCodexClient(req.headers)&&hasCompactionTrigger(parsed.input)&&codexCompactGate(session,config.modelContextLimit,transformOk)){const summaries=session.state.blocks.filter(b2=>b2.active).map(b2=>b2.summary);const prevForged=session.metadata.codexForgedSummaries;const captured=mergeForgedSummaries(prevForged,session.state.blocks);if(captured.length!==(prevForged?.length??0)){session.metadata.codexForgedSummaries=captured;markDirty(session)}const est=defaultCountTokens(typeof parsed.input==="string"?parsed.input:JSON.stringify(parsed.input??""));const total=Math.max(session.stats.lastInputTokens,est,1);codexForge={kind:"trigger",...buildTriggerForgeBody(summaries.join("\n\n"),{inputTokens:total,outputTokens:0,totalTokens:total},stream2)};log2("info",`[${sessionId}] codex compact intercepted (trigger); forged SSE with ${summaries.length} block summary(s), upstream not contacted`)}if(Array.isArray(rebuiltInput))rebuiltInput=normalizeStrictEchoResponsesInput(rebuiltInput,isStrictReasoningEcho(session,upstreamOrigin,modelIdOf(parsed)),log2,sessionId);const rebuilt={...parsed,input:rebuiltInput,tools:toolsOut};warnResponsesReasoningPairs(Array.isArray(rebuiltInput)?rebuiltInput:[],log2,sessionId);if(!isCompactionTrigger){clampOutgoingOutput(rebuilt,"max_output_tokens",{systemText:(responsesProjection?.systemParts??[]).join("\n"),tools:toolsOut,processedMessages,lastInputTokens:session.stats.lastInputTokens,lastInputTokensSource:session.stats.lastInputTokensSource,nativeWindow,imageTokens:imageTokensInParsedBody("responses",rebuilt,imageBillingFor(opts,billingUpstream??upstreamOrigin))},sessionId,log2)}const promptCacheKey=resolvePromptCacheKey(rebuilt.prompt_cache_key,identity,opts.promptCache.routing,upstreamOrigin);if(promptCacheKey&&!rebuilt.prompt_cache_key)rebuilt.prompt_cache_key=promptCacheKey;if(process.env.ACP_KEEP_RESPONSE_ID!=="1")delete rebuilt.previous_response_id;delete rebuilt.instructions;delete rebuilt.prompt_cache_retention;if(process.env.ACP_DEBUG){const fwdTools=(Array.isArray(toolsOut)?toolsOut:[]).map(t=>{const r=t;const sub=Array.isArray(r.tools)?`(${r.tools.length} sub)`:"";return`${r.type}:${r.name??"?"}${sub}`});log2("info",`[${sessionId}] responses forward tools=[${fwdTools.join(",")}] injectTool=${injectTools}${pluginMode?" (plugin mode: wire injection suppressed)":""} NO_INJECT_TOOL=${!!process.env.ACP_NO_INJECT_TOOL} NO_COMPRESS_PROMPT=${!!process.env.ACP_NO_COMPRESS_PROMPT}`)}if(transformOk){session.metadata.systemPromptTokens=countSystemAndToolsTokens(responsesDevContent??"",toolsOut)}if(!isCompactionTrigger){session.stats.localInputEstimate=estimateCoreMessagesUpper(processedMessages.length>0?processedMessages:originalMessages)+countSystemAndToolsTokens(responsesDevContent??"",toolsOut)+imageTokensInParsedBody("responses",rebuilt,imageBillingFor(opts,billingUpstream??upstreamOrigin))}snapshotMessages(session,originalMessages);markDirty(session);return{body:JSON.stringify(rebuilt),session,processedMessages,originalMessages,responsesProjection,systemNotes:sysNotes,protocol:"responses",stream:stream2,compressInjected:injectTools&&!isCompactionTrigger,pluginMode,responsesTextProtocol,nudge,prompts,surface,renderTags,resetAfterSuccess:isCompactionTrigger,codexForge}}function isCountTokensRequest(method,urlPath,hasBody){return method==="POST"&&hasBody&&process.env.ACP_COUNT_TOKENS_PASSTHROUGH!=="1"&&(urlPath.endsWith("/messages/count_tokens")||googlePathKind(urlPath)==="count-tokens")}function prepareCountTokens(parsed,core,config,log2,session){const sessionId=session.id;try{const{msgs,cacheControls}=anthropicToCore(parsed);const turn=core.processTurn({messages:msgs,state:session.state,config:ccrLoopConfig(session,config),tokenCount:usageGradeInputBaseline(session),renderTags:process.env.ACP_RENDER_NONE?"none":"text-only",contentStore:contentStoreOf(session)});const stripped=stripKernelSummaries(turn.messages,turn.state);const rebuiltMessages=coreToAnthropic(stripped,cacheControls);log2("info",`[${sessionId}] count_tokens pruned: ${msgs.length} \u2192 ${stripped.length} msgs`);const rebuilt={...parsed,messages:rebuiltMessages};delete rebuilt.prompt_cache_key;return{body:JSON.stringify(rebuilt),session,processedMessages:[],originalMessages:msgs,protocol:"anthropic",stream:false,compressInjected:false}}catch(err2){log2("warn",`[${sessionId}] count_tokens prune failed, forwarding unchanged: ${String(err2)}`);const fallback={...parsed};delete fallback.prompt_cache_key;return{body:JSON.stringify(fallback),session,processedMessages:[],originalMessages:[],protocol:"anthropic",stream:false,compressInjected:false}}}function prepareResponsesCompact(body,parsed,session,req,core,config,log2){++session.stats.requests;const cleaned=Array.isArray(parsed.input)?stripBiliCompactionItems(parsed.input):parsed.input;const stripped=Array.isArray(parsed.input)&&cleaned.length!==parsed.input.length;const forgeBody={...parsed,input:cleaned};const base={body:stripped?Buffer.from(JSON.stringify(forgeBody)):body,session,processedMessages:[],originalMessages:[],protocol:"responses",stream:parsed.stream===true,compressInjected:false,resetAfterSuccess:true};if(codexCompactMode()!=="intercept"||!isCodexClient(req.headers)||!Array.isArray(parsed.input)||!codexCompactGatePre(session,config.modelContextLimit)){return base}const prevState=session.state;const prevStore=session.contentStore;const prevStoreDirty=session.contentStoreDirty===true;let transformOk=false;try{const projection=responsesToCoreWithToolImages(forgeBody);const compactConfig=ccrLoopConfig(session,{...config,absorb:void 0});const turn=core.processTurn({messages:projection.msgs,state:session.state,config:compactConfig,tokenCount:usageGradeInputBaseline(session),renderTags:process.env.ACP_RENDER_NONE?"none":"text-only",contentStore:contentStoreOf(session)});session.state=turn.state;adoptContentStore(session,turn.contentStore);transformOk=true;if(!codexCompactGate(session,config.modelContextLimit,transformOk)){session.state=prevState;session.contentStore=prevStore;session.contentStoreDirty=prevStoreDirty;return base}const viewed=applyAbsorbView(turn.messages,turn.state,compactConfig,usageGradeInputBaseline(session));const processed=repairResponsesAssistantOrdering(stripKernelSummaries(viewed,turn.state),projection.msgs);let output=patchResponsesInputWithToolImages(projection,processed);if(typeof output==="string"){session.state=prevState;session.contentStore=prevStore;session.contentStoreDirty=prevStoreDirty;return base}output=hoistTrappedToolItems(output);snapshotMessages(session,projection.msgs);markDirty(session);log2("info",`[${session.id}] codex compact intercepted (endpoint); forged history with ${output.length} item(s), upstream not contacted`);return{...base,codexForge:{kind:"endpoint",body:JSON.stringify({output}),contentType:"application/json"}}}catch(err2){session.state=prevState;session.contentStore=prevStore;session.contentStoreDirty=prevStoreDirty;log2("warn",`[${session.id}] codex compact forge failed (${String(err2)}); passing through to upstream`);return base}}function shouldInjectPromptCacheKey(routing,upstream){if(routing==="enabled")return true;if(routing==="disabled"||!upstream)return false;try{return new URL(upstream).hostname.toLowerCase()==="api.openai.com"}catch{return false}}function resolvePromptCacheKey(explicit,identity,routing,upstream){if(explicit?.trim())return explicit;if(!identity.clientProvided||!shouldInjectPromptCacheKey(routing,upstream))return void 0;return identity.value}var AUTO_MODE_CLASSIFIER_STOPS=new Set(["</severity>","</block>"]);function isAutoModeClassifier(parsed){const stops=parsed.stop_sequences;if(!Array.isArray(stops))return false;return stops.some(s3=>typeof s3==="string"&&AUTO_MODE_CLASSIFIER_STOPS.has(s3))}function effectiveAbsorbBlock(pluginMode,config,baseAbsorb){return pluginMode?resolveAbsorbSettings(baseAbsorb):config.absorb}function injectSystem(parsed,opts,prompts=defaultPrompts,config,noteId,surface,visibilityMarkers=true){const baseText=extractSystem(parsed.system);const parts=[];if(opts.compress.injectTool)parts.push(withConversationIdNote(withMarkerIntegrityNote(withSummaryBudgetNote(buildCompressSystemPrompt(prompts,surface?.promptSections)),visibilityMarkers),noteId));if(opts.compress.injectTool&&absorbEnabled(config))parts.push(buildAbsorbSystemPrompt(absorbToolName(config)));if(parts.length===0)return parsed.system;const full=baseText?`${baseText}
|
|
2290
|
+
${bodyBuffer.toString("utf8")}`)}catch(err2){logDumpFailure("INCOMING dump",err2)}}logRequestCost(log2,session.id,inboundMsgs,inboundBytes,reqT0,prepared.body);return{body:prepared.body,prepared}};const pendingForward=await withSessionLock(session,()=>runPreparedPipeline(true));if(pendingForward){forwarded=true;const overflowRefold=pendingForward.prepared?async realWindow=>{const next=await withSessionLock(session,()=>runPreparedPipeline(false,realWindow));if(!next||String(next.body)===String(pendingForward.body))return null;pendingForward.body=next.body;pendingForward.prepared=next.prepared;return next.body}:void 0;await forward(req,res,opts,pendingForward.body,pendingForward.prepared,core,reqConfig,log2,route,instanceId,affinity,overflowRefold);if(pendingForward.prepared){const preparedToRemember=pendingForward.prepared;await withSessionLock(session,()=>rememberPluginMessages(sessionId,preparedToRemember.processedMessages,preparedToRemember.originalMessages,preparedToRemember.nudge))}}}finally{releaseInFlight(session)}}if(!prepared&&!forwarded){if(protocol===null&&!opts.passthrough&&!routePassthrough&&!isModelDiscoveryPath(urlPath)){logUnrecognizedPath(log2,req.url??"")}await forward(req,res,opts,scrubAnthropicPck(protocol,bodyBuffer,log2),null,core,reqConfig,log2,route,instanceId,void 0)}}var ACP_TAG_MARK="<acp ";function withReasoningDrop(msgs,reasoning,log2,sessionId,strictEcho){if(strictEcho)return msgs;const out=dropCompressReasoning(msgs,reasoning);if(out.length!==msgs.length){log2("info",`[${sessionId}] compress-reasoning: dropped ${msgs.length-out.length} reasoning message(s) from closed compress turns (#651)`)}return out}function warnReasoningPairs(wireMessages,log2,sessionId){let withRc=0;let split=0;for(const m2 of wireMessages){const msg=m2;if(msg?.role!=="assistant")continue;const hasRc=typeof msg.reasoning_content==="string";if(hasRc)withRc++;else if(Array.isArray(msg.tool_calls)&&msg.tool_calls.length>0)split++}if(withRc>0&&split>0){log2("warn",`[${sessionId}] reasoning-pair-violated: ${split} assistant tool-call message(s) lack reasoning_content while ${withRc} carry it \u2014 strict-echo upstreams (DeepSeek thinking mode) will reject the request (#684)`)}}function warnAnthropicThinkingPairs(inboundMessages,outboundMessages,log2,sessionId){const thinkingIds=new Set;for(const m2 of inboundMessages){const msg=m2;if(msg?.role!=="assistant"||!Array.isArray(msg.content))continue;if(!msg.content.some(b2=>b2?.type==="thinking"))continue;for(const b2 of msg.content){if(b2?.type==="tool_use"&&typeof b2.id==="string")thinkingIds.add(b2.id)}}if(thinkingIds.size===0)return;let lost=0;const lostIds=[];for(const m2 of outboundMessages){const msg=m2;if(msg?.role!=="assistant"||!Array.isArray(msg.content))continue;if(msg.content.some(b2=>b2?.type==="thinking"))continue;for(const b2 of msg.content){if(b2?.type==="tool_use"&&typeof b2.id==="string"&&thinkingIds.has(b2.id)){lost++;lostIds.push(b2.id)}}}if(lost>0){log2("warn",`[${sessionId}] thinking-pair-violated: ${lost} tool_use block(s) lost their inbound thinking block in the outbound rebuild (${[...new Set(lostIds)].slice(0,3).join(", ")}) \u2014 a stripped signature pair is rejected by the API (#684)`)}}function warnResponsesReasoningPairs(input,log2,sessionId){let withReasoning=0;let split=0;let runs=0;const orphans=[];let runCalls=0;let runReasoning=0;let runIds=[];const closeRun=()=>{if(runCalls>0&&runReasoning===0){split+=runCalls;runs++;orphans.push(...runIds)}runCalls=0;runReasoning=0;runIds=[]};for(const item of input){const it2=item;const t=it2?.type;if(t==="reasoning"){withReasoning++;runReasoning++;continue}if(t==="function_call"||t==="custom_tool_call"){runCalls++;if(typeof it2.call_id==="string"&&it2.call_id)runIds.push(it2.call_id);continue}if(t==="function_call_output"||t==="custom_tool_call_output")continue;if(t==="message"&&it2.role==="assistant")continue;closeRun()}closeRun();if(withReasoning>0&&split>0){const named=orphans.slice(0,3).join(", ")+(orphans.length>3?`, \u2026+${orphans.length-3}`:"");log2("warn",`[${sessionId}] reasoning-pair-violated: ${split} tool-call item(s) in ${runs} assistant run(s) lack any reasoning item while ${withReasoning} exist (${named}) \u2014 strict-echo upstreams will reject the request (#684)`)}}function stripKernelSummaries(messages,state2){const carried=new Set;for(const b2 of state2.blocks){if(!b2.active||!b2.compressCallId)continue;if(messages.some(m2=>m2.contentType==="tool-call"&&m2.toolCallId===b2.compressCallId)){carried.add(`acp_summary_${b2.blockId}`)}}return messages.filter(m2=>!(m2.id??"").startsWith("acp_summary_")||!carried.has(m2.id))}var RESPONSES_TURN_SEPARATOR="[The exchange between these two assistant turns was compressed.]";function repairResponsesAssistantOrdering(folded,original){const runOf=new Map;const runHasBody=new Map;let run=0;let inRun=false;for(const m2 of original){if(m2.role==="assistant"){if(!inRun){run++;inRun=true}runOf.set(m2.id,run);if(m2.contentType!=="reasoning")runHasBody.set(run,true)}else{inRun=false}}const survivorCount=new Map;for(const m2 of folded){const r=m2.role==="assistant"?runOf.get(m2.id):void 0;if(r!==void 0)survivorCount.set(r,(survivorCount.get(r)??0)+1)}const out=[];let phase=-1;let seenReasoning=false;let sepSeq=0;const pushSeparator=()=>{sepSeq++;out.push({id:`acp_turn_sep_${sepSeq}`,role:"user",contentType:"text",text:RESPONSES_TURN_SEPARATOR});phase=-1;seenReasoning=false};for(const m2 of folded){if(m2.role!=="assistant"){out.push(m2);phase=-1;seenReasoning=false;continue}const kind=m2.contentType==="reasoning"?"reasoning":m2.contentType==="tool-call"?"tool-call":"message";const r=runOf.get(m2.id);if(kind==="reasoning"&&r!==void 0&&runHasBody.get(r)&&survivorCount.get(r)===1)continue;if(kind==="reasoning"&&(phase>0||seenReasoning)||kind==="message"&&phase===2)pushSeparator();out.push(m2);if(kind==="reasoning"){phase=Math.max(phase,0);seenReasoning=true}else if(kind==="message")phase=Math.max(phase,1);else phase=Math.max(phase,2)}return out}function diagTagSummary(messages,sessionId,strategy){let textTagged=0;let toolTagged=0;for(const m2 of messages){const hasTag=(m2.text??"").includes(ACP_TAG_MARK);if(!hasTag)continue;if(m2.contentType==="tool-call"||m2.contentType==="tool-result")toolTagged++;else textTagged++}return`[${sessionId}] processTurn: ${messages.length} msgs, renderTags=${strategy}, ${textTagged} text tagged, ${toolTagged} tool tagged (should be 0 with text-only)`}function diagNudge(turn,sessionId,tokenCount,limit,model,willInject){const n=turn.nudge;if(!n)return`[${sessionId}] nudge: unavailable`;const b2=n.breakdown??{};const pct2=limit>0?`${Math.round(tokenCount/limit*100)}%`:"?";const growth=b2["growth"]??0;const floor=b2["growthFloor"]??0;const interval=b2["nudgeGrowthTokens"]??0;const pendingT1=b2["pendingT1"]??0;const ref=b2["growthReference"]??0;const inject=willInject?n.shouldInject?`INJECT T${n.tier??"?"}`:`INJECT-ESC T${n.tier??"?"}`:n.shouldInject?`ARMED-SUPPRESSED T${n.tier??"?"}`:"idle";const modelTag=model?` model=${model}`:"";return`[${sessionId}] nudge ${inject}: usage=${pct2} (${tokenCount}/${limit}), growth=${growth}/${floor} (ref=${ref}, interval=${interval}), pendingT1=${pendingT1}/${interval}${modelTag}, reason="${n.reason.slice(0,120)}"`}function effectiveTokenCount(session,msgs,inboundImageTokens=0){if(session.stats.lastInputTokens>0&&session.stats.lastInputTokensSource==="usage")return session.stats.lastInputTokens;const raw=estimateCoreMessagesUpper(msgs)+inboundImageTokens;if(session.metadata.anonymousPrefixAffinity)return raw;const est=session.stats.localInputEstimate??0;if(est<=0)return 0;return Math.min(est,raw)}function usageGradeInputBaseline(session){return session.stats.lastInputTokensSource==="usage"?session.stats.lastInputTokens:0}function scrubAnthropicPck(protocol,bodyBuffer,log2){if(protocol!=="anthropic"||bodyBuffer.length===0)return bodyBuffer;let parsed;try{parsed=JSON.parse(bodyBuffer.toString("utf8"))}catch{return bodyBuffer}if(parsed===null||typeof parsed!=="object"||Array.isArray(parsed))return bodyBuffer;const p2=parsed;if(!Object.prototype.hasOwnProperty.call(p2,"prompt_cache_key"))return bodyBuffer;delete p2.prompt_cache_key;log2("debug",`stripped prompt_cache_key from verbatim anthropic forward (#1403)`);return Buffer.from(JSON.stringify(p2),"utf8")}async function prepareAnthropic(parsed,req,opts,core,config,prompts,surface,log2,session,pluginMode,upstreamOrigin,reasoning,visibilityMarkers){const sessionId=session.id;const stream2=parsed.stream===true;++session.stats.requests;const injectTools=opts.compress.injectTool&&!pluginMode;const stripReasoning=msgs=>withReasoningDrop(msgs,reasoning,log2,sessionId,isStrictReasoningEcho(session,upstreamOrigin,modelIdOf(parsed)));if(isAutoModeClassifier(parsed)){log2("info",`[${sessionId}] auto-mode classifier passthrough (skipping compress injection)`);return{body:JSON.stringify(parsed),session,processedMessages:[],originalMessages:[],anthropicSystem:parsed.system,protocol:"anthropic",stream:stream2,compressInjected:false,pluginMode,nudge:void 0,prompts,surface}}let processedMessages=[];let attachedRetrievals=[];let attachedRetrievalNoteIds=[];let originalMessages=[];let nudge;let rebuiltMessages=parsed.messages;let systemOut=parsed.system;let toolsOut=parsed.tools;let sysNotes=[];if(opts.stableSystemAnchor&&!pluginMode){const fresh=extractSystem(parsed.system);const outcome=reconcileSystemAnchor(session,"anthropic",fresh,sessionId,log2);sysNotes=outcome.notes;if(outcome.outbound!==fresh){parsed.system=buildSystem(outcome.outbound,parsed.system)}}const strippedPanels=stripAcpPanelMessages(parsed.messages);if(strippedPanels>0){log2("info",`[${sessionId}] stripped ${strippedPanels} ACP panel message(s) before projection (UI-only, issue #359)`)}const strippedMarkerLines=stripAcpStatusMarkers(parsed.messages);if(strippedMarkerLines>0){log2("info",`[${sessionId}] stripped ${strippedMarkerLines} ACP status marker line(s) from incoming history (ephemeral proxy status, issue #1029)`)}const strippedCarriers=stripEmbeddedChainCarriers(parsed,"anthropic");if(strippedCarriers>0){log2("info",`[${sessionId}] stripped ${strippedCarriers} embedded chain checkpoint(s) from incoming history (leaked egress control data, issue #1542)`)}try{const{msgs,cacheControls}=anthropicToCore(parsed);originalMessages=msgs;const inboundImageTokens=imageTokensInParsedBody("anthropic",parsed,imageBillingFor(opts,upstreamOrigin));projectThinkingMass(msgs,{providerInputTokens:session.stats.lastInputTokens,measured:session.stats.lastInputTokensSource==="usage",systemText:extractSystem(parsed.system),tools:parsed.tools,imageTokens:inboundImageTokens,storedOverhead:typeof session.metadata.systemPromptTokens==="number"?session.metadata.systemPromptTokens:void 0});const knownRefsBefore=new Set(Object.keys(session.state.messageRefs.byRaw));extractSystem(parsed.system);const tokenCount=effectiveTokenCount(session,msgs,inboundImageTokens);const activeBefore=new Set(session.state.blocks.filter(b2=>b2.active).map(b2=>b2.blockId));const absorbBlock=effectiveAbsorbBlock(pluginMode,config,opts.compress.absorb);const absorbTools=absorbToolsFor(absorbBlock?.toolName??ABSORB_TOOL_NAME);const absorbActive=absorbBlock?.enabled===true&&opts.compress.injectTool;const rulesActive=rulesEnabled(config)&&opts.compress.injectTool;const loopConfig=ccrLoopConfig(session,{...config,absorb:absorbActive?absorbBlock:void 0});const foldCoveredBefore=session.stats.pendingFoldUsage===true?new Set(session.state.blocks.flatMap(b2=>b2.active?b2.effectiveMessageIds:[])):null;const turn=core.processTurn({messages:msgs,state:session.state,config:loopConfig,tokenCount,renderTags:process.env.ACP_RENDER_NONE?"none":"text-only",contentStore:contentStoreOf(session)});session.state=turn.state;adoptContentStore(session,turn.contentStore);session.stats.compressCreditTokens=0;if(foldCoveredBefore!==null&&msgs.length>=REWRITE_MIN_INCOMING_TOTAL){const gap=foldCoverage(foldCoveredBefore,msgs.map(m2=>m2.id));if(gap)log2("warn",`[${sessionId}] [acp-drift] fold coverage mismatch: ${gap.matched}/${gap.expected} covered message id(s) present in resent history \u2014 ${gap.expected-gap.matched} covered id(s) missing from resent history \u2014 mutation (content edit invalidates content-hash refs, fold silently lost) or client-side deletion/truncation (benign, message no longer on the wire); observability complement to the #1328 overflow rescue (#1195)`)}storeEffectiveAbsorb(session,loopConfig);storeEffectiveRules(session,config);turn.messages=applyAbsorbView(turn.messages,session.state,loopConfig,tokenCount);if(turn.nudge)turn.nudge.compressibleRanges=viableRanges(turn.nudge.compressibleRanges);nudge=turn.nudge;session.stats.contextTokens=tokenCount;if(!session.meta.title){const t=deriveTitle(msgs);if(t)session.meta.title=t}log2("info",diagTagSummary(turn.messages,sessionId,"text-only"));const willInjectNudge=opts.compress.injectNudge&&!!turn.nudge&&(turn.nudge.shouldInject||emergencyNudge(turn.nudge));log2("info",diagNudge(turn,sessionId,tokenCount,config.modelContextLimit,parsed.model,willInjectNudge));processedMessages=stripReasoning(stripKernelSummaries(turn.messages,turn.state));{const rewrite=detectUnannouncedHistoryRewrite(session,knownRefsBefore,msgs.map(m2=>m2.id));if(rewrite.detected){log2("warn",`[${sessionId}] unannounced client history rewrite detected (${rewrite.knownIncoming}/${rewrite.incomingTotal} incoming message(s) carry pre-turn refs of ${rewrite.knownBefore} known) \u2014 marking compaction boundary (#1001)`);recordConflict(session,"unannounced-rewrite",`${rewrite.knownIncoming}/${rewrite.incomingTotal} incoming message(s) carry pre-turn refs of ${rewrite.knownBefore} known`);markCompactionBoundary(session)}}applyCompactionArchive(session,activeBefore,new Set(msgs.map(m2=>m2.id)),log2);reapOrphansLogged(session,msgs,log2,sessionId);await applyImageCompressionPass(session,processedMessages,{config,billing:imageBillingFor(opts,upstreamOrigin),log:log2});if(pluginMode&&ccrEnabled(session)){reconcileReloadedRetrievals(session);pruneExpiredRetrievals(session);attachedRetrievals=snapshotPendingRetrievals(session);if(attachedRetrievals.length>0)processedMessages=[...processedMessages,...attachedRetrievals.map(i=>i.injection)]}rebuiltMessages=coreToAnthropic(processedMessages,cacheControls);if(sysNotes.length>0){rebuiltMessages=[...rebuiltMessages,...sysNotes.map(text=>({role:"user",content:text}))]}systemOut=injectSystem(parsed,opts,prompts,loopConfig,ensureCanonicalId(session),surface,visibilityMarkers);if(injectTools){toolsOut=injectTool(parsed.tools,[...absorbActive?[absorbTools.anthropic]:[],...rulesActive?[RULE_TOOL]:[],...ccrEnabled(session)?[retrieveToolsFor(retrieveToolName(session)).anthropic]:[],...imageCompressionEnabled(session)?[IMAGE_FULL_TOOL]:[]],surface?.toolPrompts)}if(willInjectNudge&&turn.nudge){try{const rendered=renderNudgeText(turn.nudge,prompts,surface?.nudgeSections);if(rendered.text){rebuiltMessages=[...rebuiltMessages,{role:"user",content:withMarkerIntegrityNote(withSummaryBudgetNote(withStagedCompressGuidance(rendered.text)),visibilityMarkers)}]}}catch{}}const imgNote=imageFullTrailingNote(session);if(imgNote)rebuiltMessages=[...rebuiltMessages,{role:"user",content:imgNote}];const retrNotes=snapshotRetrievalNotes(session);const retrNote=renderRetrievalNotes(retrNotes);if(retrNote){rebuiltMessages=[...rebuiltMessages,{role:"user",content:retrNote}];attachedRetrievalNoteIds=retrNotes.map(n=>n.id)}}catch(err2){log2("warn",`[${sessionId}] kernel transform failed, forwarding unchanged: ${String(err2)}`);if(attachedRetrievals.length>0)dropRetrievals(session,attachedRetrievals.map(i=>i.ref),"prepare failed; forwarded unprocessed");processedMessages=[]}session.metadata.systemPromptTokens=countSystemAndToolsTokens(extractSystem(systemOut),toolsOut);snapshotMessages(session,originalMessages);markDirty(session);const rebuilt={...parsed,messages:rebuiltMessages,system:systemOut,tools:toolsOut};warnAnthropicThinkingPairs(parsed.messages,rebuiltMessages,log2,sessionId);delete rebuilt.prompt_cache_key;session.stats.localInputEstimate=estimateCoreMessagesUpper(processedMessages.length>0?processedMessages:originalMessages)+countSystemAndToolsTokens(extractSystem(systemOut),toolsOut)+imageTokensInParsedBody("anthropic",rebuilt,imageBillingFor(opts,upstreamOrigin));return{body:JSON.stringify(rebuilt),session,attachedRetrievals,attachedRetrievalNoteIds,processedMessages,originalMessages,anthropicSystem:parsed.system,systemNotes:sysNotes,protocol:"anthropic",stream:stream2,compressInjected:injectTools,pluginMode,nudge,prompts,surface,renderTags:process.env.ACP_RENDER_NONE?"none":"text-only",dropReasoning:stripReasoning}}async function prepareOpenai(parsed,req,opts,core,config,prompts,surface,log2,session,pluginMode,upstreamOrigin,nativeWindow,reasoning,visibilityMarkers,billingUpstream){const sessionId=session.id;const stream2=parsed.stream===true;++session.stats.requests;let openaiSystemText="";let sysNotes=[];const stripReasoning=msgs=>withReasoningDrop(msgs,reasoning,log2,sessionId,isStrictReasoningEcho(session,upstreamOrigin,modelIdOf(parsed)));let openaiOutboundSystem;let processedMessages=[];let attachedRetrievals=[];let attachedRetrievalNoteIds=[];let originalMessages=[];let nudge;let rebuiltMessages=parsed.messages;let toolsOut=parsed.tools;const maxTokens=typeof parsed.max_tokens==="number"?parsed.max_tokens:8192;const isTitleGen=maxTokens<=200;const shouldInject=opts.compress.injectTool&&!isTitleGen;const injectTools=shouldInject&&!pluginMode;const strippedPanels=stripAcpPanelMessages(parsed.messages);if(strippedPanels>0){log2("info",`[${sessionId}] stripped ${strippedPanels} ACP panel message(s) before projection (UI-only, issue #359)`)}const strippedMarkerLines=stripAcpStatusMarkers(parsed.messages);if(strippedMarkerLines>0){log2("info",`[${sessionId}] stripped ${strippedMarkerLines} ACP status marker line(s) from incoming history (ephemeral proxy status, issue #1029)`)}const strippedCarriers=stripEmbeddedChainCarriers(parsed,"openai");if(strippedCarriers>0){log2("info",`[${sessionId}] stripped ${strippedCarriers} embedded chain checkpoint(s) from incoming history (leaked egress control data, issue #1542)`)}try{const{msgs,systemText}=openaiToCore(parsed);openaiSystemText=systemText;warnDroppedOpenaiParts(parsed,sessionId,log2);if(opts.stableSystemAnchor&&!pluginMode&&!isTitleGen){const outcome=reconcileSystemAnchor(session,"openai",systemText,sessionId,log2);sysNotes=outcome.notes;openaiSystemText=outcome.outbound}originalMessages=msgs;const knownRefsBefore=new Set(Object.keys(session.state.messageRefs.byRaw));const tokenCount=effectiveTokenCount(session,msgs,imageTokensInParsedBody("openai",parsed,imageBillingFor(opts,billingUpstream??upstreamOrigin)));const activeBefore=new Set(session.state.blocks.filter(b2=>b2.active).map(b2=>b2.blockId));const absorbBlock=effectiveAbsorbBlock(pluginMode,config,opts.compress.absorb);const absorbTools=absorbToolsFor(absorbBlock?.toolName??ABSORB_TOOL_NAME);const absorbActive=absorbBlock?.enabled===true&&shouldInject;const rulesActive=rulesEnabled(config)&&shouldInject;const loopConfig=ccrLoopConfig(session,{...config,absorb:absorbActive?absorbBlock:void 0});const foldCoveredBefore=session.stats.pendingFoldUsage===true?new Set(session.state.blocks.flatMap(b2=>b2.active?b2.effectiveMessageIds:[])):null;const turn=core.processTurn({messages:msgs,state:session.state,config:loopConfig,tokenCount,renderTags:process.env.ACP_RENDER_NONE?"none":"text-only",contentStore:contentStoreOf(session)});session.state=turn.state;adoptContentStore(session,turn.contentStore);session.stats.compressCreditTokens=0;if(foldCoveredBefore!==null&&!isTitleGen&&msgs.length>=REWRITE_MIN_INCOMING_TOTAL){const gap=foldCoverage(foldCoveredBefore,msgs.map(m2=>m2.id));if(gap)log2("warn",`[${sessionId}] [acp-drift] fold coverage mismatch: ${gap.matched}/${gap.expected} covered message id(s) present in resent history \u2014 ${gap.expected-gap.matched} covered id(s) missing from resent history \u2014 mutation (content edit invalidates content-hash refs, fold silently lost) or client-side deletion/truncation (benign, message no longer on the wire); observability complement to the #1328 overflow rescue (#1195)`)}storeEffectiveAbsorb(session,loopConfig);storeEffectiveRules(session,config);turn.messages=applyAbsorbView(turn.messages,session.state,loopConfig,tokenCount);if(turn.nudge)turn.nudge.compressibleRanges=viableRanges(turn.nudge.compressibleRanges);nudge=turn.nudge;session.stats.contextTokens=tokenCount;if(!session.meta.title){const t=deriveTitle(msgs);if(t)session.meta.title=t}log2("info",diagTagSummary(turn.messages,sessionId,"text-only"));const willInjectNudge=opts.compress.injectNudge&&!!turn.nudge&&shouldInject&&(turn.nudge.shouldInject||emergencyNudge(turn.nudge));log2("info",diagNudge(turn,sessionId,tokenCount,config.modelContextLimit,parsed.model,willInjectNudge));processedMessages=stripReasoning(stripKernelSummaries(turn.messages,turn.state));{const rewrite=detectUnannouncedHistoryRewrite(session,knownRefsBefore,msgs.map(m2=>m2.id));if(rewrite.detected){log2("warn",`[${sessionId}] unannounced client history rewrite detected (${rewrite.knownIncoming}/${rewrite.incomingTotal} incoming message(s) carry pre-turn refs of ${rewrite.knownBefore} known) \u2014 marking compaction boundary (#1001)`);recordConflict(session,"unannounced-rewrite",`${rewrite.knownIncoming}/${rewrite.incomingTotal} incoming message(s) carry pre-turn refs of ${rewrite.knownBefore} known`);markCompactionBoundary(session)}}applyCompactionArchive(session,activeBefore,new Set(msgs.map(m2=>m2.id)),log2);reapOrphansLogged(session,msgs,log2,sessionId);await applyImageCompressionPass(session,processedMessages,{config,billing:imageBillingFor(opts,billingUpstream??upstreamOrigin),log:log2});if(pluginMode&&ccrEnabled(session)){reconcileReloadedRetrievals(session);pruneExpiredRetrievals(session);attachedRetrievals=snapshotPendingRetrievals(session);if(attachedRetrievals.length>0)processedMessages=[...processedMessages,...attachedRetrievals.map(i=>i.injection)]}rebuiltMessages=systemToUser(hardenOpenaiAssistantContent(coreToOpenai(processedMessages)));const sysParts=[];if(openaiSystemText)sysParts.push(openaiSystemText);if(shouldInject)sysParts.push(withConversationIdNote(withMarkerIntegrityNote(withSummaryBudgetNote(buildCompressSystemPrompt(prompts,surface?.promptSections)),visibilityMarkers),ensureCanonicalId(session)));if(absorbActive)sysParts.push(buildAbsorbSystemPrompt(absorbToolName(loopConfig)));rebuiltMessages=injectOpenaiSystem(rebuiltMessages,sysParts);if(sysNotes.length>0){rebuiltMessages=[...rebuiltMessages,...sysNotes.map(text=>({role:"user",content:text}))]}openaiOutboundSystem=sysParts.join("\n\n");if(injectTools){toolsOut=injectOpenaiTool(parsed.tools,[...absorbActive?[absorbTools.openai]:[],...rulesActive?[RULE_TOOL_OPENAI]:[],...ccrEnabled(session)?[retrieveToolsFor(retrieveToolName(session)).openai]:[],...imageCompressionEnabled(session)?[IMAGE_FULL_TOOL_OPENAI]:[]],surface?.toolPrompts)}if(willInjectNudge&&turn.nudge){try{const rendered=renderNudgeText(turn.nudge,prompts,surface?.nudgeSections);if(rendered.text){rebuiltMessages=[...rebuiltMessages,{role:"user",content:withMarkerIntegrityNote(withSummaryBudgetNote(withStagedCompressGuidance(rendered.text)),visibilityMarkers)}]}}catch{}}const imgNote=imageFullTrailingNote(session);if(imgNote)rebuiltMessages=[...rebuiltMessages,{role:"user",content:imgNote}];const retrNotes=snapshotRetrievalNotes(session);const retrNote=renderRetrievalNotes(retrNotes);if(retrNote){rebuiltMessages=[...rebuiltMessages,{role:"user",content:retrNote}];attachedRetrievalNoteIds=retrNotes.map(n=>n.id)}}catch(err2){log2("warn",`[${sessionId}] kernel transform failed, forwarding unchanged: ${String(err2)}`);if(attachedRetrievals.length>0)dropRetrievals(session,attachedRetrievals.map(i=>i.ref),"prepare failed; forwarded unprocessed");processedMessages=[]}rebuiltMessages=normalizeStrictEchoReasoning(rebuiltMessages,isStrictReasoningEcho(session,upstreamOrigin,modelIdOf(parsed)),log2,sessionId);const rebuilt={...parsed,messages:rebuiltMessages,tools:toolsOut};warnReasoningPairs(rebuiltMessages,log2,sessionId);clampOutgoingOutput(rebuilt,typeof parsed.max_completion_tokens==="number"?"max_completion_tokens":"max_tokens",{systemText:openaiSystemText,tools:toolsOut,processedMessages,lastInputTokens:session.stats.lastInputTokens,lastInputTokensSource:session.stats.lastInputTokensSource,nativeWindow,imageTokens:imageTokensInParsedBody("openai",rebuilt,imageBillingFor(opts,billingUpstream??upstreamOrigin))},sessionId,log2);delete rebuilt.prompt_cache_retention;if(stream2&&rebuilt.stream_options===void 0){rebuilt.stream_options={include_usage:true}}if(!isTitleGen&&openaiOutboundSystem!==void 0){session.metadata.systemPromptTokens=countSystemAndToolsTokens(openaiOutboundSystem,toolsOut)}if(!isTitleGen){session.stats.localInputEstimate=estimateCoreMessagesUpper(processedMessages.length>0?processedMessages:originalMessages)+countSystemAndToolsTokens(openaiOutboundSystem||openaiSystemText,toolsOut)+imageTokensInParsedBody("openai",rebuilt,imageBillingFor(opts,billingUpstream??upstreamOrigin))}snapshotMessages(session,originalMessages);markDirty(session);return{body:JSON.stringify(rebuilt),session,attachedRetrievals,attachedRetrievalNoteIds,processedMessages,originalMessages,protocol:"openai",stream:stream2,compressInjected:injectTools,pluginMode,nudge,prompts,surface,openaiSystemText,systemNotes:sysNotes,renderTags:process.env.ACP_RENDER_NONE?"none":"text-only",dropReasoning:stripReasoning}}function appendGoogleNudge(contents,text){const last=contents[contents.length-1];if(last&&(last.role??"user")!=="model"){const parts=Array.isArray(last.parts)?last.parts:[];return[...contents.slice(0,-1),{...last,parts:[...parts,{text}]}]}return[...contents,{role:"user",parts:[{text}]}]}async function prepareGoogle(parsed,opts,core,config,prompts,surface,log2,session,pluginMode,nativeWindow,model,stream2,visibilityMarkers,upstreamOrigin){const sessionId=session.id;++session.stats.requests;let googleClientSystem="";let sysNotes=[];let googleOutboundSystem;let systemInstruction=parsed.systemInstruction;let processedMessages=[];let originalMessages=[];let nudge;let rebuiltContents=Array.isArray(parsed.contents)?parsed.contents:[];let toolsOut=parsed.tools;const genConfig=parsed.generationConfig;const declaredMax=genConfig?genConfig.maxOutputTokens:void 0;const maxTokens=typeof declaredMax==="number"?declaredMax:8192;const isTitleGen=maxTokens<=200;const shouldInject=opts.compress.injectTool&&!isTitleGen;const injectTools=shouldInject&&!pluginMode;const strippedCarriers=stripEmbeddedChainCarriers(parsed,"google");if(strippedCarriers>0){log2("info",`[${sessionId}] stripped ${strippedCarriers} embedded chain checkpoint(s) from incoming history (leaked egress control data, issue #1542)`)}try{const{msgs,systemText}=googleToCore(parsed);googleClientSystem=systemText;if(opts.stableSystemAnchor&&!pluginMode&&!isTitleGen){const outcome=reconcileSystemAnchor(session,"google",systemText,sessionId,log2);sysNotes=outcome.notes;googleClientSystem=outcome.outbound}originalMessages=msgs;const tokenCount=effectiveTokenCount(session,msgs,imageTokensInParsedBody("google",parsed,imageBillingFor(opts,upstreamOrigin)));const activeBefore=new Set(session.state.blocks.filter(b2=>b2.active).map(b2=>b2.blockId));const absorbBlock=effectiveAbsorbBlock(pluginMode,config,opts.compress.absorb);const absorbTools=absorbToolsFor(absorbBlock?.toolName??ABSORB_TOOL_NAME);const absorbActive=absorbBlock?.enabled===true&&shouldInject;const rulesActive=rulesEnabled(config)&&shouldInject;const loopConfig=ccrLoopConfig(session,{...config,absorb:absorbActive?absorbBlock:void 0});const foldCoveredBefore=session.stats.pendingFoldUsage===true?new Set(session.state.blocks.flatMap(b2=>b2.active?b2.effectiveMessageIds:[])):null;const turn=core.processTurn({messages:msgs,state:session.state,config:loopConfig,tokenCount,renderTags:"text-only",contentStore:contentStoreOf(session)});session.state=turn.state;adoptContentStore(session,turn.contentStore);session.stats.compressCreditTokens=0;if(foldCoveredBefore!==null&&!isTitleGen&&msgs.length>=REWRITE_MIN_INCOMING_TOTAL){const gap=foldCoverage(foldCoveredBefore,msgs.map(m2=>m2.id));if(gap)log2("warn",`[${sessionId}] [acp-drift] fold coverage mismatch: ${gap.matched}/${gap.expected} covered message id(s) present in resent history \u2014 ${gap.expected-gap.matched} covered id(s) missing from resent history \u2014 mutation (content edit invalidates content-hash refs, fold silently lost) or client-side deletion/truncation (benign, message no longer on the wire); observability complement to the #1328 overflow rescue (#1195)`)}storeEffectiveAbsorb(session,loopConfig);storeEffectiveRules(session,config);turn.messages=applyAbsorbView(turn.messages,session.state,loopConfig,tokenCount);if(turn.nudge)turn.nudge.compressibleRanges=viableRanges(turn.nudge.compressibleRanges);nudge=turn.nudge;session.stats.contextTokens=tokenCount;if(!session.meta.title){const t=deriveTitle(msgs);if(t)session.meta.title=t}log2("info",diagTagSummary(turn.messages,sessionId,"text-only"));const willInjectNudge=opts.compress.injectNudge&&!!turn.nudge&&shouldInject&&(turn.nudge.shouldInject||emergencyNudge(turn.nudge));log2("info",diagNudge(turn,sessionId,tokenCount,config.modelContextLimit,model,willInjectNudge));processedMessages=stripKernelSummaries(turn.messages,turn.state);applyCompactionArchive(session,activeBefore,new Set(msgs.map(m2=>m2.id)),log2);reapOrphansLogged(session,msgs,log2,sessionId);await applyImageCompressionPass(session,processedMessages,{config,billing:imageBillingFor(opts,upstreamOrigin),log:log2});rebuiltContents=coreToGoogle(processedMessages);const sysParts=[];if(googleClientSystem)sysParts.push(googleClientSystem);if(shouldInject)sysParts.push(withConversationIdNote(withMarkerIntegrityNote(withSummaryBudgetNote(buildCompressSystemPrompt(prompts,surface?.promptSections)),visibilityMarkers),ensureCanonicalId(session)));if(absorbActive)sysParts.push(buildAbsorbSystemPrompt(absorbToolName(loopConfig)));googleOutboundSystem=sysParts.join("\n\n");const extraSystemParts=sysParts.slice(googleClientSystem?1:0);systemInstruction=extraSystemParts.length>0?{parts:sysParts.map(text=>({text}))}:parsed.systemInstruction;if(injectTools){toolsOut=injectGoogleTool(parsed.tools,[...absorbActive?[absorbTools.google]:[],...rulesActive?[RULE_TOOL_GOOGLE]:[],...ccrEnabled(session)?[retrieveToolsFor(retrieveToolName(session)).google]:[],...imageCompressionEnabled(session)?[IMAGE_FULL_TOOL_GOOGLE]:[]],surface?.toolPrompts)}if(sysNotes.length>0){rebuiltContents=appendGoogleNudge(rebuiltContents,sysNotes.join("\n\n---\n\n"))}if(willInjectNudge&&turn.nudge){try{const rendered=renderNudgeText(turn.nudge,prompts,surface?.nudgeSections);if(rendered.text){rebuiltContents=appendGoogleNudge(rebuiltContents,withMarkerIntegrityNote(withStagedCompressGuidance(rendered.text),visibilityMarkers))}}catch{}}const imgNote=imageFullTrailingNote(session);if(imgNote)rebuiltContents=appendGoogleNudge(rebuiltContents,imgNote)}catch(err2){log2("warn",`[${sessionId}] kernel transform failed, forwarding unchanged: ${String(err2)}`);processedMessages=[]}const rebuilt={...parsed,contents:rebuiltContents,tools:toolsOut,systemInstruction};clampOutgoingOutput(rebuilt,"generationConfig.maxOutputTokens",{systemText:googleClientSystem,tools:toolsOut,processedMessages,lastInputTokens:session.stats.lastInputTokens,lastInputTokensSource:session.stats.lastInputTokensSource,nativeWindow,imageTokens:imageTokensInParsedBody("google",rebuilt)},sessionId,log2);if(!isTitleGen&&googleOutboundSystem!==void 0){session.metadata.systemPromptTokens=countSystemAndToolsTokens(googleOutboundSystem,toolsOut)}snapshotMessages(session,originalMessages);markDirty(session);return{body:JSON.stringify(rebuilt),session,processedMessages,originalMessages,protocol:"google",stream:stream2,compressInjected:injectTools,pluginMode,nudge,prompts,surface,google:{system:googleClientSystem,model},systemNotes:sysNotes,renderTags:"text-only"}}function prepareGoogleCountTokens(parsed,core,config,log2,session){const sessionId=session.id;try{const{msgs}=googleToCore(parsed);const turn=core.processTurn({messages:msgs,state:session.state,config:ccrLoopConfig(session,config),tokenCount:usageGradeInputBaseline(session),renderTags:"text-only",contentStore:contentStoreOf(session)});const stripped=stripKernelSummaries(turn.messages,turn.state);const rebuilt={...parsed,contents:coreToGoogle(stripped)};log2("info",`[${sessionId}] countTokens pruned: ${msgs.length} \u2192 ${stripped.length} msgs`);return{body:JSON.stringify(rebuilt),session,processedMessages:[],originalMessages:msgs,protocol:"google",stream:false,compressInjected:false}}catch(err2){log2("warn",`[${sessionId}] countTokens prune failed, forwarding unchanged: ${String(err2)}`);return{body:JSON.stringify({...parsed}),session,processedMessages:[],originalMessages:[],protocol:"google",stream:false,compressInjected:false}}}async function prepareResponses(parsed,req,opts,core,config,prompts,surface,log2,session,identity,pluginMode,upstreamOrigin,nativeWindow,reasoning,visibilityMarkers,billingUpstream){const sessionId=session.id;const stream2=parsed.stream===true;++session.stats.requests;const stripReasoning=msgs=>withReasoningDrop(msgs,reasoning,log2,sessionId,isStrictReasoningEcho(session,upstreamOrigin,modelIdOf(parsed)));if(reconcileNativeCompactionBoundary(session)){log2("info",`[${sessionId}] reconciled ACP state after native Responses compact boundary`)}let echoReplaced=false;if(Array.isArray(parsed.input)){const{items,replaced,dropped}=replaceBiliCompactionItems(parsed.input);if(replaced+dropped>0){if(replaced>0)echoReplaced=true;log2("info",`[${sessionId}] replaced ${replaced} echoed bili compaction item(s) with summary handoff message(s)${dropped>0?`, dropped ${dropped} legacy marker item(s)`:""}`);parsed.input=items}}let processedMessages=[];let originalMessages=[];let nudge;let responsesProjection;let rebuiltInput=parsed.input;let toolsOut=parsed.tools;let transformOk=false;let responsesDevContent;let sysNotes=[];const typedItems=normalizeResponsesMessageItems(parsed.input);if(typedItems>0){log2("info",`[${sessionId}] stamped type:"message" on ${typedItems} type-less input item(s) before projection (omp wire form)`)}sanitizeResponsesInputIds(parsed.input);const droppedEmpty=dropWhitespaceResponsesMessages(parsed.input);if(droppedEmpty>0){log2("info",`[${sessionId}] dropped ${droppedEmpty} whitespace-only message item(s) before projection (flattened-turn artifact)`)}const strippedPanels=stripAcpPanelResponsesInput(parsed.input);if(strippedPanels>0){log2("info",`[${sessionId}] stripped ${strippedPanels} ACP panel message(s) before projection (UI-only, issue #359)`)}const strippedMarkerLines=stripAcpStatusMarkers(parsed.input);if(strippedMarkerLines>0){log2("info",`[${sessionId}] stripped ${strippedMarkerLines} ACP status marker line(s) from incoming history (ephemeral proxy status, issue #1029)`)}const strippedCarriers=stripEmbeddedChainCarriers(parsed,"responses");if(strippedCarriers>0){log2("info",`[${sessionId}] stripped ${strippedCarriers} embedded chain checkpoint(s) from incoming history (leaked egress control data, issue #1542)`)}const shouldInject=opts.compress.injectTool;const injectTools=shouldInject&&!pluginMode;const isCompactionTrigger=hasCompactionTrigger(parsed.input);const responsesTextProtocol=FORCE_TEXT_PROTOCOL||resolveCompressProtocol(opts.routes,upstreamOrigin)==="marker";const renderTags=process.env.ACP_RENDER_NONE||isCompactionTrigger?"none":"text-only";try{const projection=responsesToCoreWithToolImages(parsed);responsesProjection=projection;if(opts.stableSystemAnchor&&!pluginMode&&!isCompactionTrigger){const fresh=projection.systemParts.join("\n\n---\n\n");const outcome=reconcileSystemAnchor(session,"responses",fresh,sessionId,log2);sysNotes=outcome.notes;if(outcome.outbound!==fresh)projection.systemParts=outcome.outbound?[outcome.outbound]:[]}const{msgs}=projection;originalMessages=msgs;if(process.env.ACP_DEBUG){log2("info",`[${sessionId}] input items: ${Array.isArray(parsed.input)?parsed.input.map(i=>i.type).join(","):"(string)"}`)}const tokenCount=effectiveTokenCount(session,msgs,imageTokensInParsedBody("responses",parsed,imageBillingFor(opts,billingUpstream??upstreamOrigin)));const absorbBlock=effectiveAbsorbBlock(pluginMode,config,opts.compress.absorb);const absorbTools=absorbToolsFor(absorbBlock?.toolName??ABSORB_TOOL_NAME);const absorbActive=absorbBlock?.enabled===true&&shouldInject&&!isCompactionTrigger&&!responsesTextProtocol;const rulesActive=rulesEnabled(config)&&shouldInject&&!isCompactionTrigger&&!responsesTextProtocol;const loopConfig=ccrLoopConfig(session,{...config,absorb:absorbActive?absorbBlock:void 0});const foldCoveredBefore=session.stats.pendingFoldUsage===true?new Set(session.state.blocks.flatMap(b2=>b2.active?b2.effectiveMessageIds:[])):null;const turn=core.processTurn({messages:msgs,state:session.state,config:loopConfig,tokenCount,renderTags,contentStore:contentStoreOf(session)});session.state=turn.state;adoptContentStore(session,turn.contentStore);session.stats.compressCreditTokens=0;if(foldCoveredBefore!==null&&!isCompactionTrigger&&msgs.length>=REWRITE_MIN_INCOMING_TOTAL){const gap=foldCoverage(foldCoveredBefore,msgs.map(m2=>m2.id));if(gap)log2("warn",`[${sessionId}] [acp-drift] fold coverage mismatch: ${gap.matched}/${gap.expected} covered message id(s) present in resent history \u2014 ${gap.expected-gap.matched} covered id(s) missing from resent history \u2014 mutation (content edit invalidates content-hash refs, fold silently lost) or client-side deletion/truncation (benign, message no longer on the wire); observability complement to the #1328 overflow rescue (#1195)`)}storeEffectiveAbsorb(session,loopConfig);storeEffectiveRules(session,config);turn.messages=applyAbsorbView(turn.messages,session.state,loopConfig,tokenCount);if(turn.nudge)turn.nudge.compressibleRanges=viableRanges(turn.nudge.compressibleRanges);nudge=turn.nudge;session.stats.contextTokens=tokenCount;if(!session.meta.title){const t=deriveTitle(msgs);if(t)session.meta.title=t}log2("info",diagTagSummary(turn.messages,sessionId,"text-only"));const willInjectNudge=opts.compress.injectNudge&&!!turn.nudge&&shouldInject&&!isCompactionTrigger&&(turn.nudge.shouldInject||emergencyNudge(turn.nudge));log2("info",diagNudge(turn,sessionId,tokenCount,config.modelContextLimit,parsed.model,willInjectNudge));processedMessages=repairResponsesAssistantOrdering(stripReasoning(stripKernelSummaries(turn.messages,turn.state)),originalMessages);reapOrphansLogged(session,msgs,log2,sessionId);await applyImageCompressionPass(session,processedMessages,{config,billing:imageBillingFor(opts,billingUpstream??upstreamOrigin),log:log2});rebuiltInput=patchResponsesInputWithToolImages(projection,processedMessages);if(Array.isArray(rebuiltInput))rebuiltInput=hoistTrappedToolItems(rebuiltInput);const forgedSummaries=echoReplaced?[]:session.metadata.codexForgedSummaries??[];if(shouldInject&&!isCompactionTrigger&&!process.env.ACP_NO_COMPRESS_PROMPT){const prompt=withConversationIdNote(withMarkerIntegrityNote(withSummaryBudgetNote(responsesTextProtocol?buildCompressHybridSystemPrompt(prompts,surface?.promptSections):buildCompressSystemPrompt(prompts,surface?.promptSections)),visibilityMarkers),ensureCanonicalId(session));const devParts=[...projection.systemParts,...forgedSummaries,prompt];if(absorbActive)devParts.push(buildAbsorbSystemPrompt(absorbToolName(loopConfig)));const devContent=devParts.join("\n\n---\n\n");responsesDevContent=devContent;rebuiltInput=injectResponsesDeveloperMessage(rebuiltInput,devContent);if(!process.env.ACP_NO_INJECT_TOOL&&injectTools){const respExtra=[...absorbActive?[absorbTools.responses]:[],...rulesActive?[RULE_TOOL_RESPONSES]:[],...ccrEnabled(session)?[retrieveToolsFor(retrieveToolName(session)).responses]:[],...imageCompressionEnabled(session)?[IMAGE_FULL_TOOL_RESPONSES]:[]];toolsOut=responsesTextProtocol?injectResponsesTool(parsed.tools,BILI_ACP_READONLY_TOOLS_RESPONSES,surface?.toolPrompts):injectResponsesTool(parsed.tools,respExtra.length>0?[...BILI_ACP_TOOLS_RESPONSES,...respExtra]:BILI_ACP_TOOLS_RESPONSES,surface?.toolPrompts)}}else if(projection.systemParts.length>0||forgedSummaries.length>0){const devContent=[...projection.systemParts,...forgedSummaries].join("\n\n---\n\n");responsesDevContent=devContent;rebuiltInput=injectResponsesDeveloperMessage(rebuiltInput,devContent)}if(sysNotes.length>0){const inputItems=typeof rebuiltInput==="string"?[{type:"message",role:"user",content:rebuiltInput}]:rebuiltInput;for(const text of sysNotes){inputItems.push({type:"message",role:"user",content:text})}rebuiltInput=inputItems}if(willInjectNudge&&turn.nudge){try{const rendered=renderNudgeText(turn.nudge,prompts,surface?.nudgeSections);if(rendered.text){const inputItems=typeof rebuiltInput==="string"?[{type:"message",role:"user",content:rebuiltInput}]:rebuiltInput;inputItems.push({type:"message",role:"user",content:withMarkerIntegrityNote(withSummaryBudgetNote(withStagedCompressGuidance(rendered.text)),visibilityMarkers)});rebuiltInput=inputItems}}catch{}}const imgNote=imageFullTrailingNote(session);if(imgNote&&!isCompactionTrigger){const inputItems=typeof rebuiltInput==="string"?[{type:"message",role:"user",content:rebuiltInput}]:rebuiltInput;inputItems.push({type:"message",role:"user",content:imgNote});rebuiltInput=inputItems}transformOk=true}catch(err2){log2("warn",`[${sessionId}] kernel transform failed, forwarding unchanged: ${String(err2)}`);processedMessages=[]}let codexForge;if(transformOk&&codexCompactMode()==="intercept"&&isCodexClient(req.headers)&&hasCompactionTrigger(parsed.input)&&codexCompactGate(session,config.modelContextLimit,transformOk)){const summaries=session.state.blocks.filter(b2=>b2.active).map(b2=>b2.summary);const prevForged=session.metadata.codexForgedSummaries;const captured=mergeForgedSummaries(prevForged,session.state.blocks);if(captured.length!==(prevForged?.length??0)){session.metadata.codexForgedSummaries=captured;markDirty(session)}const est=defaultCountTokens(typeof parsed.input==="string"?parsed.input:JSON.stringify(parsed.input??""));const total=Math.max(session.stats.lastInputTokens,est,1);codexForge={kind:"trigger",...buildTriggerForgeBody(summaries.join("\n\n"),{inputTokens:total,outputTokens:0,totalTokens:total},stream2)};log2("info",`[${sessionId}] codex compact intercepted (trigger); forged SSE with ${summaries.length} block summary(s), upstream not contacted`)}if(Array.isArray(rebuiltInput))rebuiltInput=normalizeStrictEchoResponsesInput(rebuiltInput,isStrictReasoningEcho(session,upstreamOrigin,modelIdOf(parsed)),log2,sessionId);const rebuilt={...parsed,input:rebuiltInput,tools:toolsOut};warnResponsesReasoningPairs(Array.isArray(rebuiltInput)?rebuiltInput:[],log2,sessionId);if(!isCompactionTrigger){clampOutgoingOutput(rebuilt,"max_output_tokens",{systemText:(responsesProjection?.systemParts??[]).join("\n"),tools:toolsOut,processedMessages,lastInputTokens:session.stats.lastInputTokens,lastInputTokensSource:session.stats.lastInputTokensSource,nativeWindow,imageTokens:imageTokensInParsedBody("responses",rebuilt,imageBillingFor(opts,billingUpstream??upstreamOrigin))},sessionId,log2)}const promptCacheKey=resolvePromptCacheKey(rebuilt.prompt_cache_key,identity,opts.promptCache.routing,upstreamOrigin);if(promptCacheKey&&!rebuilt.prompt_cache_key)rebuilt.prompt_cache_key=promptCacheKey;if(process.env.ACP_KEEP_RESPONSE_ID!=="1")delete rebuilt.previous_response_id;delete rebuilt.instructions;delete rebuilt.prompt_cache_retention;if(process.env.ACP_DEBUG){const fwdTools=(Array.isArray(toolsOut)?toolsOut:[]).map(t=>{const r=t;const sub=Array.isArray(r.tools)?`(${r.tools.length} sub)`:"";return`${r.type}:${r.name??"?"}${sub}`});log2("info",`[${sessionId}] responses forward tools=[${fwdTools.join(",")}] injectTool=${injectTools}${pluginMode?" (plugin mode: wire injection suppressed)":""} NO_INJECT_TOOL=${!!process.env.ACP_NO_INJECT_TOOL} NO_COMPRESS_PROMPT=${!!process.env.ACP_NO_COMPRESS_PROMPT}`)}if(transformOk){session.metadata.systemPromptTokens=countSystemAndToolsTokens(responsesDevContent??"",toolsOut)}if(!isCompactionTrigger){session.stats.localInputEstimate=estimateCoreMessagesUpper(processedMessages.length>0?processedMessages:originalMessages)+countSystemAndToolsTokens(responsesDevContent??"",toolsOut)+imageTokensInParsedBody("responses",rebuilt,imageBillingFor(opts,billingUpstream??upstreamOrigin))}snapshotMessages(session,originalMessages);markDirty(session);return{body:JSON.stringify(rebuilt),session,processedMessages,originalMessages,responsesProjection,systemNotes:sysNotes,protocol:"responses",stream:stream2,compressInjected:injectTools&&!isCompactionTrigger,pluginMode,responsesTextProtocol,nudge,prompts,surface,renderTags,resetAfterSuccess:isCompactionTrigger,codexForge,dropReasoning:stripReasoning}}function isCountTokensRequest(method,urlPath,hasBody){return method==="POST"&&hasBody&&process.env.ACP_COUNT_TOKENS_PASSTHROUGH!=="1"&&(urlPath.endsWith("/messages/count_tokens")||googlePathKind(urlPath)==="count-tokens")}function prepareCountTokens(parsed,core,config,log2,session){const sessionId=session.id;try{const{msgs,cacheControls}=anthropicToCore(parsed);const turn=core.processTurn({messages:msgs,state:session.state,config:ccrLoopConfig(session,config),tokenCount:usageGradeInputBaseline(session),renderTags:process.env.ACP_RENDER_NONE?"none":"text-only",contentStore:contentStoreOf(session)});const stripped=stripKernelSummaries(turn.messages,turn.state);const rebuiltMessages=coreToAnthropic(stripped,cacheControls);log2("info",`[${sessionId}] count_tokens pruned: ${msgs.length} \u2192 ${stripped.length} msgs`);const rebuilt={...parsed,messages:rebuiltMessages};delete rebuilt.prompt_cache_key;return{body:JSON.stringify(rebuilt),session,processedMessages:[],originalMessages:msgs,protocol:"anthropic",stream:false,compressInjected:false}}catch(err2){log2("warn",`[${sessionId}] count_tokens prune failed, forwarding unchanged: ${String(err2)}`);const fallback={...parsed};delete fallback.prompt_cache_key;return{body:JSON.stringify(fallback),session,processedMessages:[],originalMessages:[],protocol:"anthropic",stream:false,compressInjected:false}}}function prepareResponsesCompact(body,parsed,session,req,core,config,log2){++session.stats.requests;const cleaned=Array.isArray(parsed.input)?stripBiliCompactionItems(parsed.input):parsed.input;const stripped=Array.isArray(parsed.input)&&cleaned.length!==parsed.input.length;const forgeBody={...parsed,input:cleaned};const base={body:stripped?Buffer.from(JSON.stringify(forgeBody)):body,session,processedMessages:[],originalMessages:[],protocol:"responses",stream:parsed.stream===true,compressInjected:false,resetAfterSuccess:true};if(codexCompactMode()!=="intercept"||!isCodexClient(req.headers)||!Array.isArray(parsed.input)||!codexCompactGatePre(session,config.modelContextLimit)){return base}const prevState=session.state;const prevStore=session.contentStore;const prevStoreDirty=session.contentStoreDirty===true;let transformOk=false;try{const projection=responsesToCoreWithToolImages(forgeBody);const compactConfig=ccrLoopConfig(session,{...config,absorb:void 0});const turn=core.processTurn({messages:projection.msgs,state:session.state,config:compactConfig,tokenCount:usageGradeInputBaseline(session),renderTags:process.env.ACP_RENDER_NONE?"none":"text-only",contentStore:contentStoreOf(session)});session.state=turn.state;adoptContentStore(session,turn.contentStore);transformOk=true;if(!codexCompactGate(session,config.modelContextLimit,transformOk)){session.state=prevState;session.contentStore=prevStore;session.contentStoreDirty=prevStoreDirty;return base}const viewed=applyAbsorbView(turn.messages,turn.state,compactConfig,usageGradeInputBaseline(session));const processed=repairResponsesAssistantOrdering(stripKernelSummaries(viewed,turn.state),projection.msgs);let output=patchResponsesInputWithToolImages(projection,processed);if(typeof output==="string"){session.state=prevState;session.contentStore=prevStore;session.contentStoreDirty=prevStoreDirty;return base}output=hoistTrappedToolItems(output);snapshotMessages(session,projection.msgs);markDirty(session);log2("info",`[${session.id}] codex compact intercepted (endpoint); forged history with ${output.length} item(s), upstream not contacted`);return{...base,codexForge:{kind:"endpoint",body:JSON.stringify({output}),contentType:"application/json"}}}catch(err2){session.state=prevState;session.contentStore=prevStore;session.contentStoreDirty=prevStoreDirty;log2("warn",`[${session.id}] codex compact forge failed (${String(err2)}); passing through to upstream`);return base}}function shouldInjectPromptCacheKey(routing,upstream){if(routing==="enabled")return true;if(routing==="disabled"||!upstream)return false;try{return new URL(upstream).hostname.toLowerCase()==="api.openai.com"}catch{return false}}function resolvePromptCacheKey(explicit,identity,routing,upstream){if(explicit?.trim())return explicit;if(!identity.clientProvided||!shouldInjectPromptCacheKey(routing,upstream))return void 0;return identity.value}var AUTO_MODE_CLASSIFIER_STOPS=new Set(["</severity>","</block>"]);function isAutoModeClassifier(parsed){const stops=parsed.stop_sequences;if(!Array.isArray(stops))return false;return stops.some(s3=>typeof s3==="string"&&AUTO_MODE_CLASSIFIER_STOPS.has(s3))}function effectiveAbsorbBlock(pluginMode,config,baseAbsorb){return pluginMode?resolveAbsorbSettings(baseAbsorb):config.absorb}function injectSystem(parsed,opts,prompts=defaultPrompts,config,noteId,surface,visibilityMarkers=true){const baseText=extractSystem(parsed.system);const parts=[];if(opts.compress.injectTool)parts.push(withConversationIdNote(withMarkerIntegrityNote(withSummaryBudgetNote(buildCompressSystemPrompt(prompts,surface?.promptSections)),visibilityMarkers),noteId));if(opts.compress.injectTool&&absorbEnabled(config))parts.push(buildAbsorbSystemPrompt(absorbToolName(config)));if(parts.length===0)return parsed.system;const full=baseText?`${baseText}
|
|
2291
2291
|
|
|
2292
2292
|
---
|
|
2293
2293
|
|
|
@@ -2300,7 +2300,7 @@ ${hdrText}
|
|
|
2300
2300
|
|
|
2301
2301
|
---
|
|
2302
2302
|
|
|
2303
|
-
${buildAbsorbSystemPrompt(absorbToolName(loopConfig))}`:"";const visibilityMarkers=resolveCompress(opts.routes,route?.rewrittenUrl,parsedReq.model,opts.compress).visibilityMarkers??true;const systemPrompt=withConversationIdNote(withMarkerIntegrityNote(withSummaryBudgetNote(textProtocol?buildCompressHybridSystemPrompt(prepared.prompts??defaultPrompts,prepared.surface?.promptSections):buildCompressSystemPrompt(prepared.prompts??defaultPrompts,prepared.surface?.promptSections)),visibilityMarkers),ensureCanonicalId(prepared.session))+absorbSection;const adapter=pickAdapter(prepared.protocol,parsedReq,textProtocol,prepared.responsesProjection,prepared.anthropicSystem,prepared.openaiSystemText,absorbActive?absorbToolName(loopConfig):void 0,prepared.google,prepared.systemNotes,opts.streamErrorShape);const refreshFolded=async current=>{return withSessionLock(prepared.session,async()=>{const turn=core.processTurn({messages:prepared.originalMessages,state:prepared.session.state,config:loopConfig,tokenCount:prepared.session.stats.lastInputTokens,renderTags:prepared.renderTags??"text-only",contentStore:contentStoreOf(prepared.session)});prepared.session.state=turn.state;adoptContentStore(prepared.session,turn.contentStore);const viewed=applyAbsorbView(turn.messages,turn.state,loopConfig,prepared.session.stats.lastInputTokens);const records=current.filter(m2=>typeof m2.id==="string"&&m2.id.startsWith("acp_loop_"));const out=[...stripKernelSummaries(viewed,turn.state),...records];await applyImageCompressionPass(prepared.session,out,{config:loopConfig,billing:imageBillingFor(opts,route?.rewrittenUrl),log:ctx.log});const imgNote=imageFullTrailingNote(prepared.session);if(imgNote)out.push({id:"bili_image_full_note",role:"user",contentType:"text",text:imgNote});return repairResponsesAssistantOrdering(out,prepared.originalMessages)})};const loopDumpDir=opts.dumpSse;const loop=runCompressLoop(streamToRead,{core,config,messages:prepared.processedMessages.length>0?prepared.processedMessages:prepared.originalMessages,compressMessages:prepared.originalMessages,session:prepared.session,log:ctx.log,proxyUrl,upstreamOrigin:targetOrigin,protocol:prepared.protocol,textProtocol,debug:opts.debug,refreshFolded,visibilityMarkers,dumpSse:loopDumpDir?(name,stream2)=>dumpStreamToFile(stream2,loopDumpDir,name):void 0},parsedReq,{url:upstreamUrl,headers:reqHeaders,wireTransform},adapter,systemPrompt,clientAbort.signal);let protocolFragmentWarned=false;for await(const chunk of loop){if(res.destroyed||res.writableEnded)break;{const s3=chunk.toString("utf8");if(s3.includes("<acp ")||s3.includes("</acp")){log2("warn",`[${prepared.session.id}] tag echo: ${prepared.protocol} response stream contains <acp tag`)}else if(!protocolFragmentWarned&&containsToolCallXmlFragment(s3)){protocolFragmentWarned=true;log2("warn",`[${prepared.session.id}] tag echo: ${prepared.protocol} response stream contains tool-call XML fragment (possible tag echo; not stripped)`)}}res.write(chunk);if(res.writableNeedDrain){await awaitDrain(res)}if(res.destroyed||res.writableEnded)break}res.end()}catch(e){emitStreamError(res,prepared.protocol,e?.message??String(e),m2=>log2("error",`[${prepared.session.id}] ${m2}`),opts.streamErrorShape)}finally{clearUpstreamTimer();if(dumpRaw)await dumpRaw;markDirty(prepared.session)}}else{try{const buf=await upstream.arrayBuffer();const text=Buffer.from(buf).toString("utf8");try{let json=JSON.parse(text);if(prepared.protocol==="responses"&&prepared.responsesTextProtocol){const requestBody=JSON.parse(typeof body==="string"?body:body.toString("utf8"));const requestHeaders=buildForwardHeaders(headers);const visibilityMarkers=resolveCompress(opts.routes,route?.rewrittenUrl,requestBody.model,opts.compress).visibilityMarkers??true;json=await compressLoopResponsesJson(json,{core,config,messages:prepared.originalMessages,session:prepared.session,log:ctx.log,proxyUrl,textProtocol:true,visibilityMarkers},requestBody,{url:upstreamUrl,headers:requestHeaders,wireTransform})}const rawUsage=prepared.protocol==="google"?json.usageMetadata??json.usage:json.usage;const u2=rawUsage??{};const{total,cached}=usageTotals(prepared.protocol,u2);const out=usageOutputTotal(prepared.protocol,u2);const reportedCached=typeof cached==="number"?cached:null;const billed=typeof total==="number"?total:0;if(billed>0||reportedCached!==null){settleUsageReport(prepared.session,{total:billed,reportedCached,output:out,protocol:prepared.protocol,upstream:targetOrigin});if(reportedCached!==null)warnCacheCollapse(prepared.session,billed,reportedCached);const hitPct2=reportedCached!==null&&billed>0?Math.round(100*reportedCached/billed):void 0;log("info",`[${prepared.session.id}] [acp-usage] input=${billed} ${hitPct2===void 0?"(no cache report)":`cached=${reportedCached} (cache hit ${hitPct2}%)`}${billed<=0?" (zero-total: lastInputTokens kept)":""}${imageUsageSuffix(prepared.session)}`)}if(typeof out==="number")prepared.session.stats.outputTokens+=out;if(prepared.protocol==="openai"){await withSessionLock(prepared.session,()=>rewriteOpenaiJsonResponse(json,ctx))}else if(prepared.protocol==="responses"){await withSessionLock(prepared.session,()=>rewriteResponsesJsonResponse(json,ctx))}else if(prepared.protocol==="google"){await withSessionLock(prepared.session,()=>rewriteGoogleJsonResponse(json,ctx))}else{await withSessionLock(prepared.session,()=>rewriteJsonResponse(json,ctx))}res.end(JSON.stringify(json))}catch{res.end(text)}}finally{clearUpstreamTimer();markDirty(prepared.session)}}}finally{clearUpstreamTimer()}}async function resolveFakeCompletion(stream2,opts){let buffer=await readStreamToBuffer(stream2,fakeBufCap());const max=maxFakeCompletionRetries();const sid=opts.session.id;const priorStreak=opts.session.metadata.fakeCompletionStreak??0;if(max>0&&priorStreak<max&&isFakeCompletion(opts.protocol,buffer.toString("utf8"))){for(let attempt=1;attempt<=max&&!opts.signal.aborted;attempt++){const hinted=injectFakeCompletionHint(opts.protocol,opts.body);if(hinted===null)break;opts.log("warn",`[${sid}] fake completion (tool-call XML, no tool block); retry ${attempt}/${max} with corrective hint`);let r;try{r=await fetchWithTimeout(opts.upstreamUrl,{method:"POST",headers:opts.reqHeaders,body:hinted,...opts.proxyUrl?{dispatcher:proxyDispatcher(opts.proxyUrl)}:{}},void 0,opts.signal)}catch(e){opts.log("warn",`[${sid}] fake-completion retry failed: ${String(e)}; presenting original`);break}try{if(!r.response.ok||!r.response.body){opts.log("warn",`[${sid}] fake-completion retry rejected (HTTP ${r.response.status}); presenting original`);break}buffer=await readStreamToBuffer(r.response.body,fakeBufCap())}finally{r.clearTimer()}if(!isFakeCompletion(opts.protocol,buffer.toString("utf8")))break}}const stillFake=isFakeCompletion(opts.protocol,buffer.toString("utf8"));opts.session.metadata.fakeCompletionStreak=stillFake?priorStreak+1:0;markDirty(opts.session);return buffer}function deriveTitle(messages){for(const m2 of messages){if(m2.role!=="user"||m2.contentType!=="text")continue;const clean=(m2.text??"").replace(/\s+/g," ").trim();if(clean)return clean.length>60?clean.slice(0,57)+"\u2026":clean}return void 0}function handleConfigReload(opts,res,log2){const fresh=loadRoutes();for(const k2 of Object.keys(opts.routes))delete opts.routes[k2];Object.assign(opts.routes,fresh);const reloaded=loadOptions();opts.compress=reloaded.compress;opts.compat=reloaded.compat;opts.imageBilling=reloaded.imageBilling;resetProxyCache();const names=Object.keys(fresh);log2("info",`[acp-web] routes hot-reloaded (${names.length} providers): ${names.join(", ")||"(none)"}`);res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({ok:true,count:names.length,routes:names}))}function sendCacheReport(res,url){const sessionParam=new URL(url,"http://localhost").searchParams.get("session");let sessions2=listSessions();if(sessionParam!==null){const hit=sessions2.filter(s3=>s3.id===sessionParam);if(hit.length===0){res.writeHead(404,{"content-type":"application/json"});res.end(JSON.stringify({error:`unknown session: ${sessionParam}`}));return}sessions2=hit}else{sessions2=sessions2.slice().sort((a,b2)=>b2.lastSeen-a.lastSeen)}res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({reports:sessions2.map(s3=>({id:s3.id,report:handleAcpCache(s3,{detail:"full"})}))},null,2))}function reapOrphansLogged(session,msgs,log2,sessionId){const{reaped}=reapOrphanBlocks(session,msgs,deactivateBlock);if(reaped.length===0)return;log2("warn",`[${sessionId}] orphan-gc deactivated ${reaped.length} block(s) whose source messages left the client history (${reaped.join(", ")}) \u2014 the client or another compression plugin deleted summarized content; those summaries can no longer be decompressed (#1206)`);recordConflict(session,"orphan-reap",`${reaped.length} block(s) deactivated: ${reaped.join(", ")}`)}function sendStats(res){const all=listSessions();const sessions2=all.map(s3=>{const sw=readModelSwitchStats(s3);return{id:s3.id,protocol:s3.meta.protocol,upstream:s3.meta.upstreamOrigin,label:s3.meta.label,title:s3.meta.title,requests:s3.stats.requests,contextTokens:s3.stats.contextTokens,inputTokens:s3.stats.inputTokens,cachedTokens:s3.stats.cachedTokens,outputTokens:s3.stats.outputTokens,cacheSamples:s3.stats.cacheSamples,cacheHitPct:s3.stats.cacheSamples>0&&s3.stats.inputTokens>0?Math.round(s3.stats.cachedTokens/s3.stats.inputTokens*100):null,lastModel:typeof s3.metadata.lastModel==="string"?s3.metadata.lastModel:void 0,modelSwitches:sw?.count??0,switchMissedTokens:sw?.missedTokens??0,contextWindow:typeof s3.metadata.effectiveContextLimit==="number"?s3.metadata.effectiveContextLimit:void 0,lastSeen:new Date(s3.lastSeen).toISOString(),restored:s3.restored===true}});res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({sessions:sessions2,blindTunnels:getBlindTunnelStats(),unrecognizedPaths:getUnrecognizedPathStats(),conflicts:summarizeConflicts(all)},null,2))}async function sendStatus(res,opts){let diskVersion;let stale=false;try{({diskVersion,stale}=await detectStaleInstall(PACKAGE_NAME,VERSION))}catch{}res.writeHead(200,{"content-type":"application/json"});const adv=getAdvisoryState();const advisory=adv.active?{...adv.active,targetFailed:cannotResolveTarget(adv.lastError)}:null;res.end(JSON.stringify({version:VERSION,diskVersion,stale,autoRestartOnUpdate:opts.autoRestartOnUpdate,advisory,inFlight:totalInFlight(),conflicts:summarizeConflicts(listSessions())},null,2))}async function sendOverview(res,opts){let diskVersion;let stale=false;try{({diskVersion,stale}=await detectStaleInstall(PACKAGE_NAME,VERSION))}catch{}const overview=await buildOverview();res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({overview,version:VERSION,diskVersion,stale,autoRestartOnUpdate:opts.autoRestartOnUpdate,inFlight:totalInFlight(),blindTunnels:getBlindTunnelStats(),conflicts:summarizeConflicts(listSessions()),passthrough:{enabled:!!opts.passthrough,source:opts.passthroughSource}},null,2))}async function sendWebSessions(res){const sessions2=await buildSessionList();res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({sessions:sessions2,hiddenEmpty:hiddenEmptyCount()},null,2))}async function sendWebLogs(res,req){const u2=new URL(req.url??"/__bili/logs","http://localhost");const q2=(u2.searchParams.get("q")??"").trim().toLowerCase();let n=Number(u2.searchParams.get("lines")??"500");if(!Number.isFinite(n)||n<=0)n=500;n=Math.min(Math.floor(n),2e3);const logFile=getLogPath()??defaultLogFile();const dir=logFile&&logFile.includes("/")?logFile.slice(0,logFile.lastIndexOf("/")+1):"";const candidates=[dir+"bili.log.old",dir+"bili.log"];const existing=candidates.filter(f2=>{try{return fs12.statSync(f2).isFile()}catch{return false}});let all=[];for(const f2 of existing){let text;try{text=fs12.readFileSync(f2,"utf8")}catch{continue}const ls2=text.split("\n").filter(l=>l.length>0);all=all.concat(q2?ls2.filter(l=>l.toLowerCase().includes(q2)):ls2)}const total=all.length;const tail=all.slice(-n);if(u2.searchParams.get("raw")==="1"){res.writeHead(200,{"content-type":"text/plain; charset=utf-8","content-disposition":'attachment; filename="billion-context-log.txt"'});res.end(tail.join("\n"));return}res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({path:logFile,total,lines:tail},null,2))}async function sendWebSessionDetail(res,url){const prefix="/__bili/sessions/";const suffix="/detail";let id="";try{id=decodeURIComponent(url.slice(prefix.length,-suffix.length))}catch{}const detail=await buildSessionDetail(id);if(!detail){res.writeHead(404,{"content-type":"application/json"});res.end(JSON.stringify({error:`unknown session: ${id}`}));return}res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify(detail,null,2))}function headerValue2(req,name){const lower=name.toLowerCase();for(const[k2,v2]of Object.entries(req.headers)){if(k2.toLowerCase()===lower)return Array.isArray(v2)?v2[0]:v2}return void 0}function formatBytes(n){if(n<1024)return`${n}B`;if(n<1024*1024)return`${(n/1024).toFixed(1)}KiB`;if(n<1024*1024*1024)return`${(n/(1024*1024)).toFixed(1)}MiB`;return`${(n/(1024*1024*1024)).toFixed(1)}GiB`}function logRequestCost(log2,sessionId,msgs,inboundBytes,t0,outbound){const ms2=Math.max(0,Math.round(performance2.now()-t0));const outboundField=outbound!==void 0?`, outbound=${formatBytes(Buffer.byteLength(outbound))}`:"";log2("info",`[${sessionId}] request: ${msgs??"?"} msgs, inbound=${formatBytes(inboundBytes)}${outboundField}, local=${ms2}ms`)}var BodyTooLargeError=class extends Error{constructor(limit){super(`request body exceeds ${limit} bytes`);this.limit=limit;this.name="BodyTooLargeError"}limit};function readBody(req){return new Promise((resolve,reject)=>{const chunks=[];let size=0;let aborted=false;req.on("data",c=>{if(aborted)return;size+=c.length;if(size>MAX_REQUEST_BYTES){aborted=true;req.destroy();reject(new BodyTooLargeError(MAX_REQUEST_BYTES));return}chunks.push(c)});req.on("end",()=>{if(!aborted)resolve(Buffer.concat(chunks))});req.on("error",e=>{if(!aborted)reject(e)})})}function logMsg(opts,level,msg){if(!opts.log)return;log(level,msg)}import{spawn}from"child_process";import net3 from"net";import path24 from"path";import{mkdir as mkdir4,readFile as readFile5,writeFile as writeFile4}from"fs/promises";var MARKER_FILE=path24.join(cacheDir(),".auto-restart");var RESTART_COOLDOWN_MS=10*60*1e3;var SETTLE_MS=1e4;var READY_TIMEOUT_MS=2e4;var POLL_MS=200;var FORCE_CLOSE_GRACE_MS=1e3;function decideAutoRestart(input){if(!input.enabled)return{go:false,reason:"disabled"};if(input.restarting)return{go:false,reason:"restart-in-progress"};if(!input.diskVersion||!isVersionNewer(input.diskVersion,input.runningVersion)){return{go:false,reason:"not-stale"}}if(input.inFlight>0)return{go:false,reason:`in-flight:${input.inFlight}`};if(input.lastRestartMs!==void 0&&input.nowMs-input.lastRestartMs<input.cooldownMs){return{go:false,reason:"cooldown"}}return{go:true,reason:"ok"}}async function readLastRestart(){try{const data=JSON.parse(await readFile5(MARKER_FILE,"utf-8"));return typeof data.ts==="number"&&Number.isFinite(data.ts)?data.ts:void 0}catch{return void 0}}async function writeLastRestart(ts2,from,to2){try{await mkdir4(path24.dirname(MARKER_FILE),{recursive:true});await writeFile4(MARKER_FILE,JSON.stringify({ts:ts2,from,to:to2}),"utf-8")}catch{}}function probeHostFor(bindHost){if(bindHost==="0.0.0.0")return"127.0.0.1";if(bindHost==="::")return"::1";return bindHost}function sleep2(ms2){return new Promise(resolve=>setTimeout(resolve,ms2))}function probeReady(host,port){return new Promise(resolve=>{const socket=net3.connect({host,port});const done=ok=>{socket.destroy();resolve(ok)};socket.once("connect",()=>done(true));socket.once("error",()=>done(false))})}async function performSelfRestart(deps){const{server,host,port,log:log2}=deps;const countInFlight=deps.inFlightProvider??totalInFlight;const settleMs=deps.settleMs??SETTLE_MS;const readyTimeoutMs=deps.readyTimeoutMs??READY_TIMEOUT_MS;log2("info",`[restart] self-restart v${deps.runningVersion} -> v${deps.diskVersion}: verifying the on-disk install first`);const bad=await verifyInstallLoadable(deps.installDir);if(bad){log2("warn",`[restart] aborted: ${bad} \u2014 keeping the current process; restart bili manually`);return{ok:false,error:bad}}let closed=false;server.close(()=>{closed=true});log2("info",`[restart] stopped accepting new connections; waiting for in-flight requests to drain (up to ${settleMs/1e3}s)`);const settleDeadline=Date.now()+settleMs;let settled=false;while(Date.now()<settleDeadline){if(countInFlight()===0){if(closed){settled=true;break}server.closeAllConnections?.();const graceEnd=Date.now()+FORCE_CLOSE_GRACE_MS;while(!closed&&Date.now()<graceEnd)await sleep2(POLL_MS);if(closed){settled=true;break}log2("warn","[restart] aborted: connections stuck after forced close \u2014 resuming service");resumeListening(server,host,port,log2);return{ok:false,error:"connections-stuck"}}await sleep2(POLL_MS)}if(!settled){log2("warn",`[restart] aborted: ${countInFlight()} request(s) still in flight after ${settleMs/1e3}s \u2014 resuming service`);resumeListening(server,host,port,log2);return{ok:false,error:"in-flight-remained"}}await writeLastRestart(Date.now(),deps.runningVersion,deps.diskVersion);const entry=process.argv[1];if(!entry){log2("error","[restart] aborted: cannot determine the entry script (process.argv[1]) \u2014 resuming service");resumeListening(server,host,port,log2);return{ok:false,error:"no-entry"}}log2("info",`[restart] spawning replacement v${deps.diskVersion} on port ${port}...`);let child;try{child=(deps.spawnImpl??spawn)(process.execPath,[entry,...process.argv.slice(2)],{stdio:"inherit",env:process.env})}catch(e){log2("error",`[restart] spawn failed: ${String(e)} \u2014 resuming service`);resumeListening(server,host,port,log2);return{ok:false,error:String(e)}}child.unref?.();let exitReason;child.once("exit",(code,signal)=>{exitReason=code!==null?`exited code ${code}`:signal?`killed by ${signal}`:"exited"});child.once("error",err2=>{exitReason=String(err2)});const readyDeadline=Date.now()+readyTimeoutMs;let ready=false;while(Date.now()<readyDeadline){if(exitReason!==void 0)break;if(await probeReady(probeHostFor(host),port)){ready=true;break}await sleep2(POLL_MS)}if(!ready){try{child.kill()}catch{}log2("warn",`[restart] aborted: replacement did not become ready within ${readyTimeoutMs/1e3}s${exitReason?` (${exitReason})`:""} \u2014 resuming service`);resumeListening(server,host,port,log2);return{ok:false,error:exitReason??"replacement-not-ready"}}log2("info",`[restart] replacement is up (pid ${child.pid??"?"}) \u2014 handing over v${deps.runningVersion} -> v${deps.diskVersion}, exiting`);(deps.finish??defaultFinish)();return{ok:true,childPid:child.pid}}function resumeListening(server,host,port,log2){try{server.listen(port,host)}catch(e){log2("error",`[restart] failed to resume listening on ${host}:${port}: ${String(e)}`)}}function defaultFinish(){flushConversations();void flushAllSessions().finally(()=>{closeLogger();process.exit(0)})}function createAutoRestartHandler(cfg){let restarting=false;let lastDeferredReason;return info=>{void(async()=>{const decision=decideAutoRestart({enabled:cfg.enabled,runningVersion:info.runningVersion,diskVersion:info.diskVersion,inFlight:totalInFlight(),restarting,nowMs:Date.now(),lastRestartMs:await readLastRestart(),cooldownMs:RESTART_COOLDOWN_MS});if(!decision.go){if(cfg.enabled&&decision.reason!=="disabled"&&decision.reason!=="not-stale"&&decision.reason!==lastDeferredReason){cfg.log("info",`[restart] deferred (${decision.reason}); will retry on the next update check`);lastDeferredReason=decision.reason}return}restarting=true;try{const installDir=await findInstallDir(cfg.packageName);if(!installDir){cfg.log("warn","[restart] deferred: cannot locate the install directory");restarting=false;return}const result=await performSelfRestart({server:cfg.server,host:cfg.host,port:cfg.portProvider(),installDir,runningVersion:info.runningVersion,diskVersion:info.diskVersion,log:cfg.log});if(!result.ok)restarting=false}catch(e){restarting=false;cfg.log("warn",`[restart] unexpected failure: ${String(e)} \u2014 keeping the current process`)}})()}}import fs13 from"fs";import path25 from"path";import{fileURLToPath as fileURLToPath5}from"url";var VERSION3=(()=>{try{const here=fileURLToPath5(import.meta.url);const pkg=path25.join(path25.dirname(here),"..","package.json");return JSON.parse(fs13.readFileSync(pkg,"utf8")).version??"dev"}catch{return"dev"}})();var DEFAULT_PROXY_ORIGIN="http://127.0.0.1:8787";var warnedStaleRecord=false;function resolveProxyOrigin(){const fromEnv=process.env.BILI_MCP_PROXY?.trim();if(fromEnv&&fromEnv.length>0)return fromEnv;const discovered=readProxyInstanceFile();if(discovered&&/^https?:\/\/\S+$/.test(discovered.origin)){if(isProxyInstanceFile(discovered)&&discovered.pid>0&&!isPidAlive(discovered.pid)){if(!warnedStaleRecord){warnedStaleRecord=true;process.stderr.write(`[bili-mcp] recorded bili proxy (${discovered.origin}, pid ${discovered.pid}) is not running \u2014 falling back to ${DEFAULT_PROXY_ORIGIN}; set BILI_MCP_PROXY if your proxy listens elsewhere
|
|
2303
|
+
${buildAbsorbSystemPrompt(absorbToolName(loopConfig))}`:"";const visibilityMarkers=resolveCompress(opts.routes,route?.rewrittenUrl,parsedReq.model,opts.compress).visibilityMarkers??true;const systemPrompt=withConversationIdNote(withMarkerIntegrityNote(withSummaryBudgetNote(textProtocol?buildCompressHybridSystemPrompt(prepared.prompts??defaultPrompts,prepared.surface?.promptSections):buildCompressSystemPrompt(prepared.prompts??defaultPrompts,prepared.surface?.promptSections)),visibilityMarkers),ensureCanonicalId(prepared.session))+absorbSection;const adapter=pickAdapter(prepared.protocol,parsedReq,textProtocol,prepared.responsesProjection,prepared.anthropicSystem,prepared.openaiSystemText,absorbActive?absorbToolName(loopConfig):void 0,prepared.google,prepared.systemNotes,opts.streamErrorShape);const refreshFolded=async current=>{return withSessionLock(prepared.session,async()=>{const turn=core.processTurn({messages:prepared.originalMessages,state:prepared.session.state,config:loopConfig,tokenCount:prepared.session.stats.lastInputTokens,renderTags:prepared.renderTags??"text-only",contentStore:contentStoreOf(prepared.session)});prepared.session.state=turn.state;adoptContentStore(prepared.session,turn.contentStore);const viewed=applyAbsorbView(turn.messages,turn.state,loopConfig,prepared.session.stats.lastInputTokens);const records=current.filter(m2=>typeof m2.id==="string"&&m2.id.startsWith("acp_loop_"));const out=[...stripKernelSummaries(viewed,turn.state),...records];const dropped=prepared.dropReasoning?prepared.dropReasoning(out):out;const ordered=prepared.protocol==="responses"?repairResponsesAssistantOrdering(dropped,prepared.originalMessages):dropped;await applyImageCompressionPass(prepared.session,ordered,{config:loopConfig,billing:imageBillingFor(opts,route?.rewrittenUrl),log:ctx.log});const imgNote=imageFullTrailingNote(prepared.session);if(imgNote)ordered.push({id:"bili_image_full_note",role:"user",contentType:"text",text:imgNote});return ordered})};const loopDumpDir=opts.dumpSse;const loop=runCompressLoop(streamToRead,{core,config,messages:prepared.processedMessages.length>0?prepared.processedMessages:prepared.originalMessages,compressMessages:prepared.originalMessages,session:prepared.session,log:ctx.log,proxyUrl,upstreamOrigin:targetOrigin,protocol:prepared.protocol,textProtocol,debug:opts.debug,refreshFolded,visibilityMarkers,dumpSse:loopDumpDir?(name,stream2)=>dumpStreamToFile(stream2,loopDumpDir,name):void 0},parsedReq,{url:upstreamUrl,headers:reqHeaders,wireTransform},adapter,systemPrompt,clientAbort.signal);let protocolFragmentWarned=false;for await(const chunk of loop){if(res.destroyed||res.writableEnded)break;{const s3=chunk.toString("utf8");if(s3.includes("<acp ")||s3.includes("</acp")){log2("warn",`[${prepared.session.id}] tag echo: ${prepared.protocol} response stream contains <acp tag`)}else if(!protocolFragmentWarned&&containsToolCallXmlFragment(s3)){protocolFragmentWarned=true;log2("warn",`[${prepared.session.id}] tag echo: ${prepared.protocol} response stream contains tool-call XML fragment (possible tag echo; not stripped)`)}}res.write(chunk);if(res.writableNeedDrain){await awaitDrain(res)}if(res.destroyed||res.writableEnded)break}res.end()}catch(e){emitStreamError(res,prepared.protocol,e?.message??String(e),m2=>log2("error",`[${prepared.session.id}] ${m2}`),opts.streamErrorShape)}finally{clearUpstreamTimer();if(dumpRaw)await dumpRaw;markDirty(prepared.session)}}else{try{const buf=await upstream.arrayBuffer();const text=Buffer.from(buf).toString("utf8");try{let json=JSON.parse(text);if(prepared.protocol==="responses"&&prepared.responsesTextProtocol){const requestBody=JSON.parse(typeof body==="string"?body:body.toString("utf8"));const requestHeaders=buildForwardHeaders(headers);const visibilityMarkers=resolveCompress(opts.routes,route?.rewrittenUrl,requestBody.model,opts.compress).visibilityMarkers??true;json=await compressLoopResponsesJson(json,{core,config,messages:prepared.originalMessages,session:prepared.session,log:ctx.log,proxyUrl,textProtocol:true,visibilityMarkers},requestBody,{url:upstreamUrl,headers:requestHeaders,wireTransform})}const rawUsage=prepared.protocol==="google"?json.usageMetadata??json.usage:json.usage;const u2=rawUsage??{};const{total,cached}=usageTotals(prepared.protocol,u2);const out=usageOutputTotal(prepared.protocol,u2);const reportedCached=typeof cached==="number"?cached:null;const billed=typeof total==="number"?total:0;if(billed>0||reportedCached!==null){settleUsageReport(prepared.session,{total:billed,reportedCached,output:out,protocol:prepared.protocol,upstream:targetOrigin});if(reportedCached!==null)warnCacheCollapse(prepared.session,billed,reportedCached);const hitPct2=reportedCached!==null&&billed>0?Math.round(100*reportedCached/billed):void 0;log("info",`[${prepared.session.id}] [acp-usage] input=${billed} ${hitPct2===void 0?"(no cache report)":`cached=${reportedCached} (cache hit ${hitPct2}%)`}${billed<=0?" (zero-total: lastInputTokens kept)":""}${imageUsageSuffix(prepared.session)}`)}if(typeof out==="number")prepared.session.stats.outputTokens+=out;if(prepared.protocol==="openai"){await withSessionLock(prepared.session,()=>rewriteOpenaiJsonResponse(json,ctx))}else if(prepared.protocol==="responses"){await withSessionLock(prepared.session,()=>rewriteResponsesJsonResponse(json,ctx))}else if(prepared.protocol==="google"){await withSessionLock(prepared.session,()=>rewriteGoogleJsonResponse(json,ctx))}else{await withSessionLock(prepared.session,()=>rewriteJsonResponse(json,ctx))}res.end(JSON.stringify(json))}catch{res.end(text)}}finally{clearUpstreamTimer();markDirty(prepared.session)}}}finally{clearUpstreamTimer()}}async function resolveFakeCompletion(stream2,opts){let buffer=await readStreamToBuffer(stream2,fakeBufCap());const max=maxFakeCompletionRetries();const sid=opts.session.id;const priorStreak=opts.session.metadata.fakeCompletionStreak??0;if(max>0&&priorStreak<max&&isFakeCompletion(opts.protocol,buffer.toString("utf8"))){for(let attempt=1;attempt<=max&&!opts.signal.aborted;attempt++){const hinted=injectFakeCompletionHint(opts.protocol,opts.body);if(hinted===null)break;opts.log("warn",`[${sid}] fake completion (tool-call XML, no tool block); retry ${attempt}/${max} with corrective hint`);let r;try{r=await fetchWithTimeout(opts.upstreamUrl,{method:"POST",headers:opts.reqHeaders,body:hinted,...opts.proxyUrl?{dispatcher:proxyDispatcher(opts.proxyUrl)}:{}},void 0,opts.signal)}catch(e){opts.log("warn",`[${sid}] fake-completion retry failed: ${String(e)}; presenting original`);break}try{if(!r.response.ok||!r.response.body){opts.log("warn",`[${sid}] fake-completion retry rejected (HTTP ${r.response.status}); presenting original`);break}buffer=await readStreamToBuffer(r.response.body,fakeBufCap())}finally{r.clearTimer()}if(!isFakeCompletion(opts.protocol,buffer.toString("utf8")))break}}const stillFake=isFakeCompletion(opts.protocol,buffer.toString("utf8"));opts.session.metadata.fakeCompletionStreak=stillFake?priorStreak+1:0;markDirty(opts.session);return buffer}function deriveTitle(messages){for(const m2 of messages){if(m2.role!=="user"||m2.contentType!=="text")continue;const clean=(m2.text??"").replace(/\s+/g," ").trim();if(clean)return clean.length>60?clean.slice(0,57)+"\u2026":clean}return void 0}function handleConfigReload(opts,res,log2){const fresh=loadRoutes();for(const k2 of Object.keys(opts.routes))delete opts.routes[k2];Object.assign(opts.routes,fresh);const reloaded=loadOptions();opts.compress=reloaded.compress;opts.compat=reloaded.compat;opts.imageBilling=reloaded.imageBilling;resetProxyCache();const names=Object.keys(fresh);log2("info",`[acp-web] routes hot-reloaded (${names.length} providers): ${names.join(", ")||"(none)"}`);res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({ok:true,count:names.length,routes:names}))}function sendCacheReport(res,url){const sessionParam=new URL(url,"http://localhost").searchParams.get("session");let sessions2=listSessions();if(sessionParam!==null){const hit=sessions2.filter(s3=>s3.id===sessionParam);if(hit.length===0){res.writeHead(404,{"content-type":"application/json"});res.end(JSON.stringify({error:`unknown session: ${sessionParam}`}));return}sessions2=hit}else{sessions2=sessions2.slice().sort((a,b2)=>b2.lastSeen-a.lastSeen)}res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({reports:sessions2.map(s3=>({id:s3.id,report:handleAcpCache(s3,{detail:"full"})}))},null,2))}function reapOrphansLogged(session,msgs,log2,sessionId){const{reaped}=reapOrphanBlocks(session,msgs,deactivateBlock);if(reaped.length===0)return;log2("warn",`[${sessionId}] orphan-gc deactivated ${reaped.length} block(s) whose source messages left the client history (${reaped.join(", ")}) \u2014 the client or another compression plugin deleted summarized content; those summaries can no longer be decompressed (#1206)`);recordConflict(session,"orphan-reap",`${reaped.length} block(s) deactivated: ${reaped.join(", ")}`)}function sendStats(res){const all=listSessions();const sessions2=all.map(s3=>{const sw=readModelSwitchStats(s3);return{id:s3.id,protocol:s3.meta.protocol,upstream:s3.meta.upstreamOrigin,label:s3.meta.label,title:s3.meta.title,requests:s3.stats.requests,contextTokens:s3.stats.contextTokens,inputTokens:s3.stats.inputTokens,cachedTokens:s3.stats.cachedTokens,outputTokens:s3.stats.outputTokens,cacheSamples:s3.stats.cacheSamples,cacheHitPct:s3.stats.cacheSamples>0&&s3.stats.inputTokens>0?Math.round(s3.stats.cachedTokens/s3.stats.inputTokens*100):null,lastModel:typeof s3.metadata.lastModel==="string"?s3.metadata.lastModel:void 0,modelSwitches:sw?.count??0,switchMissedTokens:sw?.missedTokens??0,contextWindow:typeof s3.metadata.effectiveContextLimit==="number"?s3.metadata.effectiveContextLimit:void 0,lastSeen:new Date(s3.lastSeen).toISOString(),restored:s3.restored===true}});res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({sessions:sessions2,blindTunnels:getBlindTunnelStats(),unrecognizedPaths:getUnrecognizedPathStats(),conflicts:summarizeConflicts(all)},null,2))}async function sendStatus(res,opts){let diskVersion;let stale=false;try{({diskVersion,stale}=await detectStaleInstall(PACKAGE_NAME,VERSION))}catch{}res.writeHead(200,{"content-type":"application/json"});const adv=getAdvisoryState();const advisory=adv.active?{...adv.active,targetFailed:cannotResolveTarget(adv.lastError)}:null;res.end(JSON.stringify({version:VERSION,diskVersion,stale,autoRestartOnUpdate:opts.autoRestartOnUpdate,advisory,inFlight:totalInFlight(),conflicts:summarizeConflicts(listSessions())},null,2))}async function sendOverview(res,opts){let diskVersion;let stale=false;try{({diskVersion,stale}=await detectStaleInstall(PACKAGE_NAME,VERSION))}catch{}const overview=await buildOverview();res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({overview,version:VERSION,diskVersion,stale,autoRestartOnUpdate:opts.autoRestartOnUpdate,inFlight:totalInFlight(),blindTunnels:getBlindTunnelStats(),conflicts:summarizeConflicts(listSessions()),passthrough:{enabled:!!opts.passthrough,source:opts.passthroughSource}},null,2))}async function sendWebSessions(res){const sessions2=await buildSessionList();res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({sessions:sessions2,hiddenEmpty:hiddenEmptyCount()},null,2))}async function sendWebLogs(res,req){const u2=new URL(req.url??"/__bili/logs","http://localhost");const q2=(u2.searchParams.get("q")??"").trim().toLowerCase();let n=Number(u2.searchParams.get("lines")??"500");if(!Number.isFinite(n)||n<=0)n=500;n=Math.min(Math.floor(n),2e3);const logFile=getLogPath()??defaultLogFile();const dir=logFile&&logFile.includes("/")?logFile.slice(0,logFile.lastIndexOf("/")+1):"";const candidates=[dir+"bili.log.old",dir+"bili.log"];const existing=candidates.filter(f2=>{try{return fs12.statSync(f2).isFile()}catch{return false}});let all=[];for(const f2 of existing){let text;try{text=fs12.readFileSync(f2,"utf8")}catch{continue}const ls2=text.split("\n").filter(l=>l.length>0);all=all.concat(q2?ls2.filter(l=>l.toLowerCase().includes(q2)):ls2)}const total=all.length;const tail=all.slice(-n);if(u2.searchParams.get("raw")==="1"){res.writeHead(200,{"content-type":"text/plain; charset=utf-8","content-disposition":'attachment; filename="billion-context-log.txt"'});res.end(tail.join("\n"));return}res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({path:logFile,total,lines:tail},null,2))}async function sendWebSessionDetail(res,url){const prefix="/__bili/sessions/";const suffix="/detail";let id="";try{id=decodeURIComponent(url.slice(prefix.length,-suffix.length))}catch{}const detail=await buildSessionDetail(id);if(!detail){res.writeHead(404,{"content-type":"application/json"});res.end(JSON.stringify({error:`unknown session: ${id}`}));return}res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify(detail,null,2))}function headerValue2(req,name){const lower=name.toLowerCase();for(const[k2,v2]of Object.entries(req.headers)){if(k2.toLowerCase()===lower)return Array.isArray(v2)?v2[0]:v2}return void 0}function formatBytes(n){if(n<1024)return`${n}B`;if(n<1024*1024)return`${(n/1024).toFixed(1)}KiB`;if(n<1024*1024*1024)return`${(n/(1024*1024)).toFixed(1)}MiB`;return`${(n/(1024*1024*1024)).toFixed(1)}GiB`}function logRequestCost(log2,sessionId,msgs,inboundBytes,t0,outbound){const ms2=Math.max(0,Math.round(performance2.now()-t0));const outboundField=outbound!==void 0?`, outbound=${formatBytes(Buffer.byteLength(outbound))}`:"";log2("info",`[${sessionId}] request: ${msgs??"?"} msgs, inbound=${formatBytes(inboundBytes)}${outboundField}, local=${ms2}ms`)}var BodyTooLargeError=class extends Error{constructor(limit){super(`request body exceeds ${limit} bytes`);this.limit=limit;this.name="BodyTooLargeError"}limit};function readBody(req){return new Promise((resolve,reject)=>{const chunks=[];let size=0;let aborted=false;req.on("data",c=>{if(aborted)return;size+=c.length;if(size>MAX_REQUEST_BYTES){aborted=true;req.destroy();reject(new BodyTooLargeError(MAX_REQUEST_BYTES));return}chunks.push(c)});req.on("end",()=>{if(!aborted)resolve(Buffer.concat(chunks))});req.on("error",e=>{if(!aborted)reject(e)})})}function logMsg(opts,level,msg){if(!opts.log)return;log(level,msg)}import{spawn}from"child_process";import net3 from"net";import path24 from"path";import{mkdir as mkdir4,readFile as readFile5,writeFile as writeFile4}from"fs/promises";var MARKER_FILE=path24.join(cacheDir(),".auto-restart");var RESTART_COOLDOWN_MS=10*60*1e3;var SETTLE_MS=1e4;var READY_TIMEOUT_MS=2e4;var POLL_MS=200;var FORCE_CLOSE_GRACE_MS=1e3;function decideAutoRestart(input){if(!input.enabled)return{go:false,reason:"disabled"};if(input.restarting)return{go:false,reason:"restart-in-progress"};if(!input.diskVersion||!isVersionNewer(input.diskVersion,input.runningVersion)){return{go:false,reason:"not-stale"}}if(input.inFlight>0)return{go:false,reason:`in-flight:${input.inFlight}`};if(input.lastRestartMs!==void 0&&input.nowMs-input.lastRestartMs<input.cooldownMs){return{go:false,reason:"cooldown"}}return{go:true,reason:"ok"}}async function readLastRestart(){try{const data=JSON.parse(await readFile5(MARKER_FILE,"utf-8"));return typeof data.ts==="number"&&Number.isFinite(data.ts)?data.ts:void 0}catch{return void 0}}async function writeLastRestart(ts2,from,to2){try{await mkdir4(path24.dirname(MARKER_FILE),{recursive:true});await writeFile4(MARKER_FILE,JSON.stringify({ts:ts2,from,to:to2}),"utf-8")}catch{}}function probeHostFor(bindHost){if(bindHost==="0.0.0.0")return"127.0.0.1";if(bindHost==="::")return"::1";return bindHost}function sleep2(ms2){return new Promise(resolve=>setTimeout(resolve,ms2))}function probeReady(host,port){return new Promise(resolve=>{const socket=net3.connect({host,port});const done=ok=>{socket.destroy();resolve(ok)};socket.once("connect",()=>done(true));socket.once("error",()=>done(false))})}async function performSelfRestart(deps){const{server,host,port,log:log2}=deps;const countInFlight=deps.inFlightProvider??totalInFlight;const settleMs=deps.settleMs??SETTLE_MS;const readyTimeoutMs=deps.readyTimeoutMs??READY_TIMEOUT_MS;log2("info",`[restart] self-restart v${deps.runningVersion} -> v${deps.diskVersion}: verifying the on-disk install first`);const bad=await verifyInstallLoadable(deps.installDir);if(bad){log2("warn",`[restart] aborted: ${bad} \u2014 keeping the current process; restart bili manually`);return{ok:false,error:bad}}let closed=false;server.close(()=>{closed=true});log2("info",`[restart] stopped accepting new connections; waiting for in-flight requests to drain (up to ${settleMs/1e3}s)`);const settleDeadline=Date.now()+settleMs;let settled=false;while(Date.now()<settleDeadline){if(countInFlight()===0){if(closed){settled=true;break}server.closeAllConnections?.();const graceEnd=Date.now()+FORCE_CLOSE_GRACE_MS;while(!closed&&Date.now()<graceEnd)await sleep2(POLL_MS);if(closed){settled=true;break}log2("warn","[restart] aborted: connections stuck after forced close \u2014 resuming service");resumeListening(server,host,port,log2);return{ok:false,error:"connections-stuck"}}await sleep2(POLL_MS)}if(!settled){log2("warn",`[restart] aborted: ${countInFlight()} request(s) still in flight after ${settleMs/1e3}s \u2014 resuming service`);resumeListening(server,host,port,log2);return{ok:false,error:"in-flight-remained"}}await writeLastRestart(Date.now(),deps.runningVersion,deps.diskVersion);const entry=process.argv[1];if(!entry){log2("error","[restart] aborted: cannot determine the entry script (process.argv[1]) \u2014 resuming service");resumeListening(server,host,port,log2);return{ok:false,error:"no-entry"}}log2("info",`[restart] spawning replacement v${deps.diskVersion} on port ${port}...`);let child;try{child=(deps.spawnImpl??spawn)(process.execPath,[entry,...process.argv.slice(2)],{stdio:"inherit",env:process.env})}catch(e){log2("error",`[restart] spawn failed: ${String(e)} \u2014 resuming service`);resumeListening(server,host,port,log2);return{ok:false,error:String(e)}}child.unref?.();let exitReason;child.once("exit",(code,signal)=>{exitReason=code!==null?`exited code ${code}`:signal?`killed by ${signal}`:"exited"});child.once("error",err2=>{exitReason=String(err2)});const readyDeadline=Date.now()+readyTimeoutMs;let ready=false;while(Date.now()<readyDeadline){if(exitReason!==void 0)break;if(await probeReady(probeHostFor(host),port)){ready=true;break}await sleep2(POLL_MS)}if(!ready){try{child.kill()}catch{}log2("warn",`[restart] aborted: replacement did not become ready within ${readyTimeoutMs/1e3}s${exitReason?` (${exitReason})`:""} \u2014 resuming service`);resumeListening(server,host,port,log2);return{ok:false,error:exitReason??"replacement-not-ready"}}log2("info",`[restart] replacement is up (pid ${child.pid??"?"}) \u2014 handing over v${deps.runningVersion} -> v${deps.diskVersion}, exiting`);(deps.finish??defaultFinish)();return{ok:true,childPid:child.pid}}function resumeListening(server,host,port,log2){try{server.listen(port,host)}catch(e){log2("error",`[restart] failed to resume listening on ${host}:${port}: ${String(e)}`)}}function defaultFinish(){flushConversations();void flushAllSessions().finally(()=>{closeLogger();process.exit(0)})}function createAutoRestartHandler(cfg){let restarting=false;let lastDeferredReason;return info=>{void(async()=>{const decision=decideAutoRestart({enabled:cfg.enabled,runningVersion:info.runningVersion,diskVersion:info.diskVersion,inFlight:totalInFlight(),restarting,nowMs:Date.now(),lastRestartMs:await readLastRestart(),cooldownMs:RESTART_COOLDOWN_MS});if(!decision.go){if(cfg.enabled&&decision.reason!=="disabled"&&decision.reason!=="not-stale"&&decision.reason!==lastDeferredReason){cfg.log("info",`[restart] deferred (${decision.reason}); will retry on the next update check`);lastDeferredReason=decision.reason}return}restarting=true;try{const installDir=await findInstallDir(cfg.packageName);if(!installDir){cfg.log("warn","[restart] deferred: cannot locate the install directory");restarting=false;return}const result=await performSelfRestart({server:cfg.server,host:cfg.host,port:cfg.portProvider(),installDir,runningVersion:info.runningVersion,diskVersion:info.diskVersion,log:cfg.log});if(!result.ok)restarting=false}catch(e){restarting=false;cfg.log("warn",`[restart] unexpected failure: ${String(e)} \u2014 keeping the current process`)}})()}}import fs13 from"fs";import path25 from"path";import{fileURLToPath as fileURLToPath5}from"url";var VERSION3=(()=>{try{const here=fileURLToPath5(import.meta.url);const pkg=path25.join(path25.dirname(here),"..","package.json");return JSON.parse(fs13.readFileSync(pkg,"utf8")).version??"dev"}catch{return"dev"}})();var DEFAULT_PROXY_ORIGIN="http://127.0.0.1:8787";var warnedStaleRecord=false;function resolveProxyOrigin(){const fromEnv=process.env.BILI_MCP_PROXY?.trim();if(fromEnv&&fromEnv.length>0)return fromEnv;const discovered=readProxyInstanceFile();if(discovered&&/^https?:\/\/\S+$/.test(discovered.origin)){if(isProxyInstanceFile(discovered)&&discovered.pid>0&&!isPidAlive(discovered.pid)){if(!warnedStaleRecord){warnedStaleRecord=true;process.stderr.write(`[bili-mcp] recorded bili proxy (${discovered.origin}, pid ${discovered.pid}) is not running \u2014 falling back to ${DEFAULT_PROXY_ORIGIN}; set BILI_MCP_PROXY if your proxy listens elsewhere
|
|
2304
2304
|
`)}return DEFAULT_PROXY_ORIGIN}return discovered.origin}return DEFAULT_PROXY_ORIGIN}var TOOL_TIMEOUT_MS=6e4;var CONVERSATION_FROM_ENV=process.env.CLAUDE_CODE_SESSION_ID?.trim()||process.env.BILI_CONVERSATION_ID?.trim()||void 0;var IDENTITY_BINDING=Boolean(process.env.CLAUDE_CODE_SESSION_ID?.trim());var ORPHAN_ADOPT=IDENTITY_BINDING&&process.env.BILI_MCP_NO_ORPHAN_ADOPT!=="1";var manifestTools=[];var conversationId=CONVERSATION_FROM_ENV;var registeredConversations=new Set;var initialized2=false;function send(msg){process.stdout.write(JSON.stringify(msg)+"\n")}function sendResult(id,result){if(id===null)return;send({jsonrpc:"2.0",id,result})}function sendError2(id,code,message){if(id===null)return;send({jsonrpc:"2.0",id,error:{code,message}})}async function fetchManifest(){const res=await fetch(`${resolveProxyOrigin()}/__bili/plugin/manifest`,{signal:AbortSignal.timeout(5e3)});if(!res.ok)throw new Error(`manifest fetch failed: ${res.status}`);const data=await res.json();const anthropic=data.tools?.anthropic??[];manifestTools=anthropic.map(t=>({name:t.name,description:t.description,inputSchema:t.input_schema}));if(manifestTools.length===0)throw new Error("manifest served no anthropic tools")}var manifestPromise=null;function ensureManifest(){manifestPromise??=fetchManifest().catch(err2=>{manifestPromise=null;throw err2});return manifestPromise}async function forwardTool(tool,args,timeoutMs=TOOL_TIMEOUT_MS,conversationIdOverride=void 0){const effectiveConversationId=conversationIdOverride??conversationId;for(let attempt=0;;attempt++){let res;try{res=await fetch(`${resolveProxyOrigin()}/__bili/plugin/tool`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({conversationId:effectiveConversationId,tool,args}),signal:AbortSignal.timeout(timeoutMs)})}catch(err2){if(err2 instanceof Error&&err2.name==="TimeoutError")throw new Error(`tool forward timed out after ${timeoutMs}ms: ${tool}`);throw err2}const data=await res.json();if(res.ok&&data.ok)return data.result??"";if(res.status===404&&attempt===0&&ORPHAN_ADOPT&&conversationIdOverride===void 0&&conversationId&&typeof data.error==="string"&&data.error.includes("no model request has arrived")){if(await adoptLatestActiveConversation())continue}throw new Error(data.error??`tool forward failed: ${res.status}`)}}async function adoptLatestActiveConversation(){try{const res=await fetch(`${resolveProxyOrigin()}/__bili/plugin/status?conversationId=${encodeURIComponent(conversationId??"")}&fallback=latest`,{signal:AbortSignal.timeout(5e3)});if(!res.ok)return false;const data=await res.json();if(data.ok!==true||data.fallback!==true||!data.conversationId||data.conversationId===conversationId)return false;process.stderr.write(`[bili-mcp] conversation id no longer known by the proxy (host resumed its session?); adopting latest active conversation ${data.conversationId}
|
|
2305
2305
|
`);conversationId=data.conversationId;return true}catch{return false}}var ERR_TOOL=-32602;async function handleMessage(msg){const{id=null,method}=msg;const params=typeof msg.params==="object"&&msg.params!==null?msg.params:{};switch(method){case"initialize":{const fromMeta=params._meta?.ui?.sessionId?.trim();if(fromMeta)conversationId??=fromMeta;initialized2=true;if(conversationId&&!registeredConversations.has(conversationId)){const registerFetch=fetch(`${resolveProxyOrigin()}/__bili/plugin/register`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({conversationId,agent:"mcp",identity:IDENTITY_BINDING}),signal:AbortSignal.timeout(5e3)});registeredConversations.add(conversationId);if(IDENTITY_BINDING){void registerFetch.catch(()=>{})}else{await registerFetch.catch(()=>{})}}sendResult(id,{protocolVersion:"2025-06-18",serverInfo:{name:"bili",version:VERSION3},capabilities:{tools:{}}});return}case"notifications/initialized":return;case"tools/list":{if(!initialized2){sendError2(id,-32002,"server not initialized");return}try{await ensureManifest();sendResult(id,{tools:manifestTools})}catch(err2){sendError2(id,-32003,`bili proxy unreachable at ${resolveProxyOrigin()} (${err2 instanceof Error?err2.message:String(err2)}) \u2014 start bili or set BILI_MCP_PROXY`)}return}case"tools/call":{const tool=typeof params.name==="string"?params.name:"";const rawArgs=params.arguments&&typeof params.arguments==="object"?params.arguments:{};if(!tool){sendError2(id,ERR_TOOL,"params.name is required");return}const perCallRaw=rawArgs.conversation_id;const perCall=typeof perCallRaw==="string"?perCallRaw.trim():"";const keepForSearch=tool==="search_context"&&perCall.length>0&&typeof conversationId==="string"&&conversationId.length>0;const args={...rawArgs};if(!keepForSearch)delete args.conversation_id;const routeOverride=keepForSearch?void 0:perCall||void 0;if(!routeOverride&&!conversationId){sendError2(id,ERR_TOOL,"no conversation id (pass the conversation_id argument \u2014 see the 'your bili conversation id' line in the proxy notes \u2014 or set BILI_CONVERSATION_ID or connect via Claude Code MCP session meta)");return}try{const text=await forwardTool(tool,args,TOOL_TIMEOUT_MS,routeOverride);sendResult(id,{content:[{type:"text",text}],isError:false})}catch(err2){sendResult(id,{content:[{type:"text",text:`bili tool error: ${err2 instanceof Error?err2.message:String(err2)}`}],isError:true})}return}case"ping":sendResult(id,{});return;default:if(method?.startsWith("notifications/"))return;sendError2(id,-32601,`method not found: ${method??"(none)"}`)}}async function mcpMain(){let buf="";process.stdin.setEncoding("utf8");process.stdin.on("data",chunk=>{buf+=chunk;let nl;while((nl=buf.indexOf("\n"))>=0){const line=buf.slice(0,nl).trim();buf=buf.slice(nl+1);if(!line)continue;let parsed;try{parsed=JSON.parse(line)}catch{continue}if(parsed&&typeof parsed==="object"){void handleMessage(parsed)}}});process.stdin.on("end",()=>process.exit(0))}function runMcpStdio(){void mcpMain()}if(process.argv[1]&&/(?:^|[\\/])mcp\.(?:ts|js)$/.test(process.argv[1])){void mcpMain()}import fs18 from"fs";import path30 from"path";import os6 from"os";import crypto3 from"crypto";import{execFileSync as execFileSync3,spawnSync as spawnSync2}from"child_process";import{fileURLToPath as fileURLToPath6}from"url";import fs15 from"fs";import path27 from"path";import{randomUUID as randomUUID7}from"crypto";import fs14 from"fs";import net4 from"net";import os5 from"os";import path26 from"path";import{pathToFileURL}from"url";import{execFileSync as execFileSync2,spawn as spawn2}from"child_process";function selfDistFile(name){return path26.join(selfPackageRoot(),"dist",name)}var LAUNCHER_DEFAULT_HOST="127.0.0.1";var LAUNCH_CLIENTS=["pi","codex","claude","omp","opencode","hermes","dsh","codebuddy","qoder","trae","jcode","kimi","gemini","iflow","qwen","mcode","aider","copilot","amp","goose","pi-test"];var HEALTH_PATH="/__bili/health";var HEALTH_POLL_INTERVAL_MS=200;var SPAWN_WAIT_MS=2e4;var PROBE_TIMEOUT_MS=1500;var STARTING_MARKER_TTL_MS=SPAWN_WAIT_MS+3e4;var DEFAULT_MITM_DOMAIN_SET=new Set(DEFAULT_MITM_DOMAINS.map(d=>d.toLowerCase()));function isLaunchClient(value){return LAUNCH_CLIENTS.includes(value)}function baseClientName(client){return client==="pi-test"?"pi":client}function piTestArgs(client,clientArgs){return client==="pi-test"?["--no-extensions",...clientArgs]:clientArgs}function proxyOrigin(host,port){return`http://${host}:${port}`}function healthUrl(origin){return origin+HEALTH_PATH}function wrapUpstream(origin,upstream){const u2=upstream.replace(/\/+$/,"");const prefix=origin+"/bili/";if(u2.startsWith(prefix))return u2;return prefix+u2}function unwrapUpstream2(url){const idx=url.indexOf("/bili/");return idx>=0?url.slice(idx+"/bili/".length):url}function isLoopbackHost(host){const h=host.toLowerCase();if(h==="localhost"||h==="::1"||h==="[::1]")return true;return/^127\.\d+\.\d+\.\d+$/.test(h)}function resolveCaCertPath(env){const base=env.XDG_DATA_HOME||path26.join(os5.homedir(),".local/share");return path26.join(base,"billion-context","ca","root-ca.pem")}function resolveCombinedCaPath(env){const base=env.XDG_DATA_HOME||path26.join(os5.homedir(),".local/share");return path26.join(base,"billion-context","ca","combined-ca.pem")}function discoverRoutes(client,config){const httpsDomains=[];const httpRewrites=[];const httpsRewrites=[];const httpEnvRoutes=[];const httpsSeen=new Set;const rewriteKeys=new Set;const httpsRewriteKeys=new Set;const classify=(raw,key2)=>{if(!nonEmpty2(raw))return;let url;try{url=new URL(unwrapUpstream2(raw))}catch{return}if(url.protocol==="https:"){const host=url.hostname;if(host&&!httpsSeen.has(host.toLowerCase())){httpsSeen.add(host.toLowerCase());httpsDomains.push(host)}if(raw!==unwrapUpstream2(raw)&&!httpsRewriteKeys.has(key2)){httpsRewriteKeys.add(key2);httpsRewrites.push({key:key2,realUpstream:unwrapUpstream2(raw)})}}else if(url.protocol==="http:"){if(!rewriteKeys.has(key2)){rewriteKeys.add(key2);httpRewrites.push({key:key2,realUpstream:unwrapUpstream2(raw)})}}};if(client==="claude"){const raw=nonEmpty2(config.claude?.anthropicBaseUrl)?config.claude.anthropicBaseUrl:"https://api.anthropic.com";const real=unwrapUpstream2(raw);try{const url=new URL(real);if((url.protocol==="https:"||url.protocol==="http:")&&!rewriteKeys.has("ANTHROPIC_BASE_URL")){rewriteKeys.add("ANTHROPIC_BASE_URL");httpRewrites.push({key:"ANTHROPIC_BASE_URL",realUpstream:real})}}catch{}}else if(client==="codebuddy"){const raw=nonEmpty2(config.codebuddy?.codebuddyBaseUrl)?config.codebuddy.codebuddyBaseUrl:"https://tencent.sso.codebuddy.cn/v2";const real=unwrapUpstream2(raw);try{const url=new URL(real);if((url.protocol==="https:"||url.protocol==="http:")&&!rewriteKeys.has("CODEBUDDY_BASE_URL")){rewriteKeys.add("CODEBUDDY_BASE_URL");httpRewrites.push({key:"CODEBUDDY_BASE_URL",realUpstream:real})}}catch{}for(const rawModelUrl of config.codebuddy?.modelUrls??[]){try{const url=new URL(unwrapUpstream2(rawModelUrl));if(url.protocol!=="https:")continue;const host=url.hostname;if(host&&!httpsSeen.has(host.toLowerCase())){httpsSeen.add(host.toLowerCase());httpsDomains.push(host)}}catch{}}}else if(client==="pi"){for(const[name,prov]of Object.entries(config.pi?.providers??{})){classify(prov.baseUrl,name)}}else if(client==="omp"){for(const[name,prov]of Object.entries(config.omp?.providers??{})){classify(prov.baseUrl,name)}}else if(client==="opencode"){for(const[name,prov]of Object.entries(config.opencode?.providers??{})){classify(prov.baseURL,name)}}else if(client==="hermes"){const hermesSeen=new Set;for(const[name,prov]of Object.entries(config.hermes?.providers??{})){if(!nonEmpty2(prov.api))continue;const real=unwrapUpstream2(prov.api);try{const url=new URL(real);if(url.protocol!=="http:"&&url.protocol!=="https:")continue;if(hermesSeen.has(name))continue;hermesSeen.add(name);if(url.protocol==="https:"){const host=url.hostname.toLowerCase();if(host&&!httpsSeen.has(host)){httpsSeen.add(host);httpsDomains.push(host)}}else if(!rewriteKeys.has(name)){rewriteKeys.add(name);httpRewrites.push({key:name,realUpstream:real})}}catch{}}}else if(client==="dsh"){const dshSeen=new Set;let anon=0;for(const raw of config.dsh?.baseUrls??[]){const real=unwrapUpstream2(raw);try{const url=new URL(real);if(url.protocol!=="http:"&&url.protocol!=="https:")continue;if(dshSeen.has(real))continue;dshSeen.add(real);anon+=1;if(isLoopbackHost(url.hostname)){rewriteKeys.add(`dsh-${anon}`);httpRewrites.push({key:`dsh-${anon}`,realUpstream:real})}else if(url.protocol==="https:"){const host=url.hostname.toLowerCase();if(host&&!httpsSeen.has(host)){httpsSeen.add(host);httpsDomains.push(host)}}else if(!httpEnvRoutes.includes(real)){httpEnvRoutes.push(real)}}catch{}}}else if(client==="kimi"){const kimiSeen=new Set;let anon=0;const kimiUrls=[];for(const prov of Object.values(config.kimi?.providers??{})){if(nonEmpty2(prov.baseUrl))kimiUrls.push(prov.baseUrl)}for(const raw of[...config.kimi?.modelUrls??[],...config.kimi?.envUrls??[]]){kimiUrls.push(raw)}for(const raw of kimiUrls){const real=unwrapUpstream2(raw);try{const url=new URL(real);if(url.protocol!=="http:"&&url.protocol!=="https:")continue;if(kimiSeen.has(real))continue;kimiSeen.add(real);if(isLoopbackHost(url.hostname)){if(raw!==real)continue;anon+=1;rewriteKeys.add(`kimi-${anon}`);httpRewrites.push({key:`kimi-${anon}`,realUpstream:real})}else if(url.protocol==="https:"){const host=url.hostname.toLowerCase();if(host&&!httpsSeen.has(host)){httpsSeen.add(host);httpsDomains.push(host)}}else if(!httpEnvRoutes.includes(real)){httpEnvRoutes.push(real)}}catch{}}if(kimiUrls.length===0){for(const h of KIMI_DEFAULT_MODEL_HOSTS){if(!httpsSeen.has(h)){httpsSeen.add(h);httpsDomains.push(h)}}}}else if(client==="mcode"){const mcodeSeen=new Set;let anon=0;const mcodeUrls=[];for(const prov of Object.values(config.mcode?.providers??{})){if(nonEmpty2(prov.baseUrl))mcodeUrls.push(prov.baseUrl)}for(const raw of mcodeUrls){const real=unwrapUpstream2(raw);try{const url=new URL(real);if(url.protocol!=="http:"&&url.protocol!=="https:")continue;if(mcodeSeen.has(real))continue;mcodeSeen.add(real);if(isLoopbackHost(url.hostname)){if(raw!==real)continue;anon+=1;rewriteKeys.add(`mcode-${anon}`);httpRewrites.push({key:`mcode-${anon}`,realUpstream:real})}else if(url.protocol==="https:"){const host=url.hostname.toLowerCase();if(host&&!httpsSeen.has(host)){httpsSeen.add(host);httpsDomains.push(host)}}else if(!httpEnvRoutes.includes(real)){httpEnvRoutes.push(real)}}catch{}}if(mcodeUrls.length===0){for(const h of MCODE_DEFAULT_MODEL_HOSTS){if(!httpsSeen.has(h)){httpsSeen.add(h);httpsDomains.push(h)}}}}else if(client==="qoder"){const hosts=nonEmpty2(config.qoder?.modelServerHost)?[config.qoder.modelServerHost]:QODER_DEFAULT_MODEL_HOSTS;for(const host of hosts){const h=host.toLowerCase();if(h&&!httpsSeen.has(h)){httpsSeen.add(h);httpsDomains.push(h)}}}else if(client==="trae"){const hosts=nonEmpty2(config.trae?.modelApiHost)?[config.trae.modelApiHost]:TRAE_DEFAULT_MODEL_HOSTS;for(const h of hosts){const host=h.split(":",2)[0].toLowerCase();if(host&&!httpsSeen.has(host)){httpsSeen.add(host);httpsDomains.push(host)}}}else if(client==="jcode"){for(const h of JCODE_DEFAULT_MODEL_HOSTS){const host=h.split(":",2)[0].toLowerCase();if(host&&!httpsSeen.has(host)){httpsSeen.add(host);httpsDomains.push(host)}}}else if(client==="gemini"){const raw=nonEmpty2(config.gemini?.baseUrl)?config.gemini.baseUrl:"https://generativelanguage.googleapis.com";const real=unwrapUpstream2(raw);try{const url=new URL(real);if((url.protocol==="https:"||url.protocol==="http:")&&!rewriteKeys.has("GOOGLE_GEMINI_BASE_URL")){rewriteKeys.add("GOOGLE_GEMINI_BASE_URL");httpRewrites.push({key:"GOOGLE_GEMINI_BASE_URL",realUpstream:real})}}catch{}}else if(client==="iflow"){const raw=nonEmpty2(config.iflow?.baseUrl)?config.iflow.baseUrl:"https://apis.iflow.cn/v1";const real=unwrapUpstream2(raw);try{const url=new URL(real);if((url.protocol==="https:"||url.protocol==="http:")&&!rewriteKeys.has("IFLOW_BASE_URL")){rewriteKeys.add("IFLOW_BASE_URL");httpRewrites.push({key:"IFLOW_BASE_URL",realUpstream:real})}}catch{}}else if(client==="qwen"){for(const h of QWEN_DEFAULT_MODEL_HOSTS){const host=h.toLowerCase();if(!httpsSeen.has(host)){httpsSeen.add(host);httpsDomains.push(host)}}}else if(client==="aider"){const aiderSeen=new Set;let anon=0;for(const raw of config.aider?.baseUrls??[]){const real=unwrapUpstream2(raw);try{const url=new URL(real);if(url.protocol!=="http:"&&url.protocol!=="https:")continue;if(aiderSeen.has(real))continue;aiderSeen.add(real);if(isLoopbackHost(url.hostname)){anon+=1;rewriteKeys.add(`aider-${anon}`);httpRewrites.push({key:`aider-${anon}`,realUpstream:real})}else if(url.protocol==="https:"){const host=url.hostname.toLowerCase();if(host&&!httpsSeen.has(host)){httpsSeen.add(host);httpsDomains.push(host)}}else if(!httpEnvRoutes.includes(real)){httpEnvRoutes.push(real)}}catch{}}if((config.aider?.baseUrls??[]).length===0){for(const h of AIDER_DEFAULT_MODEL_HOSTS){if(!httpsSeen.has(h)){httpsSeen.add(h);httpsDomains.push(h)}}}}else if(client==="copilot"){for(const h of COPILOT_DEFAULT_MODEL_HOSTS){const host=h.split(":",2)[0].toLowerCase();if(host&&!httpsSeen.has(host)){httpsSeen.add(host);httpsDomains.push(host)}}}else if(client==="amp"){for(const h of AMP_DEFAULT_MODEL_HOSTS){const host=h.split(":",2)[0].toLowerCase();if(host&&!httpsSeen.has(host)){httpsSeen.add(host);httpsDomains.push(host)}}}else if(client==="goose"){const seen=new Set;for(const[name,raw]of Object.entries(config.goose?.customProviders??{})){const real=unwrapUpstream2(raw);try{const url=new URL(real);if(url.protocol!=="http:"&&url.protocol!=="https:")continue;if(seen.has(real))continue;seen.add(real);rewriteKeys.add(name);httpRewrites.push({key:name,realUpstream:real})}catch{}}}else{for(const[name,prov]of Object.entries(config.codex?.providers??{})){classify(prov.baseUrl,`model_providers.${name}.base_url`)}classify(config.codex?.openaiBaseUrl,"openai_base_url")}return{httpsDomains,httpRewrites,httpsRewrites,httpEnvRoutes}}function discoverDomains(client,config){return discoverRoutes(client,config).httpsDomains}function buildPiEnv(origin,caPath,baseEnv,httpRewrites=[],httpsRewrites=[],mitmHosts=[]){const manifest={};for(const r of httpRewrites){if(r.key.length===0||r.realUpstream.length===0)continue;manifest[r.key]=wrapUpstream(origin,r.realUpstream)}for(const r of httpsRewrites){if(r.key.length===0||r.realUpstream.length===0)continue;manifest[r.key]=r.realUpstream}return{...baseEnv,HTTPS_PROXY:origin,NODE_EXTRA_CA_CERTS:caPath,BILLION_CONTEXT_PROXY:origin,...Object.keys(manifest).length>0?{BILI_PROVIDER_REWRITES:JSON.stringify(manifest)}:{},...mitmHosts.length>0?{BILI_MITM_HOSTS:mitmHosts.join(",")}:{}}}function buildCodexEnv(origin,caPath,baseEnv){return{...baseEnv,HTTPS_PROXY:origin,SSL_CERT_FILE:caPath,BILLION_CONTEXT_PROXY:origin}}function buildTraeEnv(origin,caPath,baseEnv){return{...baseEnv,HTTPS_PROXY:origin,SSL_CERT_FILE:caPath,BILLION_CONTEXT_PROXY:origin}}function buildJcodeEnv(origin,caPath,baseEnv){return{...baseEnv,HTTPS_PROXY:origin,SSL_CERT_FILE:caPath,BILLION_CONTEXT_PROXY:origin,NO_PROXY:"localhost,127.0.0.1,::1",no_proxy:"localhost,127.0.0.1,::1"}}function buildAiderEnv(origin,caBundle,baseEnv,routeHttp){return{...baseEnv,HTTPS_PROXY:origin,...routeHttp?{HTTP_PROXY:origin}:{},SSL_CERT_FILE:caBundle,REQUESTS_CA_BUNDLE:caBundle,BILLION_CONTEXT_PROXY:origin,NO_PROXY:"localhost,127.0.0.1,::1",no_proxy:"localhost,127.0.0.1,::1"}}function buildCopilotEnv(origin,caPath,baseEnv){return{...baseEnv,HTTPS_PROXY:origin,SSL_CERT_FILE:caPath,BILLION_CONTEXT_PROXY:origin}}function buildAmpEnv(origin,caPath,baseEnv){return{...baseEnv,HTTPS_PROXY:origin,SSL_CERT_FILE:caPath,BILLION_CONTEXT_PROXY:origin}}function buildCodexArgs(origin,httpRewrites,httpsRewrites,extra){const args=[];for(const r of httpRewrites){args.push("-c",`${r.key}=${wrapUpstream(origin,r.realUpstream)}`)}for(const r of httpsRewrites){args.push("-c",`${r.key}=${r.realUpstream}`)}args.push(...extra);return args}async function resolveLauncherWindow(model,routes,upstreamUrl){if(!model)return void 0;let host;if(upstreamUrl){try{host=new URL(upstreamUrl).hostname}catch{host=void 0}}return resolveConfiguredContextLimit(routes,upstreamUrl,model)??lookupContextLimit(model)??await contextFromRegistry(model,host)}function codexUpstreamUrl(codex){const provider=codex?.modelProvider?codex?.providers?.[codex.modelProvider]?.baseUrl:void 0;return provider??codex?.openaiBaseUrl??"https://api.openai.com/v1"}async function resolveCodexBudgetArgs(opts){const{model,clientWindow,clientAutoCompactLimit,routes,upstreamUrl}=opts;if(!model||clientWindow)return[];const window2=await resolveLauncherWindow(model,routes,upstreamUrl);if(!window2)return[];const limit=clientAutoCompactLimit??window2;return["-c",`model_context_window=${window2}`,"-c",`model_auto_compact_token_limit=${limit}`]}async function resolveClaudeBudgetEnv(opts){const{model,userAutoCompactWindow,shellAutoCompactWindow,routes,upstreamUrl}=opts;if(!model||userAutoCompactWindow!==void 0||nonEmpty2(shellAutoCompactWindow))return{};const window2=await resolveLauncherWindow(model,routes,upstreamUrl);if(!window2)return{};return{CLAUDE_CODE_AUTO_COMPACT_WINDOW:String(window2)}}function buildClaudeEnv(origin,caPath,httpRewrites,httpsRewrites,baseEnv){const env={...baseEnv,HTTPS_PROXY:origin,NODE_EXTRA_CA_CERTS:caPath,BILLION_CONTEXT_PROXY:origin};const r=httpRewrites.find(rw=>rw.key==="ANTHROPIC_BASE_URL");if(r)env.ANTHROPIC_BASE_URL=wrapUpstream(origin,r.realUpstream);const hr2=httpsRewrites.find(rw=>rw.key==="ANTHROPIC_BASE_URL");if(hr2)env.ANTHROPIC_BASE_URL=hr2.realUpstream;return env}async function resolveCodebuddyBudgetEnv(opts){const{model,userAutoCompactWindow,shellAutoCompactWindow,routes,upstreamUrl}=opts;if(!model||userAutoCompactWindow!==void 0||nonEmpty2(shellAutoCompactWindow))return{};const window2=await resolveLauncherWindow(model,routes,upstreamUrl);if(!window2)return{};return{CODEBUDDY_AUTO_COMPACT_WINDOW:String(window2)}}function buildCodebuddyEnv(origin,caPath,httpRewrites,httpsRewrites,baseEnv){const env={...baseEnv,HTTPS_PROXY:origin,NODE_EXTRA_CA_CERTS:caPath,BILLION_CONTEXT_PROXY:origin};const r=httpRewrites.find(rw=>rw.key==="CODEBUDDY_BASE_URL");if(r)env.CODEBUDDY_BASE_URL=wrapUpstream(origin,r.realUpstream);const hr2=httpsRewrites.find(rw=>rw.key==="CODEBUDDY_BASE_URL");if(hr2)env.CODEBUDDY_BASE_URL=hr2.realUpstream;return env}function buildQoderEnv(origin,caPath,baseEnv){return{...baseEnv,HTTPS_PROXY:origin,NODE_EXTRA_CA_CERTS:caPath,BILLION_CONTEXT_PROXY:origin}}function buildGeminiEnv(origin,caPath,httpRewrites,httpsRewrites,baseEnv){const env={...baseEnv,BILLION_CONTEXT_PROXY:origin};const r=httpRewrites.find(rw=>rw.key==="GOOGLE_GEMINI_BASE_URL");if(r)env.GOOGLE_GEMINI_BASE_URL=wrapUpstream(origin,r.realUpstream);const hr2=httpsRewrites.find(rw=>rw.key==="GOOGLE_GEMINI_BASE_URL");if(hr2)env.GOOGLE_GEMINI_BASE_URL=hr2.realUpstream;return env}function buildIflowEnv(origin,caPath,httpRewrites,httpsRewrites,baseEnv){const env={...baseEnv,BILLION_CONTEXT_PROXY:origin};const r=httpRewrites.find(rw=>rw.key==="IFLOW_BASE_URL");if(r){env.IFLOW_BASE_URL=wrapUpstream(origin,r.realUpstream);env.IFLOW_baseUrl=env.IFLOW_BASE_URL}const hr2=httpsRewrites.find(rw=>rw.key==="IFLOW_BASE_URL");if(hr2){env.IFLOW_BASE_URL=hr2.realUpstream;env.IFLOW_baseUrl=hr2.realUpstream}return env}function buildQwenEnv(origin,caPath,baseEnv){return{...baseEnv,HTTPS_PROXY:origin,NODE_EXTRA_CA_CERTS:caPath,BILLION_CONTEXT_PROXY:origin,NO_PROXY:"localhost,127.0.0.1,::1",no_proxy:"localhost,127.0.0.1,::1"}}async function resolveQoderBudgetEnv(opts){const{model,userAutoCompactWindow,windowKey,routes,upstreamUrl}=opts;if(!model||nonEmpty2(userAutoCompactWindow))return{};const window2=await resolveLauncherWindow(model,routes,upstreamUrl);if(!window2)return{};return{[windowKey]:String(window2)}}function launcherDirectUrl(env){return env.BILI_LAUNCHER_DIRECT==="1"}function isPrivateUpstreamHost(raw){let host;try{host=new URL(raw).hostname.toLowerCase()}catch{return false}if(host==="localhost"||host.endsWith(".local")||host.endsWith(".lan")||host.endsWith(".internal"))return true;if(host.startsWith("["))host=host.slice(1,-1);if(host.includes(":")){if(host==="::1"||host==="::")return true;const first=host.split(":")[0]??"";if(/^f[cd]/.test(first))return true;if(/^fe[89ab]/.test(first))return true;const dotted=/::ffff:(\d+\.\d+\.\d+\.\d+)$/.exec(host);if(dotted&&isPrivateIPv4(dotted[1]))return true;const hex=/::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(host);if(hex){const w1=Number.parseInt(hex[1],16);const w2=Number.parseInt(hex[2],16);if(isPrivateIPv4(`${w1>>8}.${w1&255}.${w2>>8}.${w2&255}`))return true}return false}if(/^\d+\.\d+\.\d+\.\d+$/.test(host))return isPrivateIPv4(host);return false}function isPrivateIPv4(host){const a=Number.parseInt(host.split(".")[0]??"",10);const b2=Number.parseInt(host.split(".")[1]??"",10);if(a===127||a===10||a===0)return true;if(a===172&&b2>=16&&b2<=31)return true;if(a===192&&b2===168)return true;if(a===169&&b2===254)return true;return false}function launcherInjectMcp(env,base,codexUpstream){if(base==="pi"||base==="omp"||base==="opencode"||base==="hermes"||base==="dsh"||base==="codebuddy"||base==="qoder"||base==="trae"||base==="jcode"||base==="kimi"||base==="gemini"||base==="iflow"||base==="qwen"||base==="mcode"||base==="aider"||base==="copilot"||base==="amp"||base==="goose")return false;if(env.BILI_LAUNCHER_PLUGIN==="0")return false;if(base==="codex"&&env.BILI_LAUNCHER_PLUGIN===void 0&&codexUpstream!==void 0&&isPrivateUpstreamHost(codexUpstream)){return false}return true}function buildMcpConfig(origin){const script=selfDistFile("mcp.js");return{mcpServers:{bili:{command:process.execPath,args:[script],env:{BILI_MCP_PROXY:origin}}}}}function buildClaudePluginEnv(origin,directUrl,baseEnv){if(!directUrl)return baseEnv;const upstream=baseEnv.BILI_CLAUDE_UPSTREAM?.trim()||"https://api.anthropic.com";return{...baseEnv,ANTHROPIC_BASE_URL:wrapUpstream(origin,upstream)}}function buildClaudeSettingsArg(platform,override){const payload=JSON.stringify({env:{ANTHROPIC_BASE_URL:override}});if(platform!=="win32")return{clientArgs:["--settings",payload]};const tmpFile=path26.join(os5.tmpdir(),`bili-claude-settings-${Date.now()}.json`);fs14.writeFileSync(tmpFile,payload);return{clientArgs:["--settings",tmpFile],tmpFile}}function buildCodexMcpArgs(origin,conversationId2){const script=selfDistFile("mcp.js");return["-c",`mcp_servers.bili.command=${JSON.stringify(process.execPath)}`,"-c",`mcp_servers.bili.args=${JSON.stringify([script])}`,"-c",`mcp_servers.bili.env.BILI_MCP_PROXY=${JSON.stringify(origin)}`,"-c",`mcp_servers.bili.env.BILI_CONVERSATION_ID=${JSON.stringify(conversationId2)}`]}function prepareCodexMcpInjection(opts){if(opts.platform!=="win32"){return{clientArgs:buildCodexMcpArgs(opts.origin,opts.conversationId),envPatch:{}}}const overlay=prepareCodexHome(opts.codexHome,opts.origin,opts.conversationId);if(!overlay){return{clientArgs:[],envPatch:{},warning:"could not prepare the codex MCP overlay (<CODEX_HOME>-bili) \u2014 launching without native bili MCP tools; wire-injected compression is still active."}}return{clientArgs:[],envPatch:{CODEX_HOME:overlay}}}function overlayLockPath(overlay){return path26.join(overlay,".bili-launch.pid")}function livePidHoldsOverlay(overlay){let raw;try{raw=fs14.readFileSync(overlayLockPath(overlay),"utf8")}catch{return void 0}const pid=Number.parseInt(raw.trim(),10);if(!Number.isInteger(pid)||pid<=0||pid===process.pid)return void 0;try{process.kill(pid,0)}catch(err2){if(err2.code==="ESRCH")return void 0}return pid}function linkOverlayEntry(realHome,overlay,entry){const target=path26.join(realHome,entry);const link=path26.join(overlay,entry);let st2;try{st2=fs14.lstatSync(target)}catch{return false}const kind=st2.isDirectory()?process.platform==="win32"?"junction":"dir":"file";try{fs14.symlinkSync(target,link,kind);return true}catch(err2){const code=err2.code;if(code!=="EPERM"&&code!=="EACCES"&&code!=="EINVAL")return false}if(st2.isDirectory()){try{fs14.symlinkSync(target,link,"junction");return true}catch{return false}}try{fs14.linkSync(target,link);return true}catch{try{fs14.copyFileSync(target,link);return true}catch{return false}}}function isWriteThroughHardlink(overlayPath,realPath,st2){if(st2.isDirectory()||st2.isSymbolicLink()||st2.nlink<=1)return false;try{const realSt=fs14.lstatSync(realPath);return st2.dev===realSt.dev&&st2.ino===realSt.ino}catch{return false}}function sqliteSetMembers(base){return[base,`${base}-wal`,`${base}-shm`,`${base}-journal`]}function freeConflictName(dst){let candidate=`${dst}.bili-conflict`;let n=1;while(n<1e5){try{fs14.lstatSync(candidate);candidate=`${dst}.bili-conflict.${n}`;n+=1}catch{return candidate}}return candidate}function mergeSqliteSet(overlay,realHome,base){const members=sqliteSetMembers(base);const statFile=(dir,m2)=>{try{const st2=fs14.lstatSync(path26.join(dir,m2));return st2.isFile()?st2:void 0}catch{return void 0}};const oMain=statFile(overlay,base);const rMain=statFile(realHome,base);let winner;if(oMain&&rMain)winner=rMain.mtimeMs>=oMain.mtimeMs?"real":"overlay";else if(oMain)winner="overlay";else if(rMain)winner="real";else winner="orphan";const undo=[];const rollback=()=>{for(const step of undo.reverse()){try{step()}catch{}}undo.length=0};const movePreserving=(src,dst)=>{let dstStat;try{dstStat=fs14.lstatSync(dst)}catch{}if(dstStat){if(dstStat.isDirectory())throw new Error("target is a directory");const conflict=freeConflictName(dst);fs14.renameSync(dst,conflict);undo.push(()=>fs14.renameSync(conflict,dst))}fs14.renameSync(src,dst);undo.push(()=>fs14.renameSync(dst,src))};const preserveAsConflict=(src,name)=>{const conflict=freeConflictName(path26.join(realHome,name));fs14.renameSync(src,conflict);undo.push(()=>fs14.renameSync(conflict,src))};try{for(const m2 of members){const o=statFile(overlay,m2);const r=statFile(realHome,m2);if(winner==="overlay"){if(o)movePreserving(path26.join(overlay,m2),path26.join(realHome,m2));else if(r)preserveAsConflict(path26.join(realHome,m2),m2)}else if(winner==="real"){if(o)preserveAsConflict(path26.join(overlay,m2),m2)}else{if(o)preserveAsConflict(path26.join(overlay,m2),m2);else if(r)preserveAsConflict(path26.join(realHome,m2),m2)}}return true}catch{rollback();return false}}function refreshOverlayHome(realHome,overlay,generatedFile){const generatedFiles=new Set(Array.isArray(generatedFile)?generatedFile:[generatedFile]);const isGeneratedDraft=name=>[...generatedFiles].some(g2=>name.startsWith(`.${g2}.`)&&name.endsWith(".tmp"));try{fs14.mkdirSync(overlay,{recursive:true})}catch{return false}const holder=livePidHoldsOverlay(overlay);if(holder!==void 0){console.error(`bili: another bili launch (pid ${holder}) is using ${overlay} \u2014 concurrent launches share this overlay and the last one's proxy port wins in the generated config.`)}try{fs14.writeFileSync(overlayLockPath(overlay),`${process.pid}
|
|
2306
2306
|
`)}catch{}const realEntries=new Set;try{for(const entry of fs14.readdirSync(realHome))realEntries.add(entry)}catch{}try{let overlayEntries;try{overlayEntries=fs14.readdirSync(overlay)}catch{overlayEntries=[]}const dbSets=[];for(const entry of overlayEntries){if(!entry.endsWith(".db")||generatedFiles.has(entry))continue;const members=sqliteSetMembers(entry);if(!members.some(m2=>m2!==entry&&overlayEntries.includes(m2)))continue;let mainSt;try{mainSt=fs14.lstatSync(path26.join(overlay,entry))}catch{}const keepSidecars=mainSt!==void 0&&isWriteThroughHardlink(path26.join(overlay,entry),path26.join(realHome,entry),mainSt);dbSets.push({base:entry,keepSidecars})}const skipEntries=new Set;for(const{base,keepSidecars}of dbSets){for(const m2 of sqliteSetMembers(base)){if(keepSidecars?m2!==base:true)skipEntries.add(m2)}}for(const entry of overlayEntries){if(generatedFiles.has(entry))continue;const overlayPath=path26.join(overlay,entry);if(isGeneratedDraft(entry)){try{fs14.unlinkSync(overlayPath)}catch{}continue}if(skipEntries.has(entry))continue;let st2;try{st2=fs14.lstatSync(overlayPath)}catch{continue}if(st2.isSymbolicLink()){let target;try{target=fs14.readlinkSync(overlayPath)}catch{}const wanted=realEntries.has(entry)?path26.join(realHome,entry):void 0;if(!wanted||target!==wanted){try{fs14.unlinkSync(overlayPath)}catch{}}}else if(realEntries.has(entry)){const realPath=path26.join(realHome,entry);if(isWriteThroughHardlink(overlayPath,realPath,st2)){try{fs14.unlinkSync(overlayPath)}catch{}}else if(mergeOverlayEntry(overlayPath,realPath,generatedFiles)){try{fs14.rmSync(overlayPath,{recursive:true,force:true})}catch{}}else{console.error(`bili: could not merge ${overlayPath} into ${realHome} \u2014 kept in place, resolve manually.`)}}}for(const{base,keepSidecars}of dbSets){if(keepSidecars)continue;if(!mergeSqliteSet(overlay,realHome,base)){console.error(`bili: could not merge the SQLite set ${base} / ${base}-wal / ${base}-shm into ${realHome} (the real db is likely open/locked) \u2014 kept in the overlay, retry on the next launch.`)}}let accessible=0;let total=0;const linkFailures=[];for(const entry of realEntries){if(generatedFiles.has(entry))continue;total+=1;const overlayPath=path26.join(overlay,entry);let present=false;try{fs14.lstatSync(overlayPath);present=true}catch{}if(present){accessible+=1;continue}if(linkOverlayEntry(realHome,overlay,entry)){accessible+=1}else{linkFailures.push(entry)}}if(total>0&&accessible===0){console.error(`bili: overlay ${overlay} is HOLLOW \u2014 none of ${total} real-home entries is reachable (on Windows, symlink creation is denied without Developer Mode and the junction/hardlink/copy fallbacks also failed). The client will start from its real home without the bili config rewrite.`);return false}if(linkFailures.length>0){console.error(`bili: overlay ${overlay} \u2014 could not link ${linkFailures.length} entr${linkFailures.length===1?"y":"ies"}: ${linkFailures.join(", ")}. The client may miss those (on Windows, enable Developer Mode for full symlink support).`)}}catch{}return true}function mergeOverlayEntry(src,dst,excludedNames){let st2;try{st2=fs14.lstatSync(src)}catch{return true}let dstStat;try{dstStat=fs14.lstatSync(dst)}catch{}if(st2.isDirectory()){if(dstStat&&!dstStat.isDirectory()){try{fs14.renameSync(dst,freeConflictName(dst));dstStat=void 0}catch{return false}}try{fs14.mkdirSync(dst,{recursive:true})}catch{return false}let entries;try{entries=fs14.readdirSync(src)}catch{return false}let ok=true;for(const entry of entries){if(excludedNames?.has(entry))continue;if(!mergeOverlayEntry(path26.join(src,entry),path26.join(dst,entry),excludedNames))ok=false}return ok}if(dstStat&&dstStat.isDirectory()){try{fs14.renameSync(src,freeConflictName(dst));return true}catch{return false}}if(st2.isSymbolicLink()){if(dstStat){try{fs14.unlinkSync(src)}catch{}return true}try{fs14.renameSync(src,dst)}catch{return false}return true}if(dstStat&&dstStat.mtimeMs>=st2.mtimeMs){try{fs14.renameSync(src,freeConflictName(dst));return true}catch{return false}}if(dstStat){try{fs14.renameSync(dst,freeConflictName(dst))}catch{return false}}try{fs14.renameSync(src,dst);return true}catch{return false}}function piPluginInstalled(piHome){const root=selfPackageRoot();if(!root)return false;try{const parsed=JSON.parse(fs14.readFileSync(path26.join(piHome,"settings.json"),"utf8"));const list=Array.isArray(parsed.packages)?parsed.packages.map(String):[];return list.some(p2=>isBiliPiEntry(p2,root)&&piEntryLoadable(p2))}catch{return false}}function piEntryLoadable(entry){return entry.startsWith("npm:")||fs14.existsSync(entry)}function writeOverlayFileAtomic(overlay,fileName,contents){const draft=path26.join(overlay,`.${fileName}.${process.pid}.tmp`);try{fs14.writeFileSync(draft,contents);fs14.renameSync(draft,path26.join(overlay,fileName))}catch{try{fs14.rmSync(draft,{force:true})}catch{}}}function prepareDshHome(dshHome,origin,rewrites){const cfgPath=path26.join(dshHome,"settings.yaml");let txt;try{txt=fs14.readFileSync(cfgPath,"utf8")}catch{return void 0}const wrapSet=new Set(rewrites.map(r=>r.realUpstream));const eol=txt.includes("\r\n")?"\r\n":"\n";const lines=txt.split(/\r?\n/);let changed=false;for(let i=0;i<lines.length;i++){const m2=/^(\s*(?:baseURL|baseUrl|base_url):\s*)(\S+)(\s+#.*)?$/.exec(lines[i]);if(!m2)continue;const rawUrl=m2[2].replace(/^["']|["']$/g,"");if(!/^https?:\/\//i.test(rawUrl))continue;const real=unwrapUpstream2(rawUrl);if(!wrapSet.has(real))continue;lines[i]=`${m2[1]}${wrapUpstream(origin,real)}${m2[3]??""}`;changed=true}if(!changed)return void 0;const overlay=`${dshHome}-bili`;if(!refreshOverlayHome(dshHome,overlay,"settings.yaml"))return void 0;writeOverlayFileAtomic(overlay,"settings.yaml",lines.join(eol));return overlay}function prepareGooseHome(env,origin,rewrites){if(rewrites.length===0)return void 0;const dirs=resolveGooseDirs(env);const root=nonEmpty2(env.GOOSE_PATH_ROOT)?`${env.GOOSE_PATH_ROOT}-bili`:`${dirs.configDir}-bili`;try{fs14.mkdirSync(root,{recursive:true})}catch{return void 0}for(const[name,target]of[["data",dirs.dataDir],["state",dirs.stateDir],[".agents",dirs.agentsDir]]){fs14.mkdirSync(target,{recursive:true});const link=path26.join(root,name);try{const st2=fs14.lstatSync(link);if(st2.isSymbolicLink()){if(fs14.readlinkSync(link)!==target){fs14.rmSync(link);fs14.symlinkSync(target,link)}}else{return void 0}}catch{try{fs14.symlinkSync(target,link)}catch{return void 0}}}const cfg=path26.join(root,"config");try{fs14.rmSync(cfg,{recursive:true,force:true})}catch{}try{fs14.mkdirSync(cfg,{recursive:true})}catch{return void 0}let realEntries=[];try{realEntries=fs14.readdirSync(dirs.configDir)}catch{}for(const name of realEntries){try{fs14.cpSync(path26.join(dirs.configDir,name),path26.join(cfg,name),{recursive:true})}catch{}}const wrapSet=new Set(rewrites.map(r=>r.realUpstream));const patchedFiles=new Set;let cpEntries=[];try{cpEntries=fs14.readdirSync(path26.join(cfg,"custom_providers"))}catch{}for(const name of cpEntries){if(!name.endsWith(".toml"))continue;const file=path26.join(cfg,"custom_providers",name);let txt;try{txt=fs14.readFileSync(file,"utf8")}catch{continue}const eol=txt.includes("\r\n")?"\r\n":"\n";let changed=false;const lines=txt.split(/\r?\n/).map(line=>{const m2=/^(\s*base_url\s*=\s*)(["'])([^"']+)\2(\s*(?:#.*)?)$/.exec(line);if(!m2)return line;const rawUrl=m2[3];if(!/^https?:\/\//i.test(rawUrl))return line;const real=unwrapUpstream2(rawUrl);if(!wrapSet.has(real))return line;changed=true;return`${m2[1]}${m2[2]}${wrapUpstream(origin,real)}${m2[2]}${m2[4]??""}`});if(changed){try{fs14.writeFileSync(file,lines.join(eol));patchedFiles.add(path26.join("custom_providers",name))}catch{}}}const snapshot=new Map;const walk=dir=>{let entries=[];try{entries=fs14.readdirSync(dir)}catch{return}for(const name of entries){const p2=path26.join(dir,name);const st2=fs14.lstatSync(p2);if(st2.isDirectory()){walk(p2)}else if(st2.isFile()&&!patchedFiles.has(path26.relative(cfg,p2))){try{snapshot.set(path26.relative(cfg,p2),fs14.readFileSync(p2,"utf8"))}catch{}}}};walk(cfg);return{root,realConfigDir:dirs.configDir,patchedFiles,snapshot}}function finalizeGooseHome(overlay){const cfg=path26.join(overlay.root,"config");const walk=dir=>{let entries=[];try{entries=fs14.readdirSync(dir)}catch{return}for(const name of entries){const p2=path26.join(dir,name);let st2;try{st2=fs14.lstatSync(p2)}catch{continue}if(st2.isDirectory()){walk(p2);continue}if(!st2.isFile())continue;const rel2=path26.relative(cfg,p2);if(overlay.patchedFiles.has(rel2))continue;let cur;try{cur=fs14.readFileSync(p2,"utf8")}catch{continue}if(overlay.snapshot.get(rel2)===cur)continue;const dest=path26.join(overlay.realConfigDir,rel2);try{fs14.mkdirSync(path26.dirname(dest),{recursive:true});fs14.writeFileSync(dest,cur)}catch{}}};walk(cfg)}function stripCodexBiliBlock(text){const m2=/^[ \t]*\[mcp_servers\.bili\][ \t]*$/m.exec(text);if(m2===null)return text;const start=m2.index;const lineStart=text.lastIndexOf("\n",start-1)+1;const after=text.slice(start);const firstNewline=after.indexOf("\n");const nextTable=firstNewline<0?-1:after.slice(firstNewline+1).search(/^[ \t]*\[/m);const end=nextTable>=0?start+firstNewline+1+nextTable:text.length;return(text.slice(0,lineStart).replace(/\n+$/,"\n")+text.slice(end)).replace(/^\n+/,"")}function mergeCodexBiliBlock(text,origin,conversationId2){const script=selfDistFile("mcp.js");const block=`
|