@anthropic-ai/claude-agent-sdk 0.2.101 → 0.2.104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/assistant.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  // (c) Anthropic PBC. All rights reserved. Use is subject to the Legal Agreements outlined here: https://code.claude.com/docs/en/legal-and-compliance.
2
2
 
3
- // Version: 0.2.101
3
+ // Version: 0.2.104
4
4
  import{createRequire as Ft}from"node:module";var Bt=Object.create;var{getPrototypeOf:It,defineProperty:HU,getOwnPropertyNames:cH,getOwnPropertyDescriptor:Et}=Object,uH=Object.prototype.hasOwnProperty;function pH(A){return this[A]}var Ct,Yt,SI=(A,Q,B)=>{var I=A!=null&&typeof A==="object";if(I){var E=Q?Ct??=new WeakMap:Yt??=new WeakMap,C=E.get(A);if(C)return C}B=A!=null?Bt(It(A)):{};let Y=Q||!A||!A.__esModule?HU(B,"default",{value:A,enumerable:!0}):B;for(let J of cH(A))if(!uH.call(Y,J))HU(Y,J,{get:pH.bind(A,J),enumerable:!0});if(I)E.set(A,Y);return Y},Jt=(A)=>{var Q=(mH??=new WeakMap).get(A),B;if(Q)return Q;if(Q=HU({},"__esModule",{value:!0}),A&&typeof A==="object"||typeof A==="function"){for(var I of cH(A))if(!uH.call(Q,I))HU(Q,I,{get:pH.bind(A,I),enumerable:!(B=Et(A,I))||B.enumerable})}return mH.set(A,Q),Q},mH,Z=(A,Q)=>()=>(Q||A((Q={exports:{}}).exports,Q),Q.exports);var Gt=(A)=>A;function Ut(A,Q){this[A]=Gt.bind(null,Q)}var eI=(A,Q)=>{for(var B in Q)HU(A,B,{get:Q[B],enumerable:!0,configurable:!0,set:Ut.bind(Q,B)})};var g=(A,Q)=>()=>(A&&(Q=A(A=0)),Q);var R=Ft(import.meta.url),Nt=Symbol.dispose||Symbol.for("Symbol.dispose"),Dt=Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose"),GQ=(A,Q,B)=>{if(Q!=null){if(typeof Q!=="object"&&typeof Q!=="function")throw TypeError('Object expected to be assigned to "using" declaration');var I;if(B)I=Q[Dt];if(I===void 0)I=Q[Nt];if(typeof I!=="function")throw TypeError("Object not disposable");A.push([B,I,Q])}else if(B)A.push([B]);return Q},UQ=(A,Q,B)=>{var I=typeof SuppressedError==="function"?SuppressedError:function(Y,J,G,U){return U=Error(G),U.name="SuppressedError",U.error=Y,U.suppressed=J,U},E=(Y)=>Q=B?new I(Y,Q,"An error was suppressed during disposal"):(B=!0,Y),C=(Y)=>{while(Y=A.pop())try{var J=Y[1]&&Y[1].call(Y[2]);if(Y[0])return Promise.resolve(J).then(C,(G)=>(E(G),C()))}catch(G){E(G)}if(B)throw Q};return C()};var Vt,dH;var nH=g(()=>{Vt=typeof global=="object"&&global&&global.Object===Object&&global,dH=Vt});var Xt,Mt,sY;var R1=g(()=>{nH();Xt=typeof self=="object"&&self&&self.Object===Object&&self,Mt=dH||Xt||Function("return this")(),sY=Mt});var wt,eY;var C2=g(()=>{R1();wt=sY.Symbol,eY=wt});function Kt(A){var Q=Zt.call(A,RU),B=A[RU];try{A[RU]=void 0;var I=!0}catch(C){}var E=zt.call(A);if(I)if(Q)A[RU]=B;else delete A[RU];return E}var oH,Zt,zt,RU,aH;var rH=g(()=>{C2();oH=Object.prototype,Zt=oH.hasOwnProperty,zt=oH.toString,RU=eY?eY.toStringTag:void 0;aH=Kt});function xt(A){return Lt.call(A)}var Ht,Lt,tH;var sH=g(()=>{Ht=Object.prototype,Lt=Ht.toString;tH=xt});function jt(A){if(A==null)return A===void 0?gt:Rt;return eH&&eH in Object(A)?aH(A):tH(A)}var Rt="[object Null]",gt="[object Undefined]",eH,AL;var QL=g(()=>{C2();rH();sH();eH=eY?eY.toStringTag:void 0;AL=jt});function qt(A){var Q=typeof A;return A!=null&&(Q=="object"||Q=="function")}var g1;var Y2=g(()=>{g1=qt});function _t(A){if(!g1(A))return!1;var Q=AL(A);return Q==St||Q==Pt||Q==Ot||Q==vt}var Ot="[object AsyncFunction]",St="[object Function]",Pt="[object GeneratorFunction]",vt="[object Proxy]",BL;var IL=g(()=>{QL();Y2();BL=_t});var Tt,j1;var EL=g(()=>{R1();Tt=sY["__core-js_shared__"],j1=Tt});function kt(A){return!!CL&&CL in A}var CL,YL;var JL=g(()=>{EL();CL=function(){var A=/[^.]+$/.exec(j1&&j1.keys&&j1.keys.IE_PROTO||"");return A?"Symbol(src)_1."+A:""}();YL=kt});function ft(A){if(A!=null){try{return yt.call(A)}catch(Q){}try{return A+""}catch(Q){}}return""}var bt,yt,GL;var UL=g(()=>{bt=Function.prototype,yt=bt.toString;GL=ft});function dt(A){if(!g1(A)||YL(A))return!1;var Q=BL(A)?it:mt;return Q.test(GL(A))}var ht,mt,ct,ut,pt,lt,it,FL;var NL=g(()=>{IL();JL();Y2();UL();ht=/[\\^$.*+?()[\]{}|]/g,mt=/^\[object .+?Constructor\]$/,ct=Function.prototype,ut=Object.prototype,pt=ct.toString,lt=ut.hasOwnProperty,it=RegExp("^"+pt.call(lt).replace(ht,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");FL=dt});function nt(A,Q){return A==null?void 0:A[Q]}var DL;var $L=g(()=>{DL=nt});function ot(A,Q){var B=DL(A,Q);return FL(B)?B:void 0}var q1;var J2=g(()=>{NL();$L();q1=ot});var at,tE;var gU=g(()=>{J2();at=q1(Object,"create"),tE=at});function rt(){this.__data__=tE?tE(null):{},this.size=0}var WL;var VL=g(()=>{gU();WL=rt});function tt(A){var Q=this.has(A)&&delete this.__data__[A];return this.size-=Q?1:0,Q}var XL;var ML=g(()=>{XL=tt});function Qs(A){var Q=this.__data__;if(tE){var B=Q[A];return B===st?void 0:B}return As.call(Q,A)?Q[A]:void 0}var st="__lodash_hash_undefined__",et,As,wL;var ZL=g(()=>{gU();et=Object.prototype,As=et.hasOwnProperty;wL=Qs});function Es(A){var Q=this.__data__;return tE?Q[A]!==void 0:Is.call(Q,A)}var Bs,Is,zL;var KL=g(()=>{gU();Bs=Object.prototype,Is=Bs.hasOwnProperty;zL=Es});function Ys(A,Q){var B=this.__data__;return this.size+=this.has(A)?0:1,B[A]=tE&&Q===void 0?Cs:Q,this}var Cs="__lodash_hash_undefined__",HL;var LL=g(()=>{gU();HL=Ys});function AJ(A){var Q=-1,B=A==null?0:A.length;this.clear();while(++Q<B){var I=A[Q];this.set(I[0],I[1])}}var G2;var xL=g(()=>{VL();ML();ZL();KL();LL();AJ.prototype.clear=WL;AJ.prototype.delete=XL;AJ.prototype.get=wL;AJ.prototype.has=zL;AJ.prototype.set=HL;G2=AJ});function Js(){this.__data__=[],this.size=0}var RL;var gL=g(()=>{RL=Js});function Gs(A,Q){return A===Q||A!==A&&Q!==Q}var jL;var qL=g(()=>{jL=Gs});function Us(A,Q){var B=A.length;while(B--)if(jL(A[B][0],Q))return B;return-1}var pC;var jU=g(()=>{qL();pC=Us});function Ds(A){var Q=this.__data__,B=pC(Q,A);if(B<0)return!1;var I=Q.length-1;if(B==I)Q.pop();else Ns.call(Q,B,1);return--this.size,!0}var Fs,Ns,OL;var SL=g(()=>{jU();Fs=Array.prototype,Ns=Fs.splice;OL=Ds});function $s(A){var Q=this.__data__,B=pC(Q,A);return B<0?void 0:Q[B][1]}var PL;var vL=g(()=>{jU();PL=$s});function Ws(A){return pC(this.__data__,A)>-1}var _L;var TL=g(()=>{jU();_L=Ws});function Vs(A,Q){var B=this.__data__,I=pC(B,A);if(I<0)++this.size,B.push([A,Q]);else B[I][1]=Q;return this}var kL;var bL=g(()=>{jU();kL=Vs});function QJ(A){var Q=-1,B=A==null?0:A.length;this.clear();while(++Q<B){var I=A[Q];this.set(I[0],I[1])}}var yL;var fL=g(()=>{gL();SL();vL();TL();bL();QJ.prototype.clear=RL;QJ.prototype.delete=OL;QJ.prototype.get=PL;QJ.prototype.has=_L;QJ.prototype.set=kL;yL=QJ});var Xs,hL;var mL=g(()=>{J2();R1();Xs=q1(sY,"Map"),hL=Xs});function Ms(){this.size=0,this.__data__={hash:new G2,map:new(hL||yL),string:new G2}}var cL;var uL=g(()=>{xL();fL();mL();cL=Ms});function ws(A){var Q=typeof A;return Q=="string"||Q=="number"||Q=="symbol"||Q=="boolean"?A!=="__proto__":A===null}var pL;var lL=g(()=>{pL=ws});function Zs(A,Q){var B=A.__data__;return pL(Q)?B[typeof Q=="string"?"string":"hash"]:B.map}var lC;var qU=g(()=>{lL();lC=Zs});function zs(A){var Q=lC(this,A).delete(A);return this.size-=Q?1:0,Q}var iL;var dL=g(()=>{qU();iL=zs});function Ks(A){return lC(this,A).get(A)}var nL;var oL=g(()=>{qU();nL=Ks});function Hs(A){return lC(this,A).has(A)}var aL;var rL=g(()=>{qU();aL=Hs});function Ls(A,Q){var B=lC(this,A),I=B.size;return B.set(A,Q),this.size+=B.size==I?0:1,this}var tL;var sL=g(()=>{qU();tL=Ls});function BJ(A){var Q=-1,B=A==null?0:A.length;this.clear();while(++Q<B){var I=A[Q];this.set(I[0],I[1])}}var U2;var eL=g(()=>{uL();dL();oL();rL();sL();BJ.prototype.clear=cL;BJ.prototype.delete=iL;BJ.prototype.get=nL;BJ.prototype.has=aL;BJ.prototype.set=tL;U2=BJ});function F2(A,Q){if(typeof A!="function"||Q!=null&&typeof Q!="function")throw TypeError(xs);var B=function(){var I=arguments,E=Q?Q.apply(this,I):I[0],C=B.cache;if(C.has(E))return C.get(E);var Y=A.apply(this,I);return B.cache=C.set(E,Y)||C,Y};return B.cache=new(F2.Cache||U2),B}var xs="Expected a function",gQ;var sE=g(()=>{eL();F2.Cache=U2;gQ=F2});import{homedir as Rs}from"os";import{join as gs}from"path";function N2(A){let Q=process.env.NODE_OPTIONS;if(!Q)return!1;return Q.split(/\s+/).includes(A)}function sA(A){if(!A)return!1;if(typeof A==="boolean")return A;let Q=String(A).toLowerCase().trim();return["1","true","yes","on"].includes(Q)}function Ax(){return!1}function Qx(){return{namespace:void 0,cluster:void 0}}var xE;var IB=g(()=>{sE();xE=gQ(()=>{return(process.env.CLAUDE_CONFIG_DIR??gs(Rs(),".claude")).normalize("NFC")},()=>process.env.CLAUDE_CONFIG_DIR)});function m(A,Q,B,I,E){if(I==="m")throw TypeError("Private method is not writable");if(I==="a"&&!E)throw TypeError("Private accessor was defined without a setter");if(typeof Q==="function"?A!==Q||!E:!Q.has(A))throw TypeError("Cannot write private member to an object whose class did not declare it");return I==="a"?E.call(A,B):E?E.value=B:Q.set(A,B),B}function j(A,Q,B,I){if(B==="a"&&!I)throw TypeError("Private accessor was defined without a getter");if(typeof Q==="function"?A!==Q||!I:!Q.has(A))throw TypeError("Cannot read private member from an object whose class did not declare it");return B==="m"?I:B==="a"?I.call(A):I?I.value:Q.get(A)}var eE=()=>{};var D2=function(){let{crypto:A}=globalThis;if(A?.randomUUID)return D2=A.randomUUID.bind(A),A.randomUUID();let Q=new Uint8Array(1),B=A?()=>A.getRandomValues(Q)[0]:()=>Math.random()*255&255;return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,(I)=>(+I^B()&15>>+I/4).toString(16))};function AC(A){return typeof A==="object"&&A!==null&&(("name"in A)&&A.name==="AbortError"||("message"in A)&&String(A.message).includes("FetchRequestCanceledException"))}var OU=(A)=>{if(A instanceof Error)return A;if(typeof A==="object"&&A!==null){try{if(Object.prototype.toString.call(A)==="[object Error]"){let Q=Error(A.message,A.cause?{cause:A.cause}:{});if(A.stack)Q.stack=A.stack;if(A.cause&&!Q.cause)Q.cause=A.cause;if(A.name)Q.name=A.name;return Q}}catch{}try{return Error(JSON.stringify(A))}catch{}}return Error(A)};var o,EB,wB,u0,SU,PU,vU,_U,TU,kU,bU,yU,fU;var cB=g(()=>{o=class o extends Error{};EB=class EB extends o{constructor(A,Q,B,I,E){super(`${EB.makeMessage(A,Q,B)}`);this.status=A,this.headers=I,this.requestID=I?.get("request-id"),this.error=Q,this.type=E??null}static makeMessage(A,Q,B){let I=Q?.message?typeof Q.message==="string"?Q.message:JSON.stringify(Q.message):Q?JSON.stringify(Q):B;if(A&&I)return`${A} ${I}`;if(A)return`${A} status code (no body)`;if(I)return I;return"(no status code or body)"}static generate(A,Q,B,I){if(!A||!I)return new u0({message:B,cause:OU(Q)});let E=Q,C=E?.error?.type;if(A===400)return new PU(A,E,B,I,C);if(A===401)return new vU(A,E,B,I,C);if(A===403)return new _U(A,E,B,I,C);if(A===404)return new TU(A,E,B,I,C);if(A===409)return new kU(A,E,B,I,C);if(A===422)return new bU(A,E,B,I,C);if(A===429)return new yU(A,E,B,I,C);if(A>=500)return new fU(A,E,B,I,C);return new EB(A,E,B,I,C)}};wB=class wB extends EB{constructor({message:A}={}){super(void 0,void 0,A||"Request was aborted.",void 0)}};u0=class u0 extends EB{constructor({message:A,cause:Q}){super(void 0,void 0,A||"Connection error.",void 0);if(Q)this.cause=Q}};SU=class SU extends u0{constructor({message:A}={}){super({message:A??"Request timed out."})}};PU=class PU extends EB{};vU=class vU extends EB{};_U=class _U extends EB{};TU=class TU extends EB{};kU=class kU extends EB{};bU=class bU extends EB{};yU=class yU extends EB{};fU=class fU extends EB{}});function O1(A){if(typeof A!=="object")return{};return A??{}}function V2(A){if(!A)return!0;for(let Q in A)return!1;return!0}function Ix(A,Q){return Object.prototype.hasOwnProperty.call(A,Q)}var qs,Bx=(A)=>{return qs.test(A)},$2=(A)=>($2=Array.isArray,$2(A)),W2,Ex=(A,Q)=>{if(typeof Q!=="number"||!Number.isInteger(Q))throw new o(`${A} must be an integer`);if(Q<0)throw new o(`${A} must be a positive integer`);return Q},S1=(A)=>{try{return JSON.parse(A)}catch(Q){return}};var p0=g(()=>{cB();qs=/^[a-z][a-z0-9+.-]*:/i,W2=$2});var Cx=(A)=>new Promise((Q)=>setTimeout(Q,A));var iC="0.81.0";function Os(){if(typeof Deno<"u"&&Deno.build!=null)return"deno";if(typeof EdgeRuntime<"u")return"edge";if(Object.prototype.toString.call(typeof globalThis.process<"u"?globalThis.process:0)==="[object process]")return"node";return"unknown"}function Ps(){if(typeof navigator>"u"||!navigator)return null;let A=[{key:"edge",pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"chrome",pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"firefox",pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"safari",pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}];for(let{key:Q,pattern:B}of A){let I=B.exec(navigator.userAgent);if(I){let E=I[1]||0,C=I[2]||0,Y=I[3]||0;return{browser:Q,version:`${E}.${C}.${Y}`}}}return null}var Ux=()=>{return typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u"},Ss=()=>{let A=Os();if(A==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":iC,"X-Stainless-OS":Jx(Deno.build.os),"X-Stainless-Arch":Yx(Deno.build.arch),"X-Stainless-Runtime":"deno","X-Stainless-Runtime-Version":typeof Deno.version==="string"?Deno.version:Deno.version?.deno??"unknown"};if(typeof EdgeRuntime<"u")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":iC,"X-Stainless-OS":"Unknown","X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":"edge","X-Stainless-Runtime-Version":globalThis.process.version};if(A==="node")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":iC,"X-Stainless-OS":Jx(globalThis.process.platform??"unknown"),"X-Stainless-Arch":Yx(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let Q=Ps();if(Q)return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":iC,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":`browser:${Q.browser}`,"X-Stainless-Runtime-Version":Q.version};return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":iC,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}},Yx=(A)=>{if(A==="x32")return"x32";if(A==="x86_64"||A==="x64")return"x64";if(A==="arm")return"arm";if(A==="aarch64"||A==="arm64")return"arm64";if(A)return`other:${A}`;return"unknown"},Jx=(A)=>{if(A=A.toLowerCase(),A.includes("ios"))return"iOS";if(A==="android")return"Android";if(A==="darwin")return"MacOS";if(A==="win32")return"Windows";if(A==="freebsd")return"FreeBSD";if(A==="openbsd")return"OpenBSD";if(A==="linux")return"Linux";if(A)return`Other:${A}`;return"Unknown"},Gx,Fx=()=>{return Gx??(Gx=Ss())};var X2=()=>{};function Nx(){if(typeof fetch<"u")return fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function M2(...A){let Q=globalThis.ReadableStream;if(typeof Q>"u")throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new Q(...A)}function P1(A){let Q=Symbol.asyncIterator in A?A[Symbol.asyncIterator]():A[Symbol.iterator]();return M2({start(){},async pull(B){let{done:I,value:E}=await Q.next();if(I)B.close();else B.enqueue(E)},async cancel(){await Q.return?.()}})}function hU(A){if(A[Symbol.asyncIterator])return A;let Q=A.getReader();return{async next(){try{let B=await Q.read();if(B?.done)Q.releaseLock();return B}catch(B){throw Q.releaseLock(),B}},async return(){let B=Q.cancel();return Q.releaseLock(),await B,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function Dx(A){if(A===null||typeof A!=="object")return;if(A[Symbol.asyncIterator]){await A[Symbol.asyncIterator]().return?.();return}let Q=A.getReader(),B=Q.cancel();Q.releaseLock(),await B}var $x=({headers:A,body:Q})=>{return{bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(Q)}};function Wx(A){return Object.entries(A).filter(([Q,B])=>typeof B<"u").map(([Q,B])=>{if(typeof B==="string"||typeof B==="number"||typeof B==="boolean")return`${encodeURIComponent(Q)}=${encodeURIComponent(B)}`;if(B===null)return`${encodeURIComponent(Q)}=`;throw new o(`Cannot stringify type ${typeof B}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join("&")}var Vx=g(()=>{cB()});function wx(A){let Q=0;for(let E of A)Q+=E.length;let B=new Uint8Array(Q),I=0;for(let E of A)B.set(E,I),I+=E.length;return B}function mU(A){let Q;return(Xx??(Q=new globalThis.TextEncoder,Xx=Q.encode.bind(Q)))(A)}function w2(A){let Q;return(Mx??(Q=new globalThis.TextDecoder,Mx=Q.decode.bind(Q)))(A)}var Xx,Mx;class dC{constructor(){JI.set(this,void 0),GI.set(this,void 0),m(this,JI,new Uint8Array,"f"),m(this,GI,null,"f")}decode(A){if(A==null)return[];let Q=A instanceof ArrayBuffer?new Uint8Array(A):typeof A==="string"?mU(A):A;m(this,JI,wx([j(this,JI,"f"),Q]),"f");let B=[],I;while((I=Ts(j(this,JI,"f"),j(this,GI,"f")))!=null){if(I.carriage&&j(this,GI,"f")==null){m(this,GI,I.index,"f");continue}if(j(this,GI,"f")!=null&&(I.index!==j(this,GI,"f")+1||I.carriage)){B.push(w2(j(this,JI,"f").subarray(0,j(this,GI,"f")-1))),m(this,JI,j(this,JI,"f").subarray(j(this,GI,"f")),"f"),m(this,GI,null,"f");continue}let E=j(this,GI,"f")!==null?I.preceding-1:I.preceding,C=w2(j(this,JI,"f").subarray(0,E));B.push(C),m(this,JI,j(this,JI,"f").subarray(I.index),"f"),m(this,GI,null,"f")}return B}flush(){if(!j(this,JI,"f").length)return[];return this.decode(`
5
5
  `)}}function Ts(A,Q){for(let E=Q??0;E<A.length;E++){if(A[E]===10)return{preceding:E,index:E+1,carriage:!1};if(A[E]===13)return{preceding:E,index:E+1,carriage:!0}}return null}function Zx(A){for(let I=0;I<A.length-1;I++){if(A[I]===10&&A[I+1]===10)return I+2;if(A[I]===13&&A[I+1]===13)return I+2;if(A[I]===13&&A[I+1]===10&&I+3<A.length&&A[I+2]===13&&A[I+3]===10)return I+4}return-1}var JI,GI;var Z2=g(()=>{eE();JI=new WeakMap,GI=new WeakMap;dC.NEWLINE_CHARS=new Set([`
