billion-context 0.1.210 → 0.1.211

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.
@@ -128,7 +128,7 @@ ${captureLines}`:capture2.stack}module.exports.fetch=function fetch2(init,option
128
128
  `)}return DEFAULT_PROXY_ORIGIN}return discovered.origin}return DEFAULT_PROXY_ORIGIN}var TOOL_TIMEOUT_MS=6e4;var TOOL_TIMEOUT_OVERHEAD_MARGIN_MS=3e4;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 manifestMaxToolDurationMs;var conversationId=CONVERSATION_FROM_ENV;var registeredConversations=new Set;var initialized=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 sendError(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 advertised=data.capabilities?.externalSummary?.maxToolDurationMs;if(typeof advertised==="number"&&Number.isFinite(advertised)&&advertised>0)manifestMaxToolDurationMs=advertised;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")}function effectiveToolTimeoutMs(tool){if(tool!=="compress")return TOOL_TIMEOUT_MS;if(manifestMaxToolDurationMs===void 0)return TOOL_TIMEOUT_MS;return Math.max(TOOL_TIMEOUT_MS,manifestMaxToolDurationMs+TOOL_TIMEOUT_OVERHEAD_MARGIN_MS)}var manifestPromise=null;function ensureManifest(){manifestPromise??=fetchManifest().catch(err=>{manifestPromise=null;throw err});return manifestPromise}async function forwardTool(tool,args,timeoutMs=TOOL_TIMEOUT_MS,conversationIdOverride=void 0,nativeCaller=false,toolCallId=void 0){for(let attempt=0;;attempt++){const effectiveConversationId=conversationIdOverride??conversationId;let res;try{const body={conversationId:effectiveConversationId,tool,args};if(nativeCaller&&effectiveConversationId)body.nativeCaller=true;if(toolCallId)body.toolCallId=toolCallId;res=await fetch(`${resolveProxyOrigin()}/__bili/plugin/tool`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(body),signal:AbortSignal.timeout(timeoutMs)})}catch(err){if(err instanceof Error&&err.name==="TimeoutError")throw new Error(`tool forward timed out after ${timeoutMs}ms: ${tool}`);throw err}const data=await res.json();if(res.ok&&data.ok){const outcome=parseToolOutcome(data.outcome);const blocksCreated=parseBlocksCreated(data.blocksCreated);let text=data.result??"";if(outcome==="partial")text+=`
129
129
  ${partialOutcomeNote(blocksCreated)}`;const out={text,failed:outcome==="failure"||outcome==="refused"};if(outcome!==void 0)out.outcome=outcome;if(blocksCreated!==void 0)out.blocksCreated=blocksCreated;return out}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}if(res.status===409&&attempt===0&&ORPHAN_ADOPT&&conversationIdOverride===void 0&&conversationId&&data.code==="TOOL_CONVERSATION_CONFLICT"){const witnesses=Array.isArray(data.witnessSessions)?data.witnessSessions.filter(x=>typeof x==="string"&&x.length>0):[];const namedSeen=typeof data.namedSessionLastSeen==="number"?data.namedSessionLastSeen:NaN;const witnessSeen=typeof data.witnessLastSeen==="number"?data.witnessLastSeen:NaN;if(witnesses.length===1&&witnesses[0]!==conversationId&&Number.isFinite(namedSeen)&&Number.isFinite(witnessSeen)&&witnessSeen>namedSeen){process.stderr.write(`[bili-mcp] captured conversation id ${conversationId} is stale \u2014 the host moved this conversation to ${witnesses[0]} (resume/native compaction?); re-binding
130
130
  `);conversationId=witnesses[0];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}
131
- `);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;initialized=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:VERSION2},capabilities:{tools:{}}});return}case"notifications/initialized":return;case"tools/list":{if(!initialized){sendError(id,-32002,"server not initialized");return}if(degradedReason!==void 0){sendResult(id,{tools:[]});return}try{await ensureManifest();sendResult(id,{tools:manifestTools})}catch(err){sendError(id,-32003,`bili proxy unreachable at ${resolveProxyOrigin()} (${err instanceof Error?err.message:String(err)}) \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){sendError(id,ERR_TOOL,"params.name is required");return}if(degradedReason!==void 0){sendResult(id,{content:[{type:"text",text:`bili is idle: ${degradedReason}`}],isError:true});return}const perCallRaw=rawArgs.conversation_id;const perCall=typeof perCallRaw==="string"?perCallRaw.trim():"";const metaThreadId=params._meta?.threadId;const nativeThreadId=typeof metaThreadId==="string"&&metaThreadId.trim().length>0?metaThreadId.trim():void 0;const metaToolUseId=params._meta?.["claudecode/toolUseId"];const hostToolUseId=typeof metaToolUseId==="string"&&metaToolUseId.trim().length>0?metaToolUseId.trim():void 0;const keepForSearch=tool==="search_context"&&perCall.length>0&&(nativeThreadId!==void 0||typeof conversationId==="string"&&conversationId.length>0);const args={...rawArgs};if(!keepForSearch)delete args.conversation_id;const routeOverride=nativeThreadId??(keepForSearch?void 0:perCall||void 0);try{const out=await forwardTool(tool,args,effectiveToolTimeoutMs(tool),routeOverride,nativeThreadId!==void 0,hostToolUseId);const result={content:[{type:"text",text:out.text}],isError:out.failed};if(out.outcome!==void 0||out.blocksCreated!==void 0){const structured={text:out.text};if(out.outcome!==void 0)structured.outcome=out.outcome;if(out.blocksCreated!==void 0)structured.blocksCreated=out.blocksCreated;result.structuredContent=structured}sendResult(id,result)}catch(err){sendResult(id,{content:[{type:"text",text:`bili tool error: ${err instanceof Error?err.message:String(err)}`}],isError:true})}return}case"ping":sendResult(id,{});return;default:if(method?.startsWith("notifications/"))return;sendError(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))}var degradedReason;if(process.argv[1]&&/(?:^|[\\/])mcp\.(?:ts|js)$/.test(process.argv[1])){void mcpMain()}import path8 from"path";import{fileURLToPath as fileURLToPath3}from"url";function proxyEnvOrigin(env){const raw=env.BILLION_CONTEXT_PROXY;if(raw===void 0)return void 0;const url=raw.trim();if(url.length===0||!/^https?:\/\//i.test(url))return void 0;try{new URL(url)}catch{return void 0}return url.replace(/\/+$/,"")}function nativeAttachOrigin(env){const raw=env.BILLION_CONTEXT_ATTACH;if(raw===void 0)return void 0;const url=raw.trim();if(url.length===0||!/^https?:\/\//i.test(url))return void 0;try{new URL(url)}catch{return void 0}return url.replace(/\/+$/,"")}function envMillis(env,name,fallback){const raw=env[name];if(raw===void 0)return fallback;const n=Number(raw);return Number.isFinite(n)&&n>0?Math.floor(n):fallback}var STATUS_TIMEOUT_MS=5e3;async function fetchJson(url,init,timeoutMs,externalSignal){const ac=new AbortController;if(externalSignal?.aborted)ac.abort();const timer=setTimeout(()=>ac.abort(),timeoutMs);const onExternalAbort=()=>ac.abort();externalSignal?.addEventListener("abort",onExternalAbort,{once:true});try{let res;try{res=await fetch(url,{...init,signal:ac.signal})}catch(err){if(ac.signal.aborted&&!externalSignal?.aborted)throw new Error(`timeout after ${timeoutMs}ms: ${url}`);throw err}const text=await res.text();let json=void 0;try{json=JSON.parse(text)}catch{json=void 0}return{ok:res.ok,status:res.status,json}}finally{clearTimeout(timer);externalSignal?.removeEventListener("abort",onExternalAbort)}}var HOOK_EXIT_BACKSTOP_MS=5e3;function runSessionStartHook(main2,deps={}){const exit=deps.exit??(code=>process.exit(code));const input=deps.input??process.stdin;void main2().finally(()=>{try{input.destroy?.()}catch{}process.exitCode=0;const backstop=setTimeout(()=>exit(0),deps.backstopMs??HOOK_EXIT_BACKSTOP_MS);backstop.unref?.()})}async function reportRuntimeInfo(proxyBase,info){const{ok,status}=await fetchJson(`${proxyBase}/__bili/plugin/runtime-info`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(info)},STATUS_TIMEOUT_MS);if(!ok)throw new Error(`runtime-info report failed (${status})`)}import fs15 from"fs";import path27 from"path";import{createHash as createHash14,randomUUID as randomUUID6}from"crypto";import fs14 from"fs";import net3 from"net";import os9 from"os";import path26 from"path";import{createRequire as createRequire3}from"module";import{Worker as Worker3}from"worker_threads";import{pathToFileURL as pathToFileURL2}from"url";import{execFileSync as execFileSync5,spawn as spawn2,spawnSync as spawnSync3}from"child_process";import tls4 from"tls";var import_node_forge=__toESM(require_lib(),1);init_paths();init_logger();import crypto from"crypto";import{execFileSync as execFileSync3}from"child_process";import fs3 from"fs";import os3 from"os";import path9 from"path";import tls3 from"tls";var COMBINED_MAX_AGE_MS=24*60*60*1e3;var PLATFORM_CA_CANDIDATES=process.platform==="darwin"?["/etc/ssl/cert.pem","/private/etc/ssl/cert.pem"]:process.platform==="win32"?[]:["/etc/ssl/certs/ca-certificates.crt","/etc/pki/tls/certs/ca-bundle.crt","/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem","/etc/ssl/ca-bundle.pem","/etc/ssl/cert.pem"];init_upstream_proxy();init_client_config();init_vertex();import fs5 from"fs";import os5 from"os";import path11 from"path";init_util();init_log_mask();init_knobs();init_mitm_domains();init_private_host();init_upstream_fail();init_instance();import net2 from"net";init_main();init_client_config();init_vertex();init_config();init_instance();init_dsh_channel();init_pi_channel();init_update();import fs12 from"fs";import path19 from"path";import os8 from"os";import crypto4 from"crypto";import{execFileSync as execFileSync4,spawnSync as spawnSync2}from"child_process";import{fileURLToPath as fileURLToPath5}from"url";init_client_config();import fs10 from"fs";import path17 from"path";import crypto3 from"crypto";import fs11 from"fs";import path18 from"path";init_instance();init_config();init_log_mask();init_logger();init_paths();init_version();import{appendFileSync,mkdirSync as mkdirSync3}from"fs";import path20 from"path";init_logger();init_version();import http from"http";var MAX_HOLD_MS=10*6e4;init_update();init_win_cmd();init_client_config();init_config();init_registry();init_config();init_logger();function parseLauncherModelWindows(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_WINDOWS=parseLauncherModelWindows(process.env.BILI_LAUNCHER_MODEL_WINDOWS);function parseLauncherModelMaxOutputs(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_MAX_OUTPUTS=parseLauncherModelMaxOutputs(process.env.BILI_LAUNCHER_MODEL_MAX_OUTPUTS);init_vertex();init_client_config();init_logger();import{createHash as createHash13}from"crypto";import{createHash as createHash12,randomUUID as randomUUID4}from"crypto";import{closeSync,existsSync as existsSync6,fsyncSync,mkdirSync as mkdirSync6,openSync,readdirSync,readFileSync as readFileSync7,renameSync as renameSync2,rmSync,statSync as statSync6,writeFileSync as writeFileSync5}from"fs";import{readdir as readdir2,readFile as readFile4,rm as rm2}from"fs/promises";import*as path23 from"path";init_paths();init_knobs();init_logger();init_runtime_status();init_version();import{createCipheriv,createDecipheriv,randomBytes as randomBytes2}from"crypto";import*as zlib from"zlib";var ENCRYPT_MAGIC=Buffer.from("BILIENC1","utf8");var ZSTD_MAGIC=Buffer.from("BILIZSTD1","utf8");var NONCE_LEN=12;var TAG_LEN=16;var ENCRYPT_HEADER_LEN=ENCRYPT_MAGIC.length+2+NONCE_LEN;var MIN_ENCRYPTED_LEN=ENCRYPT_HEADER_LEN+TAG_LEN;var PLAIN_HEADER_LEN=ZSTD_MAGIC.length+2;init_logger();init_billing();init_state_hydration();init_shadow();init_backend();init_ingest();init_store();init_logger();init_paths();import{randomUUID as randomUUID2}from"crypto";import{mkdirSync as mkdirSync5,writeFileSync as writeFileSync4}from"fs";import{dirname as dirname3,join as join2}from"path";init_knobs();import{createHash as createHash11,randomUUID as randomUUID3}from"crypto";import{AsyncLocalStorage as AsyncLocalStorage3}from"async_hooks";init_logger();import{createHash as createHash10}from"crypto";import{createHash as createHash9}from"crypto";init_logger();init_logger();init_billing();init_util();var BOOT_ID=randomUUID3();var SEAM_BODY_CAP=512*1024;var BODY_FULL_CAP=8*1024*1024;var captures=new AsyncLocalStorage3;var LEARNED_IMAGE_COST_TTL_MS=24*60*60*1e3;var{join:join4}=path23;init_version();init_knobs();init_config();init_config();init_paths();init_logger();init_external_summary_settings();import*as path24 from"path";init_turn_separator();init_turn_separator();var ABORT_REANCHOR_MAX_AGE_MS=30*60*1e3;var MAX_SESSIONS=maxSessions();var MAX_RESIDENT_BYTES=sessionResidentMaxBytes();var SPLIT_CANARY_FRESH_MS=10*60*1e3;import{randomUUID as randomUUID5}from"crypto";init_knobs();init_client_config();import fs13 from"fs";import path25 from"path";init_dsh_channel();var SCAN_CACHE_TTL_MS=5*60*1e3;var CONFLICT_ACTIVE_WINDOW_MS=7*24*60*60*1e3;var SPAWN_WAIT_MS=envMillis(process.env,"BILI_SPAWN_WAIT_MS",2e4);var SLOW_START_GRACE_MS=envMillis(process.env,"BILI_SLOW_START_GRACE_MS",4e4);var SPAWN_BUDGET_MS=SPAWN_WAIT_MS+SLOW_START_GRACE_MS;var STARTING_MARKER_TTL_MS=SPAWN_BUDGET_MS+3e4;var DEFAULT_MITM_DOMAIN_SET=new Set(DEFAULT_MITM_DOMAINS.map(d=>d.toLowerCase()));var PORT_LOG_MAX_BYTES=5*1024*1024;var PATH_EXTS=process.platform==="win32"?[".cmd",".bat",".exe",""]:[""];init_client_config();init_instance();var KIMI_PROVIDER="bili";var KIMI_ALIAS="bili-kimi";var KIMI_MANAGED_BEGIN="# bili begin (managed by billion-context \u2014 `bili plugin install kimi`)";var KIMI_MANAGED_END="# bili end";var KIMI_PREV_MODEL_KEY="# bili prev-default-model";var KIMI_DEFAULT_UPSTREAM="https://api.kimi.com/coding/v1";var KIMI_CODE_PROVIDER="managed:kimi-code";function openDoc(text){const eol=text.includes("\r\n")?"\r\n":"\n";return{lines:text.split(/\r?\n/),eol}}function closeDoc(doc){while(doc.lines.length>1&&doc.lines[doc.lines.length-1].trim()==="")doc.lines.pop();return doc.lines.join(doc.eol)+doc.eol}function tomlPathParts(header){const parts=[];let cur="";let dq=false;let sq=false;for(const ch of header){if(ch==='"'&&!sq)dq=!dq;else if(ch==="'"&&!dq)sq=!sq;else if(ch==="."&&!dq&&!sq){parts.push(cur);cur=""}else cur+=ch}parts.push(cur);return parts.map(p2=>p2.trim())}function headerParts(line){const m2=/^\[\[?(.+?)\]\]?\s*(?:#.*)?$/.exec(line.trim());if(!m2)return void 0;return tomlPathParts(m2[1])}function keyValue(line){const l=line.trim();if(!l||l.startsWith("#")||l.startsWith("["))return void 0;const strMatch=/^([A-Za-z0-9_.-]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/.exec(l);if(strMatch)return{key:strMatch[1],strVal:strMatch[2]!==void 0?strMatch[2]:strMatch[3]};const numMatch=/^([A-Za-z0-9_.-]+)\s*=\s*([0-9]+)\b/.exec(l);if(numMatch)return{key:numMatch[1],numVal:Number(numMatch[2])};const tblMatch=/^([A-Za-z0-9_.-]+)\s*=\s*[{[]/.exec(l);if(tblMatch)return{key:tblMatch[1]};return void 0}var KIMI_MODEL_PASSTHROUGH_KEYS=["capabilities","support_efforts","default_effort"];function bracketDepth(line){let depth=0;let dq=false;let sq=false;for(let i=0;i<line.length;i++){const ch=line[i];if(dq){if(ch==='"'&&line[i-1]!=="\\")dq=false;continue}if(sq){if(ch==="'")sq=false;continue}if(ch==="#")break;if(ch==='"')dq=true;else if(ch==="'")sq=true;else if(ch==="["||ch==="{")depth+=1;else if(ch==="]"||ch==="}")depth-=1}return depth}function stripKimiManagedBlock(text){const doc=openDoc(text);let start=-1;let end=-1;for(let i=0;i<doc.lines.length;i++){const t=doc.lines[i].trim();if(t===KIMI_MANAGED_BEGIN)start=i;else if(t===KIMI_MANAGED_END){if(start>=0){end=i;break}throw new Error('config.toml contains a stray "# bili end" marker outside a managed block \u2014 fix it manually or run `bili plugin remove kimi`')}}if(start>=0&&end<0)throw new Error('config.toml managed block is truncated (missing "# bili end") \u2014 fix it manually or run `bili plugin remove kimi`');if(start<0)return{text,hadBlock:false};const cutFrom=start>0&&doc.lines[start-1].trim()===""?start-1:start;doc.lines.splice(cutFrom,end-cutFrom+1);return{text:closeDoc(doc),hadBlock:true}}function kimiProxiedBaseUrl(port,upstream){return`http://127.0.0.1:${port}/bili/${upstream.replace(/\/+$/,"")}`}function extractBiliUpstream(baseUrl){const m2=/^https?:\/\/[^/]+\/bili\/(https?:\/\/.+)$/.exec(baseUrl);return m2?.[1]?.replace(/\/+$/,"")}function renderKimiManagedBlock(state2,prevDefaultModel){const out=[];out.push(KIMI_MANAGED_BEGIN);out.push(`# Routes ${KIMI_ALIAS} through the local bili proxy. Managed by `);out.push("# billion-context \u2014 edits here are overwritten; uninstall restores your config.");out.push(`[providers.${KIMI_PROVIDER}]`);out.push('type = "kimi"');out.push(`base_url = "${kimiProxiedBaseUrl(state2.port,state2.upstream)}"`);for(const line of state2.authLines)out.push(line);out.push("");out.push(`[models.${KIMI_ALIAS}]`);out.push(`provider = "${KIMI_PROVIDER}"`);out.push(`model = "${state2.modelId}"`);if(state2.contextWindow!==void 0)out.push(`max_context_size = ${state2.contextWindow}`);if(state2.maxOutput!==void 0)out.push(`max_output_size = ${state2.maxOutput}`);for(const line of state2.extraLines??[])out.push(line);out.push("");out.push(`${KIMI_PREV_MODEL_KEY} = ${prevDefaultModel===""?"ABSENT":JSON.stringify(prevDefaultModel)}`);out.push(KIMI_MANAGED_END);return out.join("\n")}function firstTableHeaderIndex(lines){for(let i=0;i<lines.length;i++)if(headerParts(lines[i]))return i;return lines.length}function topLevelDefaultModel(lines,headerAt){for(let i=0;i<headerAt;i++){const kv=keyValue(lines[i]);if(kv?.key==="default_model"&&kv.strVal!==void 0)return{index:i,value:kv.strVal}}return void 0}function readCarriedDefaultModel(text){for(const line of text.split(/\r?\n/)){const m2=new RegExp(`^\\s*${KIMI_PREV_MODEL_KEY}\\s*=\\s*(.+?)\\s*$`).exec(line.trim());if(m2)return m2[1]==="ABSENT"?"":m2[1].replace(/^["']|["']$/g,"")}return void 0}function applyKimiManagedConfig(text,state2){const stripped=stripKimiManagedBlock(text);const doc=openDoc(stripped.text);for(const line of doc.lines){const parts=headerParts(line);if(parts&&(parts[0]==="providers"&&parts[1]===KIMI_PROVIDER||parts[0]==="models"&&parts[1]===KIMI_ALIAS)){throw new Error(`config.toml already defines [${parts.slice(0,2).join(".")}] outside the bili managed block \u2014 rename it, or run \`bili plugin remove kimi\` first`)}}const headerAt=firstTableHeaderIndex(doc.lines);const existing=topLevelDefaultModel(doc.lines,headerAt);let prevDefaultModel=existing?.value??"";if(stripped.hadBlock){const carried=readCarriedDefaultModel(text);if(carried!==void 0)prevDefaultModel=carried;if(existing&&existing.value!==KIMI_ALIAS){if(doc.lines[doc.lines.length-1].trim()!=="")doc.lines.push("");for(const line of renderKimiManagedBlock(state2,prevDefaultModel).split("\n"))doc.lines.push(line);return closeDoc(doc)}}if(existing)doc.lines[existing.index]=`default_model = "${KIMI_ALIAS}"`;else doc.lines.splice(0,0,`default_model = "${KIMI_ALIAS}"`);if(doc.lines[doc.lines.length-1].trim()!=="")doc.lines.push("");for(const line of renderKimiManagedBlock(state2,prevDefaultModel).split("\n"))doc.lines.push(line);return closeDoc(doc)}function scanText(text){const providers=new Map;const models=new Map;let defaultModel;let parts=[];const allLines=text.split(/\r?\n/);for(let li2=0;li2<allLines.length;li2++){const rawLine=allLines[li2];const h=headerParts(rawLine);if(h){parts=h;continue}const kv=keyValue(rawLine);if(!kv)continue;if(parts.length===0){if(kv.key==="default_model"&&kv.strVal!==void 0)defaultModel=kv.strVal;continue}if(parts[0]==="providers"&&parts[1]){const prov=providers.get(parts[1])??{oauthLines:[]};if(parts.length===2){if(kv.key==="base_url"&&kv.strVal!==void 0)prov.baseUrl=kv.strVal;else if(kv.key==="api_key"&&kv.strVal!==void 0&&kv.strVal!=="")prov.apiKeyLine=rawLine.trim();else if(kv.key==="api_key_env"&&kv.strVal!==void 0)prov.apiKeyEnvLine=rawLine.trim()}else if(parts.length===3&&parts[2]==="env"&&kv.strVal!==void 0&&/_BASE_URL$/.test(kv.key)){prov.envBaseUrl=kv.strVal}else if(parts.length===3&&parts[2]==="oauth"){prov.oauthLines.push(rawLine.trim())}providers.set(parts[1],prov)}else if(parts[0]==="models"&&parts[1]){const st2=models.get(parts[1])??{};if(parts.length===2){if(KIMI_MODEL_PASSTHROUGH_KEYS.includes(kv.key)){const collected=[rawLine.trim()];let depth=bracketDepth(rawLine);let j2=li2+1;while(depth>0&&j2<allLines.length){const next=allLines[j2];if(headerParts(next))break;collected.push(next.trim());depth+=bracketDepth(next);j2+=1}if(depth<=0)st2.extraLines=[...st2.extraLines??[],...collected];li2=j2-1}else if(kv.key==="model"&&kv.strVal!==void 0)st2.modelId=kv.strVal;else if(kv.key==="provider"&&kv.strVal!==void 0)st2.provider=kv.strVal;else if(kv.key==="max_context_size"&&kv.numVal!==void 0)st2.window=kv.numVal;else if(kv.key==="max_output_size"&&kv.numVal!==void 0)st2.maxOutput=kv.numVal;else if(kv.key==="base_url"&&kv.strVal!==void 0)st2.baseUrl=kv.strVal}models.set(parts[1],st2)}}return{defaultModel,providers,models}}function authLinesFor(prov){if(!prov)return void 0;if(prov.oauthLines.length>0)return[`api_key = ""`,`[providers.${KIMI_PROVIDER}.oauth]`,...prov.oauthLines];if(prov.apiKeyLine)return[prov.apiKeyLine];if(prov.apiKeyEnvLine)return[prov.apiKeyEnvLine];return void 0}function resolveKimiRoute(text,env){const scan=scanText(text);const alias=scan.defaultModel;if(!alias)return{ok:false,reason:"no default_model set in config.toml"};const envOverride=env.KIMI_CODE_BASE_URL?.trim().replace(/\/+$/,"");if(alias===KIMI_ALIAS){const selfProv=scan.providers.get(KIMI_PROVIDER);const selfModel=scan.models.get(KIMI_ALIAS);const upstream2=selfProv?.baseUrl?extractBiliUpstream(selfProv.baseUrl):void 0;const auth2=authLinesFor(selfProv);if(!auth2)return{ok:false,reason:"managed block lost its credentials \u2014 run `bili plugin remove kimi` and reinstall"};if(!upstream2)return{ok:false,reason:"managed block base_url no longer embeds a bili route \u2014 run `bili plugin remove kimi` and reinstall"};return{ok:true,upstream:upstream2,modelId:selfModel?.modelId??alias,alias,contextWindow:selfModel?.window,maxOutput:selfModel?.maxOutput,authLines:auth2,authSource:KIMI_PROVIDER,extraLines:selfModel?.extraLines}}const modelSection=scan.models.get(alias);const providerName=modelSection?.provider??KIMI_CODE_PROVIDER;const prov=scan.providers.get(providerName);const upstream=envOverride??prov?.baseUrl?.replace(/\/+$/,"")??prov?.envBaseUrl?.replace(/\/+$/,"")??modelSection?.baseUrl?.replace(/\/+$/,"")??KIMI_DEFAULT_UPSTREAM;const auth=authLinesFor(prov);if(!auth){return{ok:false,reason:prov===void 0?`provider "${providerName}" is not defined in config.toml \u2014 log in to kimi first ('kimi login')`:`provider "${providerName}" has no api_key / api_key_env / oauth`}}return{ok:true,upstream,modelId:modelSection?.modelId??alias,alias,contextWindow:modelSection?.window,maxOutput:modelSection?.maxOutput,authLines:auth,authSource:providerName,extraLines:modelSection?.extraLines}}function planNativeKimi(env=process.env){if(env.BILLION_CONTEXT_PLUGIN==="0"||env.BILI_NATIVE_KIMI==="0")return{mode:"off"};if(env.BILI_PROVIDER_REWRITES!==void 0)return{mode:"off"};const attach=nativeAttachOrigin(env)??proxyEnvOrigin(env);if(attach!==void 0)return{mode:"attach",attachOrigin:attach};return{mode:"spawn"}}async function probeProxyHealth(origin,timeoutMs=2e3){try{const res=await fetch(`${origin}/__bili/plugin/status?conversationId=kimi&fallback=latest`,{signal:AbortSignal.timeout(timeoutMs)});if(res.status>=500)return false;const text=await res.text();return text.startsWith("{")&&text.includes('"ok"')}catch{return false}}async function waitForProxyHealthy(origin,deadlineMs=15e3,intervalMs=250){const deadline=Date.now()+deadlineMs;for(;;){if(await probeProxyHealth(origin))return true;if(Date.now()+intervalMs>deadline)return false;await new Promise(r=>setTimeout(r,intervalMs))}}var CONFIG_LOCK_DIR=".bili-config.lock";var CONFIG_LOCK_TIMEOUT_MS=5e3;var CONFIG_LOCK_STALE_MS=3e4;function lockStale(lockDir){try{const pidRaw=fs15.readFileSync(path27.join(lockDir,"pid"),"utf8").trim();const age=Date.now()-fs15.statSync(lockDir).mtimeMs;if(age>CONFIG_LOCK_STALE_MS)return true;const pid=Number.parseInt(pidRaw,10);return Number.isInteger(pid)&&pid>0&&!isPidAlive(pid)}catch{return true}}async function withConfigLock(kimiHome,fn){const lockDir=path27.join(kimiHome,CONFIG_LOCK_DIR);const deadline=Date.now()+CONFIG_LOCK_TIMEOUT_MS;for(;;){try{fs15.mkdirSync(lockDir);fs15.writeFileSync(path27.join(lockDir,"pid"),String(process.pid));break}catch(err){if(err.code!=="EEXIST")throw err;if(lockStale(lockDir)){fs15.rmSync(lockDir,{recursive:true,force:true});continue}if(Date.now()>deadline)throw new Error("timed out waiting for the kimi config.toml lock");await new Promise(r=>setTimeout(r,100))}}try{return fn()}finally{fs15.rmSync(lockDir,{recursive:true,force:true})}}async function routeKimiConfig(opts){const env=opts.env??process.env;const log2=opts.log??defaultLog;const home=opts.kimiHome??resolveKimiHome(env);const cfgPath=path27.join(home,"config.toml");let text;try{text=fs15.readFileSync(cfgPath,"utf8")}catch{log2(`no ${cfgPath} \u2014 nothing to route`);return void 0}let res=resolveKimiRoute(text,env);if(!res.ok){log2(`skipping config rewrite: ${res.reason}`);return void 0}const port=Number.parseInt(new URL(opts.origin).port,10);if(!Number.isInteger(port)||port<=0)throw new Error(`cannot derive a port from proxy origin ${opts.origin}`);const state2={port,upstream:res.upstream,modelId:res.modelId,contextWindow:res.contextWindow,maxOutput:res.maxOutput,authLines:res.authLines,extraLines:res.extraLines};const authSource=res.authSource;const bakPath=path27.join(home,"config.toml.bili-bak");await withConfigLock(home,()=>{const current=fs15.readFileSync(cfgPath,"utf8");if(!fs15.existsSync(bakPath))fs15.writeFileSync(bakPath,current);fs15.writeFileSync(cfgPath,applyKimiManagedConfig(current,state2))});const check=resolveKimiRoute(fs15.readFileSync(cfgPath,"utf8"),env);if(!check.ok||check.upstream!==res.upstream)throw new Error(`kimi config rewrite verification failed: ${check.ok?"upstream mismatch":check.reason}`);return{origin:opts.origin,port,upstream:res.upstream,modelId:res.modelId,contextWindow:res.contextWindow,maxOutput:res.maxOutput,authSource}}function defaultLog(msg){process.stderr.write(`[bili-kimi] ${msg}
131
+ `);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;initialized=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:VERSION2},capabilities:{tools:{}}});return}case"notifications/initialized":return;case"tools/list":{if(!initialized){sendError(id,-32002,"server not initialized");return}if(degradedReason!==void 0){sendResult(id,{tools:[]});return}try{await ensureManifest();sendResult(id,{tools:manifestTools})}catch(err){sendError(id,-32003,`bili proxy unreachable at ${resolveProxyOrigin()} (${err instanceof Error?err.message:String(err)}) \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){sendError(id,ERR_TOOL,"params.name is required");return}if(degradedReason!==void 0){sendResult(id,{content:[{type:"text",text:`bili is idle: ${degradedReason}`}],isError:true});return}const perCallRaw=rawArgs.conversation_id;const perCall=typeof perCallRaw==="string"?perCallRaw.trim():"";const metaThreadId=params._meta?.threadId;const nativeThreadId=typeof metaThreadId==="string"&&metaThreadId.trim().length>0?metaThreadId.trim():void 0;const metaToolUseId=params._meta?.["claudecode/toolUseId"];const hostToolUseId=typeof metaToolUseId==="string"&&metaToolUseId.trim().length>0?metaToolUseId.trim():void 0;const keepForSearch=tool==="search_context"&&perCall.length>0&&(nativeThreadId!==void 0||typeof conversationId==="string"&&conversationId.length>0);const args={...rawArgs};if(!keepForSearch)delete args.conversation_id;const routeOverride=nativeThreadId??(keepForSearch?void 0:perCall||void 0);try{const out=await forwardTool(tool,args,effectiveToolTimeoutMs(tool),routeOverride,nativeThreadId!==void 0,hostToolUseId);const result={content:[{type:"text",text:out.text}],isError:out.failed};if(out.outcome!==void 0||out.blocksCreated!==void 0){const structured={text:out.text};if(out.outcome!==void 0)structured.outcome=out.outcome;if(out.blocksCreated!==void 0)structured.blocksCreated=out.blocksCreated;result.structuredContent=structured}sendResult(id,result)}catch(err){sendResult(id,{content:[{type:"text",text:`bili tool error: ${err instanceof Error?err.message:String(err)}`}],isError:true})}return}case"ping":sendResult(id,{});return;default:if(method?.startsWith("notifications/"))return;sendError(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))}var degradedReason;if(process.argv[1]&&/(?:^|[\\/])mcp\.(?:ts|js)$/.test(process.argv[1])){void mcpMain()}import path8 from"path";import{fileURLToPath as fileURLToPath3}from"url";function proxyEnvOrigin(env){const raw=env.BILLION_CONTEXT_PROXY;if(raw===void 0)return void 0;const url=raw.trim();if(url.length===0||!/^https?:\/\//i.test(url))return void 0;try{new URL(url)}catch{return void 0}return url.replace(/\/+$/,"")}function nativeAttachOrigin(env){const raw=env.BILLION_CONTEXT_ATTACH;if(raw===void 0)return void 0;const url=raw.trim();if(url.length===0||!/^https?:\/\//i.test(url))return void 0;try{new URL(url)}catch{return void 0}return url.replace(/\/+$/,"")}function envMillis(env,name,fallback){const raw=env[name];if(raw===void 0)return fallback;const n=Number(raw);return Number.isFinite(n)&&n>0?Math.floor(n):fallback}var STATUS_TIMEOUT_MS=5e3;async function fetchJson(url,init,timeoutMs,externalSignal){const ac=new AbortController;if(externalSignal?.aborted)ac.abort();const timer=setTimeout(()=>ac.abort(),timeoutMs);const onExternalAbort=()=>ac.abort();externalSignal?.addEventListener("abort",onExternalAbort,{once:true});try{let res;try{res=await fetch(url,{...init,signal:ac.signal})}catch(err){if(ac.signal.aborted&&!externalSignal?.aborted)throw new Error(`timeout after ${timeoutMs}ms: ${url}`);throw err}const text=await res.text();let json=void 0;try{json=JSON.parse(text)}catch{json=void 0}return{ok:res.ok,status:res.status,json}}finally{clearTimeout(timer);externalSignal?.removeEventListener("abort",onExternalAbort)}}var HOOK_EXIT_BACKSTOP_MS=5e3;function runSessionStartHook(main2,deps={}){const exit=deps.exit??(code=>process.exit(code));const input=deps.input??process.stdin;void main2().finally(()=>{try{input.destroy?.()}catch{}process.exitCode=0;const backstop=setTimeout(()=>exit(0),deps.backstopMs??HOOK_EXIT_BACKSTOP_MS);backstop.unref?.()})}async function reportRuntimeInfo(proxyBase,info){const{ok,status}=await fetchJson(`${proxyBase}/__bili/plugin/runtime-info`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(info)},STATUS_TIMEOUT_MS);if(!ok)throw new Error(`runtime-info report failed (${status})`)}import fs15 from"fs";import path27 from"path";import{createHash as createHash14,randomUUID as randomUUID6}from"crypto";import fs14 from"fs";import net3 from"net";import os9 from"os";import path26 from"path";import{createRequire as createRequire3}from"module";import{Worker as Worker3}from"worker_threads";import{pathToFileURL as pathToFileURL2}from"url";import{execFileSync as execFileSync5,spawn as spawn2,spawnSync as spawnSync3}from"child_process";import tls4 from"tls";var import_node_forge=__toESM(require_lib(),1);init_paths();init_logger();import crypto from"crypto";import{execFileSync as execFileSync3}from"child_process";import fs3 from"fs";import os3 from"os";import path9 from"path";import tls3 from"tls";var COMBINED_MAX_AGE_MS=24*60*60*1e3;var PLATFORM_CA_CANDIDATES=process.platform==="darwin"?["/etc/ssl/cert.pem","/private/etc/ssl/cert.pem"]:process.platform==="win32"?[]:["/etc/ssl/certs/ca-certificates.crt","/etc/pki/tls/certs/ca-bundle.crt","/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem","/etc/ssl/ca-bundle.pem","/etc/ssl/cert.pem"];init_upstream_proxy();init_client_config();init_vertex();import fs5 from"fs";import os5 from"os";import path11 from"path";init_util();init_log_mask();init_knobs();init_mitm_domains();init_private_host();init_upstream_fail();init_instance();import net2 from"net";init_main();init_client_config();init_vertex();init_config();init_instance();init_dsh_channel();init_pi_channel();init_update();import fs12 from"fs";import path19 from"path";import os8 from"os";import crypto4 from"crypto";import{execFileSync as execFileSync4,spawnSync as spawnSync2}from"child_process";import{fileURLToPath as fileURLToPath5}from"url";init_client_config();import fs10 from"fs";import path17 from"path";import crypto3 from"crypto";import fs11 from"fs";import path18 from"path";init_instance();init_config();init_log_mask();init_logger();init_paths();init_version();import{appendFileSync,mkdirSync as mkdirSync3}from"fs";import path20 from"path";init_logger();init_version();import http from"http";var MAX_HOLD_MS=10*6e4;init_update();init_win_cmd();init_client_config();init_config();init_registry();init_config();init_logger();function parseLauncherModelWindows(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_WINDOWS=parseLauncherModelWindows(process.env.BILI_LAUNCHER_MODEL_WINDOWS);function parseLauncherModelMaxOutputs(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_MAX_OUTPUTS=parseLauncherModelMaxOutputs(process.env.BILI_LAUNCHER_MODEL_MAX_OUTPUTS);init_vertex();init_client_config();init_logger();import{createHash as createHash13}from"crypto";import{createHash as createHash12,randomUUID as randomUUID4}from"crypto";import{closeSync,existsSync as existsSync6,fsyncSync,mkdirSync as mkdirSync6,openSync,readdirSync,readFileSync as readFileSync7,renameSync as renameSync2,rmSync,statSync as statSync6,writeFileSync as writeFileSync5}from"fs";import{readdir as readdir2,readFile as readFile4,rm as rm2}from"fs/promises";import*as path23 from"path";init_paths();init_knobs();init_logger();init_runtime_status();init_version();import{createCipheriv,createDecipheriv,randomBytes as randomBytes2}from"crypto";import*as zlib from"zlib";var ENCRYPT_MAGIC=Buffer.from("BILIENC1","utf8");var ZSTD_MAGIC=Buffer.from("BILIZSTD1","utf8");var NONCE_LEN=12;var TAG_LEN=16;var ENCRYPT_HEADER_LEN=ENCRYPT_MAGIC.length+2+NONCE_LEN;var MIN_ENCRYPTED_LEN=ENCRYPT_HEADER_LEN+TAG_LEN;var PLAIN_HEADER_LEN=ZSTD_MAGIC.length+2;init_logger();init_billing();init_state_hydration();init_shadow();init_logger();var HOT_ATTACH_WINDOW_MS=10*6e4;var ATTACH_SILENCE_MS=5*6e4;init_backend();init_ingest();init_store();init_logger();init_paths();import{randomUUID as randomUUID2}from"crypto";import{mkdirSync as mkdirSync5,writeFileSync as writeFileSync4}from"fs";import{dirname as dirname3,join as join2}from"path";init_knobs();import{createHash as createHash11,randomUUID as randomUUID3}from"crypto";import{AsyncLocalStorage as AsyncLocalStorage3}from"async_hooks";init_logger();import{createHash as createHash10}from"crypto";import{createHash as createHash9}from"crypto";init_logger();init_logger();init_billing();init_util();var BOOT_ID=randomUUID3();var SEAM_BODY_CAP=512*1024;var BODY_FULL_CAP=8*1024*1024;var captures=new AsyncLocalStorage3;var LEARNED_IMAGE_COST_TTL_MS=24*60*60*1e3;var{join:join4}=path23;var FROZEN_SKIP_NOTICE_COOLDOWN_MS=10*6e4;init_version();init_knobs();init_config();init_config();init_paths();init_logger();init_external_summary_settings();import*as path24 from"path";init_turn_separator();init_turn_separator();var ABORT_REANCHOR_MAX_AGE_MS=30*60*1e3;var MAX_SESSIONS=maxSessions();var MAX_RESIDENT_BYTES=sessionResidentMaxBytes();var SPLIT_CANARY_FRESH_MS=10*60*1e3;import{randomUUID as randomUUID5}from"crypto";init_knobs();init_client_config();import fs13 from"fs";import path25 from"path";init_dsh_channel();var SCAN_CACHE_TTL_MS=5*60*1e3;var CONFLICT_ACTIVE_WINDOW_MS=7*24*60*60*1e3;var SPAWN_WAIT_MS=envMillis(process.env,"BILI_SPAWN_WAIT_MS",2e4);var SLOW_START_GRACE_MS=envMillis(process.env,"BILI_SLOW_START_GRACE_MS",4e4);var SPAWN_BUDGET_MS=SPAWN_WAIT_MS+SLOW_START_GRACE_MS;var STARTING_MARKER_TTL_MS=SPAWN_BUDGET_MS+3e4;var DEFAULT_MITM_DOMAIN_SET=new Set(DEFAULT_MITM_DOMAINS.map(d=>d.toLowerCase()));var PORT_LOG_MAX_BYTES=5*1024*1024;var PATH_EXTS=process.platform==="win32"?[".cmd",".bat",".exe",""]:[""];init_client_config();init_instance();var KIMI_PROVIDER="bili";var KIMI_ALIAS="bili-kimi";var KIMI_MANAGED_BEGIN="# bili begin (managed by billion-context \u2014 `bili plugin install kimi`)";var KIMI_MANAGED_END="# bili end";var KIMI_PREV_MODEL_KEY="# bili prev-default-model";var KIMI_DEFAULT_UPSTREAM="https://api.kimi.com/coding/v1";var KIMI_CODE_PROVIDER="managed:kimi-code";function openDoc(text){const eol=text.includes("\r\n")?"\r\n":"\n";return{lines:text.split(/\r?\n/),eol}}function closeDoc(doc){while(doc.lines.length>1&&doc.lines[doc.lines.length-1].trim()==="")doc.lines.pop();return doc.lines.join(doc.eol)+doc.eol}function tomlPathParts(header){const parts=[];let cur="";let dq=false;let sq=false;for(const ch of header){if(ch==='"'&&!sq)dq=!dq;else if(ch==="'"&&!dq)sq=!sq;else if(ch==="."&&!dq&&!sq){parts.push(cur);cur=""}else cur+=ch}parts.push(cur);return parts.map(p2=>p2.trim())}function headerParts(line){const m2=/^\[\[?(.+?)\]\]?\s*(?:#.*)?$/.exec(line.trim());if(!m2)return void 0;return tomlPathParts(m2[1])}function keyValue(line){const l=line.trim();if(!l||l.startsWith("#")||l.startsWith("["))return void 0;const strMatch=/^([A-Za-z0-9_.-]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/.exec(l);if(strMatch)return{key:strMatch[1],strVal:strMatch[2]!==void 0?strMatch[2]:strMatch[3]};const numMatch=/^([A-Za-z0-9_.-]+)\s*=\s*([0-9]+)\b/.exec(l);if(numMatch)return{key:numMatch[1],numVal:Number(numMatch[2])};const tblMatch=/^([A-Za-z0-9_.-]+)\s*=\s*[{[]/.exec(l);if(tblMatch)return{key:tblMatch[1]};return void 0}var KIMI_MODEL_PASSTHROUGH_KEYS=["capabilities","support_efforts","default_effort"];function bracketDepth(line){let depth=0;let dq=false;let sq=false;for(let i=0;i<line.length;i++){const ch=line[i];if(dq){if(ch==='"'&&line[i-1]!=="\\")dq=false;continue}if(sq){if(ch==="'")sq=false;continue}if(ch==="#")break;if(ch==='"')dq=true;else if(ch==="'")sq=true;else if(ch==="["||ch==="{")depth+=1;else if(ch==="]"||ch==="}")depth-=1}return depth}function stripKimiManagedBlock(text){const doc=openDoc(text);let start=-1;let end=-1;for(let i=0;i<doc.lines.length;i++){const t=doc.lines[i].trim();if(t===KIMI_MANAGED_BEGIN)start=i;else if(t===KIMI_MANAGED_END){if(start>=0){end=i;break}throw new Error('config.toml contains a stray "# bili end" marker outside a managed block \u2014 fix it manually or run `bili plugin remove kimi`')}}if(start>=0&&end<0)throw new Error('config.toml managed block is truncated (missing "# bili end") \u2014 fix it manually or run `bili plugin remove kimi`');if(start<0)return{text,hadBlock:false};const cutFrom=start>0&&doc.lines[start-1].trim()===""?start-1:start;doc.lines.splice(cutFrom,end-cutFrom+1);return{text:closeDoc(doc),hadBlock:true}}function kimiProxiedBaseUrl(port,upstream){return`http://127.0.0.1:${port}/bili/${upstream.replace(/\/+$/,"")}`}function extractBiliUpstream(baseUrl){const m2=/^https?:\/\/[^/]+\/bili\/(https?:\/\/.+)$/.exec(baseUrl);return m2?.[1]?.replace(/\/+$/,"")}function renderKimiManagedBlock(state2,prevDefaultModel){const out=[];out.push(KIMI_MANAGED_BEGIN);out.push(`# Routes ${KIMI_ALIAS} through the local bili proxy. Managed by `);out.push("# billion-context \u2014 edits here are overwritten; uninstall restores your config.");out.push(`[providers.${KIMI_PROVIDER}]`);out.push('type = "kimi"');out.push(`base_url = "${kimiProxiedBaseUrl(state2.port,state2.upstream)}"`);for(const line of state2.authLines)out.push(line);out.push("");out.push(`[models.${KIMI_ALIAS}]`);out.push(`provider = "${KIMI_PROVIDER}"`);out.push(`model = "${state2.modelId}"`);if(state2.contextWindow!==void 0)out.push(`max_context_size = ${state2.contextWindow}`);if(state2.maxOutput!==void 0)out.push(`max_output_size = ${state2.maxOutput}`);for(const line of state2.extraLines??[])out.push(line);out.push("");out.push(`${KIMI_PREV_MODEL_KEY} = ${prevDefaultModel===""?"ABSENT":JSON.stringify(prevDefaultModel)}`);out.push(KIMI_MANAGED_END);return out.join("\n")}function firstTableHeaderIndex(lines){for(let i=0;i<lines.length;i++)if(headerParts(lines[i]))return i;return lines.length}function topLevelDefaultModel(lines,headerAt){for(let i=0;i<headerAt;i++){const kv=keyValue(lines[i]);if(kv?.key==="default_model"&&kv.strVal!==void 0)return{index:i,value:kv.strVal}}return void 0}function readCarriedDefaultModel(text){for(const line of text.split(/\r?\n/)){const m2=new RegExp(`^\\s*${KIMI_PREV_MODEL_KEY}\\s*=\\s*(.+?)\\s*$`).exec(line.trim());if(m2)return m2[1]==="ABSENT"?"":m2[1].replace(/^["']|["']$/g,"")}return void 0}function applyKimiManagedConfig(text,state2){const stripped=stripKimiManagedBlock(text);const doc=openDoc(stripped.text);for(const line of doc.lines){const parts=headerParts(line);if(parts&&(parts[0]==="providers"&&parts[1]===KIMI_PROVIDER||parts[0]==="models"&&parts[1]===KIMI_ALIAS)){throw new Error(`config.toml already defines [${parts.slice(0,2).join(".")}] outside the bili managed block \u2014 rename it, or run \`bili plugin remove kimi\` first`)}}const headerAt=firstTableHeaderIndex(doc.lines);const existing=topLevelDefaultModel(doc.lines,headerAt);let prevDefaultModel=existing?.value??"";if(stripped.hadBlock){const carried=readCarriedDefaultModel(text);if(carried!==void 0)prevDefaultModel=carried;if(existing&&existing.value!==KIMI_ALIAS){if(doc.lines[doc.lines.length-1].trim()!=="")doc.lines.push("");for(const line of renderKimiManagedBlock(state2,prevDefaultModel).split("\n"))doc.lines.push(line);return closeDoc(doc)}}if(existing)doc.lines[existing.index]=`default_model = "${KIMI_ALIAS}"`;else doc.lines.splice(0,0,`default_model = "${KIMI_ALIAS}"`);if(doc.lines[doc.lines.length-1].trim()!=="")doc.lines.push("");for(const line of renderKimiManagedBlock(state2,prevDefaultModel).split("\n"))doc.lines.push(line);return closeDoc(doc)}function scanText(text){const providers=new Map;const models=new Map;let defaultModel;let parts=[];const allLines=text.split(/\r?\n/);for(let li2=0;li2<allLines.length;li2++){const rawLine=allLines[li2];const h=headerParts(rawLine);if(h){parts=h;continue}const kv=keyValue(rawLine);if(!kv)continue;if(parts.length===0){if(kv.key==="default_model"&&kv.strVal!==void 0)defaultModel=kv.strVal;continue}if(parts[0]==="providers"&&parts[1]){const prov=providers.get(parts[1])??{oauthLines:[]};if(parts.length===2){if(kv.key==="base_url"&&kv.strVal!==void 0)prov.baseUrl=kv.strVal;else if(kv.key==="api_key"&&kv.strVal!==void 0&&kv.strVal!=="")prov.apiKeyLine=rawLine.trim();else if(kv.key==="api_key_env"&&kv.strVal!==void 0)prov.apiKeyEnvLine=rawLine.trim()}else if(parts.length===3&&parts[2]==="env"&&kv.strVal!==void 0&&/_BASE_URL$/.test(kv.key)){prov.envBaseUrl=kv.strVal}else if(parts.length===3&&parts[2]==="oauth"){prov.oauthLines.push(rawLine.trim())}providers.set(parts[1],prov)}else if(parts[0]==="models"&&parts[1]){const st2=models.get(parts[1])??{};if(parts.length===2){if(KIMI_MODEL_PASSTHROUGH_KEYS.includes(kv.key)){const collected=[rawLine.trim()];let depth=bracketDepth(rawLine);let j2=li2+1;while(depth>0&&j2<allLines.length){const next=allLines[j2];if(headerParts(next))break;collected.push(next.trim());depth+=bracketDepth(next);j2+=1}if(depth<=0)st2.extraLines=[...st2.extraLines??[],...collected];li2=j2-1}else if(kv.key==="model"&&kv.strVal!==void 0)st2.modelId=kv.strVal;else if(kv.key==="provider"&&kv.strVal!==void 0)st2.provider=kv.strVal;else if(kv.key==="max_context_size"&&kv.numVal!==void 0)st2.window=kv.numVal;else if(kv.key==="max_output_size"&&kv.numVal!==void 0)st2.maxOutput=kv.numVal;else if(kv.key==="base_url"&&kv.strVal!==void 0)st2.baseUrl=kv.strVal}models.set(parts[1],st2)}}return{defaultModel,providers,models}}function authLinesFor(prov){if(!prov)return void 0;if(prov.oauthLines.length>0)return[`api_key = ""`,`[providers.${KIMI_PROVIDER}.oauth]`,...prov.oauthLines];if(prov.apiKeyLine)return[prov.apiKeyLine];if(prov.apiKeyEnvLine)return[prov.apiKeyEnvLine];return void 0}function resolveKimiRoute(text,env){const scan=scanText(text);const alias=scan.defaultModel;if(!alias)return{ok:false,reason:"no default_model set in config.toml"};const envOverride=env.KIMI_CODE_BASE_URL?.trim().replace(/\/+$/,"");if(alias===KIMI_ALIAS){const selfProv=scan.providers.get(KIMI_PROVIDER);const selfModel=scan.models.get(KIMI_ALIAS);const upstream2=selfProv?.baseUrl?extractBiliUpstream(selfProv.baseUrl):void 0;const auth2=authLinesFor(selfProv);if(!auth2)return{ok:false,reason:"managed block lost its credentials \u2014 run `bili plugin remove kimi` and reinstall"};if(!upstream2)return{ok:false,reason:"managed block base_url no longer embeds a bili route \u2014 run `bili plugin remove kimi` and reinstall"};return{ok:true,upstream:upstream2,modelId:selfModel?.modelId??alias,alias,contextWindow:selfModel?.window,maxOutput:selfModel?.maxOutput,authLines:auth2,authSource:KIMI_PROVIDER,extraLines:selfModel?.extraLines}}const modelSection=scan.models.get(alias);const providerName=modelSection?.provider??KIMI_CODE_PROVIDER;const prov=scan.providers.get(providerName);const upstream=envOverride??prov?.baseUrl?.replace(/\/+$/,"")??prov?.envBaseUrl?.replace(/\/+$/,"")??modelSection?.baseUrl?.replace(/\/+$/,"")??KIMI_DEFAULT_UPSTREAM;const auth=authLinesFor(prov);if(!auth){return{ok:false,reason:prov===void 0?`provider "${providerName}" is not defined in config.toml \u2014 log in to kimi first ('kimi login')`:`provider "${providerName}" has no api_key / api_key_env / oauth`}}return{ok:true,upstream,modelId:modelSection?.modelId??alias,alias,contextWindow:modelSection?.window,maxOutput:modelSection?.maxOutput,authLines:auth,authSource:providerName,extraLines:modelSection?.extraLines}}function planNativeKimi(env=process.env){if(env.BILLION_CONTEXT_PLUGIN==="0"||env.BILI_NATIVE_KIMI==="0")return{mode:"off"};if(env.BILI_PROVIDER_REWRITES!==void 0)return{mode:"off"};const attach=nativeAttachOrigin(env)??proxyEnvOrigin(env);if(attach!==void 0)return{mode:"attach",attachOrigin:attach};return{mode:"spawn"}}async function probeProxyHealth(origin,timeoutMs=2e3){try{const res=await fetch(`${origin}/__bili/plugin/status?conversationId=kimi&fallback=latest`,{signal:AbortSignal.timeout(timeoutMs)});if(res.status>=500)return false;const text=await res.text();return text.startsWith("{")&&text.includes('"ok"')}catch{return false}}async function waitForProxyHealthy(origin,deadlineMs=15e3,intervalMs=250){const deadline=Date.now()+deadlineMs;for(;;){if(await probeProxyHealth(origin))return true;if(Date.now()+intervalMs>deadline)return false;await new Promise(r=>setTimeout(r,intervalMs))}}var CONFIG_LOCK_DIR=".bili-config.lock";var CONFIG_LOCK_TIMEOUT_MS=5e3;var CONFIG_LOCK_STALE_MS=3e4;function lockStale(lockDir){try{const pidRaw=fs15.readFileSync(path27.join(lockDir,"pid"),"utf8").trim();const age=Date.now()-fs15.statSync(lockDir).mtimeMs;if(age>CONFIG_LOCK_STALE_MS)return true;const pid=Number.parseInt(pidRaw,10);return Number.isInteger(pid)&&pid>0&&!isPidAlive(pid)}catch{return true}}async function withConfigLock(kimiHome,fn){const lockDir=path27.join(kimiHome,CONFIG_LOCK_DIR);const deadline=Date.now()+CONFIG_LOCK_TIMEOUT_MS;for(;;){try{fs15.mkdirSync(lockDir);fs15.writeFileSync(path27.join(lockDir,"pid"),String(process.pid));break}catch(err){if(err.code!=="EEXIST")throw err;if(lockStale(lockDir)){fs15.rmSync(lockDir,{recursive:true,force:true});continue}if(Date.now()>deadline)throw new Error("timed out waiting for the kimi config.toml lock");await new Promise(r=>setTimeout(r,100))}}try{return fn()}finally{fs15.rmSync(lockDir,{recursive:true,force:true})}}async function routeKimiConfig(opts){const env=opts.env??process.env;const log2=opts.log??defaultLog;const home=opts.kimiHome??resolveKimiHome(env);const cfgPath=path27.join(home,"config.toml");let text;try{text=fs15.readFileSync(cfgPath,"utf8")}catch{log2(`no ${cfgPath} \u2014 nothing to route`);return void 0}let res=resolveKimiRoute(text,env);if(!res.ok){log2(`skipping config rewrite: ${res.reason}`);return void 0}const port=Number.parseInt(new URL(opts.origin).port,10);if(!Number.isInteger(port)||port<=0)throw new Error(`cannot derive a port from proxy origin ${opts.origin}`);const state2={port,upstream:res.upstream,modelId:res.modelId,contextWindow:res.contextWindow,maxOutput:res.maxOutput,authLines:res.authLines,extraLines:res.extraLines};const authSource=res.authSource;const bakPath=path27.join(home,"config.toml.bili-bak");await withConfigLock(home,()=>{const current=fs15.readFileSync(cfgPath,"utf8");if(!fs15.existsSync(bakPath))fs15.writeFileSync(bakPath,current);fs15.writeFileSync(cfgPath,applyKimiManagedConfig(current,state2))});const check=resolveKimiRoute(fs15.readFileSync(cfgPath,"utf8"),env);if(!check.ok||check.upstream!==res.upstream)throw new Error(`kimi config rewrite verification failed: ${check.ok?"upstream mismatch":check.reason}`);return{origin:opts.origin,port,upstream:res.upstream,modelId:res.modelId,contextWindow:res.contextWindow,maxOutput:res.maxOutput,authSource}}function defaultLog(msg){process.stderr.write(`[bili-kimi] ${msg}
132
132
  `)}var HOOK_HEALTH_DEADLINE_MS=4e3;function readStdinPayload(timeoutMs=5e3){return new Promise(resolve=>{let buf="";let done=false;const finish=()=>{if(done)return;done=true;clearTimeout(timer);process.stdin.removeAllListeners();try{resolve(JSON.parse(buf))}catch{resolve({})}};const timer=setTimeout(finish,timeoutMs);process.stdin.setEncoding("utf8");process.stdin.on("data",chunk=>{buf+=chunk});process.stdin.on("end",finish)})}async function main(){if(process.env.NODE_TEST_CONTEXT!==void 0)return;try{const payload=await readStdinPayload();const plan=planNativeKimi(process.env);if(plan.mode==="off")return;const origin=plan.mode==="attach"?plan.attachOrigin:resolveProxyOrigin();if(!await waitForProxyHealthy(origin,HOOK_HEALTH_DEADLINE_MS))return;const applied=await routeKimiConfig({origin});if(!applied)return;const model=typeof payload.model==="string"&&payload.model.length>0?payload.model:applied.modelId;await reportRuntimeInfo(origin,{agent:"kimi",model,baseURL:applied.upstream,source:"session-start-hook"})}catch{return}}if(process.argv[1]&&/(?:^|[\\/])bootstrap-hook\.(?:ts|js)$/.test(process.argv[1])){runSessionStartHook(main)}export{main};
133
133
  /*! Bundled license information:
134
134
 
@@ -130,7 +130,7 @@ ${partialOutcomeNote(blocksCreated)}`;const out={text,failed:outcome==="failure"
130
130
  `);conversationId=witnesses[0];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}
131
131
  `);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;initialized=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:VERSION2},capabilities:{tools:{}}});return}case"notifications/initialized":return;case"tools/list":{if(!initialized){sendError(id,-32002,"server not initialized");return}if(degradedReason!==void 0){sendResult(id,{tools:[]});return}try{await ensureManifest();sendResult(id,{tools:manifestTools})}catch(err){sendError(id,-32003,`bili proxy unreachable at ${resolveProxyOrigin()} (${err instanceof Error?err.message:String(err)}) \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){sendError(id,ERR_TOOL,"params.name is required");return}if(degradedReason!==void 0){sendResult(id,{content:[{type:"text",text:`bili is idle: ${degradedReason}`}],isError:true});return}const perCallRaw=rawArgs.conversation_id;const perCall=typeof perCallRaw==="string"?perCallRaw.trim():"";const metaThreadId=params._meta?.threadId;const nativeThreadId=typeof metaThreadId==="string"&&metaThreadId.trim().length>0?metaThreadId.trim():void 0;const metaToolUseId=params._meta?.["claudecode/toolUseId"];const hostToolUseId=typeof metaToolUseId==="string"&&metaToolUseId.trim().length>0?metaToolUseId.trim():void 0;const keepForSearch=tool==="search_context"&&perCall.length>0&&(nativeThreadId!==void 0||typeof conversationId==="string"&&conversationId.length>0);const args={...rawArgs};if(!keepForSearch)delete args.conversation_id;const routeOverride=nativeThreadId??(keepForSearch?void 0:perCall||void 0);try{const out=await forwardTool(tool,args,effectiveToolTimeoutMs(tool),routeOverride,nativeThreadId!==void 0,hostToolUseId);const result={content:[{type:"text",text:out.text}],isError:out.failed};if(out.outcome!==void 0||out.blocksCreated!==void 0){const structured={text:out.text};if(out.outcome!==void 0)structured.outcome=out.outcome;if(out.blocksCreated!==void 0)structured.blocksCreated=out.blocksCreated;result.structuredContent=structured}sendResult(id,result)}catch(err){sendResult(id,{content:[{type:"text",text:`bili tool error: ${err instanceof Error?err.message:String(err)}`}],isError:true})}return}case"ping":sendResult(id,{});return;default:if(method?.startsWith("notifications/"))return;sendError(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))}var degradedReason;function runMcpStdio(opts={}){degradedReason=opts.degraded;void mcpMain()}if(process.argv[1]&&/(?:^|[\\/])mcp\.(?:ts|js)$/.test(process.argv[1])){void mcpMain()}import path8 from"path";import{fileURLToPath as fileURLToPath3}from"url";function nativeProxyScriptPath(fromUrl=import.meta.url){return path8.resolve(path8.dirname(fileURLToPath3(fromUrl)),"..","index.js")}function proxyEnvOrigin(env){const raw=env.BILLION_CONTEXT_PROXY;if(raw===void 0)return void 0;const url=raw.trim();if(url.length===0||!/^https?:\/\//i.test(url))return void 0;try{new URL(url)}catch{return void 0}return url.replace(/\/+$/,"")}function nativeAttachOrigin(env){const raw=env.BILLION_CONTEXT_ATTACH;if(raw===void 0)return void 0;const url=raw.trim();if(url.length===0||!/^https?:\/\//i.test(url))return void 0;try{new URL(url)}catch{return void 0}return url.replace(/\/+$/,"")}function envMillis(env,name,fallback){const raw=env[name];if(raw===void 0)return fallback;const n=Number(raw);return Number.isFinite(n)&&n>0?Math.floor(n):fallback}var MANIFEST_TIMEOUT_MS=5e3;var STATUS_TIMEOUT_MS=5e3;async function fetchJson(url,init,timeoutMs,externalSignal){const ac=new AbortController;if(externalSignal?.aborted)ac.abort();const timer=setTimeout(()=>ac.abort(),timeoutMs);const onExternalAbort=()=>ac.abort();externalSignal?.addEventListener("abort",onExternalAbort,{once:true});try{let res;try{res=await fetch(url,{...init,signal:ac.signal})}catch(err){if(ac.signal.aborted&&!externalSignal?.aborted)throw new Error(`timeout after ${timeoutMs}ms: ${url}`);throw err}const text=await res.text();let json=void 0;try{json=JSON.parse(text)}catch{json=void 0}return{ok:res.ok,status:res.status,json}}finally{clearTimeout(timer);externalSignal?.removeEventListener("abort",onExternalAbort)}}var manifestToolDurations=new Map;function recordManifestToolDuration(proxyBase,json){const caps=json?.capabilities?.externalSummary;const value=caps?.maxToolDurationMs;if(typeof value==="number"&&Number.isFinite(value)&&value>0)manifestToolDurations.set(proxyBase,value)}async function fetchManifest2(proxyBase,format2="anthropic"){const{ok,status,json}=await fetchJson(`${proxyBase}/__bili/plugin/manifest`,void 0,MANIFEST_TIMEOUT_MS);if(!ok||!json||typeof json!=="object")throw new Error(`manifest fetch failed: ${status}`);recordManifestToolDuration(proxyBase,json);if(format2==="openai"){const data2=json;const tools2=[];for(const t of data2.tools?.openai??[]){const name=t.name??t.function?.name;if(typeof name!=="string"||name.length===0)continue;tools2.push({name,description:t.description??t.function?.description,inputSchema:t.parameters??t.function?.parameters??{type:"object",properties:{}}})}if(tools2.length===0)throw new Error("manifest served no openai tools");return tools2}const data=json;const tools=(data.tools?.anthropic??[]).filter(t=>typeof t.name==="string");if(tools.length===0)throw new Error("manifest served no anthropic tools");return tools.map(t=>({name:t.name,description:t.description,inputSchema:t.input_schema??{type:"object",properties:{}}}))}async function reportRuntimeInfo(proxyBase,info){const{ok,status}=await fetchJson(`${proxyBase}/__bili/plugin/runtime-info`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(info)},STATUS_TIMEOUT_MS);if(!ok)throw new Error(`runtime-info report failed (${status})`)}import{createHash as createHash14,randomUUID as randomUUID6}from"crypto";import fs15 from"fs";import net3 from"net";import os9 from"os";import path27 from"path";import{createRequire as createRequire3}from"module";import{Worker as Worker3}from"worker_threads";import{pathToFileURL as pathToFileURL2}from"url";import{execFileSync as execFileSync5,spawn as spawn2,spawnSync as spawnSync3}from"child_process";import tls4 from"tls";var import_node_forge=__toESM(require_lib(),1);init_paths();init_logger();import crypto from"crypto";import{execFileSync as execFileSync3}from"child_process";import fs3 from"fs";import os3 from"os";import path9 from"path";import tls3 from"tls";var COMBINED_MAX_AGE_MS=24*60*60*1e3;var PLATFORM_CA_CANDIDATES=process.platform==="darwin"?["/etc/ssl/cert.pem","/private/etc/ssl/cert.pem"]:process.platform==="win32"?[]:["/etc/ssl/certs/ca-certificates.crt","/etc/pki/tls/certs/ca-bundle.crt","/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem","/etc/ssl/ca-bundle.pem","/etc/ssl/cert.pem"];init_upstream_proxy();init_client_config();init_vertex();import fs5 from"fs";import os5 from"os";import path11 from"path";init_util();init_log_mask();init_knobs();init_mitm_domains();init_private_host();init_upstream_fail();init_instance();var TWIN_ADOPT_EXIT_CODE=3;import net2 from"net";var CONNECT_PROBE_TIMEOUT_MS=2e3;function originHostPort(origin){try{const u2=new URL(origin);if(u2.protocol!=="http:"&&u2.protocol!=="https:")return void 0;const host=u2.hostname.replace(/^\[|\]$/g,"");if(host==="")return void 0;const port=u2.port!==""?Number(u2.port):u2.protocol==="https:"?443:80;return Number.isInteger(port)&&port>0?{host,port}:void 0}catch{return void 0}}function attemptConnect(host,port,timeoutMs){return new Promise(resolve=>{let settled=false;const settle=outcome=>{if(settled)return;settled=true;socket.destroy();resolve(outcome)};const socket=net2.connect({host,port});socket.setTimeout(timeoutMs);socket.once("connect",()=>settle({ok:true}));socket.once("timeout",()=>settle({ok:false,detail:`connect timeout after ${timeoutMs}ms`}));socket.once("error",err=>settle({ok:false,detail:typeof err.code==="string"&&err.code.length>0?err.code:String(err.message??err)}))})}async function tcpConnectable(origin,timeoutMs=CONNECT_PROBE_TIMEOUT_MS){const hp=originHostPort(origin);if(hp===void 0)return false;const outcome=await attemptConnect(hp.host,hp.port,timeoutMs);return outcome.ok}init_main();init_client_config();init_vertex();init_config();init_instance();init_dsh_channel();init_pi_channel();init_update();import fs13 from"fs";import path20 from"path";import os8 from"os";import crypto4 from"crypto";import{execFileSync as execFileSync4,spawnSync as spawnSync2}from"child_process";import{fileURLToPath as fileURLToPath5}from"url";import fs10 from"fs";import path17 from"path";init_client_config();init_instance();var KIMI_PROVIDER="bili";var KIMI_ALIAS="bili-kimi";var KIMI_MANAGED_BEGIN="# bili begin (managed by billion-context \u2014 `bili plugin install kimi`)";var KIMI_MANAGED_END="# bili end";var KIMI_PREV_MODEL_KEY="# bili prev-default-model";var KIMI_DEFAULT_UPSTREAM="https://api.kimi.com/coding/v1";var KIMI_CODE_PROVIDER="managed:kimi-code";function openDoc(text){const eol=text.includes("\r\n")?"\r\n":"\n";return{lines:text.split(/\r?\n/),eol}}function closeDoc(doc){while(doc.lines.length>1&&doc.lines[doc.lines.length-1].trim()==="")doc.lines.pop();return doc.lines.join(doc.eol)+doc.eol}function tomlPathParts(header){const parts=[];let cur="";let dq=false;let sq=false;for(const ch of header){if(ch==='"'&&!sq)dq=!dq;else if(ch==="'"&&!dq)sq=!sq;else if(ch==="."&&!dq&&!sq){parts.push(cur);cur=""}else cur+=ch}parts.push(cur);return parts.map(p2=>p2.trim())}function headerParts(line){const m2=/^\[\[?(.+?)\]\]?\s*(?:#.*)?$/.exec(line.trim());if(!m2)return void 0;return tomlPathParts(m2[1])}function keyValue(line){const l=line.trim();if(!l||l.startsWith("#")||l.startsWith("["))return void 0;const strMatch=/^([A-Za-z0-9_.-]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/.exec(l);if(strMatch)return{key:strMatch[1],strVal:strMatch[2]!==void 0?strMatch[2]:strMatch[3]};const numMatch=/^([A-Za-z0-9_.-]+)\s*=\s*([0-9]+)\b/.exec(l);if(numMatch)return{key:numMatch[1],numVal:Number(numMatch[2])};const tblMatch=/^([A-Za-z0-9_.-]+)\s*=\s*[{[]/.exec(l);if(tblMatch)return{key:tblMatch[1]};return void 0}var KIMI_MODEL_PASSTHROUGH_KEYS=["capabilities","support_efforts","default_effort"];function bracketDepth(line){let depth=0;let dq=false;let sq=false;for(let i=0;i<line.length;i++){const ch=line[i];if(dq){if(ch==='"'&&line[i-1]!=="\\")dq=false;continue}if(sq){if(ch==="'")sq=false;continue}if(ch==="#")break;if(ch==='"')dq=true;else if(ch==="'")sq=true;else if(ch==="["||ch==="{")depth+=1;else if(ch==="]"||ch==="}")depth-=1}return depth}function stripKimiManagedBlock(text){const doc=openDoc(text);let start=-1;let end=-1;for(let i=0;i<doc.lines.length;i++){const t=doc.lines[i].trim();if(t===KIMI_MANAGED_BEGIN)start=i;else if(t===KIMI_MANAGED_END){if(start>=0){end=i;break}throw new Error('config.toml contains a stray "# bili end" marker outside a managed block \u2014 fix it manually or run `bili plugin remove kimi`')}}if(start>=0&&end<0)throw new Error('config.toml managed block is truncated (missing "# bili end") \u2014 fix it manually or run `bili plugin remove kimi`');if(start<0)return{text,hadBlock:false};const cutFrom=start>0&&doc.lines[start-1].trim()===""?start-1:start;doc.lines.splice(cutFrom,end-cutFrom+1);return{text:closeDoc(doc),hadBlock:true}}function kimiProxiedBaseUrl(port,upstream){return`http://127.0.0.1:${port}/bili/${upstream.replace(/\/+$/,"")}`}function extractBiliUpstream(baseUrl){const m2=/^https?:\/\/[^/]+\/bili\/(https?:\/\/.+)$/.exec(baseUrl);return m2?.[1]?.replace(/\/+$/,"")}function renderKimiManagedBlock(state2,prevDefaultModel){const out=[];out.push(KIMI_MANAGED_BEGIN);out.push(`# Routes ${KIMI_ALIAS} through the local bili proxy. Managed by `);out.push("# billion-context \u2014 edits here are overwritten; uninstall restores your config.");out.push(`[providers.${KIMI_PROVIDER}]`);out.push('type = "kimi"');out.push(`base_url = "${kimiProxiedBaseUrl(state2.port,state2.upstream)}"`);for(const line of state2.authLines)out.push(line);out.push("");out.push(`[models.${KIMI_ALIAS}]`);out.push(`provider = "${KIMI_PROVIDER}"`);out.push(`model = "${state2.modelId}"`);if(state2.contextWindow!==void 0)out.push(`max_context_size = ${state2.contextWindow}`);if(state2.maxOutput!==void 0)out.push(`max_output_size = ${state2.maxOutput}`);for(const line of state2.extraLines??[])out.push(line);out.push("");out.push(`${KIMI_PREV_MODEL_KEY} = ${prevDefaultModel===""?"ABSENT":JSON.stringify(prevDefaultModel)}`);out.push(KIMI_MANAGED_END);return out.join("\n")}function firstTableHeaderIndex(lines){for(let i=0;i<lines.length;i++)if(headerParts(lines[i]))return i;return lines.length}function topLevelDefaultModel(lines,headerAt){for(let i=0;i<headerAt;i++){const kv=keyValue(lines[i]);if(kv?.key==="default_model"&&kv.strVal!==void 0)return{index:i,value:kv.strVal}}return void 0}function readCarriedDefaultModel(text){for(const line of text.split(/\r?\n/)){const m2=new RegExp(`^\\s*${KIMI_PREV_MODEL_KEY}\\s*=\\s*(.+?)\\s*$`).exec(line.trim());if(m2)return m2[1]==="ABSENT"?"":m2[1].replace(/^["']|["']$/g,"")}return void 0}function applyKimiManagedConfig(text,state2){const stripped=stripKimiManagedBlock(text);const doc=openDoc(stripped.text);for(const line of doc.lines){const parts=headerParts(line);if(parts&&(parts[0]==="providers"&&parts[1]===KIMI_PROVIDER||parts[0]==="models"&&parts[1]===KIMI_ALIAS)){throw new Error(`config.toml already defines [${parts.slice(0,2).join(".")}] outside the bili managed block \u2014 rename it, or run \`bili plugin remove kimi\` first`)}}const headerAt=firstTableHeaderIndex(doc.lines);const existing=topLevelDefaultModel(doc.lines,headerAt);let prevDefaultModel=existing?.value??"";if(stripped.hadBlock){const carried=readCarriedDefaultModel(text);if(carried!==void 0)prevDefaultModel=carried;if(existing&&existing.value!==KIMI_ALIAS){if(doc.lines[doc.lines.length-1].trim()!=="")doc.lines.push("");for(const line of renderKimiManagedBlock(state2,prevDefaultModel).split("\n"))doc.lines.push(line);return closeDoc(doc)}}if(existing)doc.lines[existing.index]=`default_model = "${KIMI_ALIAS}"`;else doc.lines.splice(0,0,`default_model = "${KIMI_ALIAS}"`);if(doc.lines[doc.lines.length-1].trim()!=="")doc.lines.push("");for(const line of renderKimiManagedBlock(state2,prevDefaultModel).split("\n"))doc.lines.push(line);return closeDoc(doc)}function unrouteKimiConfig(text){const doc=openDoc(text);let start=-1;let end=-1;for(let i=0;i<doc.lines.length;i++){const t=doc.lines[i].trim();if(t===KIMI_MANAGED_BEGIN)start=i;else if(t===KIMI_MANAGED_END){if(start>=0){end=i;break}}}if(start<0||end<0)return text;let prev;for(let i=start;i<=end;i++){const m2=new RegExp(`^\\s*${KIMI_PREV_MODEL_KEY}\\s*=\\s*(.+?)\\s*$`).exec(doc.lines[i]);if(m2){prev=m2[1]==="ABSENT"?"":m2[1].replace(/^["']|["']$/g,"");break}}const cutFrom=start>0&&doc.lines[start-1].trim()===""?start-1:start;doc.lines.splice(cutFrom,end-cutFrom+1);const headerAt=firstTableHeaderIndex(doc.lines);const existing=topLevelDefaultModel(doc.lines,headerAt);if(prev===void 0)return closeDoc(doc);if(existing&&existing.value!==KIMI_ALIAS)return closeDoc(doc);if(prev===""){if(existing)doc.lines.splice(existing.index,1);return closeDoc(doc)}if(existing)doc.lines[existing.index]=`default_model = "${prev}"`;else doc.lines.splice(0,0,`default_model = "${prev}"`);return closeDoc(doc)}function scanText(text){const providers=new Map;const models=new Map;let defaultModel;let parts=[];const allLines=text.split(/\r?\n/);for(let li2=0;li2<allLines.length;li2++){const rawLine=allLines[li2];const h=headerParts(rawLine);if(h){parts=h;continue}const kv=keyValue(rawLine);if(!kv)continue;if(parts.length===0){if(kv.key==="default_model"&&kv.strVal!==void 0)defaultModel=kv.strVal;continue}if(parts[0]==="providers"&&parts[1]){const prov=providers.get(parts[1])??{oauthLines:[]};if(parts.length===2){if(kv.key==="base_url"&&kv.strVal!==void 0)prov.baseUrl=kv.strVal;else if(kv.key==="api_key"&&kv.strVal!==void 0&&kv.strVal!=="")prov.apiKeyLine=rawLine.trim();else if(kv.key==="api_key_env"&&kv.strVal!==void 0)prov.apiKeyEnvLine=rawLine.trim()}else if(parts.length===3&&parts[2]==="env"&&kv.strVal!==void 0&&/_BASE_URL$/.test(kv.key)){prov.envBaseUrl=kv.strVal}else if(parts.length===3&&parts[2]==="oauth"){prov.oauthLines.push(rawLine.trim())}providers.set(parts[1],prov)}else if(parts[0]==="models"&&parts[1]){const st2=models.get(parts[1])??{};if(parts.length===2){if(KIMI_MODEL_PASSTHROUGH_KEYS.includes(kv.key)){const collected=[rawLine.trim()];let depth=bracketDepth(rawLine);let j2=li2+1;while(depth>0&&j2<allLines.length){const next=allLines[j2];if(headerParts(next))break;collected.push(next.trim());depth+=bracketDepth(next);j2+=1}if(depth<=0)st2.extraLines=[...st2.extraLines??[],...collected];li2=j2-1}else if(kv.key==="model"&&kv.strVal!==void 0)st2.modelId=kv.strVal;else if(kv.key==="provider"&&kv.strVal!==void 0)st2.provider=kv.strVal;else if(kv.key==="max_context_size"&&kv.numVal!==void 0)st2.window=kv.numVal;else if(kv.key==="max_output_size"&&kv.numVal!==void 0)st2.maxOutput=kv.numVal;else if(kv.key==="base_url"&&kv.strVal!==void 0)st2.baseUrl=kv.strVal}models.set(parts[1],st2)}}return{defaultModel,providers,models}}function scanKimiModelWindows(text){const out={};for(const[name,st2]of scanText(text).models){if(st2.window!==void 0)out[st2.modelId??name]=st2.window}return out}function authLinesFor(prov){if(!prov)return void 0;if(prov.oauthLines.length>0)return[`api_key = ""`,`[providers.${KIMI_PROVIDER}.oauth]`,...prov.oauthLines];if(prov.apiKeyLine)return[prov.apiKeyLine];if(prov.apiKeyEnvLine)return[prov.apiKeyEnvLine];return void 0}function resolveKimiRoute(text,env){const scan=scanText(text);const alias=scan.defaultModel;if(!alias)return{ok:false,reason:"no default_model set in config.toml"};const envOverride=env.KIMI_CODE_BASE_URL?.trim().replace(/\/+$/,"");if(alias===KIMI_ALIAS){const selfProv=scan.providers.get(KIMI_PROVIDER);const selfModel=scan.models.get(KIMI_ALIAS);const upstream2=selfProv?.baseUrl?extractBiliUpstream(selfProv.baseUrl):void 0;const auth2=authLinesFor(selfProv);if(!auth2)return{ok:false,reason:"managed block lost its credentials \u2014 run `bili plugin remove kimi` and reinstall"};if(!upstream2)return{ok:false,reason:"managed block base_url no longer embeds a bili route \u2014 run `bili plugin remove kimi` and reinstall"};return{ok:true,upstream:upstream2,modelId:selfModel?.modelId??alias,alias,contextWindow:selfModel?.window,maxOutput:selfModel?.maxOutput,authLines:auth2,authSource:KIMI_PROVIDER,extraLines:selfModel?.extraLines}}const modelSection=scan.models.get(alias);const providerName=modelSection?.provider??KIMI_CODE_PROVIDER;const prov=scan.providers.get(providerName);const upstream=envOverride??prov?.baseUrl?.replace(/\/+$/,"")??prov?.envBaseUrl?.replace(/\/+$/,"")??modelSection?.baseUrl?.replace(/\/+$/,"")??KIMI_DEFAULT_UPSTREAM;const auth=authLinesFor(prov);if(!auth){return{ok:false,reason:prov===void 0?`provider "${providerName}" is not defined in config.toml \u2014 log in to kimi first ('kimi login')`:`provider "${providerName}" has no api_key / api_key_env / oauth`}}return{ok:true,upstream,modelId:modelSection?.modelId??alias,alias,contextWindow:modelSection?.window,maxOutput:modelSection?.maxOutput,authLines:auth,authSource:providerName,extraLines:modelSection?.extraLines}}function stampKimiPluginHeader(text){const doc=openDoc(text);let start=-1;for(let i=0;i<doc.lines.length;i++)if(doc.lines[i].trim()===KIMI_MANAGED_BEGIN){start=i;break}if(start<0)return text;let sectionAt=-1;for(let i=start+1;i<doc.lines.length;i++){const t=doc.lines[i].trim();if(t===KIMI_MANAGED_END)break;const parts=headerParts(doc.lines[i]);if(parts&&parts[0]==="providers"&&parts[1]===KIMI_PROVIDER){sectionAt=i;break}}if(sectionAt<0)return text;const line='custom_headers = { x-bili-plugin = "kimi" }';for(let i=sectionAt+1;i<doc.lines.length;i++){const kv=keyValue(doc.lines[i]);if(kv===void 0&&headerParts(doc.lines[i])!==void 0)break;if(kv?.key==="custom_headers"){doc.lines[i]=line;return closeDoc(doc)}}doc.lines.splice(sectionAt+1,0,line);return closeDoc(doc)}function planNativeKimi(env=process.env){if(env.BILLION_CONTEXT_PLUGIN==="0"||env.BILI_NATIVE_KIMI==="0")return{mode:"off"};if(env.BILI_PROVIDER_REWRITES!==void 0)return{mode:"off"};const attach=nativeAttachOrigin(env)??proxyEnvOrigin(env);if(attach!==void 0)return{mode:"attach",attachOrigin:attach};return{mode:"spawn"}}async function probeProxyHealth(origin,timeoutMs=2e3){try{const res=await fetch(`${origin}/__bili/plugin/status?conversationId=kimi&fallback=latest`,{signal:AbortSignal.timeout(timeoutMs)});if(res.status>=500)return false;const text=await res.text();return text.startsWith("{")&&text.includes('"ok"')}catch{return false}}async function waitForProxyHealthy(origin,deadlineMs=15e3,intervalMs=250){const deadline=Date.now()+deadlineMs;for(;;){if(await probeProxyHealth(origin))return true;if(Date.now()+intervalMs>deadline)return false;await new Promise(r=>setTimeout(r,intervalMs))}}var CONFIG_LOCK_DIR=".bili-config.lock";var CONFIG_LOCK_TIMEOUT_MS=5e3;var CONFIG_LOCK_STALE_MS=3e4;function lockStale(lockDir){try{const pidRaw=fs10.readFileSync(path17.join(lockDir,"pid"),"utf8").trim();const age=Date.now()-fs10.statSync(lockDir).mtimeMs;if(age>CONFIG_LOCK_STALE_MS)return true;const pid=Number.parseInt(pidRaw,10);return Number.isInteger(pid)&&pid>0&&!isPidAlive(pid)}catch{return true}}async function withConfigLock(kimiHome,fn){const lockDir=path17.join(kimiHome,CONFIG_LOCK_DIR);const deadline=Date.now()+CONFIG_LOCK_TIMEOUT_MS;for(;;){try{fs10.mkdirSync(lockDir);fs10.writeFileSync(path17.join(lockDir,"pid"),String(process.pid));break}catch(err){if(err.code!=="EEXIST")throw err;if(lockStale(lockDir)){fs10.rmSync(lockDir,{recursive:true,force:true});continue}if(Date.now()>deadline)throw new Error("timed out waiting for the kimi config.toml lock");await new Promise(r=>setTimeout(r,100))}}try{return fn()}finally{fs10.rmSync(lockDir,{recursive:true,force:true})}}async function routeKimiConfig(opts){const env=opts.env??process.env;const log2=opts.log??defaultLog;const home=opts.kimiHome??resolveKimiHome(env);const cfgPath=path17.join(home,"config.toml");let text;try{text=fs10.readFileSync(cfgPath,"utf8")}catch{log2(`no ${cfgPath} \u2014 nothing to route`);return void 0}let res=resolveKimiRoute(text,env);if(!res.ok){log2(`skipping config rewrite: ${res.reason}`);return void 0}const port=Number.parseInt(new URL(opts.origin).port,10);if(!Number.isInteger(port)||port<=0)throw new Error(`cannot derive a port from proxy origin ${opts.origin}`);const state2={port,upstream:res.upstream,modelId:res.modelId,contextWindow:res.contextWindow,maxOutput:res.maxOutput,authLines:res.authLines,extraLines:res.extraLines};const authSource=res.authSource;const bakPath=path17.join(home,"config.toml.bili-bak");await withConfigLock(home,()=>{const current=fs10.readFileSync(cfgPath,"utf8");if(!fs10.existsSync(bakPath))fs10.writeFileSync(bakPath,current);fs10.writeFileSync(cfgPath,applyKimiManagedConfig(current,state2))});const check=resolveKimiRoute(fs10.readFileSync(cfgPath,"utf8"),env);if(!check.ok||check.upstream!==res.upstream)throw new Error(`kimi config rewrite verification failed: ${check.ok?"upstream mismatch":check.reason}`);return{origin:opts.origin,port,upstream:res.upstream,modelId:res.modelId,contextWindow:res.contextWindow,maxOutput:res.maxOutput,authSource}}async function activateKimiPluginMode(applied,opts={}){const env=opts.env??process.env;const log2=opts.log??defaultLog;const home=opts.kimiHome??resolveKimiHome(env);const cfgPath=path17.join(home,"config.toml");await withConfigLock(home,()=>{fs10.writeFileSync(cfgPath,stampKimiPluginHeader(fs10.readFileSync(cfgPath,"utf8")))});const info={agent:"kimi",model:applied.modelId,baseURL:applied.upstream,source:"native-bootstrap"};if(applied.contextWindow!==void 0)info.contextWindow=applied.contextWindow;if(applied.maxOutput!==void 0)info.maxOutput=applied.maxOutput;try{await reportRuntimeInfo(applied.origin,info)}catch(err){log2(`runtime-info report failed (non-fatal): ${err instanceof Error?err.message:String(err)}`)}}function unrouteKimi(opts){const env=opts.env??process.env;const log2=opts.log??defaultLog;const home=opts.kimiHome??resolveKimiHome(env);const cfgPath=path17.join(home,"config.toml");const bakPath=path17.join(home,"config.toml.bili-bak");try{let text;try{text=fs10.readFileSync(cfgPath,"utf8")}catch{return}if(text.includes("# bili begin")){fs10.writeFileSync(cfgPath,unrouteKimiConfig(text));log2("reverted config.toml to pre-native routing")}try{fs10.rmSync(bakPath,{force:true})}catch{}}catch(err){log2(`unroute failed: ${err instanceof Error?err.message:String(err)}`)}}function defaultLog(msg){process.stderr.write(`[bili-kimi] ${msg}
132
132
  `)}async function bootstrapKimiNative(opts={}){const env=opts.env??process.env;const log2=opts.log??defaultLog;const plan=planNativeKimi(env);if(plan.mode==="off")return{mode:"off"};let origin;let attached;if(plan.mode==="attach"){origin=plan.attachOrigin;attached=true;if(!await waitForProxyHealthy(origin,opts.healthDeadlineMs)){throw new Error(`attach target ${origin} is not healthy \u2014 start your bili proxy first`)}}else{const ensure=opts.ensureProxy??defaultEnsureProxy;const handle=await ensure();origin=handle.origin;attached=!!handle.attached}const routed=await routeKimiConfig({origin,env,kimiHome:opts.kimiHome,log:log2});if(routed)log2(`routed ${routed.modelId} via ${origin} \u2192 ${routed.upstream}`);return{mode:"active",attached,routed}}function kimiConfigModelWindows(env=process.env){try{const scanned=scanKimiModelWindows(fs10.readFileSync(path17.join(resolveKimiHome(env),"config.toml"),"utf8"));if(Object.keys(scanned).length>0)return scanned}catch{}return void 0}async function defaultEnsureProxy(){const modelWindows=kimiConfigModelWindows();const handle=await ensureProxyRunning({host:LAUNCHER_DEFAULT_HOST,port:0,passthrough:false,debug:false,lane:"kimi",...modelWindows?{modelWindows}:{}},{scriptPath:nativeProxyScriptPath()});return{origin:handle.origin,attached:!!handle.attached}}init_client_config();import fs11 from"fs";import path18 from"path";import crypto3 from"crypto";import fs12 from"fs";import path19 from"path";init_instance();init_config();init_log_mask();init_logger();init_paths();init_version();import{appendFileSync,mkdirSync as mkdirSync3}from"fs";import path21 from"path";function logHostEvent(level,origin,msg){try{const file=defaultLogFile();mkdirSync3(path21.dirname(file),{recursive:true});const safe=maskUrlsForDiagnostics(maskIpsInText(redactSecretsInText(msg)));appendFileSync(file,`${logTimestamp()} [${level}] [v=${VERSION}] ${origin?`${origin} `:""}${safe}
133
- `)}catch{}}init_logger();init_version();import http from"http";var PERMISSION_DENIED_SIGNATURE=/\b(?:EPERM|EACCES|EROFS|EBUSY)\b|operation not permitted|permission denied|read-only file system|readonly database/i;var BILI_DATA_PATH_SIGNATURE=/billion-context|combined-ca\.pem|index\.db|\.local[\\/](?:share|state)[\\/]/i;function classifyStartupFailure(sample){if(!PERMISSION_DENIED_SIGNATURE.test(sample)||!BILI_DATA_PATH_SIGNATURE.test(sample))return"";return"possible cause: the proxy could not write its own data files (EPERM/EACCES/read-only on the bili data dir) \u2014 most often antivirus (e.g. Windows Defender Controlled Folder Access) blocking the node runtime, a read-only flag or ACL on the directory, or another process holding the files; add the bili data dir and the node runtime to AV exclusions (see #367) or fix the directory permissions, then retry"}var MAX_HOLD_MS=10*6e4;init_update();init_win_cmd();init_client_config();init_config();init_registry();init_config();init_logger();function parseLauncherModelWindows(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_WINDOWS=parseLauncherModelWindows(process.env.BILI_LAUNCHER_MODEL_WINDOWS);function parseLauncherModelMaxOutputs(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_MAX_OUTPUTS=parseLauncherModelMaxOutputs(process.env.BILI_LAUNCHER_MODEL_MAX_OUTPUTS);init_vertex();init_client_config();init_logger();import{createHash as createHash13}from"crypto";import{createHash as createHash12,randomUUID as randomUUID4}from"crypto";import{closeSync,existsSync as existsSync6,fsyncSync,mkdirSync as mkdirSync6,openSync,readdirSync,readFileSync as readFileSync7,renameSync as renameSync2,rmSync,statSync as statSync6,writeFileSync as writeFileSync5}from"fs";import{readdir as readdir2,readFile as readFile4,rm as rm2}from"fs/promises";import*as path24 from"path";init_paths();init_knobs();init_logger();init_runtime_status();init_version();import{createCipheriv,createDecipheriv,randomBytes as randomBytes2}from"crypto";import*as zlib from"zlib";var ENCRYPT_MAGIC=Buffer.from("BILIENC1","utf8");var ZSTD_MAGIC=Buffer.from("BILIZSTD1","utf8");var NONCE_LEN=12;var TAG_LEN=16;var ENCRYPT_HEADER_LEN=ENCRYPT_MAGIC.length+2+NONCE_LEN;var MIN_ENCRYPTED_LEN=ENCRYPT_HEADER_LEN+TAG_LEN;var PLAIN_HEADER_LEN=ZSTD_MAGIC.length+2;init_logger();init_billing();init_state_hydration();init_shadow();init_backend();init_ingest();init_store();init_logger();init_paths();import{randomUUID as randomUUID2}from"crypto";import{mkdirSync as mkdirSync5,writeFileSync as writeFileSync4}from"fs";import{dirname as dirname3,join as join2}from"path";init_knobs();import{createHash as createHash11,randomUUID as randomUUID3}from"crypto";import{AsyncLocalStorage as AsyncLocalStorage3}from"async_hooks";init_logger();import{createHash as createHash10}from"crypto";import{createHash as createHash9}from"crypto";init_logger();init_logger();init_billing();init_util();var BOOT_ID=randomUUID3();var SEAM_BODY_CAP=512*1024;var BODY_FULL_CAP=8*1024*1024;var captures=new AsyncLocalStorage3;var LEARNED_IMAGE_COST_TTL_MS=24*60*60*1e3;var{join:join4}=path24;init_version();init_knobs();init_config();init_config();init_paths();init_logger();init_external_summary_settings();import*as path25 from"path";init_turn_separator();init_turn_separator();var ABORT_REANCHOR_MAX_AGE_MS=30*60*1e3;var MAX_SESSIONS=maxSessions();var MAX_RESIDENT_BYTES=sessionResidentMaxBytes();var SPLIT_CANARY_FRESH_MS=10*60*1e3;import{randomUUID as randomUUID5}from"crypto";init_knobs();init_client_config();import fs14 from"fs";import path26 from"path";init_dsh_channel();var SCAN_CACHE_TTL_MS=5*60*1e3;var CONFLICT_ACTIVE_WINDOW_MS=7*24*60*60*1e3;var LAUNCHER_DEFAULT_HOST="127.0.0.1";var HEALTH_PATH="/__bili/health";var HEALTH_POLL_INTERVAL_MS=200;var SPAWN_WAIT_MS=envMillis(process.env,"BILI_SPAWN_WAIT_MS",2e4);var SLOW_START_GRACE_MS=envMillis(process.env,"BILI_SLOW_START_GRACE_MS",4e4);var SPAWN_BUDGET_MS=SPAWN_WAIT_MS+SLOW_START_GRACE_MS;var PROBE_TIMEOUT_MS=1500;var STARTING_MARKER_TTL_MS=SPAWN_BUDGET_MS+3e4;var POST_EXIT_REDISCOVERY_MS=3e3;var DEFAULT_MITM_DOMAIN_SET=new Set(DEFAULT_MITM_DOMAINS.map(d=>d.toLowerCase()));function proxyOrigin(host,port){return`http://${host}:${port}`}function healthUrl(origin){return origin+HEALTH_PATH}async function defaultFetch(url){const ctrl=new AbortController;const t=setTimeout(()=>ctrl.abort(),PROBE_TIMEOUT_MS);try{const res=await fetch(url,{signal:ctrl.signal});return{ok:res.ok}}catch{return{ok:false}}finally{clearTimeout(t)}}async function probeHealth(origin,fetchImpl){try{const{ok}=await fetchImpl(healthUrl(origin));return ok}catch{return false}}function describeProbeFailure(err){const e=err;const code=e?.cause?.code??e?.code;if(typeof code==="string"&&code.length>0)return code;if(e?.name==="TimeoutError"||e?.name==="AbortError")return`timeout after ${PROBE_TIMEOUT_MS}ms`;if(typeof e?.message==="string"&&e.message.length>0)return e.message.slice(0,160);return String(err)}async function defaultFetchDetail(url){const ctrl=new AbortController;const t=setTimeout(()=>ctrl.abort(),PROBE_TIMEOUT_MS);try{const res=await fetch(url,{signal:ctrl.signal});return res.ok?{ok:true}:{ok:false,detail:`HTTP ${res.status}`}}catch(err){return{ok:false,detail:describeProbeFailure(err)}}finally{clearTimeout(t)}}async function fetchHealthInfoDefault(origin,opts){try{const res=await fetch(healthUrl(origin),{signal:AbortSignal.timeout(PROBE_TIMEOUT_MS),...opts?.noKeepAlive?{headers:{connection:"close"}}:{}});if(!res.ok)return void 0;const data=await res.json();const info={ok:Boolean(data.ok),instanceId:typeof data.instanceId==="string"?data.instanceId:void 0};if(typeof data.version==="string")info.version=data.version;if(typeof data.pid==="number")info.pid=data.pid;if(typeof data.auxProxy==="string"&&data.auxProxy.length>0)info.auxProxy=data.auxProxy;if(typeof data.auxProxySource==="string"&&data.auxProxySource.length>0)info.auxProxySource=data.auxProxySource;if(data.watchdog&&typeof data.watchdog==="object"&&typeof data.watchdog.armed==="boolean"){const wd=data.watchdog;const watchers=Array.isArray(wd.watchers)?wd.watchers.filter(w2=>typeof w2==="number"):void 0;info.watchdog={armed:wd.armed,watchers}}return info}catch{return void 0}}async function registerWatcherDefault(origin,pid){try{const res=await fetch(`${origin}/__bili/watcher`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({pid}),signal:AbortSignal.timeout(2e3)});if(!res.ok){if(res.status===409)return"refused";console.error(`bili: watcher registration returned HTTP ${res.status} \u2014 the shared proxy may exit when its first owner does`);return"failed"}return"ok"}catch(err){console.error(`bili: watcher registration failed \u2014 the shared proxy may exit when its first owner does (${err instanceof Error?err.message:String(err)})`);return"failed"}}function isStartingMarkerActive(marker,nowMs){return isPidAlive(marker.pid)&&nowMs-marker.startedAt<STARTING_MARKER_TTL_MS}function recordedModelMap(passed,ambientRaw,parse3){return parse3(passed&&Object.keys(passed).length>0?JSON.stringify(passed):ambientRaw)}function instanceShapeMismatch(inst,opts,foreignLanes=[]){if(opts.lane!==void 0&&inst.lane!==void 0&&inst.lane!==opts.lane&&!foreignLanes.includes(inst.lane))return"lane-mismatch";if(inst.host!==opts.host||inst.passthrough!==resolveRecordedPassthrough(opts.passthrough))return"host-or-passthrough-mismatch";const wantDomains=resolveRecordedMitmDomains(opts.mitmDomains);if(inst.mitmDomains.length!==wantDomains.length||inst.mitmDomains.some((d,i)=>d!==wantDomains[i]))return"mitm-domains-mismatch";const wantWindows=recordedModelMap(opts.modelWindows,process.env.BILI_LAUNCHER_MODEL_WINDOWS,parseLauncherModelWindows);if(Object.keys(inst.modelWindows).length!==Object.keys(wantWindows).length)return"model-windows-mismatch";if(!Object.keys(wantWindows).every(k2=>inst.modelWindows[k2]===wantWindows[k2]))return"model-windows-mismatch";const wantMax=recordedModelMap(opts.modelMaxOutputs,process.env.BILI_LAUNCHER_MODEL_MAX_OUTPUTS,parseLauncherModelMaxOutputs);if(Object.keys(inst.modelMaxOutputs??{}).length!==Object.keys(wantMax).length)return"model-max-outputs-mismatch";return Object.keys(wantMax).every(k2=>(inst.modelMaxOutputs??{})[k2]===wantMax[k2])?void 0:"model-max-outputs-mismatch"}function isNewerSameLaneHolder(inst,optsLane,healthVersion,ownVersion,userZone){if(userZone||optsLane===void 0||healthVersion===void 0)return false;return inst.lane===optsLane&&isVersionNewer(healthVersion,ownVersion)}function instanceCompatible(inst,opts,codeFingerprint,foreignLanes=[]){if(inst.codeFingerprint===void 0||inst.codeFingerprint!==codeFingerprint)return"code-fingerprint-mismatch";return instanceShapeMismatch(inst,opts,foreignLanes)}async function probeLiveInstances(readInstance,fetchHealthInfo,diag,isConnectable=tcpConnectable){const seen=new Map;const inst=readInstance();if(isProxyInstanceFile(inst))seen.set(inst.instanceId||inst.origin,inst);for(const live of discoverLiveInstances())seen.set(live.instanceId||live.origin,live);const checked=await Promise.all([...seen.values()].map(async c=>{if(!isPidAlive(c.pid)){diag?.(`native-attach: drop ${c.origin} (pid ${c.pid}): owner process gone`);return void 0}const health=await fetchHealthInfo(c.origin);if(!health||!health.ok){if(health===void 0&&await isConnectable(c.origin)){diag?.(`native-attach: keep ${c.origin} (pid ${c.pid}): health probe failed but TCP connect succeeded \u2014 instance is BUSY (event loop saturated), not dead (#3654/#4811)`);return{inst:c,health:void 0}}diag?.(health===void 0?`native-attach: drop ${c.origin} (pid ${c.pid}): health probe failed`:`native-attach: drop ${c.origin} (pid ${c.pid}): health probe answered but reports not-ok`);return void 0}if(health.instanceId!==void 0&&health.instanceId!==c.instanceId){diag?.(`native-attach: drop ${c.origin} (pid ${c.pid}): instance id mismatch (${c.instanceId} vs ${health.instanceId})`);return void 0}return{inst:c,health}}));return checked.filter(c=>c!==void 0)}function attachGateAllows(health,attachExternal){if(attachExternal)return true;return health?.watchdog?.armed===true}function isUserZoneInstance(inst){return inst.lane===void 0&&inst.launchToken===void 0}function gateRefusalMessage(inst,health){const reason=health.watchdog&&health.watchdog.armed===false?"it reports NO session-lifecycle watchdog (started without BILI_PARENT_PID, e.g. manual `bili start`)":"it does not report watchdog state (older bili build) \u2014 its lifecycle is unverifiable";return`bili: refusing to attach to ${inst.origin} (pid ${inst.pid}) \u2014 ${reason}. It would outlive this session and ignore config edits until killed (#1322/#1335). Starting a session-owned proxy instead; set native.attachExternal=true or BILI_NATIVE_ATTACH_EXTERNAL=1 to attach anyway.`}function attachClass(inst,lane,foreignLanes){if(lane===void 0)return 1;if(inst.lane===lane)return 0;if(inst.lane!==void 0)return 1+foreignLanes.indexOf(inst.lane);return foreignLanes.length+1}function normalizeOrigin(o){return o.trim().replace(/\/+$/,"").toLowerCase()}function pickAttachable(candidates,opts,codeFingerprint,attachExternal,attachPolicy,attachUrl,refusedLog,diag,foreignLanes=[]){let best;let bestClass=Number.MAX_SAFE_INTEGER;let bestStartedAt=Number.NEGATIVE_INFINITY;for(const c of candidates){if(attachUrl&&normalizeOrigin(c.inst.origin)!==normalizeOrigin(attachUrl)){diag?.(`native-attach: skip ${c.inst.origin} (pid ${c.inst.pid}): not the explicit attachUrl target`);continue}let incompatible=instanceCompatible(c.inst,opts,codeFingerprint,foreignLanes);if(incompatible==="code-fingerprint-mismatch"&&c.health?.version!==void 0&&isNewerSameLaneHolder(c.inst,opts.lane,c.health.version,VERSION,isUserZoneInstance(c.inst))){const adoptedShape=instanceShapeMismatch(c.inst,opts,foreignLanes);if(adoptedShape===void 0){diag?.(`native-attach: adopt ${c.inst.origin} (pid ${c.inst.pid}): foreign bytes but self-reported v${c.health.version} is strictly NEWER than this lane's v${VERSION} \u2014 riding the newer build instead of deadlocking behind it (#4125)`);incompatible=void 0}else{diag?.(`native-attach: skip ${c.inst.origin} (pid ${c.inst.pid}): reports v${c.health.version} (newer) but its config shape differs (${adoptedShape}) \u2014 shape guards survive upward adoption (#4125)`);incompatible=adoptedShape}}if(incompatible!==void 0){diag?.(`native-attach: skip ${c.inst.origin} (pid ${c.inst.pid}): incompatible (${incompatible})`);continue}if(opts.strictPort&&c.inst.port!==opts.port){diag?.(`native-attach: skip ${c.inst.origin} (pid ${c.inst.pid}): port mismatch`);continue}const sameLane=opts.lane!==void 0&&c.inst.lane===opts.lane;if(!attachUrl&&!attachExternal&&attachPolicy==="own-lane"&&opts.lane!==void 0&&!sameLane&&c.health?.watchdog?.armed!==true){diag?.(`native-attach: skip ${c.inst.origin} (pid ${c.inst.pid}): not own lane and not an armed shared daemon (attachPolicy=own-lane)`);continue}if(c.health===void 0){if(!sameLane&&!attachExternal&&!isUserZoneInstance(c.inst)){if(!refusedLog.has(c.inst.origin)){refusedLog.add(c.inst.origin);const msg=`bili: refusing to attach to ${c.inst.origin} (pid ${c.inst.pid}) \u2014 health probe silent but TCP alive (BUSY, event loop saturated #3654) and its lifecycle is unverifiable from this lane. Starting a session-owned proxy instead; set native.attachExternal=true or BILI_NATIVE_ATTACH_EXTERNAL=1 to attach anyway.`;console.error(msg);diag?.(msg)}continue}}else if(!attachGateAllows(c.health,attachExternal)&&!isUserZoneInstance(c.inst)){if(!refusedLog.has(c.inst.origin)){refusedLog.add(c.inst.origin);console.error(gateRefusalMessage(c.inst,c.health));diag?.(gateRefusalMessage(c.inst,c.health))}continue}const cls=attachClass(c.inst,opts.lane,foreignLanes);if(cls<bestClass||cls===bestClass&&c.inst.startedAt>bestStartedAt){best=c.inst;bestClass=cls;bestStartedAt=c.inst.startedAt}}return best}async function waitForStarterInstance(readInstance,fetchHealthInfo,now,sleepImpl,opts,codeFingerprint,attachExternal,attachPolicy,attachUrl,refusedLog,diag,foreignLanes=[],isConnectable=tcpConnectable){const deadline=now()+SPAWN_BUDGET_MS;const probe=async()=>pickAttachable(await probeLiveInstances(readInstance,fetchHealthInfo,diag,isConnectable),opts,codeFingerprint,attachExternal,attachPolicy,attachUrl,refusedLog,diag,foreignLanes);let inst;while(now()<deadline){await sleepImpl(HEALTH_POLL_INTERVAL_MS);inst=await probe();if(inst)break;const still=readStartingMarker();if(!still||!isStartingMarkerActive(still,now()))break}return inst??await probe()}function defaultAttachDiag(debug){return msg=>{logHostEvent("info","",msg);if(debug)process.stderr.write(`${logTimestamp()} [info] [v=${VERSION}] ${msg}
133
+ `)}catch{}}init_logger();init_version();import http from"http";var PERMISSION_DENIED_SIGNATURE=/\b(?:EPERM|EACCES|EROFS|EBUSY)\b|operation not permitted|permission denied|read-only file system|readonly database/i;var BILI_DATA_PATH_SIGNATURE=/billion-context|combined-ca\.pem|index\.db|\.local[\\/](?:share|state)[\\/]/i;function classifyStartupFailure(sample){if(!PERMISSION_DENIED_SIGNATURE.test(sample)||!BILI_DATA_PATH_SIGNATURE.test(sample))return"";return"possible cause: the proxy could not write its own data files (EPERM/EACCES/read-only on the bili data dir) \u2014 most often antivirus (e.g. Windows Defender Controlled Folder Access) blocking the node runtime, a read-only flag or ACL on the directory, or another process holding the files; add the bili data dir and the node runtime to AV exclusions (see #367) or fix the directory permissions, then retry"}var MAX_HOLD_MS=10*6e4;init_update();init_win_cmd();init_client_config();init_config();init_registry();init_config();init_logger();function parseLauncherModelWindows(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_WINDOWS=parseLauncherModelWindows(process.env.BILI_LAUNCHER_MODEL_WINDOWS);function parseLauncherModelMaxOutputs(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_MAX_OUTPUTS=parseLauncherModelMaxOutputs(process.env.BILI_LAUNCHER_MODEL_MAX_OUTPUTS);init_vertex();init_client_config();init_logger();import{createHash as createHash13}from"crypto";import{createHash as createHash12,randomUUID as randomUUID4}from"crypto";import{closeSync,existsSync as existsSync6,fsyncSync,mkdirSync as mkdirSync6,openSync,readdirSync,readFileSync as readFileSync7,renameSync as renameSync2,rmSync,statSync as statSync6,writeFileSync as writeFileSync5}from"fs";import{readdir as readdir2,readFile as readFile4,rm as rm2}from"fs/promises";import*as path24 from"path";init_paths();init_knobs();init_logger();init_runtime_status();init_version();import{createCipheriv,createDecipheriv,randomBytes as randomBytes2}from"crypto";import*as zlib from"zlib";var ENCRYPT_MAGIC=Buffer.from("BILIENC1","utf8");var ZSTD_MAGIC=Buffer.from("BILIZSTD1","utf8");var NONCE_LEN=12;var TAG_LEN=16;var ENCRYPT_HEADER_LEN=ENCRYPT_MAGIC.length+2+NONCE_LEN;var MIN_ENCRYPTED_LEN=ENCRYPT_HEADER_LEN+TAG_LEN;var PLAIN_HEADER_LEN=ZSTD_MAGIC.length+2;init_logger();init_billing();init_state_hydration();init_shadow();init_logger();var HOT_ATTACH_WINDOW_MS=10*6e4;var ATTACH_SILENCE_MS=5*6e4;init_backend();init_ingest();init_store();init_logger();init_paths();import{randomUUID as randomUUID2}from"crypto";import{mkdirSync as mkdirSync5,writeFileSync as writeFileSync4}from"fs";import{dirname as dirname3,join as join2}from"path";init_knobs();import{createHash as createHash11,randomUUID as randomUUID3}from"crypto";import{AsyncLocalStorage as AsyncLocalStorage3}from"async_hooks";init_logger();import{createHash as createHash10}from"crypto";import{createHash as createHash9}from"crypto";init_logger();init_logger();init_billing();init_util();var BOOT_ID=randomUUID3();var SEAM_BODY_CAP=512*1024;var BODY_FULL_CAP=8*1024*1024;var captures=new AsyncLocalStorage3;var LEARNED_IMAGE_COST_TTL_MS=24*60*60*1e3;var{join:join4}=path24;var FROZEN_SKIP_NOTICE_COOLDOWN_MS=10*6e4;init_version();init_knobs();init_config();init_config();init_paths();init_logger();init_external_summary_settings();import*as path25 from"path";init_turn_separator();init_turn_separator();var ABORT_REANCHOR_MAX_AGE_MS=30*60*1e3;var MAX_SESSIONS=maxSessions();var MAX_RESIDENT_BYTES=sessionResidentMaxBytes();var SPLIT_CANARY_FRESH_MS=10*60*1e3;import{randomUUID as randomUUID5}from"crypto";init_knobs();init_client_config();import fs14 from"fs";import path26 from"path";init_dsh_channel();var SCAN_CACHE_TTL_MS=5*60*1e3;var CONFLICT_ACTIVE_WINDOW_MS=7*24*60*60*1e3;var LAUNCHER_DEFAULT_HOST="127.0.0.1";var HEALTH_PATH="/__bili/health";var HEALTH_POLL_INTERVAL_MS=200;var SPAWN_WAIT_MS=envMillis(process.env,"BILI_SPAWN_WAIT_MS",2e4);var SLOW_START_GRACE_MS=envMillis(process.env,"BILI_SLOW_START_GRACE_MS",4e4);var SPAWN_BUDGET_MS=SPAWN_WAIT_MS+SLOW_START_GRACE_MS;var PROBE_TIMEOUT_MS=1500;var STARTING_MARKER_TTL_MS=SPAWN_BUDGET_MS+3e4;var POST_EXIT_REDISCOVERY_MS=3e3;var DEFAULT_MITM_DOMAIN_SET=new Set(DEFAULT_MITM_DOMAINS.map(d=>d.toLowerCase()));function proxyOrigin(host,port){return`http://${host}:${port}`}function healthUrl(origin){return origin+HEALTH_PATH}async function defaultFetch(url){const ctrl=new AbortController;const t=setTimeout(()=>ctrl.abort(),PROBE_TIMEOUT_MS);try{const res=await fetch(url,{signal:ctrl.signal});return{ok:res.ok}}catch{return{ok:false}}finally{clearTimeout(t)}}async function probeHealth(origin,fetchImpl){try{const{ok}=await fetchImpl(healthUrl(origin));return ok}catch{return false}}function describeProbeFailure(err){const e=err;const code=e?.cause?.code??e?.code;if(typeof code==="string"&&code.length>0)return code;if(e?.name==="TimeoutError"||e?.name==="AbortError")return`timeout after ${PROBE_TIMEOUT_MS}ms`;if(typeof e?.message==="string"&&e.message.length>0)return e.message.slice(0,160);return String(err)}async function defaultFetchDetail(url){const ctrl=new AbortController;const t=setTimeout(()=>ctrl.abort(),PROBE_TIMEOUT_MS);try{const res=await fetch(url,{signal:ctrl.signal});return res.ok?{ok:true}:{ok:false,detail:`HTTP ${res.status}`}}catch(err){return{ok:false,detail:describeProbeFailure(err)}}finally{clearTimeout(t)}}async function fetchHealthInfoDefault(origin,opts){try{const res=await fetch(healthUrl(origin),{signal:AbortSignal.timeout(PROBE_TIMEOUT_MS),...opts?.noKeepAlive?{headers:{connection:"close"}}:{}});if(!res.ok)return void 0;const data=await res.json();const info={ok:Boolean(data.ok),instanceId:typeof data.instanceId==="string"?data.instanceId:void 0};if(typeof data.version==="string")info.version=data.version;if(typeof data.pid==="number")info.pid=data.pid;if(typeof data.auxProxy==="string"&&data.auxProxy.length>0)info.auxProxy=data.auxProxy;if(typeof data.auxProxySource==="string"&&data.auxProxySource.length>0)info.auxProxySource=data.auxProxySource;if(data.watchdog&&typeof data.watchdog==="object"&&typeof data.watchdog.armed==="boolean"){const wd=data.watchdog;const watchers=Array.isArray(wd.watchers)?wd.watchers.filter(w2=>typeof w2==="number"):void 0;info.watchdog={armed:wd.armed,watchers}}return info}catch{return void 0}}async function registerWatcherDefault(origin,pid){try{const res=await fetch(`${origin}/__bili/watcher`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({pid}),signal:AbortSignal.timeout(2e3)});if(!res.ok){if(res.status===409)return"refused";console.error(`bili: watcher registration returned HTTP ${res.status} \u2014 the shared proxy may exit when its first owner does`);return"failed"}return"ok"}catch(err){console.error(`bili: watcher registration failed \u2014 the shared proxy may exit when its first owner does (${err instanceof Error?err.message:String(err)})`);return"failed"}}function isStartingMarkerActive(marker,nowMs){return isPidAlive(marker.pid)&&nowMs-marker.startedAt<STARTING_MARKER_TTL_MS}function recordedModelMap(passed,ambientRaw,parse3){return parse3(passed&&Object.keys(passed).length>0?JSON.stringify(passed):ambientRaw)}function instanceShapeMismatch(inst,opts,foreignLanes=[]){if(opts.lane!==void 0&&inst.lane!==void 0&&inst.lane!==opts.lane&&!foreignLanes.includes(inst.lane))return"lane-mismatch";if(inst.host!==opts.host||inst.passthrough!==resolveRecordedPassthrough(opts.passthrough))return"host-or-passthrough-mismatch";const wantDomains=resolveRecordedMitmDomains(opts.mitmDomains);if(inst.mitmDomains.length!==wantDomains.length||inst.mitmDomains.some((d,i)=>d!==wantDomains[i]))return"mitm-domains-mismatch";const wantWindows=recordedModelMap(opts.modelWindows,process.env.BILI_LAUNCHER_MODEL_WINDOWS,parseLauncherModelWindows);if(Object.keys(inst.modelWindows).length!==Object.keys(wantWindows).length)return"model-windows-mismatch";if(!Object.keys(wantWindows).every(k2=>inst.modelWindows[k2]===wantWindows[k2]))return"model-windows-mismatch";const wantMax=recordedModelMap(opts.modelMaxOutputs,process.env.BILI_LAUNCHER_MODEL_MAX_OUTPUTS,parseLauncherModelMaxOutputs);if(Object.keys(inst.modelMaxOutputs??{}).length!==Object.keys(wantMax).length)return"model-max-outputs-mismatch";return Object.keys(wantMax).every(k2=>(inst.modelMaxOutputs??{})[k2]===wantMax[k2])?void 0:"model-max-outputs-mismatch"}function isNewerSameLaneHolder(inst,optsLane,healthVersion,ownVersion,userZone){if(userZone||optsLane===void 0||healthVersion===void 0)return false;return inst.lane===optsLane&&isVersionNewer(healthVersion,ownVersion)}function instanceCompatible(inst,opts,codeFingerprint,foreignLanes=[]){if(inst.codeFingerprint===void 0||inst.codeFingerprint!==codeFingerprint)return"code-fingerprint-mismatch";return instanceShapeMismatch(inst,opts,foreignLanes)}async function probeLiveInstances(readInstance,fetchHealthInfo,diag,isConnectable=tcpConnectable){const seen=new Map;const inst=readInstance();if(isProxyInstanceFile(inst))seen.set(inst.instanceId||inst.origin,inst);for(const live of discoverLiveInstances())seen.set(live.instanceId||live.origin,live);const checked=await Promise.all([...seen.values()].map(async c=>{if(!isPidAlive(c.pid)){diag?.(`native-attach: drop ${c.origin} (pid ${c.pid}): owner process gone`);return void 0}const health=await fetchHealthInfo(c.origin);if(!health||!health.ok){if(health===void 0&&await isConnectable(c.origin)){diag?.(`native-attach: keep ${c.origin} (pid ${c.pid}): health probe failed but TCP connect succeeded \u2014 instance is BUSY (event loop saturated), not dead (#3654/#4811)`);return{inst:c,health:void 0}}diag?.(health===void 0?`native-attach: drop ${c.origin} (pid ${c.pid}): health probe failed`:`native-attach: drop ${c.origin} (pid ${c.pid}): health probe answered but reports not-ok`);return void 0}if(health.instanceId!==void 0&&health.instanceId!==c.instanceId){diag?.(`native-attach: drop ${c.origin} (pid ${c.pid}): instance id mismatch (${c.instanceId} vs ${health.instanceId})`);return void 0}return{inst:c,health}}));return checked.filter(c=>c!==void 0)}function attachGateAllows(health,attachExternal){if(attachExternal)return true;return health?.watchdog?.armed===true}function isUserZoneInstance(inst){return inst.lane===void 0&&inst.launchToken===void 0}function gateRefusalMessage(inst,health){const reason=health.watchdog&&health.watchdog.armed===false?"it reports NO session-lifecycle watchdog (started without BILI_PARENT_PID, e.g. manual `bili start`)":"it does not report watchdog state (older bili build) \u2014 its lifecycle is unverifiable";return`bili: refusing to attach to ${inst.origin} (pid ${inst.pid}) \u2014 ${reason}. It would outlive this session and ignore config edits until killed (#1322/#1335). Starting a session-owned proxy instead; set native.attachExternal=true or BILI_NATIVE_ATTACH_EXTERNAL=1 to attach anyway.`}function attachClass(inst,lane,foreignLanes){if(lane===void 0)return 1;if(inst.lane===lane)return 0;if(inst.lane!==void 0)return 1+foreignLanes.indexOf(inst.lane);return foreignLanes.length+1}function normalizeOrigin(o){return o.trim().replace(/\/+$/,"").toLowerCase()}function pickAttachable(candidates,opts,codeFingerprint,attachExternal,attachPolicy,attachUrl,refusedLog,diag,foreignLanes=[]){let best;let bestClass=Number.MAX_SAFE_INTEGER;let bestStartedAt=Number.NEGATIVE_INFINITY;for(const c of candidates){if(attachUrl&&normalizeOrigin(c.inst.origin)!==normalizeOrigin(attachUrl)){diag?.(`native-attach: skip ${c.inst.origin} (pid ${c.inst.pid}): not the explicit attachUrl target`);continue}let incompatible=instanceCompatible(c.inst,opts,codeFingerprint,foreignLanes);if(incompatible==="code-fingerprint-mismatch"&&c.health?.version!==void 0&&isNewerSameLaneHolder(c.inst,opts.lane,c.health.version,VERSION,isUserZoneInstance(c.inst))){const adoptedShape=instanceShapeMismatch(c.inst,opts,foreignLanes);if(adoptedShape===void 0){diag?.(`native-attach: adopt ${c.inst.origin} (pid ${c.inst.pid}): foreign bytes but self-reported v${c.health.version} is strictly NEWER than this lane's v${VERSION} \u2014 riding the newer build instead of deadlocking behind it (#4125)`);incompatible=void 0}else{diag?.(`native-attach: skip ${c.inst.origin} (pid ${c.inst.pid}): reports v${c.health.version} (newer) but its config shape differs (${adoptedShape}) \u2014 shape guards survive upward adoption (#4125)`);incompatible=adoptedShape}}if(incompatible!==void 0){diag?.(`native-attach: skip ${c.inst.origin} (pid ${c.inst.pid}): incompatible (${incompatible})`);continue}if(opts.strictPort&&c.inst.port!==opts.port){diag?.(`native-attach: skip ${c.inst.origin} (pid ${c.inst.pid}): port mismatch`);continue}const sameLane=opts.lane!==void 0&&c.inst.lane===opts.lane;if(!attachUrl&&!attachExternal&&attachPolicy==="own-lane"&&opts.lane!==void 0&&!sameLane&&c.health?.watchdog?.armed!==true){diag?.(`native-attach: skip ${c.inst.origin} (pid ${c.inst.pid}): not own lane and not an armed shared daemon (attachPolicy=own-lane)`);continue}if(c.health===void 0){if(!sameLane&&!attachExternal&&!isUserZoneInstance(c.inst)){if(!refusedLog.has(c.inst.origin)){refusedLog.add(c.inst.origin);const msg=`bili: refusing to attach to ${c.inst.origin} (pid ${c.inst.pid}) \u2014 health probe silent but TCP alive (BUSY, event loop saturated #3654) and its lifecycle is unverifiable from this lane. Starting a session-owned proxy instead; set native.attachExternal=true or BILI_NATIVE_ATTACH_EXTERNAL=1 to attach anyway.`;console.error(msg);diag?.(msg)}continue}}else if(!attachGateAllows(c.health,attachExternal)&&!isUserZoneInstance(c.inst)){if(!refusedLog.has(c.inst.origin)){refusedLog.add(c.inst.origin);console.error(gateRefusalMessage(c.inst,c.health));diag?.(gateRefusalMessage(c.inst,c.health))}continue}const cls=attachClass(c.inst,opts.lane,foreignLanes);if(cls<bestClass||cls===bestClass&&c.inst.startedAt>bestStartedAt){best=c.inst;bestClass=cls;bestStartedAt=c.inst.startedAt}}return best}async function waitForStarterInstance(readInstance,fetchHealthInfo,now,sleepImpl,opts,codeFingerprint,attachExternal,attachPolicy,attachUrl,refusedLog,diag,foreignLanes=[],isConnectable=tcpConnectable){const deadline=now()+SPAWN_BUDGET_MS;const probe=async()=>pickAttachable(await probeLiveInstances(readInstance,fetchHealthInfo,diag,isConnectable),opts,codeFingerprint,attachExternal,attachPolicy,attachUrl,refusedLog,diag,foreignLanes);let inst;while(now()<deadline){await sleepImpl(HEALTH_POLL_INTERVAL_MS);inst=await probe();if(inst)break;const still=readStartingMarker();if(!still||!isStartingMarkerActive(still,now()))break}return inst??await probe()}function defaultAttachDiag(debug){return msg=>{logHostEvent("info","",msg);if(debug)process.stderr.write(`${logTimestamp()} [info] [v=${VERSION}] ${msg}
134
134
  `)}}function pickEphemeralPort(host=LAUNCHER_DEFAULT_HOST){return new Promise((resolve,reject)=>{const srv=net3.createServer();srv.once("error",reject);srv.listen(0,host,()=>{const addr=srv.address();srv.close(()=>{if(addr&&typeof addr==="object")resolve(addr.port);else reject(new Error("could not allocate a free port"))})})})}var INHERITED_PROXY_VARS=["http_proxy","https_proxy","all_proxy","HTTP_PROXY","HTTPS_PROXY","ALL_PROXY","no_proxy","NO_PROXY"];var INTERNAL_LAUNCHER_CHANNEL_VARS=["BILI_LAUNCHER_LANE","BILI_LAUNCHER_MODEL_WINDOWS","BILI_LAUNCHER_MODEL_MAX_OUTPUTS","BILI_STRICT_PORT"];function stripInternalLauncherChannels(env){const cleaned={...env};for(const key of INTERNAL_LAUNCHER_CHANNEL_VARS)delete cleaned[key];return cleaned}function stripInheritedProxy(env){const cleaned={...env};for(const key of INHERITED_PROXY_VARS)delete cleaned[key];return stripInternalLauncherChannels(cleaned)}var INHERITED_LAUNCHER_CHANNELS=["BILI_LAUNCHER_LANE","BILI_LAUNCHER_MODEL_WINDOWS","BILI_LAUNCHER_MODEL_MAX_OUTPUTS","BILI_STRICT_PORT",SPAWN_FINGERPRINT_ENV];function stripInheritedLauncherChannels(env){const cleaned={...env};for(const key of INHERITED_LAUNCHER_CHANNELS)delete cleaned[key];return cleaned}function captureInheritedProxyEnv(env){const captured={};const pairs=[["BILI_INHERITED_HTTP_PROXY",env.HTTP_PROXY,env.http_proxy],["BILI_INHERITED_HTTPS_PROXY",env.HTTPS_PROXY,env.https_proxy],["BILI_INHERITED_ALL_PROXY",env.ALL_PROXY,env.all_proxy],["BILI_INHERITED_NO_PROXY",env.NO_PROXY,env.no_proxy]];for(const[name,upper,lower]of pairs){const value=(upper??lower??"").trim();if(value)captured[name]=value}return captured}function proxyStartArgs(opts){const args=["start","--host",opts.host,"--port",String(opts.port)];if(opts.passthrough)args.push("--passthrough");if(opts.debug)args.push("--debug");return args}function probeNodeWrapperTarget(candidate,env){try{const out=execFileSync5(candidate,["-p","process.execPath"],{windowsHide:true,timeout:5e3,encoding:"utf8",stdio:["ignore","pipe","pipe"],env});const p2=out.trim();return p2.length>0?p2:void 0}catch{return void 0}}function probeNodeMajor(candidate,env){try{const out=execFileSync5(candidate,["--version"],{windowsHide:true,timeout:5e3,encoding:"utf8",stdio:["ignore","pipe","pipe"],env});const m2=/^v(\d+)\.\d+\.\d+/.exec(out.trim());return m2?Number(m2[1]):void 0}catch{return void 0}}var MIN_PROXY_NODE_MAJOR=20;function looksLikeNodeExecutable(p2,platform){if(platform==="win32"){if(!/^[a-zA-Z]:[\\/]/.test(p2))return false}else if(!p2.startsWith("/")){return false}const base=p2.split(/[\\/]/).pop()?.toLowerCase()??"";return base==="node"||base==="node.exe"}function resolveNodeRuntime(execPath=process.execPath,env=process.env,platform=process.platform,existsImpl=fs15.existsSync,electronVersion=typeof process.versions.electron==="string"?process.versions.electron:void 0,probeWrapper=probeNodeWrapperTarget,probeNode=probeNodeMajor){const base=path27.basename(execPath).toLowerCase();if(base==="node"||base==="node.exe")return execPath;const override=typeof env.BILLION_CONTEXT_NODE==="string"?env.BILLION_CONTEXT_NODE.trim():"";if(override.length>0&&existsImpl(override))return override;const resolveDiscovered=candidate=>{let subject=candidate;if(platform==="win32"){const probed=probeWrapper(candidate,env);const target=probed?.trim();if(target&&target.length>0&&looksLikeNodeExecutable(target,platform)&&existsImpl(target)){if(target.toLowerCase()!==candidate.toLowerCase()){log("info",`bili: ${candidate} is a Windows node wrapper resolving to ${target} \u2014 spawning the real Node directly (#1887)`);subject=target}}}const major=probeNode(subject,env);if(major===void 0||major<MIN_PROXY_NODE_MAJOR)return void 0;return subject};const sep=platform==="win32"?";":":";const names=platform==="win32"?["node.exe"]:["node"];const home=platform==="win32"?env.USERPROFILE??"":env.HOME??"";const voltaHome=platform==="win32"?env.VOLTA_HOME??(home?home+"/Tools/volta":""):home?home+"/.volta":"";const extraDirs=platform==="win32"?["C:/Program Files/nodejs",env.LOCALAPPDATA?env.LOCALAPPDATA+"/Programs/nodejs":"",voltaHome?voltaHome+"/bin":""]:["/usr/local/bin","/opt/homebrew/bin","/opt/local/bin",voltaHome?voltaHome+"/bin":"",home?home+"/.local/bin":""];for(const dir of[...(env.PATH??"").split(sep),...extraDirs]){if(!dir)continue;for(const name of names){const candidate=dir.endsWith("/")||dir.endsWith("\\")?dir+name:dir+"/"+name;if(!existsImpl(candidate))continue;const resolved=resolveDiscovered(candidate);if(resolved!==void 0)return resolved;log("warn",`bili: skipping ${candidate} \u2014 not a usable Node runtime (--version did not report v${MIN_PROXY_NODE_MAJOR}+; set BILLION_CONTEXT_NODE if this is wrong, #3383)`)}}if(electronVersion&&electronVersion.length>0){log("warn",`bili: no usable Node runtime found on PATH or install dirs \u2014 falling back to the Electron host binary ${execPath} run as Node via ELECTRON_RUN_AS_NODE=1 (#1429/#3383)`);return execPath}throw new Error("bili: cannot find a Node runtime to spawn the proxy (this process is not Node) \u2014 set BILLION_CONTEXT_NODE")}var PORT_LOG_MAX_BYTES=5*1024*1024;function rotatePortLogIfNeeded(logPath2){try{if(fs15.statSync(logPath2).size<PORT_LOG_MAX_BYTES)return;try{fs15.unlinkSync(`${logPath2}.old`)}catch{}fs15.renameSync(logPath2,`${logPath2}.old`)}catch{}}var STALE_ROTATION_WAIT_MS=12e3;var SHUTDOWN_REQUEST_TIMEOUT_MS=3e3;var OWNER_HEARTBEAT_INTERVAL_MS=5e3;var OWNER_HEARTBEAT_POST_TIMEOUT_MS=2e3;async function requestInstanceShutdown(origin){try{const res=await fetch(`${origin}/__bili/shutdown`,{method:"POST",headers:{"content-type":"application/json",connection:"close"},body:"{}",signal:AbortSignal.timeout(SHUTDOWN_REQUEST_TIMEOUT_MS)});return res.ok}catch{return false}}async function rotateStalePredecessor(probed,resolveTargetPort,opts,attachUrl,foreignLanes,fetchHealthInfoNoReuse,now,sleep,requestShutdown){if(attachUrl!==void 0)return;const stale=probed.filter(c=>c.health!==void 0&&!isUserZoneInstance(c.inst)&&c.health.watchdog?.armed===true&&instanceShapeMismatch(c.inst,opts,foreignLanes)===void 0&&c.health.version!==void 0&&isVersionNewer(VERSION,c.health.version));if(stale.length===0)return;const targetPort=resolveTargetPort();if(targetPort===void 0)return;const candidate=stale.find(c=>c.inst.port===targetPort);if(!candidate)return;const running=candidate.health.version;if(running===void 0||!isVersionNewer(VERSION,running))return;console.error(`bili: rotating stale proxy ${candidate.inst.origin} (pid ${candidate.inst.pid}, running v${running}) \u2014 ours is v${VERSION}; requesting graceful shutdown before taking over port ${targetPort}`);const asked=await requestShutdown(candidate.inst.origin);if(!asked){console.error(`bili: stale rotation skipped \u2014 ${candidate.inst.origin} refused /__bili/shutdown (older build); falling back to the normal spawn ladder`);return}const deadline=now()+STALE_ROTATION_WAIT_MS;for(;;){const h=await fetchHealthInfoNoReuse(candidate.inst.origin);if(!h?.ok)break;if(now()>=deadline){console.error(`bili: stale rotation timed out after ${STALE_ROTATION_WAIT_MS}ms \u2014 ${candidate.inst.origin} still accepts fresh connections (listener open); falling back to the normal spawn ladder`);return}await sleep(HEALTH_POLL_INTERVAL_MS)}}function startOwnerHeartbeat(origin,pid,intervalMs=OWNER_HEARTBEAT_INTERVAL_MS,post){if(pid!==process.pid)return void 0;if(post!==void 0)return runOwnerHeartbeatLoop(post,pid,intervalMs);return runOwnerHeartbeatWorker(origin,pid,intervalMs)}var ownerHeartbeatWorkers=new Map;function runOwnerHeartbeatLoop(post,pid,intervalMs){let stopped=false;const beat=async()=>{while(!stopped){await new Promise(r=>{const t=setTimeout(r,intervalMs);t.unref?.()});if(stopped)return;try{await post(JSON.stringify({pid,hb:true}))}catch{}}};void beat();return()=>{stopped=true}}var OWNER_HEARTBEAT_WORKER_SOURCE=`
135
135
  const { parentPort, workerData } = require("node:worker_threads");
136
136
  const { origin, pid, intervalMs, timeoutMs } = workerData;
@@ -129,7 +129,7 @@ ${captureLines}`:capture2.stack}module.exports.fetch=function fetch2(init,option
129
129
  ${partialOutcomeNote(blocksCreated)}`;const out={text,failed:outcome==="failure"||outcome==="refused"};if(outcome!==void 0)out.outcome=outcome;if(blocksCreated!==void 0)out.blocksCreated=blocksCreated;return out}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}if(res.status===409&&attempt===0&&ORPHAN_ADOPT&&conversationIdOverride===void 0&&conversationId&&data.code==="TOOL_CONVERSATION_CONFLICT"){const witnesses=Array.isArray(data.witnessSessions)?data.witnessSessions.filter(x=>typeof x==="string"&&x.length>0):[];const namedSeen=typeof data.namedSessionLastSeen==="number"?data.namedSessionLastSeen:NaN;const witnessSeen=typeof data.witnessLastSeen==="number"?data.witnessLastSeen:NaN;if(witnesses.length===1&&witnesses[0]!==conversationId&&Number.isFinite(namedSeen)&&Number.isFinite(witnessSeen)&&witnessSeen>namedSeen){process.stderr.write(`[bili-mcp] captured conversation id ${conversationId} is stale \u2014 the host moved this conversation to ${witnesses[0]} (resume/native compaction?); re-binding
130
130
  `);conversationId=witnesses[0];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}
131
131
  `);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;initialized=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:VERSION2},capabilities:{tools:{}}});return}case"notifications/initialized":return;case"tools/list":{if(!initialized){sendError(id,-32002,"server not initialized");return}if(degradedReason!==void 0){sendResult(id,{tools:[]});return}try{await ensureManifest();sendResult(id,{tools:manifestTools})}catch(err){sendError(id,-32003,`bili proxy unreachable at ${resolveProxyOrigin()} (${err instanceof Error?err.message:String(err)}) \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){sendError(id,ERR_TOOL,"params.name is required");return}if(degradedReason!==void 0){sendResult(id,{content:[{type:"text",text:`bili is idle: ${degradedReason}`}],isError:true});return}const perCallRaw=rawArgs.conversation_id;const perCall=typeof perCallRaw==="string"?perCallRaw.trim():"";const metaThreadId=params._meta?.threadId;const nativeThreadId=typeof metaThreadId==="string"&&metaThreadId.trim().length>0?metaThreadId.trim():void 0;const metaToolUseId=params._meta?.["claudecode/toolUseId"];const hostToolUseId=typeof metaToolUseId==="string"&&metaToolUseId.trim().length>0?metaToolUseId.trim():void 0;const keepForSearch=tool==="search_context"&&perCall.length>0&&(nativeThreadId!==void 0||typeof conversationId==="string"&&conversationId.length>0);const args={...rawArgs};if(!keepForSearch)delete args.conversation_id;const routeOverride=nativeThreadId??(keepForSearch?void 0:perCall||void 0);try{const out=await forwardTool(tool,args,effectiveToolTimeoutMs(tool),routeOverride,nativeThreadId!==void 0,hostToolUseId);const result={content:[{type:"text",text:out.text}],isError:out.failed};if(out.outcome!==void 0||out.blocksCreated!==void 0){const structured={text:out.text};if(out.outcome!==void 0)structured.outcome=out.outcome;if(out.blocksCreated!==void 0)structured.blocksCreated=out.blocksCreated;result.structuredContent=structured}sendResult(id,result)}catch(err){sendResult(id,{content:[{type:"text",text:`bili tool error: ${err instanceof Error?err.message:String(err)}`}],isError:true})}return}case"ping":sendResult(id,{});return;default:if(method?.startsWith("notifications/"))return;sendError(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))}var degradedReason;if(process.argv[1]&&/(?:^|[\\/])mcp\.(?:ts|js)$/.test(process.argv[1])){void mcpMain()}import path8 from"path";import{fileURLToPath as fileURLToPath3}from"url";function proxyEnvOrigin(env){const raw=env.BILLION_CONTEXT_PROXY;if(raw===void 0)return void 0;const url=raw.trim();if(url.length===0||!/^https?:\/\//i.test(url))return void 0;try{new URL(url)}catch{return void 0}return url.replace(/\/+$/,"")}function nativeAttachOrigin(env){const raw=env.BILLION_CONTEXT_ATTACH;if(raw===void 0)return void 0;const url=raw.trim();if(url.length===0||!/^https?:\/\//i.test(url))return void 0;try{new URL(url)}catch{return void 0}return url.replace(/\/+$/,"")}function envMillis(env,name,fallback){const raw=env[name];if(raw===void 0)return fallback;const n=Number(raw);return Number.isFinite(n)&&n>0?Math.floor(n):fallback}var STATUS_TIMEOUT_MS=5e3;async function fetchJson(url,init,timeoutMs,externalSignal){const ac=new AbortController;if(externalSignal?.aborted)ac.abort();const timer=setTimeout(()=>ac.abort(),timeoutMs);const onExternalAbort=()=>ac.abort();externalSignal?.addEventListener("abort",onExternalAbort,{once:true});try{let res;try{res=await fetch(url,{...init,signal:ac.signal})}catch(err){if(ac.signal.aborted&&!externalSignal?.aborted)throw new Error(`timeout after ${timeoutMs}ms: ${url}`);throw err}const text=await res.text();let json=void 0;try{json=JSON.parse(text)}catch{json=void 0}return{ok:res.ok,status:res.status,json}}finally{clearTimeout(timer);externalSignal?.removeEventListener("abort",onExternalAbort)}}var HOOK_EXIT_BACKSTOP_MS=5e3;function runSessionStartHook(main2,deps={}){const exit=deps.exit??(code=>process.exit(code));const input=deps.input??process.stdin;void main2().finally(()=>{try{input.destroy?.()}catch{}process.exitCode=0;const backstop=setTimeout(()=>exit(0),deps.backstopMs??HOOK_EXIT_BACKSTOP_MS);backstop.unref?.()})}async function reportRuntimeInfo(proxyBase,info){const{ok,status}=await fetchJson(`${proxyBase}/__bili/plugin/runtime-info`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(info)},STATUS_TIMEOUT_MS);if(!ok)throw new Error(`runtime-info report failed (${status})`)}import crypto4 from"crypto";import fs15 from"fs";import path27 from"path";import{createHash as createHash14,randomUUID as randomUUID6}from"crypto";import fs14 from"fs";import net3 from"net";import os9 from"os";import path26 from"path";import{createRequire as createRequire3}from"module";import{Worker as Worker3}from"worker_threads";import{pathToFileURL as pathToFileURL2}from"url";import{execFileSync as execFileSync5,spawn as spawn2,spawnSync as spawnSync3}from"child_process";import tls4 from"tls";var import_node_forge=__toESM(require_lib(),1);init_paths();init_logger();import crypto from"crypto";import{execFileSync as execFileSync3}from"child_process";import fs3 from"fs";import os3 from"os";import path9 from"path";import tls3 from"tls";var COMBINED_MAX_AGE_MS=24*60*60*1e3;var PLATFORM_CA_CANDIDATES=process.platform==="darwin"?["/etc/ssl/cert.pem","/private/etc/ssl/cert.pem"]:process.platform==="win32"?[]:["/etc/ssl/certs/ca-certificates.crt","/etc/pki/tls/certs/ca-bundle.crt","/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem","/etc/ssl/ca-bundle.pem","/etc/ssl/cert.pem"];init_upstream_proxy();init_client_config();init_vertex();import fs5 from"fs";import os5 from"os";import path11 from"path";init_util();init_log_mask();init_knobs();init_mitm_domains();init_private_host();init_upstream_fail();init_instance();import net2 from"net";init_main();init_client_config();init_vertex();init_config();init_instance();init_dsh_channel();init_pi_channel();init_update();import fs12 from"fs";import path19 from"path";import os8 from"os";import crypto3 from"crypto";import{execFileSync as execFileSync4,spawnSync as spawnSync2}from"child_process";import{fileURLToPath as fileURLToPath5}from"url";import fs10 from"fs";import path17 from"path";init_client_config();init_instance();init_client_config();import fs11 from"fs";import path18 from"path";var ZCODE_BIGMODEL_ANTHROPIC_UPSTREAM="https://open.bigmodel.cn/api/anthropic";var ZCODE_LEGACY_PLAN_IDS=["builtin:bigmodel-coding-plan","builtin:zai-coding-plan","builtin:bigmodel-start-plan","builtin:zai-start-plan","builtin:bigmodel","builtin:zai"];var ZCODE_NEW_PLAN_IDS=["account:bigmodel-individual-coding-plan","account:bigmodel-team-coding-plan","account:bigmodel-start-plan","account:zai-individual-coding-plan","account:zai-team-coding-plan","account:zai-start-plan"];var ZCODE_LEGACY_CREATE_IDS=["builtin:bigmodel-coding-plan","builtin:bigmodel-start-plan"];var ZCODE_NEW_CREATE_IDS=["account:bigmodel-individual-coding-plan","account:bigmodel-team-coding-plan","account:bigmodel-start-plan"];var WRAPPED_URL_RE=/^https?:\/\/[^/]+\/bili\/(https?:\/\/.+)$/;function resolveZcodeDataDir(env=process.env){return zcodeDataRoot(env)}function zcodeStoreCandidates(dataDir,kind,env=process.env){const local=path18.join(dataDir,"v2",kind==="new"?"provider_config.json":"config.json");if(kind!=="new")return[local];const explicit=env.ZCODE_PERSONAL_PROVIDER_CONFIG_FILE?.trim();return explicit!==void 0&&explicit.length>0?[explicit,local]:[local]}function detectZcodeStore(dataDir,env=process.env){for(const newFile of zcodeStoreCandidates(dataDir,"new",env)){try{assertNewStoreShape(JSON.parse(fs11.readFileSync(newFile,"utf8")));return{kind:"new",file:newFile}}catch{}}return{kind:"legacy",file:zcodeStoreCandidates(dataDir,"legacy",env)[0]}}function defaultZcodeRoutePolicy(){return{route:"all",directPrefixes:[],assumeSigningFixed:false}}function zcodeSigningBlocksRouting(kind,policy=defaultZcodeRoutePolicy()){return kind==="new"&&!policy.assumeSigningFixed&&policy.route==="plans"}function isLoopbackHttpUrl(url){let parsed;try{parsed=new URL(url)}catch{return false}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:")return false;const host=parsed.hostname.toLowerCase();return host==="localhost"||host==="::1"||host==="[::1]"||host==="0.0.0.0"||host==="127.0.0.1"||/^127\.\d+\.\d+\.\d+$/.test(host)}function directExemptionHit(upstream,directPrefixes){if(upstream===void 0)return false;for(const key of directPrefixes){if(key.length===0)continue;if(upstream===key||upstream.startsWith(key+"/"))return true}return false}function zcodeEntrySkipReason(id,upstream,hasBaseUrl,kind,policy){if(kind==="new"&&!policy.assumeSigningFixed&&policy.route==="all"&&ZCODE_NEW_PLAN_IDS.includes(id)){return"client-signing account (#1621) \u2014 stays direct; use cert-MITM for compression on this account"}if(!hasBaseUrl)return"no usable http(s) baseUrl \u2014 left untouched";if(upstream!==void 0&&isLoopbackHttpUrl(upstream))return`loopback target (${upstream}) never re-proxied (#809)`;if(directExemptionHit(upstream,policy.directPrefixes))return"direct exemption (providers route `direct: true`)";return void 0}function asRecord(value){return value!==null&&typeof value==="object"&&!Array.isArray(value)?value:void 0}function parseRoot(text,label){let doc;try{doc=JSON.parse(text)}catch(err){throw new Error(`${label} is not valid JSON: ${err instanceof Error?err.message:String(err)}`)}const root=asRecord(doc);if(!root)throw new Error(`${label} must be a JSON object`);return root}function unwrapBaseUrl(value){if(typeof value!=="string")return void 0;const match=WRAPPED_URL_RE.exec(value);const candidate=match?match[1]:value;try{const url=new URL(candidate);return url.protocol==="http:"||url.protocol==="https:"?candidate:void 0}catch{return void 0}}function serialize(root){return`${JSON.stringify(root,null,2)}
132
- `}function legacyPlanEntries(root,createWhenEmpty){let provider=asRecord(root.provider);if(!provider){if(!createWhenEmpty)return[];provider={};root.provider=provider}const found=[];for(const id of ZCODE_LEGACY_PLAN_IDS){const entry=asRecord(provider[id]);if(!entry)continue;let options=asRecord(entry.options);if(!options){options={};entry.options=options}found.push({id,options})}if(found.length>0)return found;if(!createWhenEmpty)return[];for(const id of ZCODE_LEGACY_CREATE_IDS){const entry={options:{}};provider[id]=entry;found.push({id,options:entry.options})}return found}function legacyPlanEntriesForAll(root,policy){const routed=[];const skipped=[];const provider=asRecord(root.provider);if(!provider)return{routed,skipped};for(const id of Object.keys(provider)){const options=asRecord(asRecord(provider[id])?.options);const upstream=options===void 0?void 0:unwrapBaseUrl(options.baseURL);const reason=zcodeEntrySkipReason(id,upstream,upstream!==void 0,"legacy",policy);if(reason!==void 0||options===void 0||upstream===void 0){skipped.push({id,reason:reason??"no usable http(s) baseURL \u2014 left untouched"});continue}routed.push({id,options})}return{routed,skipped}}function applyLegacy(text,origin,policy){const root=parseRoot(text,"zcode v2/config.json");const wrapped=[];const skipped=[];if(policy.route==="all"){const selection=legacyPlanEntriesForAll(root,policy);for(const{id,options}of selection.routed){const upstream=unwrapBaseUrl(options.baseURL);if(upstream===void 0)continue;options.baseURL=`${origin}/bili/${upstream}`;wrapped.push({id,upstream})}skipped.push(...selection.skipped);return{text:serialize(root),wrapped,skipped}}for(const{id,options}of legacyPlanEntries(root,true)){const upstream=unwrapBaseUrl(options.baseURL)??ZCODE_BIGMODEL_ANTHROPIC_UPSTREAM;options.baseURL=`${origin}/bili/${upstream}`;wrapped.push({id,upstream})}return{text:serialize(root),wrapped,skipped}}function assertNewStoreShape(doc){const root=asRecord(doc);if(!root)throw new Error("zcode provider_config.json must be a JSON object");if(root.schemaVersion!==1)throw new Error(`unsupported provider_config.json schemaVersion: ${String(root.schemaVersion)}`);const config=asRecord(root.config);if(!config)throw new Error("provider_config.json is missing its config object");const rulesField=asRecord(config.providerConfigRules);if(rulesField!==void 0&&!Array.isArray(rulesField.providerRules)){throw new Error("provider_config.json config.providerConfigRules.providerRules must be an array")}}function newRuleArray(root){const rulesField=asRecord(asRecord(root.config)?.providerConfigRules);return rulesField&&Array.isArray(rulesField.providerRules)?rulesField.providerRules:[]}function newPlanRules(root,createWhenEmpty){const config=asRecord(root.config);if(!config)throw new Error("provider_config.json is missing its config object");let rulesField=asRecord(config.providerConfigRules);if(!rulesField){if(!createWhenEmpty)return[];rulesField={providerRules:[]};config.providerConfigRules=rulesField}const rules=Array.isArray(rulesField.providerRules)?rulesField.providerRules:[];const found=[];for(const raw of rules){const rule=asRecord(raw);if(!rule||typeof rule.providerId!=="string"||!ZCODE_NEW_PLAN_IDS.includes(rule.providerId))continue;const configObj=asRecord(rule.config);if(!configObj)continue;let api=asRecord(configObj.api);if(!api){api={};configObj.api=api}found.push({id:rule.providerId,api})}if(found.length>0)return found;if(!createWhenEmpty)return[];for(const id of ZCODE_NEW_CREATE_IDS){const rule={providerId:id,config:{api:{}}};rules.push(rule);const api=asRecord(asRecord(rule.config)?.api)??{};found.push({id,api})}return found}function newStoreRulesForAll(root,policy){const routed=[];const skipped=[];for(const raw of newRuleArray(root)){const rule=asRecord(raw);if(!rule||typeof rule.providerId!=="string"||rule.providerId.length===0)continue;const api=asRecord(asRecord(rule.config)?.api);const upstream=api===void 0?void 0:unwrapBaseUrl(api.baseUrl);const reason=zcodeEntrySkipReason(rule.providerId,upstream,upstream!==void 0,"new",policy);if(reason!==void 0||api===void 0||upstream===void 0){skipped.push({id:rule.providerId,reason:reason??"no usable http(s) baseUrl \u2014 left untouched"});continue}routed.push({id:rule.providerId,api})}return{routed,skipped}}function applyNew(text,origin,policy){const root=parseRoot(text,"zcode v2/provider_config.json");assertNewStoreShape(root);const wrapped=[];const skipped=[];if(policy.route==="all"){for(const{id,api}of newStoreRulesForAll(root,policy).routed){const upstream=unwrapBaseUrl(api.baseUrl);if(upstream===void 0)continue;api.baseUrl=`${origin}/bili/${upstream}`;wrapped.push({id,upstream})}skipped.push(...newStoreRulesForAll(root,policy).skipped);return{text:serialize(root),wrapped,skipped}}for(const{id,api}of newPlanRules(root,true)){const upstream=unwrapBaseUrl(api.baseUrl)??ZCODE_BIGMODEL_ANTHROPIC_UPSTREAM;api.baseUrl=`${origin}/bili/${upstream}`;wrapped.push({id,upstream})}return{text:serialize(root),wrapped,skipped}}function applyZcodeRouting(text,kind,origin,policy=defaultZcodeRoutePolicy()){return kind==="new"?applyNew(text,origin,policy):applyLegacy(text,origin,policy)}init_log_mask();init_logger();init_paths();init_version();import{appendFileSync,mkdirSync as mkdirSync3}from"fs";import path20 from"path";init_logger();init_version();import http from"http";var MAX_HOLD_MS=10*6e4;init_update();init_win_cmd();init_client_config();init_config();init_registry();init_config();init_logger();function parseLauncherModelWindows(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_WINDOWS=parseLauncherModelWindows(process.env.BILI_LAUNCHER_MODEL_WINDOWS);function parseLauncherModelMaxOutputs(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_MAX_OUTPUTS=parseLauncherModelMaxOutputs(process.env.BILI_LAUNCHER_MODEL_MAX_OUTPUTS);init_vertex();init_client_config();init_logger();import{createHash as createHash13}from"crypto";import{createHash as createHash12,randomUUID as randomUUID4}from"crypto";import{closeSync,existsSync as existsSync6,fsyncSync,mkdirSync as mkdirSync6,openSync,readdirSync,readFileSync as readFileSync7,renameSync as renameSync2,rmSync,statSync as statSync6,writeFileSync as writeFileSync5}from"fs";import{readdir as readdir2,readFile as readFile4,rm as rm2}from"fs/promises";import*as path23 from"path";init_paths();init_knobs();init_logger();init_runtime_status();init_version();import{createCipheriv,createDecipheriv,randomBytes as randomBytes2}from"crypto";import*as zlib from"zlib";var ENCRYPT_MAGIC=Buffer.from("BILIENC1","utf8");var ZSTD_MAGIC=Buffer.from("BILIZSTD1","utf8");var NONCE_LEN=12;var TAG_LEN=16;var ENCRYPT_HEADER_LEN=ENCRYPT_MAGIC.length+2+NONCE_LEN;var MIN_ENCRYPTED_LEN=ENCRYPT_HEADER_LEN+TAG_LEN;var PLAIN_HEADER_LEN=ZSTD_MAGIC.length+2;init_logger();init_billing();init_state_hydration();init_shadow();init_backend();init_ingest();init_store();init_logger();init_paths();import{randomUUID as randomUUID2}from"crypto";import{mkdirSync as mkdirSync5,writeFileSync as writeFileSync4}from"fs";import{dirname as dirname3,join as join2}from"path";init_knobs();import{createHash as createHash11,randomUUID as randomUUID3}from"crypto";import{AsyncLocalStorage as AsyncLocalStorage3}from"async_hooks";init_logger();import{createHash as createHash10}from"crypto";import{createHash as createHash9}from"crypto";init_logger();init_logger();init_billing();init_util();var BOOT_ID=randomUUID3();var SEAM_BODY_CAP=512*1024;var BODY_FULL_CAP=8*1024*1024;var captures=new AsyncLocalStorage3;var LEARNED_IMAGE_COST_TTL_MS=24*60*60*1e3;var{join:join4}=path23;init_version();init_knobs();init_config();init_config();init_paths();init_logger();init_external_summary_settings();import*as path24 from"path";init_turn_separator();init_turn_separator();var ABORT_REANCHOR_MAX_AGE_MS=30*60*1e3;var MAX_SESSIONS=maxSessions();var MAX_RESIDENT_BYTES=sessionResidentMaxBytes();var SPLIT_CANARY_FRESH_MS=10*60*1e3;import{randomUUID as randomUUID5}from"crypto";init_knobs();init_client_config();import fs13 from"fs";import path25 from"path";init_dsh_channel();var SCAN_CACHE_TTL_MS=5*60*1e3;var CONFLICT_ACTIVE_WINDOW_MS=7*24*60*60*1e3;var SPAWN_WAIT_MS=envMillis(process.env,"BILI_SPAWN_WAIT_MS",2e4);var SLOW_START_GRACE_MS=envMillis(process.env,"BILI_SLOW_START_GRACE_MS",4e4);var SPAWN_BUDGET_MS=SPAWN_WAIT_MS+SLOW_START_GRACE_MS;var STARTING_MARKER_TTL_MS=SPAWN_BUDGET_MS+3e4;var DEFAULT_MITM_DOMAIN_SET=new Set(DEFAULT_MITM_DOMAINS.map(d=>d.toLowerCase()));var PORT_LOG_MAX_BYTES=5*1024*1024;var PATH_EXTS=process.platform==="win32"?[".cmd",".bat",".exe",""]:[""];init_instance();init_config();var SIGNING_BLOCK_MESSAGE='zcode v3.14+ client signing (#1621) rejects the http://127.0.0.1 /bili/ origin at model creation ("Client signing handshake requires HTTPS.") \u2014 skipping native routing; provider store left untouched. For compression on this build use the GUI cert-MITM setup (Settings \u2192 Network: HTTP proxy + root CA path).';function planNativeZcode(env=process.env){if(env.BILLION_CONTEXT_PLUGIN==="0"||env.BILI_NATIVE_ZCODE==="0")return{mode:"off"};if(env.BILI_PROVIDER_REWRITES!==void 0)return{mode:"off"};const attach=nativeAttachOrigin(env)??proxyEnvOrigin(env);if(attach!==void 0)return{mode:"attach",attachOrigin:attach};return{mode:"spawn"}}async function probeProxyHealth(origin,timeoutMs=2e3){try{const res=await fetch(`${origin}/__bili/plugin/status?conversationId=zcode&fallback=latest`,{signal:AbortSignal.timeout(timeoutMs)});if(res.status>=500)return false;const text=await res.text();return text.startsWith("{")&&text.includes('"ok"')}catch{return false}}async function waitForProxyHealthy(origin,deadlineMs=15e3,intervalMs=250){const deadline=Date.now()+deadlineMs;for(;;){if(await probeProxyHealth(origin))return true;if(Date.now()+intervalMs>deadline)return false;await new Promise(r=>setTimeout(r,intervalMs))}}var CONFIG_LOCK_DIR=".bili-config.lock";var CONFIG_LOCK_TIMEOUT_MS=5e3;var CONFIG_LOCK_STALE_MS=3e4;function lockStale(lockDir){try{const pidRaw=fs15.readFileSync(path27.join(lockDir,"pid"),"utf8").trim();const age=Date.now()-fs15.statSync(lockDir).mtimeMs;if(age>CONFIG_LOCK_STALE_MS)return true;const pid=Number.parseInt(pidRaw,10);return Number.isInteger(pid)&&pid>0&&!isPidAlive(pid)}catch{return true}}async function withConfigLock(dataDir,fn){const lockDir=path27.join(dataDir,"v2",CONFIG_LOCK_DIR);fs15.mkdirSync(path27.join(dataDir,"v2"),{recursive:true});const deadline=Date.now()+CONFIG_LOCK_TIMEOUT_MS;for(;;){try{fs15.mkdirSync(lockDir);fs15.writeFileSync(path27.join(lockDir,"pid"),String(process.pid));break}catch(err){if(err.code!=="EEXIST")throw err;if(lockStale(lockDir)){fs15.rmSync(lockDir,{recursive:true,force:true});continue}if(Date.now()>deadline)throw new Error("timed out waiting for the zcode config lock");await new Promise(r=>setTimeout(r,100))}}try{return fn()}finally{fs15.rmSync(lockDir,{recursive:true,force:true})}}function hashText(text){return crypto4.createHash("sha256").update(text).digest("hex")}function snapshotAndWrite(file,text){const bak=`${file}.bili-bak`;const last=`${file}.bili-last`;if(fs15.existsSync(file)){let cur;try{cur=hashText(fs15.readFileSync(file,"utf8"))}catch{return}let prev;try{prev=fs15.readFileSync(last,"utf8").trim()}catch{}if(!(prev===cur&&fs15.existsSync(bak)))fs15.copyFileSync(file,bak)}fs15.writeFileSync(file,text);try{fs15.writeFileSync(last,`${hashText(text)}
132
+ `}function legacyPlanEntries(root,createWhenEmpty){let provider=asRecord(root.provider);if(!provider){if(!createWhenEmpty)return[];provider={};root.provider=provider}const found=[];for(const id of ZCODE_LEGACY_PLAN_IDS){const entry=asRecord(provider[id]);if(!entry)continue;let options=asRecord(entry.options);if(!options){options={};entry.options=options}found.push({id,options})}if(found.length>0)return found;if(!createWhenEmpty)return[];for(const id of ZCODE_LEGACY_CREATE_IDS){const entry={options:{}};provider[id]=entry;found.push({id,options:entry.options})}return found}function legacyPlanEntriesForAll(root,policy){const routed=[];const skipped=[];const provider=asRecord(root.provider);if(!provider)return{routed,skipped};for(const id of Object.keys(provider)){const options=asRecord(asRecord(provider[id])?.options);const upstream=options===void 0?void 0:unwrapBaseUrl(options.baseURL);const reason=zcodeEntrySkipReason(id,upstream,upstream!==void 0,"legacy",policy);if(reason!==void 0||options===void 0||upstream===void 0){skipped.push({id,reason:reason??"no usable http(s) baseURL \u2014 left untouched"});continue}routed.push({id,options})}return{routed,skipped}}function applyLegacy(text,origin,policy){const root=parseRoot(text,"zcode v2/config.json");const wrapped=[];const skipped=[];if(policy.route==="all"){const selection=legacyPlanEntriesForAll(root,policy);for(const{id,options}of selection.routed){const upstream=unwrapBaseUrl(options.baseURL);if(upstream===void 0)continue;options.baseURL=`${origin}/bili/${upstream}`;wrapped.push({id,upstream})}skipped.push(...selection.skipped);return{text:serialize(root),wrapped,skipped}}for(const{id,options}of legacyPlanEntries(root,true)){const upstream=unwrapBaseUrl(options.baseURL)??ZCODE_BIGMODEL_ANTHROPIC_UPSTREAM;options.baseURL=`${origin}/bili/${upstream}`;wrapped.push({id,upstream})}return{text:serialize(root),wrapped,skipped}}function assertNewStoreShape(doc){const root=asRecord(doc);if(!root)throw new Error("zcode provider_config.json must be a JSON object");if(root.schemaVersion!==1)throw new Error(`unsupported provider_config.json schemaVersion: ${String(root.schemaVersion)}`);const config=asRecord(root.config);if(!config)throw new Error("provider_config.json is missing its config object");const rulesField=asRecord(config.providerConfigRules);if(rulesField!==void 0&&!Array.isArray(rulesField.providerRules)){throw new Error("provider_config.json config.providerConfigRules.providerRules must be an array")}}function newRuleArray(root){const rulesField=asRecord(asRecord(root.config)?.providerConfigRules);return rulesField&&Array.isArray(rulesField.providerRules)?rulesField.providerRules:[]}function newPlanRules(root,createWhenEmpty){const config=asRecord(root.config);if(!config)throw new Error("provider_config.json is missing its config object");let rulesField=asRecord(config.providerConfigRules);if(!rulesField){if(!createWhenEmpty)return[];rulesField={providerRules:[]};config.providerConfigRules=rulesField}const rules=Array.isArray(rulesField.providerRules)?rulesField.providerRules:[];const found=[];for(const raw of rules){const rule=asRecord(raw);if(!rule||typeof rule.providerId!=="string"||!ZCODE_NEW_PLAN_IDS.includes(rule.providerId))continue;const configObj=asRecord(rule.config);if(!configObj)continue;let api=asRecord(configObj.api);if(!api){api={};configObj.api=api}found.push({id:rule.providerId,api})}if(found.length>0)return found;if(!createWhenEmpty)return[];for(const id of ZCODE_NEW_CREATE_IDS){const rule={providerId:id,config:{api:{}}};rules.push(rule);const api=asRecord(asRecord(rule.config)?.api)??{};found.push({id,api})}return found}function newStoreRulesForAll(root,policy){const routed=[];const skipped=[];for(const raw of newRuleArray(root)){const rule=asRecord(raw);if(!rule||typeof rule.providerId!=="string"||rule.providerId.length===0)continue;const api=asRecord(asRecord(rule.config)?.api);const upstream=api===void 0?void 0:unwrapBaseUrl(api.baseUrl);const reason=zcodeEntrySkipReason(rule.providerId,upstream,upstream!==void 0,"new",policy);if(reason!==void 0||api===void 0||upstream===void 0){skipped.push({id:rule.providerId,reason:reason??"no usable http(s) baseUrl \u2014 left untouched"});continue}routed.push({id:rule.providerId,api})}return{routed,skipped}}function applyNew(text,origin,policy){const root=parseRoot(text,"zcode v2/provider_config.json");assertNewStoreShape(root);const wrapped=[];const skipped=[];if(policy.route==="all"){for(const{id,api}of newStoreRulesForAll(root,policy).routed){const upstream=unwrapBaseUrl(api.baseUrl);if(upstream===void 0)continue;api.baseUrl=`${origin}/bili/${upstream}`;wrapped.push({id,upstream})}skipped.push(...newStoreRulesForAll(root,policy).skipped);return{text:serialize(root),wrapped,skipped}}for(const{id,api}of newPlanRules(root,true)){const upstream=unwrapBaseUrl(api.baseUrl)??ZCODE_BIGMODEL_ANTHROPIC_UPSTREAM;api.baseUrl=`${origin}/bili/${upstream}`;wrapped.push({id,upstream})}return{text:serialize(root),wrapped,skipped}}function applyZcodeRouting(text,kind,origin,policy=defaultZcodeRoutePolicy()){return kind==="new"?applyNew(text,origin,policy):applyLegacy(text,origin,policy)}init_log_mask();init_logger();init_paths();init_version();import{appendFileSync,mkdirSync as mkdirSync3}from"fs";import path20 from"path";init_logger();init_version();import http from"http";var MAX_HOLD_MS=10*6e4;init_update();init_win_cmd();init_client_config();init_config();init_registry();init_config();init_logger();function parseLauncherModelWindows(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_WINDOWS=parseLauncherModelWindows(process.env.BILI_LAUNCHER_MODEL_WINDOWS);function parseLauncherModelMaxOutputs(raw){if(!raw)return{};try{const parsed=JSON.parse(raw);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return{};const out={};for(const[id,v2]of Object.entries(parsed)){if(typeof v2==="number"&&Number.isFinite(v2)&&v2>0)out[id]=Math.floor(v2)}return out}catch{return{}}}var LAUNCHER_MODEL_MAX_OUTPUTS=parseLauncherModelMaxOutputs(process.env.BILI_LAUNCHER_MODEL_MAX_OUTPUTS);init_vertex();init_client_config();init_logger();import{createHash as createHash13}from"crypto";import{createHash as createHash12,randomUUID as randomUUID4}from"crypto";import{closeSync,existsSync as existsSync6,fsyncSync,mkdirSync as mkdirSync6,openSync,readdirSync,readFileSync as readFileSync7,renameSync as renameSync2,rmSync,statSync as statSync6,writeFileSync as writeFileSync5}from"fs";import{readdir as readdir2,readFile as readFile4,rm as rm2}from"fs/promises";import*as path23 from"path";init_paths();init_knobs();init_logger();init_runtime_status();init_version();import{createCipheriv,createDecipheriv,randomBytes as randomBytes2}from"crypto";import*as zlib from"zlib";var ENCRYPT_MAGIC=Buffer.from("BILIENC1","utf8");var ZSTD_MAGIC=Buffer.from("BILIZSTD1","utf8");var NONCE_LEN=12;var TAG_LEN=16;var ENCRYPT_HEADER_LEN=ENCRYPT_MAGIC.length+2+NONCE_LEN;var MIN_ENCRYPTED_LEN=ENCRYPT_HEADER_LEN+TAG_LEN;var PLAIN_HEADER_LEN=ZSTD_MAGIC.length+2;init_logger();init_billing();init_state_hydration();init_shadow();init_logger();var HOT_ATTACH_WINDOW_MS=10*6e4;var ATTACH_SILENCE_MS=5*6e4;init_backend();init_ingest();init_store();init_logger();init_paths();import{randomUUID as randomUUID2}from"crypto";import{mkdirSync as mkdirSync5,writeFileSync as writeFileSync4}from"fs";import{dirname as dirname3,join as join2}from"path";init_knobs();import{createHash as createHash11,randomUUID as randomUUID3}from"crypto";import{AsyncLocalStorage as AsyncLocalStorage3}from"async_hooks";init_logger();import{createHash as createHash10}from"crypto";import{createHash as createHash9}from"crypto";init_logger();init_logger();init_billing();init_util();var BOOT_ID=randomUUID3();var SEAM_BODY_CAP=512*1024;var BODY_FULL_CAP=8*1024*1024;var captures=new AsyncLocalStorage3;var LEARNED_IMAGE_COST_TTL_MS=24*60*60*1e3;var{join:join4}=path23;var FROZEN_SKIP_NOTICE_COOLDOWN_MS=10*6e4;init_version();init_knobs();init_config();init_config();init_paths();init_logger();init_external_summary_settings();import*as path24 from"path";init_turn_separator();init_turn_separator();var ABORT_REANCHOR_MAX_AGE_MS=30*60*1e3;var MAX_SESSIONS=maxSessions();var MAX_RESIDENT_BYTES=sessionResidentMaxBytes();var SPLIT_CANARY_FRESH_MS=10*60*1e3;import{randomUUID as randomUUID5}from"crypto";init_knobs();init_client_config();import fs13 from"fs";import path25 from"path";init_dsh_channel();var SCAN_CACHE_TTL_MS=5*60*1e3;var CONFLICT_ACTIVE_WINDOW_MS=7*24*60*60*1e3;var SPAWN_WAIT_MS=envMillis(process.env,"BILI_SPAWN_WAIT_MS",2e4);var SLOW_START_GRACE_MS=envMillis(process.env,"BILI_SLOW_START_GRACE_MS",4e4);var SPAWN_BUDGET_MS=SPAWN_WAIT_MS+SLOW_START_GRACE_MS;var STARTING_MARKER_TTL_MS=SPAWN_BUDGET_MS+3e4;var DEFAULT_MITM_DOMAIN_SET=new Set(DEFAULT_MITM_DOMAINS.map(d=>d.toLowerCase()));var PORT_LOG_MAX_BYTES=5*1024*1024;var PATH_EXTS=process.platform==="win32"?[".cmd",".bat",".exe",""]:[""];init_instance();init_config();var SIGNING_BLOCK_MESSAGE='zcode v3.14+ client signing (#1621) rejects the http://127.0.0.1 /bili/ origin at model creation ("Client signing handshake requires HTTPS.") \u2014 skipping native routing; provider store left untouched. For compression on this build use the GUI cert-MITM setup (Settings \u2192 Network: HTTP proxy + root CA path).';function planNativeZcode(env=process.env){if(env.BILLION_CONTEXT_PLUGIN==="0"||env.BILI_NATIVE_ZCODE==="0")return{mode:"off"};if(env.BILI_PROVIDER_REWRITES!==void 0)return{mode:"off"};const attach=nativeAttachOrigin(env)??proxyEnvOrigin(env);if(attach!==void 0)return{mode:"attach",attachOrigin:attach};return{mode:"spawn"}}async function probeProxyHealth(origin,timeoutMs=2e3){try{const res=await fetch(`${origin}/__bili/plugin/status?conversationId=zcode&fallback=latest`,{signal:AbortSignal.timeout(timeoutMs)});if(res.status>=500)return false;const text=await res.text();return text.startsWith("{")&&text.includes('"ok"')}catch{return false}}async function waitForProxyHealthy(origin,deadlineMs=15e3,intervalMs=250){const deadline=Date.now()+deadlineMs;for(;;){if(await probeProxyHealth(origin))return true;if(Date.now()+intervalMs>deadline)return false;await new Promise(r=>setTimeout(r,intervalMs))}}var CONFIG_LOCK_DIR=".bili-config.lock";var CONFIG_LOCK_TIMEOUT_MS=5e3;var CONFIG_LOCK_STALE_MS=3e4;function lockStale(lockDir){try{const pidRaw=fs15.readFileSync(path27.join(lockDir,"pid"),"utf8").trim();const age=Date.now()-fs15.statSync(lockDir).mtimeMs;if(age>CONFIG_LOCK_STALE_MS)return true;const pid=Number.parseInt(pidRaw,10);return Number.isInteger(pid)&&pid>0&&!isPidAlive(pid)}catch{return true}}async function withConfigLock(dataDir,fn){const lockDir=path27.join(dataDir,"v2",CONFIG_LOCK_DIR);fs15.mkdirSync(path27.join(dataDir,"v2"),{recursive:true});const deadline=Date.now()+CONFIG_LOCK_TIMEOUT_MS;for(;;){try{fs15.mkdirSync(lockDir);fs15.writeFileSync(path27.join(lockDir,"pid"),String(process.pid));break}catch(err){if(err.code!=="EEXIST")throw err;if(lockStale(lockDir)){fs15.rmSync(lockDir,{recursive:true,force:true});continue}if(Date.now()>deadline)throw new Error("timed out waiting for the zcode config lock");await new Promise(r=>setTimeout(r,100))}}try{return fn()}finally{fs15.rmSync(lockDir,{recursive:true,force:true})}}function hashText(text){return crypto4.createHash("sha256").update(text).digest("hex")}function snapshotAndWrite(file,text){const bak=`${file}.bili-bak`;const last=`${file}.bili-last`;if(fs15.existsSync(file)){let cur;try{cur=hashText(fs15.readFileSync(file,"utf8"))}catch{return}let prev;try{prev=fs15.readFileSync(last,"utf8").trim()}catch{}if(!(prev===cur&&fs15.existsSync(bak)))fs15.copyFileSync(file,bak)}fs15.writeFileSync(file,text);try{fs15.writeFileSync(last,`${hashText(text)}
133
133
  `)}catch{}}function zcodePolicyFromEnv(env){const raw=(env.BILI_ZCODE_ROUTE??"").trim().toLowerCase();const route=raw==="plans"||raw==="none"?raw:"all";const signRaw=(env.BILI_ZCODE_SIGNING_FIXED??"").trim().toLowerCase();return{route,directPrefixes:zcodeDirectPrefixes(env),assumeSigningFixed:signRaw==="1"||signRaw==="true"}}function logNoRouteNextSteps(opts){const{kind,dataDir,env,origin,policy,skipped,log:log2}=opts;if(skipped.length>0&&skipped.every(s3=>s3.reason.includes("#1621"))){log2("every provider rule you defined is a v3.14+ client-signing coding-plan account (#1621); native URL-rewriting cannot compress them \u2014 use the cert-MITM path (Settings \u2192 Network: HTTP proxy + root CA path), the documented #1621 workaround (confirm it on your build/account).");return}if(skipped.length===0){let msg="no explicit provider rule in the personal store to wrap. This ZCode build resolves its active providers from the built-in/account layer, not from a config file \u2014 so an empty personal store does not mean 'nothing to route', only that there is nothing for native routing to intercept here.";if(kind==="new"){const legacyFile=zcodeStoreCandidates(dataDir,"legacy",env)[0];let legacyRecords=0;try{const applied=applyZcodeRouting(fs15.readFileSync(legacyFile,"utf8"),"legacy",origin,policy);legacyRecords=applied.wrapped.length+applied.skipped.length}catch{legacyRecords=0}if(legacyRecords>0){msg+=` (The legacy file ${legacyFile} still holds ${legacyRecords} provider record(s) from before the migration; this build does not read it as a provider source, so they are not routing candidates.)`}}msg+=" Coding-plan accounts are signing-protected (#1621) and need the cert-MITM path (Settings \u2192 Network); a custom non-signing provider can be added to the personal store to route natively.";log2(msg);return}}async function routeZcodeConfig(opts){const env=opts.env??process.env;const log2=opts.log??defaultLog;const dataDir=opts.dataDir??resolveZcodeDataDir(env);const v2Dir=path27.join(dataDir,"v2");const hasStore=fs15.existsSync(v2Dir)||zcodeStoreCandidates(dataDir,"new",env).some(f2=>fs15.existsSync(f2));if(!hasStore){log2(`no ${v2Dir} \u2014 nothing to route`);return void 0}const{kind,file}=detectZcodeStore(dataDir,env);const policy=opts.policy??defaultZcodeRoutePolicy();if(zcodeSigningBlocksRouting(kind,policy)){log2(SIGNING_BLOCK_MESSAGE);return void 0}let text;try{text=fs15.readFileSync(file,"utf8")}catch{log2(`no ${file} \u2014 nothing to route`);return void 0}const port=Number.parseInt(new URL(opts.origin).port,10);if(!Number.isInteger(port)||port<=0)throw new Error(`cannot derive a port from proxy origin ${opts.origin}`);const applied=applyZcodeRouting(text,kind,opts.origin,policy);if(applied.wrapped.length===0){log2("no routable provider entry found \u2014 leaving the config untouched");if(applied.skipped.length>0){log2(`skipped ${applied.skipped.length} entr${applied.skipped.length===1?"y":"ies"}: ${applied.skipped.map(s3=>`${s3.id} (${s3.reason})`).join("; ")}`)}logNoRouteNextSteps({kind,dataDir,env,origin:opts.origin,policy,skipped:applied.skipped,log:log2});return void 0}await withConfigLock(dataDir,()=>{snapshotAndWrite(file,applied.text)});const check=applyZcodeRouting(fs15.readFileSync(file,"utf8"),kind,opts.origin,policy);if(check.wrapped.length!==applied.wrapped.length||check.text!==applied.text){throw new Error(`zcode config rewrite verification failed for ${file}`)}if(applied.skipped.length>0){log2(`skipped ${applied.skipped.length} entr${applied.skipped.length===1?"y":"ies"}: ${applied.skipped.map(s3=>`${s3.id} (${s3.reason})`).join("; ")}`)}return{origin:opts.origin,port,kind,file,upstream:applied.wrapped[0].upstream,wrapped:applied.wrapped}}function defaultLog(msg){process.stderr.write(`[bili-zcode] ${msg}
134
134
  `)}var HOOK_HEALTH_DEADLINE_MS=4e3;function readStdinPayload(timeoutMs=5e3){return new Promise(resolve=>{let buf="";let done=false;const finish=()=>{if(done)return;done=true;clearTimeout(timer);process.stdin.removeAllListeners();try{resolve(JSON.parse(buf))}catch{resolve({})}};const timer=setTimeout(finish,timeoutMs);process.stdin.setEncoding("utf8");process.stdin.on("data",chunk=>{buf+=chunk});process.stdin.on("end",finish)})}async function main(){if(process.env.NODE_TEST_CONTEXT!==void 0)return;try{const payload=await readStdinPayload();const plan=planNativeZcode(process.env);if(plan.mode==="off")return;const policy=zcodePolicyFromEnv(process.env);if(policy.route==="none")return;const origin=plan.mode==="attach"?plan.attachOrigin:resolveProxyOrigin();if(!await waitForProxyHealthy(origin,HOOK_HEALTH_DEADLINE_MS))return;const applied=await routeZcodeConfig({origin,policy});if(!applied)return;const model=typeof payload.model==="string"&&payload.model.length>0?payload.model:"zcode";await reportRuntimeInfo(origin,{agent:"zcode",model,baseURL:applied.upstream,source:"session-start-hook"})}catch{return}}if(process.argv[1]&&/(?:^|[\\/])bootstrap-hook\.(?:ts|js)$/.test(process.argv[1])){runSessionStartHook(main)}export{main};
135
135
  /*! Bundled license information: