billion-context 0.1.170 → 0.1.171

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 CHANGED
@@ -2170,10 +2170,10 @@ data: ${JSON.stringify({type:"response.failed",response:resp})}
2170
2170
  [acp-proxy: ${message}]
2171
2171
  `),buildFinish("stop",null),Buffer.from("data: [DONE]\n\n","utf8")])}return Buffer.concat([Buffer.from(`data: ${JSON.stringify({error:{type:"server_error",code:"upstream_error",message:`[acp-proxy: ${message}]`}})}
2172
2172
 
2173
- `,"utf8"),Buffer.from("data: [DONE]\n\n","utf8")])}}}async function*iterSseEvents2(stream2){const reader=stream2.getReader();const decoder=new TextDecoder;let buf="";try{while(true){let done;let value;try{({done,value}=await reader.read())}catch{break}if(done)break;buf+=decoder.decode(value,{stream:true});buf=buf.replace(/\r\n|\r/g,"\n");let idx;while((idx=buf.indexOf("\n\n"))>=0){const raw=buf.slice(0,idx);buf=buf.slice(idx+2);if(raw.trim().length>0)yield raw}}if(buf.trim().length>0)yield buf}finally{reader.releaseLock()}}function parseAnthropicSse(eventStr){const lines=eventStr.split("\n");let type="";const dataLines=[];for(const l of lines){if(l.startsWith("event:"))type=l.slice(6).trim();else if(l.startsWith("data:"))dataLines.push(l.slice(5).replace(/^ /,""))}if(!type)return null;const jsonStr=dataLines.join("\n").trim();if(!jsonStr)return{type,data:{}};try{return{type,data:JSON.parse(jsonStr)}}catch{return{type,data:{}}}}function remapIndexInEvent(eventStr,newIndex){const lines=eventStr.split("\n");const rebuilt=[];let touched=false;for(const l of lines){if(!touched&&l.startsWith("data:")){const jsonStr=l.slice(5).replace(/^ /,"");try{const obj=JSON.parse(jsonStr);if(typeof obj==="object"&&obj!==null&&typeof obj.index==="number"){obj.index=newIndex;rebuilt.push(`data: ${JSON.stringify(obj)}`);touched=true;continue}}catch{}}rebuilt.push(l)}return Buffer.from(rebuilt.join("\n")+"\n\n","utf8")}function neutralizeStartUsage(eventStr){const lines=eventStr.split("\n");const rebuilt=[];for(const l of lines){if(l.startsWith("data:")){const jsonStr=l.slice(5).replace(/^ /,"");try{const obj=JSON.parse(jsonStr);if(typeof obj==="object"&&obj!==null&&obj.type==="message_start"){const msg=obj.message;if(msg&&typeof msg==="object"){msg.usage={input_tokens:0,output_tokens:0};rebuilt.push(`data: ${JSON.stringify(obj)}`);continue}}}catch{}}rebuilt.push(l)}return Buffer.from(rebuilt.join("\n")+"\n\n","utf8")}function rewriteTextDeltaEvent(eventStr,newIndex,newText){const lines=eventStr.split("\n");const rebuilt=[];for(const l of lines){if(l.startsWith("data:")){const jsonStr=l.slice(5).replace(/^ /,"");try{const obj=JSON.parse(jsonStr);if(typeof obj==="object"&&obj!==null&&typeof obj.index==="number"){obj.index=newIndex;const d=obj.delta;if(d&&typeof d.text==="string")d.text=newText;rebuilt.push(`data: ${JSON.stringify(obj)}`);continue}}catch{}}rebuilt.push(l)}return Buffer.from(rebuilt.join("\n")+"\n\n","utf8")}function buildTextDeltaEvent(index,text){return Buffer.from(`event: content_block_delta
2173
+ `,"utf8"),Buffer.from("data: [DONE]\n\n","utf8")])}}}var MESSAGE_MARK_CAP=3;function computeAnthropicMessageMarks(processed,ephemeralTailCount,session){const marks=new Map;if(process.env.BILI_NO_CACHE_CONTROL){session.metadata["anthropicCacheMarkIds"]=[];return marks}if(processed.length===0||processed.length<=ephemeralTailCount){session.metadata["anthropicCacheMarkIds"]=[];return marks}const liveIds=new Set(processed.map(m2=>m2.id).filter(id=>typeof id==="string"&&id.length>0));const kept=(session.metadata["anthropicCacheMarkIds"]??[]).filter(id=>liveIds.has(id));const lastIndex=processed.length-1-ephemeralTailCount;const currentId=processed[lastIndex]?.id;if(typeof currentId==="string"&&currentId.length>0&&!kept.includes(currentId)&&kept.length<MESSAGE_MARK_CAP){kept.push(currentId)}session.metadata["anthropicCacheMarkIds"]=kept;for(const id of kept)marks.set(id,{type:"ephemeral"});return marks}function anthropicToolsCarryCacheControl(tools){if(!Array.isArray(tools))return false;return tools.some(t=>typeof t==="object"&&t!==null&&t.cache_control!==void 0)}function stampAnthropicSystemCacheControl(systemOut,ours=true){if(process.env.BILI_NO_CACHE_CONTROL)return systemOut;if(!ours)return systemOut;if(typeof systemOut==="string"&&systemOut.length>0){return[{type:"text",text:systemOut,cache_control:{type:"ephemeral"}}]}if(!Array.isArray(systemOut)||systemOut.length===0)return systemOut;for(const block of systemOut){if(block.cache_control)return systemOut}systemOut[systemOut.length-1].cache_control={type:"ephemeral"};return systemOut}async function*iterSseEvents2(stream2){const reader=stream2.getReader();const decoder=new TextDecoder;let buf="";try{while(true){let done;let value;try{({done,value}=await reader.read())}catch{break}if(done)break;buf+=decoder.decode(value,{stream:true});buf=buf.replace(/\r\n|\r/g,"\n");let idx;while((idx=buf.indexOf("\n\n"))>=0){const raw=buf.slice(0,idx);buf=buf.slice(idx+2);if(raw.trim().length>0)yield raw}}if(buf.trim().length>0)yield buf}finally{reader.releaseLock()}}function parseAnthropicSse(eventStr){const lines=eventStr.split("\n");let type="";const dataLines=[];for(const l of lines){if(l.startsWith("event:"))type=l.slice(6).trim();else if(l.startsWith("data:"))dataLines.push(l.slice(5).replace(/^ /,""))}if(!type)return null;const jsonStr=dataLines.join("\n").trim();if(!jsonStr)return{type,data:{}};try{return{type,data:JSON.parse(jsonStr)}}catch{return{type,data:{}}}}function remapIndexInEvent(eventStr,newIndex){const lines=eventStr.split("\n");const rebuilt=[];let touched=false;for(const l of lines){if(!touched&&l.startsWith("data:")){const jsonStr=l.slice(5).replace(/^ /,"");try{const obj=JSON.parse(jsonStr);if(typeof obj==="object"&&obj!==null&&typeof obj.index==="number"){obj.index=newIndex;rebuilt.push(`data: ${JSON.stringify(obj)}`);touched=true;continue}}catch{}}rebuilt.push(l)}return Buffer.from(rebuilt.join("\n")+"\n\n","utf8")}function neutralizeStartUsage(eventStr){const lines=eventStr.split("\n");const rebuilt=[];for(const l of lines){if(l.startsWith("data:")){const jsonStr=l.slice(5).replace(/^ /,"");try{const obj=JSON.parse(jsonStr);if(typeof obj==="object"&&obj!==null&&obj.type==="message_start"){const msg=obj.message;if(msg&&typeof msg==="object"){msg.usage={input_tokens:0,output_tokens:0};rebuilt.push(`data: ${JSON.stringify(obj)}`);continue}}}catch{}}rebuilt.push(l)}return Buffer.from(rebuilt.join("\n")+"\n\n","utf8")}function rewriteTextDeltaEvent(eventStr,newIndex,newText){const lines=eventStr.split("\n");const rebuilt=[];for(const l of lines){if(l.startsWith("data:")){const jsonStr=l.slice(5).replace(/^ /,"");try{const obj=JSON.parse(jsonStr);if(typeof obj==="object"&&obj!==null&&typeof obj.index==="number"){obj.index=newIndex;const d=obj.delta;if(d&&typeof d.text==="string")d.text=newText;rebuilt.push(`data: ${JSON.stringify(obj)}`);continue}}catch{}}rebuilt.push(l)}return Buffer.from(rebuilt.join("\n")+"\n\n","utf8")}function buildTextDeltaEvent(index,text){return Buffer.from(`event: content_block_delta
2174
2174
  data: ${JSON.stringify({type:"content_block_delta",index,delta:{type:"text_delta",text}})}
2175
2175
 
2176
- `,"utf8")}function createAnthropicAdapter(requestBody,originalSystem,notes,errorShape="protocol"){const model=requestBody.model??void 0;let messageId;let clientIndex=0;let messageStartForwarded=false;const openBlocks=[];const removeOpenBlock=index=>{const i=openBlocks.indexOf(index);if(i>=0)openBlocks.splice(i,1)};const buildSyntheticMessageStart=()=>{const extra={};if(model)extra.model=model;const msg={id:messageId??`msg_acp_error_${Date.now()}`,type:"message",role:"assistant",content:[],stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0},...extra};return Buffer.from(`event: message_start
2176
+ `,"utf8")}function createAnthropicAdapter(requestBody,originalSystem,notes,errorShape="protocol",cacheMarks){const model=requestBody.model??void 0;let messageId;let clientIndex=0;let messageStartForwarded=false;const openBlocks=[];const removeOpenBlock=index=>{const i=openBlocks.indexOf(index);if(i>=0)openBlocks.splice(i,1)};const buildSyntheticMessageStart=()=>{const extra={};if(model)extra.model=model;const msg={id:messageId??`msg_acp_error_${Date.now()}`,type:"message",role:"assistant",content:[],stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0},...extra};return Buffer.from(`event: message_start
2177
2177
  data: ${JSON.stringify({type:"message_start",message:msg})}