6
6
  `,"\r"]);dC.NEWLINE_REGEXP=/\r\n|[\n\r]/g});function cU(){}function v1(A,Q,B){if(!Q||_1[A]>_1[B])return cU;else return Q[A].bind(Q)}function FB(A){let Q=A.logger,B=A.logLevel??"off";if(!Q)return ks;let I=zx.get(Q);if(I&&I[0]===B)return I[1];let E={error:v1("error",Q,B),warn:v1("warn",Q,B),info:v1("info",Q,B),debug:v1("debug",Q,B)};return zx.set(Q,[B,E]),E}var _1,z2=(A,Q,B)=>{if(!A)return;if(Ix(_1,A))return A;FB(B).warn(`${Q} was set to ${JSON.stringify(A)}, expected one of ${JSON.stringify(Object.keys(_1))}`);return},ks,zx,QC=(A)=>{if(A.options)A.options={...A.options},delete A.options.headers;if(A.headers)A.headers=Object.fromEntries((A.headers instanceof Headers?[...A.headers]:Object.entries(A.headers)).map(([Q,B])=>[Q,Q.toLowerCase()==="x-api-key"||Q.toLowerCase()==="authorization"||Q.toLowerCase()==="cookie"||Q.toLowerCase()==="set-cookie"?"***":B]));if("retryOfRequestLogID"in A){if(A.retryOfRequestLogID)A.retryOf=A.retryOfRequestLogID;delete A.retryOfRequestLogID}return A};var T1=g(()=>{p0();_1={off:0,error:200,warn:300,info:400,debug:500};ks={error:cU,warn:cU,info:cU,debug:cU},zx=new WeakMap});async function*bs(A,Q){if(!A.body){if(Q.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative")throw new o("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api");throw new o("Attempted to iterate over a response with no body")}let B=new Kx,I=new dC,E=hU(A.body);for await(let C of ys(E))for(let Y of I.decode(C)){let J=B.decode(Y);if(J)yield J}for(let C of I.flush()){let Y=B.decode(C);if(Y)yield Y}}async function*ys(A){let Q=new Uint8Array;for await(let B of A){if(B==null)continue;let I=B instanceof ArrayBuffer?new Uint8Array(B):typeof B==="string"?mU(B):B,E=new Uint8Array(Q.length+I.length);E.set(Q),E.set(I,Q.length),Q=E;let C;while((C=Zx(Q))!==-1)yield Q.slice(0,C),Q=Q.slice(C)}if(Q.length>0)yield Q}class Kx{constructor(){this.event=null,this.data=[],this.chunks=[]}decode(A){if(A.endsWith("\r"))A=A.substring(0,A.length-1);if(!A){if(!this.event&&!this.data.length)return null;let E={event:this.event,data:this.data.join(`
@@ -178,7 +178,7 @@ ${I.message}`:V,z=[H,Q,A].filter(Boolean).join(`
178
178
  `)){let I=B.match(/^(ID|VERSION_ID)=(.*)$/);if(I&&I[1]&&I[2]){let E=I[2].replace(/^"|"$/g,"");if(I[1]==="ID")A.linuxDistroId=E;else A.linuxDistroVersion=E}}}catch{}return A});FQ();import{AsyncLocalStorage as AXA}from"async_hooks";var $BQ=new AXA;IB();function EXA(){return Ah(xE(),"sessions")}var ef=Promise.resolve();async function CXA(A){let Q=Ah(EXA(),`${process.pid}.json`),B=ef.then(async()=>{try{let I=OQ(await BXA(Q,"utf8"));await IXA(Q,KA({...I,...A}))}catch(I){w(`[concurrentSessions] updatePidFile failed: ${YA(I)}`)}});ef=B,await B}async function Qh(A){await CXA({bridgeSessionId:A})}ZQ();pQ();YC();YC();ZQ();IB();pQ();jE();import{mkdirSync as YXA,writeFileSync as JXA}from"fs";var AV="/home/claude/.claude/remote",rBQ=`${AV}/.oauth_token`,tBQ=`${AV}/.api_key`,QV=`${AV}/.session_ingress_token`;function Bh(A,Q,B){if(!sA(process.env.CLAUDE_CODE_REMOTE))return;try{YXA(AV,{recursive:!0,mode:448}),JXA(A,Q,{encoding:"utf8",mode:384}),w(`Persisted ${B} to ${A} for subprocess access`)}catch(I){w(`Failed to persist ${B} to disk (non-fatal): ${YA(I)}`,{level:"error"})}}function TK(A,Q){try{let I=rQ().readFileSync(A,{encoding:"utf8"}).trim();if(!I)return null;return w(`Read ${Q} from well-known file ${A}`),I}catch(B){if(!CC(B))w(`Failed to read ${Q} from ${A}: ${YA(B)}`,{level:"debug"});return null}}ZQ();pQ();jE();function GXA(){let A=YR();if(A!==void 0)return A;let Q=process.env.CLAUDE_CODE_WEBSOCKET_AUTH_FILE_DESCRIPTOR;if(!Q){let I=process.env.CLAUDE_SESSION_INGRESS_TOKEN_FILE??QV,E=TK(I,"session ingress token");return MJ(E),E}let B=parseInt(Q,10);if(Number.isNaN(B))return w(`CLAUDE_CODE_WEBSOCKET_AUTH_FILE_DESCRIPTOR must be a valid file descriptor number, got: ${Q}`,{level:"error"}),MJ(null),null;try{let I=rQ(),E=process.platform==="darwin"||process.platform==="freebsd"?`/dev/fd/${B}`:`/proc/self/fd/${B}`,C=I.readFileSync(E,{encoding:"utf8"}).trim();if(!C)return w("File descriptor contained empty token",{level:"error"}),MJ(null),null;return w(`Successfully read token from file descriptor ${B}`),MJ(C),Bh(QV,C,"session ingress token"),C}catch(I){w(`Failed to read token from file descriptor ${B}: ${YA(I)}`,{level:"error"});let E=process.env.CLAUDE_SESSION_INGRESS_TOKEN_FILE??QV,C=TK(E,"session ingress token");return MJ(C),C}}function UD(){let A=process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN;if(A)return A;return GXA()}function BV(){let A=UD();if(!A)return{};if(A.startsWith("sk-ant-sid")){let Q={Cookie:`sessionKey=${A}`},B=process.env.CLAUDE_CODE_ORGANIZATION_UUID;if(B)Q["X-Organization-Uuid"]=B;return Q}return{Authorization:`Bearer ${A}`}}function FD(A){process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN=A}FQ();class VG extends Error{retryAfterMs;constructor(A,Q){super(A);this.retryAfterMs=Q}}class LY{pending=[];pendingAtClose=0;draining=!1;closed=!1;backpressureResolvers=[];sleepResolve=null;flushResolvers=[];droppedBatches=0;config;constructor(A){this.config=A}get droppedBatchCount(){return this.droppedBatches}get pendingCount(){return this.closed?this.pendingAtClose:this.pending.length}async enqueue(A){if(this.closed)return;let Q=Array.isArray(A)?A:[A];if(Q.length===0)return;while(this.pending.length+Q.length>this.config.maxQueueSize&&!this.closed)await new Promise((B)=>{this.backpressureResolvers.push(B)});if(this.closed)return;this.pending.push(...Q),this.drain()}flush(){if(this.pending.length===0&&!this.draining)return Promise.resolve();return this.drain(),new Promise((A)=>{this.flushResolvers.push(A)})}close(){if(this.closed)return;this.closed=!0,this.pendingAtClose=this.pending.length,this.pending=[],this.sleepResolve?.(),this.sleepResolve=null;for(let A of this.backpressureResolvers)A();this.backpressureResolvers=[];for(let A of this.flushResolvers)A();this.flushResolvers=[]}async drain(){if(this.draining||this.closed)return;this.draining=!0;let A=0;try{while(this.pending.length>0&&!this.closed){let Q=this.takeBatch();if(Q.length===0)continue;try{await this.config.send(Q),A=0}catch(B){if(A++,this.config.maxConsecutiveFailures!==void 0&&A>=this.config.maxConsecutiveFailures){this.droppedBatches++,this.config.onBatchDropped?.(Q.length,A),A=0,this.releaseBackpressure();continue}this.pending=Q.concat(this.pending);let I=B instanceof VG?B.retryAfterMs:void 0;await this.sleep(this.retryDelay(A,I));continue}this.releaseBackpressure()}}finally{if(this.draining=!1,this.pending.length===0){for(let Q of this.flushResolvers)Q();this.flushResolvers=[]}}}takeBatch(){let{maxBatchSize:A,maxBatchBytes:Q}=this.config;if(Q===void 0)return this.pending.splice(0,A);let B=0,I=0;while(I<this.pending.length&&I<A){let E;try{E=Buffer.byteLength(KA(this.pending[I]))}catch{this.pending.splice(I,1);continue}if(I>0&&B+E>Q)break;B+=E,I++}return this.pending.splice(0,I)}retryDelay(A,Q){let B=Math.random()*this.config.jitterMs;if(Q!==void 0)return Math.max(this.config.baseDelayMs,Math.min(Q,this.config.maxDelayMs))+B;return Math.min(this.config.baseDelayMs*2**(A-1),this.config.maxDelayMs)+B}releaseBackpressure(){let A=this.backpressureResolvers;this.backpressureResolvers=[];for(let Q of A)Q()}sleep(A){return new Promise((Q)=>{this.sleepResolve=Q,setTimeout((B,I)=>{B.sleepResolve=null,I()},A,this,Q)})}}class kK{capacity;buffer;head=0;size=0;constructor(A){this.capacity=A;this.buffer=Array(A)}add(A){if(this.buffer[this.head]=A,this.head=(this.head+1)%this.capacity,this.size<this.capacity)this.size++}addAll(A){for(let Q of A)this.add(Q)}getRecent(A){let Q=[],B=this.size<this.capacity?0:this.head,I=Math.min(A,this.size);for(let E=0;E<I;E++){let C=(B+this.size-I+E)%this.capacity;Q.push(this.buffer[C])}return Q}toArray(){if(this.size===0)return[];let A=[],Q=this.size<this.capacity?0:this.head;for(let B=0;B<this.size;B++){let I=(Q+B)%this.capacity;A.push(this.buffer[I])}return A}clear(){this.buffer.length=0,this.head=0,this.size=0}length(){return this.size}}ZQ();IB();sE();import{Agent as FXA}from"https";sE();function Ih(A){return[...new Set(A)]}ZQ();IB();jE();var Eh=["bundled","system"];function UXA(){let A=process.env.CLAUDE_CODE_CERT_STORE;if(A){let Q=[];for(let B of A.split(",")){let I=B.trim().toLowerCase();if(I==="bundled"||I==="system"){if(!Q.includes(I))Q.push(I)}else if(I)w(`CA certs: unrecognized CLAUDE_CODE_CERT_STORE source '${I}', ignoring`,{level:"warn"})}return Q.length>0?Q:Eh}if(N2("--use-system-ca")||N2("--use-openssl-ca"))return["system"];return Eh}var XG=gQ(()=>{let A=UXA(),Q=process.env.NODE_EXTRA_CA_CERTS,B=A.includes("bundled"),I=A.includes("system");if(w(`CA certs: stores=${A.join(",")}, extraCertsPath=${Q}`),typeof Bun>"u"&&!Q&&!process.env.CLAUDE_CODE_CERT_STORE)return;let E=R("tls"),C=E.getCACertificates;if(!B&&I&&!C){w("CA certs: stores=system but system CA API unavailable, deferring to runtime");return}let Y=[];if(B)Y.push(...E.rootCertificates),w(`CA certs: Loaded ${E.rootCertificates.length} bundled root certificates`);if(I)try{let J=C?.("system");if(J&&J.length>0)Y.push(...J),w(`CA certs: Loaded ${J.length} system CA certificates`);else if(w(`CA certs: system store ${C?"returned empty":"unavailable"}`),!B)Y.push(...E.rootCertificates)}catch(J){if(w(`CA certs: Failed to load system CA certificates: ${J}`,{level:"error"}),!B)Y.push(...E.rootCertificates)}if(Q)try{let J=rQ().readFileSync(Q,{encoding:"utf8"});Y.push(J),w(`CA certs: Appended extra certificates from NODE_EXTRA_CA_CERTS (${Q})`)}catch(J){w(`CA certs: Failed to read NODE_EXTRA_CA_CERTS file (${Q}): ${J}`,{level:"error"})}return Y.length>0?Ih(Y):void 0});ZQ();jE();var ND=gQ(()=>{let A={};if(process.env.CLAUDE_CODE_CLIENT_CERT)try{A.cert=rQ().readFileSync(process.env.CLAUDE_CODE_CLIENT_CERT,{encoding:"utf8"}),w("mTLS: Loaded client certificate from CLAUDE_CODE_CLIENT_CERT")}catch(Q){w(`mTLS: Failed to load client certificate: ${Q}`,{level:"error"})}if(process.env.CLAUDE_CODE_CLIENT_KEY)try{A.key=rQ().readFileSync(process.env.CLAUDE_CODE_CLIENT_KEY,{encoding:"utf8"}),w("mTLS: Loaded client key from CLAUDE_CODE_CLIENT_KEY")}catch(Q){w(`mTLS: Failed to load client key: ${Q}`,{level:"error"})}if(process.env.CLAUDE_CODE_CLIENT_KEY_PASSPHRASE)A.passphrase=process.env.CLAUDE_CODE_CLIENT_KEY_PASSPHRASE,w("mTLS: Using client key passphrase");if(Object.keys(A).length===0)return;return A}),Ch=gQ(()=>{let A=ND(),Q=XG();if(!A&&!Q)return;let B={...A,...Q&&{ca:Q},keepAlive:!0};return w("mTLS: Creating HTTPS agent with custom certificates"),new FXA(B)});function bK(){let A=ND(),Q=XG();if(!A&&!Q)return;return{...A,...Q&&{ca:Q}}}sE();var Xa=SI(zh(),1);ZQ();IB();function aRA(A){switch(A.family){case 0:case 4:case 6:return A.family;case"IPv6":return 6;case"IPv4":case void 0:return 4;default:throw Error(`Unsupported address family: ${A.family}`)}}function YH(A=process.env){return A.https_proxy||A.HTTPS_PROXY||A.http_proxy||A.HTTP_PROXY}function rRA(A=process.env){return A.no_proxy||A.NO_PROXY}function JH(A,Q=rRA()){if(!Q)return!1;if(Q==="*")return!0;try{let B=new URL(A),I=B.hostname.toLowerCase(),E=B.port||(B.protocol==="https:"?"443":"80"),C=`${I}:${E}`;return Q.split(/[,\s]+/).filter(Boolean).some((J)=>{if(J=J.toLowerCase().trim(),J.includes(":"))return C===J;if(J.startsWith(".")){let G=J;return I===J.substring(1)||I.endsWith(G)}return I===J})}catch{return!1}}function Ma(A,Q={}){let B=ND(),I=XG(),E={...B&&{cert:B.cert,key:B.key,passphrase:B.passphrase},...I&&{ca:I}};if(sA(process.env.CLAUDE_CODE_PROXY_RESOLVES_HOSTS))E.lookup=(C,Y,J)=>{J(null,C,aRA(Y))};return new Xa.HttpsProxyAgent(A,{...E,...Q})}function wa(A={}){let Q=YH(),B=Ch(),I=fQ.create({proxy:!1});if(!Q){if(B)I.defaults.httpsAgent=B;return I}let E=Ma(Q,A);return I.interceptors.request.use((C)=>{if(C.url&&JH(C.url))C.httpsAgent=B,C.httpAgent=B;else C.httpsAgent=E,C.httpAgent=E;return C}),I}var MCQ=gQ((A)=>{let Q=Va(),B=ND(),I=XG(),E={httpProxy:A,httpsProxy:A,noProxy:process.env.NO_PROXY||process.env.no_proxy};if(B||I){let C={...B&&{cert:B.cert,key:B.key,passphrase:B.passphrase},...I&&{ca:I}};E.connect=C,E.requestTls=C}return new Q.EnvHttpProxyAgent(E)});function Za(A){let Q=YH();if(!Q)return;if(JH(A))return;return Ma(Q)}function za(A){let Q=YH();if(!Q)return;if(JH(A))return;return Q}wF();IB();var tRA=30000,UH=null,Ka=0;var $1=null,GH=null;function sRA(){Ha(),$1=setInterval(()=>{if(i("debug","session_keepalive_heartbeat",{refcount:Ka}),sA(process.env.CLAUDE_CODE_REMOTE_SEND_KEEPALIVES))UH?.()},tRA)}function Ha(){if(GH!==null)clearTimeout(GH),GH=null}function f9(A){if(UH=A,Ka>0&&$1===null)sRA()}function W1(){if(UH=null,$1!==null)clearInterval($1),$1=null;Ha()}FQ();var MjA=`{"type":"keep_alive"}
179
179
  `,wjA=1000,ZjA=1000,vr=30000,zjA=600000,KjA=1e4,HjA=300000,Pr=vr*2,LjA=new Set([1002,4001,4003]);class RH{ws=null;lastSentId=null;url;state="idle";onData;onCloseCallback;onConnectCallback;headers;sessionId;autoReconnect;isBridge;reconnectAttempts=0;reconnectStartTime=null;reconnectTimer=null;lastReconnectAttemptTime=null;lastActivityTime=0;pingInterval=null;pongReceived=!0;keepAliveInterval=null;messageBuffer;isBunWs=!1;connectStartTime=0;refreshHeaders;constructor(A,Q={},B,I,E){this.url=A,this.headers=Q,this.sessionId=B,this.refreshHeaders=I,this.autoReconnect=E?.autoReconnect??!0,this.isBridge=E?.isBridge??!1,this.messageBuffer=new kK(wjA)}async connect(){if(this.state!=="idle"&&this.state!=="reconnecting"){w(`WebSocketTransport: Cannot connect, current state is ${this.state}`,{level:"error"}),i("error","cli_websocket_connect_failed");return}this.state="reconnecting",this.connectStartTime=Date.now(),w(`WebSocketTransport: Opening ${this.url.href}`),i("info","cli_websocket_connect_opening");let A={...this.headers};if(this.lastSentId)A["X-Last-Request-Id"]=this.lastSentId,w(`WebSocketTransport: Adding X-Last-Request-Id header: ${this.lastSentId}`);if(typeof Bun<"u"){let Q=new globalThis.WebSocket(this.url.href,{headers:A,proxy:za(this.url.href),tls:bK()||void 0});this.ws=Q,this.isBunWs=!0,Q.addEventListener("open",this.onBunOpen),Q.addEventListener("message",this.onBunMessage),Q.addEventListener("error",this.onBunError),Q.addEventListener("close",this.onBunClose),Q.addEventListener("pong",this.onPong)}else{let{default:Q}=await Promise.resolve().then(() => (Sr(),Or)),B=new Q(this.url.href,{headers:A,agent:Za(this.url.href),...bK()});this.ws=B,this.isBunWs=!1,B.on("open",this.onNodeOpen),B.on("message",this.onNodeMessage),B.on("error",this.onNodeError),B.on("close",this.onNodeClose),B.on("pong",this.onPong)}}onBunOpen=()=>{if(this.handleOpenEvent(),this.lastSentId)this.replayBufferedMessages("")};onBunMessage=(A)=>{let Q=typeof A.data==="string"?A.data:String(A.data);if(this.lastActivityTime=Date.now(),i("info","cli_websocket_message_received",{length:Q.length}),this.onData)this.onData(Q)};onBunError=()=>{w("WebSocketTransport: Error",{level:"error"}),i("error","cli_websocket_connect_error")};onBunClose=(A)=>{let Q=A.code===1000||A.code===1001;w(`WebSocketTransport: Closed: ${A.code}`,Q?void 0:{level:"error"}),i("error","cli_websocket_connect_closed"),this.handleConnectionError(A.code)};onNodeOpen=()=>{let A=this.ws;if(this.handleOpenEvent(),!A)return;let B=A.upgradeReq;if(B?.headers?.["x-last-request-id"]){let I=B.headers["x-last-request-id"];this.replayBufferedMessages(I)}};onNodeMessage=(A)=>{let Q=A.toString();if(this.lastActivityTime=Date.now(),i("info","cli_websocket_message_received",{length:Q.length}),this.onData)this.onData(Q)};onNodeError=(A)=>{w(`WebSocketTransport: Error: ${A.message}`,{level:"error"}),i("error","cli_websocket_connect_error")};onNodeClose=(A,Q)=>{let B=A===1000||A===1001;w(`WebSocketTransport: Closed: ${A}`,B?void 0:{level:"error"}),i("error","cli_websocket_connect_closed"),this.handleConnectionError(A)};onPong=()=>{this.pongReceived=!0};handleOpenEvent(){let A=Date.now()-this.connectStartTime;if(w("WebSocketTransport: Connected"),i("info","cli_websocket_connect_connected",{duration_ms:A}),this.isBridge&&this.reconnectStartTime!==null)rA("tengu_ws_transport_reconnected",{attempts:this.reconnectAttempts,downtimeMs:Date.now()-this.reconnectStartTime});this.reconnectAttempts=0,this.reconnectStartTime=null,this.lastReconnectAttemptTime=null,this.lastActivityTime=Date.now(),this.state="connected",this.onConnectCallback?.(),this.startPingInterval(),this.startKeepaliveInterval(),f9(()=>{this.write({type:"keep_alive"})})}sendLine(A){if(!this.ws||this.state!=="connected")return w("WebSocketTransport: Not connected"),i("info","cli_websocket_send_not_connected"),!1;try{return this.ws.send(A),this.lastActivityTime=Date.now(),!0}catch(Q){return w(`WebSocketTransport: Failed to send: ${Q}`,{level:"error"}),i("error","cli_websocket_send_error"),this.handleConnectionError(),!1}}removeWsListeners(A){if(this.isBunWs){let Q=A;Q.removeEventListener("open",this.onBunOpen),Q.removeEventListener("message",this.onBunMessage),Q.removeEventListener("error",this.onBunError),Q.removeEventListener("close",this.onBunClose),Q.removeEventListener("pong",this.onPong)}else{let Q=A;Q.off("open",this.onNodeOpen),Q.off("message",this.onNodeMessage),Q.off("error",this.onNodeError),Q.off("close",this.onNodeClose),Q.off("pong",this.onPong)}}doDisconnect(){if(this.stopPingInterval(),this.stopKeepaliveInterval(),W1(),this.ws)this.removeWsListeners(this.ws),this.ws.close(),this.ws=null}handleConnectionError(A){if(w(`WebSocketTransport: Disconnected from ${this.url.href}`+(A!=null?` (code ${A})`:"")),i("info","cli_websocket_disconnected"),this.isBridge)rA("tengu_ws_transport_closed",{closeCode:A,msSinceLastActivity:this.lastActivityTime>0?Date.now()-this.lastActivityTime:-1,wasConnected:this.state==="connected",reconnectAttempts:this.reconnectAttempts});if(this.doDisconnect(),this.state==="closing"||this.state==="closed")return;let Q=!1;if(A===4003&&this.refreshHeaders){let E=this.refreshHeaders();if(E.Authorization!==this.headers.Authorization)Object.assign(this.headers,E),Q=!0,w("WebSocketTransport: 4003 received but headers refreshed, scheduling reconnect"),i("info","cli_websocket_4003_token_refreshed")}if(A!=null&&LjA.has(A)&&!Q){w(`WebSocketTransport: Permanent close code ${A}, not reconnecting`,{level:"error"}),i("error","cli_websocket_permanent_close",{closeCode:A}),this.state="closed",this.onCloseCallback?.(A);return}if(!this.autoReconnect){this.state="closed",this.onCloseCallback?.(A);return}let B=Date.now();if(!this.reconnectStartTime)this.reconnectStartTime=B;if(this.lastReconnectAttemptTime!==null&&B-this.lastReconnectAttemptTime>Pr)w(`WebSocketTransport: Detected system sleep (${Math.round((B-this.lastReconnectAttemptTime)/1000)}s gap), resetting reconnection budget`),i("info","cli_websocket_sleep_detected",{gapMs:B-this.lastReconnectAttemptTime}),this.reconnectStartTime=B,this.reconnectAttempts=0;this.lastReconnectAttemptTime=B;let I=B-this.reconnectStartTime;if(I<zjA){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;if(!Q&&this.refreshHeaders){let Y=this.refreshHeaders();Object.assign(this.headers,Y),w("WebSocketTransport: Refreshed headers for reconnect")}this.state="reconnecting",this.reconnectAttempts++;let E=Math.min(ZjA*Math.pow(2,this.reconnectAttempts-1),vr),C=Math.max(0,E+E*0.25*(2*Math.random()-1));if(w(`WebSocketTransport: Reconnecting in ${Math.round(C)}ms (attempt ${this.reconnectAttempts}, ${Math.round(I/1000)}s elapsed)`),i("error","cli_websocket_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.isBridge)rA("tengu_ws_transport_reconnecting",{attempt:this.reconnectAttempts,elapsedMs:I,delayMs:Math.round(C)});this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},C)}else if(w(`WebSocketTransport: Reconnection time budget exhausted after ${Math.round(I/1000)}s for ${this.url.href}`,{level:"error"}),i("error","cli_websocket_reconnect_exhausted",{reconnectAttempts:this.reconnectAttempts,elapsedMs:I}),this.state="closed",this.onCloseCallback)this.onCloseCallback(A)}close(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;this.stopPingInterval(),this.stopKeepaliveInterval(),W1(),this.state="closing",this.doDisconnect()}replayBufferedMessages(A){let Q=this.messageBuffer.toArray();if(Q.length===0)return;let B=0;if(A){let E=Q.findIndex((C)=>("uuid"in C)&&C.uuid===A);if(E>=0){B=E+1;let C=Q.slice(B);if(this.messageBuffer.clear(),this.messageBuffer.addAll(C),C.length===0)this.lastSentId=null;w(`WebSocketTransport: Evicted ${B} confirmed messages, ${C.length} remaining`),i("info","cli_websocket_evicted_confirmed_messages",{evicted:B,remaining:C.length})}}let I=Q.slice(B);if(I.length===0){w("WebSocketTransport: No new messages to replay"),i("info","cli_websocket_no_messages_to_replay");return}w(`WebSocketTransport: Replaying ${I.length} buffered messages`),i("info","cli_websocket_messages_to_replay",{count:I.length});for(let E of I){let C=KA(E)+`
