MCPcopy Index your code
hub / github.com/ChinaSiro/claude-code-sourcemap / dQ8

Function dQ8

package/cli.js:7874–7874  ·  view source on GitHub ↗
(q,K)

Source from the content-addressed store, hash-verified

7872`);if(M.length>=bCY)M.shift();M.push(G)});if(j.stdout)vFK({input:j.stdout}).on("line",(G)=>{if($)$.write(G+`
7873`);if(q.onDebug(`[bridge:ws] sessionId=${K.sessionId} <<< ${eK7(G)}`),q.verbose)process.stderr.write(G+`
7874`);let Z=uCY(G,K.sessionId,q.onDebug);for(let T of Z){if(H.length>=CCY)H.shift();H.push(T),J=T,q.onActivity?.(K.sessionId,T)}{let T;try{T=r8(G)}catch{}if(T&&typeof T==="object"){let v=T;if(v.type==="control_request"){if(v.request?.subtype==="can_use_tool"&&q.onPermissionRequest)q.onPermissionRequest(K.sessionId,T,K.accessToken)}else if(v.type==="user"&&!P&&K.onFirstUserMessage){let V=mCY(v);if(V)P=!0,K.onFirstUserMessage(V)}}}});let W=new Promise((f)=>{j.on("close",(G,Z)=>{if($)$.end(),$=null;if(Z==="SIGTERM"||Z==="SIGINT")q.onDebug(`[bridge:session] sessionId=${K.sessionId} interrupted signal=${Z} pid=${j.pid}`),f("interrupted");else if(G===0)q.onDebug(`[bridge:session] sessionId=${K.sessionId} completed exit_code=0 pid=${j.pid}`),f("completed");else q.onDebug(`[bridge:session] sessionId=${K.sessionId} failed exit_code=${G} pid=${j.pid}`),f("failed")}),j.on("error",(G)=>{q.onDebug(`[bridge:session] sessionId=${K.sessionId} spawn error: ${G.message}`),f("failed")})}),D={sessionId:K.sessionId,done:W,activities:H,accessToken:K.accessToken,lastStderr:M,get currentActivity(){return J},kill(){if(!j.killed)if(q.onDebug(`[bridge:session] Sending SIGTERM to sessionId=${K.sessionId} pid=${j.pid}`),process.platform==="win32")j.kill();else j.kill("SIGTERM")},forceKill(){if(!X&&j.pid)if(X=!0,q.onDebug(`[bridge:session] Sending SIGKILL to sessionId=${K.sessionId} pid=${j.pid}`),process.platform==="win32")j.kill();else j.kill("SIGKILL")},writeStdin(f){if(j.stdin&&!j.stdin.destroyed)q.onDebug(`[bridge:ws] sessionId=${K.sessionId} >>> ${eK7(f)}`),j.stdin.write(f)},updateAccessToken(f){D.accessToken=f,D.writeStdin(g6({type:"update_environment_variables",variables:{CLAUDE_CODE_SESSION_ACCESS_TOKEN:f}})+`
7875`),q.onDebug(`[bridge:session] Sent token refresh via stdin for sessionId=${K.sessionId}`)}};return D}}}var CCY=10,bCY=10,xCY;var kFK=y(()=>{l8();Ys();xCY={Read:"Reading",Write:"Writing",Edit:"Editing",MultiEdit:"Editing",Bash:"Running",Glob:"Searching",Grep:"Searching",WebFetch:"Fetching",WebSearch:"Searching",Task:"Running task",FileReadTool:"Reading",FileWriteTool:"Writing",FileEditTool:"Editing",GlobTool:"Searching",GrepTool:"Searching",BashTool:"Running",NotebookEditTool:"Editing notebook",LSP:"LSP"}});function UQ8(q){let K=Buffer.from(q,"base64url").toString("utf-8"),_=r8(K);if(!_||typeof _!=="object"||!("version"in _)||_.version!==1)throw Error(`Unsupported work secret version: ${_&&typeof _==="object"&&"version"in _?_.version:"unknown"}`);let z=_;if(typeof z.session_ingress_token!=="string"||z.session_ingress_token.length===0)throw Error("Invalid work secret: missing or empty session_ingress_token");if(typeof z.api_base_url!=="string")throw Error("Invalid work secret: missing api_base_url");return _}function QQ8(q,K){let _=q.includes("localhost")||q.includes("127.0.0.1"),z=_?"ws":"wss",Y=_?"v2":"v1",$=q.replace(/^https?:\/\//,"").replace(/\/+$/,"");return`${z}://${$}/${Y}/session_ingress/ws/${K}`}function lq8(q,K){if(q===K)return!0;let _=q.slice(q.lastIndexOf("_")+1),z=K.slice(K.lastIndexOf("_")+1);return _.length>=4&&_===z}function EJ6(q,K){return`${q.replace(/\/+$/,"")}/v1/code/sessions/${K}`}async function dQ8(q,K){let _=await $1.post(`${q}/worker/register`,{},{headers:{Authorization:`Bearer ${K}`,"Content-Type":"application/json","anthropic-version":"2023-06-01"},timeout:1e4}),z=_.data?.worker_epoch,Y=typeof z==="string"?Number(z):z;if(typeof Y!=="number"||!Number.isFinite(Y)||!Number.isSafeInteger(Y))throw Error(`registerWorker: invalid worker_epoch in response: ${g6(_.data)}`);return Y}var nq8=y(()=>{CK();l8()});var iq8={};T8(iq8,{writeBridgePointer:()=>nCY,readBridgePointerAcrossWorktrees:()=>iCY,readBridgePointer:()=>b_7,getBridgePointerPath:()=>cQ8,clearBridgePointer:()=>x_7,BRIDGE_POINTER_TTL_MS:()=>NFK});import{mkdir as BCY,readFile as gCY,stat as FCY,unlink as UCY,writeFile as QCY}from"fs/promises";import{dirname as dCY,join as cCY}from"path";function cQ8(q){return cCY(W41(),JP(q),"bridge-pointer.json")}async function nCY(q,K){let _=cQ8(q);try{await BCY(dCY(_),{recursive:!0}),await QCY(_,g6(K),"utf8"),N(`[bridge:pointer] wrote ${_}`)}catch(z){N(`[bridge:pointer] write failed: ${z}`,{level:"warn"})}}async function b_7(q){let K=cQ8(q),_,z;try{z=(await FCY(K)).mtimeMs,_=await gCY(K,"utf8")}catch{return null}let Y=lCY().safeParse(rCY(_));if(!Y.success)return N(`[bridge:pointer] invalid schema, clearing: ${K}`),await x_7(q),null;let $=Math.max(0,Date.now()-z);if($>NFK)return N(`[bridge:pointer] stale (>4h mtime), clearing: ${K}`),await x_7(q),null;return{...Y.data,ageMs:$}}async function iCY(q){let K=await b_7(q);if(K)return{pointer:K,dir:q};let _=await u$8(q);if(_.length<=1)return null;if(_.length>VFK)return N(`[bridge:pointer] ${_.length} worktrees exceeds fanout cap ${VFK}, skipping`),null;let z=JP(q),Y=_.filter((O)=>JP(O)!==z),$=await Promise.all(Y.map(async(O)=>{let w=await b_7(O);return w?{pointer:w,dir:O}:null})),A=null;for(let O of $)if(O&&(!A||O.pointer.ageMs<A.pointer.ageMs))A=O;if(A)N(`[bridge:pointer] fanout found pointer in worktree ${A.dir} (ageMs=${A.pointer.ageMs})`);return A}async function x_7(q){let K=cQ8(q);try{await UCY(K),N(`[bridge:pointer] cleared ${K}`)}catch(_){if(!_7(_))N(`[bridge:pointer] clear failed: ${_}`,{level:"warn"})}}function rCY(q){try{return r8(q)}catch{return null}}var VFK=50,NFK=14400000,lCY;var rq8=y(()=>{x7();_8();y8();m$8();QW6();l8();lCY=B6(()=>L.object({sessionId:L.string(),environmentId:L.string(),source:L.enum(["standalone","repl"])}))});import{dirname as oCY,join as EFK}from"path";function RFK(){return EFK($_6.errors(),LFK+".jsonl")}function I_7(q){return EFK($_6.mcpLogs(q),LFK+".jsonl")}function aCY(q){let K=gX6(q);return{write(_){K.write(g6(_)+`
7876`)},flush:K.flush,dispose:K.dispose}}function u_7(q){let K=yFK.get(q);if(!K){let _=oCY(q);K=aCY({writeFn:(z)=>{try{X8().appendFileSync(q,z)}catch{X8().mkdirSync(_),X8().appendFileSync(q,z)}},flushIntervalMs:1000,maxBufferSize:50}),yFK.set(q,K),pq(async()=>K?.dispose())}return K}function sCY(q,K){return}function tCY(q){if(typeof q==="string")return q;if(q&&typeof q==="object"){let K=q;if(typeof K.message==="string")return K.message;if(typeof K.error==="object"&&K.error&&"message"in K.error&&typeof K.error.message==="string")return K.error.message}return}function eCY(q){let K=q.stack||q.message,_="";if($1.isAxiosError(q)&&q.config?.url){let z=[`url=${q.config.url}`];if(q.response?.status!==void 0)z.push(`status=${q.response.status}`);let Y=tCY(q.response?.data);if(Y)z.push(`body=${Y}`);_=`[${z.join(",")}] `}N(`${q.name}: ${_}${K}`,{level:"error"}),sCY(RFK(),{error:`${_}${K}`})}function qbY(q,K){N(`MCP server "${q}" ${K}`,{level:"error"});let _=I_7(q),Y={error:K instanceof Error?K.stack||K.message:String(K),timestamp:new Date().toISOString(),sessionId:N8(),cwd:X8().cwd()};u_7(_).write(Y)}function KbY(q,K){N(`MCP server "${q}": ${K}`);let _=I_7(q),z={debug:K,timestamp:new Date().toISOString(),sessionId:N8(),cwd:X8().cwd()};u_7(_).write(z)}function hFK(){GL7({logError:eCY,logMCPError:qbY,logMCPDebug:KbY,getErrorsPath:RFK,getMCPLogsPath:I_7}),N("Error log sink initialized")}var LFK,yFK;var SFK=y(()=>{CK();v8();v$8();c9();_8();e7();E8();l8();LFK=ZL7(new Date);yFK=new Map});var lQ8={};T8(lQ8,{initSinks:()=>m_7});function m_7(){hFK(),tG6()}var oq8=y(()=>{xc6();SFK()});var F_7={};T8(F_7,{runBridgeLoop:()=>g_7,runBridgeHeadless:()=>ZbY,parseArgs:()=>BFK,isServerError:()=>pFK,isConnectionError:()=>mFK,bridgeMain:()=>fbY,BridgeHeadlessPermanentError:()=>tq8});import{randomUUID as nQ8}from"crypto";import{hostname as bFK,tmpdir as _bY}from"os";import{basename as zbY,join as YbY,resolve as p_7}from"path";async function IFK(){return FV("tengu_ccr_bridge_multi_session")}function CFK(q){return q.connCapMs*2}function uFK(){if(jj()||!process.argv[1])return[];return[process.argv[1]]}function ObY(q,K,_){try{return q.spawn(K,_)}catch(z){let Y=d6(z);return H6(Error(`Session spawn failed: ${Y}`)),Y}}async function g_7(q,K,_,z,Y,$,A,O=$bY,w,j){let H=new AbortController;if(A.aborted)H.abort();else A.addEventListener("abort",()=>H.abort(),{once:!0});let J=H.signal,M=new Map,X=new Map,P=new Map,W=new Map,D=new Map,f=new Map,G=new Set,Z=new Map,T=new Set,v=new Set,V=mQ8(J);async function E(){let w6=!1,o=!1,s=[];for(let[a]of M){let n=P.get(a),l=D.get(a);if(!n||!l)continue;try{await z.heartbeatWork(K,n,l),w6=!0}catch(A6){if(N(`[bridge:heartbeat] Failed for sessionId=${a} workId=${n}: ${d6(A6)}`),A6 instanceof PT)if(d("tengu_bridge_heartbeat_error",{status:A6.status,error_type:A6.status===401||A6.status===403?"auth_failed":"fatal"}),A6.status===401||A6.status===403)s.push(a);else o=!0}}for(let a of s){$.logVerbose(`Session ${a} token expired — re-queuing via bridge/reconnect`);try{await z.reconnectSession(K,a),N(`[bridge:heartbeat] Re-queued sessionId=${a} via bridge/reconnect`)}catch(n){$.logError(`Failed to refresh session ${a} token: ${d6(n)}`),N(`[bridge:heartbeat] reconnectSession(${a}) failed: ${d6(n)}`,{level:"error"})}}if(o)return"fatal";if(s.length>0)return"auth_failed";return w6?"ok":"failed"}let S=new Set,R=j?pQ8({getAccessToken:j,onRefresh:(w6,o)=>{let s=M.get(w6);if(!s)return;if(S.has(w6))$.logVerbose(`Refreshing session ${w6} token via bridge/reconnect`),z.reconnectSession(K,w6).catch((a)=>{$.logError(`Failed to refresh session ${w6} token: ${d6(a)}`),N(`[bridge:token] reconnectSession(${w6}) failed: ${d6(a)}`,{level:"error"})});else s.updateAccessToken(o)},label:"bridge"}):null,x=Date.now(),I=new Set;function B(w6){I.add(w6),w6.finally(()=>I.delete(w6))}let p=0,C=0,g=null,F=null,U=null,c=null,K6=!1;if(N(`[bridge:work] Starting poll loop spawnMode=${q.spawnMode} maxSessions=${q.maxSessions} environmentId=${K}`),c8("info","bridge_loop_started",{max_sessions:q.maxSessions,spawn_mode:q.spawnMode}),$.printBanner(q,K),$.updateSessionCount(0,q.maxSessions,q.spawnMode),w)$.setAttached(w);function t(){$.updateSessionCount(M.size,q.maxSessions,q.spawnMode);for(let[A6,J6]of M){let X6=J6.currentActivity;if(X6)$.updateSessionActivity(W.get(A6)??A6,X6)}if(M.size===0){$.updateIdleStatus();return}let[w6,o]=[...M.entries()].pop(),s=X.get(w6);if(!s)return;let a=o.currentActivity;if(!a||a.type==="result"||a.type==="error"){if(q.maxSessions>1)$.refreshDisplay();return}let n=I5(Date.now()-s),l=o.activities.filter((A6)=>A6.type==="tool_start").slice(-5).map((A6)=>A6.summary);$.updateSessionStatus(w6,n,a,l)}function q6(){e(),t(),c=setInterval(t,AbY)}function e(){if(c)clearInterval(c),c=null}function i(w6,o,s){return(a)=>{let n=P.get(w6);M.delete(w6),X.delete(w6),P.delete(w6),D.delete(w6);let l=W.get(w6)??w6;W.delete(w6),$.removeSession(l),v.delete(l),S.delete(w6);let A6=f.get(w6);if(A6)clearTimeout(A6),f.delete(w6);R?.cancel(w6),V.wake();let J6=T.delete(w6),X6=J6&&a==="interrupted"?"failed":a,f6=Date.now()-o;N(`[bridge:session] sessionId=${w6} workId=${n??"unknown"} exited status=${X6} duration=${I5(f6)}`),d("tengu_bridge_session_done",{status:X6,duration_ms:f6}),c8("info","bridge_session_done",{status:X6,duration_ms:f6}),$.clearStatus(),e();let N6=s.lastStderr.length>0?s.lastStderr.join(`
7877`):void 0,Z6;switch(X6){case"completed":$.logSessionComplete(w6,f6);break;case"failed":if(!J6&&!J.aborted)Z6=N6??"Process exited with error",$.logSessionFailed(w6,Z6),H6(Error(`Bridge session failed: ${Z6}`));break;case"interrupted":$.logVerbose(`Session ${w6} interrupted`);break}if(X6!=="interrupted"&&n)B(aq8(z,K,n,$,O.stopWorkBaseDelayMs)),G.add(n);let V6=Z.get(w6);if(V6)Z.delete(w6),B(QK6(V6.worktreePath,V6.worktreeBranch,V6.gitRoot,V6.hookBased).catch((y6)=>$.logVerbose(`Failed to remove worktree ${V6.worktreePath}: ${d6(y6)}`)));if(X6!=="interrupted"&&!J.aborted)if(q.spawnMode!=="single-session")B(z.archiveSession(l).catch((y6)=>$.logVerbose(`Failed to archive session ${w6}: ${d6(y6)}`))),N(`[bridge:session] Session ${X6}, returning to idle (multi-session mode)`);else{N(`[bridge:session] Session ${X6}, aborting poll loop to tear down environment`),H.abort();return}if(!J.aborted)q6()}}if(!w)q6();while(!J.aborted){let w6=bd();try{let o=await z.pollForWork(K,_,J,w6.reclaim_older_than_ms);if(g!==null||F!==null){let J6=Date.now()-(g??F??Date.now());$.logReconnected(J6),N(`[bridge:poll] Reconnected after ${I5(J6)}`),d("tengu_bridge_reconnected",{disconnected_ms:J6})}if(p=0,C=0,g=null,F=null,U=null,!o){if(M.size>=q.maxSessions){let X6=w6.multisession_poll_interval_ms_at_capacity;if(w6.non_exclusive_heartbeat_interval_ms>0){d("tengu_bridge_heartbeat_mode_entered",{active_sessions:M.size,heartbeat_interval_ms:w6.non_exclusive_heartbeat_interval_ms});let f6=X6>0?Date.now()+X6:null,N6="ok",Z6=0;while(!J.aborted&&M.size>=q.maxSessions&&(f6===null||Date.now()<f6)){let y6=bd();if(y6.non_exclusive_heartbeat_interval_ms<=0)break;let T6=V.signal();if(N6=await E(),N6==="auth_failed"||N6==="fatal"){T6.cleanup();break}Z6++,await R7(y6.non_exclusive_heartbeat_interval_ms,T6.signal),T6.cleanup()}let V6=N6==="auth_failed"||N6==="fatal"?N6:J.aborted?"shutdown":M.size<q.maxSessions?"capacity_changed":f6!==null&&Date.now()>=f6?"poll_due":"config_disabled";if(d("tengu_bridge_heartbeat_mode_exited",{reason:V6,heartbeat_cycles:Z6,active_sessions:M.size}),V6==="poll_due")N(`[bridge:poll] Heartbeat poll_due after ${Z6} cycles — falling through to pollForWork`);if(N6==="auth_failed"||N6==="fatal"){let y6=V.signal();await R7(X6>0?X6:w6.non_exclusive_heartbeat_interval_ms,y6.signal),y6.cleanup()}}else if(X6>0){let f6=V.signal();await R7(X6,f6.signal),f6.cleanup()}}else{let X6=M.size>0?w6.multisession_poll_interval_ms_partial_capacity:w6.multisession_poll_interval_ms_not_at_capacity;await R7(X6,J)}continue}let a=M.size>=q.maxSessions;if(G.has(o.id)){if(N(`[bridge:work] Skipping already-completed workId=${o.id}`),a){let J6=V.signal();if(w6.non_exclusive_heartbeat_interval_ms>0)await E(),await R7(w6.non_exclusive_heartbeat_interval_ms,J6.signal);else if(w6.multisession_poll_interval_ms_at_capacity>0)await R7(w6.multisession_poll_interval_ms_at_capacity,J6.signal);J6.cleanup()}else await R7(1000,J);continue}let n;try{n=UQ8(o.secret)}catch(J6){let X6=d6(J6);if($.logError(`Failed to decode work secret for workId=${o.id}: ${X6}`),d("tengu_bridge_work_secret_failed",{}),G.add(o.id),B(aq8(z,K,o.id,$,O.stopWorkBaseDelayMs)),a){let f6=V.signal();if(w6.non_exclusive_heartbeat_interval_ms>0)await E(),await R7(w6.non_exclusive_heartbeat_interval_ms,f6.signal);else if(w6.multisession_poll_interval_ms_at_capacity>0)await R7(w6.multisession_poll_interval_ms_at_capacity,f6.signal);f6.cleanup()}continue}let l=async()=>{N(`[bridge:work] Acknowledging workId=${o.id}`);try{await z.acknowledgeWork(K,o.id,n.session_ingress_token)}catch(J6){N(`[bridge:work] Acknowledge failed workId=${o.id}: ${d6(J6)}`)}},A6=o.data.type;switch(o.data.type){case"healthcheck":await l(),N("[bridge:work] Healthcheck received"),$.logVerbose("Healthcheck received");break;case"session":{let J6=o.data.id;try{XT(J6,"session_id")}catch{await l(),$.logError(`Invalid session_id received: ${J6}`);break}let X6=M.get(J6);if(X6){X6.updateAccessToken(n.session_ingress_token),D.set(J6,n.session_ingress_token),P.set(J6,o.id),R?.schedule(J6,n.session_ingress_token),N(`[bridge:work] Updated access token for existing sessionId=${J6} workId=${o.id}`),await l();break}if(M.size>=q.maxSessions){N(`[bridge:work] At capacity (${M.size}/${q.maxSessions}), cannot spawn new session for workId=${o.id}`);break}await l();let f6=Date.now(),N6,Z6=!1,V6;if(n.use_code_sessions===!0||i6(process.env.CLAUDE_BRIDGE_USE_CCR_V2)){N6=EJ6(q.apiBaseUrl,J6);for(let x6=1;x6<=2;x6++)try{V6=await dQ8(N6,n.session_ingress_token),Z6=!0,N(`[bridge:session] CCR v2: registered worker sessionId=${J6} epoch=${V6} attempt=${x6}`);break}catch(b6){let Q6=d6(b6);if(x6<2){if(N(`[bridge:session] CCR v2: registerWorker attempt ${x6} failed, retrying: ${Q6}`),await R7(2000,J),J.aborted)break;continue}$.logError(`CCR v2 worker registration failed for session ${J6}: ${Q6}`),H6(Error(`registerWorker failed: ${Q6}`)),G.add(o.id),B(aq8(z,K,o.id,$,O.stopWorkBaseDelayMs))}if(!Z6)break}else N6=QQ8(q.sessionIngressUrl,J6);let{spawnMode:y6,dir:T6}=q,n6=0;if(y6==="worktree"&&(w===void 0||!lq8(J6,w))){let x6=Date.now();try{let b6=await c88(`bridge-${FQ8(J6)}`);n6=Date.now()-x6,Z.set(J6,{worktreePath:b6.worktreePath,worktreeBranch:b6.worktreeBranch,gitRoot:b6.gitRoot,hookBased:b6.hookBased}),T6=b6.worktreePath,N(`[bridge:session] Created worktree for sessionId=${J6} at ${b6.worktreePath}`)}catch(b6){let Q6=d6(b6);$.logError(`Failed to create worktree for session ${J6}: ${Q6}`),H6(Error(`Worktree creation failed: ${Q6}`)),G.add(o.id),B(aq8(z,K,o.id,$,O.stopWorkBaseDelayMs));break}}N(`[bridge:session] Spawning sessionId=${J6} sdkUrl=${N6}`);let o6=FC(J6),I6=ObY(Y,{sessionId:J6,sdkUrl:N6,accessToken:n.session_ingress_token,useCcrV2:Z6,workerEpoch:V6,onFirstUserMessage:(x6)=>{if(v.has(o6))return;v.add(o6);let b6=WbY(x6);$.setSessionTitle(o6,b6),N(`[bridge:title] derived title for ${o6}: ${b6}`),Promise.resolve().then(() => (eH6(),DS6)).then(({updateBridgeSessionTitle:Q6})=>Q6(o6,b6,{baseUrl:q.apiBaseUrl})).catch((Q6)=>N(`[bridge:title] failed to update title for ${o6}: ${Q6}`,{level:"error"}))}},T6);if(typeof I6==="string"){$.logError(`Failed to spawn session ${J6}: ${I6}`);let x6=Z.get(J6);if(x6)Z.delete(J6),B(QK6(x6.worktreePath,x6.worktreeBranch,x6.gitRoot,x6.hookBased).catch((b6)=>$.logVerbose(`Failed to remove worktree ${x6.worktreePath}: ${d6(b6)}`)));G.add(o.id),B(aq8(z,K,o.id,$,O.stopWorkBaseDelayMs));break}let C6=I6,l6=Date.now()-f6;d("tengu_bridge_session_started",{active_sessions:M.size,spawn_mode:y6,in_worktree:Z.has(J6),spawn_duration_ms:l6,worktree_create_ms:n6,inProtectedNamespace:Ik()}),c8("info","bridge_session_started",{spawn_mode:y6,in_worktree:Z.has(J6),spawn_duration_ms:l6,worktree_create_ms:n6}),M.set(J6,C6),P.set(J6,o.id),D.set(J6,n.session_ingress_token),W.set(J6,o6);let S6=Date.now();X.set(J6,S6),$.logSessionStart(J6,`Session ${J6}`);let E6=FQ8(J6),R6;if(q.debugFile){let x6=q.debugFile.lastIndexOf(".");if(x6>0)R6=`${q.debugFile.slice(0,x6)}-${E6}${q.debugFile.slice(x6)}`;else R6=`${q.debugFile}-${E6}`}else if(q.verbose)R6=YbY(_bY(),"claude",`bridge-session-${E6}.log`);if(R6)$.logVerbose(`Debug log: ${R6}`);$.addSession(o6,MM(o6,q.sessionIngressUrl)),q6(),$.setAttached(o6),DbY(o6,q.apiBaseUrl).then((x6)=>{if(x6&&M.has(J6))v.add(o6),$.setSessionTitle(o6,x6),N(`[bridge:title] server title for ${o6}: ${x6}`)}).catch((x6)=>N(`[bridge:title] failed to fetch title for ${o6}: ${x6}`,{level:"error"}));let h6=q.sessionTimeoutMs??U57;if(h6>0){let x6=setTimeout(jbY,h6,J6,h6,$,T,C6);f.set(J6,x6)}if(Z6)S.add(J6);R?.schedule(J6,n.session_ingress_token),C6.done.then(i(J6,S6,C6));break}default:await l(),N(`[bridge:work] Unknown work type: ${A6}, skipping`);break}if(a){let J6=V.signal();if(w6.non_exclusive_heartbeat_interval_ms>0)await E(),await R7(w6.non_exclusive_heartbeat_interval_ms,J6.signal);else if(w6.multisession_poll_interval_ms_at_capacity>0)await R7(w6.multisession_poll_interval_ms_at_capacity,J6.signal);J6.cleanup()}}catch(o){if(J.aborted)break;if(o instanceof PT){if(K6=!0,bS6(o.errorType))$.logStatus(o.message);else if(vq8(o))N(`[bridge:work] Suppressed 403 error: ${o.message}`);else $.logError(o.message),H6(o);d("tengu_bridge_fatal_error",{status:o.status,error_type:o.errorType}),c8(bS6(o.errorType)?"info":"error","bridge_fatal_error",{status:o.status,error_type:o.errorType});break}let s=uF8(o);if(mFK(o)||pFK(o)){let a=Date.now();if(U!==null&&a-U>CFK(O))N(`[bridge:work] Detected system sleep (${Math.round((a-U)/1000)}s gap), resetting error budget`),c8("info","bridge_poll_sleep_detected",{gapMs:a-U}),g=null,p=0,F=null,C=0;if(U=a,!g)g=a;let n=a-g;if(n>=O.connGiveUpMs){$.logError(`Server unreachable for ${Math.round(n/60000)} minutes, giving up.`),d("tengu_bridge_poll_give_up",{error_type:"connection",elapsed_ms:n}),c8("error","bridge_poll_give_up",{error_type:"connection",elapsed_ms:n}),K6=!0;break}F=null,C=0,p=p?Math.min(p*2,O.connCapMs):O.connInitialMs;let l=B_7(p);if($.logVerbose(`Connection error, retrying in ${sq8(l)} (${Math.round(n/1000)}s elapsed): ${s}`),$.updateReconnectingStatus(sq8(l),I5(n)),bd().non_exclusive_heartbeat_interval_ms>0)await E();await R7(l,J)}else{let a=Date.now();if(U!==null&&a-U>CFK(O))N(`[bridge:work] Detected system sleep (${Math.round((a-U)/1000)}s gap), resetting error budget`),c8("info","bridge_poll_sleep_detected",{gapMs:a-U}),g=null,p=0,F=null,C=0;if(U=a,!F)F=a;let n=a-F;if(n>=O.generalGiveUpMs){$.logError(`Persistent errors for ${Math.round(n/60000)} minutes, giving up.`),d("tengu_bridge_poll_give_up",{error_type:"general",elapsed_ms:n}),c8("error","bridge_poll_give_up",{error_type:"general",elapsed_ms:n}),K6=!0;break}g=null,p=0,C=C?Math.min(C*2,O.generalCapMs):O.generalInitialMs;let l=B_7(C);if($.logVerbose(`Poll failed, retrying in ${sq8(l)} (${Math.round(n/1000)}s elapsed): ${s}`),$.updateReconnectingStatus(sq8(l),I5(n)),bd().non_exclusive_heartbeat_interval_ms>0)await E();await R7(l,J)}}}e(),$.clearStatus();let $6=Date.now()-x;d("tengu_bridge_shutdown",{active_sessions:M.size,loop_duration_ms:$6}),c8("info","bridge_shutdown",{active_sessions:M.size,loop_duration_ms:$6});let M6=new Set(M.keys());if(w)M6.add(w);let j6=new Map(W);if(M.size>0){N(`[bridge:shutdown] Shutting down ${M.size} active session(s)`),$.logStatus(`Shutting down ${M.size} active session(s)…`);let w6=new Map(P);for(let[s,a]of M.entries())N(`[bridge:shutdown] Sending SIGTERM to sessionId=${s}`),a.kill();let o=new AbortController;await Promise.race([Promise.allSettled([...M.values()].map((s)=>s.done)),R7(O.shutdownGraceMs??30000,o.signal)]),o.abort();for(let[s,a]of M.entries())N(`[bridge:shutdown] Force-killing stuck sessionId=${s}`),a.forceKill();for(let s of f.values())clearTimeout(s);if(f.clear(),R?.cancelAll(),Z.size>0){let s=[...Z.values()];Z.clear(),N(`[bridge:shutdown] Cleaning up ${s.length} worktree(s)`),await Promise.allSettled(s.map((a)=>QK6(a.worktreePath,a.worktreeBranch,a.gitRoot,a.hookBased)))}await Promise.allSettled([...w6.entries()].map(([s,a])=>{return z.stopWork(K,a,!0).catch((n)=>$.logVerbose(`Failed to stop work ${a} for session ${s}: ${d6(n)}`))}))}if(I.size>0)await Promise.allSettled([...I]);if(M6.size>0)N(`[bridge:shutdown] Archiving ${M6.size} session(s)`),await Promise.allSettled([...M6].map((w6)=>z.archiveSession(j6.get(w6)??FC(w6)).catch((o)=>$.logVerbose(`Failed to archive session ${w6}: ${d6(o)}`))));try{await z.deregisterEnvironment(K),N("[bridge:shutdown] Environment deregistered, bridge offline"),$.logVerbose("Environment deregistered.")}catch(w6){$.logVerbose(`Failed to deregister environment: ${d6(w6)}`)}let{clearBridgePointer:G6}=await Promise.resolve().then(() => (rq8(),iq8));await G6(q.dir),$.logVerbose("Environment offline.")}function mFK(q){if(q&&typeof q==="object"&&"code"in q&&typeof q.code==="string"&&wbY.has(q.code))return!0;return!1}function pFK(q){return!!q&&typeof q==="object"&&"code"in q&&typeof q.code==="string"&&q.code==="ERR_BAD_RESPONSE"}function B_7(q){return Math.max(0,q+q*0.25*(2*Math.random()-1))}function sq8(q){return q>=1000?`${(q/1000).toFixed(1)}s`:`${Math.round(q)}ms`}async function aq8(q,K,_,z,Y=1000){for(let A=1;A<=3;A++)try{await q.stopWork(K,_,!1),N(`[bridge:work] stopWork succeeded for workId=${_} on attempt ${A}/3`);return}catch(O){if(O instanceof PT){if(vq8(O))N(`[bridge:work] Suppressed stopWork 403 for ${_}: ${O.message}`);else z.logError(`Failed to stop work ${_}: ${O.message}`);c8("error","bridge_stop_work_failed",{attempts:A,fatal:!0});return}let w=d6(O);if(A<3){let j=B_7(Y*Math.pow(2,A-1));z.logVerbose(`Failed to stop work ${_} (attempt ${A}/3), retrying in ${sq8(j)}: ${w}`),await R7(j)}else z.logError(`Failed to stop work ${_} after 3 attempts: ${w}`),c8("error","bridge_stop_work_failed",{attempts:3})}}function jbY(q,K,_,z,Y){N(`[bridge:session] sessionId=${q} timed out after ${I5(K)}`),d("tengu_bridge_session_timeout",{timeout_ms:K}),_.logSessionFailed(q,`Session timed out after ${I5(K)}`),z.add(q),Y.kill()}function JbY(q){if(q==="session")return"single-session";if(q==="same-dir")return"same-dir";if(q==="worktree")return"worktree";return`--spawn requires one of: ${HbY.join(", ")} (got: ${q??"<missing>"})`}function MbY(q){let K=q===void 0?NaN:parseInt(q,10);if(isNaN(K)||K<1)return`--capacity requires a positive integer (got: ${q??"<missing>"})`;return K}function BFK(q){let K=!1,_=!1,z,Y,$,A,O=!1,w,j,H,J,M=!1;for(let P=0;P<q.length;P++){let W=q[P];if(W==="--help"||W==="-h")O=!0;else if(W==="--verbose"||W==="-v")K=!0;else if(W==="--sandbox")_=!0;else if(W==="--no-sandbox")_=!1;else if(W==="--debug-file"&&P+1<q.length)z=p_7(q[++P]);else if(W.startsWith("--debug-file="))z=p_7(W.slice(13));else if(W==="--session-timeout"&&P+1<q.length)Y=parseInt(q[++P],10)*1000;else if(W.startsWith("--session-timeout="))Y=parseInt(W.slice(18),10)*1000;else if(W==="--permission-mode"&&P+1<q.length)$=q[++P];else if(W.startsWith("--permission-mode="))$=W.slice(18);else if(W==="--name"&&P+1<q.length)A=q[++P];else if(W.startsWith("--name="))A=W.slice(7);else if(W==="--spawn"||W.startsWith("--spawn=")){if(w!==void 0)return X("--spawn may only be specified once");let D=W.startsWith("--spawn=")?W.slice(8):q[++P],f=JbY(D);if(f==="single-session"||f==="same-dir"||f==="worktree")w=f;else return X(f)}else if(W==="--capacity"||W.startsWith("--capacity=")){if(j!==void 0)return X("--capacity may only be specified once");let D=W.startsWith("--capacity=")?W.slice(11):q[++P],f=MbY(D);if(typeof f==="number")j=f;else return X(f)}else if(W==="--create-session-in-dir")H=!0;else if(W==="--no-create-session-in-dir")H=!1;else return X(`Unknown argument: ${W}

Callers 2

g_7Function · 0.85
j48Function · 0.85

Calls 3

g6Function · 0.85
postMethod · 0.80
isFiniteMethod · 0.80

Tested by

no test coverage detected