2178
2178
 
2179
2179
  `,"utf8")};const buildTextBlock=(index,text)=>Buffer.from(`event: content_block_start
@@ -2200,11 +2200,11 @@ data: ${JSON.stringify({type:"message_delta",delta:{stop_reason:stopReason,stop_
2200
2200
  event: message_stop
2201
2201
  data: ${JSON.stringify({type:"message_stop"})}
2202
2202
 
2203
- `,"utf8")};return{buildRequest(coreMessages,systemPrompt,body){const messages=coreToAnthropic(coreMessages);const baseText=originalSystem!==void 0?extractSystem(originalSystem):"";const full=baseText?`${baseText}
2203
+ `,"utf8")};return{buildRequest(coreMessages,systemPrompt,body){const messages=coreToAnthropic(coreMessages,cacheMarks);const baseText=originalSystem!==void 0?extractSystem(originalSystem):"";const full=baseText?`${baseText}
2204
2204
 
2205
2205
  ---
2206
2206
 
2207
- ${systemPrompt}`:systemPrompt;const system=originalSystem!==void 0?buildSystem(full,originalSystem):full;const withNotes=notes&&notes.length>0?[...messages,...notes.map(text=>({role:"user",content:text}))]:messages;return{...body,system,messages:withNotes}},async*parseStream(upstream,round){const pending=new Map;let roundInput;let roundCached;let roundCreation;let roundOutput;let stopReason;let usageYielded=false;const indexMap=new Map;const thinkingIndexes=new Set;const tagFilter=composeStreamFilters(createTagEchoFilter(snippet=>{log("warn",`[tag-echo] stripped model-emitted render tag: ${snippet.slice(0,80).replace(/\n/g," ")}`)}),createMarkerLineFilter(snippet=>{log("warn",`[marker-echo] stripped model-emitted ACP confirmation marker: ${snippet.slice(0,80).replace(/\n/g," ")}`)}));let lastTextIndex=null;let sawThinking=false;let toolCallsEmitted=0;let degenerateWarned=false;const maybeWarnDegenerate=reason=>{if(degenerateWarned)return;const msg=degenerateTurnWarning({reason,terminalReason:"end_turn",toolCalls:toolCallsEmitted,text:tagFilter.stats(),sawThinking,wire:"anthropic"});if(msg){degenerateWarned=true;log("warn",msg)}};for(const index of openBlocks.splice(0)){yield{kind:"meta",chunk:Buffer.from(`event: content_block_stop
2207
+ ${systemPrompt}`:systemPrompt;const system=originalSystem!==void 0?buildSystem(full,originalSystem):full;const stamped=cacheMarks?stampAnthropicSystemCacheControl(system):system;const withNotes=notes&&notes.length>0?[...messages,...notes.map(text=>({role:"user",content:text}))]:messages;return{...body,system:stamped,messages:withNotes}},async*parseStream(upstream,round){const pending=new Map;let roundInput;let roundCached;let roundCreation;let roundOutput;let stopReason;let usageYielded=false;const indexMap=new Map;const thinkingIndexes=new Set;const tagFilter=composeStreamFilters(createTagEchoFilter(snippet=>{log("warn",`[tag-echo] stripped model-emitted render tag: ${snippet.slice(0,80).replace(/\n/g," ")}`)}),createMarkerLineFilter(snippet=>{log("warn",`[marker-echo] stripped model-emitted ACP confirmation marker: ${snippet.slice(0,80).replace(/\n/g," ")}`)}));let lastTextIndex=null;let sawThinking=false;let toolCallsEmitted=0;let degenerateWarned=false;const maybeWarnDegenerate=reason=>{if(degenerateWarned)return;const msg=degenerateTurnWarning({reason,terminalReason:"end_turn",toolCalls:toolCallsEmitted,text:tagFilter.stats(),sawThinking,wire:"anthropic"});if(msg){degenerateWarned=true;log("warn",msg)}};for(const index of openBlocks.splice(0)){yield{kind:"meta",chunk:Buffer.from(`event: content_block_stop
2208
2208
  data: ${JSON.stringify({type:"content_block_stop",index})}
2209
2209
 
2210
2210
  `,"utf8"),firstRoundOnly:false}}for await(const eventStr of iterSseEvents2(upstream)){const parsed=parseAnthropicSse(eventStr);if(!parsed)continue;const{type,data}=parsed;const rawBuf=Buffer.from(eventStr+"\n\n","utf8");if(type==="message_start"){const msg=data.message??{};if(typeof msg.id==="string"&&!messageId)messageId=msg.id;const u2=msg.usage??{};if(typeof u2.input_tokens==="number")roundInput=u2.input_tokens;if(typeof u2.cache_read_input_tokens==="number")roundCached=u2.cache_read_input_tokens;if(typeof u2.cache_creation_input_tokens==="number")roundCreation=u2.cache_creation_input_tokens;if(!messageStartForwarded){messageStartForwarded=true;yield{kind:"meta",chunk:neutralizeStartUsage(eventStr),firstRoundOnly:true}}}else if(type==="ping"){yield{kind:"meta",chunk:rawBuf,stateless:true}}else if(type==="content_block_start"){const upstreamIndex=data.index??0;const block=data.content_block??{};if(block.type==="tool_use"){const name=typeof block.name==="string"?block.name:"";const id=typeof block.id==="string"?block.id:`toolu_${upstreamIndex}`;pending.set(upstreamIndex,{id,name,json:""})}else{if(block.type==="thinking"||block.type==="redacted_thinking"){thinkingIndexes.add(upstreamIndex);sawThinking=true}const ci2=clientIndex++;indexMap.set(upstreamIndex,ci2);openBlocks.push(ci2);yield{kind:"meta",chunk:remapIndexInEvent(eventStr,ci2),firstRoundOnly:round===1}}}else if(type==="content_block_delta"){const upstreamIndex=data.index??0;const delta=data.delta??{};if(pending.has(upstreamIndex)){if(delta.type==="input_json_delta"&&typeof delta.partial_json==="string"){pending.get(upstreamIndex).json+=delta.partial_json}}else if(delta.type==="text_delta"&&typeof delta.text==="string"){const ci2=indexMap.get(upstreamIndex)??upstreamIndex;lastTextIndex=ci2;const clean=tagFilter.push(delta.text);if(clean.length>0){const raw=clean===delta.text?remapIndexInEvent(eventStr,ci2):rewriteTextDeltaEvent(eventStr,ci2,clean);yield{kind:"text",delta:clean,raw}}}else if(delta.type==="thinking_delta"&&typeof delta.thinking==="string"&&delta.thinking.length>0){const ci2=indexMap.get(upstreamIndex)??upstreamIndex;yield{kind:"reasoning",delta:delta.thinking,raw:remapIndexInEvent(eventStr,ci2)}}else if(delta.type==="signature_delta"&&typeof delta.signature==="string"){const ci2=indexMap.get(upstreamIndex)??upstreamIndex;yield{kind:"reasoning",delta:"",signature:delta.signature,raw:remapIndexInEvent(eventStr,ci2)}}else if(round===1){const ci2=indexMap.get(upstreamIndex)??upstreamIndex;yield{kind:"meta",chunk:remapIndexInEvent(eventStr,ci2),firstRoundOnly:true}}}else if(type==="content_block_stop"){const upstreamIndex=data.index??0;const tb=pending.get(upstreamIndex);if(tb){pending.delete(upstreamIndex);toolCallsEmitted++;yield{kind:"tool_call",name:tb.name,callId:tb.id,arguments:tb.json}}else if(thinkingIndexes.delete(upstreamIndex)){const ci2=indexMap.get(upstreamIndex)??upstreamIndex;removeOpenBlock(ci2);yield{kind:"meta",chunk:remapIndexInEvent(eventStr,ci2),firstRoundOnly:false};yield{kind:"reasoning",delta:"",blockEnd:true}}else{const ci2=indexMap.get(upstreamIndex)??upstreamIndex;removeOpenBlock(ci2);if(lastTextIndex!==null){const tail=tagFilter.flush();if(tail.length>0){yield{kind:"text",delta:tail,raw:buildTextDeltaEvent(lastTextIndex,tail)}}lastTextIndex=null}yield{kind:"meta",chunk:remapIndexInEvent(eventStr,ci2),firstRoundOnly:round===1}}}else if(type==="message_delta"){const u2=data.usage??{};if(typeof u2.output_tokens==="number")roundOutput=u2.output_tokens;const input=typeof u2.input_tokens==="number"?u2.input_tokens:void 0;const cached=typeof u2.cache_read_input_tokens==="number"?u2.cache_read_input_tokens:void 0;const creation=typeof u2.cache_creation_input_tokens==="number"?u2.cache_creation_input_tokens:void 0;if(input!==void 0&&input>0&&cached!==void 0){roundInput=input;roundCached=cached;if(creation!==void 0)roundCreation=creation}else{if(input!==void 0&&input>0)roundInput=input;if(cached!==void 0&&cached>0)roundCached=cached;if(creation!==void 0&&creation>0)roundCreation=creation}const d=data.delta??{};if(typeof d.stop_reason==="string")stopReason=d.stop_reason;if(!usageYielded){usageYielded=true;yield{kind:"usage",inputTokens:roundInput,outputTokens:roundOutput,cachedTokens:roundCached,creationTokens:roundCreation}}maybeWarnDegenerate(stopReason);yield{kind:"done",finishReason:stopReason,thinking:sawThinking}}else if(type==="message_stop"){if(lastTextIndex!==null){const tail=tagFilter.flush();if(tail.length>0){yield{kind:"text",delta:tail,raw:buildTextDeltaEvent(lastTextIndex,tail)}}lastTextIndex=null}if(!usageYielded){usageYielded=true;yield{kind:"usage",inputTokens:roundInput,outputTokens:roundOutput,cachedTokens:roundCached,creationTokens:roundCreation}}maybeWarnDegenerate(stopReason);yield{kind:"done",finishReason:stopReason??"end_turn",thinking:sawThinking}}else if(round===1){yield{kind:"meta",chunk:rawBuf,firstRoundOnly:true}}}},emitText(delta){return buildTextBlock(clientIndex++,delta)},emitReasoning(delta){const index=clientIndex++;return Buffer.from(`event: content_block_start
@@ -2230,7 +2230,7 @@ data: ${JSON.stringify({type:"error",error:{type:"server_error",code:"upstream_e
2230
2230
 
2231
2231
  `,"utf8")}}else if(filtered!==null){yield{kind:"meta",chunk:sseFrame(filtered)}}}for(const[idx,tc]of pending){if(!realIndexes.has(idx)&&tc.name.length>0){toolCallsEmitted++;yield{kind:"tool_call",name:tc.name,callId:tc.id,arguments:tc.args,...tc.signature?{signature:tc.signature}:{}}}}pending.clear()};for await(const{frame,json}of iterGoogleChunks(upstream)){let parsed;try{parsed=JSON.parse(json)}catch{continue}const rawBuf=Buffer.from(`${frame}
2232
2232
 
2233
- `,"utf8");const candidates=parsed.candidates;const candidate=candidates?.[0];const content=candidate?.content;const parts=Array.isArray(content?.parts)?content.parts:[];const finishReason=typeof candidate?.finishReason==="string"?candidate.finishReason:void 0;const feedback=parsed.promptFeedback;const blockReason=typeof feedback?.blockReason==="string"?feedback.blockReason:void 0;const usageMetadata=parsed.usageMetadata;if(usageMetadata)lastUsage=readUsageMetadata(usageMetadata);if(blockReason&&!candidate&&!sawDone){yield*flushFilter();sawDone=true;yield{kind:"meta",chunk:rawBuf};yield{kind:"done",finishReason:blockReason};continue}if(!candidate){if(usageMetadata&&!usageEmitted){usageEmitted=true;yield usageEvent()}else if(!usageMetadata){yield{kind:"meta",chunk:rawBuf,firstRoundOnly:true}}continue}const callIndexes=[];const hasCallPart=parts.some(p2=>p2&&typeof p2==="object"&&p2.functionCall!==void 0);let emitted=false;for(let i=0;i<parts.length;i++){const part=parts[i];if(!part||typeof part!=="object")continue;const fc=part.functionCall;if(fc){const idx=callIndex++;callIndexes.push(idx);pending.set(idx,{index:idx,id:typeof fc.id==="string"?fc.id:"",name:typeof fc.name==="string"?fc.name:"",args:typeof fc.args==="string"?fc.args:JSON.stringify(fc.args??{}),signature:typeof part.thoughtSignature==="string"?part.thoughtSignature:""});continue}if(typeof part.text!=="string"||part.text.length===0)continue;if(part.thought===true){sawReasoning=true;emitted=true;const reasoningRaw=!hasCallPart?finishReason?sseFrame(cloneChunk(parsed,{dropFinishReason:true})):rawBuf:void 0;yield{kind:"reasoning",delta:part.text,...reasoningRaw?{raw:reasoningRaw}:{},...typeof part.thoughtSignature==="string"&&part.thoughtSignature.length>0?{signature:part.thoughtSignature}:{}};continue}const clean=tagFilter.push(part.text);if(clean.length===0)continue;emitted=true;let raw;if(clean===part.text){if(!hasCallPart)raw=finishReason?sseFrame(cloneChunk(parsed,{dropFinishReason:true})):rawBuf}else{raw=sseFrame(cloneChunk(parsed,{parts:parts.map((p2,j2)=>j2===i?{...p2,text:clean}:p2).filter(p2=>!p2||typeof p2!=="object"||p2.functionCall===void 0),dropFinishReason:true}))}yield{kind:"text",delta:clean,...raw?{raw}:{}}}if(callIndexes.length>0)rawCallChunks.push({json,parsed,callIndexes});if(!emitted&&callIndexes.length===0&&!finishReason&&parts.length===0){yield{kind:"meta",chunk:rawBuf,firstRoundOnly:true}}if(finishReason&&!sawDone){yield*flushFilter();yield*settleToolCalls();if(lastUsage&&!usageEmitted){usageEmitted=true;yield usageEvent()}sawDone=true;maybeWarnDegenerate(finishReason);const truncated=finishReason==="MAX_TOKENS";if(sawRealToolCall){const finishChunk=parts.some(p2=>p2&&typeof p2==="object"&&p2.functionCall!==void 0)?sseFrame(cloneChunk(parsed,{parts:[]})):rawBuf;yield{kind:"meta",chunk:finishChunk};yield{kind:"done",finishReason,suppressCompletion:true,...truncated?{truncated:true}:{}}}else{yield{kind:"done",finishReason,...truncated?{truncated:true}:{}}}}}yield*flushFilter();if(!sawDone&&lastUsage&&!usageEmitted){usageEmitted=true;yield usageEvent()}},emitText(delta){return buildChunk([{text:delta}])},emitReasoning(delta){return buildChunk([{text:delta,thought:true}])},emitToolCall(call){return buildChunk([{functionCall:{name:call.name,args:buildToolArgs(call.arguments),...call.callId?{id:call.callId}:{}},...call.signature?{thoughtSignature:call.signature}:{}}])},emitMarker(toolName,result){return buildChunk([{text:buildVisibilityMarker(toolName,result)}])},emitCompletion(opts){const usage=opts?.usage?{usageMetadata:{promptTokenCount:opts.usage.inputTokens??0,candidatesTokenCount:opts.usage.outputTokens??0,totalTokenCount:(opts.usage.inputTokens??0)+(opts.usage.outputTokens??0),...typeof opts.usage.cachedTokens==="number"?{cachedContentTokenCount:opts.usage.cachedTokens}:{}}}:{};return buildChunk([],{candidate:{finishReason:googleFinishReason(opts?.finishReason)},top:usage})},emitError(message){return sseFrame({error:{code:500,message,status:"INTERNAL"}})}}}function pickAdapter(protocol,requestBody,textProtocol,responsesProjection,anthropicSystem,openaiSystem,absorbName,google,systemNotes,streamErrorShape){const shape=streamErrorShape??"protocol";if(protocol==="responses")return createResponsesAdapter(textProtocol,responsesProjection,absorbName,systemNotes);if(protocol==="openai")return createOpenaiAdapter(requestBody,openaiSystem,absorbName,systemNotes,shape);if(protocol==="anthropic")return createAnthropicAdapter(requestBody,anthropicSystem,systemNotes,shape);if(protocol==="google")return createGoogleAdapter(requestBody,google?.system,absorbName,google?.model,systemNotes);throw new Error(`[acp-loop] unknown protocol: ${protocol}`)}function responsesJsonOutput(response){const textParts=[];const calls=[];for(const item of Array.isArray(response.output)?response.output:[]){if(!item||typeof item!=="object")continue;const value=item;if(value.type==="message"){for(const part of Array.isArray(value.content)?value.content:[]){if(part&&typeof part==="object"&&part.type==="output_text"){textParts.push(part)}}}else if(value.type==="function_call"){calls.push({itemId:typeof value.id==="string"?value.id:"",callId:typeof value.call_id==="string"?value.call_id:"",name:typeof value.name==="string"?value.name:"",arguments:typeof value.arguments==="string"?value.arguments:""})}}return{text:textParts.map(part=>typeof part.text==="string"?part.text:"").join(""),textParts,calls}}function replaceResponsesJsonText(parts,text){parts.forEach((part,index)=>{part.text=index===0?text:""})}async function surfaceProxyJson(current,proxyCalls,ctx){const markers=[];for(const call of proxyCalls){const mutating=ACP_MUTATING_TOOLS.has(call.name);let args={};let rawArgs;try{args=JSON.parse(call.arguments)}catch{rawArgs=call.arguments;log("warn",`[acp-compress-args] ${call.name} JSON.parse failed (len=${call.arguments.length}, head=${safePrefix(call.arguments,200)}, tail=${safeSuffix(call.arguments,200)})`)}let result;try{result=mutating?await withSessionLock(ctx.session,()=>executeProxyTool(call.name,args,ctx,call.callId,rawArgs)):executeProxyTool(call.name,args,ctx,call.callId,rawArgs);ctx.log(`[acp-proxy: responses JSON ${call.name}${mutating?"":" (read-only)"} \u2192 ${result.slice(0,120).replace(/\n/g," ")}]`)}catch(e){result=`\u274C [ACP] ${call.name} FAILED: ${String(e)}`;ctx.log(`[acp-proxy: responses JSON ${call.name}${mutating?"":" (read-only)"} FAILED: ${String(e)}]`)}if(ctx.visibilityMarkers!==false)markers.push(buildVisibilityMarker(call.name,result))}if(markers.length===0)return current;const out=Array.isArray(current.output)?[...current.output]:[];const markerItem={type:"message",id:`msg_acp_proxy_${Date.now()}_${markers.length}`,role:"assistant",content:[{type:"output_text",text:markers.join("\n")}]};let insertAt=out.length;for(let i=0;i<out.length;i++){const t=out[i]?.type;if(t==="function_call"||t==="custom_tool_call"){insertAt=i;break}}out.splice(insertAt,0,markerItem);return{...current,output:out}}async function compressLoopResponsesJson(initialResponse,ctx,requestBody,requestOptions){let current=initialResponse;for(let loopCount=1;loopCount<=MAX_LOOP_ROUNDS;loopCount++){current=stripResponsesText(current);const output=responsesJsonOutput(current);const extracted=extractResponsesTextTriggers(output.text);const allCalls=[...output.calls,...extracted.calls.map(c=>({itemId:`fc_${c.callId}`,callId:c.callId,name:c.name,arguments:c.arguments}))].filter(call=>call.name.length>0);const proxyCalls=allCalls.filter(call=>ACP_TOOL_NAMES.has(call.name));const realCalls=allCalls.filter(call=>!ACP_TOOL_NAMES.has(call.name));const mutatingProxy=proxyCalls.filter(call=>ACP_MUTATING_TOOLS.has(call.name));if(mutatingProxy.length===0||realCalls.length>0){if(proxyCalls.length>0){replaceResponsesJsonText(output.textParts,extracted.clean);current=await surfaceProxyJson(current,proxyCalls,ctx)}return current}const inputItems=Array.isArray(requestBody.input)?[...requestBody.input]:[];if(extracted.clean.trim()){inputItems.push({type:"message",role:"assistant",content:[{type:"output_text",text:extracted.clean}]})}for(const call of proxyCalls){let args={};let rawArgs;try{args=JSON.parse(call.arguments)}catch(error){log("warn",`[acp-compress-args] ${call.name} JSON.parse failed: ${String(error)} (len=${call.arguments.length}, head=${safePrefix(call.arguments,200)}, tail=${safeSuffix(call.arguments,200)})`);rawArgs=call.arguments}const result2=await withSessionLock(ctx.session,()=>executeProxyTool(call.name,args,ctx,call.callId,rawArgs));ctx.log(`[acp-proxy: responses JSON ${call.name} \u2192 ${result2.slice(0,120).replace(/\n/g," ")}]`);if(ctx.visibilityMarkers!==false)inputItems.push({type:"message",role:"developer",content:buildVisibilityMarker(call.name,result2)})}for(const injection of drainPendingRetrievals(ctx.session)){inputItems.push({type:"message",role:"developer",content:[{type:"output_text",text:injection.text}]})}requestBody.input=hoistTrappedToolItems(inputItems);const result=await fetchWithRetry(requestOptions.url,{method:"POST",headers:requestOptions.headers,body:JSON.stringify(requestOptions.wireTransform?requestOptions.wireTransform(requestBody):requestBody),...ctx.proxyUrl?{dispatcher:proxyDispatcher(ctx.proxyUrl)}:{}},void 0,void 0,info=>{const lc=lastCompressSuffix(ctx.session.lastCompress);ctx.log(`[acp-proxy: responses upstream rejected replay (HTTP ${info.status}: ${info.detail.slice(0,120)}); likely provider risk-control \u2014 retrying in ${info.delayMs}ms (attempt ${info.attempt}/${info.maxAttempts})${lc}]`);log("warn",`[acp-compress-responses] upstream rejected replay (HTTP ${info.status}); retrying in ${info.delayMs}ms (attempt ${info.attempt}/${info.maxAttempts})${lc}`)}).catch(e=>{if(e instanceof UpstreamHttpError){const suffix=e.attempts>1?` after ${e.attempts} attempt(s)`:"";ctx.log(`[acp-proxy: responses compress loop upstream error ${e.status}${suffix}: ${e.body.slice(0,200)}]`);log("error",`[acp-compress-responses] upstream error ${e.status}${suffix}: ${e.body.slice(0,200)}`)}throw e});try{current=await result.response.json()}finally{result.clearTimer()}}ctx.log(`[acp-proxy: responses JSON compress loop limit (${MAX_LOOP_ROUNDS}) reached]`);return current}var ANCHOR_MAX_NOTES=8;var DIFF_MIN_SHARED=.7;var DIFF_MAX_LINES=400;var DIFF_CONTEXT=2;var UPDATE_MARKER="[System context update]";var REMOVED_NOTE=`${UPDATE_MARKER} Previously loaded ambient instructions no longer apply.`;var DIFF_HEADER=`${UPDATE_MARKER} The ambient instructions in the system prompt changed during this conversation. Each block below shows one changed region against the version in effect so far (- removed / + added); everything not shown is unchanged:
2233
+ `,"utf8");const candidates=parsed.candidates;const candidate=candidates?.[0];const content=candidate?.content;const parts=Array.isArray(content?.parts)?content.parts:[];const finishReason=typeof candidate?.finishReason==="string"?candidate.finishReason:void 0;const feedback=parsed.promptFeedback;const blockReason=typeof feedback?.blockReason==="string"?feedback.blockReason:void 0;const usageMetadata=parsed.usageMetadata;if(usageMetadata)lastUsage=readUsageMetadata(usageMetadata);if(blockReason&&!candidate&&!sawDone){yield*flushFilter();sawDone=true;yield{kind:"meta",chunk:rawBuf};yield{kind:"done",finishReason:blockReason};continue}if(!candidate){if(usageMetadata&&!usageEmitted){usageEmitted=true;yield usageEvent()}else if(!usageMetadata){yield{kind:"meta",chunk:rawBuf,firstRoundOnly:true}}continue}const callIndexes=[];const hasCallPart=parts.some(p2=>p2&&typeof p2==="object"&&p2.functionCall!==void 0);let emitted=false;for(let i=0;i<parts.length;i++){const part=parts[i];if(!part||typeof part!=="object")continue;const fc=part.functionCall;if(fc){const idx=callIndex++;callIndexes.push(idx);pending.set(idx,{index:idx,id:typeof fc.id==="string"?fc.id:"",name:typeof fc.name==="string"?fc.name:"",args:typeof fc.args==="string"?fc.args:JSON.stringify(fc.args??{}),signature:typeof part.thoughtSignature==="string"?part.thoughtSignature:""});continue}if(typeof part.text!=="string"||part.text.length===0)continue;if(part.thought===true){sawReasoning=true;emitted=true;const reasoningRaw=!hasCallPart?finishReason?sseFrame(cloneChunk(parsed,{dropFinishReason:true})):rawBuf:void 0;yield{kind:"reasoning",delta:part.text,...reasoningRaw?{raw:reasoningRaw}:{},...typeof part.thoughtSignature==="string"&&part.thoughtSignature.length>0?{signature:part.thoughtSignature}:{}};continue}const clean=tagFilter.push(part.text);if(clean.length===0)continue;emitted=true;let raw;if(clean===part.text){if(!hasCallPart)raw=finishReason?sseFrame(cloneChunk(parsed,{dropFinishReason:true})):rawBuf}else{raw=sseFrame(cloneChunk(parsed,{parts:parts.map((p2,j2)=>j2===i?{...p2,text:clean}:p2).filter(p2=>!p2||typeof p2!=="object"||p2.functionCall===void 0),dropFinishReason:true}))}yield{kind:"text",delta:clean,...raw?{raw}:{}}}if(callIndexes.length>0)rawCallChunks.push({json,parsed,callIndexes});if(!emitted&&callIndexes.length===0&&!finishReason&&parts.length===0){yield{kind:"meta",chunk:rawBuf,firstRoundOnly:true}}if(finishReason&&!sawDone){yield*flushFilter();yield*settleToolCalls();if(lastUsage&&!usageEmitted){usageEmitted=true;yield usageEvent()}sawDone=true;maybeWarnDegenerate(finishReason);const truncated=finishReason==="MAX_TOKENS";if(sawRealToolCall){const finishChunk=parts.some(p2=>p2&&typeof p2==="object"&&p2.functionCall!==void 0)?sseFrame(cloneChunk(parsed,{parts:[]})):rawBuf;yield{kind:"meta",chunk:finishChunk};yield{kind:"done",finishReason,suppressCompletion:true,...truncated?{truncated:true}:{}}}else{yield{kind:"done",finishReason,...truncated?{truncated:true}:{}}}}}yield*flushFilter();if(!sawDone&&lastUsage&&!usageEmitted){usageEmitted=true;yield usageEvent()}},emitText(delta){return buildChunk([{text:delta}])},emitReasoning(delta){return buildChunk([{text:delta,thought:true}])},emitToolCall(call){return buildChunk([{functionCall:{name:call.name,args:buildToolArgs(call.arguments),...call.callId?{id:call.callId}:{}},...call.signature?{thoughtSignature:call.signature}:{}}])},emitMarker(toolName,result){return buildChunk([{text:buildVisibilityMarker(toolName,result)}])},emitCompletion(opts){const usage=opts?.usage?{usageMetadata:{promptTokenCount:opts.usage.inputTokens??0,candidatesTokenCount:opts.usage.outputTokens??0,totalTokenCount:(opts.usage.inputTokens??0)+(opts.usage.outputTokens??0),...typeof opts.usage.cachedTokens==="number"?{cachedContentTokenCount:opts.usage.cachedTokens}:{}}}:{};return buildChunk([],{candidate:{finishReason:googleFinishReason(opts?.finishReason)},top:usage})},emitError(message){return sseFrame({error:{code:500,message,status:"INTERNAL"}})}}}function pickAdapter(protocol,requestBody,textProtocol,responsesProjection,anthropicSystem,openaiSystem,absorbName,google,systemNotes,streamErrorShape,anthropicCacheMarks){const shape=streamErrorShape??"protocol";if(protocol==="responses")return createResponsesAdapter(textProtocol,responsesProjection,absorbName,systemNotes);if(protocol==="openai")return createOpenaiAdapter(requestBody,openaiSystem,absorbName,systemNotes,shape);if(protocol==="anthropic")return createAnthropicAdapter(requestBody,anthropicSystem,systemNotes,shape,anthropicCacheMarks);if(protocol==="google")return createGoogleAdapter(requestBody,google?.system,absorbName,google?.model,systemNotes);throw new Error(`[acp-loop] unknown protocol: ${protocol}`)}function responsesJsonOutput(response){const textParts=[];const calls=[];for(const item of Array.isArray(response.output)?response.output:[]){if(!item||typeof item!=="object")continue;const value=item;if(value.type==="message"){for(const part of Array.isArray(value.content)?value.content:[]){if(part&&typeof part==="object"&&part.type==="output_text"){textParts.push(part)}}}else if(value.type==="function_call"){calls.push({itemId:typeof value.id==="string"?value.id:"",callId:typeof value.call_id==="string"?value.call_id:"",name:typeof value.name==="string"?value.name:"",arguments:typeof value.arguments==="string"?value.arguments:""})}}return{text:textParts.map(part=>typeof part.text==="string"?part.text:"").join(""),textParts,calls}}function replaceResponsesJsonText(parts,text){parts.forEach((part,index)=>{part.text=index===0?text:""})}async function surfaceProxyJson(current,proxyCalls,ctx){const markers=[];for(const call of proxyCalls){const mutating=ACP_MUTATING_TOOLS.has(call.name);let args={};let rawArgs;try{args=JSON.parse(call.arguments)}catch{rawArgs=call.arguments;log("warn",`[acp-compress-args] ${call.name} JSON.parse failed (len=${call.arguments.length}, head=${safePrefix(call.arguments,200)}, tail=${safeSuffix(call.arguments,200)})`)}let result;try{result=mutating?await withSessionLock(ctx.session,()=>executeProxyTool(call.name,args,ctx,call.callId,rawArgs)):executeProxyTool(call.name,args,ctx,call.callId,rawArgs);ctx.log(`[acp-proxy: responses JSON ${call.name}${mutating?"":" (read-only)"} \u2192 ${result.slice(0,120).replace(/\n/g," ")}]`)}catch(e){result=`\u274C [ACP] ${call.name} FAILED: ${String(e)}`;ctx.log(`[acp-proxy: responses JSON ${call.name}${mutating?"":" (read-only)"} FAILED: ${String(e)}]`)}if(ctx.visibilityMarkers!==false)markers.push(buildVisibilityMarker(call.name,result))}if(markers.length===0)return current;const out=Array.isArray(current.output)?[...current.output]:[];const markerItem={type:"message",id:`msg_acp_proxy_${Date.now()}_${markers.length}`,role:"assistant",content:[{type:"output_text",text:markers.join("\n")}]};let insertAt=out.length;for(let i=0;i<out.length;i++){const t=out[i]?.type;if(t==="function_call"||t==="custom_tool_call"){insertAt=i;break}}out.splice(insertAt,0,markerItem);return{...current,output:out}}async function compressLoopResponsesJson(initialResponse,ctx,requestBody,requestOptions){let current=initialResponse;for(let loopCount=1;loopCount<=MAX_LOOP_ROUNDS;loopCount++){current=stripResponsesText(current);const output=responsesJsonOutput(current);const extracted=extractResponsesTextTriggers(output.text);const allCalls=[...output.calls,...extracted.calls.map(c=>({itemId:`fc_${c.callId}`,callId:c.callId,name:c.name,arguments:c.arguments}))].filter(call=>call.name.length>0);const proxyCalls=allCalls.filter(call=>ACP_TOOL_NAMES.has(call.name));const realCalls=allCalls.filter(call=>!ACP_TOOL_NAMES.has(call.name));const mutatingProxy=proxyCalls.filter(call=>ACP_MUTATING_TOOLS.has(call.name));if(mutatingProxy.length===0||realCalls.length>0){if(proxyCalls.length>0){replaceResponsesJsonText(output.textParts,extracted.clean);current=await surfaceProxyJson(current,proxyCalls,ctx)}return current}const inputItems=Array.isArray(requestBody.input)?[...requestBody.input]:[];if(extracted.clean.trim()){inputItems.push({type:"message",role:"assistant",content:[{type:"output_text",text:extracted.clean}]})}for(const call of proxyCalls){let args={};let rawArgs;try{args=JSON.parse(call.arguments)}catch(error){log("warn",`[acp-compress-args] ${call.name} JSON.parse failed: ${String(error)} (len=${call.arguments.length}, head=${safePrefix(call.arguments,200)}, tail=${safeSuffix(call.arguments,200)})`);rawArgs=call.arguments}const result2=await withSessionLock(ctx.session,()=>executeProxyTool(call.name,args,ctx,call.callId,rawArgs));ctx.log(`[acp-proxy: responses JSON ${call.name} \u2192 ${result2.slice(0,120).replace(/\n/g," ")}]`);if(ctx.visibilityMarkers!==false)inputItems.push({type:"message",role:"developer",content:buildVisibilityMarker(call.name,result2)})}for(const injection of drainPendingRetrievals(ctx.session)){inputItems.push({type:"message",role:"developer",content:[{type:"output_text",text:injection.text}]})}requestBody.input=hoistTrappedToolItems(inputItems);const result=await fetchWithRetry(requestOptions.url,{method:"POST",headers:requestOptions.headers,body:JSON.stringify(requestOptions.wireTransform?requestOptions.wireTransform(requestBody):requestBody),...ctx.proxyUrl?{dispatcher:proxyDispatcher(ctx.proxyUrl)}:{}},void 0,void 0,info=>{const lc=lastCompressSuffix(ctx.session.lastCompress);ctx.log(`[acp-proxy: responses upstream rejected replay (HTTP ${info.status}: ${info.detail.slice(0,120)}); likely provider risk-control \u2014 retrying in ${info.delayMs}ms (attempt ${info.attempt}/${info.maxAttempts})${lc}]`);log("warn",`[acp-compress-responses] upstream rejected replay (HTTP ${info.status}); retrying in ${info.delayMs}ms (attempt ${info.attempt}/${info.maxAttempts})${lc}`)}).catch(e=>{if(e instanceof UpstreamHttpError){const suffix=e.attempts>1?` after ${e.attempts} attempt(s)`:"";ctx.log(`[acp-proxy: responses compress loop upstream error ${e.status}${suffix}: ${e.body.slice(0,200)}]`);log("error",`[acp-compress-responses] upstream error ${e.status}${suffix}: ${e.body.slice(0,200)}`)}throw e});try{current=await result.response.json()}finally{result.clearTimer()}}ctx.log(`[acp-proxy: responses JSON compress loop limit (${MAX_LOOP_ROUNDS}) reached]`);return current}var ANCHOR_MAX_NOTES=8;var DIFF_MIN_SHARED=.7;var DIFF_MAX_LINES=400;var DIFF_CONTEXT=2;var UPDATE_MARKER="[System context update]";var REMOVED_NOTE=`${UPDATE_MARKER} Previously loaded ambient instructions no longer apply.`;var DIFF_HEADER=`${UPDATE_MARKER} The ambient instructions in the system prompt changed during this conversation. Each block below shows one changed region against the version in effect so far (- removed / + added); everything not shown is unchanged:
2234
2234
 
2235
2235
  `;function key(surface){return`stableSystem.${surface}`}function readState(metadata,surface){const raw=metadata[key(surface)];if(typeof raw==="object"&&raw!==null){const r=raw;if(typeof r.anchor==="string"&&typeof r.lastSeen==="string"&&Array.isArray(r.notes)){return{anchor:r.anchor,lastSeen:r.lastSeen,notes:r.notes.filter(n=>typeof n==="string")}}}return{anchor:"",lastSeen:"",notes:[]}}function writeState(session,surface,state2){session.metadata[key(surface)]=state2}function diffLines(oldText,newText){const a=oldText.split("\n");const b2=newText.split("\n");const n=a.length;const m2=b2.length;if(n>DIFF_MAX_LINES||m2>DIFF_MAX_LINES)return null;const w2=m2+1;const dp=new Uint16Array((n+1)*w2);for(let i2=n-1;i2>=0;i2--){for(let j3=m2-1;j3>=0;j3--){dp[i2*w2+j3]=a[i2]===b2[j3]?dp[(i2+1)*w2+j3+1]+1:Math.max(dp[(i2+1)*w2+j3],dp[i2*w2+j3+1])}}if(dp[0]/Math.max(n,m2)<DIFF_MIN_SHARED)return null;const ops=[];let i=0;let j2=0;while(i<n&&j2<m2){if(a[i]===b2[j2]){ops.push({t:0,i});i++;j2++}else if(dp[(i+1)*w2+j2]>=dp[i*w2+j2+1]){ops.push({t:1,i});i++}else{ops.push({t:2,i:j2});j2++}}while(i<n){ops.push({t:1,i});i++}while(j2<m2){ops.push({t:2,i:j2});j2++}const starts=[];let k2=0;while(k2<ops.length){if(ops[k2].t!==0){let e=k2;while(e<ops.length&&ops[e].t!==0)e++;starts.push([Math.max(0,k2-DIFF_CONTEXT),Math.min(ops.length-1,e+DIFF_CONTEXT)]);k2=e}else k2++}const merged=[];for(const s3 of starts){const last=merged[merged.length-1];if(last&&s3[0]<=last[1]+1)last[1]=Math.max(last[1],s3[1]);else merged.push([...s3])}const out=[];for(const[lo2,hi2]of merged){const block=[];for(let q2=lo2;q2<=hi2;q2++){const op=ops[q2];if(op.t===0)block.push(` ${a[op.i]}`);else if(op.t===1)block.push(`-${a[op.i]}`);else block.push(`+${b2[op.i]}`)}out.push(block.join("\n"))}return out}function formatNote(prev,incoming){if(incoming==="")return REMOVED_NOTE;const hunks=diffLines(prev,incoming);return`${DIFF_HEADER}${hunks.join("\n\n")}`}function reconcileSystemAnchor(session,surface,incoming,sessionId,log2){const st2=readState(session.metadata,surface);if(st2.anchor===""&&st2.lastSeen===""&&st2.notes.length===0){if(incoming==="")return{outbound:"",notes:[],changed:false};writeState(session,surface,{anchor:incoming,lastSeen:incoming,notes:[]});log2("info",`[${sessionId}] stable-system-anchor[${surface}] captured ${incoming.length} chars`);return{outbound:incoming,notes:[],changed:false}}if(incoming===st2.lastSeen){return{outbound:st2.anchor,notes:st2.notes,changed:false}}const localized=incoming===""||diffLines(st2.lastSeen,incoming)!==null;if(!localized){writeState(session,surface,{anchor:incoming,lastSeen:incoming,notes:[]});log2("warn",`[${sessionId}] stable-system-anchor[${surface}] non-localized head change (structural reshuffle or oversized) \u2014 replacing anchor outright, one deliberate cache miss`);return{outbound:incoming,notes:[],changed:true}}const notes=[...st2.notes,formatNote(st2.lastSeen,incoming)];if(notes.length>ANCHOR_MAX_NOTES){writeState(session,surface,{anchor:incoming,lastSeen:incoming,notes:[]});log2("warn",`[${sessionId}] stable-system-anchor[${surface}] churn guard tripped (${st2.notes.length+1} change(s) > ${ANCHOR_MAX_NOTES}) \u2014 replacing anchor outright, one deliberate cache miss`);return{outbound:incoming,notes:[],changed:true}}writeState(session,surface,{...st2,lastSeen:incoming,notes});log2("info",`[${sessionId}] stable-system-anchor[${surface}] localized head-system change \u2014 forwarding ${st2.anchor.length}-char anchor, appending diff note (${notes.length} total)`);return{outbound:st2.anchor,notes,changed:true}}var FAKE_COMPLETION_HINT="[billion-context] Your last reply described a tool call as plain text instead of invoking it, so no tool actually ran. To act, invoke the tool through the proper tool-calling mechanism (emit a tool_use / tool_calls / function_call block). Do not write tool-call markup as text in your reply.";function maxFakeCompletionRetries(){const n=Number.parseInt(process.env.BILI_FAKE_COMPLETION_RETRIES??"0",10);return Number.isFinite(n)&&n>=0?n:0}function fakeBufCap(){const n=Number.parseInt(process.env.BILI_FAKE_BUF_CAP??String(16*1024*1024),10);return Number.isFinite(n)&&n>0?n:16*1024*1024}var ANTHROPIC_TOOL_BLOCK=/"type"\s*:\s*"tool_use"/;var OPENAI_TOOL_BLOCK=/"tool_calls"\s*:\s*\[\s*\{/;var RESPONSES_TOOL_BLOCK=/"type"\s*:\s*"function_call"/;var GOOGLE_TOOL_BLOCK=/"functionCall"\s*:\s*\{/;function hasToolBlock(protocol,rawText){switch(protocol){case"anthropic":return ANTHROPIC_TOOL_BLOCK.test(rawText);case"openai":return OPENAI_TOOL_BLOCK.test(rawText);case"responses":return RESPONSES_TOOL_BLOCK.test(rawText);case"google":return GOOGLE_TOOL_BLOCK.test(rawText)}}var TOOL_OPEN=/\x3c(?!\s*\/)(?:antml:)?(invoke|tool_calls|tool_call|parameter|parameters)\b|\\u003c(?!\s*\/)(?:antml:)?(invoke|tool_calls|tool_call|parameter|parameters)\b/i;var TOOL_CLOSE_GLOBAL=/\x3c\/(?:antml:)?(invoke|tool_calls|tool_call|parameter|parameters)\b|\\u003c\/(?:antml:)?(invoke|tool_calls|tool_call|parameter|parameters)\b/gi;function hasToolCallStructure(text){if(!containsToolCallXmlFragment(text))return false;if(TOOL_OPEN.test(text))return true;const closes=new Set;for(const m2 of text.matchAll(TOOL_CLOSE_GLOBAL)){const name=m2[1]??m2[2];if(name)closes.add(name.toLowerCase())}return closes.size>=2}function isFakeCompletion(protocol,rawText){return hasToolCallStructure(rawText)&&!hasToolBlock(protocol,rawText)}function injectFakeCompletionHint(protocol,body){return appendTrailingUserText(protocol,body,FAKE_COMPLETION_HINT)}function normalizeSseLineEndings(buf){if(buf.indexOf("\r")===-1)return buf;return buf.replace(/\r\n|\r/g,"\n")}async function readStreamToBuffer(stream2,maxBytes=1<<20){const reader=stream2.getReader();const chunks=[];let kept=0;try{for(;;){const{done,value}=await reader.read();if(done)break;if(value&&kept<maxBytes){const take=Math.min(value.length,maxBytes-kept);chunks.push(Buffer.from(value.subarray(0,take)));kept+=take}}}finally{reader.releaseLock()}return Buffer.concat(chunks)}function bufferToStream(buf){return new ReadableStream({start(controller){controller.enqueue(new Uint8Array(buf));controller.close()}})}function awaitDrain(res){if(res.destroyed||res.writableEnded)return Promise.resolve();return new Promise(resolve=>{const done=()=>{res.removeListener?.("drain",done);res.removeListener?.("close",done);res.removeListener?.("error",done);resolve()};res.once("drain",done);res.once("close",done);res.once("error",done)})}async function pipeThrough(stream2,res){const reader=stream2.getReader();try{for(;;){const{done,value}=await reader.read();if(done)break;if(res.destroyed||res.writableEnded)break;if(!res.write(Buffer.from(value))){await awaitDrain(res)}}}finally{reader.releaseLock();res.end()}}async function dumpStreamToFile(stream2,dir,name){const{mkdirSync:mkdirSync7,createWriteStream:createWriteStream2}=await import("fs");const{join:join5}=await import("path");try{mkdirSync7(dir,{recursive:true});const ws2=createWriteStream2(join5(dir,name));ws2.on("error",e=>{logDumpFailure("SSE stream dump",e)});const reader=stream2.getReader();try{for(;;){const{done,value}=await reader.read();if(done)break;ws2.write(Buffer.from(value))}}finally{reader.releaseLock();ws2.end()}}catch(err2){logDumpFailure("SSE stream dump",err2)}}var MIN_N=1;var DEFAULT_MARKER="Continue thinking...";var ENC_INCLUDE="reasoning.encrypted_content";var TERMINAL_TYPES=new Set(["response.completed","response.failed","response.incomplete"]);function resolveGuardConfig(cfg){const c=cfg??{};return{maxContinue:numOr(c.maxContinue,3),maxTierN:numOr(c.maxTierN,6),markerText:typeof c.markerText==="string"&&c.markerText.trim()?c.markerText.trim():DEFAULT_MARKER,base:numOr(c.base,518),offset:numOr(c.offset,-2),debugLog:c.debugLog===true}}function numOr(v2,dflt){return typeof v2==="number"&&Number.isFinite(v2)?v2:dflt}function reasoningGuardEngages(cfg){return cfg?.enabled===true}function reasoningTokens(usage){if(!usage)return null;const details=usage["output_tokens_details"];const rt2=details?.["reasoning_tokens"];return typeof rt2==="number"&&Number.isFinite(rt2)?rt2:null}function tierN(tokens,base,offset){if(tokens===null||base<=0)return null;const t=tokens-offset;if(t<base*MIN_N||t%base!==0)return null;const n=t/base;return Number.isInteger(n)&&n>=MIN_N?n:null}function inContinueWindow(n,maxTierN){if(n===null||n<MIN_N)return false;if(maxTierN!==0&&n>maxTierN)return false;return true}function hasEncryptedContent(reasoningItems){if(reasoningItems.length===0)return false;const ec2=reasoningItems[reasoningItems.length-1]?.["encrypted_content"];return typeof ec2==="string"&&ec2.length>0}function continueReason(usage,base,offset,maxTierN){const n=tierN(reasoningTokens(usage),base,offset);return inContinueWindow(n,maxTierN)?"truncation":""}function num2(v2){return typeof v2==="number"&&Number.isFinite(v2)?v2:0}function sumUsage(acc,usage){if(!usage)return;for(const key2 of["input_tokens","output_tokens","total_tokens"]){const v2=usage[key2];if(typeof v2==="number")acc[key2]=num2(acc[key2])+v2}const inDetails=usage["input_tokens_details"];if(inDetails&&typeof inDetails.cached_tokens==="number"){const accIn=acc["input_tokens_details"]??{};accIn.cached_tokens=num2(accIn.cached_tokens)+inDetails.cached_tokens;acc["input_tokens_details"]=accIn}const rt2=reasoningTokens(usage);if(rt2!==null){const accOut=acc["output_tokens_details"]??{};accOut.reasoning_tokens=num2(accOut.reasoning_tokens)+rt2;acc["output_tokens_details"]=accOut}}function agentUsage(first,summed,finalRound,flushedFinal){const f2=first??{};const inTok=num2(f2.input_tokens);const fDetails=f2["input_tokens_details"];const cached=fDetails&&typeof fDetails.cached_tokens==="number"?fDetails.cached_tokens:null;const sOut=summed["output_tokens_details"];const reason=sOut&&typeof sOut.reasoning_tokens==="number"?sOut.reasoning_tokens:0;let finalPart=0;if(flushedFinal&&finalRound){const out=num2(finalRound.output_tokens);const rt2=reasoningTokens(finalRound)??0;finalPart=Math.max(0,out-rt2)}const usage={input_tokens:inTok,output_tokens:reason+finalPart,total_tokens:inTok+reason+finalPart,output_tokens_details:{reasoning_tokens:reason}};if(cached!==null)usage["input_tokens_details"]={cached_tokens:cached};return usage}function buildTerminalEvent(opts){const tresp=opts.upstreamTerminal?.["response"]??{};const resp={...opts.baseResponse??tresp};resp.output=opts.output;resp.usage=opts.usage;const metadata={...resp.metadata??{}};metadata.proxy_rounds=opts.rounds;metadata.proxy_billed_usage=opts.billed;if(opts.stoppedReason)metadata.proxy_stopped_reason=opts.stoppedReason;resp.metadata=metadata;if(opts.incompleteReason){resp.status="incomplete";resp.incomplete_details={reason:opts.incompleteReason};return{type:"response.incomplete",response:resp}}const status=typeof tresp.status==="string"?tresp.status:"completed";resp.status=status;if(tresp.incomplete_details!==void 0)resp.incomplete_details=tresp.incomplete_details;const evType=typeof opts.upstreamTerminal?.["type"]==="string"?opts.upstreamTerminal["type"]:"response.completed";return{type:evType,response:resp}}function commentaryNudge(markerText){return{type:"message",role:"assistant",content:[{type:"output_text",text:markerText}],phase:"commentary"}}function nextRoundBody(baseBody,inputItems){const body={...baseBody};body.stream=true;body.input=inputItems;const includeRaw=Array.isArray(body.include)?body.include:[];const include=includeRaw.filter(x=>typeof x==="string");if(!include.includes(ENC_INCLUDE))include.push(ENC_INCLUDE);body.include=include;delete body.previous_response_id;return body}var DONE_SENTINEL=Symbol("done");function parseFrame(frame){let payload="";for(const line of frame.split("\n")){if(line.startsWith("data:"))payload+=(payload?"\n":"")+line.slice(5).replace(/^ /,"")}const trimmed=payload.trim();if(trimmed==="")return null;if(trimmed==="[DONE]")return DONE_SENTINEL;try{return JSON.parse(trimmed)}catch{return null}}function writeEvent(res,ev){res.write(`data: ${JSON.stringify(ev)}
2236
2236
 
@@ -2343,7 +2343,7 @@ Content-Length: ${Buffer.byteLength(body)}\r
2343
2343
  `+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 v${VERSION} 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}`);if(runtimeAgent!==void 0&&pluginWindow===void 0&&runtimeWindow===void 0){log2("warn",`[window] model=${model} agent=${runtimeAgent} sent no context window (x-bili-plugin-context-window absent, no matching runtime-info) \u2014 host-configured limit not reaching the proxy; sizing against ${wsSource}`)}}}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;enterSessionContext(sessionId);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??"")}
2344
2344
  ${hdrText}
2345
2345
 
2346
- ${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;if((session.stats.lastUsageGradeTokens??0)>0)return estimateCoreMessages(msgs)+inboundImageTokens;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}
2346
+ ${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;if((session.stats.lastUsageGradeTokens??0)>0)return estimateCoreMessages(msgs)+inboundImageTokens;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 anthropicCacheMarks;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)]}anthropicCacheMarks=cacheControls.size>0||anthropicToolsCarryCacheControl(parsed.tools)?void 0:computeAnthropicMessageMarks(processedMessages,attachedRetrievals.length,session);rebuiltMessages=coreToAnthropic(processedMessages,anthropicCacheMarks??cacheControls);if(sysNotes.length>0){rebuiltMessages=[...rebuiltMessages,...sysNotes.map(text=>({role:"user",content:text}))]}systemOut=injectSystem(parsed,opts,prompts,loopConfig,ensureCanonicalId(session),surface,visibilityMarkers);systemOut=stampAnthropicSystemCacheControl(systemOut,anthropicCacheMarks!==void 0);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,anthropicCacheMarks,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}
2347
2347
 