180
180
  `;if(!this.sendLine(C)){this.handleConnectionError();break}}}isConnectedStatus(){return this.state==="connected"}isClosedStatus(){return this.state==="closed"}setOnData(A){this.onData=A}setOnConnect(A){this.onConnectCallback=A}setOnClose(A){this.onCloseCallback=A}getStateLabel(){return this.state}async write(A){if("uuid"in A&&typeof A.uuid==="string")this.messageBuffer.add(A),this.lastSentId=A.uuid;let Q=KA(A)+`
181
- `;if(this.state!=="connected")return;let B=this.sessionId?` session=${this.sessionId}`:"",I=this.getControlMessageDetailLabel(A);w(`WebSocketTransport: Sending message type=${A.type}${B}${I}`),this.sendLine(Q)}getControlMessageDetailLabel(A){if(A.type==="control_request"){let{request_id:Q,request:B}=A,I=B.subtype==="can_use_tool"?B.tool_name:"";return` subtype=${B.subtype} request_id=${Q}${I?` tool=${I}`:""}`}if(A.type==="control_response"){let{subtype:Q,request_id:B}=A.response;return` subtype=${Q} request_id=${B}`}return""}startPingInterval(){this.stopPingInterval(),this.pongReceived=!0;let A=Date.now();this.pingInterval=setInterval(()=>{if(this.state==="connected"&&this.ws){let Q=Date.now(),B=Q-A;if(A=Q,B>Pr){w(`WebSocketTransport: ${Math.round(B/1000)}s tick gap detected — process was suspended, forcing reconnect`),i("info","cli_websocket_sleep_detected_on_ping",{gapMs:B}),this.handleConnectionError();return}if(!this.pongReceived){w("WebSocketTransport: No pong received, connection appears dead",{level:"error"}),i("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(I){w(`WebSocketTransport: Ping failed: ${I}`,{level:"error"}),i("error","cli_websocket_ping_failed")}}},KjA)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),sA(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(MjA),this.lastActivityTime=Date.now(),w("WebSocketTransport: Sent periodic keep_alive data frame")}catch(A){w(`WebSocketTransport: Periodic keep_alive failed: ${A}`,{level:"error"}),i("error","cli_websocket_keepalive_failed")}},HjA)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var xjA=100,RjA=15000,gjA=3000;class gH extends RH{postUrl;uploader;streamEventBuffer=[];streamEventTimer=null;constructor(A,Q={},B,I,E){super(A,Q,B,I,E);let{maxConsecutiveFailures:C,onBatchDropped:Y}=E??{};this.postUrl=jjA(A),this.uploader=new LY({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:C,onBatchDropped:(J,G)=>{i("error","cli_hybrid_batch_dropped_max_failures",{batchSize:J,failures:G}),Y?.(J,G)},send:(J)=>this.postOnce(J)}),w(`HybridTransport: POST URL = ${this.postUrl}`),i("info","cli_hybrid_transport_initialized")}async write(A){if(A.type==="stream_event"){if(this.streamEventBuffer.push(A),!this.streamEventTimer)this.streamEventTimer=setTimeout(()=>this.flushStreamEvents(),xjA);return}return await this.uploader.enqueue([...this.takeStreamEvents(),A]),this.uploader.flush()}async writeBatch(A){return await this.uploader.enqueue([...this.takeStreamEvents(),...A]),this.uploader.flush()}get droppedBatchCount(){return this.uploader.droppedBatchCount}flush(){return this.uploader.enqueue(this.takeStreamEvents()),this.uploader.flush()}takeStreamEvents(){if(this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;let A=this.streamEventBuffer;return this.streamEventBuffer=[],A}flushStreamEvents(){this.streamEventTimer=null,this.uploader.enqueue(this.takeStreamEvents())}close(){if(this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[];let A=this.uploader,Q;Promise.race([A.flush(),new Promise((B)=>{Q=setTimeout(B,gjA)})]).finally(()=>{clearTimeout(Q),A.close()}),super.close()}async postOnce(A){let Q=UD();if(!Q){w("HybridTransport: No session token available for POST"),i("warn","cli_hybrid_post_no_token");return}let B={Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},I;try{I=await fQ.post(this.postUrl,{events:A},{headers:B,validateStatus:()=>!0,timeout:RjA})}catch(E){throw w(`HybridTransport: POST error: ${YA(E)}`),i("warn","cli_hybrid_post_network_error"),E}if(I.status>=200&&I.status<300){w(`HybridTransport: POST success count=${A.length}`);return}if(I.status>=400&&I.status<500&&I.status!==429){w(`HybridTransport: POST returned ${I.status} (permanent), dropping`),i("warn","cli_hybrid_post_client_error",{status:I.status});return}throw w(`HybridTransport: POST returned ${I.status} (retryable)`),i("warn","cli_hybrid_post_retryable_error",{status:I.status}),Error(`POST failed with ${I.status}`)}}function jjA(A){let Q=A.protocol==="wss:"?"https:":"http:",B=A.pathname;if(B=B.replace("/ws/","/session/"),!B.endsWith("/events"))B=B.endsWith("/")?B+"events":B+"/events";return`${Q}//${A.host}${B}${A.search}`}import{randomUUID as kr}from"crypto";ZQ();pQ();FQ();function qjA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return OQ(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function _r(A){let Q=qjA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}ZQ();pQ();function zU(){return"claude-code/0.2.101"}class jH{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?Tr(this.pending,A):A,this.drain()}close(){this.closed=!0,this.pending=null}async drain(){if(this.inflight||this.closed)return;if(!this.pending)return;let A=this.pending;this.pending=null,this.inflight=this.sendWithRetry(A).then(()=>{if(this.inflight=null,this.pending&&!this.closed)this.drain()})}async sendWithRetry(A){let Q=A,B=0;while(!this.closed){if(await this.config.send(Q))return;if(B++,await hB(this.retryDelay(B)),this.pending&&!this.closed)Q=Tr(Q,this.pending),this.pending=null}}retryDelay(A){let Q=Math.min(this.config.baseDelayMs*2**(A-1),this.config.maxDelayMs),B=Math.random()*this.config.jitterMs;return Q+B}}function Tr(A,Q){let B={...A};for(let[I,E]of Object.entries(Q))if((I==="external_metadata"||I==="internal_metadata")&&B[I]&&typeof B[I]==="object"&&typeof E==="object"&&E!==null)B[I]={...B[I],...E};else B[I]=E;return B}var OjA=20000,SjA=100;function br(){return!0}class t9 extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var PjA=10;function vjA(){return{byMessage:new Map,scopeToMessage:new Map}}function s9(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function _jA(A,Q){let B=[],I=new Map;for(let E of A)switch(E.event.type){case"message_start":{let C=E.event.message.id,Y=Q.scopeToMessage.get(s9(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(s9(E),C),Q.byMessage.set(C,[]),B.push(E);break}case"content_block_delta":{if(E.event.delta.type!=="text_delta"){B.push(E);break}let C=Q.scopeToMessage.get(s9(E)),Y=C?Q.byMessage.get(C):void 0;if(!Y){B.push(E);break}let J=Y[E.event.index]??=[];J.push(E.event.delta.text);let G=I.get(J);if(G){G.event.delta.text=J.join("");break}let U={type:"stream_event",uuid:E.uuid,session_id:E.session_id,parent_tool_use_id:E.parent_tool_use_id,event:{type:"content_block_delta",index:E.event.index,delta:{type:"text_delta",text:J.join("")}}};I.set(J,U),B.push(U);break}default:B.push(E)}return B}function TjA(A,Q){A.byMessage.delete(Q.message.id);let B=s9(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class qH{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;currentState=null;sessionBaseUrl;sessionId;http=wa({keepAlive:!0});streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=vjA();workerState;eventUploader;internalEventUploader;deliveryUploader;onEpochMismatch;getAuthHeaders;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??OjA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??BV,Q.protocol!=="http:"&&Q.protocol!=="https:")throw Error(`CCRClient: Expected http(s) URL, got ${Q.protocol}`);let I=Q.pathname.replace(/\/$/,"");this.sessionBaseUrl=`${Q.protocol}//${Q.host}${I}`,this.sessionId=I.split("/").pop()||"",this.workerState=new jH({send:(E)=>this.request("put","/worker",{worker_epoch:this.workerEpoch,...E},"PUT worker").then((C)=>C.ok),baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.eventUploader=new LY({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:1e5,send:async(E)=>{let C=await this.request("post","/worker/events",{worker_epoch:this.workerEpoch,events:E},"client events");if(!C.ok)throw new VG("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new LY({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:200,send:async(E)=>{let C=await this.request("post","/worker/internal-events",{worker_epoch:this.workerEpoch,events:E},"internal events");if(!C.ok)throw new VG("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new LY({maxBatchSize:64,maxQueueSize:64,send:async(E)=>{let C=await this.request("post","/worker/events/delivery",{worker_epoch:this.workerEpoch,updates:E.map((Y)=>({event_id:Y.eventId,status:Y.status}))},"delivery batch");if(!C.ok)throw new VG("delivery POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),A.setOnEvent((E)=>{this.reportDelivery(E.event_id,"received")})}async initialize(A){let Q=Date.now();if(Object.keys(this.getAuthHeaders()).length===0)throw new t9("no_auth_headers");if(A===void 0){let Y=process.env.CLAUDE_CODE_WORKER_EPOCH;A=Y?parseInt(Y,10):NaN}if(isNaN(A))throw new t9("missing_epoch");this.workerEpoch=A;let B=this.getWorkerState();if(!(await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)")).ok)throw new t9("worker_register_failed");this.currentState="idle",this.startHeartbeat(),f9(()=>{this.writeEvent({type:"keep_alive"})}),w(`CCRClient: initialized, epoch=${this.workerEpoch}`),i("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:E,durationMs:C}=await B;if(!this.closed)i("info","cli_worker_state_restored",{duration_ms:C,had_state:E!==null});return E}async getWorkerState(){let A=Date.now(),Q=this.getAuthHeaders();if(Object.keys(Q).length===0)return{metadata:null,durationMs:0};return{metadata:(await this.getWithRetry(`${this.sessionBaseUrl}/worker`,Q,"worker_state"))?.worker?.external_metadata??null,durationMs:Date.now()-A}}async request(A,Q,B,I,{timeout:E=1e4}={}){let C=this.getAuthHeaders();if(Object.keys(C).length===0)return{ok:!1};try{let Y=await this.http[A](`${this.sessionBaseUrl}${Q}`,B,{headers:{...C,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":zU()},validateStatus:br,timeout:E});if(Y.status>=200&&Y.status<300)return this.consecutiveAuthFailures=0,{ok:!0};if(Y.status===409)this.handleEpochMismatch();if(Y.status===401||Y.status===403){let J=UD(),G=J?_r(J):null;if(G!==null&&G*1000<Date.now())w(`CCRClient: session_token expired (exp=${new Date(G*1000).toISOString()}) — no refresh was delivered, exiting`,{level:"error"}),i("error","cli_worker_token_expired_no_refresh"),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=PjA)w(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),i("error","cli_worker_auth_failures_exhausted"),this.onEpochMismatch()}if(w(`CCRClient: ${I} returned ${Y.status}`,{level:"warn"}),i("warn","cli_worker_request_failed",{method:A,path:Q,status:Y.status}),Y.status===429){let J=Y.headers?.["retry-after"],G=typeof J==="string"?parseInt(J,10):NaN;if(!isNaN(G)&&G>=0)return{ok:!1,retryAfterMs:G*1000}}return{ok:!1}}catch(Y){return w(`CCRClient: ${I} failed: ${YA(Y)}`,{level:"warn"}),i("warn","cli_worker_request_error",{method:A,path:Q,error_code:QE(Y)}),{ok:!1}}}reportState(A,Q){if(A===this.currentState&&!Q)return;this.currentState=A,this.workerState.enqueue({worker_status:A,requires_action_details:Q?{tool_name:Q.tool_name,action_description:Q.action_description,request_id:Q.request_id}:null})}reportMetadata(A){this.workerState.enqueue({external_metadata:A})}handleEpochMismatch(){w("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),i("error","cli_worker_epoch_mismatch"),this.onEpochMismatch()}startHeartbeat(){this.stopHeartbeat();let A=()=>{let B=this.heartbeatIntervalMs*this.heartbeatJitterFraction*(2*Math.random()-1);this.heartbeatTimer=setTimeout(Q,this.heartbeatIntervalMs+B)},Q=()=>{if(this.sendHeartbeat(),this.heartbeatTimer===null)return;A()};A()}stopHeartbeat(){if(this.heartbeatTimer)clearTimeout(this.heartbeatTimer),this.heartbeatTimer=null}async sendHeartbeat(){if(this.heartbeatInFlight)return;this.heartbeatInFlight=!0;try{if((await this.request("post","/worker/heartbeat",{session_id:this.sessionId,worker_epoch:this.workerEpoch},"Heartbeat",{timeout:5000})).ok)w("CCRClient: Heartbeat sent")}finally{this.heartbeatInFlight=!1}}async writeEvent(A){if(A.type==="stream_event"){if(this.streamEventBuffer.push(A),!this.streamEventTimer)this.streamEventTimer=setTimeout(()=>void this.flushStreamEventBuffer(),SjA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")TjA(this.streamTextAccumulator,A);await this.eventUploader.enqueue(this.toClientEvent(A))}toClientEvent(A){let Q=A;return{payload:{...Q,uuid:typeof Q.uuid==="string"?Q.uuid:kr()}}}async flushStreamEventBuffer(){if(this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;if(this.streamEventBuffer.length===0)return;let A=this.streamEventBuffer;this.streamEventBuffer=[];let Q=_jA(A,this.streamTextAccumulator);await this.eventUploader.enqueue(Q.map((B)=>({payload:B,ephemeral:!0})))}async writeInternalEvent(A,Q,{isCompaction:B=!1,agentId:I}={}){let E={payload:{type:A,...Q,uuid:typeof Q.uuid==="string"?Q.uuid:kr()},...B&&{is_compaction:!0},...I&&{agent_id:I}};await this.internalEventUploader.enqueue(E)}flushInternalEvents(){return this.internalEventUploader.flush()}flushDeliveryAcks(){return this.deliveryUploader.flush()}async flush(){return await this.flushStreamEventBuffer(),this.eventUploader.flush()}async readInternalEvents(){return this.paginatedGet("/worker/internal-events",{},"internal_events")}async readSubagentInternalEvents(){return this.paginatedGet("/worker/internal-events",{subagents:"true"},"subagent_events")}async paginatedGet(A,Q,B){let I=this.getAuthHeaders();if(Object.keys(I).length===0)return null;let E=[],C;do{let Y=new URL(`${this.sessionBaseUrl}${A}`);for(let[G,U]of Object.entries(Q))Y.searchParams.set(G,U);if(C)Y.searchParams.set("cursor",C);let J=await this.getWithRetry(Y.toString(),I,B);if(!J)return null;E.push(...J.data??[]),C=J.next_cursor}while(C);return w(`CCRClient: Read ${E.length} internal events from ${A}${Q.subagents?" (subagents)":""}`),E}async getWithRetry(A,Q,B){for(let I=1;I<=10;I++){let E;try{E=await this.http.get(A,{headers:{...Q,"anthropic-version":"2023-06-01","User-Agent":zU()},validateStatus:br,timeout:30000})}catch(C){if(w(`CCRClient: GET ${A} failed (attempt ${I}/10): ${YA(C)}`,{level:"warn"}),I<10){let Y=Math.min(500*2**(I-1),30000)+Math.random()*500;await hB(Y)}continue}if(E.status>=200&&E.status<300)return E.data;if(E.status===409)this.handleEpochMismatch();if(w(`CCRClient: GET ${A} returned ${E.status} (attempt ${I}/10)`,{level:"warn"}),I<10){let C=Math.min(500*2**(I-1),30000)+Math.random()*500;await hB(C)}}return w("CCRClient: GET retries exhausted",{level:"error"}),i("error","cli_worker_get_retries_exhausted",{context:B}),null}reportDelivery(A,Q){this.deliveryUploader.enqueue({eventId:A,status:Q})}getWorkerEpoch(){return this.workerEpoch}get internalEventsPending(){return this.internalEventUploader.pendingCount}close(){if(this.closed=!0,this.stopHeartbeat(),W1(),this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[],this.streamTextAccumulator.byMessage.clear(),this.streamTextAccumulator.scopeToMessage.clear(),this.workerState.close(),this.eventUploader.close(),this.internalEventUploader.close(),this.deliveryUploader.close()}}ZQ();pQ();FQ();var kjA=1000,bjA=30000,yjA=600000,fjA=45000,hjA=new Set([401,403,404]),L1=10,mjA=500,cjA=8000,ujA={stream:!0};function pjA(){return!0}function ljA(A){let Q=[],B=0,I;while((I=A.indexOf(`
181
+ `;if(this.state!=="connected")return;let B=this.sessionId?` session=${this.sessionId}`:"",I=this.getControlMessageDetailLabel(A);w(`WebSocketTransport: Sending message type=${A.type}${B}${I}`),this.sendLine(Q)}getControlMessageDetailLabel(A){if(A.type==="control_request"){let{request_id:Q,request:B}=A,I=B.subtype==="can_use_tool"?B.tool_name:"";return` subtype=${B.subtype} request_id=${Q}${I?` tool=${I}`:""}`}if(A.type==="control_response"){let{subtype:Q,request_id:B}=A.response;return` subtype=${Q} request_id=${B}`}return""}startPingInterval(){this.stopPingInterval(),this.pongReceived=!0;let A=Date.now();this.pingInterval=setInterval(()=>{if(this.state==="connected"&&this.ws){let Q=Date.now(),B=Q-A;if(A=Q,B>Pr){w(`WebSocketTransport: ${Math.round(B/1000)}s tick gap detected — process was suspended, forcing reconnect`),i("info","cli_websocket_sleep_detected_on_ping",{gapMs:B}),this.handleConnectionError();return}if(!this.pongReceived){w("WebSocketTransport: No pong received, connection appears dead",{level:"error"}),i("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(I){w(`WebSocketTransport: Ping failed: ${I}`,{level:"error"}),i("error","cli_websocket_ping_failed")}}},KjA)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),sA(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(MjA),this.lastActivityTime=Date.now(),w("WebSocketTransport: Sent periodic keep_alive data frame")}catch(A){w(`WebSocketTransport: Periodic keep_alive failed: ${A}`,{level:"error"}),i("error","cli_websocket_keepalive_failed")}},HjA)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var xjA=100,RjA=15000,gjA=3000;class gH extends RH{postUrl;uploader;streamEventBuffer=[];streamEventTimer=null;constructor(A,Q={},B,I,E){super(A,Q,B,I,E);let{maxConsecutiveFailures:C,onBatchDropped:Y}=E??{};this.postUrl=jjA(A),this.uploader=new LY({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:C,onBatchDropped:(J,G)=>{i("error","cli_hybrid_batch_dropped_max_failures",{batchSize:J,failures:G}),Y?.(J,G)},send:(J)=>this.postOnce(J)}),w(`HybridTransport: POST URL = ${this.postUrl}`),i("info","cli_hybrid_transport_initialized")}async write(A){if(A.type==="stream_event"){if(this.streamEventBuffer.push(A),!this.streamEventTimer)this.streamEventTimer=setTimeout(()=>this.flushStreamEvents(),xjA);return}return await this.uploader.enqueue([...this.takeStreamEvents(),A]),this.uploader.flush()}async writeBatch(A){return await this.uploader.enqueue([...this.takeStreamEvents(),...A]),this.uploader.flush()}get droppedBatchCount(){return this.uploader.droppedBatchCount}flush(){return this.uploader.enqueue(this.takeStreamEvents()),this.uploader.flush()}takeStreamEvents(){if(this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;let A=this.streamEventBuffer;return this.streamEventBuffer=[],A}flushStreamEvents(){this.streamEventTimer=null,this.uploader.enqueue(this.takeStreamEvents())}close(){if(this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[];let A=this.uploader,Q;Promise.race([A.flush(),new Promise((B)=>{Q=setTimeout(B,gjA)})]).finally(()=>{clearTimeout(Q),A.close()}),super.close()}async postOnce(A){let Q=UD();if(!Q){w("HybridTransport: No session token available for POST"),i("warn","cli_hybrid_post_no_token");return}let B={Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},I;try{I=await fQ.post(this.postUrl,{events:A},{headers:B,validateStatus:()=>!0,timeout:RjA})}catch(E){throw w(`HybridTransport: POST error: ${YA(E)}`),i("warn","cli_hybrid_post_network_error"),E}if(I.status>=200&&I.status<300){w(`HybridTransport: POST success count=${A.length}`);return}if(I.status>=400&&I.status<500&&I.status!==429){w(`HybridTransport: POST returned ${I.status} (permanent), dropping`),i("warn","cli_hybrid_post_client_error",{status:I.status});return}throw w(`HybridTransport: POST returned ${I.status} (retryable)`),i("warn","cli_hybrid_post_retryable_error",{status:I.status}),Error(`POST failed with ${I.status}`)}}function jjA(A){let Q=A.protocol==="wss:"?"https:":"http:",B=A.pathname;if(B=B.replace("/ws/","/session/"),!B.endsWith("/events"))B=B.endsWith("/")?B+"events":B+"/events";return`${Q}//${A.host}${B}${A.search}`}import{randomUUID as kr}from"crypto";ZQ();pQ();FQ();function qjA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return OQ(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function _r(A){let Q=qjA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}ZQ();pQ();function zU(){return"claude-code/0.2.104"}class jH{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?Tr(this.pending,A):A,this.drain()}close(){this.closed=!0,this.pending=null}async drain(){if(this.inflight||this.closed)return;if(!this.pending)return;let A=this.pending;this.pending=null,this.inflight=this.sendWithRetry(A).then(()=>{if(this.inflight=null,this.pending&&!this.closed)this.drain()})}async sendWithRetry(A){let Q=A,B=0;while(!this.closed){if(await this.config.send(Q))return;if(B++,await hB(this.retryDelay(B)),this.pending&&!this.closed)Q=Tr(Q,this.pending),this.pending=null}}retryDelay(A){let Q=Math.min(this.config.baseDelayMs*2**(A-1),this.config.maxDelayMs),B=Math.random()*this.config.jitterMs;return Q+B}}function Tr(A,Q){let B={...A};for(let[I,E]of Object.entries(Q))if((I==="external_metadata"||I==="internal_metadata")&&B[I]&&typeof B[I]==="object"&&typeof E==="object"&&E!==null)B[I]={...B[I],...E};else B[I]=E;return B}var OjA=20000,SjA=100;function br(){return!0}class t9 extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var PjA=10;function vjA(){return{byMessage:new Map,scopeToMessage:new Map}}function s9(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function _jA(A,Q){let B=[],I=new Map;for(let E of A)switch(E.event.type){case"message_start":{let C=E.event.message.id,Y=Q.scopeToMessage.get(s9(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(s9(E),C),Q.byMessage.set(C,[]),B.push(E);break}case"content_block_delta":{if(E.event.delta.type!=="text_delta"){B.push(E);break}let C=Q.scopeToMessage.get(s9(E)),Y=C?Q.byMessage.get(C):void 0;if(!Y){B.push(E);break}let J=Y[E.event.index]??=[];J.push(E.event.delta.text);let G=I.get(J);if(G){G.event.delta.text=J.join("");break}let U={type:"stream_event",uuid:E.uuid,session_id:E.session_id,parent_tool_use_id:E.parent_tool_use_id,event:{type:"content_block_delta",index:E.event.index,delta:{type:"text_delta",text:J.join("")}}};I.set(J,U),B.push(U);break}default:B.push(E)}return B}function TjA(A,Q){A.byMessage.delete(Q.message.id);let B=s9(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class qH{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;currentState=null;sessionBaseUrl;sessionId;http=wa({keepAlive:!0});streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=vjA();workerState;eventUploader;internalEventUploader;deliveryUploader;onEpochMismatch;getAuthHeaders;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??OjA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??BV,Q.protocol!=="http:"&&Q.protocol!=="https:")throw Error(`CCRClient: Expected http(s) URL, got ${Q.protocol}`);let I=Q.pathname.replace(/\/$/,"");this.sessionBaseUrl=`${Q.protocol}//${Q.host}${I}`,this.sessionId=I.split("/").pop()||"",this.workerState=new jH({send:(E)=>this.request("put","/worker",{worker_epoch:this.workerEpoch,...E},"PUT worker").then((C)=>C.ok),baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.eventUploader=new LY({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:1e5,send:async(E)=>{let C=await this.request("post","/worker/events",{worker_epoch:this.workerEpoch,events:E},"client events");if(!C.ok)throw new VG("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new LY({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:200,send:async(E)=>{let C=await this.request("post","/worker/internal-events",{worker_epoch:this.workerEpoch,events:E},"internal events");if(!C.ok)throw new VG("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new LY({maxBatchSize:64,maxQueueSize:64,send:async(E)=>{let C=await this.request("post","/worker/events/delivery",{worker_epoch:this.workerEpoch,updates:E.map((Y)=>({event_id:Y.eventId,status:Y.status}))},"delivery batch");if(!C.ok)throw new VG("delivery POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),A.setOnEvent((E)=>{this.reportDelivery(E.event_id,"received")})}async initialize(A){let Q=Date.now();if(Object.keys(this.getAuthHeaders()).length===0)throw new t9("no_auth_headers");if(A===void 0){let Y=process.env.CLAUDE_CODE_WORKER_EPOCH;A=Y?parseInt(Y,10):NaN}if(isNaN(A))throw new t9("missing_epoch");this.workerEpoch=A;let B=this.getWorkerState();if(!(await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)")).ok)throw new t9("worker_register_failed");this.currentState="idle",this.startHeartbeat(),f9(()=>{this.writeEvent({type:"keep_alive"})}),w(`CCRClient: initialized, epoch=${this.workerEpoch}`),i("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:E,durationMs:C}=await B;if(!this.closed)i("info","cli_worker_state_restored",{duration_ms:C,had_state:E!==null});return E}async getWorkerState(){let A=Date.now(),Q=this.getAuthHeaders();if(Object.keys(Q).length===0)return{metadata:null,durationMs:0};return{metadata:(await this.getWithRetry(`${this.sessionBaseUrl}/worker`,Q,"worker_state"))?.worker?.external_metadata??null,durationMs:Date.now()-A}}async request(A,Q,B,I,{timeout:E=1e4}={}){let C=this.getAuthHeaders();if(Object.keys(C).length===0)return{ok:!1};try{let Y=await this.http[A](`${this.sessionBaseUrl}${Q}`,B,{headers:{...C,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":zU()},validateStatus:br,timeout:E});if(Y.status>=200&&Y.status<300)return this.consecutiveAuthFailures=0,{ok:!0};if(Y.status===409)this.handleEpochMismatch();if(Y.status===401||Y.status===403){let J=UD(),G=J?_r(J):null;if(G!==null&&G*1000<Date.now())w(`CCRClient: session_token expired (exp=${new Date(G*1000).toISOString()}) — no refresh was delivered, exiting`,{level:"error"}),i("error","cli_worker_token_expired_no_refresh"),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=PjA)w(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),i("error","cli_worker_auth_failures_exhausted"),this.onEpochMismatch()}if(w(`CCRClient: ${I} returned ${Y.status}`,{level:"warn"}),i("warn","cli_worker_request_failed",{method:A,path:Q,status:Y.status}),Y.status===429){let J=Y.headers?.["retry-after"],G=typeof J==="string"?parseInt(J,10):NaN;if(!isNaN(G)&&G>=0)return{ok:!1,retryAfterMs:G*1000}}return{ok:!1}}catch(Y){return w(`CCRClient: ${I} failed: ${YA(Y)}`,{level:"warn"}),i("warn","cli_worker_request_error",{method:A,path:Q,error_code:QE(Y)}),{ok:!1}}}reportState(A,Q){if(A===this.currentState&&!Q)return;this.currentState=A,this.workerState.enqueue({worker_status:A,requires_action_details:Q?{tool_name:Q.tool_name,action_description:Q.action_description,request_id:Q.request_id}:null})}reportMetadata(A){this.workerState.enqueue({external_metadata:A})}handleEpochMismatch(){w("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),i("error","cli_worker_epoch_mismatch"),this.onEpochMismatch()}startHeartbeat(){this.stopHeartbeat();let A=()=>{let B=this.heartbeatIntervalMs*this.heartbeatJitterFraction*(2*Math.random()-1);this.heartbeatTimer=setTimeout(Q,this.heartbeatIntervalMs+B)},Q=()=>{if(this.sendHeartbeat(),this.heartbeatTimer===null)return;A()};A()}stopHeartbeat(){if(this.heartbeatTimer)clearTimeout(this.heartbeatTimer),this.heartbeatTimer=null}async sendHeartbeat(){if(this.heartbeatInFlight)return;this.heartbeatInFlight=!0;try{if((await this.request("post","/worker/heartbeat",{session_id:this.sessionId,worker_epoch:this.workerEpoch},"Heartbeat",{timeout:5000})).ok)w("CCRClient: Heartbeat sent")}finally{this.heartbeatInFlight=!1}}async writeEvent(A){if(A.type==="stream_event"){if(this.streamEventBuffer.push(A),!this.streamEventTimer)this.streamEventTimer=setTimeout(()=>void this.flushStreamEventBuffer(),SjA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")TjA(this.streamTextAccumulator,A);await this.eventUploader.enqueue(this.toClientEvent(A))}toClientEvent(A){let Q=A;return{payload:{...Q,uuid:typeof Q.uuid==="string"?Q.uuid:kr()}}}async flushStreamEventBuffer(){if(this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;if(this.streamEventBuffer.length===0)return;let A=this.streamEventBuffer;this.streamEventBuffer=[];let Q=_jA(A,this.streamTextAccumulator);await this.eventUploader.enqueue(Q.map((B)=>({payload:B,ephemeral:!0})))}async writeInternalEvent(A,Q,{isCompaction:B=!1,agentId:I}={}){let E={payload:{type:A,...Q,uuid:typeof Q.uuid==="string"?Q.uuid:kr()},...B&&{is_compaction:!0},...I&&{agent_id:I}};await this.internalEventUploader.enqueue(E)}flushInternalEvents(){return this.internalEventUploader.flush()}flushDeliveryAcks(){return this.deliveryUploader.flush()}async flush(){return await this.flushStreamEventBuffer(),this.eventUploader.flush()}async readInternalEvents(){return this.paginatedGet("/worker/internal-events",{},"internal_events")}async readSubagentInternalEvents(){return this.paginatedGet("/worker/internal-events",{subagents:"true"},"subagent_events")}async paginatedGet(A,Q,B){let I=this.getAuthHeaders();if(Object.keys(I).length===0)return null;let E=[],C;do{let Y=new URL(`${this.sessionBaseUrl}${A}`);for(let[G,U]of Object.entries(Q))Y.searchParams.set(G,U);if(C)Y.searchParams.set("cursor",C);let J=await this.getWithRetry(Y.toString(),I,B);if(!J)return null;E.push(...J.data??[]),C=J.next_cursor}while(C);return w(`CCRClient: Read ${E.length} internal events from ${A}${Q.subagents?" (subagents)":""}`),E}async getWithRetry(A,Q,B){for(let I=1;I<=10;I++){let E;try{E=await this.http.get(A,{headers:{...Q,"anthropic-version":"2023-06-01","User-Agent":zU()},validateStatus:br,timeout:30000})}catch(C){if(w(`CCRClient: GET ${A} failed (attempt ${I}/10): ${YA(C)}`,{level:"warn"}),I<10){let Y=Math.min(500*2**(I-1),30000)+Math.random()*500;await hB(Y)}continue}if(E.status>=200&&E.status<300)return E.data;if(E.status===409)this.handleEpochMismatch();if(w(`CCRClient: GET ${A} returned ${E.status} (attempt ${I}/10)`,{level:"warn"}),I<10){let C=Math.min(500*2**(I-1),30000)+Math.random()*500;await hB(C)}}return w("CCRClient: GET retries exhausted",{level:"error"}),i("error","cli_worker_get_retries_exhausted",{context:B}),null}reportDelivery(A,Q){this.deliveryUploader.enqueue({eventId:A,status:Q})}getWorkerEpoch(){return this.workerEpoch}get internalEventsPending(){return this.internalEventUploader.pendingCount}close(){if(this.closed=!0,this.stopHeartbeat(),W1(),this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[],this.streamTextAccumulator.byMessage.clear(),this.streamTextAccumulator.scopeToMessage.clear(),this.workerState.close(),this.eventUploader.close(),this.internalEventUploader.close(),this.deliveryUploader.close()}}ZQ();pQ();FQ();var kjA=1000,bjA=30000,yjA=600000,fjA=45000,hjA=new Set([401,403,404]),L1=10,mjA=500,cjA=8000,ujA={stream:!0};function pjA(){return!0}function ljA(A){let Q=[],B=0,I;while((I=A.indexOf(`
182
182
 
183
183
  `,B))!==-1){let E=A.slice(B,I);if(B=I+2,!E.trim())continue;let C={},Y=!1;for(let J of E.split(`
184
184
  `)){if(J.startsWith(":")){Y=!0;continue}let G=J.indexOf(":");if(G===-1)continue;let U=J.slice(0,G),F=J[G+1]===" "?J.slice(G+2):J.slice(G+1);switch(U){case"event":C.event=F;break;case"id":C.id=F;break;case"data":C.data=C.data?C.data+`
@@ -188,4 +188,4 @@ ${I.message}`:V,z=[H,Q,A].filter(Boolean).join(`
188
188
  `);if(I.push(J),!G){E=J.endsWith(`
189
189
  `);continue}let{frames:U,remaining:F}=ljA(I.join(""));I=F?[F]:[],E=F.endsWith(`
190
190
  `);for(let N of U){if(this.resetLivenessTimer(),N.id){let D=parseInt(N.id,10);if(!isNaN(D)){if(this.seenSequenceNums.has(D))w(`SSETransport: DUPLICATE frame seq=${D} (lastSequenceNum=${this.lastSequenceNum}, seenCount=${this.seenSequenceNums.size})`,{level:"warn"}),i("warn","cli_sse_duplicate_sequence");else if(this.seenSequenceNums.add(D),this.seenSequenceNums.size>1000){let W=this.lastSequenceNum-200;for(let $ of this.seenSequenceNums)if($<W)this.seenSequenceNums.delete($)}if(D>this.lastSequenceNum)this.lastSequenceNum=D}}if(N.event&&N.data)this.handleSSEFrame(N.event,N.data);else if(N.data)w("SSETransport: Frame has data: but no event: field — dropped",{level:"warn"}),i("warn","cli_sse_frame_missing_event_field")}}}catch(C){if(this.abortController?.signal.aborted)return;w(`SSETransport: Stream read error: ${YA(C)}`,{level:"error"}),i("error","cli_sse_stream_read_error")}finally{Q.releaseLock()}if(this.state!=="closing"&&this.state!=="closed")w("SSETransport: Stream ended, reconnecting"),this.handleConnectionError()}handleSSEFrame(A,Q){if(A!=="client_event"){w(`SSETransport: Unexpected SSE event type '${A}' on worker stream`,{level:"warn"}),i("warn","cli_sse_unexpected_event_type",{event_type:A});return}let B;try{B=OQ(Q)}catch(E){w(`SSETransport: Failed to parse client_event data: ${YA(E)}`,{level:"error"});return}let I=B.payload;if(I&&typeof I==="object"&&"type"in I){let E=this.sessionId?` session=${this.sessionId}`:"";w(`SSETransport: Event seq=${B.sequence_num} event_id=${B.event_id} event_type=${B.event_type} payload_type=${String(I.type)}${E}`),i("info","cli_sse_message_received"),this.onData?.(KA(I)+`