2348
2348
  ---
2349
2349
 
@@ -2354,7 +2354,7 @@ ${bodyText}`);log2("info",`[debug] RAW request dump: ${reqPath}`)}catch(err2){lo
2354
2354
  ${hdrText}
2355
2355
  `);log2("info",`[debug] RAW response dump: ${resPath}`)}catch(err2){logDumpFailure("RES dump",err2)}}if(!upstream.ok){let errBody=null;if(upstream.body){try{errBody=await readStreamToBuffer(upstream.body)}catch{errBody=null}}if(prepared?.session&&errBody){const s3=prepared.session;const info=inspectContextOverflow(upstream.status,errBody.toString("utf8"));if(info.isOverflow){armOverflowShrink(info)}if(upstream.status===400&&/reasoning_content/i.test(errBody.toString("utf8"))){if(s3.metadata.strictReasoningEcho!==true){s3.metadata.strictReasoningEcho=true;markDirty(s3);log2("warn",`[${s3.id}] upstream 400 mentions reasoning_content \u2014 learned strictReasoningEcho for this session (#684/#762); reasoning-drop disabled`)}}}if(prepared?.session&&upstream.status>=500){armFailureShrink(prepared,log2,`upstream ${upstream.status}`,outboundPayloadBreakdown(prepared,opts,route,req.url??"").armEstimate)}const errSid=prepared?.session.id??"unknown";const reqId=upstream.headers.get("x-request-id")??upstream.headers.get("request-id");const reqIdText=reqId?` request-id=${reqId}`:"";const bodyText=errBody?new TextDecoder().decode(errBody):"";let snippet=bodyText.slice(0,600).replace(/\s+/g," ").trim();if(bodyText.length>600)snippet+=" \u2026";if(!snippet)snippet="(no body)";log("warn",`[${errSid}] \u2190 upstream ${upstream.status}${reqIdText}: ${snippet}`);if(upstream.status>=400&&upstream.status<500){dumpRejectedBody(upstream.status,errSid,wireBody)}if(res.headersSent){if(prepared?.stream){emitStreamError(res,prepared.protocol,`upstream HTTP ${upstream.status}: ${snippet}`,m2=>log("info",m2),opts.streamErrorShape)}else{try{res.end(errBody??void 0)}catch{}}clearUpstreamTimer();return}const errHeaders={...respHeaders};delete errHeaders["content-length"];delete errHeaders["transfer-encoding"];res.writeHead(upstream.status,errHeaders);res.end(errBody??void 0);clearUpstreamTimer();return}if(!res.headersSent)res.writeHead(upstream.status,respHeaders);if(!upstream.body){res.end();clearUpstreamTimer();if(prepared?.resetAfterSuccess){log2("warn",`[${prepared.session.id}] native compact response had no body; rebase NOT scheduled`)}else{log("warn",`[${prepared?.session.id??"unknown"}] \u2190 upstream ${upstream.status} returned a null body; responding empty to client`)}return}let targetOrigin;try{targetOrigin=new URL(upstreamUrl).origin}catch{targetOrigin=void 0}if(prepared?.pluginMode){try{let pluginBody=upstream.body;if(prepared.stream&&maxFakeCompletionRetries()>0){const resolvedBuf=await resolveFakeCompletion(pluginBody,{protocol:prepared.protocol,body,upstreamUrl,reqHeaders:buildForwardHeaders(headers),proxyUrl,signal:clientAbort.signal,session:prepared.session,log:log2});pluginBody=bufferToStream(resolvedBuf)}if(prepared.stream){if(prepared.protocol==="responses"){await pipePluginResponsesWithStrip(pluginBody,res,prepared.session,msg=>log2("info",`[${prepared.session.id}] ${msg}`),makeContinuationRefetch({protocol:"responses",body,upstreamUrl,reqHeaders:buildForwardHeaders(headers),proxyUrl,dispatcher,signal:clientAbort.signal,log:log2,label:prepared.session.id}),targetOrigin)}else{await pipePluginChatWithStrip(pluginBody,res,prepared.protocol,prepared.session,msg=>log2("info",`[${prepared.session.id}] ${msg}`),makeContinuationRefetch({protocol:prepared.protocol,body,upstreamUrl,reqHeaders:buildForwardHeaders(headers),proxyUrl,dispatcher,signal:clientAbort.signal,log:log2,label:prepared.session.id}),targetOrigin)}}else{await pipePluginJson(pluginBody,res,prepared.session,prepared.protocol,targetOrigin)}}finally{clearUpstreamTimer()}return}if(prepared&&prepared.protocol==="responses"&&prepared.stream&&!prepared.sidePassthrough&&!prepared.compressInjected){const sse=(upstream.headers.get("content-type")??"").includes("text/event-stream");if(sse){let reqModel;try{const wb=typeof wireBody==="string"?wireBody:wireBody.toString("utf8");const parsed=JSON.parse(wb);if(typeof parsed.model==="string")reqModel=parsed.model}catch{}const rg=resolveCompress(opts.routes,upstreamUrl,reqModel,opts.compress).reasoningGuard;if(rg&&reasoningGuardEngages(rg)){log2("info",`[reasoning-guard] engaged model=${reqModel??"?"} session=${prepared.session?.id??"-"}`);await runReasoningGuard({firstResponse:upstream,clearFirstTimer:clearUpstreamTimer,upstreamUrl,reqHeaders:buildForwardHeaders(headers),dispatcher,originalBody:wireBody,signal:clientAbort.signal,res,config:rg,log:msg=>log2("info",msg)});return}}}let responseBody=upstream.body;try{if(prepared!==null&&prepared.stream&&!prepared.sidePassthrough&&maxFakeCompletionRetries()>0){const resolvedBuf=await resolveFakeCompletion(upstream.body,{protocol:prepared.protocol,body,upstreamUrl,reqHeaders:buildForwardHeaders(headers),proxyUrl,signal:clientAbort.signal,session:prepared.session,log:log2});responseBody=bufferToStream(resolvedBuf)}const useRewriter=prepared!==null&&prepared.compressInjected&&prepared.processedMessages.length>0;if(!useRewriter||prepared===null){if(prepared&&prepared.resetAfterSuccess){const[toClient,toObserve]=responseBody.tee();const observed=observeResponsesTerminalState(toObserve,prepared.stream);const tagLog=msg=>log2("info",`[${prepared.session.id}] ${msg}`);if((upstream.headers.get("content-type")??"").includes("text/event-stream")){await pipePluginResponsesWithStrip(toClient,res,void 0,tagLog,makeContinuationRefetch({protocol:"responses",body,upstreamUrl,reqHeaders:buildForwardHeaders(headers),proxyUrl,dispatcher,signal:clientAbort.signal,log:log2,label:prepared.session.id}))}else{await pipeThrough(toClient,res)}const terminal=await observed;if(terminal==="completed"){await withSessionLock(prepared.session,()=>markNativeCompactionBoundary(prepared.session));log2("info",`[${prepared.session.id}] native Responses compact completed; rebase scheduled for next Responses turn`)}else{log2("warn",`[${prepared.session.id}] native compact response terminal=${terminal}; rebase NOT scheduled`)}}else if(prepared&&prepared.stream&&(upstream.headers.get("content-type")??"").includes("text/event-stream")){const p2=prepared;const tagLog=msg=>log2("info",`[${p2.session.id}] ${msg}`);if(p2.protocol==="responses"){await pipePluginResponsesWithStrip(responseBody,res,void 0,tagLog,makeContinuationRefetch({protocol:"responses",body,upstreamUrl,reqHeaders:buildForwardHeaders(headers),proxyUrl,dispatcher,signal:clientAbort.signal,log:log2,label:p2.session.id}))}else{await pipePluginChatWithStrip(responseBody,res,p2.protocol,void 0,tagLog,makeContinuationRefetch({protocol:p2.protocol,body,upstreamUrl,reqHeaders:buildForwardHeaders(headers),proxyUrl,dispatcher,signal:clientAbort.signal,log:log2,label:p2.session.id}))}}else if(prepared&&(upstream.headers.get("content-type")??"").includes("application/json")){await pipePluginJson(responseBody,res,void 0,prepared.protocol)}else{await pipeThrough(responseBody,res)}return}const ctx={core,config,messages:prepared.originalMessages,session:prepared.session,log:msg=>log2("info",`[${prepared.session.id}] ${msg}`),debug:opts.debug};if(prepared.stream){let streamToRead=responseBody;let dumpRaw;if(opts.dumpSse){const[a,b2]=responseBody.tee();streamToRead=a;dumpRaw=dumpStreamToFile(b2,opts.dumpSse,`${Date.now()}-${safeSessionId(prepared.session.id)}-raw.sse`)}try{const parsedReq=JSON.parse(typeof body==="string"?body:body.toString("utf8"));const reqHeaders=buildForwardHeaders(headers);const textProtocol=prepared.protocol==="responses"&&!!prepared.responsesTextProtocol;const absorbBlock=effectiveAbsorbBlock(prepared.pluginMode===true,config,opts.compress.absorb);const absorbActive=absorbBlock?.enabled===true&&opts.compress.injectTool&&!textProtocol;const loopConfig=ccrLoopConfig(prepared.session,{...config,absorb:absorbActive?absorbBlock:void 0});const absorbSection=absorbActive?`
2356
2356
 
2357
- ${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:usageGradeInputBaseline(prepared.session),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,effectiveTokenCount(prepared.session,turn.messages));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){noteForwardedBody(prepared.session,typeof prepared.body==="string"?prepared.body:prepared.body.toString("utf8"));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)}`)}else{diagnoseSuccessWithoutUsage(prepared.session,"proxy-json")}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();const fullDownload=u2.searchParams.get("raw")==="1"&&u2.searchParams.get("all")==="1";let n=Number(u2.searchParams.get("lines")??"500");if(!Number.isFinite(n)||n<=0)n=500;n=fullDownload?1e5:Math.min(Math.floor(n),2e3);let ctx=Number(u2.searchParams.get("ctx")??"0");if(!Number.isFinite(ctx)||ctx<0)ctx=0;ctx=Math.min(Math.floor(ctx),50);let win=Number(u2.searchParams.get("win")??"0");if(!Number.isFinite(win)||win<0)win=0;win=Math.min(Math.floor(win),3600);const logFile=getLogPath()??defaultLogFile();const dir=logFile?path23.dirname(logFile)+path23.sep:"";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}all=all.concat(text.split("\n").filter(l=>l.length>0))}const r=queryLogLines(all,q2,{ctx,winSec:win,n});if(u2.searchParams.get("raw")==="1"){res.writeHead(200,{"content-type":"text/plain; charset=utf-8","content-disposition":`attachment; filename="${fullDownload?"billion-context-full-log.txt":"billion-context-log.txt"}"`});res.end(r.lines.join("\n"));return}res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({path:logFile,total:r.total,shown:r.shown,omitted:r.omitted,lines:r.lines,...r.isMatch?{isMatch:r.isMatch}:{}},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
2357
+ ${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,prepared.anthropicCacheMarks);const refreshFolded=async current=>{return withSessionLock(prepared.session,async()=>{const turn=core.processTurn({messages:prepared.originalMessages,state:prepared.session.state,config:loopConfig,tokenCount:usageGradeInputBaseline(prepared.session),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,effectiveTokenCount(prepared.session,turn.messages));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){noteForwardedBody(prepared.session,typeof prepared.body==="string"?prepared.body:prepared.body.toString("utf8"));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)}`)}else{diagnoseSuccessWithoutUsage(prepared.session,"proxy-json")}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();const fullDownload=u2.searchParams.get("raw")==="1"&&u2.searchParams.get("all")==="1";let n=Number(u2.searchParams.get("lines")??"500");if(!Number.isFinite(n)||n<=0)n=500;n=fullDownload?1e5:Math.min(Math.floor(n),2e3);let ctx=Number(u2.searchParams.get("ctx")??"0");if(!Number.isFinite(ctx)||ctx<0)ctx=0;ctx=Math.min(Math.floor(ctx),50);let win=Number(u2.searchParams.get("win")??"0");if(!Number.isFinite(win)||win<0)win=0;win=Math.min(Math.floor(win),3600);const logFile=getLogPath()??defaultLogFile();const dir=logFile?path23.dirname(logFile)+path23.sep:"";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}all=all.concat(text.split("\n").filter(l=>l.length>0))}const r=queryLogLines(all,q2,{ctx,winSec:win,n});if(u2.searchParams.get("raw")==="1"){res.writeHead(200,{"content-type":"text/plain; charset=utf-8","content-disposition":`attachment; filename="${fullDownload?"billion-context-full-log.txt":"billion-context-log.txt"}"`});res.end(r.lines.join("\n"));return}res.writeHead(200,{"content-type":"application/json"});res.end(JSON.stringify({path:logFile,total:r.total,shown:r.shown,omitted:r.omitted,lines:r.lines,...r.isMatch?{isMatch:r.isMatch}:{}},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
2358
2358
  `)}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}
2359
2359
  `);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}
2360
2360
  `)}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=`