191
- `)}else w(`SSETransport: Ignoring client_event with no type in payload: event_id=${B.event_id}`);this.onEventCallback?.(B)}handleConnectionError(){if(this.clearLivenessTimer(),this.state==="closing"||this.state==="closed")return;this.abortController?.abort(),this.abortController=null;let A=Date.now();if(!this.reconnectStartTime)this.reconnectStartTime=A;let Q=A-this.reconnectStartTime;if(Q<yjA){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;if(this.refreshHeaders){let E=this.refreshHeaders();Object.assign(this.headers,E),w("SSETransport: Refreshed headers for reconnect")}this.state="reconnecting",this.reconnectAttempts++;let B=Math.min(kjA*Math.pow(2,this.reconnectAttempts-1),bjA),I=Math.max(0,B+B*0.25*(2*Math.random()-1));w(`SSETransport: Reconnecting in ${Math.round(I)}ms (attempt ${this.reconnectAttempts}, ${Math.round(Q/1000)}s elapsed)`),i("error","cli_sse_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},I)}else w(`SSETransport: Reconnection time budget exhausted after ${Math.round(Q/1000)}s`,{level:"error"}),i("error","cli_sse_reconnect_exhausted",{reconnectAttempts:this.reconnectAttempts,elapsedMs:Q}),this.state="closed",this.onCloseCallback?.()}onLivenessTimeout=()=>{this.livenessTimer=null,w("SSETransport: Liveness timeout, reconnecting",{level:"error"}),i("error","cli_sse_liveness_timeout"),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,fjA)}clearLivenessTimer(){if(this.livenessTimer)clearTimeout(this.livenessTimer),this.livenessTimer=null}async write(A){let Q=this.getAuthHeaders();if(Object.keys(Q).length===0){w("SSETransport: No session token available for POST"),i("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":zU()};w(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=L1;I++){try{let C=await fQ.post(this.postUrl,A,{headers:B,validateStatus:pjA});if(C.status===200||C.status===201){w(`SSETransport: POST success type=${A.type}`);return}if(w(`SSETransport: POST ${C.status} body=${KA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){w(`SSETransport: POST returned ${C.status} (client error), not retrying`),i("warn","cli_sse_post_client_error",{status:C.status});return}w(`SSETransport: POST returned ${C.status}, attempt ${I}/${L1}`),i("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){w(`SSETransport: POST error: ${YA(C)}, attempt ${I}/${L1}`),i("warn","cli_sse_post_network_error",{attempt:I})}if(I===L1){w(`SSETransport: POST failed after ${L1} attempts, continuing`),i("warn","cli_sse_post_retries_exhausted");return}let E=Math.min(mjA*Math.pow(2,I-1),cjA);await hB(E)}}isConnectedStatus(){return this.state==="connected"}isClosedStatus(){return this.state==="closed"}setOnData(A){this.onData=A}setOnClose(A){this.onCloseCallback=A}setOnEvent(A){this.onEventCallback=A}close(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;this.clearLivenessTimer(),this.state="closing",this.abortController?.abort(),this.abortController=null}}function ijA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}ZQ();pQ();function yr(A){return{write:(Q)=>A.write(Q),writeBatch:(Q)=>A.writeBatch(Q),close:()=>A.close(),isConnectedStatus:()=>A.isConnectedStatus(),getStateLabel:()=>A.getStateLabel(),setOnData:(Q)=>A.setOnData(Q),setOnClose:(Q)=>A.setOnClose(Q),setOnConnect:(Q)=>A.setOnConnect(Q),connect:()=>void A.connect(),getLastSequenceNum:()=>0,get droppedBatchCount(){return A.droppedBatchCount},reportState:()=>{},reportMetadata:()=>{},reportDelivery:()=>{},flush:()=>Promise.resolve()}}async function fr(A){let{sessionUrl:Q,ingressToken:B,sessionId:I,initialSequenceNum:E,getAuthToken:C}=A,Y;if(C)Y=()=>{let X=C();if(!X)return{};return{Authorization:`Bearer ${X}`}};else FD(B);let J=A.epoch??await Xy(Q,B);w(`[bridge:repl] CCR v2: worker sessionId=${I} epoch=${J}${A.epoch!==void 0?" (from /bridge)":" (via registerWorker)"}`);let G=new URL(Q);G.pathname=G.pathname.replace(/\/$/,"")+"/worker/events/stream";let U=new OH(G,{},I,void 0,E,Y),F,N=new qH(U,new URL(Q),{getAuthHeaders:Y,heartbeatIntervalMs:A.heartbeatIntervalMs,heartbeatJitterFraction:A.heartbeatJitterFraction,onEpochMismatch:()=>{w("[bridge:repl] CCR v2: epoch superseded (409) — closing for poll-loop recovery");try{N.close(),U.close(),F?.(4090)}catch(X){w(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${YA(X)}`,{level:"error"})}throw Error("epoch superseded")}});U.setOnEvent((X)=>{N.reportDelivery(X.event_id,"received"),N.reportDelivery(X.event_id,"processed")});let D,W=!1,$=!1;return{write(X){return N.writeEvent(X)},async writeBatch(X){for(let V of X){if($)break;await N.writeEvent(V)}},close(){$=!0,N.close(),U.close()},isConnectedStatus(){return W},getStateLabel(){if(U.isClosedStatus())return"closed";if(U.isConnectedStatus())return W?"connected":"init";return"connecting"},setOnData(X){U.setOnData(X)},setOnClose(X){F=X,U.setOnClose((V)=>{N.close(),X(V??4092)})},setOnConnect(X){D=X},getLastSequenceNum(){return U.getLastSequenceNum()},droppedBatchCount:0,reportState(X){N.reportState(X)},reportMetadata(X){N.reportMetadata(X)},reportDelivery(X,V){N.reportDelivery(X,V)},flush(){return N.flush()},getInternalEventWriter(){return(X,V,M)=>N.writeInternalEvent(X,V,M)},getInternalEventReaders(){return{readMain:()=>N.readInternalEvents(),readSubagents:()=>N.readSubagentInternalEvents()}},connect(){if(!A.outboundOnly)U.connect();N.initialize(J).then(()=>{W=!0,w(`[bridge:repl] v2 transport ready for writes (epoch=${J}, sse=${U.isConnectedStatus()?"open":"opening"})`),D?.()},(X)=>{w(`[bridge:repl] CCR v2 initialize failed: ${YA(X)}`,{level:"error"}),N.close(),U.close(),F?.(4091)})}}}ZQ();pQ();var djA="2023-06-01",njA="ccr-byoc-2025-07-29";async function hr({environmentId:A,title:Q,tags:B,signal:I},E){let{baseUrl:C,getAccessToken:Y,orgUUID:J,model:G}=E,U=Y();if(!U)return w("[bridge] No access token for session creation"),null;let F=`${C}/v1/sessions`,N;try{N=await fQ.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:SH(U,J),signal:I,validateStatus:(W)=>W<500})}catch(W){return w(`[bridge] Session creation request failed: ${YA(W)}`),null}if(N.status!==200&&N.status!==201){let W=DG(N.data);return w(`[bridge] Session creation failed with status ${N.status}${W?`: ${W}`:""}`),null}let D=N.data;if(!D||typeof D!=="object"||!("id"in D)||typeof D.id!=="string")return w("[bridge] No session ID in response"),null;return D.id}async function mr(A,Q){let{baseUrl:B,getAccessToken:I,orgUUID:E}=Q,C=I();if(!C){w("[bridge] No access token for session archive");return}let Y=`${B}/v1/sessions/${A}/archive`;w(`[bridge] Archiving session ${A}`);try{let J=await fQ.post(Y,{},{headers:SH(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)w(`[bridge] Session ${A} archived successfully`);else{let G=DG(J.data);w(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){w(`[bridge] Session archive request failed: ${YA(J)}`)}}async function e9(A,Q,B,I,E,C){let Y=C();if(!Y)return w(`[bridge] No access token for ${A}-pr`),!1;let J=`${E}/v1/code/github/${A}-pr`,G={session_id:ED(Q),repo:B,pr_number:I},U;try{U=await fQ.post(J,G,{headers:SH(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return w(`[bridge] ${A}-pr request failed: ${YA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=DG(U.data);return w(`[bridge] ${A}-pr failed ${U.status}${N?`: ${N}`:""}`),!1}return w(`[bridge] ${A}-pr ${B}#${I} ok`),!0}function SH(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":djA,"anthropic-beta":njA};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}IB();function cr(A){let Q=new AbortController;function B(){Q.abort(),Q=new AbortController}function I(){let E=new AbortController,C=()=>E.abort();if(A.aborted||Q.signal.aborted)return E.abort(),{signal:E.signal,cleanup:()=>{}};A.addEventListener("abort",C,{once:!0});let Y=Q.signal;return Y.addEventListener("abort",C,{once:!0}),{signal:E.signal,cleanup:()=>{A.removeEventListener("abort",C),Y.removeEventListener("abort",C)}}}return{signal:I,wake:B}}class PH{_active=!1;_pending=[];get active(){return this._active}get pendingCount(){return this._pending.length}start(){this._active=!0}end(){return this._active=!1,this._pending.splice(0)}enqueue(...A){if(!this._active)return!1;return this._pending.push(...A),!0}drop(){this._active=!1;let A=this._pending.length;return this._pending.length=0,A}deactivate(){this._active=!1}}pQ();ZQ();var CqA=2000,nr=60000,or=900000,YqA=0;async function ar(A){let{dir:Q,registrationDir:B,machineName:I,branch:E,gitRepoUrl:C,title:Y,baseUrl:J,sessionIngressUrl:G,workerType:U,getAccessToken:F,createSession:N,archiveSession:D,getCurrentTitle:W=()=>Y,toSDKMessages:$=()=>{throw Error("BridgeCoreParams.toSDKMessages not provided. Pass it if you use writeMessages() or initialMessages — daemon callers that only use writeSdkMessages() never hit this path.")},onAuth401:X,getTrustedDeviceToken:V,getPollIntervalConfig:M=()=>bN,initialHistoryCap:H=200,initialMessages:z,previouslyFlushedUUIDs:L,onInboundMessage:q,onPermissionResponse:S,onInterrupt:v,onSetModel:k,onSetMaxThinkingTokens:a,onSetPermissionMode:DA,onStateChange:QA,onUserMessage:BA,onSessionEstablished:u,onInitError:jA,perpetual:c,initialSSESequenceNum:xA=0,onTransportPersistenceReady:yA,onTransportPersistenceTeardown:p}=A,wQ=++YqA,{writeBridgePointer:n,clearBridgePointer:d,readBridgePointer:CA}=await Promise.resolve().then(() => (ir(),lr)),nA=c?await CA(Q):null,ZA=nA?.source==="repl"?nA:null;w(`[bridge:repl] initBridgeCore #${wQ} starting (initialMessages=${z?.length??0}${ZA?` perpetual prior=env:${ZA.environmentId}`:""})`);let QQ=Cy({baseUrl:J,getAccessToken:F,runnerVersion:"0.2.101",onDebug:w,onAuth401:X,getTrustedDeviceToken:V}),LQ={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:dr(),workerType:U,environmentId:dr(),reuseEnvironmentId:ZA?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},WA,XB;try{let b=await QQ.registerBridgeEnvironment(LQ);WA=b.environment_id,XB=b.environment_secret}catch(b){if(Ey("registration_failed",`[bridge:repl] Environment registration failed: ${YA(b)}`),jA?.(`[bridge:repl] Environment registration failed: ${YA(b)}`),ZA&&b instanceof DE&&(b.status===410||b.status!==401&&hW(b.errorType)))await d(Q);return QA?.("failed",YA(b)),null}w(`[bridge:repl] Environment registered: ${WA}`),i("info","bridge_repl_env_registered"),rA("tengu_bridge_repl_env_registered",{});async function xQ(b,FA){if(WA!==b)return w(`[bridge:repl] Env mismatch (requested ${b}, got ${WA}) — cannot reconnect in place`),!1;let BQ=ez(FA),OA=BQ===FA?[FA]:[FA,BQ];for(let mQ of OA)try{return await QQ.reconnectSession(WA,mQ),w(`[bridge:repl] Reconnected session ${mQ} in place on env ${WA}`),!0}catch(sI){w(`[bridge:repl] reconnectSession(${mQ}) failed: ${YA(sI)}`)}return w("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let h0=ZA?await xQ(ZA.environmentId,ZA.sessionId):!1;if(ZA&&!h0)await d(Q);let VA,s=new Set;if(h0&&ZA){if(VA=ZA.sessionId,w(`[bridge:repl] Perpetual session reused: ${VA}`),z&&L)for(let b of z)L.add(b.uuid)}else{let b=await N({environmentId:WA,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!b)return w("[bridge:repl] Session creation failed, deregistering environment"),jA?.("[bridge:repl] Session creation failed, deregistering environment"),rA("tengu_bridge_repl_session_failed",{}),await QQ.deregisterEnvironment(WA).catch(()=>{}),QA?.("failed","Session creation failed"),null;VA=b,w(`[bridge:repl] Session created: ${VA}`)}u?.(VA),await n(Q,{sessionId:VA,environmentId:WA,source:"repl"}),i("info","bridge_repl_session_created"),rA("tengu_bridge_repl_started",{has_initial_messages:!!(z&&z.length>0),inProtectedNamespace:Ax(),...Jy()});let RQ=new Set;if(z)for(let b of z)RQ.add(b.uuid);let oA=new mW(2000);for(let b of RQ)oA.add(b);let pA=new mW(2000),UB=new AbortController,IA=null,aI=0,MB=h0?xA:0,vQ=null,dQ=null,m0=cr(UB.signal),rI=m0.wake,CI=m0.signal,PB=new PH,HE=!BA,tI=3,OI=0,LE=null;async function KU(){if(LE)return LE;LE=mC();try{return await LE}finally{LE=null}}async function mC(){if(OI++,aI++,w(`[bridge:repl] Reconnecting after env lost (attempt ${OI}/${tI})`),OI>tI)return w(`[bridge:repl] Environment reconnect limit reached (${tI}), giving up`),!1;if(IA){let OA=IA.getLastSequenceNum();if(OA>MB)MB=OA;p?.(),IA.close(),IA=null}if(rI(),PB.drop(),vQ){let OA=vQ;if(await QQ.stopWork(WA,OA,!1).catch(()=>{}),vQ!==OA)return w("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),OI=0,!0;vQ=null,dQ=null}if(UB.signal.aborted)return w("[bridge:repl] Reconnect aborted by teardown"),!1;let b=WA;LQ.reuseEnvironmentId=b;try{let OA=await QQ.registerBridgeEnvironment(LQ);WA=OA.environment_id,XB=OA.environment_secret}catch(OA){return LQ.reuseEnvironmentId=void 0,w(`[bridge:repl] Environment re-registration failed: ${YA(OA)}`),!1}if(LQ.reuseEnvironmentId=void 0,w(`[bridge:repl] Re-registered: requested=${b} got=${WA}`),UB.signal.aborted)return w("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await QQ.deregisterEnvironment(WA).catch(()=>{}),!1;if(IA!==null)return w("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),OI=0,!0;if(await xQ(b,VA))return rA("tengu_bridge_repl_reconnected_in_place",{}),OI=0,!0;if(WA!==b)rA("tengu_bridge_repl_env_expired_fresh_session",{});if(await D(VA),UB.signal.aborted)return w("[bridge:repl] Reconnect aborted after archive, cleaning up"),await QQ.deregisterEnvironment(WA).catch(()=>{}),!1;let FA=W(),BQ=await N({environmentId:WA,title:FA,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!BQ)return w("[bridge:repl] Session creation failed during reconnection"),!1;if(UB.signal.aborted)return w("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await D(BQ),!1;if(VA=BQ,Qh(ED(BQ)).catch(()=>{}),u?.(VA),MB=0,pA.clear(),HE=!BA,w(`[bridge:repl] Re-created session: ${VA}`),await n(Q,{sessionId:VA,environmentId:WA,source:"repl"}),L?.clear(),s.size>0){w(`[bridge:repl] Replaying ${s.size} PR subscription(s) against new session`);for(let OA of s){let mQ=OA.lastIndexOf("#");e9("subscribe",VA,OA.slice(0,mQ),Number(OA.slice(mQ+1)),J,F)}}return OI=0,!0}function YI(){return F()}function c0(){let b=PB.end();if(b.length===0)return;if(!IA){w(`[bridge:repl] Cannot drain ${b.length} pending message(s): no transport`);return}for(let OA of b)oA.add(OA.uuid);let BQ=$(b).map((OA)=>({...OA,session_id:VA}));w(`[bridge:repl] Drained ${b.length} pending message(s) after flush`),IA.writeBatch(BQ)}let cC=null;function rY(){cC?.()}function kH(b){if(w(`[bridge:repl] Transport permanently closed: code=${b}`),rA("tengu_bridge_repl_ws_closed",{code:b}),IA){let BQ=IA.getLastSequenceNum();if(BQ>MB)MB=BQ;p?.(),IA=null}rI();let FA=PB.drop();if(FA>0)w(`[bridge:repl] Dropping ${FA} pending message(s) on transport close (code=${b})`,{level:"warn"});if(b===1000){QA?.("failed","session ended"),UB.abort(),rY();return}QA?.("reconnecting",`Remote Control connection lost (code ${b})`),w(`[bridge:repl] Transport reconnect budget exhausted (code=${b}), attempting env reconnect`),KU().then((BQ)=>{if(BQ)return;if(UB.signal.aborted)return;w("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),rA("tengu_bridge_repl_reconnect_failed",{close_code:b}),QA?.("failed","reconnection failed"),rY()})}let bH,sr=null,er={api:QQ,getCredentials:()=>({environmentId:WA,environmentSecret:XB}),signal:UB.signal,getPollIntervalConfig:M,onStateChange:QA,getWsState:()=>IA?.getStateLabel()??"null",isAtCapacity:()=>IA!==null,capacitySignal:CI,onFatalError:rY,getHeartbeatInfo:()=>{if(!vQ||!dQ)return null;return{environmentId:WA,workId:vQ,sessionToken:dQ}},onHeartbeatFatal:(b)=>{if(w(`[bridge:repl] heartbeatWork fatal (status=${b.status}) — tearing down work item for fast re-dispatch`),IA){let FA=IA.getLastSequenceNum();if(FA>MB)MB=FA;p?.(),IA.close(),IA=null}if(PB.drop(),vQ)QQ.stopWork(WA,vQ,!1).catch((FA)=>{w(`[bridge:repl] stopWork after heartbeat fatal: ${YA(FA)}`)});vQ=null,dQ=null,rI(),QA?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await KU())return null;return{environmentId:WA,environmentSecret:XB}},onWorkReceived:(b,FA,BQ,OA)=>{if(IA?.isConnectedStatus())w(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${BQ})`);if(w(`[bridge:repl] Work received: workId=${BQ} workSessionId=${b} currentSessionId=${VA} match=${tz(b,VA)}`),n(Q,{sessionId:VA,environmentId:WA,source:"repl"}),!tz(b,VA)){w(`[bridge:repl] Rejecting foreign session: expected=${VA} got=${b}`);return}vQ=BQ,dQ=FA;let mQ=OA||sA(process.env.CLAUDE_BRIDGE_USE_CCR_V2),sI;if(!mQ){if(sI=YI(),!sI){w("[bridge:repl] No OAuth token available for session ingress, skipping work");return}FD(sI)}if(rA("tengu_bridge_repl_work_received",{}),IA){p?.();let _Q=IA;IA=null;let cQ=_Q.getLastSequenceNum();if(cQ>MB)MB=cQ;_Q.close()}PB.deactivate();let Qt=(_Q)=>Dy(_Q,{transport:IA,sessionId:VA,onInterrupt:v,onSetModel:k,onSetMaxThinkingTokens:a,onSetPermissionMode:DA}),E2=!1,fH=(_Q)=>{if(IA=_Q,_Q.setOnConnect(()=>{if(IA!==_Q)return;if(w("[bridge:repl] Ingress transport connected"),rA("tengu_bridge_repl_ws_connected",{}),!mQ){let cQ=YI();if(cQ)FD(cQ)}if(I2=!1,!E2&&z&&z.length>0){E2=!0;let cQ=H,fB=z.filter((x1)=>az(x1)&&!L?.has(x1.uuid)),rE=cQ>0&&fB.length>cQ?fB.slice(-cQ):fB;if(rE.length<fB.length)w(`[bridge:repl] Capped initial flush: ${fB.length} -> ${rE.length} (cap=${cQ})`),rA("tengu_bridge_repl_history_capped",{eligible_count:fB.length,capped_count:rE.length});let uC=$(rE);if(uC.length>0){w(`[bridge:repl] Flushing ${uC.length} initial message(s) via transport`);let x1=uC.map((tY)=>({...tY,session_id:VA})),hH=_Q.droppedBatchCount;_Q.writeBatch(x1).then(()=>{if(_Q.droppedBatchCount>hH){w(`[bridge:repl] Initial flush dropped ${_Q.droppedBatchCount-hH} batch(es) — not marking ${uC.length} UUID(s) as flushed`);return}if(L){for(let tY of uC)if(tY.uuid)L.add(tY.uuid)}}).catch((tY)=>w(`[bridge:repl] Initial flush failed: ${tY}`)).finally(()=>{if(IA!==_Q)return;c0(),QA?.("connected")})}else c0(),QA?.("connected")}else if(!PB.active)QA?.("connected")}),_Q.setOnData((cQ)=>{Ny(cQ,oA,pA,q,S,Qt)}),sr=kH,_Q.setOnClose((cQ)=>{if(IA!==_Q)return;kH(cQ)}),!E2&&z&&z.length>0)PB.start();_Q.connect()};if(aI++,mQ){let _Q=Vy(J,b),cQ=aI;w(`[bridge:repl] CCR v2: sessionUrl=${_Q} session=${b} gen=${cQ}`),fr({sessionUrl:_Q,ingressToken:FA,sessionId:b,initialSequenceNum:MB}).then((fB)=>{if(UB.signal.aborted){fB.close();return}if(cQ!==aI){w(`[bridge:repl] CCR v2: discarding stale handshake gen=${cQ} current=${aI}`),fB.close();return}if(fH(fB),yA){let rE=fB.getInternalEventWriter?.(),uC=fB.getInternalEventReaders?.();if(rE&&uC)yA(rE,uC)}},(fB)=>{if(w(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${YA(fB)}`,{level:"error"}),rA("tengu_bridge_repl_ccr_v2_init_failed",{}),cQ!==aI)return;if(vQ)QQ.stopWork(WA,vQ,!1).catch((rE)=>{w(`[bridge:repl] stopWork after v2 init failure: ${YA(rE)}`)}),vQ=null,dQ=null;rI()})}else{let _Q=Wy(G,b);w(`[bridge:repl] Ingress URL: ${_Q}`),w(`[bridge:repl] Creating HybridTransport: session=${b}`);let cQ=sI??"";fH(yr(new gH(new URL(_Q),{Authorization:`Bearer ${cQ}`,"anthropic-version":"2023-06-01"},b,()=>({Authorization:`Bearer ${YI()??cQ}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{QA?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),rI()}})))}}};JqA(er);let Q2=c?setInterval(()=>{if(LE)return;n(Q,{sessionId:VA,environmentId:WA,source:"repl"})},3600000):null;Q2?.unref?.();let yH=M().session_keepalive_interval_v2_ms,B2=yH>0?setInterval(()=>{if(!IA)return;w("[bridge:repl] keep_alive sent"),IA.write({type:"keep_alive"}).catch((b)=>{w(`[bridge:repl] keep_alive write failed: ${YA(b)}`)})},yH):null;B2?.unref?.();let I2=!1;cC=async()=>{if(I2){w(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${WA} session=${VA}`);return}I2=!0,p?.();let b=Date.now();if(w(`[bridge:repl] Teardown starting: env=${WA} session=${VA} workId=${vQ??"none"} transportState=${IA?.getStateLabel()??"null"}`),Q2!==null)clearInterval(Q2);if(B2!==null)clearInterval(B2);if(bH)process.off("SIGUSR2",bH);if(UB.abort(),w("[bridge:repl] Teardown: poll loop aborted"),IA){let OA=IA.getLastSequenceNum();if(OA>MB)MB=OA}if(c){IA=null,PB.drop(),await n(Q,{sessionId:VA,environmentId:WA,source:"repl"}),w(`[bridge:repl] Teardown (perpetual): leaving env=${WA} session=${VA} alive on server, duration=${Date.now()-b}ms`);return}let FA=IA;if(IA=null,PB.drop(),FA)FA.write(rz(VA));let BQ=vQ?QQ.stopWork(WA,vQ,!0).then(()=>{w("[bridge:repl] Teardown: stopWork completed")}).catch((OA)=>{w(`[bridge:repl] Teardown stopWork failed: ${YA(OA)}`)}):Promise.resolve();await Promise.all([BQ,D(VA)]),FA?.close(),w("[bridge:repl] Teardown: transport closed"),await QQ.deregisterEnvironment(WA).catch((OA)=>{w(`[bridge:repl] Teardown deregister failed: ${YA(OA)}`)}),await d(Q),w(`[bridge:repl] Teardown complete: env=${WA} duration=${Date.now()-b}ms`)};let At=wJ(()=>cC?.());return w(`[bridge:repl] Ready: env=${WA} session=${VA}`),QA?.("ready"),{get bridgeSessionId(){return VA},get environmentId(){return WA},getSSESequenceNum(){let b=IA?.getLastSequenceNum()??0;return Math.max(MB,b)},sessionIngressUrl:G,writeMessages(b){let FA=b.filter((mQ)=>az(mQ)&&!RQ.has(mQ.uuid)&&!oA.has(mQ.uuid));if(FA.length===0)return;if(!HE)for(let mQ of FA){let sI=Fy(mQ);if(sI!==void 0&&BA?.(sI,VA)){HE=!0;break}}if(PB.enqueue(...FA)){w(`[bridge:repl] Queued ${FA.length} message(s) during initial flush`);return}if(!IA){let mQ=FA.map((sI)=>sI.type).join(",");w(`[bridge:repl] Transport not configured, dropping ${FA.length} message(s) [${mQ}] for session=${VA}`,{level:"warn"});return}for(let mQ of FA)oA.add(mQ.uuid);w(`[bridge:repl] Sending ${FA.length} message(s) via transport`);let OA=$(FA).map((mQ)=>({...mQ,session_id:VA}));IA.writeBatch(OA)},writeSdkMessages(b){let FA=b.filter((OA)=>!OA.uuid||!oA.has(OA.uuid));if(FA.length===0)return;if(!IA){w(`[bridge:repl] Transport not configured, dropping ${FA.length} SDK message(s) for session=${VA}`,{level:"warn"});return}for(let OA of FA)if(OA.uuid)oA.add(OA.uuid);let BQ=FA.map((OA)=>({...OA,session_id:VA}));IA.writeBatch(BQ)},sendControlRequest(b){if(!IA){w("[bridge:repl] Transport not configured, skipping control_request");return}let FA={...b,session_id:VA};IA.write(FA),w(`[bridge:repl] Sent control_request request_id=${b.request_id}`)},sendControlResponse(b){if(!IA){w("[bridge:repl] Transport not configured, skipping control_response");return}let FA={...b,session_id:VA};IA.write(FA),w("[bridge:repl] Sent control_response")},sendControlCancelRequest(b){if(!IA){w("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let FA={type:"control_cancel_request",request_id:b,session_id:VA};IA.write(FA),w(`[bridge:repl] Sent control_cancel_request request_id=${b}`)},sendResult(){if(!IA){w(`[bridge:repl] sendResult: skipping, transport not configured session=${VA}`);return}IA.write(rz(VA)),w(`[bridge:repl] Sent result for session=${VA}`)},async subscribePR(b,FA){let BQ=await e9("subscribe",VA,b,FA,J,F);if(BQ)s.add(`${b}#${FA}`);return BQ},async unsubscribePR(b,FA){let BQ=await e9("unsubscribe",VA,b,FA,J,F);if(BQ)s.delete(`${b}#${FA}`);return BQ},async teardown(){At(),await cC?.(),w("[bridge:repl] Torn down"),rA("tengu_bridge_repl_teardown",{})}}}async function JqA({api:A,getCredentials:Q,signal:B,onStateChange:I,onWorkReceived:E,onEnvironmentLost:C,getWsState:Y,isAtCapacity:J,capacitySignal:G,onFatalError:U,getPollIntervalConfig:F=()=>bN,getHeartbeatInfo:N,onHeartbeatFatal:D}){w(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let $=0,X=null,V=null,M=0,H=!1;while(!B.aborted){let{environmentId:z,environmentSecret:L}=Q(),q=F();try{let S=await A.pollForWork(z,L,B,q.reclaim_older_than_ms);if(M=0,$>0)w(`[bridge:repl] Poll recovered after ${$} consecutive error(s)`),$=0,X=null,V=null,I?.("ready");if(!S){let k=H;if(H=!1,J?.()&&G&&!k){let a=q.poll_interval_ms_at_capacity;if(q.non_exclusive_heartbeat_interval_ms>0&&N){rA("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:q.non_exclusive_heartbeat_interval_ms});let QA=a>0?Date.now()+a:null,BA=!1,u=0;while(!B.aborted&&J()&&(QA===null||Date.now()<QA)){let c=F();if(c.non_exclusive_heartbeat_interval_ms<=0)break;let xA=N();if(!xA)break;let yA=G();try{await A.heartbeatWork(xA.environmentId,xA.workId,xA.sessionToken)}catch(p){if(w(`[bridge:repl:heartbeat] Failed: ${YA(p)}`),p instanceof DE){if(yA.cleanup(),rA("tengu_bridge_heartbeat_error",{status:p.status,error_type:p.status===401||p.status===403?"auth_failed":"fatal"}),D)D(p),w(`[bridge:repl:heartbeat] Fatal (status=${p.status}), work state cleared — fast-polling for re-dispatch`);else BA=!0;break}}u++,await hB(c.non_exclusive_heartbeat_interval_ms,yA.signal),yA.cleanup()}let jA=BA?"error":B.aborted?"shutdown":!J()?"capacity_changed":QA!==null&&Date.now()>=QA?"poll_due":"config_disabled";if(rA("tengu_bridge_heartbeat_mode_exited",{reason:jA,heartbeat_cycles:u}),!BA){if(jA==="poll_due")w(`[bridge:repl] Heartbeat poll_due after ${u} cycles — falling through to pollForWork`);continue}}let DA=a>0?a:q.non_exclusive_heartbeat_interval_ms;if(DA>0){let QA=G(),BA=Date.now();await hB(DA,QA.signal),QA.cleanup();let u=Date.now()-BA-DA;if(u>60000)w(`[bridge:repl] At-capacity sleep overran by ${Math.round(u/1000)}s — process suspension detected, forcing one fast-poll cycle`),rA("tengu_bridge_repl_suspension_detected",{overrun_ms:u}),H=!0}}else await hB(q.poll_interval_ms_not_at_capacity,B);continue}let v;try{v=$y(S.secret)}catch(k){w(`[bridge:repl] Failed to decode work secret: ${YA(k)}`),rA("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(z,S.id,!1).catch(()=>{});continue}w(`[bridge:repl] Acknowledging workId=${S.id}`);try{await A.acknowledgeWork(z,S.id,v.session_ingress_token)}catch(k){w(`[bridge:repl] Acknowledge failed workId=${S.id}: ${YA(k)}`)}if(S.data.type==="healthcheck"){w("[bridge:repl] Healthcheck received");continue}if(S.data.type==="session"){let k=S.data.id;try{tB(k,"session_id")}catch{w(`[bridge:repl] Invalid session_id in work: ${k}`);continue}E(k,v.session_ingress_token,S.id,v.use_code_sessions===!0),w("[bridge:repl] Work accepted, continuing poll loop")}}catch(S){if(B.aborted)break;if(S instanceof DE&&S.status===404&&C){let u=Q().environmentId;if(z!==u){w(`[bridge:repl] Stale poll error for old env=${z}, current env=${u} — skipping onEnvironmentLost`),$=0,X=null;continue}if(M++,w(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${M}/3)`),rA("tengu_bridge_repl_env_lost",{attempt:M}),M>3){w("[bridge:repl] Environment re-registration limit reached (3), giving up"),I?.("failed","Environment deleted and re-registration limit reached"),U?.();break}I?.("reconnecting","environment lost, recreating session");let jA=await C();if(B.aborted)break;if(jA){$=0,X=null,I?.("ready"),w(`[bridge:repl] Re-registered environment: ${jA.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(S instanceof DE){let u=hW(S.errorType),jA=Yy(S);if(w(`[bridge:repl] Fatal poll error: ${S.message} (status=${S.status}, type=${S.errorType??"unknown"})${jA?" (suppressed)":""}`),rA("tengu_bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),i(u?"info":"error","bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),!jA)I?.("failed",u?"session expired · /remote-control to reconnect":S.message);U?.();break}let v=Date.now();if(V!==null&&v-V>nr*2)w(`[bridge:repl] Detected system sleep (${Math.round((v-V)/1000)}s gap), resetting poll error budget`),i("info","bridge_repl_poll_sleep_detected",{gapMs:v-V}),$=0,X=null;if(V=v,$++,X===null)X=v;let k=v-X,a=Iy(S),DA=By(S),QA=Y?.()??"unknown";if(w(`[bridge:repl] Poll error (attempt ${$}, elapsed ${Math.round(k/1000)}s, ws=${QA}): ${DA}`),rA("tengu_bridge_repl_poll_error",{status:a,consecutiveErrors:$,elapsedMs:k}),$===1)I?.("reconnecting",DA);if(k>=or){w(`[bridge:repl] Poll failures exceeded ${or/1000}s (${$} errors), giving up`),i("info","bridge_repl_poll_give_up"),rA("tengu_bridge_repl_poll_give_up",{consecutiveErrors:$,elapsedMs:k,lastStatus:a}),I?.("failed","connection to server lost");break}let BA=Math.min(CqA*2**($-1),nr);if(F().non_exclusive_heartbeat_interval_ms>0){let u=N?.();if(u)try{await A.heartbeatWork(u.environmentId,u.workId,u.sessionToken)}catch{}}await hB(BA,B)}}w(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function GqA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function UqA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function FqA(A,Q){if(UqA(A,Q))return"http://localhost:4000";if(GqA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function rr(A,Q){let{toCompatSessionId:B}=Jt(My),I=B(A);return`${FqA(I,Q)}/code/${I}`}ZQ();async function tr(A){let{dir:Q,registrationDir:B,name:I="Assistant",workerType:E="claude_code_assistant",branch:C="",gitRepoUrl:Y=null,getAccessToken:J,getTrustedDeviceToken:G,baseUrl:U,orgUUID:F,model:N,perpetual:D=!1,initialSSESequenceNum:W,onConflict:$}=A,X=A.onAuth401;if(!J())return w("[bridge:daemon] connectRemoteControl: no OAuth token (set CLAUDE_CODE_OAUTH_TOKEN or log in)"),{ok:!1,error:{kind:"auth",detail:"no OAuth token (set CLAUDE_CODE_OAUTH_TOKEN or log in)"}};let V=U,M={baseUrl:U,getAccessToken:J,orgUUID:F,model:N},H=[],z=null,L=[],q=null,S=[],v=null,k=!1,a=null,DA={detail:null},QA=NqA(),BA=()=>ar({dir:Q,registrationDir:B,machineName:QA,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:V,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:X,onInitError:console.error,createSession:({environmentId:p,title:wQ,signal:n})=>hr({environmentId:p,title:wQ,tags:["claude-code-assistant"],signal:n},M),archiveSession:(p)=>mr(p,M),perpetual:D,initialSSESequenceNum:W,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...bN,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(p){let wQ=x_(p);if(!wQ)return;H.push({content:wQ.content,uuid:wQ.uuid}),z?.(),z=null},onInterrupt(){L.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),q?.(),q=null},onSetModel(p){L.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:p}}),q?.(),q=null},onSetMaxThinkingTokens(p){L.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:p}}),q?.(),q=null},onPermissionResponse(p){S.push(p),v?.(),v=null},onStateChange(p,wQ){if(a?.(p,wQ),p==="failed")DA.detail=wQ??"unknown failure",k=!0,z?.(),q?.(),v?.()}}),u=await BA();if(!u&&$&&DA.detail?.includes("409")){if(await $({machineName:QA,message:DA.detail})==="takeover")k=!1,DA.detail=null,u=await BA()}if(!u){let p=DA.detail??"initBridgeCore returned null (env registration or session creation failed)";return w(`[bridge:daemon] connectRemoteControl failed: ${p}`),{ok:!1,error:{kind:DA.detail?.includes("409")?"conflict":DA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:p}}}async function*jA(){while(!k){while(H.length>0)if(yield H.shift(),k)return;await new Promise((p)=>{z=p})}}async function*c(){while(!k){while(L.length>0)if(yield L.shift(),k)return;await new Promise((p)=>{q=p})}}async function*xA(){while(!k){while(S.length>0)if(yield S.shift(),k)return;await new Promise((p)=>{v=p})}}return{ok:!0,handle:{get sessionUrl(){return rr(u.bridgeSessionId,V)},get environmentId(){return u.environmentId},get bridgeSessionId(){return u.bridgeSessionId},getSSESequenceNum(){return u.getSSESequenceNum()},hasPendingPrompts(){return H.length>0},write(p){u.writeSdkMessages([p])},sendResult(){u.sendResult()},sendControlRequest(p){u.sendControlRequest(p)},sendControlResponse(p){u.sendControlResponse(p)},sendControlCancelRequest(p){u.sendControlCancelRequest(p)},inboundPrompts:jA,controlRequests:c,permissionResponses:xA,onStateChange(p){a=p},async teardown(){k=!0,z?.(),q?.(),v?.(),await u.teardown()}}}}var $qA=1000,WqA=1e4,VqA=5000,XqA=60000,TH=3;function MqA(A){if((A.type==="user"||A.type==="assistant")&&A.parent_tool_use_id!==null)return!1;if(A.type==="user"){let Q=A.message.content;if(!(Array.isArray(Q)&&Q.some((I)=>I.type==="tool_result")))return!1}return!0}function wqA(A,Q,B){let I=A.response?.request_id;if(!I)return null;let E=Q.get(I);if(!E)return I;Q.delete(I),B(I);let C=A.response;if(C.subtype==="success"&&lH(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}async function ZqA(A){let{bridge:Q,sandboxed:B=!1,scheduling:I,buildQueryOptions:E,canUseToolPreFilter:C,onPermissionResolved:Y,transformOutbound:J,stateAdapter:G,initialPrompt:U,userIdleMs:F=300000,signal:N,log:D=()=>{}}=A;D("─── worker start ───");let W=await G?.load(),$={...Q,initialSSESequenceNum:Q.initialSSESequenceNum??W?.lastSSESequenceNum};if(!$.getAccessToken())return{ok:!1,error:{kind:"auth",detail:"getAccessToken returned empty"}};let X=await tr($);if(!X.ok)return D(`bridge connection failed: ${X.error.kind} — ${X.error.detail}`),{ok:!1,error:X.error};let V=X.handle;D(`bridge connected url=${V.sessionUrl} env=${V.environmentId}`);let M=W?.claudeSessionId,H=V.bridgeSessionId,z=[],L=null,q=!1,S=null,v=0,k=!0,a=0,DA=Promise.resolve();function QA(){if(!G)return;let s={claudeSessionId:M,lastSSESequenceNum:V.getSSESequenceNum(),bridgeSessionId:V.bridgeSessionId};DA=DA.then(()=>G.save(s).catch((RQ)=>{D(`stateAdapter.save threw: ${RQ}`)}))}function BA(){if(z.length>0||V.hasPendingPrompts()){D("persist skipped: prompt queued");return}QA()}QA();let u=new AbortController,jA=new Map,c=null;function xA(){return c??=(async()=>{BA();for(let s of jA.keys())V.sendControlCancelRequest(s);jA.clear(),await V.teardown(),await DA})()}if(N.addEventListener("abort",()=>{u.abort(),xA().catch((s)=>D(`teardown threw: ${s}`))}),N.aborted)return await xA(),{ok:!1,error:{kind:"unknown",detail:"aborted before start"}};let yA="connected";V.onStateChange((s,RQ)=>{if(D(`bridge state=${s} detail=${RQ??""}`),yA=s,s==="ready"&&V.bridgeSessionId!==H)H=V.bridgeSessionId,QA();else if(s==="connected")BA();if(s==="failed")D(`bridge failed: ${RQ??"unknown"}`),u.abort(),xA().catch((oA)=>D(`teardown threw: ${oA}`))});let p=I?.horizonMs??600000,wQ=I?.leadMs??VqA,n=null,d=!1,CA=!1,nA="";async function ZA(){if(!I)return;let s=await K_(I.dir).catch((oA)=>{return D(`computeCronHorizon threw: ${oA}`),{nextFire:null,hasOverdue:!1}});n=s.nextFire,CA=s.hasOverdue;let RQ=s.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(s.nextFire).toISOString()} hasOverdue=${s.hasOverdue}`;if(RQ!==nA)nA=RQ,D(RQ)}let BB;if(I)await ZA(),BB=setInterval(ZA,WqA),BB.unref?.();function QQ(s){z.push({type:"user",message:{role:"user",content:s},parent_tool_use_id:null,session_id:""}),L?.(),L=null}async function LQ(s,RQ,oA){if(C){let dQ=await C(s,RQ,oA);if(dQ)return Y?.(s,dQ),dQ}if(yA!=="connected"){D(`permission denied — bridge state=${yA}, request would drop`);let dQ={behavior:"deny",message:`Cannot request permission: remote control is ${yA}. Try again in a moment.`};return Y?.(s,dQ),dQ}let pA=DqA();D(`permission request tool=${s} req=${pA}`);let{signal:UB,suggestions:IA,blockedPath:aI,toolUseID:MB}=oA;V.sendControlRequest({type:"control_request",request_id:pA,request:{subtype:"can_use_tool",tool_name:s,display_name:iH(s),input:RQ,tool_use_id:MB,...IA?{permission_suggestions:IA}:{},...aI?{blocked_path:aI}:{},..."decisionReason"in oA&&oA.decisionReason?{decision_reason:oA.decisionReason}:{},..."agentID"in oA&&oA.agentID?{agent_id:oA.agentID}:{}}});let vQ;try{let dQ=await new Promise((rI,CI)=>{jA.set(pA,rI),vQ=setTimeout((PB,HE,tI,OI,LE)=>{if(PB.delete(HE))tI(`permission timeout req=${HE}`),OI.sendControlCancelRequest(HE),LE({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},XqA,jA,pA,D,V,rI),vQ.unref?.(),UB.addEventListener("abort",()=>{if(jA.delete(pA))V.sendControlCancelRequest(pA);CI(Error("aborted"))},{once:!0})});D(`permission response req=${pA} behavior=${dQ.behavior}`);let m0=dQ.behavior==="allow"?{behavior:"allow",updatedInput:dQ.updatedInput,updatedPermissions:dQ.updatedPermissions}:{behavior:"deny",message:dQ.message??"Denied via remote control"};return Y?.(s,m0),m0}finally{if(vQ)clearTimeout(vQ);jA.delete(pA)}}let WA=!1;async function XB(){if(S!==null||WA||u.signal.aborted)return;if(WA=!0,q=!1,z.length>0)k=!1;async function*s(){while(!q){while(z.length>0)if(k=!1,yield z.shift(),q)return;await new Promise((pA)=>{L=pA})}}D(`spawning query resume=${M??"<fresh>"}`);let RQ={assistant:!0,cwd:Q.dir,resume:M,stderr:(pA)=>D(`[child] ${pA.trimEnd()}`),canUseTool:LQ},oA;try{if(oA=await E(RQ),B)oA={...oA,env:{...oA.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(pA){if(D(`buildQueryOptions threw: ${pA}`),WA=!1,a++,a>=TH)D(`${a} consecutive buildQueryOptions failures — dropping ${z.length} queued input(s)`),z.length=0;else if(z.length>0&&!u.signal.aborted)XB();return}if(u.signal.aborted){WA=!1;return}try{S=av({prompt:s(),options:oA})}finally{WA=!1}(async()=>{try{D("output pump started");for await(let pA of S){if(pA.type==="system"&&pA.subtype==="init"){if(pA.session_id!==M)M=pA.session_id,BA()}if(pA.type==="result")k=!0,a=0,d=!0,BA();if(!MqA(pA))continue;let UB=J?J(pA):pA;if(UB===null)continue;V.write(UB)}}catch(pA){D(`query threw: ${pA}`),a++}finally{D("output pump ended"),S=null;for(let pA of jA.keys())V.sendControlCancelRequest(pA);if(jA.clear(),z.length>0&&!u.signal.aborted)if(a>=TH)D(`${a} consecutive crashes — dropping ${z.length} queued input(s)`),z.length=0;else XB()}})()}let xQ=setInterval(()=>{let s=Date.now(),RQ=n!==null&&n-s<p;if(S===null){let oA=n!==null&&n-s<wQ;if((oA||CA&&!d)&&a<TH&&!u.signal.aborted)D(oA?`cron due in ${n-s}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),XB();return}if(q)return;if(!k||z.length>0)return;if(s-v<F)return;if(RQ)return;if(CA&&!d)return;D("idle conditions met → closing input gen"),BA(),q=!0,L?.(),L=null},$qA);if(xQ.unref?.(),U)D("initialPrompt → injecting"),v=Date.now(),QQ(U),XB();let h0=(async()=>{if(await Promise.all([(async()=>{for await(let s of V.inboundPrompts()){if(u.signal.aborted)return;if(D("bridge prompt received"),v=Date.now(),s.uuid)V.write({type:"user",uuid:s.uuid,session_id:"",message:{role:"user",content:s.content},parent_tool_use_id:null});QQ(s.content),XB()}})(),(async()=>{for await(let s of V.controlRequests()){if(u.signal.aborted)return;switch(s.request.subtype){case"interrupt":D("bridge interrupt"),S?.interrupt();break;case"set_model":D(`bridge setModel=${s.request.model??"<default>"}`),S?.setModel(s.request.model);break;case"set_max_thinking_tokens":D(`bridge setMaxThinkingTokens=${s.request.max_thinking_tokens}`),S?.setMaxThinkingTokens(s.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let s of V.permissionResponses()){if(u.signal.aborted)return;let RQ=wqA(s,jA,V.sendControlCancelRequest);if(RQ)D(`permission response for unknown req=${RQ} (stale)`)}})()]),clearInterval(xQ),BB)clearInterval(BB);S?.close(),await xA(),D("─── worker stop ───")})();return{ok:!0,handle:{get sessionUrl(){return V.sessionUrl},get bridgeSessionId(){return V.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(s){v=Date.now(),QQ(s),XB()},async interrupt(){await S?.interrupt()},done:h0,teardown:xA}}}export{ZqA as runAssistantWorker};
191
+ `)}else w(`SSETransport: Ignoring client_event with no type in payload: event_id=${B.event_id}`);this.onEventCallback?.(B)}handleConnectionError(){if(this.clearLivenessTimer(),this.state==="closing"||this.state==="closed")return;this.abortController?.abort(),this.abortController=null;let A=Date.now();if(!this.reconnectStartTime)this.reconnectStartTime=A;let Q=A-this.reconnectStartTime;if(Q<yjA){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;if(this.refreshHeaders){let E=this.refreshHeaders();Object.assign(this.headers,E),w("SSETransport: Refreshed headers for reconnect")}this.state="reconnecting",this.reconnectAttempts++;let B=Math.min(kjA*Math.pow(2,this.reconnectAttempts-1),bjA),I=Math.max(0,B+B*0.25*(2*Math.random()-1));w(`SSETransport: Reconnecting in ${Math.round(I)}ms (attempt ${this.reconnectAttempts}, ${Math.round(Q/1000)}s elapsed)`),i("error","cli_sse_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},I)}else w(`SSETransport: Reconnection time budget exhausted after ${Math.round(Q/1000)}s`,{level:"error"}),i("error","cli_sse_reconnect_exhausted",{reconnectAttempts:this.reconnectAttempts,elapsedMs:Q}),this.state="closed",this.onCloseCallback?.()}onLivenessTimeout=()=>{this.livenessTimer=null,w("SSETransport: Liveness timeout, reconnecting",{level:"error"}),i("error","cli_sse_liveness_timeout"),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,fjA)}clearLivenessTimer(){if(this.livenessTimer)clearTimeout(this.livenessTimer),this.livenessTimer=null}async write(A){let Q=this.getAuthHeaders();if(Object.keys(Q).length===0){w("SSETransport: No session token available for POST"),i("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":zU()};w(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=L1;I++){try{let C=await fQ.post(this.postUrl,A,{headers:B,validateStatus:pjA});if(C.status===200||C.status===201){w(`SSETransport: POST success type=${A.type}`);return}if(w(`SSETransport: POST ${C.status} body=${KA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){w(`SSETransport: POST returned ${C.status} (client error), not retrying`),i("warn","cli_sse_post_client_error",{status:C.status});return}w(`SSETransport: POST returned ${C.status}, attempt ${I}/${L1}`),i("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){w(`SSETransport: POST error: ${YA(C)}, attempt ${I}/${L1}`),i("warn","cli_sse_post_network_error",{attempt:I})}if(I===L1){w(`SSETransport: POST failed after ${L1} attempts, continuing`),i("warn","cli_sse_post_retries_exhausted");return}let E=Math.min(mjA*Math.pow(2,I-1),cjA);await hB(E)}}isConnectedStatus(){return this.state==="connected"}isClosedStatus(){return this.state==="closed"}setOnData(A){this.onData=A}setOnClose(A){this.onCloseCallback=A}setOnEvent(A){this.onEventCallback=A}close(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;this.clearLivenessTimer(),this.state="closing",this.abortController?.abort(),this.abortController=null}}function ijA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}ZQ();pQ();function yr(A){return{write:(Q)=>A.write(Q),writeBatch:(Q)=>A.writeBatch(Q),close:()=>A.close(),isConnectedStatus:()=>A.isConnectedStatus(),getStateLabel:()=>A.getStateLabel(),setOnData:(Q)=>A.setOnData(Q),setOnClose:(Q)=>A.setOnClose(Q),setOnConnect:(Q)=>A.setOnConnect(Q),connect:()=>void A.connect(),getLastSequenceNum:()=>0,get droppedBatchCount(){return A.droppedBatchCount},reportState:()=>{},reportMetadata:()=>{},reportDelivery:()=>{},flush:()=>Promise.resolve()}}async function fr(A){let{sessionUrl:Q,ingressToken:B,sessionId:I,initialSequenceNum:E,getAuthToken:C}=A,Y;if(C)Y=()=>{let X=C();if(!X)return{};return{Authorization:`Bearer ${X}`}};else FD(B);let J=A.epoch??await Xy(Q,B);w(`[bridge:repl] CCR v2: worker sessionId=${I} epoch=${J}${A.epoch!==void 0?" (from /bridge)":" (via registerWorker)"}`);let G=new URL(Q);G.pathname=G.pathname.replace(/\/$/,"")+"/worker/events/stream";let U=new OH(G,{},I,void 0,E,Y),F,N=new qH(U,new URL(Q),{getAuthHeaders:Y,heartbeatIntervalMs:A.heartbeatIntervalMs,heartbeatJitterFraction:A.heartbeatJitterFraction,onEpochMismatch:()=>{w("[bridge:repl] CCR v2: epoch superseded (409) — closing for poll-loop recovery");try{N.close(),U.close(),F?.(4090)}catch(X){w(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${YA(X)}`,{level:"error"})}throw Error("epoch superseded")}});U.setOnEvent((X)=>{N.reportDelivery(X.event_id,"received"),N.reportDelivery(X.event_id,"processed")});let D,W=!1,$=!1;return{write(X){return N.writeEvent(X)},async writeBatch(X){for(let V of X){if($)break;await N.writeEvent(V)}},close(){$=!0,N.close(),U.close()},isConnectedStatus(){return W},getStateLabel(){if(U.isClosedStatus())return"closed";if(U.isConnectedStatus())return W?"connected":"init";return"connecting"},setOnData(X){U.setOnData(X)},setOnClose(X){F=X,U.setOnClose((V)=>{N.close(),X(V??4092)})},setOnConnect(X){D=X},getLastSequenceNum(){return U.getLastSequenceNum()},droppedBatchCount:0,reportState(X){N.reportState(X)},reportMetadata(X){N.reportMetadata(X)},reportDelivery(X,V){N.reportDelivery(X,V)},flush(){return N.flush()},getInternalEventWriter(){return(X,V,M)=>N.writeInternalEvent(X,V,M)},getInternalEventReaders(){return{readMain:()=>N.readInternalEvents(),readSubagents:()=>N.readSubagentInternalEvents()}},connect(){if(!A.outboundOnly)U.connect();N.initialize(J).then(()=>{W=!0,w(`[bridge:repl] v2 transport ready for writes (epoch=${J}, sse=${U.isConnectedStatus()?"open":"opening"})`),D?.()},(X)=>{w(`[bridge:repl] CCR v2 initialize failed: ${YA(X)}`,{level:"error"}),N.close(),U.close(),F?.(4091)})}}}ZQ();pQ();var djA="2023-06-01",njA="ccr-byoc-2025-07-29";async function hr({environmentId:A,title:Q,tags:B,signal:I},E){let{baseUrl:C,getAccessToken:Y,orgUUID:J,model:G}=E,U=Y();if(!U)return w("[bridge] No access token for session creation"),null;let F=`${C}/v1/sessions`,N;try{N=await fQ.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:SH(U,J),signal:I,validateStatus:(W)=>W<500})}catch(W){return w(`[bridge] Session creation request failed: ${YA(W)}`),null}if(N.status!==200&&N.status!==201){let W=DG(N.data);return w(`[bridge] Session creation failed with status ${N.status}${W?`: ${W}`:""}`),null}let D=N.data;if(!D||typeof D!=="object"||!("id"in D)||typeof D.id!=="string")return w("[bridge] No session ID in response"),null;return D.id}async function mr(A,Q){let{baseUrl:B,getAccessToken:I,orgUUID:E}=Q,C=I();if(!C){w("[bridge] No access token for session archive");return}let Y=`${B}/v1/sessions/${A}/archive`;w(`[bridge] Archiving session ${A}`);try{let J=await fQ.post(Y,{},{headers:SH(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)w(`[bridge] Session ${A} archived successfully`);else{let G=DG(J.data);w(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){w(`[bridge] Session archive request failed: ${YA(J)}`)}}async function e9(A,Q,B,I,E,C){let Y=C();if(!Y)return w(`[bridge] No access token for ${A}-pr`),!1;let J=`${E}/v1/code/github/${A}-pr`,G={session_id:ED(Q),repo:B,pr_number:I},U;try{U=await fQ.post(J,G,{headers:SH(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return w(`[bridge] ${A}-pr request failed: ${YA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=DG(U.data);return w(`[bridge] ${A}-pr failed ${U.status}${N?`: ${N}`:""}`),!1}return w(`[bridge] ${A}-pr ${B}#${I} ok`),!0}function SH(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":djA,"anthropic-beta":njA};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}IB();function cr(A){let Q=new AbortController;function B(){Q.abort(),Q=new AbortController}function I(){let E=new AbortController,C=()=>E.abort();if(A.aborted||Q.signal.aborted)return E.abort(),{signal:E.signal,cleanup:()=>{}};A.addEventListener("abort",C,{once:!0});let Y=Q.signal;return Y.addEventListener("abort",C,{once:!0}),{signal:E.signal,cleanup:()=>{A.removeEventListener("abort",C),Y.removeEventListener("abort",C)}}}return{signal:I,wake:B}}class PH{_active=!1;_pending=[];get active(){return this._active}get pendingCount(){return this._pending.length}start(){this._active=!0}end(){return this._active=!1,this._pending.splice(0)}enqueue(...A){if(!this._active)return!1;return this._pending.push(...A),!0}drop(){this._active=!1;let A=this._pending.length;return this._pending.length=0,A}deactivate(){this._active=!1}}pQ();ZQ();var CqA=2000,nr=60000,or=900000,YqA=0;async function ar(A){let{dir:Q,registrationDir:B,machineName:I,branch:E,gitRepoUrl:C,title:Y,baseUrl:J,sessionIngressUrl:G,workerType:U,getAccessToken:F,createSession:N,archiveSession:D,getCurrentTitle:W=()=>Y,toSDKMessages:$=()=>{throw Error("BridgeCoreParams.toSDKMessages not provided. Pass it if you use writeMessages() or initialMessages — daemon callers that only use writeSdkMessages() never hit this path.")},onAuth401:X,getTrustedDeviceToken:V,getPollIntervalConfig:M=()=>bN,initialHistoryCap:H=200,initialMessages:z,previouslyFlushedUUIDs:L,onInboundMessage:q,onPermissionResponse:S,onInterrupt:v,onSetModel:k,onSetMaxThinkingTokens:a,onSetPermissionMode:DA,onStateChange:QA,onUserMessage:BA,onSessionEstablished:u,onInitError:jA,perpetual:c,initialSSESequenceNum:xA=0,onTransportPersistenceReady:yA,onTransportPersistenceTeardown:p}=A,wQ=++YqA,{writeBridgePointer:n,clearBridgePointer:d,readBridgePointer:CA}=await Promise.resolve().then(() => (ir(),lr)),nA=c?await CA(Q):null,ZA=nA?.source==="repl"?nA:null;w(`[bridge:repl] initBridgeCore #${wQ} starting (initialMessages=${z?.length??0}${ZA?` perpetual prior=env:${ZA.environmentId}`:""})`);let QQ=Cy({baseUrl:J,getAccessToken:F,runnerVersion:"0.2.104",onDebug:w,onAuth401:X,getTrustedDeviceToken:V}),LQ={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:dr(),workerType:U,environmentId:dr(),reuseEnvironmentId:ZA?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},WA,XB;try{let b=await QQ.registerBridgeEnvironment(LQ);WA=b.environment_id,XB=b.environment_secret}catch(b){if(Ey("registration_failed",`[bridge:repl] Environment registration failed: ${YA(b)}`),jA?.(`[bridge:repl] Environment registration failed: ${YA(b)}`),ZA&&b instanceof DE&&(b.status===410||b.status!==401&&hW(b.errorType)))await d(Q);return QA?.("failed",YA(b)),null}w(`[bridge:repl] Environment registered: ${WA}`),i("info","bridge_repl_env_registered"),rA("tengu_bridge_repl_env_registered",{});async function xQ(b,FA){if(WA!==b)return w(`[bridge:repl] Env mismatch (requested ${b}, got ${WA}) — cannot reconnect in place`),!1;let BQ=ez(FA),OA=BQ===FA?[FA]:[FA,BQ];for(let mQ of OA)try{return await QQ.reconnectSession(WA,mQ),w(`[bridge:repl] Reconnected session ${mQ} in place on env ${WA}`),!0}catch(sI){w(`[bridge:repl] reconnectSession(${mQ}) failed: ${YA(sI)}`)}return w("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let h0=ZA?await xQ(ZA.environmentId,ZA.sessionId):!1;if(ZA&&!h0)await d(Q);let VA,s=new Set;if(h0&&ZA){if(VA=ZA.sessionId,w(`[bridge:repl] Perpetual session reused: ${VA}`),z&&L)for(let b of z)L.add(b.uuid)}else{let b=await N({environmentId:WA,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!b)return w("[bridge:repl] Session creation failed, deregistering environment"),jA?.("[bridge:repl] Session creation failed, deregistering environment"),rA("tengu_bridge_repl_session_failed",{}),await QQ.deregisterEnvironment(WA).catch(()=>{}),QA?.("failed","Session creation failed"),null;VA=b,w(`[bridge:repl] Session created: ${VA}`)}u?.(VA),await n(Q,{sessionId:VA,environmentId:WA,source:"repl"}),i("info","bridge_repl_session_created"),rA("tengu_bridge_repl_started",{has_initial_messages:!!(z&&z.length>0),inProtectedNamespace:Ax(),...Jy()});let RQ=new Set;if(z)for(let b of z)RQ.add(b.uuid);let oA=new mW(2000);for(let b of RQ)oA.add(b);let pA=new mW(2000),UB=new AbortController,IA=null,aI=0,MB=h0?xA:0,vQ=null,dQ=null,m0=cr(UB.signal),rI=m0.wake,CI=m0.signal,PB=new PH,HE=!BA,tI=3,OI=0,LE=null;async function KU(){if(LE)return LE;LE=mC();try{return await LE}finally{LE=null}}async function mC(){if(OI++,aI++,w(`[bridge:repl] Reconnecting after env lost (attempt ${OI}/${tI})`),OI>tI)return w(`[bridge:repl] Environment reconnect limit reached (${tI}), giving up`),!1;if(IA){let OA=IA.getLastSequenceNum();if(OA>MB)MB=OA;p?.(),IA.close(),IA=null}if(rI(),PB.drop(),vQ){let OA=vQ;if(await QQ.stopWork(WA,OA,!1).catch(()=>{}),vQ!==OA)return w("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),OI=0,!0;vQ=null,dQ=null}if(UB.signal.aborted)return w("[bridge:repl] Reconnect aborted by teardown"),!1;let b=WA;LQ.reuseEnvironmentId=b;try{let OA=await QQ.registerBridgeEnvironment(LQ);WA=OA.environment_id,XB=OA.environment_secret}catch(OA){return LQ.reuseEnvironmentId=void 0,w(`[bridge:repl] Environment re-registration failed: ${YA(OA)}`),!1}if(LQ.reuseEnvironmentId=void 0,w(`[bridge:repl] Re-registered: requested=${b} got=${WA}`),UB.signal.aborted)return w("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await QQ.deregisterEnvironment(WA).catch(()=>{}),!1;if(IA!==null)return w("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),OI=0,!0;if(await xQ(b,VA))return rA("tengu_bridge_repl_reconnected_in_place",{}),OI=0,!0;if(WA!==b)rA("tengu_bridge_repl_env_expired_fresh_session",{});if(await D(VA),UB.signal.aborted)return w("[bridge:repl] Reconnect aborted after archive, cleaning up"),await QQ.deregisterEnvironment(WA).catch(()=>{}),!1;let FA=W(),BQ=await N({environmentId:WA,title:FA,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!BQ)return w("[bridge:repl] Session creation failed during reconnection"),!1;if(UB.signal.aborted)return w("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await D(BQ),!1;if(VA=BQ,Qh(ED(BQ)).catch(()=>{}),u?.(VA),MB=0,pA.clear(),HE=!BA,w(`[bridge:repl] Re-created session: ${VA}`),await n(Q,{sessionId:VA,environmentId:WA,source:"repl"}),L?.clear(),s.size>0){w(`[bridge:repl] Replaying ${s.size} PR subscription(s) against new session`);for(let OA of s){let mQ=OA.lastIndexOf("#");e9("subscribe",VA,OA.slice(0,mQ),Number(OA.slice(mQ+1)),J,F)}}return OI=0,!0}function YI(){return F()}function c0(){let b=PB.end();if(b.length===0)return;if(!IA){w(`[bridge:repl] Cannot drain ${b.length} pending message(s): no transport`);return}for(let OA of b)oA.add(OA.uuid);let BQ=$(b).map((OA)=>({...OA,session_id:VA}));w(`[bridge:repl] Drained ${b.length} pending message(s) after flush`),IA.writeBatch(BQ)}let cC=null;function rY(){cC?.()}function kH(b){if(w(`[bridge:repl] Transport permanently closed: code=${b}`),rA("tengu_bridge_repl_ws_closed",{code:b}),IA){let BQ=IA.getLastSequenceNum();if(BQ>MB)MB=BQ;p?.(),IA=null}rI();let FA=PB.drop();if(FA>0)w(`[bridge:repl] Dropping ${FA} pending message(s) on transport close (code=${b})`,{level:"warn"});if(b===1000){QA?.("failed","session ended"),UB.abort(),rY();return}QA?.("reconnecting",`Remote Control connection lost (code ${b})`),w(`[bridge:repl] Transport reconnect budget exhausted (code=${b}), attempting env reconnect`),KU().then((BQ)=>{if(BQ)return;if(UB.signal.aborted)return;w("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),rA("tengu_bridge_repl_reconnect_failed",{close_code:b}),QA?.("failed","reconnection failed"),rY()})}let bH,sr=null,er={api:QQ,getCredentials:()=>({environmentId:WA,environmentSecret:XB}),signal:UB.signal,getPollIntervalConfig:M,onStateChange:QA,getWsState:()=>IA?.getStateLabel()??"null",isAtCapacity:()=>IA!==null,capacitySignal:CI,onFatalError:rY,getHeartbeatInfo:()=>{if(!vQ||!dQ)return null;return{environmentId:WA,workId:vQ,sessionToken:dQ}},onHeartbeatFatal:(b)=>{if(w(`[bridge:repl] heartbeatWork fatal (status=${b.status}) — tearing down work item for fast re-dispatch`),IA){let FA=IA.getLastSequenceNum();if(FA>MB)MB=FA;p?.(),IA.close(),IA=null}if(PB.drop(),vQ)QQ.stopWork(WA,vQ,!1).catch((FA)=>{w(`[bridge:repl] stopWork after heartbeat fatal: ${YA(FA)}`)});vQ=null,dQ=null,rI(),QA?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await KU())return null;return{environmentId:WA,environmentSecret:XB}},onWorkReceived:(b,FA,BQ,OA)=>{if(IA?.isConnectedStatus())w(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${BQ})`);if(w(`[bridge:repl] Work received: workId=${BQ} workSessionId=${b} currentSessionId=${VA} match=${tz(b,VA)}`),n(Q,{sessionId:VA,environmentId:WA,source:"repl"}),!tz(b,VA)){w(`[bridge:repl] Rejecting foreign session: expected=${VA} got=${b}`);return}vQ=BQ,dQ=FA;let mQ=OA||sA(process.env.CLAUDE_BRIDGE_USE_CCR_V2),sI;if(!mQ){if(sI=YI(),!sI){w("[bridge:repl] No OAuth token available for session ingress, skipping work");return}FD(sI)}if(rA("tengu_bridge_repl_work_received",{}),IA){p?.();let _Q=IA;IA=null;let cQ=_Q.getLastSequenceNum();if(cQ>MB)MB=cQ;_Q.close()}PB.deactivate();let Qt=(_Q)=>Dy(_Q,{transport:IA,sessionId:VA,onInterrupt:v,onSetModel:k,onSetMaxThinkingTokens:a,onSetPermissionMode:DA}),E2=!1,fH=(_Q)=>{if(IA=_Q,_Q.setOnConnect(()=>{if(IA!==_Q)return;if(w("[bridge:repl] Ingress transport connected"),rA("tengu_bridge_repl_ws_connected",{}),!mQ){let cQ=YI();if(cQ)FD(cQ)}if(I2=!1,!E2&&z&&z.length>0){E2=!0;let cQ=H,fB=z.filter((x1)=>az(x1)&&!L?.has(x1.uuid)),rE=cQ>0&&fB.length>cQ?fB.slice(-cQ):fB;if(rE.length<fB.length)w(`[bridge:repl] Capped initial flush: ${fB.length} -> ${rE.length} (cap=${cQ})`),rA("tengu_bridge_repl_history_capped",{eligible_count:fB.length,capped_count:rE.length});let uC=$(rE);if(uC.length>0){w(`[bridge:repl] Flushing ${uC.length} initial message(s) via transport`);let x1=uC.map((tY)=>({...tY,session_id:VA})),hH=_Q.droppedBatchCount;_Q.writeBatch(x1).then(()=>{if(_Q.droppedBatchCount>hH){w(`[bridge:repl] Initial flush dropped ${_Q.droppedBatchCount-hH} batch(es) — not marking ${uC.length} UUID(s) as flushed`);return}if(L){for(let tY of uC)if(tY.uuid)L.add(tY.uuid)}}).catch((tY)=>w(`[bridge:repl] Initial flush failed: ${tY}`)).finally(()=>{if(IA!==_Q)return;c0(),QA?.("connected")})}else c0(),QA?.("connected")}else if(!PB.active)QA?.("connected")}),_Q.setOnData((cQ)=>{Ny(cQ,oA,pA,q,S,Qt)}),sr=kH,_Q.setOnClose((cQ)=>{if(IA!==_Q)return;kH(cQ)}),!E2&&z&&z.length>0)PB.start();_Q.connect()};if(aI++,mQ){let _Q=Vy(J,b),cQ=aI;w(`[bridge:repl] CCR v2: sessionUrl=${_Q} session=${b} gen=${cQ}`),fr({sessionUrl:_Q,ingressToken:FA,sessionId:b,initialSequenceNum:MB}).then((fB)=>{if(UB.signal.aborted){fB.close();return}if(cQ!==aI){w(`[bridge:repl] CCR v2: discarding stale handshake gen=${cQ} current=${aI}`),fB.close();return}if(fH(fB),yA){let rE=fB.getInternalEventWriter?.(),uC=fB.getInternalEventReaders?.();if(rE&&uC)yA(rE,uC)}},(fB)=>{if(w(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${YA(fB)}`,{level:"error"}),rA("tengu_bridge_repl_ccr_v2_init_failed",{}),cQ!==aI)return;if(vQ)QQ.stopWork(WA,vQ,!1).catch((rE)=>{w(`[bridge:repl] stopWork after v2 init failure: ${YA(rE)}`)}),vQ=null,dQ=null;rI()})}else{let _Q=Wy(G,b);w(`[bridge:repl] Ingress URL: ${_Q}`),w(`[bridge:repl] Creating HybridTransport: session=${b}`);let cQ=sI??"";fH(yr(new gH(new URL(_Q),{Authorization:`Bearer ${cQ}`,"anthropic-version":"2023-06-01"},b,()=>({Authorization:`Bearer ${YI()??cQ}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{QA?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),rI()}})))}}};JqA(er);let Q2=c?setInterval(()=>{if(LE)return;n(Q,{sessionId:VA,environmentId:WA,source:"repl"})},3600000):null;Q2?.unref?.();let yH=M().session_keepalive_interval_v2_ms,B2=yH>0?setInterval(()=>{if(!IA)return;w("[bridge:repl] keep_alive sent"),IA.write({type:"keep_alive"}).catch((b)=>{w(`[bridge:repl] keep_alive write failed: ${YA(b)}`)})},yH):null;B2?.unref?.();let I2=!1;cC=async()=>{if(I2){w(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${WA} session=${VA}`);return}I2=!0,p?.();let b=Date.now();if(w(`[bridge:repl] Teardown starting: env=${WA} session=${VA} workId=${vQ??"none"} transportState=${IA?.getStateLabel()??"null"}`),Q2!==null)clearInterval(Q2);if(B2!==null)clearInterval(B2);if(bH)process.off("SIGUSR2",bH);if(UB.abort(),w("[bridge:repl] Teardown: poll loop aborted"),IA){let OA=IA.getLastSequenceNum();if(OA>MB)MB=OA}if(c){IA=null,PB.drop(),await n(Q,{sessionId:VA,environmentId:WA,source:"repl"}),w(`[bridge:repl] Teardown (perpetual): leaving env=${WA} session=${VA} alive on server, duration=${Date.now()-b}ms`);return}let FA=IA;if(IA=null,PB.drop(),FA)FA.write(rz(VA));let BQ=vQ?QQ.stopWork(WA,vQ,!0).then(()=>{w("[bridge:repl] Teardown: stopWork completed")}).catch((OA)=>{w(`[bridge:repl] Teardown stopWork failed: ${YA(OA)}`)}):Promise.resolve();await Promise.all([BQ,D(VA)]),FA?.close(),w("[bridge:repl] Teardown: transport closed"),await QQ.deregisterEnvironment(WA).catch((OA)=>{w(`[bridge:repl] Teardown deregister failed: ${YA(OA)}`)}),await d(Q),w(`[bridge:repl] Teardown complete: env=${WA} duration=${Date.now()-b}ms`)};let At=wJ(()=>cC?.());return w(`[bridge:repl] Ready: env=${WA} session=${VA}`),QA?.("ready"),{get bridgeSessionId(){return VA},get environmentId(){return WA},getSSESequenceNum(){let b=IA?.getLastSequenceNum()??0;return Math.max(MB,b)},sessionIngressUrl:G,writeMessages(b){let FA=b.filter((mQ)=>az(mQ)&&!RQ.has(mQ.uuid)&&!oA.has(mQ.uuid));if(FA.length===0)return;if(!HE)for(let mQ of FA){let sI=Fy(mQ);if(sI!==void 0&&BA?.(sI,VA)){HE=!0;break}}if(PB.enqueue(...FA)){w(`[bridge:repl] Queued ${FA.length} message(s) during initial flush`);return}if(!IA){let mQ=FA.map((sI)=>sI.type).join(",");w(`[bridge:repl] Transport not configured, dropping ${FA.length} message(s) [${mQ}] for session=${VA}`,{level:"warn"});return}for(let mQ of FA)oA.add(mQ.uuid);w(`[bridge:repl] Sending ${FA.length} message(s) via transport`);let OA=$(FA).map((mQ)=>({...mQ,session_id:VA}));IA.writeBatch(OA)},writeSdkMessages(b){let FA=b.filter((OA)=>!OA.uuid||!oA.has(OA.uuid));if(FA.length===0)return;if(!IA){w(`[bridge:repl] Transport not configured, dropping ${FA.length} SDK message(s) for session=${VA}`,{level:"warn"});return}for(let OA of FA)if(OA.uuid)oA.add(OA.uuid);let BQ=FA.map((OA)=>({...OA,session_id:VA}));IA.writeBatch(BQ)},sendControlRequest(b){if(!IA){w("[bridge:repl] Transport not configured, skipping control_request");return}let FA={...b,session_id:VA};IA.write(FA),w(`[bridge:repl] Sent control_request request_id=${b.request_id}`)},sendControlResponse(b){if(!IA){w("[bridge:repl] Transport not configured, skipping control_response");return}let FA={...b,session_id:VA};IA.write(FA),w("[bridge:repl] Sent control_response")},sendControlCancelRequest(b){if(!IA){w("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let FA={type:"control_cancel_request",request_id:b,session_id:VA};IA.write(FA),w(`[bridge:repl] Sent control_cancel_request request_id=${b}`)},sendResult(){if(!IA){w(`[bridge:repl] sendResult: skipping, transport not configured session=${VA}`);return}IA.write(rz(VA)),w(`[bridge:repl] Sent result for session=${VA}`)},async subscribePR(b,FA){let BQ=await e9("subscribe",VA,b,FA,J,F);if(BQ)s.add(`${b}#${FA}`);return BQ},async unsubscribePR(b,FA){let BQ=await e9("unsubscribe",VA,b,FA,J,F);if(BQ)s.delete(`${b}#${FA}`);return BQ},async teardown(){At(),await cC?.(),w("[bridge:repl] Torn down"),rA("tengu_bridge_repl_teardown",{})}}}async function JqA({api:A,getCredentials:Q,signal:B,onStateChange:I,onWorkReceived:E,onEnvironmentLost:C,getWsState:Y,isAtCapacity:J,capacitySignal:G,onFatalError:U,getPollIntervalConfig:F=()=>bN,getHeartbeatInfo:N,onHeartbeatFatal:D}){w(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let $=0,X=null,V=null,M=0,H=!1;while(!B.aborted){let{environmentId:z,environmentSecret:L}=Q(),q=F();try{let S=await A.pollForWork(z,L,B,q.reclaim_older_than_ms);if(M=0,$>0)w(`[bridge:repl] Poll recovered after ${$} consecutive error(s)`),$=0,X=null,V=null,I?.("ready");if(!S){let k=H;if(H=!1,J?.()&&G&&!k){let a=q.poll_interval_ms_at_capacity;if(q.non_exclusive_heartbeat_interval_ms>0&&N){rA("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:q.non_exclusive_heartbeat_interval_ms});let QA=a>0?Date.now()+a:null,BA=!1,u=0;while(!B.aborted&&J()&&(QA===null||Date.now()<QA)){let c=F();if(c.non_exclusive_heartbeat_interval_ms<=0)break;let xA=N();if(!xA)break;let yA=G();try{await A.heartbeatWork(xA.environmentId,xA.workId,xA.sessionToken)}catch(p){if(w(`[bridge:repl:heartbeat] Failed: ${YA(p)}`),p instanceof DE){if(yA.cleanup(),rA("tengu_bridge_heartbeat_error",{status:p.status,error_type:p.status===401||p.status===403?"auth_failed":"fatal"}),D)D(p),w(`[bridge:repl:heartbeat] Fatal (status=${p.status}), work state cleared — fast-polling for re-dispatch`);else BA=!0;break}}u++,await hB(c.non_exclusive_heartbeat_interval_ms,yA.signal),yA.cleanup()}let jA=BA?"error":B.aborted?"shutdown":!J()?"capacity_changed":QA!==null&&Date.now()>=QA?"poll_due":"config_disabled";if(rA("tengu_bridge_heartbeat_mode_exited",{reason:jA,heartbeat_cycles:u}),!BA){if(jA==="poll_due")w(`[bridge:repl] Heartbeat poll_due after ${u} cycles — falling through to pollForWork`);continue}}let DA=a>0?a:q.non_exclusive_heartbeat_interval_ms;if(DA>0){let QA=G(),BA=Date.now();await hB(DA,QA.signal),QA.cleanup();let u=Date.now()-BA-DA;if(u>60000)w(`[bridge:repl] At-capacity sleep overran by ${Math.round(u/1000)}s — process suspension detected, forcing one fast-poll cycle`),rA("tengu_bridge_repl_suspension_detected",{overrun_ms:u}),H=!0}}else await hB(q.poll_interval_ms_not_at_capacity,B);continue}let v;try{v=$y(S.secret)}catch(k){w(`[bridge:repl] Failed to decode work secret: ${YA(k)}`),rA("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(z,S.id,!1).catch(()=>{});continue}w(`[bridge:repl] Acknowledging workId=${S.id}`);try{await A.acknowledgeWork(z,S.id,v.session_ingress_token)}catch(k){w(`[bridge:repl] Acknowledge failed workId=${S.id}: ${YA(k)}`)}if(S.data.type==="healthcheck"){w("[bridge:repl] Healthcheck received");continue}if(S.data.type==="session"){let k=S.data.id;try{tB(k,"session_id")}catch{w(`[bridge:repl] Invalid session_id in work: ${k}`);continue}E(k,v.session_ingress_token,S.id,v.use_code_sessions===!0),w("[bridge:repl] Work accepted, continuing poll loop")}}catch(S){if(B.aborted)break;if(S instanceof DE&&S.status===404&&C){let u=Q().environmentId;if(z!==u){w(`[bridge:repl] Stale poll error for old env=${z}, current env=${u} — skipping onEnvironmentLost`),$=0,X=null;continue}if(M++,w(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${M}/3)`),rA("tengu_bridge_repl_env_lost",{attempt:M}),M>3){w("[bridge:repl] Environment re-registration limit reached (3), giving up"),I?.("failed","Environment deleted and re-registration limit reached"),U?.();break}I?.("reconnecting","environment lost, recreating session");let jA=await C();if(B.aborted)break;if(jA){$=0,X=null,I?.("ready"),w(`[bridge:repl] Re-registered environment: ${jA.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(S instanceof DE){let u=hW(S.errorType),jA=Yy(S);if(w(`[bridge:repl] Fatal poll error: ${S.message} (status=${S.status}, type=${S.errorType??"unknown"})${jA?" (suppressed)":""}`),rA("tengu_bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),i(u?"info":"error","bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),!jA)I?.("failed",u?"session expired · /remote-control to reconnect":S.message);U?.();break}let v=Date.now();if(V!==null&&v-V>nr*2)w(`[bridge:repl] Detected system sleep (${Math.round((v-V)/1000)}s gap), resetting poll error budget`),i("info","bridge_repl_poll_sleep_detected",{gapMs:v-V}),$=0,X=null;if(V=v,$++,X===null)X=v;let k=v-X,a=Iy(S),DA=By(S),QA=Y?.()??"unknown";if(w(`[bridge:repl] Poll error (attempt ${$}, elapsed ${Math.round(k/1000)}s, ws=${QA}): ${DA}`),rA("tengu_bridge_repl_poll_error",{status:a,consecutiveErrors:$,elapsedMs:k}),$===1)I?.("reconnecting",DA);if(k>=or){w(`[bridge:repl] Poll failures exceeded ${or/1000}s (${$} errors), giving up`),i("info","bridge_repl_poll_give_up"),rA("tengu_bridge_repl_poll_give_up",{consecutiveErrors:$,elapsedMs:k,lastStatus:a}),I?.("failed","connection to server lost");break}let BA=Math.min(CqA*2**($-1),nr);if(F().non_exclusive_heartbeat_interval_ms>0){let u=N?.();if(u)try{await A.heartbeatWork(u.environmentId,u.workId,u.sessionToken)}catch{}}await hB(BA,B)}}w(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function GqA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function UqA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function FqA(A,Q){if(UqA(A,Q))return"http://localhost:4000";if(GqA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function rr(A,Q){let{toCompatSessionId:B}=Jt(My),I=B(A);return`${FqA(I,Q)}/code/${I}`}ZQ();async function tr(A){let{dir:Q,registrationDir:B,name:I="Assistant",workerType:E="claude_code_assistant",branch:C="",gitRepoUrl:Y=null,getAccessToken:J,getTrustedDeviceToken:G,baseUrl:U,orgUUID:F,model:N,perpetual:D=!1,initialSSESequenceNum:W,onConflict:$}=A,X=A.onAuth401;if(!J())return w("[bridge:daemon] connectRemoteControl: no OAuth token (set CLAUDE_CODE_OAUTH_TOKEN or log in)"),{ok:!1,error:{kind:"auth",detail:"no OAuth token (set CLAUDE_CODE_OAUTH_TOKEN or log in)"}};let V=U,M={baseUrl:U,getAccessToken:J,orgUUID:F,model:N},H=[],z=null,L=[],q=null,S=[],v=null,k=!1,a=null,DA={detail:null},QA=NqA(),BA=()=>ar({dir:Q,registrationDir:B,machineName:QA,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:V,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:X,onInitError:console.error,createSession:({environmentId:p,title:wQ,signal:n})=>hr({environmentId:p,title:wQ,tags:["claude-code-assistant"],signal:n},M),archiveSession:(p)=>mr(p,M),perpetual:D,initialSSESequenceNum:W,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...bN,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(p){let wQ=x_(p);if(!wQ)return;H.push({content:wQ.content,uuid:wQ.uuid}),z?.(),z=null},onInterrupt(){L.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),q?.(),q=null},onSetModel(p){L.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:p}}),q?.(),q=null},onSetMaxThinkingTokens(p){L.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:p}}),q?.(),q=null},onPermissionResponse(p){S.push(p),v?.(),v=null},onStateChange(p,wQ){if(a?.(p,wQ),p==="failed")DA.detail=wQ??"unknown failure",k=!0,z?.(),q?.(),v?.()}}),u=await BA();if(!u&&$&&DA.detail?.includes("409")){if(await $({machineName:QA,message:DA.detail})==="takeover")k=!1,DA.detail=null,u=await BA()}if(!u){let p=DA.detail??"initBridgeCore returned null (env registration or session creation failed)";return w(`[bridge:daemon] connectRemoteControl failed: ${p}`),{ok:!1,error:{kind:DA.detail?.includes("409")?"conflict":DA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:p}}}async function*jA(){while(!k){while(H.length>0)if(yield H.shift(),k)return;await new Promise((p)=>{z=p})}}async function*c(){while(!k){while(L.length>0)if(yield L.shift(),k)return;await new Promise((p)=>{q=p})}}async function*xA(){while(!k){while(S.length>0)if(yield S.shift(),k)return;await new Promise((p)=>{v=p})}}return{ok:!0,handle:{get sessionUrl(){return rr(u.bridgeSessionId,V)},get environmentId(){return u.environmentId},get bridgeSessionId(){return u.bridgeSessionId},getSSESequenceNum(){return u.getSSESequenceNum()},hasPendingPrompts(){return H.length>0},write(p){u.writeSdkMessages([p])},sendResult(){u.sendResult()},sendControlRequest(p){u.sendControlRequest(p)},sendControlResponse(p){u.sendControlResponse(p)},sendControlCancelRequest(p){u.sendControlCancelRequest(p)},inboundPrompts:jA,controlRequests:c,permissionResponses:xA,onStateChange(p){a=p},async teardown(){k=!0,z?.(),q?.(),v?.(),await u.teardown()}}}}var $qA=1000,WqA=1e4,VqA=5000,XqA=60000,TH=3;function MqA(A){if((A.type==="user"||A.type==="assistant")&&A.parent_tool_use_id!==null)return!1;if(A.type==="user"){let Q=A.message.content;if(!(Array.isArray(Q)&&Q.some((I)=>I.type==="tool_result")))return!1}return!0}function wqA(A,Q,B){let I=A.response?.request_id;if(!I)return null;let E=Q.get(I);if(!E)return I;Q.delete(I),B(I);let C=A.response;if(C.subtype==="success"&&lH(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}async function ZqA(A){let{bridge:Q,sandboxed:B=!1,scheduling:I,buildQueryOptions:E,canUseToolPreFilter:C,onPermissionResolved:Y,transformOutbound:J,stateAdapter:G,initialPrompt:U,userIdleMs:F=300000,signal:N,log:D=()=>{}}=A;D("─── worker start ───");let W=await G?.load(),$={...Q,initialSSESequenceNum:Q.initialSSESequenceNum??W?.lastSSESequenceNum};if(!$.getAccessToken())return{ok:!1,error:{kind:"auth",detail:"getAccessToken returned empty"}};let X=await tr($);if(!X.ok)return D(`bridge connection failed: ${X.error.kind} — ${X.error.detail}`),{ok:!1,error:X.error};let V=X.handle;D(`bridge connected url=${V.sessionUrl} env=${V.environmentId}`);let M=W?.claudeSessionId,H=V.bridgeSessionId,z=[],L=null,q=!1,S=null,v=0,k=!0,a=0,DA=Promise.resolve();function QA(){if(!G)return;let s={claudeSessionId:M,lastSSESequenceNum:V.getSSESequenceNum(),bridgeSessionId:V.bridgeSessionId};DA=DA.then(()=>G.save(s).catch((RQ)=>{D(`stateAdapter.save threw: ${RQ}`)}))}function BA(){if(z.length>0||V.hasPendingPrompts()){D("persist skipped: prompt queued");return}QA()}QA();let u=new AbortController,jA=new Map,c=null;function xA(){return c??=(async()=>{BA();for(let s of jA.keys())V.sendControlCancelRequest(s);jA.clear(),await V.teardown(),await DA})()}if(N.addEventListener("abort",()=>{u.abort(),xA().catch((s)=>D(`teardown threw: ${s}`))}),N.aborted)return await xA(),{ok:!1,error:{kind:"unknown",detail:"aborted before start"}};let yA="connected";V.onStateChange((s,RQ)=>{if(D(`bridge state=${s} detail=${RQ??""}`),yA=s,s==="ready"&&V.bridgeSessionId!==H)H=V.bridgeSessionId,QA();else if(s==="connected")BA();if(s==="failed")D(`bridge failed: ${RQ??"unknown"}`),u.abort(),xA().catch((oA)=>D(`teardown threw: ${oA}`))});let p=I?.horizonMs??600000,wQ=I?.leadMs??VqA,n=null,d=!1,CA=!1,nA="";async function ZA(){if(!I)return;let s=await K_(I.dir).catch((oA)=>{return D(`computeCronHorizon threw: ${oA}`),{nextFire:null,hasOverdue:!1}});n=s.nextFire,CA=s.hasOverdue;let RQ=s.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(s.nextFire).toISOString()} hasOverdue=${s.hasOverdue}`;if(RQ!==nA)nA=RQ,D(RQ)}let BB;if(I)await ZA(),BB=setInterval(ZA,WqA),BB.unref?.();function QQ(s){z.push({type:"user",message:{role:"user",content:s},parent_tool_use_id:null,session_id:""}),L?.(),L=null}async function LQ(s,RQ,oA){if(C){let dQ=await C(s,RQ,oA);if(dQ)return Y?.(s,dQ),dQ}if(yA!=="connected"){D(`permission denied — bridge state=${yA}, request would drop`);let dQ={behavior:"deny",message:`Cannot request permission: remote control is ${yA}. Try again in a moment.`};return Y?.(s,dQ),dQ}let pA=DqA();D(`permission request tool=${s} req=${pA}`);let{signal:UB,suggestions:IA,blockedPath:aI,toolUseID:MB}=oA;V.sendControlRequest({type:"control_request",request_id:pA,request:{subtype:"can_use_tool",tool_name:s,display_name:iH(s),input:RQ,tool_use_id:MB,...IA?{permission_suggestions:IA}:{},...aI?{blocked_path:aI}:{},..."decisionReason"in oA&&oA.decisionReason?{decision_reason:oA.decisionReason}:{},..."agentID"in oA&&oA.agentID?{agent_id:oA.agentID}:{}}});let vQ;try{let dQ=await new Promise((rI,CI)=>{jA.set(pA,rI),vQ=setTimeout((PB,HE,tI,OI,LE)=>{if(PB.delete(HE))tI(`permission timeout req=${HE}`),OI.sendControlCancelRequest(HE),LE({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},XqA,jA,pA,D,V,rI),vQ.unref?.(),UB.addEventListener("abort",()=>{if(jA.delete(pA))V.sendControlCancelRequest(pA);CI(Error("aborted"))},{once:!0})});D(`permission response req=${pA} behavior=${dQ.behavior}`);let m0=dQ.behavior==="allow"?{behavior:"allow",updatedInput:dQ.updatedInput,updatedPermissions:dQ.updatedPermissions}:{behavior:"deny",message:dQ.message??"Denied via remote control"};return Y?.(s,m0),m0}finally{if(vQ)clearTimeout(vQ);jA.delete(pA)}}let WA=!1;async function XB(){if(S!==null||WA||u.signal.aborted)return;if(WA=!0,q=!1,z.length>0)k=!1;async function*s(){while(!q){while(z.length>0)if(k=!1,yield z.shift(),q)return;await new Promise((pA)=>{L=pA})}}D(`spawning query resume=${M??"<fresh>"}`);let RQ={assistant:!0,cwd:Q.dir,resume:M,stderr:(pA)=>D(`[child] ${pA.trimEnd()}`),canUseTool:LQ},oA;try{if(oA=await E(RQ),B)oA={...oA,env:{...oA.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(pA){if(D(`buildQueryOptions threw: ${pA}`),WA=!1,a++,a>=TH)D(`${a} consecutive buildQueryOptions failures — dropping ${z.length} queued input(s)`),z.length=0;else if(z.length>0&&!u.signal.aborted)XB();return}if(u.signal.aborted){WA=!1;return}try{S=av({prompt:s(),options:oA})}finally{WA=!1}(async()=>{try{D("output pump started");for await(let pA of S){if(pA.type==="system"&&pA.subtype==="init"){if(pA.session_id!==M)M=pA.session_id,BA()}if(pA.type==="result")k=!0,a=0,d=!0,BA();if(!MqA(pA))continue;let UB=J?J(pA):pA;if(UB===null)continue;V.write(UB)}}catch(pA){D(`query threw: ${pA}`),a++}finally{D("output pump ended"),S=null;for(let pA of jA.keys())V.sendControlCancelRequest(pA);if(jA.clear(),z.length>0&&!u.signal.aborted)if(a>=TH)D(`${a} consecutive crashes — dropping ${z.length} queued input(s)`),z.length=0;else XB()}})()}let xQ=setInterval(()=>{let s=Date.now(),RQ=n!==null&&n-s<p;if(S===null){let oA=n!==null&&n-s<wQ;if((oA||CA&&!d)&&a<TH&&!u.signal.aborted)D(oA?`cron due in ${n-s}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),XB();return}if(q)return;if(!k||z.length>0)return;if(s-v<F)return;if(RQ)return;if(CA&&!d)return;D("idle conditions met → closing input gen"),BA(),q=!0,L?.(),L=null},$qA);if(xQ.unref?.(),U)D("initialPrompt → injecting"),v=Date.now(),QQ(U),XB();let h0=(async()=>{if(await Promise.all([(async()=>{for await(let s of V.inboundPrompts()){if(u.signal.aborted)return;if(D("bridge prompt received"),v=Date.now(),s.uuid)V.write({type:"user",uuid:s.uuid,session_id:"",message:{role:"user",content:s.content},parent_tool_use_id:null});QQ(s.content),XB()}})(),(async()=>{for await(let s of V.controlRequests()){if(u.signal.aborted)return;switch(s.request.subtype){case"interrupt":D("bridge interrupt"),S?.interrupt();break;case"set_model":D(`bridge setModel=${s.request.model??"<default>"}`),S?.setModel(s.request.model);break;case"set_max_thinking_tokens":D(`bridge setMaxThinkingTokens=${s.request.max_thinking_tokens}`),S?.setMaxThinkingTokens(s.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let s of V.permissionResponses()){if(u.signal.aborted)return;let RQ=wqA(s,jA,V.sendControlCancelRequest);if(RQ)D(`permission response for unknown req=${RQ} (stale)`)}})()]),clearInterval(xQ),BB)clearInterval(BB);S?.close(),await xA(),D("─── worker stop ───")})();return{ok:!0,handle:{get sessionUrl(){return V.sessionUrl},get bridgeSessionId(){return V.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(s){v=Date.now(),QQ(s),XB()},async interrupt(){await S?.interrupt()},done:h0,teardown:xA}}}export{ZqA as runAssistantWorker};