@anthropic-ai/claude-agent-sdk 0.2.124 → 0.2.126

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.124
3
+ // Version: 0.2.126
4
4
  import{createRequire as FCA}from"node:module";var BCA=Object.create;var{getPrototypeOf:ICA,defineProperty:iF,getOwnPropertyNames:Hq,getOwnPropertyDescriptor:ECA}=Object,Zq=Object.prototype.hasOwnProperty;function Lq(A){return this[A]}var CCA,YCA,jI=(A,Q,B)=>{var I=A!=null&&typeof A==="object";if(I){var E=Q?CCA??=new WeakMap:YCA??=new WeakMap,C=E.get(A);if(C)return C}B=A!=null?BCA(ICA(A)):{};let Y=Q||!A||!A.__esModule?iF(B,"default",{value:A,enumerable:!0}):B;for(let J of Hq(A))if(!Zq.call(Y,J))iF(Y,J,{get:Lq.bind(A,J),enumerable:!0});if(I)E.set(A,Y);return Y},JCA=(A)=>{var Q=(Kq??=new WeakMap).get(A),B;if(Q)return Q;if(Q=iF({},"__esModule",{value:!0}),A&&typeof A==="object"||typeof A==="function"){for(var I of Hq(A))if(!Zq.call(Q,I))iF(Q,I,{get:Lq.bind(A,I),enumerable:!(B=ECA(A,I))||B.enumerable})}return Kq.set(A,Q),Q},Kq,w=(A,Q)=>()=>(Q||A((Q={exports:{}}).exports,Q),Q.exports);var GCA=(A)=>A;function UCA(A,Q){this[A]=GCA.bind(null,Q)}var tI=(A,Q)=>{for(var B in Q)iF(A,B,{get:Q[B],enumerable:!0,configurable:!0,set:UCA.bind(Q,B)})};var H=(A,Q)=>()=>(A&&(Q=A(A=0)),Q);var q=FCA(import.meta.url),NCA=Symbol.dispose||Symbol.for("Symbol.dispose"),$CA=Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose"),ZQ=(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[$CA];if(I===void 0)I=Q[NCA];if(typeof I!=="function")throw TypeError("Object not disposable");A.push([B,I,Q])}else if(B)A.push([B]);return Q},LQ=(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 M2=()=>{};function BQ(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 oF(A){if(!A||A.startsWith("-")||A.startsWith("/"))return!1;if(A.includes(".."))return!1;if(A.split("/").some((Q)=>Q==="."||Q===""))return!1;return/^[a-zA-Z0-9/._+@-]+$/.test(A)}function tJ(){let A=new Set;return{subscribe(Q){return A.add(Q),()=>{A.delete(Q)}},emit(...Q){let B;for(let I of A)try{I(...Q)}catch(E){(B??=[]).push(E)}if(B)throw B.length===1?B[0]:AggregateError(B,"Signal listener(s) threw")},clear(){A.clear()}}}var xq=()=>{};var aF=H(()=>{xq()});var zCA,Oq;var gq=H(()=>{zCA=typeof global=="object"&&global&&global.Object===Object&&global,Oq=zCA});var KCA,HCA,sJ;var XD=H(()=>{gq();KCA=typeof self=="object"&&self&&self.Object===Object&&self,HCA=Oq||KCA||Function("return this")(),sJ=HCA});var ZCA,eJ;var w2=H(()=>{XD();ZCA=sJ.Symbol,eJ=ZCA});function jCA(A){var Q=LCA.call(A,rF),B=A[rF];try{A[rF]=void 0;var I=!0}catch(C){}var E=RCA.call(A);if(I)if(Q)A[rF]=B;else delete A[rF];return E}var Sq,LCA,RCA,rF,vq;var _q=H(()=>{w2();Sq=Object.prototype,LCA=Sq.hasOwnProperty,RCA=Sq.toString,rF=eJ?eJ.toStringTag:void 0;vq=jCA});function OCA(A){return xCA.call(A)}var qCA,xCA,Pq;var Tq=H(()=>{qCA=Object.prototype,xCA=qCA.toString;Pq=OCA});function vCA(A){if(A==null)return A===void 0?SCA:gCA;return bq&&bq in Object(A)?vq(A):Pq(A)}var gCA="[object Null]",SCA="[object Undefined]",bq,kq;var yq=H(()=>{w2();_q();Tq();bq=eJ?eJ.toStringTag:void 0;kq=vCA});function _CA(A){var Q=typeof A;return A!=null&&(Q=="object"||Q=="function")}var VD;var z2=H(()=>{VD=_CA});function yCA(A){if(!VD(A))return!1;var Q=kq(A);return Q==TCA||Q==bCA||Q==PCA||Q==kCA}var PCA="[object AsyncFunction]",TCA="[object Function]",bCA="[object GeneratorFunction]",kCA="[object Proxy]",fq;var hq=H(()=>{yq();z2();fq=yCA});var fCA,MD;var mq=H(()=>{XD();fCA=sJ["__core-js_shared__"],MD=fCA});function hCA(A){return!!uq&&uq in A}var uq,cq;var pq=H(()=>{mq();uq=function(){var A=/[^.]+$/.exec(MD&&MD.keys&&MD.keys.IE_PROTO||"");return A?"Symbol(src)_1."+A:""}();cq=hCA});function cCA(A){if(A!=null){try{return uCA.call(A)}catch(Q){}try{return A+""}catch(Q){}}return""}var mCA,uCA,lq;var iq=H(()=>{mCA=Function.prototype,uCA=mCA.toString;lq=cCA});function rCA(A){if(!VD(A)||cq(A))return!1;var Q=fq(A)?aCA:lCA;return Q.test(lq(A))}var pCA,lCA,iCA,dCA,nCA,oCA,aCA,dq;var nq=H(()=>{hq();pq();z2();iq();pCA=/[\\^$.*+?()[\]{}|]/g,lCA=/^\[object .+?Constructor\]$/,iCA=Function.prototype,dCA=Object.prototype,nCA=iCA.toString,oCA=dCA.hasOwnProperty,aCA=RegExp("^"+nCA.call(oCA).replace(pCA,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");dq=rCA});function tCA(A,Q){return A==null?void 0:A[Q]}var oq;var aq=H(()=>{oq=tCA});function sCA(A,Q){var B=oq(A,Q);return dq(B)?B:void 0}var wD;var K2=H(()=>{nq();aq();wD=sCA});var eCA,gC;var tF=H(()=>{K2();eCA=wD(Object,"create"),gC=eCA});function A0A(){this.__data__=gC?gC(null):{},this.size=0}var rq;var tq=H(()=>{tF();rq=A0A});function Q0A(A){var Q=this.has(A)&&delete this.__data__[A];return this.size-=Q?1:0,Q}var sq;var eq=H(()=>{sq=Q0A});function C0A(A){var Q=this.__data__;if(gC){var B=Q[A];return B===B0A?void 0:B}return E0A.call(Q,A)?Q[A]:void 0}var B0A="__lodash_hash_undefined__",I0A,E0A,Ax;var Qx=H(()=>{tF();I0A=Object.prototype,E0A=I0A.hasOwnProperty;Ax=C0A});function G0A(A){var Q=this.__data__;return gC?Q[A]!==void 0:J0A.call(Q,A)}var Y0A,J0A,Bx;var Ix=H(()=>{tF();Y0A=Object.prototype,J0A=Y0A.hasOwnProperty;Bx=G0A});function F0A(A,Q){var B=this.__data__;return this.size+=this.has(A)?0:1,B[A]=gC&&Q===void 0?U0A:Q,this}var U0A="__lodash_hash_undefined__",Ex;var Cx=H(()=>{tF();Ex=F0A});function AG(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 H2;var Yx=H(()=>{tq();eq();Qx();Ix();Cx();AG.prototype.clear=rq;AG.prototype.delete=sq;AG.prototype.get=Ax;AG.prototype.has=Bx;AG.prototype.set=Ex;H2=AG});function N0A(){this.__data__=[],this.size=0}var Jx;var Gx=H(()=>{Jx=N0A});function $0A(A,Q){return A===Q||A!==A&&Q!==Q}var Ux;var Fx=H(()=>{Ux=$0A});function D0A(A,Q){var B=A.length;while(B--)if(Ux(A[B][0],Q))return B;return-1}var L0;var sF=H(()=>{Fx();L0=D0A});function V0A(A){var Q=this.__data__,B=L0(Q,A);if(B<0)return!1;var I=Q.length-1;if(B==I)Q.pop();else X0A.call(Q,B,1);return--this.size,!0}var W0A,X0A,Nx;var $x=H(()=>{sF();W0A=Array.prototype,X0A=W0A.splice;Nx=V0A});function M0A(A){var Q=this.__data__,B=L0(Q,A);return B<0?void 0:Q[B][1]}var Dx;var Wx=H(()=>{sF();Dx=M0A});function w0A(A){return L0(this.__data__,A)>-1}var Xx;var Vx=H(()=>{sF();Xx=w0A});function z0A(A,Q){var B=this.__data__,I=L0(B,A);if(I<0)++this.size,B.push([A,Q]);else B[I][1]=Q;return this}var Mx;var wx=H(()=>{sF();Mx=z0A});function QG(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 zx;var Kx=H(()=>{Gx();$x();Wx();Vx();wx();QG.prototype.clear=Jx;QG.prototype.delete=Nx;QG.prototype.get=Dx;QG.prototype.has=Xx;QG.prototype.set=Mx;zx=QG});var K0A,Hx;var Zx=H(()=>{K2();XD();K0A=wD(sJ,"Map"),Hx=K0A});function H0A(){this.size=0,this.__data__={hash:new H2,map:new(Hx||zx),string:new H2}}var Lx;var Rx=H(()=>{Yx();Kx();Zx();Lx=H0A});function Z0A(A){var Q=typeof A;return Q=="string"||Q=="number"||Q=="symbol"||Q=="boolean"?A!=="__proto__":A===null}var jx;var qx=H(()=>{jx=Z0A});function L0A(A,Q){var B=A.__data__;return jx(Q)?B[typeof Q=="string"?"string":"hash"]:B.map}var R0;var eF=H(()=>{qx();R0=L0A});function R0A(A){var Q=R0(this,A).delete(A);return this.size-=Q?1:0,Q}var xx;var Ox=H(()=>{eF();xx=R0A});function j0A(A){return R0(this,A).get(A)}var gx;var Sx=H(()=>{eF();gx=j0A});function q0A(A){return R0(this,A).has(A)}var vx;var _x=H(()=>{eF();vx=q0A});function x0A(A,Q){var B=R0(this,A),I=B.size;return B.set(A,Q),this.size+=B.size==I?0:1,this}var Px;var Tx=H(()=>{eF();Px=x0A});function BG(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 Z2;var bx=H(()=>{Rx();Ox();Sx();_x();Tx();BG.prototype.clear=Lx;BG.prototype.delete=xx;BG.prototype.get=gx;BG.prototype.has=vx;BG.prototype.set=Px;Z2=BG});function L2(A,Q){if(typeof A!="function"||Q!=null&&typeof Q!="function")throw TypeError(O0A);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(L2.Cache||Z2),B}var O0A="Expected a function",wQ;var aE=H(()=>{bx();L2.Cache=Z2;wQ=L2});import{homedir as g0A}from"os";import{join as S0A}from"path";function R2(A){let Q=process.env.NODE_OPTIONS;if(!Q)return!1;return Q.split(/\s+/).includes(A)}function kx(){return!1}function yx(){return{namespace:void 0,cluster:void 0}}var rE;var MB=H(()=>{aF();aE();aF();rE=wQ(()=>{return(process.env.CLAUDE_CONFIG_DIR??S0A(g0A(),".claude")).normalize("NFC")},()=>process.env.CLAUDE_CONFIG_DIR)});function l(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 x(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 SC=()=>{};var j2=function(){let{crypto:A}=globalThis;if(A?.randomUUID)return j2=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 vC(A){return typeof A==="object"&&A!==null&&(("name"in A)&&A.name==="AbortError"||("message"in A)&&String(A.message).includes("FetchRequestCanceledException"))}var A1=(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 s,wB,vB,xY,Q1,B1,I1,E1,C1,Y1,J1,G1,U1;var EI=H(()=>{s=class s extends Error{};wB=class wB extends s{constructor(A,Q,B,I,E){super(`${wB.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 xY({message:B,cause:A1(Q)});let E=Q,C=E?.error?.type;if(A===400)return new B1(A,E,B,I,C);if(A===401)return new I1(A,E,B,I,C);if(A===403)return new E1(A,E,B,I,C);if(A===404)return new C1(A,E,B,I,C);if(A===409)return new Y1(A,E,B,I,C);if(A===422)return new J1(A,E,B,I,C);if(A===429)return new G1(A,E,B,I,C);if(A>=500)return new U1(A,E,B,I,C);return new wB(A,E,B,I,C)}};vB=class vB extends wB{constructor({message:A}={}){super(void 0,void 0,A||"Request was aborted.",void 0)}};xY=class xY extends wB{constructor({message:A,cause:Q}){super(void 0,void 0,A||"Connection error.",void 0);if(Q)this.cause=Q}};Q1=class Q1 extends xY{constructor({message:A}={}){super({message:A??"Request timed out."})}};B1=class B1 extends wB{};I1=class I1 extends wB{};E1=class E1 extends wB{};C1=class C1 extends wB{};Y1=class Y1 extends wB{};J1=class J1 extends wB{};G1=class G1 extends wB{};U1=class U1 extends wB{}});function zD(A){if(typeof A!=="object")return{};return A??{}}function O2(A){if(!A)return!0;for(let Q in A)return!1;return!0}function hx(A,Q){return Object.prototype.hasOwnProperty.call(A,Q)}var _0A,fx=(A)=>{return _0A.test(A)},q2=(A)=>(q2=Array.isArray,q2(A)),x2,mx=(A,Q)=>{if(typeof Q!=="number"||!Number.isInteger(Q))throw new s(`${A} must be an integer`);if(Q<0)throw new s(`${A} must be a positive integer`);return Q},KD=(A)=>{try{return JSON.parse(A)}catch(Q){return}};var OY=H(()=>{EI();_0A=/^[a-z][a-z0-9+.-]*:/i,x2=q2});var ux=(A)=>new Promise((Q)=>setTimeout(Q,A));var j0="0.81.0";function P0A(){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 b0A(){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 ix=()=>{return typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u"},T0A=()=>{let A=P0A();if(A==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":j0,"X-Stainless-OS":px(Deno.build.os),"X-Stainless-Arch":cx(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":j0,"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":j0,"X-Stainless-OS":px(globalThis.process.platform??"unknown"),"X-Stainless-Arch":cx(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let Q=b0A();if(Q)return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":j0,"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":j0,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}},cx=(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"},px=(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"},lx,dx=()=>{return lx??(lx=T0A())};var g2=()=>{};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 S2(...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 HD(A){let Q=Symbol.asyncIterator in A?A[Symbol.asyncIterator]():A[Symbol.iterator]();return S2({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 F1(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 ox(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 ax=({headers:A,body:Q})=>{return{bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(Q)}};function rx(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 s(`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 tx=H(()=>{EI()});function AO(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 N1(A){let Q;return(sx??(Q=new globalThis.TextEncoder,sx=Q.encode.bind(Q)))(A)}function v2(A){let Q;return(ex??(Q=new globalThis.TextDecoder,ex=Q.decode.bind(Q)))(A)}var sx,ex;class q0{constructor(){qI.set(this,void 0),xI.set(this,void 0),l(this,qI,new Uint8Array,"f"),l(this,xI,null,"f")}decode(A){if(A==null)return[];let Q=A instanceof ArrayBuffer?new Uint8Array(A):typeof A==="string"?N1(A):A;l(this,qI,AO([x(this,qI,"f"),Q]),"f");let B=[],I;while((I=f0A(x(this,qI,"f"),x(this,xI,"f")))!=null){if(I.carriage&&x(this,xI,"f")==null){l(this,xI,I.index,"f");continue}if(x(this,xI,"f")!=null&&(I.index!==x(this,xI,"f")+1||I.carriage)){B.push(v2(x(this,qI,"f").subarray(0,x(this,xI,"f")-1))),l(this,qI,x(this,qI,"f").subarray(x(this,xI,"f")),"f"),l(this,xI,null,"f");continue}let E=x(this,xI,"f")!==null?I.preceding-1:I.preceding,C=v2(x(this,qI,"f").subarray(0,E));B.push(C),l(this,qI,x(this,qI,"f").subarray(I.index),"f"),l(this,xI,null,"f")}return B}flush(){if(!x(this,qI,"f").length)return[];return this.decode(`
5
5
  `)}}function f0A(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 QO(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 qI,xI;var _2=H(()=>{SC();qI=new WeakMap,xI=new WeakMap;q0.NEWLINE_CHARS=new Set([`
6
6
  `,"\r"]);q0.NEWLINE_REGEXP=/\r\n|[\n\r]/g});function $1(){}function ZD(A,Q,B){if(!Q||LD[A]>LD[B])return $1;else return Q[A].bind(Q)}function jB(A){let Q=A.logger,B=A.logLevel??"off";if(!Q)return h0A;let I=BO.get(Q);if(I&&I[0]===B)return I[1];let E={error:ZD("error",Q,B),warn:ZD("warn",Q,B),info:ZD("info",Q,B),debug:ZD("debug",Q,B)};return BO.set(Q,[B,E]),E}var LD,P2=(A,Q,B)=>{if(!A)return;if(hx(LD,A))return A;jB(B).warn(`${Q} was set to ${JSON.stringify(A)}, expected one of ${JSON.stringify(Object.keys(LD))}`);return},h0A,BO,_C=(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 RD=H(()=>{OY();LD={off:0,error:200,warn:300,info:400,debug:500};h0A={error:$1,warn:$1,info:$1,debug:$1},BO=new WeakMap});async function*m0A(A,Q){if(!A.body){if(Q.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative")throw new s("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 s("Attempted to iterate over a response with no body")}let B=new IO,I=new q0,E=F1(A.body);for await(let C of u0A(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*u0A(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"?N1(B):B,E=new Uint8Array(Q.length+I.length);E.set(Q),E.set(I,Q.length),Q=E;let C;while((C=QO(Q))!==-1)yield Q.slice(0,C),Q=Q.slice(C)}if(Q.length>0)yield Q}class IO{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(`
@@ -180,7 +180,7 @@ ${E}`;break;case"retry":if(aQA(E))Q[I]=E;break;case"id":if(rQA(E))Q[I]=E;break;c
180
180
  `,ifA=1000,dfA=1000,mIA=30000,nfA=600000,ofA=1e4,afA=300000,hIA=mIA*2,rfA=new Set([1002,4001,4003]);class ij{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 eZ(ifA)}async connect(){if(this.state!=="idle"&&this.state!=="reconnecting"){z(`WebSocketTransport: Cannot connect, current state is ${this.state}`,{level:"error"}),p("error","cli_websocket_connect_failed");return}this.state="reconnecting",this.connectStartTime=Date.now(),z(`WebSocketTransport: Opening ${this.url.href}`),p("info","cli_websocket_connect_opening");let A={...this.headers};if(this.lastSentId)A["X-Last-Request-Id"]=this.lastSentId,z(`WebSocketTransport: Adding X-Last-Request-Id header: ${this.lastSentId}`);if(typeof Bun<"u"){let Q=new globalThis.WebSocket(this.url.href,{headers:A,proxy:OBA(this.url.href),tls:Lj()||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(() => (fIA(),yIA)),B=new Q(this.url.href,{headers:A,agent:xBA(this.url.href),...Lj()});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(),p("info","cli_websocket_message_received",{length:Q.length}),this.onData)this.onData(Q)};onBunError=()=>{z("WebSocketTransport: Error",{level:"error"}),p("error","cli_websocket_connect_error")};onBunClose=(A)=>{let Q=A.code===1000||A.code===1001;z(`WebSocketTransport: Closed: ${A.code}`,Q?void 0:{level:"error"}),p("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(),p("info","cli_websocket_message_received",{length:Q.length}),this.onData)this.onData(Q)};onNodeError=(A)=>{z(`WebSocketTransport: Error: ${A.message}`,{level:"error"}),p("error","cli_websocket_connect_error")};onNodeClose=(A,Q)=>{let B=A===1000||A===1001;z(`WebSocketTransport: Closed: ${A}`,B?void 0:{level:"error"}),p("error","cli_websocket_connect_closed"),this.handleConnectionError(A)};onPong=()=>{this.pongReceived=!0};handleOpenEvent(){let A=Date.now()-this.connectStartTime;if(z("WebSocketTransport: Connected"),p("info","cli_websocket_connect_connected",{duration_ms:A}),this.isBridge&&this.reconnectStartTime!==null)YQ("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(),m6(()=>{this.write({type:"keep_alive"})})}sendLine(A){if(!this.ws||this.state!=="connected")return z("WebSocketTransport: Not connected"),p("info","cli_websocket_send_not_connected"),!1;try{return this.ws.send(A),this.lastActivityTime=Date.now(),!0}catch(Q){return z(`WebSocketTransport: Failed to send: ${Q}`,{level:"error"}),p("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(),AD(),this.ws)this.removeWsListeners(this.ws),this.ws.close(),this.ws=null}handleConnectionError(A){if(z(`WebSocketTransport: Disconnected from ${this.url.href}`+(A!=null?` (code ${A})`:"")),p("info","cli_websocket_disconnected"),this.isBridge)YQ("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,z("WebSocketTransport: 4003 received but headers refreshed, scheduling reconnect"),p("info","cli_websocket_4003_token_refreshed")}if(A!=null&&rfA.has(A)&&!Q){z(`WebSocketTransport: Permanent close code ${A}, not reconnecting`,{level:"error"}),p("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>hIA)z(`WebSocketTransport: Detected system sleep (${Math.round((B-this.lastReconnectAttemptTime)/1000)}s gap), resetting reconnection budget`),p("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<nfA){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;if(!Q&&this.refreshHeaders){let Y=this.refreshHeaders();Object.assign(this.headers,Y),z("WebSocketTransport: Refreshed headers for reconnect")}this.state="reconnecting",this.reconnectAttempts++;let E=Math.min(dfA*Math.pow(2,this.reconnectAttempts-1),mIA),C=Math.max(0,E+E*0.25*(2*Math.random()-1));if(z(`WebSocketTransport: Reconnecting in ${Math.round(C)}ms (attempt ${this.reconnectAttempts}, ${Math.round(I/1000)}s elapsed)`),p("error","cli_websocket_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.isBridge)YQ("tengu_ws_transport_reconnecting",{attempt:this.reconnectAttempts,elapsedMs:I,delayMs:Math.round(C)});this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},C)}else if(z(`WebSocketTransport: Reconnection time budget exhausted after ${Math.round(I/1000)}s for ${this.url.href}`,{level:"error"}),p("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(),AD(),this.state="closing",this.doDisconnect()}[Symbol.dispose](){this.close()}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;z(`WebSocketTransport: Evicted ${B} confirmed messages, ${C.length} remaining`),p("info","cli_websocket_evicted_confirmed_messages",{evicted:B,remaining:C.length})}}let I=Q.slice(B);if(I.length===0){z("WebSocketTransport: No new messages to replay"),p("info","cli_websocket_no_messages_to_replay");return}z(`WebSocketTransport: Replaying ${I.length} buffered messages`),p("info","cli_websocket_messages_to_replay",{count:I.length});for(let E of I){let C=zA(E)+`
181
181
  `;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=zA(A)+`
182
182
  `;if(this.state!=="connected")return;let B=this.sessionId?` session=${this.sessionId}`:"",I=this.getControlMessageDetailLabel(A);z(`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>hIA){z(`WebSocketTransport: ${Math.round(B/1000)}s tick gap detected — process was suspended, forcing reconnect`),p("info","cli_websocket_sleep_detected_on_ping",{gapMs:B}),this.handleConnectionError();return}if(!this.pongReceived){z("WebSocketTransport: No pong received, connection appears dead",{level:"error"}),p("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(I){z(`WebSocketTransport: Ping failed: ${I}`,{level:"error"}),p("error","cli_websocket_ping_failed")}}},ofA)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),BQ(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(lfA),this.lastActivityTime=Date.now(),z("WebSocketTransport: Sent periodic keep_alive data frame")}catch(A){z(`WebSocketTransport: Periodic keep_alive failed: ${A}`,{level:"error"}),p("error","cli_websocket_keepalive_failed")}},afA)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var tfA=100,sfA=15000,efA=3000;class dj extends ij{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=AhA(A),this.uploader=new zJ({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:C,onBatchDropped:(J,G)=>{p("error","cli_hybrid_batch_dropped_max_failures",{batchSize:J,failures:G}),Y?.(J,G)},send:(J)=>this.postOnce(J)}),z(`HybridTransport: POST URL = ${this.postUrl}`),p("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(),tfA);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,efA)})]).finally(()=>{clearTimeout(Q),A.close()}),super.close()}async postOnce(A){let Q=rN();if(!Q){z("HybridTransport: No session token available for POST"),p("warn","cli_hybrid_post_no_token");return}let B={Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},I;try{I=await BB.post(this.postUrl,{events:A},{headers:B,validateStatus:()=>!0,timeout:sfA})}catch(E){throw z(`HybridTransport: POST error: ${YA(E)}`),p("warn","cli_hybrid_post_network_error"),E}if(I.status>=200&&I.status<300){z(`HybridTransport: POST success count=${A.length}`);return}if(I.status>=400&&I.status<500&&I.status!==429){z(`HybridTransport: POST returned ${I.status} (permanent), dropping`),p("warn","cli_hybrid_post_client_error",{status:I.status});return}throw z(`HybridTransport: POST returned ${I.status} (retryable)`),p("warn","cli_hybrid_post_retryable_error",{status:I.status}),Error(`POST failed with ${I.status}`)}}function AhA(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}`}MB();function uIA(){let{namespace:A,cluster:Q}=yx();return{...A&&{cooNamespace:A},...Q&&{cooCluster:Q}}}MG();import{chmod as L8Q,mkdir as R8Q,readdir as j8Q,readFile as YhA,unlink as q8Q,writeFile as JhA}from"fs/promises";import{join as lIA}from"path";BE();MG();RQ();MB();fQ();ZX();aE();IE();wU();import{readdir as sXQ,readFile as QhA}from"fs/promises";import{release as cIA}from"os";var BhA=wQ(()=>{try{if(process.platform==="darwin")return"macos";if(process.platform==="win32")return"windows";if(process.platform==="linux"){try{let A=iQ().readFileSync("/proc/version",{encoding:"utf8"});if(A.toLowerCase().includes("microsoft")||A.toLowerCase().includes("wsl"))return"wsl"}catch(A){GC(A)}return"linux"}return"unknown"}catch(A){return GC(A),"unknown"}}),I8Q=wQ(()=>{if(process.platform!=="linux")return;try{let A=iQ().readFileSync("/proc/version",{encoding:"utf8"}),Q=A.match(/WSL(\d+)/i);if(Q&&Q[1])return Q[1];if(A.toLowerCase().includes("microsoft"))return"1";return}catch(A){GC(A);return}}),E8Q=wQ(async()=>{if(process.platform!=="linux")return;let A={linuxKernel:cIA()};try{let Q=await QhA("/etc/os-release","utf8");for(let B of Q.split(`
183
- `)){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});var C8Q=wQ(()=>{if(process.platform!=="darwin")return;let Q=cIA().match(/^(\d+)\./);if(!Q||!Q[1])return;return parseInt(Q[1],10)-9});WQ();import{AsyncLocalStorage as IhA}from"async_hooks";var G8Q=new IhA;MB();var c8Q=DU(()=>IC.object({pid:IC.number(),sessionId:IC.string(),cwd:IC.string().optional(),startedAt:IC.number(),version:IC.string().optional(),kind:IC.enum(["interactive","bg","daemon","daemon-worker"])}));function GhA(){return lIA(rE(),"sessions")}var pIA=Promise.resolve();async function UhA(A){let Q=lIA(GhA(),`${process.pid}.json`),B=pIA.then(async()=>{try{let I=mQ(await YhA(Q,"utf8"));await JhA(Q,zA({...I,...A}))}catch(I){z(`[concurrentSessions] updatePidFile failed: ${YA(I)}`)}});pIA=B,await B}async function iIA(A){await UhA({bridgeSessionId:A})}RQ();B0();MB();fQ();tj();RQ();fQ();WQ();var WEA=2000,ghA=["session_ingress_token","environment_secret","access_token","secret","token"],ShA=new RegExp(`"(${ghA.join("|")})"\\s*:\\s*"([^"]*)"`,"g"),vhA=16;function _hA(A){return A.replace(ShA,(Q,B,I)=>{if(I.length<vhA)return`"${B}":"[REDACTED]"`;let E=`${I.slice(0,8)}...${I.slice(-4)}`;return`"${B}":"${E}"`})}function mF(A){let Q=typeof A==="string"?A:zA(A),B=_hA(Q);if(B.length<=WEA)return B;return B.slice(0,WEA)+`... (${B.length} chars)`}function XEA(A){let Q=YA(A);if(A&&typeof A==="object"&&"response"in A){let B=A.response;if(B?.data&&typeof B.data==="object"){let I=B.data,E=typeof I.message==="string"?I.message:typeof I.error==="object"&&I.error&&("message"in I.error)&&typeof I.error.message==="string"?I.error.message:void 0;if(E)return`${Q}: ${E}`}}return Q}function VEA(A){if(A&&typeof A==="object"&&"response"in A&&A.response&&typeof A.response.status==="number")return A.response.status;return}function ej(A,Q=Date.now()){if(!A)return;let B=Number(A);if(Number.isFinite(B)&&B>=0)return B*1000;let I=Date.parse(A);if(Number.isFinite(I)){let E=I-Q;return E>0?E:void 0}return}function MEA(A){if(!A||typeof A!=="object")return;if("retryAfterMs"in A&&typeof A.retryAfterMs==="number")return A.retryAfterMs;if("response"in A){let B=A.response?.headers?.["retry-after"];if(typeof B==="string")return ej(B)}return}function nJ(A){if(!A||typeof A!=="object")return;if("message"in A&&typeof A.message==="string")return A.message;if("error"in A&&A.error!==null&&typeof A.error==="object"&&"message"in A.error&&typeof A.error.message==="string")return A.error.message;return}function wEA(A,Q,B){if(Q)z(Q);YQ("tengu_bridge_repl_skipped",{reason:A,...B!==void 0&&{v2:B}})}var Aq="Remote Control is only available with claude.ai subscriptions. Please use `/login` to sign in with your claude.ai account.";var PhA="environments-2025-11-01",ThA=/^[a-zA-Z0-9_-]+$/;function ZI(A,Q){if(!A||!ThA.test(A))throw Error(`Invalid ${Q}: contains unsafe characters`);return A}class KE extends Error{status;errorType;constructor(A,Q,B){super(A);this.name="BridgeFatalError",this.status=Q,this.errorType=B}}function zEA(A){function Q(J){A.onDebug?.(J)}let B=0,I=100;function E(J){let G={Authorization:`Bearer ${J}`,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-beta":PhA,"x-environment-runner-version":A.runnerVersion},U=A.getTrustedDeviceToken?.();if(U)G["X-Trusted-Device-Token"]=U;return G}function C(){let J=A.getAccessToken();if(!J)throw Error(Aq);return J}async function Y(J,G){let U=C(),F=await J(U);if(F.status!==401)return F;if(!A.onAuth401)return Q(`[bridge:api] ${G}: 401 received, no refresh handler`),F;if(Q(`[bridge:api] ${G}: 401 received, attempting token refresh`),await A.onAuth401(U)){Q(`[bridge:api] ${G}: Token refreshed, retrying request`);let $=C(),W=await J($);if(W.status!==401)return W;Q(`[bridge:api] ${G}: Retry after refresh also got 401`)}else Q(`[bridge:api] ${G}: Token refresh failed`);return F}return{async registerBridgeEnvironment(J){Q(`[bridge:api] POST /v1/environments/bridge bridgeId=${J.bridgeId}`);let G=await Y((U)=>BB.post(`${A.baseUrl}/v1/environments/bridge`,{machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:J.gitRepoUrl,max_sessions:J.maxSessions,metadata:{worker_type:J.workerType},...J.reuseEnvironmentId&&{environment_id:J.reuseEnvironmentId}},{headers:E(U),timeout:15000,validateStatus:(F)=>F<500}),"Registration");return H0(G.status,G.data,"Registration"),Q(`[bridge:api] POST /v1/environments/bridge -> ${G.status} environment_id=${G.data.environment_id}`),Q(`[bridge:api] >>> ${mF({machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:DEA(J.gitRepoUrl),max_sessions:J.maxSessions,metadata:{worker_type:J.workerType}})}`),Q(`[bridge:api] <<< ${mF(G.data)}`),G.data},async pollForWork(J,G,U,F){ZI(J,"environmentId");let N=B;B=0;let $=await BB.get(`${A.baseUrl}/v1/environments/${J}/work/poll`,{headers:E(G),params:F!==void 0?{reclaim_older_than_ms:F}:void 0,timeout:1e4,signal:U,validateStatus:(W)=>W<500});if(H0($.status,$.data,"Poll",$.headers),!$.data){if(B=N+1,B===1||B%I===0)Q(`[bridge:api] GET .../work/poll -> ${$.status} (no work, ${B} consecutive empty polls)`);return null}return Q(`[bridge:api] GET .../work/poll -> ${$.status} workId=${$.data.id} type=${$.data.data?.type}${$.data.data?.id?` sessionId=${$.data.data.id}`:""}`),Q(`[bridge:api] <<< ${mF($.data)}`),$.data},async acknowledgeWork(J,G,U){ZI(J,"environmentId"),ZI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/ack`);let F=await BB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/ack`,{},{headers:E(U),timeout:1e4,validateStatus:(N)=>N<500});H0(F.status,F.data,"Acknowledge"),Q(`[bridge:api] POST .../work/${G}/ack -> ${F.status}`)},async stopWork(J,G,U){ZI(J,"environmentId"),ZI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/stop force=${U}`);let F=await Y((N)=>BB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/stop`,{force:U},{headers:E(N),timeout:1e4,validateStatus:($)=>$<500}),"StopWork");H0(F.status,F.data,"StopWork"),Q(`[bridge:api] POST .../work/${G}/stop -> ${F.status}`)},async deregisterEnvironment(J){ZI(J,"environmentId"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J}`);let G=await Y((U)=>BB.delete(`${A.baseUrl}/v1/environments/bridge/${J}`,{headers:E(U),timeout:1e4,validateStatus:(F)=>F<500}),"Deregister");H0(G.status,G.data,"Deregister"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J} -> ${G.status}`)},async archiveSession(J){ZI(J,"sessionId"),Q(`[bridge:api] POST /v1/sessions/${J}/archive`);let G=await Y((U)=>BB.post(`${A.baseUrl}/v1/sessions/${J}/archive`,{},{headers:E(U),timeout:1e4,validateStatus:(F)=>F<500}),"ArchiveSession");if(G.status===409){Q(`[bridge:api] POST /v1/sessions/${J}/archive -> 409 (already archived)`);return}H0(G.status,G.data,"ArchiveSession"),Q(`[bridge:api] POST /v1/sessions/${J}/archive -> ${G.status}`)},async reconnectSession(J,G){ZI(J,"environmentId"),ZI(G,"sessionId"),Q(`[bridge:api] POST /v1/environments/${J}/bridge/reconnect session_id=${G}`);let U=await Y((F)=>BB.post(`${A.baseUrl}/v1/environments/${J}/bridge/reconnect`,{session_id:G},{headers:E(F),timeout:1e4,validateStatus:(N)=>N<500}),"ReconnectSession");H0(U.status,U.data,"ReconnectSession"),Q(`[bridge:api] POST .../bridge/reconnect -> ${U.status}`)},async heartbeatWork(J,G,U){ZI(J,"environmentId"),ZI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/heartbeat`);let F=await BB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/heartbeat`,{},{headers:E(U),timeout:1e4,validateStatus:(N)=>N<500});return H0(F.status,F.data,"Heartbeat"),Q(`[bridge:api] POST .../work/${G}/heartbeat -> ${F.status} lease_extended=${F.data.lease_extended} state=${F.data.state}`),F.data},async sendPermissionResponseEvent(J,G,U){ZI(J,"sessionId"),Q(`[bridge:api] POST /v1/sessions/${J}/events type=${G.type}`);let F=await BB.post(`${A.baseUrl}/v1/sessions/${J}/events`,{events:[G]},{headers:E(U),timeout:1e4,validateStatus:(N)=>N<500});H0(F.status,F.data,"SendPermissionResponseEvent"),Q(`[bridge:api] POST /v1/sessions/${J}/events -> ${F.status}`),Q(`[bridge:api] >>> ${mF({events:[G]})}`),Q(`[bridge:api] <<< ${mF(F.data)}`)}}}function H0(A,Q,B,I){if(A===200||A===204)return;let E=nJ(Q),C=bhA(Q);switch(A){case 401:throw new KE(`${B}: Authentication failed (401)${E?`: ${E}`:""}. ${Aq}`,401,C);case 403:throw new KE(B2(C)?"Remote Control session has expired. Please restart with `claude remote-control` or /remote-control.":`${B}: Access denied (403)${E?`: ${E}`:""}. Check your organization permissions.`,403,C);case 404:throw new KE(E??`${B}: Not found (404). Remote Control may not be available for this organization.`,404,C);case 410:throw new KE(E??"Remote Control session has expired. Please restart with `claude remote-control` or /remote-control.",410,C??"environment_expired");case 429:{let Y=ej(typeof I?.["retry-after"]==="string"?I["retry-after"]:void 0);throw Object.assign(Error(`${B}: Rate limited (429). Polling too frequently.`),Y!==void 0?{status:A,retryAfterMs:Y}:{status:A})}default:throw Object.assign(Error(`${B}: Failed with status ${A}${E?`: ${E}`:""}`),{status:A})}}function B2(A){if(!A)return!1;return A.includes("expired")||A.includes("lifetime")}function KEA(A){if(A.status!==403)return!1;return A.message.includes("external_poll_sessions")||A.message.includes("environments:manage")}function bhA(A){if(A&&typeof A==="object"){if("error"in A&&A.error&&typeof A.error==="object"&&"type"in A.error&&typeof A.error.type==="string")return A.error.type}return}RQ();import{randomUUID as khA}from"crypto";var HEA={input_tokens:0,cache_creation_input_tokens:0,cache_read_input_tokens:0,output_tokens:0,server_tool_use:{web_search_requests:0,web_fetch_requests:0},service_tier:"standard",cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},inference_geo:"",iterations:[],speed:"standard"};function ZEA(A){if(A===null||typeof A!=="object")return A;let Q=A;if("requestId"in Q&&!("request_id"in Q))Q.request_id=Q.requestId,delete Q.requestId;if("response"in Q&&Q.response!==null&&typeof Q.response==="object"){let B=Q.response;if("requestId"in B&&!("request_id"in B))B.request_id=B.requestId,delete B.requestId}return A}RQ();_H();fQ();WQ();function yhA(A){return A!==null&&typeof A==="object"&&"type"in A&&typeof A.type==="string"}function fhA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_response"&&"response"in A}function hhA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_request"&&"request_id"in A&&"request"in A}function Qq(A){if((A.type==="user"||A.type==="assistant")&&A.isVirtual)return!1;return A.type==="user"||A.type==="assistant"||A.type==="system"&&A.subtype==="local_command"}function LEA(A){if(A.type!=="user"||A.isMeta||A.toolUseResult||A.isCompactSummary)return;if(A.origin&&A.origin.kind!=="human")return;let Q=A.message.content,B;if(typeof Q==="string")B=Q;else for(let E of Q)if(E.type==="text"){B=E.text;break}if(!B)return;return vH(B)||void 0}function REA(A,Q,B,I,E,C){try{let Y=ZEA(mQ(A));if(fhA(Y)){z("[bridge:repl] Ingress message type=control_response"),E?.(Y);return}if(hhA(Y)){z(`[bridge:repl] Inbound control_request subtype=${Y.request.subtype}`),C?.(Y);return}if(!yhA(Y))return;let J="uuid"in Y&&typeof Y.uuid==="string"?Y.uuid:void 0;if(J&&Q.has(J)){z(`[bridge:repl] Ignoring echo: type=${Y.type} uuid=${J}`);return}if(J&&B.has(J)){z(`[bridge:repl] Ignoring re-delivered inbound: type=${Y.type} uuid=${J}`);return}if(z(`[bridge:repl] Ingress message type=${Y.type}${J?` uuid=${J}`:""}`),Y.type==="user"){if(J)B.add(J);YQ("tengu_bridge_message_received",{is_repl:!0}),I?.(Y)}else z(`[bridge:repl] Ignoring non-user inbound message: type=${Y.type}`)}catch(Y){z(`[bridge:repl] Failed to parse ingress message: ${YA(Y)}`)}}var mhA="This session is outbound-only. Enable Remote Control locally to allow inbound control.";function jEA(A,Q){let{transport:B,sessionId:I,outboundOnly:E,onInterrupt:C,onSetModel:Y,onSetMaxThinkingTokens:J,onSetPermissionMode:G,onRenameSession:U,onSetColor:F,onFileSuggestions:N,onReadFile:$,onMcpAuthenticate:W,onMcpOauthCallbackUrl:D,onMcpReconnect:V,onMcpStatus:X}=Q;if(!B){z("[bridge:repl] Cannot respond to control_request: transport not configured");return}let M;if(E&&A.request.subtype!=="initialize"){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:mhA}};let K={...M,session_id:I};B.write(K),z(`[bridge:repl] Rejected ${A.request.subtype} (outbound-only) request_id=${A.request_id}`);return}switch(A.request.subtype){case"initialize":M={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{commands:[],output_style:"normal",available_output_styles:["normal"],models:[],account:{},pid:process.pid}}};break;case"set_model":Y?.(A.request.model),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_max_thinking_tokens":J?.(A.request.max_thinking_tokens),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_permission_mode":{let K=G?.(A.request.mode)??{ok:!1,error:"set_permission_mode is not supported in this context (onSetPermissionMode callback not registered)"};if(K.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:K.error}};break}case"rename_session":{let K=U?.(A.request.title)??{ok:!1,error:"rename_session is not supported in this context (onRenameSession callback not registered)"};if(K.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:K.error}};break}case"set_color":{let K=F?.(A.request.color)??{ok:!1,error:"set_color is not supported in this context (onSetColor callback not registered)"};if(K.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:K.error}};break}case"file_suggestions":{if(!N){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"file_suggestions is not supported in this context (onFileSuggestions callback not registered)"}};break}N(A.request.query).then((K)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{suggestions:K}}})).catch((K)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:YA(K)}})).then((K)=>{let R={...K,session_id:I};B.write(R),z(`[bridge:repl] Sent control_response for file_suggestions request_id=${A.request_id} result=${K.response.subtype}`)});return}case"read_file":{if(!$){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"read_file is not supported in this context (onReadFile callback not registered)"}};break}$(A.request.path,A.request.max_bytes,A.request.encoding).then((K)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:K}})).catch((K)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:YA(K)}})).then((K)=>{let R={...K,session_id:I};B.write(R),z(`[bridge:repl] Sent control_response for read_file request_id=${A.request_id} result=${K.response.subtype}`)});return}case"mcp_status":M={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{mcpServers:X?.()??[]}}};break;case"mcp_authenticate":case"mcp_oauth_callback_url":case"mcp_reconnect":{let K=A.request,{subtype:R,serverName:O}=K,v=K.subtype==="mcp_authenticate"?W&&((S)=>W(S,K.redirectUri)):K.subtype==="mcp_oauth_callback_url"?D&&((S)=>D(S,K.callbackUrl)):V;if(!v){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`${R} is not supported in this context (callback not registered)`}};break}v(O).then((S)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:S??{}}})).catch((S)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:YA(S)}})).then((S)=>{let m={...S,session_id:I};B.write(m),z(`[bridge:repl] Sent control_response for ${R} request_id=${A.request_id} result=${S.response.subtype}`)});return}case"interrupt":C?.(),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;default:M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`REPL bridge does not handle control_request subtype: ${A.request.subtype}`}}}let L={...M,session_id:I};B.write(L),z(`[bridge:repl] Sent control_response for ${A.request.subtype} request_id=${A.request_id} result=${M.response.subtype}`)}function Bq(A){return{type:"result",subtype:"success",duration_ms:0,duration_api_ms:0,is_error:!1,num_turns:0,result:"",stop_reason:null,total_cost_usd:0,usage:{...HEA},modelUsage:{},permission_denials:[],session_id:A,uuid:khA()}}class I2{capacity;ring;set=new Set;writeIdx=0;constructor(A){this.capacity=A,this.ring=Array(A)}add(A){if(this.set.has(A))return;let Q=this.ring[this.writeIdx];if(Q!==void 0)this.set.delete(Q);this.ring[this.writeIdx]=A,this.set.add(A),this.writeIdx=(this.writeIdx+1)%this.capacity}has(A){return this.set.has(A)}clear(){this.set.clear(),this.ring.fill(void 0),this.writeIdx=0}}function qEA(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 Iq{_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}}import{randomUUID as gEA}from"crypto";RQ();B0();fQ();WQ();function uhA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return mQ(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function xEA(A){let Q=uhA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}RQ();B0();fQ();WQ();function uF(){return"claude-code/0.2.124"}class Eq{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?OEA(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 RB(this.retryDelay(B)),this.pending&&!this.closed)Q=OEA(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 OEA(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 chA=20000,phA=100;function lhA(A){let Q=AE(A);if(Q)return Q;if(A&&typeof A==="object"&&"name"in A&&typeof A.name==="string")return A.name;return}class E2 extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var ihA=10;function dhA(){return{byMessage:new Map,scopeToMessage:new Map}}function C2(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function nhA(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(C2(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(C2(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(C2(E)),Y=C?Q.byMessage.get(C):void 0;if(!Y){B.push(E);break}let J=Y[E.event.index]??=[];if(J.push(E.event.delta.text),I.has(J))break;let G={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:""}}};I.set(J,G),B.push(G);break}default:B.push(E)}for(let[E,C]of I)C.event.delta.text=E.join("");return B}function ohA(A,Q){A.byMessage.delete(Q.message.id);let B=C2(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class Cq{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;currentState=null;sessionBaseUrl;sessionId;streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=dhA();workerState;eventUploader;internalEventUploader;deliveryUploader;onEpochMismatch;getAuthHeaders;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??chA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??I8,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 Eq({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 zJ({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 bU("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new zJ({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 bU("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new zJ({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 bU("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 E2("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 E2("missing_epoch");this.workerEpoch=A;let B=this.getWorkerState(),I={ok:!1};for(let Y=1;Y<=3;Y++){if(I=await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)"),I.ok||this.closed)break;if(Y<3){let J=Math.min(500*2**(Y-1),30000)+Math.random()*500;await RB(J)}}if(!I.ok){if(!this.closed)p("error","cli_worker_init_put_retries_exhausted");throw new E2("worker_register_failed")}this.currentState="idle",this.startHeartbeat(),m6(()=>{this.writeEvent({type:"keep_alive"})}),z(`CCRClient: initialized, epoch=${this.workerEpoch}`),p("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:E,durationMs:C}=await B;if(!this.closed)p("info","cli_worker_state_restored",{duration_ms:C,had_state:E.external!==null||E.internal!==null});return E}async getWorkerState(){let A=Date.now(),Q=this.getAuthHeaders();if(Object.keys(Q).length===0)return{metadata:{external:null,internal:null},durationMs:0};let B=await this.getWithRetry(`${this.sessionBaseUrl}/worker`,Q,"worker_state");return{metadata:{external:B?.worker?.external_metadata??null,internal:B?.worker?.internal_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};let Y=`${this.sessionBaseUrl}${Q}`;try{let J=await fetch(Y,{method:A.toUpperCase(),headers:{...C,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":uF()},body:zA(B),signal:AbortSignal.timeout(E),...xj({url:Y})});if(J.body?.cancel(),J.ok)return this.consecutiveAuthFailures=0,{ok:!0};if(J.status===409)this.handleEpochMismatch();if(J.status===401||J.status===403){let G=rN(),U=G?xEA(G):null;if(U!==null&&U*1000<Date.now())z(`CCRClient: session_token expired (exp=${new Date(U*1000).toISOString()}) — no refresh was delivered, exiting`,{level:"error"}),p("error","cli_worker_token_expired_no_refresh"),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=ihA)z(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),p("error","cli_worker_auth_failures_exhausted"),this.onEpochMismatch()}if(z(`CCRClient: ${I} returned ${J.status}`,{level:"warn"}),p("warn","cli_worker_request_failed",{method:A,path:Q,status:J.status}),J.status===429){let G=J.headers.get("retry-after"),U=G?parseInt(G,10):NaN;if(!isNaN(U)&&U>=0)return{ok:!1,retryAfterMs:U*1000}}return{ok:!1}}catch(J){return z(`CCRClient: ${I} failed: ${YA(J)}`,{level:"warn"}),p("warn","cli_worker_request_error",{method:A,path:Q,error_code:lhA(J)}),{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,display_tool_name:Q.display_tool_name,action_description:Q.action_description,raw_command:Q.raw_command,request_id:Q.request_id,tool_use_id:Q.tool_use_id}:null})}reportMetadata(A){this.workerState.enqueue({external_metadata:ahA(A)})}reportInternalMetadata(A){this.workerState.enqueue({internal_metadata:A})}handleEpochMismatch(){z("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),p("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)z("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(),phA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")ohA(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:gEA()}}}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=nhA(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:gEA()},...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 z(`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{if(E=await fetch(A,{headers:{...Q,"anthropic-version":"2023-06-01","User-Agent":uF()},signal:AbortSignal.timeout(30000),...xj({url:A})}),E.ok)return await E.json()}catch(C){if(z(`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 RB(Y)}continue}if(E.body?.cancel(),E.status===409)this.handleEpochMismatch();if(z(`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 RB(C)}}return z("CCRClient: GET retries exhausted",{level:"error"}),p("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(),AD(),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()}}function ahA(A){let Q=A.post_turn_summary;if(!rhA(Q)||Q.status_category!=="blocked")return A;return{...A,post_turn_summary:{...Q,status_category:"need_input"}}}function rhA(A){return A!==null&&typeof A==="object"&&"status_category"in A&&typeof A.status_category==="string"}RQ();B0();fQ();WQ();var thA=1000,shA=30000,ehA=600000,AmA=45000,QmA=new Set([401,403,404]),ND=10,BmA=500,ImA=8000,EmA={stream:!0};function CmA(){return!0}function YmA(A){let Q=[],B=0,I;while((I=A.indexOf(`
183
+ `)){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});var C8Q=wQ(()=>{if(process.platform!=="darwin")return;let Q=cIA().match(/^(\d+)\./);if(!Q||!Q[1])return;return parseInt(Q[1],10)-9});WQ();import{AsyncLocalStorage as IhA}from"async_hooks";var G8Q=new IhA;MB();var c8Q=DU(()=>IC.object({pid:IC.number(),sessionId:IC.string(),cwd:IC.string().optional(),startedAt:IC.number(),version:IC.string().optional(),kind:IC.enum(["interactive","bg","daemon","daemon-worker"])}));function GhA(){return lIA(rE(),"sessions")}var pIA=Promise.resolve();async function UhA(A){let Q=lIA(GhA(),`${process.pid}.json`),B=pIA.then(async()=>{try{let I=mQ(await YhA(Q,"utf8"));await JhA(Q,zA({...I,...A}))}catch(I){z(`[concurrentSessions] updatePidFile failed: ${YA(I)}`)}});pIA=B,await B}async function iIA(A){await UhA({bridgeSessionId:A})}RQ();B0();MB();fQ();tj();RQ();fQ();WQ();var WEA=2000,ghA=["session_ingress_token","environment_secret","access_token","secret","token"],ShA=new RegExp(`"(${ghA.join("|")})"\\s*:\\s*"([^"]*)"`,"g"),vhA=16;function _hA(A){return A.replace(ShA,(Q,B,I)=>{if(I.length<vhA)return`"${B}":"[REDACTED]"`;let E=`${I.slice(0,8)}...${I.slice(-4)}`;return`"${B}":"${E}"`})}function mF(A){let Q=typeof A==="string"?A:zA(A),B=_hA(Q);if(B.length<=WEA)return B;return B.slice(0,WEA)+`... (${B.length} chars)`}function XEA(A){let Q=YA(A);if(A&&typeof A==="object"&&"response"in A){let B=A.response;if(B?.data&&typeof B.data==="object"){let I=B.data,E=typeof I.message==="string"?I.message:typeof I.error==="object"&&I.error&&("message"in I.error)&&typeof I.error.message==="string"?I.error.message:void 0;if(E)return`${Q}: ${E}`}}return Q}function VEA(A){if(A&&typeof A==="object"&&"response"in A&&A.response&&typeof A.response.status==="number")return A.response.status;return}function ej(A,Q=Date.now()){if(!A)return;let B=Number(A);if(Number.isFinite(B)&&B>=0)return B*1000;let I=Date.parse(A);if(Number.isFinite(I)){let E=I-Q;return E>0?E:void 0}return}function MEA(A){if(!A||typeof A!=="object")return;if("retryAfterMs"in A&&typeof A.retryAfterMs==="number")return A.retryAfterMs;if("response"in A){let B=A.response?.headers?.["retry-after"];if(typeof B==="string")return ej(B)}return}function nJ(A){if(!A||typeof A!=="object")return;if("message"in A&&typeof A.message==="string")return A.message;if("error"in A&&A.error!==null&&typeof A.error==="object"&&"message"in A.error&&typeof A.error.message==="string")return A.error.message;return}function wEA(A,Q,B){if(Q)z(Q);YQ("tengu_bridge_repl_skipped",{reason:A,...B!==void 0&&{v2:B}})}var Aq="Remote Control is only available with claude.ai subscriptions. Please use `/login` to sign in with your claude.ai account.";var PhA="environments-2025-11-01",ThA=/^[a-zA-Z0-9_-]+$/;function ZI(A,Q){if(!A||!ThA.test(A))throw Error(`Invalid ${Q}: contains unsafe characters`);return A}class KE extends Error{status;errorType;constructor(A,Q,B){super(A);this.name="BridgeFatalError",this.status=Q,this.errorType=B}}function zEA(A){function Q(J){A.onDebug?.(J)}let B=0,I=100;function E(J){let G={Authorization:`Bearer ${J}`,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-beta":PhA,"x-environment-runner-version":A.runnerVersion},U=A.getTrustedDeviceToken?.();if(U)G["X-Trusted-Device-Token"]=U;return G}function C(){let J=A.getAccessToken();if(!J)throw Error(Aq);return J}async function Y(J,G){let U=C(),F=await J(U);if(F.status!==401)return F;if(!A.onAuth401)return Q(`[bridge:api] ${G}: 401 received, no refresh handler`),F;if(Q(`[bridge:api] ${G}: 401 received, attempting token refresh`),await A.onAuth401(U)){Q(`[bridge:api] ${G}: Token refreshed, retrying request`);let $=C(),W=await J($);if(W.status!==401)return W;Q(`[bridge:api] ${G}: Retry after refresh also got 401`)}else Q(`[bridge:api] ${G}: Token refresh failed`);return F}return{async registerBridgeEnvironment(J){Q(`[bridge:api] POST /v1/environments/bridge bridgeId=${J.bridgeId}`);let G=await Y((U)=>BB.post(`${A.baseUrl}/v1/environments/bridge`,{machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:J.gitRepoUrl,max_sessions:J.maxSessions,metadata:{worker_type:J.workerType},...J.reuseEnvironmentId&&{environment_id:J.reuseEnvironmentId}},{headers:E(U),timeout:15000,validateStatus:(F)=>F<500}),"Registration");return H0(G.status,G.data,"Registration"),Q(`[bridge:api] POST /v1/environments/bridge -> ${G.status} environment_id=${G.data.environment_id}`),Q(`[bridge:api] >>> ${mF({machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:DEA(J.gitRepoUrl),max_sessions:J.maxSessions,metadata:{worker_type:J.workerType}})}`),Q(`[bridge:api] <<< ${mF(G.data)}`),G.data},async pollForWork(J,G,U,F){ZI(J,"environmentId");let N=B;B=0;let $=await BB.get(`${A.baseUrl}/v1/environments/${J}/work/poll`,{headers:E(G),params:F!==void 0?{reclaim_older_than_ms:F}:void 0,timeout:1e4,signal:U,validateStatus:(W)=>W<500});if(H0($.status,$.data,"Poll",$.headers),!$.data){if(B=N+1,B===1||B%I===0)Q(`[bridge:api] GET .../work/poll -> ${$.status} (no work, ${B} consecutive empty polls)`);return null}return Q(`[bridge:api] GET .../work/poll -> ${$.status} workId=${$.data.id} type=${$.data.data?.type}${$.data.data?.id?` sessionId=${$.data.data.id}`:""}`),Q(`[bridge:api] <<< ${mF($.data)}`),$.data},async acknowledgeWork(J,G,U){ZI(J,"environmentId"),ZI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/ack`);let F=await BB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/ack`,{},{headers:E(U),timeout:1e4,validateStatus:(N)=>N<500});H0(F.status,F.data,"Acknowledge"),Q(`[bridge:api] POST .../work/${G}/ack -> ${F.status}`)},async stopWork(J,G,U){ZI(J,"environmentId"),ZI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/stop force=${U}`);let F=await Y((N)=>BB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/stop`,{force:U},{headers:E(N),timeout:1e4,validateStatus:($)=>$<500}),"StopWork");H0(F.status,F.data,"StopWork"),Q(`[bridge:api] POST .../work/${G}/stop -> ${F.status}`)},async deregisterEnvironment(J){ZI(J,"environmentId"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J}`);let G=await Y((U)=>BB.delete(`${A.baseUrl}/v1/environments/bridge/${J}`,{headers:E(U),timeout:1e4,validateStatus:(F)=>F<500}),"Deregister");H0(G.status,G.data,"Deregister"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J} -> ${G.status}`)},async archiveSession(J){ZI(J,"sessionId"),Q(`[bridge:api] POST /v1/sessions/${J}/archive`);let G=await Y((U)=>BB.post(`${A.baseUrl}/v1/sessions/${J}/archive`,{},{headers:E(U),timeout:1e4,validateStatus:(F)=>F<500}),"ArchiveSession");if(G.status===409){Q(`[bridge:api] POST /v1/sessions/${J}/archive -> 409 (already archived)`);return}H0(G.status,G.data,"ArchiveSession"),Q(`[bridge:api] POST /v1/sessions/${J}/archive -> ${G.status}`)},async reconnectSession(J,G){ZI(J,"environmentId"),ZI(G,"sessionId"),Q(`[bridge:api] POST /v1/environments/${J}/bridge/reconnect session_id=${G}`);let U=await Y((F)=>BB.post(`${A.baseUrl}/v1/environments/${J}/bridge/reconnect`,{session_id:G},{headers:E(F),timeout:1e4,validateStatus:(N)=>N<500}),"ReconnectSession");H0(U.status,U.data,"ReconnectSession"),Q(`[bridge:api] POST .../bridge/reconnect -> ${U.status}`)},async heartbeatWork(J,G,U){ZI(J,"environmentId"),ZI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/heartbeat`);let F=await BB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/heartbeat`,{},{headers:E(U),timeout:1e4,validateStatus:(N)=>N<500});return H0(F.status,F.data,"Heartbeat"),Q(`[bridge:api] POST .../work/${G}/heartbeat -> ${F.status} lease_extended=${F.data.lease_extended} state=${F.data.state}`),F.data},async sendPermissionResponseEvent(J,G,U){ZI(J,"sessionId"),Q(`[bridge:api] POST /v1/sessions/${J}/events type=${G.type}`);let F=await BB.post(`${A.baseUrl}/v1/sessions/${J}/events`,{events:[G]},{headers:E(U),timeout:1e4,validateStatus:(N)=>N<500});H0(F.status,F.data,"SendPermissionResponseEvent"),Q(`[bridge:api] POST /v1/sessions/${J}/events -> ${F.status}`),Q(`[bridge:api] >>> ${mF({events:[G]})}`),Q(`[bridge:api] <<< ${mF(F.data)}`)}}}function H0(A,Q,B,I){if(A===200||A===204)return;let E=nJ(Q),C=bhA(Q);switch(A){case 401:throw new KE(`${B}: Authentication failed (401)${E?`: ${E}`:""}. ${Aq}`,401,C);case 403:throw new KE(B2(C)?"Remote Control session has expired. Please restart with `claude remote-control` or /remote-control.":`${B}: Access denied (403)${E?`: ${E}`:""}. Check your organization permissions.`,403,C);case 404:throw new KE(E??`${B}: Not found (404). Remote Control may not be available for this organization.`,404,C);case 410:throw new KE(E??"Remote Control session has expired. Please restart with `claude remote-control` or /remote-control.",410,C??"environment_expired");case 429:{let Y=ej(typeof I?.["retry-after"]==="string"?I["retry-after"]:void 0);throw Object.assign(Error(`${B}: Rate limited (429). Polling too frequently.`),Y!==void 0?{status:A,retryAfterMs:Y}:{status:A})}default:throw Object.assign(Error(`${B}: Failed with status ${A}${E?`: ${E}`:""}`),{status:A})}}function B2(A){if(!A)return!1;return A.includes("expired")||A.includes("lifetime")}function KEA(A){if(A.status!==403)return!1;return A.message.includes("external_poll_sessions")||A.message.includes("environments:manage")}function bhA(A){if(A&&typeof A==="object"){if("error"in A&&A.error&&typeof A.error==="object"&&"type"in A.error&&typeof A.error.type==="string")return A.error.type}return}RQ();import{randomUUID as khA}from"crypto";var HEA={input_tokens:0,cache_creation_input_tokens:0,cache_read_input_tokens:0,output_tokens:0,server_tool_use:{web_search_requests:0,web_fetch_requests:0},service_tier:"standard",cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},inference_geo:"",iterations:[],speed:"standard"};function ZEA(A){if(A===null||typeof A!=="object")return A;let Q=A;if("requestId"in Q&&!("request_id"in Q))Q.request_id=Q.requestId,delete Q.requestId;if("response"in Q&&Q.response!==null&&typeof Q.response==="object"){let B=Q.response;if("requestId"in B&&!("request_id"in B))B.request_id=B.requestId,delete B.requestId}return A}RQ();_H();fQ();WQ();function yhA(A){return A!==null&&typeof A==="object"&&"type"in A&&typeof A.type==="string"}function fhA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_response"&&"response"in A}function hhA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_request"&&"request_id"in A&&"request"in A}function Qq(A){if((A.type==="user"||A.type==="assistant")&&A.isVirtual)return!1;return A.type==="user"||A.type==="assistant"||A.type==="system"&&A.subtype==="local_command"}function LEA(A){if(A.type!=="user"||A.isMeta||A.toolUseResult||A.isCompactSummary)return;if(A.origin&&A.origin.kind!=="human")return;let Q=A.message.content,B;if(typeof Q==="string")B=Q;else for(let E of Q)if(E.type==="text"){B=E.text;break}if(!B)return;return vH(B)||void 0}function REA(A,Q,B,I,E,C){try{let Y=ZEA(mQ(A));if(fhA(Y)){z("[bridge:repl] Ingress message type=control_response"),E?.(Y);return}if(hhA(Y)){z(`[bridge:repl] Inbound control_request subtype=${Y.request.subtype}`),C?.(Y);return}if(!yhA(Y))return;let J="uuid"in Y&&typeof Y.uuid==="string"?Y.uuid:void 0;if(J&&Q.has(J)){z(`[bridge:repl] Ignoring echo: type=${Y.type} uuid=${J}`);return}if(J&&B.has(J)){z(`[bridge:repl] Ignoring re-delivered inbound: type=${Y.type} uuid=${J}`);return}if(z(`[bridge:repl] Ingress message type=${Y.type}${J?` uuid=${J}`:""}`),Y.type==="user"){if(J)B.add(J);YQ("tengu_bridge_message_received",{is_repl:!0}),I?.(Y)}else z(`[bridge:repl] Ignoring non-user inbound message: type=${Y.type}`)}catch(Y){z(`[bridge:repl] Failed to parse ingress message: ${YA(Y)}`)}}var mhA="This session is outbound-only. Enable Remote Control locally to allow inbound control.";function jEA(A,Q){let{transport:B,sessionId:I,outboundOnly:E,onInterrupt:C,onSetModel:Y,onSetMaxThinkingTokens:J,onSetPermissionMode:G,onRenameSession:U,onSetColor:F,onFileSuggestions:N,onReadFile:$,onMcpAuthenticate:W,onMcpOauthCallbackUrl:D,onMcpReconnect:V,onMcpStatus:X}=Q;if(!B){z("[bridge:repl] Cannot respond to control_request: transport not configured");return}let M;if(E&&A.request.subtype!=="initialize"){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:mhA}};let K={...M,session_id:I};B.write(K),z(`[bridge:repl] Rejected ${A.request.subtype} (outbound-only) request_id=${A.request_id}`);return}switch(A.request.subtype){case"initialize":M={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{commands:[],output_style:"normal",available_output_styles:["normal"],models:[],account:{},pid:process.pid}}};break;case"set_model":Y?.(A.request.model),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_max_thinking_tokens":J?.(A.request.max_thinking_tokens),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_permission_mode":{let K=G?.(A.request.mode)??{ok:!1,error:"set_permission_mode is not supported in this context (onSetPermissionMode callback not registered)"};if(K.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:K.error}};break}case"rename_session":{let K=U?.(A.request.title)??{ok:!1,error:"rename_session is not supported in this context (onRenameSession callback not registered)"};if(K.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:K.error}};break}case"set_color":{let K=F?.(A.request.color)??{ok:!1,error:"set_color is not supported in this context (onSetColor callback not registered)"};if(K.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:K.error}};break}case"file_suggestions":{if(!N){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"file_suggestions is not supported in this context (onFileSuggestions callback not registered)"}};break}N(A.request.query).then((K)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{suggestions:K}}})).catch((K)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:YA(K)}})).then((K)=>{let R={...K,session_id:I};B.write(R),z(`[bridge:repl] Sent control_response for file_suggestions request_id=${A.request_id} result=${K.response.subtype}`)});return}case"read_file":{if(!$){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"read_file is not supported in this context (onReadFile callback not registered)"}};break}$(A.request.path,A.request.max_bytes,A.request.encoding).then((K)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:K}})).catch((K)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:YA(K)}})).then((K)=>{let R={...K,session_id:I};B.write(R),z(`[bridge:repl] Sent control_response for read_file request_id=${A.request_id} result=${K.response.subtype}`)});return}case"mcp_status":M={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{mcpServers:X?.()??[]}}};break;case"mcp_authenticate":case"mcp_oauth_callback_url":case"mcp_reconnect":{let K=A.request,{subtype:R,serverName:O}=K,v=K.subtype==="mcp_authenticate"?W&&((S)=>W(S,K.redirectUri)):K.subtype==="mcp_oauth_callback_url"?D&&((S)=>D(S,K.callbackUrl)):V;if(!v){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`${R} is not supported in this context (callback not registered)`}};break}v(O).then((S)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:S??{}}})).catch((S)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:YA(S)}})).then((S)=>{let m={...S,session_id:I};B.write(m),z(`[bridge:repl] Sent control_response for ${R} request_id=${A.request_id} result=${S.response.subtype}`)});return}case"interrupt":C?.(),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;default:M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`REPL bridge does not handle control_request subtype: ${A.request.subtype}`}}}let L={...M,session_id:I};B.write(L),z(`[bridge:repl] Sent control_response for ${A.request.subtype} request_id=${A.request_id} result=${M.response.subtype}`)}function Bq(A){return{type:"result",subtype:"success",duration_ms:0,duration_api_ms:0,is_error:!1,num_turns:0,result:"",stop_reason:null,total_cost_usd:0,usage:{...HEA},modelUsage:{},permission_denials:[],session_id:A,uuid:khA()}}class I2{capacity;ring;set=new Set;writeIdx=0;constructor(A){this.capacity=A,this.ring=Array(A)}add(A){if(this.set.has(A))return;let Q=this.ring[this.writeIdx];if(Q!==void 0)this.set.delete(Q);this.ring[this.writeIdx]=A,this.set.add(A),this.writeIdx=(this.writeIdx+1)%this.capacity}has(A){return this.set.has(A)}clear(){this.set.clear(),this.ring.fill(void 0),this.writeIdx=0}}function qEA(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 Iq{_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}}import{randomUUID as gEA}from"crypto";RQ();B0();fQ();WQ();function uhA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return mQ(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function xEA(A){let Q=uhA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}RQ();B0();fQ();WQ();function uF(){return"claude-code/0.2.126"}class Eq{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?OEA(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 RB(this.retryDelay(B)),this.pending&&!this.closed)Q=OEA(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 OEA(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 chA=20000,phA=100;function lhA(A){let Q=AE(A);if(Q)return Q;if(A&&typeof A==="object"&&"name"in A&&typeof A.name==="string")return A.name;return}class E2 extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var ihA=10;function dhA(){return{byMessage:new Map,scopeToMessage:new Map}}function C2(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function nhA(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(C2(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(C2(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(C2(E)),Y=C?Q.byMessage.get(C):void 0;if(!Y){B.push(E);break}let J=Y[E.event.index]??=[];if(J.push(E.event.delta.text),I.has(J))break;let G={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:""}}};I.set(J,G),B.push(G);break}default:B.push(E)}for(let[E,C]of I)C.event.delta.text=E.join("");return B}function ohA(A,Q){A.byMessage.delete(Q.message.id);let B=C2(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class Cq{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;currentState=null;sessionBaseUrl;sessionId;streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=dhA();workerState;eventUploader;internalEventUploader;deliveryUploader;onEpochMismatch;getAuthHeaders;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??chA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??I8,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 Eq({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 zJ({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 bU("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new zJ({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 bU("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new zJ({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 bU("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 E2("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 E2("missing_epoch");this.workerEpoch=A;let B=this.getWorkerState(),I={ok:!1};for(let Y=1;Y<=3;Y++){if(I=await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)"),I.ok||this.closed)break;if(Y<3){let J=Math.min(500*2**(Y-1),30000)+Math.random()*500;await RB(J)}}if(!I.ok){if(!this.closed)p("error","cli_worker_init_put_retries_exhausted");throw new E2("worker_register_failed")}this.currentState="idle",this.startHeartbeat(),m6(()=>{this.writeEvent({type:"keep_alive"})}),z(`CCRClient: initialized, epoch=${this.workerEpoch}`),p("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:E,durationMs:C}=await B;if(!this.closed)p("info","cli_worker_state_restored",{duration_ms:C,had_state:E.external!==null||E.internal!==null});return E}async getWorkerState(){let A=Date.now(),Q=this.getAuthHeaders();if(Object.keys(Q).length===0)return{metadata:{external:null,internal:null},durationMs:0};let B=await this.getWithRetry(`${this.sessionBaseUrl}/worker`,Q,"worker_state");return{metadata:{external:B?.worker?.external_metadata??null,internal:B?.worker?.internal_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};let Y=`${this.sessionBaseUrl}${Q}`;try{let J=await fetch(Y,{method:A.toUpperCase(),headers:{...C,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":uF()},body:zA(B),signal:AbortSignal.timeout(E),...xj({url:Y})});if(J.body?.cancel(),J.ok)return this.consecutiveAuthFailures=0,{ok:!0};if(J.status===409)this.handleEpochMismatch();if(J.status===401||J.status===403){let G=rN(),U=G?xEA(G):null;if(U!==null&&U*1000<Date.now())z(`CCRClient: session_token expired (exp=${new Date(U*1000).toISOString()}) — no refresh was delivered, exiting`,{level:"error"}),p("error","cli_worker_token_expired_no_refresh"),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=ihA)z(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),p("error","cli_worker_auth_failures_exhausted"),this.onEpochMismatch()}if(z(`CCRClient: ${I} returned ${J.status}`,{level:"warn"}),p("warn","cli_worker_request_failed",{method:A,path:Q,status:J.status}),J.status===429){let G=J.headers.get("retry-after"),U=G?parseInt(G,10):NaN;if(!isNaN(U)&&U>=0)return{ok:!1,retryAfterMs:U*1000}}return{ok:!1}}catch(J){return z(`CCRClient: ${I} failed: ${YA(J)}`,{level:"warn"}),p("warn","cli_worker_request_error",{method:A,path:Q,error_code:lhA(J)}),{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,display_tool_name:Q.display_tool_name,action_description:Q.action_description,raw_command:Q.raw_command,request_id:Q.request_id,tool_use_id:Q.tool_use_id}:null})}reportMetadata(A){this.workerState.enqueue({external_metadata:ahA(A)})}reportInternalMetadata(A){this.workerState.enqueue({internal_metadata:A})}handleEpochMismatch(){z("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),p("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)z("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(),phA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")ohA(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:gEA()}}}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=nhA(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:gEA()},...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 z(`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{if(E=await fetch(A,{headers:{...Q,"anthropic-version":"2023-06-01","User-Agent":uF()},signal:AbortSignal.timeout(30000),...xj({url:A})}),E.ok)return await E.json()}catch(C){if(z(`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 RB(Y)}continue}if(E.body?.cancel(),E.status===409)this.handleEpochMismatch();if(z(`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 RB(C)}}return z("CCRClient: GET retries exhausted",{level:"error"}),p("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(),AD(),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()}}function ahA(A){let Q=A.post_turn_summary;if(!rhA(Q)||Q.status_category!=="blocked")return A;return{...A,post_turn_summary:{...Q,status_category:"need_input"}}}function rhA(A){return A!==null&&typeof A==="object"&&"status_category"in A&&typeof A.status_category==="string"}RQ();B0();fQ();WQ();var thA=1000,shA=30000,ehA=600000,AmA=45000,QmA=new Set([401,403,404]),ND=10,BmA=500,ImA=8000,EmA={stream:!0};function CmA(){return!0}function YmA(A){let Q=[],B=0,I;while((I=A.indexOf(`
184
184
 
185
185
  `,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(`
186
186
  `)){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+`
@@ -190,4 +190,4 @@ ${E}`;break;case"retry":if(aQA(E))Q[I]=E;break;case"id":if(rQA(E))Q[I]=E;break;c
190
190
  `);if(I.push(J),!G){E=J.endsWith(`
191
191
  `);continue}let{frames:U,remaining:F}=YmA(I.join(""));I=F?[F]:[],E=F.endsWith(`
192
192
  `);for(let N of U){if(this.resetLivenessTimer(),N.id){let $=parseInt(N.id,10);if(!isNaN($)){if(this.seenSequenceNums.has($))z(`SSETransport: DUPLICATE frame seq=${$} (lastSequenceNum=${this.lastSequenceNum}, seenCount=${this.seenSequenceNums.size})`,{level:"warn"}),p("warn","cli_sse_duplicate_sequence");else if(this.seenSequenceNums.add($),this.seenSequenceNums.size>1000){let W=this.lastSequenceNum-200;for(let D of this.seenSequenceNums)if(D<W)this.seenSequenceNums.delete(D)}if($>this.lastSequenceNum)this.lastSequenceNum=$}}if(N.event&&N.data)this.handleSSEFrame(N.event,N.data);else if(N.data)z("SSETransport: Frame has data: but no event: field — dropped",{level:"warn"}),p("warn","cli_sse_frame_missing_event_field")}}}catch(C){if(this.abortController?.signal.aborted)return;z(`SSETransport: Stream read error: ${YA(C)}`,{level:"error"}),p("error","cli_sse_stream_read_error")}finally{Q.releaseLock()}if(this.state!=="closing"&&this.state!=="closed")z("SSETransport: Stream ended, reconnecting"),this.handleConnectionError()}handleSSEFrame(A,Q){if(A!=="client_event"){z(`SSETransport: Unexpected SSE event type '${A}' on worker stream`,{level:"warn"}),p("warn","cli_sse_unexpected_event_type",{event_type:A});return}let B;try{B=mQ(Q)}catch(E){z(`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}`:"";z(`SSETransport: Event seq=${B.sequence_num} event_id=${B.event_id} event_type=${B.event_type} payload_type=${String(I.type)}${E}`),p("info","cli_sse_message_received"),this.onData?.(zA(I)+`
193
- `)}else z(`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<ehA){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;if(this.refreshHeaders){let E=this.refreshHeaders();Object.assign(this.headers,E),z("SSETransport: Refreshed headers for reconnect")}this.state="reconnecting",this.reconnectAttempts++;let B=Math.min(thA*Math.pow(2,this.reconnectAttempts-1),shA),I=Math.max(0,B+B*0.25*(2*Math.random()-1));z(`SSETransport: Reconnecting in ${Math.round(I)}ms (attempt ${this.reconnectAttempts}, ${Math.round(Q/1000)}s elapsed)`),p("error","cli_sse_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},I)}else z(`SSETransport: Reconnection time budget exhausted after ${Math.round(Q/1000)}s`,{level:"error"}),p("error","cli_sse_reconnect_exhausted",{reconnectAttempts:this.reconnectAttempts,elapsedMs:Q}),this.state="closed",this.onCloseCallback?.()}onLivenessTimeout=()=>{this.livenessTimer=null,z("SSETransport: Liveness timeout, reconnecting",{level:"error"}),p("error","cli_sse_liveness_timeout"),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,AmA)}clearLivenessTimer(){if(this.livenessTimer)clearTimeout(this.livenessTimer),this.livenessTimer=null}async write(A){let Q=this.getAuthHeaders();if(Object.keys(Q).length===0){z("SSETransport: No session token available for POST"),p("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":uF()};z(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=ND;I++){try{let C=await BB.post(this.postUrl,A,{headers:B,validateStatus:CmA});if(C.status===200||C.status===201){z(`SSETransport: POST success type=${A.type}`);return}if(z(`SSETransport: POST ${C.status} body=${zA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){z(`SSETransport: POST returned ${C.status} (client error), not retrying`),p("warn","cli_sse_post_client_error",{status:C.status});return}z(`SSETransport: POST returned ${C.status}, attempt ${I}/${ND}`),p("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){z(`SSETransport: POST error: ${YA(C)}, attempt ${I}/${ND}`),p("warn","cli_sse_post_network_error",{attempt:I})}if(I===ND){z(`SSETransport: POST failed after ${ND} attempts, continuing`),p("warn","cli_sse_post_retries_exhausted");return}let E=Math.min(BmA*Math.pow(2,I-1),ImA);await RB(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}[Symbol.dispose](){this.close()}}function JmA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}RQ();fQ();WQ();function SEA(A){let Q=Buffer.from(A,"base64url").toString("utf-8"),B=mQ(Q);if(!B||typeof B!=="object"||!("version"in B)||B.version!==1)throw Error(`Unsupported work secret version: ${B&&typeof B==="object"&&"version"in B?B.version:"unknown"}`);let I=B;if(typeof I.session_ingress_token!=="string"||I.session_ingress_token.length===0)throw Error("Invalid work secret: missing or empty session_ingress_token");if(typeof I.api_base_url!=="string")throw Error("Invalid work secret: missing api_base_url");return B}function vEA(A,Q){let B=A.includes("localhost")||A.includes("127.0.0.1"),I=B?"ws":"wss",E=B?"v2":"v1",C=A.replace(/^https?:\/\//,"").replace(/\/+$/,"");return`${I}://${C}/${E}/session_ingress/ws/${Q}`}function Jq(A,Q){if(A===Q)return!0;let B=A.slice(A.lastIndexOf("_")+1),I=Q.slice(Q.lastIndexOf("_")+1);return B.length>=4&&B===I}function _EA(A,Q){return`${A.replace(/\/+$/,"")}/v1/code/sessions/${Q}`}async function PEA(A,Q){let B=await BB.post(`${A}/worker/register`,{},{headers:{Authorization:`Bearer ${Q}`,"Content-Type":"application/json","anthropic-version":"2023-06-01"},timeout:1e4}),I=B.data?.worker_epoch,E=typeof I==="string"?Number(I):I;if(typeof E!=="number"||!Number.isFinite(E)||!Number.isSafeInteger(E))throw Error(`registerWorker: invalid worker_epoch in response: ${zA(B.data)}`);return E}function TEA(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 bEA(A){let{sessionUrl:Q,ingressToken:B,sessionId:I,initialSequenceNum:E,getAuthToken:C}=A,Y;if(C)Y=()=>{let V=C();if(!V)return{};return{Authorization:`Bearer ${V}`}};else tN(B);let J=A.epoch??await PEA(Q,B);z(`[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 Yq(G,{},I,void 0,E,Y),F,N=new Cq(U,new URL(Q),{getAuthHeaders:Y,heartbeatIntervalMs:A.heartbeatIntervalMs,heartbeatJitterFraction:A.heartbeatJitterFraction,onEpochMismatch:()=>{z("[bridge:repl] CCR v2: epoch superseded (409) — closing for poll-loop recovery");try{N.close(),U.close(),F?.(4090)}catch(V){z(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${YA(V)}`,{level:"error"})}throw Error("epoch superseded")}});U.setOnEvent((V)=>{N.reportDelivery(V.event_id,"received"),N.reportDelivery(V.event_id,"processed")});let $,W=!1,D=!1;return{write(V){return N.writeEvent(V)},async writeBatch(V){for(let X of V){if(D)break;await N.writeEvent(X)}},close(){D=!0,N.close(),U.close()},isConnectedStatus(){return W},getStateLabel(){if(U.isClosedStatus())return"closed";if(U.isConnectedStatus())return W?"connected":"init";return"connecting"},setOnData(V){U.setOnData(V)},setOnClose(V){F=V,U.setOnClose((X)=>{N.close(),V(X??4092)})},setOnConnect(V){$=V},getLastSequenceNum(){return U.getLastSequenceNum()},droppedBatchCount:0,reportState(V,X){N.reportState(V,X)},reportMetadata(V){N.reportMetadata(V)},reportDelivery(V,X){N.reportDelivery(V,X)},flush(){return N.flush()},getInternalEventWriter(){return(V,X,M)=>N.writeInternalEvent(V,X,M)},getInternalEventReaders(){return{readMain:()=>N.readInternalEvents(),readSubagents:()=>N.readSubagentInternalEvents()}},connect(){if(!A.outboundOnly)U.connect();N.initialize(J).then(()=>{W=!0,z(`[bridge:repl] v2 transport ready for writes (epoch=${J}, sse=${U.isConnectedStatus()?"open":"opening"})`),$?.()},(V)=>{z(`[bridge:repl] CCR v2 initialize failed: ${YA(V)}`,{level:"error"}),N.close(),U.close(),F?.(4091)})}}}RQ();fQ();var UmA="2023-06-01",FmA="ccr-byoc-2025-07-29";async function yEA({environmentId:A,title:Q,tags:B,signal:I},E){let{baseUrl:C,getAccessToken:Y,orgUUID:J,model:G}=E,U=Y();if(!U)return z("[bridge] No access token for session creation"),null;let F=`${C}/v1/sessions`,N;try{N=await BB.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:G2(U,J),signal:I,validateStatus:(W)=>W<500})}catch(W){return z(`[bridge] Session creation request failed: ${YA(W)}`),null}if(N.status!==200&&N.status!==201){let W=nJ(N.data);return z(`[bridge] Session creation failed with status ${N.status}${W?`: ${W}`:""}`),null}let $=N.data;if(!$||typeof $!=="object"||!("id"in $)||typeof $.id!=="string")return z("[bridge] No session ID in response"),null;return $.id}async function fEA(A,Q){let{baseUrl:B,getAccessToken:I,orgUUID:E}=Q,C=I();if(!C){z("[bridge] No access token for session archive");return}let Y=`${B}/v1/sessions/${A}/archive`;z(`[bridge] Archiving session ${A}`);try{let J=await BB.post(Y,{},{headers:G2(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)z(`[bridge] Session ${A} archived successfully`);else{let G=nJ(J.data);z(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){z(`[bridge] Session archive request failed: ${YA(J)}`)}}async function Y2(A,Q,B,I,E,C){let Y=C();if(!Y)return z(`[bridge] No access token for ${A}-pr`),!1;let J=`${E}/v1/code/github/${A}-pr`,G={session_id:cF(Q),repo:B,pr_number:I},U;try{U=await BB.post(J,G,{headers:G2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-pr request failed: ${YA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=nJ(U.data);return z(`[bridge] ${A}-pr failed ${U.status}${N?`: ${N}`:""}`),!1}return z(`[bridge] ${A}-pr ${B}#${I} ok`),!0}async function J2(A,Q,B,I,E,C){let Y=C();if(!Y)return z(`[bridge] No access token for ${A}-thread`),!1;let J=`${E}/v1/code/slack/${A}-thread`,G={session_id:cF(Q),channel:B,thread_ts:I},U;try{U=await BB.post(J,G,{headers:G2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-thread request failed: ${YA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=nJ(U.data);return z(`[bridge] ${A}-thread failed ${U.status}${N?`: ${N}`:""}`),!1}return z(`[bridge] ${A}-thread ${B}/${I} ok`),!0}function G2(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":UmA,"anthropic-beta":FmA};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}var nEA=2000,lEA=60000,iEA=900000,ZmA=300000,dEA=3;function oEA(A){return A*(0.8+Math.random()*0.4)}var LmA=0;async function aEA(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:$,getCurrentTitle:W=()=>Y,toSDKMessages:D=()=>{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:V,getTrustedDeviceToken:X,getPollIntervalConfig:M=()=>ON,initialHistoryCap:L=200,initialMessages:K,previouslyFlushedUUIDs:R,onInboundMessage:O,onPermissionResponse:v,onInterrupt:S,onSetModel:m,onSetMaxThinkingTokens:o,onSetPermissionMode:wA,onRenameSession:PA,onSetColor:UA,onFileSuggestions:QA,onReadFile:gA,onMcpAuthenticate:IQ,onMcpOauthCallbackUrl:P,onMcpReconnect:SA,onMcpStatus:e,onStateChange:jA,onUserMessage:r,onSessionEstablished:n,onInitError:yA,perpetual:TA,initialSSESequenceNum:uA=0,onTransportPersistenceReady:pA,onTransportPersistenceTeardown:bQ}=A,GB=++LmA,{writeBridgePointer:UB,clearBridgePointer:fB,readBridgePointer:tQ}=await Promise.resolve().then(() => (cEA(),uEA)),oJ=TA?await tQ(Q):null,AI=oJ?.source==="repl"?oJ:null;z(`[bridge:repl] initBridgeCore #${GB} starting (initialMessages=${K?.length??0}${AI?` perpetual prior=env:${AI.environmentId}`:""})`);let rA=zEA({baseUrl:J,getAccessToken:F,runnerVersion:"0.2.124",onDebug:z,onAuth401:V,getTrustedDeviceToken:X}),NQ={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:pEA(),workerType:U,environmentId:pEA(),reuseEnvironmentId:AI?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},a,HE;try{let b=await rA.registerBridgeEnvironment(NQ);a=b.environment_id,HE=b.environment_secret}catch(b){if(wEA("registration_failed",`[bridge:repl] Environment registration failed: ${YA(b)}`),yA?.(`[bridge:repl] Environment registration failed: ${YA(b)}`),AI&&b instanceof KE&&(b.status===410||b.status!==401&&B2(b.errorType)))await fB(Q);return jA?.("failed",YA(b)),null}z(`[bridge:repl] Environment registered: ${a}`),p("info","bridge_repl_env_registered"),YQ("tengu_bridge_repl_env_registered",{});async function RY(b,IA){if(a!==b)return z(`[bridge:repl] Env mismatch (requested ${b}, got ${a}) — cannot reconnect in place`),!1;let QQ=Uq(IA),GQ=QQ===IA?[IA]:[IA,QQ];for(let vA of GQ)try{return await rA.reconnectSession(a,vA),z(`[bridge:repl] Reconnected session ${vA} in place on env ${a}`),!0}catch(EB){z(`[bridge:repl] reconnectSession(${vA}) failed: ${YA(EB)}`)}return z("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let qC=AI?await RY(AI.environmentId,AI.sessionId):!1;if(AI&&!qC)await fB(Q);let $A,LI=new Set,sQ=null,oE=new Set;if(qC&&AI){if($A=AI.sessionId,z(`[bridge:repl] Perpetual session reused: ${$A}`),K&&R)for(let b of K)R.add(b.uuid)}else{let b=await N({environmentId:a,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!b)return z("[bridge:repl] Session creation failed, deregistering environment"),yA?.("[bridge:repl] Session creation failed, deregistering environment"),YQ("tengu_bridge_repl_session_failed",{}),await rA.deregisterEnvironment(a).catch(()=>{}),jA?.("failed","Session creation failed"),null;$A=b,z(`[bridge:repl] Session created: ${$A}`)}n?.($A),await UB(Q,{sessionId:$A,environmentId:a,source:"repl"}),p("info","bridge_repl_session_created"),YQ("tengu_bridge_repl_started",{has_initial_messages:!!(K&&K.length>0),inProtectedNamespace:kx(),...uIA()});let xC=new Set;if(K)for(let b of K)xC.add(b.uuid);let ZE=new I2(2000);for(let b of xC)ZE.add(b);let aJ=new I2(2000),FB=new AbortController,t=null,oI=0,LB=qC?uA:0,VB=null,aI=null,pF=qEA(FB.signal),jY=pF.wake,lF=pF.signal,kQ=new Iq,nB=!r,QI=3,RI=0,rI=null;async function Dq(){if(rI)return rI;rI=sEA();try{return await rI}finally{rI=null}}async function sEA(){if(RI++,oI++,z(`[bridge:repl] Reconnecting after env lost (attempt ${RI}/${QI})`),RI>QI)return z(`[bridge:repl] Environment reconnect limit reached (${QI}), giving up`),!1;if(t){let vA=t.getLastSequenceNum();if(vA>LB)LB=vA;bQ?.(),t.close(),t=null}if(jY(),kQ.drop(),VB){let vA=VB;if(await rA.stopWork(a,vA,!1).catch(()=>{}),VB!==vA)return z("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),RI=0,!0;VB=null,aI=null}if(FB.signal.aborted)return z("[bridge:repl] Reconnect aborted by teardown"),!1;let b=a;NQ.reuseEnvironmentId=b;let IA;for(let vA=1;;vA++)try{IA=await rA.registerBridgeEnvironment(NQ);break}catch(EB){if(EB instanceof KE||vA>=dEA||FB.signal.aborted)return NQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Environment re-registration failed (attempt ${vA}): ${YA(EB)}`),!1;let DD=oEA(nEA*2**(vA-1));if(z(`[bridge:repl] Environment re-registration transient failure (attempt ${vA}/${dEA}), retrying in ${Math.round(DD)}ms: ${YA(EB)}`),await RB(DD,FB.signal),FB.signal.aborted)return NQ.reuseEnvironmentId=void 0,!1}if(a=IA.environment_id,HE=IA.environment_secret,NQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Re-registered: requested=${b} got=${a}`),FB.signal.aborted)return z("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await rA.deregisterEnvironment(a).catch(()=>{}),!1;if(t!==null)return z("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),RI=0,!0;if(await RY(b,$A))return YQ("tengu_bridge_repl_reconnected_in_place",{}),RI=0,!0;if(a!==b)YQ("tengu_bridge_repl_env_expired_fresh_session",{});if(await $($A),FB.signal.aborted)return z("[bridge:repl] Reconnect aborted after archive, cleaning up"),await rA.deregisterEnvironment(a).catch(()=>{}),!1;let QQ=W(),GQ=await N({environmentId:a,title:QQ,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!GQ)return z("[bridge:repl] Session creation failed during reconnection"),!1;if(FB.signal.aborted)return z("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await $(GQ),!1;if($A=GQ,iIA(cF(GQ)).catch(()=>{}),n?.($A),LB=0,aJ.clear(),nB=!r,z(`[bridge:repl] Re-created session: ${$A}`),await UB(Q,{sessionId:$A,environmentId:a,source:"repl"}),R?.clear(),LI.size>0){z(`[bridge:repl] Replaying ${LI.size} PR subscription(s) against new session`);for(let vA of LI){let EB=vA.lastIndexOf("#");Y2("subscribe",$A,vA.slice(0,EB),Number(vA.slice(EB+1)),J,F)}}if(oE.size>0){z(`[bridge:repl] Replaying ${oE.size} Slack thread subscription(s) against new session`);for(let vA of oE){let EB=vA.indexOf("/");J2("subscribe",$A,vA.slice(0,EB),vA.slice(EB+1),J,F)}}return RI=0,!0}function F2(){return F()}function Wq(){let b=kQ.end();if(b.length===0)return;if(!t){z(`[bridge:repl] Cannot drain ${b.length} pending message(s): no transport`);return}for(let GQ of b)ZE.add(GQ.uuid);let QQ=D(b).map((GQ)=>({...GQ,session_id:$A}));z(`[bridge:repl] Drained ${b.length} pending message(s) after flush`),t.writeBatch(QQ)}let N2=null;function $2(){N2?.()}function Xq(b){if(z(`[bridge:repl] Transport permanently closed: code=${b}`),YQ("tengu_bridge_repl_ws_closed",{code:b}),t){let QQ=t.getLastSequenceNum();if(QQ>LB)LB=QQ;bQ?.(),t=null}jY();let IA=kQ.drop();if(IA>0)z(`[bridge:repl] Dropping ${IA} pending message(s) on transport close (code=${b})`,{level:"warn"});if(b===1000){jA?.("failed","session ended"),FB.abort(),$2();return}jA?.("reconnecting",`Remote Control connection lost (code ${b})`),z(`[bridge:repl] Transport reconnect budget exhausted (code=${b}), attempting env reconnect`),Dq().then((QQ)=>{if(QQ)return;if(FB.signal.aborted)return;z("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),YQ("tengu_bridge_repl_reconnect_failed",{close_code:b}),jA?.("failed","reconnection failed"),$2()})}let Vq,eEA=null,ACA={api:rA,getCredentials:()=>({environmentId:a,environmentSecret:HE}),signal:FB.signal,getPollIntervalConfig:M,onStateChange:jA,getWsState:()=>t?.getStateLabel()??"null",isAtCapacity:()=>t!==null,capacitySignal:lF,onFatalError:$2,getHeartbeatInfo:()=>{if(!VB||!aI)return null;return{environmentId:a,workId:VB,sessionToken:aI}},onHeartbeatFatal:(b)=>{if(z(`[bridge:repl] heartbeatWork fatal (status=${b.status}) — tearing down work item for fast re-dispatch`),t){let IA=t.getLastSequenceNum();if(IA>LB)LB=IA;bQ?.(),t.close(),t=null}if(kQ.drop(),VB)rA.stopWork(a,VB,!1).catch((IA)=>{z(`[bridge:repl] stopWork after heartbeat fatal: ${YA(IA)}`)});VB=null,aI=null,jY(),jA?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await Dq())return null;return{environmentId:a,environmentSecret:HE}},onWorkReceived:(b,IA,QQ,GQ)=>{if(t?.isConnectedStatus())z(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${QQ})`);if(z(`[bridge:repl] Work received: workId=${QQ} workSessionId=${b} currentSessionId=${$A} match=${Jq(b,$A)}`),UB(Q,{sessionId:$A,environmentId:a,source:"repl"}),!Jq(b,$A)){z(`[bridge:repl] Rejecting foreign session: expected=${$A} got=${b}`);return}VB=QQ,aI=IA;let vA=GQ||BQ(process.env.CLAUDE_BRIDGE_USE_CCR_V2),EB;if(!vA){if(EB=F2(),!EB){z("[bridge:repl] No OAuth token available for session ingress, skipping work");return}tN(EB)}if(YQ("tengu_bridge_repl_work_received",{}),t){bQ?.();let pQ=t;t=null;let eQ=pQ.getLastSequenceNum();if(eQ>LB)LB=eQ;pQ.close()}kQ.deactivate();let DD=(pQ)=>jEA(pQ,{transport:t,sessionId:$A,onInterrupt:S,onSetModel:m,onSetMaxThinkingTokens:o,onSetPermissionMode:wA,onRenameSession:PA,onSetColor:UA,onFileSuggestions:QA,onReadFile:gA,onMcpAuthenticate:IQ,onMcpOauthCallbackUrl:P,onMcpReconnect:SA,onMcpStatus:e}),V2=!1,wq=(pQ)=>{if(t=pQ,pQ.setOnConnect(()=>{if(t!==pQ)return;if(z("[bridge:repl] Ingress transport connected"),YQ("tengu_bridge_repl_ws_connected",{}),!vA){let eQ=F2();if(eQ)tN(eQ)}if(X2=!1,!V2&&K&&K.length>0){V2=!0;let eQ=L,BI=K.filter((WD)=>Qq(WD)&&!R?.has(WD.uuid)),OC=eQ>0&&BI.length>eQ?BI.slice(-eQ):BI;if(OC.length<BI.length)z(`[bridge:repl] Capped initial flush: ${BI.length} -> ${OC.length} (cap=${eQ})`),YQ("tengu_bridge_repl_history_capped",{eligible_count:BI.length,capped_count:OC.length});let Z0=D(OC);if(Z0.length>0){z(`[bridge:repl] Flushing ${Z0.length} initial message(s) via transport`);let WD=Z0.map((rJ)=>({...rJ,session_id:$A})),zq=pQ.droppedBatchCount;pQ.writeBatch(WD).then(()=>{if(pQ.droppedBatchCount>zq){z(`[bridge:repl] Initial flush dropped ${pQ.droppedBatchCount-zq} batch(es) — not marking ${Z0.length} UUID(s) as flushed`);return}if(R){for(let rJ of Z0)if(rJ.uuid)R.add(rJ.uuid)}}).catch((rJ)=>z(`[bridge:repl] Initial flush failed: ${rJ}`)).finally(()=>{if(t!==pQ)return;Wq(),jA?.("connected")})}else Wq(),jA?.("connected")}else if(!kQ.active)jA?.("connected")}),pQ.setOnData((eQ)=>{REA(eQ,ZE,aJ,O,v,DD)}),eEA=Xq,pQ.setOnClose((eQ)=>{if(t!==pQ)return;Xq(eQ)}),!V2&&K&&K.length>0)kQ.start();pQ.connect()};if(oI++,vA){let pQ=_EA(J,b),eQ=oI;z(`[bridge:repl] CCR v2: sessionUrl=${pQ} session=${b} gen=${eQ}`),bEA({sessionUrl:pQ,ingressToken:IA,sessionId:b,initialSequenceNum:LB}).then((BI)=>{if(FB.signal.aborted){BI.close();return}if(eQ!==oI){z(`[bridge:repl] CCR v2: discarding stale handshake gen=${eQ} current=${oI}`),BI.close();return}if(wq(BI),pA){let OC=BI.getInternalEventWriter?.(),Z0=BI.getInternalEventReaders?.();if(OC&&Z0)pA(OC,Z0)}},(BI)=>{if(z(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${YA(BI)}`,{level:"error"}),YQ("tengu_bridge_repl_ccr_v2_init_failed",{}),eQ!==oI)return;if(VB)rA.stopWork(a,VB,!1).catch((OC)=>{z(`[bridge:repl] stopWork after v2 init failure: ${YA(OC)}`)}),VB=null,aI=null;jY()})}else{let pQ=vEA(G,b);z(`[bridge:repl] Ingress URL: ${pQ}`),z(`[bridge:repl] Creating HybridTransport: session=${b}`);let eQ=EB??"";wq(TEA(new dj(new URL(pQ),{Authorization:`Bearer ${eQ}`,"anthropic-version":"2023-06-01"},b,()=>({Authorization:`Bearer ${F2()??eQ}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{jA?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),jY()}})))}}};RmA(ACA);let D2=TA?setInterval(()=>{if(rI)return;UB(Q,{sessionId:$A,environmentId:a,source:"repl"})},3600000):null;D2?.unref?.();let Mq=M().session_keepalive_interval_v2_ms,W2=Mq>0?setInterval(()=>{if(!t)return;z("[bridge:repl] keep_alive sent"),t.write({type:"keep_alive"}).catch((b)=>{z(`[bridge:repl] keep_alive write failed: ${YA(b)}`)})},Mq):null;W2?.unref?.();let X2=!1;N2=async()=>{if(X2){z(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${a} session=${$A}`);return}X2=!0,bQ?.();let b=Date.now();if(z(`[bridge:repl] Teardown starting: env=${a} session=${$A} workId=${VB??"none"} transportState=${t?.getStateLabel()??"null"}`),D2!==null)clearInterval(D2);if(W2!==null)clearInterval(W2);if(Vq)process.off("SIGUSR2",Vq);if(FB.abort(),z("[bridge:repl] Teardown: poll loop aborted"),t){let GQ=t.getLastSequenceNum();if(GQ>LB)LB=GQ}if(TA){t=null,kQ.drop(),await UB(Q,{sessionId:$A,environmentId:a,source:"repl"}),z(`[bridge:repl] Teardown (perpetual): leaving env=${a} session=${$A} alive on server, duration=${Date.now()-b}ms`);return}let IA=t;if(t=null,kQ.drop(),IA)IA.write(Bq($A));let QQ=VB?rA.stopWork(a,VB,!0).then(()=>{z("[bridge:repl] Teardown: stopWork completed")}).catch((GQ)=>{z(`[bridge:repl] Teardown stopWork failed: ${YA(GQ)}`)}):Promise.resolve();await Promise.all([QQ,$($A)]),IA?.close(),z("[bridge:repl] Teardown: transport closed"),await rA.deregisterEnvironment(a).catch((GQ)=>{z(`[bridge:repl] Teardown deregister failed: ${YA(GQ)}`)}),await fB(Q),z(`[bridge:repl] Teardown complete: env=${a} duration=${Date.now()-b}ms`)},z(`[bridge:repl] Ready: env=${a} session=${$A}`),jA?.("ready");let $D={get bridgeSessionId(){return $A},get environmentId(){return a},getLastSequenceNum(){return $D.getSSESequenceNum()},flush(){return t?.flush()??Promise.resolve()},getSSESequenceNum(){let b=t?.getLastSequenceNum()??0;return Math.max(LB,b)},sessionIngressUrl:G,writeMessages(b){let IA=b.filter((vA)=>Qq(vA)&&!xC.has(vA.uuid)&&!ZE.has(vA.uuid));if(IA.length===0)return;if(!nB)for(let vA of IA){let EB=LEA(vA);if(EB!==void 0&&r?.(EB,$A)){nB=!0;break}}if(kQ.enqueue(...IA)){z(`[bridge:repl] Queued ${IA.length} message(s) during initial flush`);return}if(!t){let vA=IA.map((EB)=>EB.type).join(",");z(`[bridge:repl] Transport not configured, dropping ${IA.length} message(s) [${vA}] for session=${$A}`,{level:"warn"});return}for(let vA of IA)ZE.add(vA.uuid);z(`[bridge:repl] Sending ${IA.length} message(s) via transport`);let GQ=D(IA).map((vA)=>({...vA,session_id:$A}));t.writeBatch(GQ)},writeSdkMessages(b){let IA=b.filter((GQ)=>!GQ.uuid||!ZE.has(GQ.uuid));if(IA.length===0)return;if(!t){z(`[bridge:repl] Transport not configured, dropping ${IA.length} SDK message(s) for session=${$A}`,{level:"warn"});return}for(let GQ of IA)if(GQ.uuid)ZE.add(GQ.uuid);let QQ=IA.map((GQ)=>({...GQ,session_id:$A}));t.writeBatch(QQ)},sendControlRequest(b){if(!t){z("[bridge:repl] Transport not configured, skipping control_request");return}let IA={...b,session_id:$A};t.write(IA),z(`[bridge:repl] Sent control_request request_id=${b.request_id}`)},sendControlResponse(b){if(!t){z("[bridge:repl] Transport not configured, skipping control_response");return}let IA={...b,session_id:$A};t.write(IA),z("[bridge:repl] Sent control_response")},sendControlCancelRequest(b){if(!t){z("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let IA={type:"control_cancel_request",request_id:b,session_id:$A};t.write(IA),z(`[bridge:repl] Sent control_cancel_request request_id=${b}`)},reportMetadata(b){t?.reportMetadata(b)},sendResult(){if(!t){z(`[bridge:repl] sendResult: skipping, transport not configured session=${$A}`);return}t.write(Bq($A)),z(`[bridge:repl] Sent result for session=${$A}`)},async subscribePR(b,IA,QQ){let GQ=sQ;if(QQ)sQ={agentId:QQ,repo:b,prNumber:IA};let vA=await Y2("subscribe",$A,b,IA,J,F);if(vA)LI.add(`${b}#${IA}`);else if(QQ)sQ=GQ;return vA},async unsubscribePR(b,IA){let QQ=await Y2("unsubscribe",$A,b,IA,J,F);if(QQ){if(LI.delete(`${b}#${IA}`),sQ?.repo===b&&sQ.prNumber===IA)sQ=null}return QQ},async subscribeSlackThread(b,IA){let QQ=await J2("subscribe",$A,b,IA,J,F);if(QQ)oE.add(`${b}/${IA}`);return QQ},async unsubscribeSlackThread(b,IA){let QQ=await J2("unsubscribe",$A,b,IA,J,F);if(QQ)oE.delete(`${b}/${IA}`);return QQ},getPRWebhookTarget(){return sQ},async teardown(){QCA(),await N2?.(),z("[bridge:repl] Torn down"),YQ("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return $D.teardown()}},QCA=_0($D);return $D}async function RmA({api:A,getCredentials:Q,signal:B,onStateChange:I,onWorkReceived:E,onEnvironmentLost:C,getWsState:Y,isAtCapacity:J,capacitySignal:G,onFatalError:U,getPollIntervalConfig:F=()=>ON,getHeartbeatInfo:N,onHeartbeatFatal:$}){z(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let D=0,V=null,X=null,M=0,L=0,K=!1;while(!B.aborted){let{environmentId:R,environmentSecret:O}=Q(),v=F();try{let S=await A.pollForWork(R,O,B,v.reclaim_older_than_ms);if(L=0,D>0)z(`[bridge:repl] Poll recovered after ${D} consecutive error(s)`),D=0,V=null,X=null,M=0,I?.("ready");if(!S){let o=K;if(K=!1,J?.()&&G&&!o){let wA=v.poll_interval_ms_at_capacity;if(v.non_exclusive_heartbeat_interval_ms>0&&N){YQ("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:v.non_exclusive_heartbeat_interval_ms});let UA=wA>0?Date.now()+wA:null,QA=!1,gA=0;while(!B.aborted&&J()&&(UA===null||Date.now()<UA)){let P=F();if(P.non_exclusive_heartbeat_interval_ms<=0)break;let SA=N();if(!SA)break;let e=G();try{await A.heartbeatWork(SA.environmentId,SA.workId,SA.sessionToken)}catch(jA){if(z(`[bridge:repl:heartbeat] Failed: ${YA(jA)}`),jA instanceof KE){if(e.cleanup(),YQ("tengu_bridge_heartbeat_error",{status:jA.status,error_type:jA.status===401||jA.status===403?"auth_failed":"fatal"}),$)$(jA),z(`[bridge:repl:heartbeat] Fatal (status=${jA.status}), work state cleared — fast-polling for re-dispatch`);else QA=!0;break}}gA++,await RB(P.non_exclusive_heartbeat_interval_ms,e.signal),e.cleanup()}let IQ=QA?"error":B.aborted?"shutdown":!J()?"capacity_changed":UA!==null&&Date.now()>=UA?"poll_due":"config_disabled";if(YQ("tengu_bridge_heartbeat_mode_exited",{reason:IQ,heartbeat_cycles:gA}),!QA){if(IQ==="poll_due")z(`[bridge:repl] Heartbeat poll_due after ${gA} cycles — falling through to pollForWork`);continue}}let PA=wA>0?wA:v.non_exclusive_heartbeat_interval_ms;if(PA>0){let UA=G(),QA=Date.now();await RB(PA,UA.signal),UA.cleanup();let gA=Date.now()-QA-PA;if(gA>60000)z(`[bridge:repl] At-capacity sleep overran by ${Math.round(gA/1000)}s — process suspension detected, forcing one fast-poll cycle`),YQ("tengu_bridge_repl_suspension_detected",{overrun_ms:gA}),K=!0}}else await RB(v.poll_interval_ms_not_at_capacity,B);continue}let m;try{m=SEA(S.secret)}catch(o){z(`[bridge:repl] Failed to decode work secret: ${YA(o)}`),YQ("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(R,S.id,!1).catch(()=>{});continue}z(`[bridge:repl] Acknowledging workId=${S.id}`);try{await A.acknowledgeWork(R,S.id,m.session_ingress_token)}catch(o){z(`[bridge:repl] Acknowledge failed workId=${S.id}: ${YA(o)}`)}if(S.data.type==="healthcheck"){z("[bridge:repl] Healthcheck received");continue}if(S.data.type==="session"){let o=S.data.id;try{ZI(o,"session_id")}catch{z(`[bridge:repl] Invalid session_id in work: ${o}`);continue}E(o,m.session_ingress_token,S.id,m.use_code_sessions===!0),z("[bridge:repl] Work accepted, continuing poll loop")}}catch(S){if(B.aborted)break;if(S instanceof KE&&S.status===404&&C){let P=Q().environmentId;if(R!==P){z(`[bridge:repl] Stale poll error for old env=${R}, current env=${P} — skipping onEnvironmentLost`),D=0,V=null;continue}if(L++,z(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${L}/3)`),YQ("tengu_bridge_repl_env_lost",{attempt:L}),L>3){z("[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 SA=await C();if(B.aborted)break;if(SA){D=0,V=null,I?.("ready"),z(`[bridge:repl] Re-registered environment: ${SA.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(S instanceof KE){let P=B2(S.errorType),SA=KEA(S);if(z(`[bridge:repl] Fatal poll error: ${S.message} (status=${S.status}, type=${S.errorType??"unknown"})${SA?" (suppressed)":""}`),YQ("tengu_bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),p(P?"info":"error","bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),!SA)I?.("failed",P?"session expired · /remote-control to reconnect":S.message);U?.();break}let m=Date.now();if(X!==null&&m-X>Math.max(lEA,M)*2)z(`[bridge:repl] Detected system sleep (${Math.round((m-X)/1000)}s gap), resetting poll error budget`),p("info","bridge_repl_poll_sleep_detected",{gapMs:m-X}),D=0,V=null;if(X=m,D++,V===null)V=m;let o=m-V,wA=VEA(S),PA=XEA(S),UA=Y?.()??"unknown";if(z(`[bridge:repl] Poll error (attempt ${D}, elapsed ${Math.round(o/1000)}s, ws=${UA}): ${PA}`),YQ("tengu_bridge_repl_poll_error",{status:wA,consecutiveErrors:D,elapsedMs:o}),D===1)I?.("reconnecting",PA);if(o>=iEA){z(`[bridge:repl] Poll failures exceeded ${iEA/1000}s (${D} errors), giving up`),p("info","bridge_repl_poll_give_up"),YQ("tengu_bridge_repl_poll_give_up",{consecutiveErrors:D,elapsedMs:o,lastStatus:wA}),I?.("failed","connection to server lost");break}let QA=MEA(S),gA=Math.min(nEA*2**(D-1),lEA),IQ=oEA(QA!==void 0?Math.max(gA,Math.min(QA,ZmA)):gA);if(M=IQ,F().non_exclusive_heartbeat_interval_ms>0){let P=N?.();if(P)try{await A.heartbeatWork(P.environmentId,P.workId,P.sessionToken)}catch{}}await RB(IQ,B)}}z(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function jmA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function qmA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function xmA(A,Q){if(qmA(A,Q))return"http://localhost:4000";if(jmA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function rEA(A,Q){let{toCompatSessionId:B}=JCA(kEA),I=B(A);return`${xmA(I,Q)}/code/${I}`}RQ();async function tEA(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:$=!1,initialSSESequenceNum:W,onConflict:D}=A,V=A.onAuth401;if(!J())return z("[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 X=U,M={baseUrl:U,getAccessToken:J,orgUUID:F,model:N},L=[],K=null,R=[],O=null,v=[],S=null,m=!1,o=null,wA={detail:null},PA=OmA(),UA=()=>aEA({dir:Q,registrationDir:B,machineName:PA,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:X,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:V,onInitError:console.error,createSession:({environmentId:e,title:jA,signal:r})=>yEA({environmentId:e,title:jA,tags:["claude-code-assistant"],signal:r},M),archiveSession:(e)=>fEA(e,M),perpetual:$,initialSSESequenceNum:W,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...ON,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(e){let jA=hc(e);if(!jA)return;L.push({content:jA.content,uuid:jA.uuid}),K?.(),K=null},onInterrupt(){R.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),O?.(),O=null},onSetModel(e){R.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:e}}),O?.(),O=null},onSetMaxThinkingTokens(e){R.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:e}}),O?.(),O=null},onPermissionResponse(e){v.push(e),S?.(),S=null},onStateChange(e,jA){if(o?.(e,jA),e==="failed")wA.detail=jA??"unknown failure",m=!0,K?.(),O?.(),S?.()}}),QA=await UA();if(!QA&&D&&wA.detail?.includes("409")){if(await D({machineName:PA,message:wA.detail})==="takeover")m=!1,wA.detail=null,QA=await UA()}if(!QA){let e=wA.detail??"initBridgeCore returned null (env registration or session creation failed)";return z(`[bridge:daemon] connectRemoteControl failed: ${e}`),{ok:!1,error:{kind:wA.detail?.includes("409")?"conflict":wA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:e}}}async function*gA(){while(!m){while(L.length>0)if(yield L.shift(),m)return;await new Promise((e)=>{K=e})}}async function*IQ(){while(!m){while(R.length>0)if(yield R.shift(),m)return;await new Promise((e)=>{O=e})}}async function*P(){while(!m){while(v.length>0)if(yield v.shift(),m)return;await new Promise((e)=>{S=e})}}return{ok:!0,handle:{get sessionUrl(){return rEA(QA.bridgeSessionId,X)},get environmentId(){return QA.environmentId},get bridgeSessionId(){return QA.bridgeSessionId},getSSESequenceNum(){return QA.getSSESequenceNum()},hasPendingPrompts(){return L.length>0},write(e){QA.writeSdkMessages([e])},sendResult(){QA.sendResult()},sendControlRequest(e){QA.sendControlRequest(e)},sendControlResponse(e){QA.sendControlResponse(e)},sendControlCancelRequest(e){QA.sendControlCancelRequest(e)},inboundPrompts:gA,controlRequests:IQ,permissionResponses:P,onStateChange(e){o=e},async teardown(){m=!0,K?.(),O?.(),S?.(),await QA.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var SmA=1000,vmA=1e4,_mA=5000,PmA=60000,$q=3;function TmA(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 bmA(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"&&Rq(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}async function kmA(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:$=()=>{}}=A;$("─── worker start ───");let W=await G?.load(),D={...Q,initialSSESequenceNum:Q.initialSSESequenceNum??W?.lastSSESequenceNum};if(!D.getAccessToken())return{ok:!1,error:{kind:"auth",detail:"getAccessToken returned empty"}};let V=await tEA(D);if(!V.ok)return $(`bridge connection failed: ${V.error.kind} — ${V.error.detail}`),{ok:!1,error:V.error};let X=V.handle;$(`bridge connected url=${X.sessionUrl} env=${X.environmentId}`);let M=W?.claudeSessionId,L=X.bridgeSessionId,K=[],R=null,O=!1,v=null,S=0,m=!0,o=0,wA=Promise.resolve();function PA(){if(!G)return;let FA={claudeSessionId:M,lastSSESequenceNum:X.getSSESequenceNum(),bridgeSessionId:X.bridgeSessionId};wA=wA.then(()=>G.save(FA).catch((rA)=>{$(`stateAdapter.save threw: ${rA}`)}))}function UA(){if(K.length>0||X.hasPendingPrompts()){$("persist skipped: prompt queued");return}PA()}PA();let QA=new AbortController,gA=new Map,IQ=null;function P(){return IQ??=(async()=>{UA();for(let FA of gA.keys())X.sendControlCancelRequest(FA);gA.clear(),await X.teardown(),await wA})()}if(N.addEventListener("abort",()=>{QA.abort(),P().catch((FA)=>$(`teardown threw: ${FA}`))}),N.aborted)return await P(),{ok:!1,error:{kind:"unknown",detail:"aborted before start"}};let SA="connected";X.onStateChange((FA,rA)=>{if($(`bridge state=${FA} detail=${rA??""}`),SA=FA,FA==="ready"&&X.bridgeSessionId!==L)L=X.bridgeSessionId,PA();else if(FA==="connected")UA();if(FA==="failed")$(`bridge failed: ${rA??"unknown"}`),QA.abort(),P().catch((NQ)=>$(`teardown threw: ${NQ}`))});let e=I?.horizonMs??600000,jA=I?.leadMs??_mA,r=null,n=!1,yA=!1,TA="";async function uA(){if(!I)return;let FA=await kc(I.dir).catch((NQ)=>{return $(`computeCronHorizon threw: ${NQ}`),{nextFire:null,hasOverdue:!1}});r=FA.nextFire,yA=FA.hasOverdue;let rA=FA.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(FA.nextFire).toISOString()} hasOverdue=${FA.hasOverdue}`;if(rA!==TA)TA=rA,$(rA)}let pA;if(I)await uA(),pA=setInterval(uA,vmA),pA.unref?.();function bQ(FA){K.push({type:"user",message:{role:"user",content:FA},parent_tool_use_id:null,session_id:""}),R?.(),R=null}async function GB(FA,rA,NQ){if(C){let sQ=await C(FA,rA,NQ);if(sQ)return Y?.(FA,sQ),sQ}if(SA!=="connected"){$(`permission denied — bridge state=${SA}, request would drop`);let sQ={behavior:"deny",message:`Cannot request permission: remote control is ${SA}. Try again in a moment.`};return Y?.(FA,sQ),sQ}let a=gmA();$(`permission request tool=${FA} req=${a}`);let{signal:HE,suggestions:RY,blockedPath:qC,toolUseID:$A}=NQ;X.sendControlRequest({type:"control_request",request_id:a,request:{subtype:"can_use_tool",tool_name:FA,display_name:jq(FA),input:rA,tool_use_id:$A,...RY&&{permission_suggestions:RY},...qC&&{blocked_path:qC},..."decisionReason"in NQ&&NQ.decisionReason&&{decision_reason:NQ.decisionReason},..."agentID"in NQ&&NQ.agentID&&{agent_id:NQ.agentID}}});let LI;try{let sQ=await new Promise((xC,ZE)=>{gA.set(a,xC),LI=setTimeout((aJ,FB,t,oI,LB)=>{if(aJ.delete(FB))t(`permission timeout req=${FB}`),oI.sendControlCancelRequest(FB),LB({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},PmA,gA,a,$,X,xC),LI.unref?.(),HE.addEventListener("abort",()=>{if(gA.delete(a))X.sendControlCancelRequest(a);ZE(Error("aborted"))},{once:!0})});$(`permission response req=${a} behavior=${sQ.behavior}`);let oE=sQ.behavior==="allow"?{behavior:"allow",updatedInput:sQ.updatedInput,updatedPermissions:sQ.updatedPermissions}:{behavior:"deny",message:sQ.message??"Denied via remote control"};return Y?.(FA,oE),oE}finally{if(LI)clearTimeout(LI);gA.delete(a)}}let UB=!1;async function fB(){if(v!==null||UB||QA.signal.aborted)return;if(UB=!0,O=!1,K.length>0)m=!1;async function*FA(){while(!O){while(K.length>0)if(m=!1,yield K.shift(),O)return;await new Promise((a)=>{R=a})}}$(`spawning query resume=${M??"<fresh>"}`);let rA={assistant:!0,cwd:Q.dir,resume:M,stderr:(a)=>$(`[child] ${a.trimEnd()}`),canUseTool:GB},NQ;try{if(NQ=await E(rA),B)NQ={...NQ,env:{...NQ.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(a){if($(`buildQueryOptions threw: ${a}`),UB=!1,o++,o>=$q)$(`${o} consecutive buildQueryOptions failures — dropping ${K.length} queued input(s)`),K.length=0;else if(K.length>0&&!QA.signal.aborted)fB();return}if(QA.signal.aborted){UB=!1;return}try{v=Qm({prompt:FA(),options:NQ})}finally{UB=!1}(async()=>{try{$("output pump started");for await(let a of v){if(a.type==="system"&&a.subtype==="init"){if(a.session_id!==M)M=a.session_id,UA()}if(a.type==="result")m=!0,o=0,n=!0,UA();if(!TmA(a))continue;let HE=J?J(a):a;if(HE===null)continue;X.write(HE)}}catch(a){$(`query threw: ${a}`),o++}finally{$("output pump ended"),v=null;for(let a of gA.keys())X.sendControlCancelRequest(a);if(gA.clear(),K.length>0&&!QA.signal.aborted)if(o>=$q)$(`${o} consecutive crashes — dropping ${K.length} queued input(s)`),K.length=0;else fB()}})()}let tQ=setInterval(()=>{let FA=Date.now(),rA=r!==null&&r-FA<e;if(v===null){let NQ=r!==null&&r-FA<jA;if((NQ||yA&&!n)&&o<$q&&!QA.signal.aborted)$(NQ?`cron due in ${r-FA}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),fB();return}if(O)return;if(!m||K.length>0)return;if(FA-S<F)return;if(rA)return;if(yA&&!n)return;$("idle conditions met → closing input gen"),UA(),O=!0,R?.(),R=null},SmA);if(tQ.unref?.(),U)$("initialPrompt → injecting"),S=Date.now(),bQ(U),fB();let oJ=(async()=>{if(await Promise.all([(async()=>{for await(let FA of X.inboundPrompts()){if(QA.signal.aborted)return;if($("bridge prompt received"),S=Date.now(),FA.uuid)X.write({type:"user",uuid:FA.uuid,session_id:"",message:{role:"user",content:FA.content},parent_tool_use_id:null});bQ(FA.content),fB()}})(),(async()=>{for await(let FA of X.controlRequests()){if(QA.signal.aborted)return;switch(FA.request.subtype){case"interrupt":$("bridge interrupt"),v?.interrupt();break;case"set_model":$(`bridge setModel=${FA.request.model??"<default>"}`),v?.setModel(FA.request.model);break;case"set_max_thinking_tokens":$(`bridge setMaxThinkingTokens=${FA.request.max_thinking_tokens}`),v?.setMaxThinkingTokens(FA.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let FA of X.permissionResponses()){if(QA.signal.aborted)return;let rA=bmA(FA,gA,X.sendControlCancelRequest);if(rA)$(`permission response for unknown req=${rA} (stale)`)}})()]),clearInterval(tQ),pA)clearInterval(pA);v?.close(),await P(),$("─── worker stop ───")})();return{ok:!0,handle:{get sessionUrl(){return X.sessionUrl},get bridgeSessionId(){return X.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(FA){S=Date.now(),bQ(FA),fB()},async interrupt(){await v?.interrupt()},done:oJ,teardown:P,[Symbol.asyncDispose]:P}}}export{kmA as runAssistantWorker};
193
+ `)}else z(`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<ehA){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;if(this.refreshHeaders){let E=this.refreshHeaders();Object.assign(this.headers,E),z("SSETransport: Refreshed headers for reconnect")}this.state="reconnecting",this.reconnectAttempts++;let B=Math.min(thA*Math.pow(2,this.reconnectAttempts-1),shA),I=Math.max(0,B+B*0.25*(2*Math.random()-1));z(`SSETransport: Reconnecting in ${Math.round(I)}ms (attempt ${this.reconnectAttempts}, ${Math.round(Q/1000)}s elapsed)`),p("error","cli_sse_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},I)}else z(`SSETransport: Reconnection time budget exhausted after ${Math.round(Q/1000)}s`,{level:"error"}),p("error","cli_sse_reconnect_exhausted",{reconnectAttempts:this.reconnectAttempts,elapsedMs:Q}),this.state="closed",this.onCloseCallback?.()}onLivenessTimeout=()=>{this.livenessTimer=null,z("SSETransport: Liveness timeout, reconnecting",{level:"error"}),p("error","cli_sse_liveness_timeout"),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,AmA)}clearLivenessTimer(){if(this.livenessTimer)clearTimeout(this.livenessTimer),this.livenessTimer=null}async write(A){let Q=this.getAuthHeaders();if(Object.keys(Q).length===0){z("SSETransport: No session token available for POST"),p("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":uF()};z(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=ND;I++){try{let C=await BB.post(this.postUrl,A,{headers:B,validateStatus:CmA});if(C.status===200||C.status===201){z(`SSETransport: POST success type=${A.type}`);return}if(z(`SSETransport: POST ${C.status} body=${zA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){z(`SSETransport: POST returned ${C.status} (client error), not retrying`),p("warn","cli_sse_post_client_error",{status:C.status});return}z(`SSETransport: POST returned ${C.status}, attempt ${I}/${ND}`),p("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){z(`SSETransport: POST error: ${YA(C)}, attempt ${I}/${ND}`),p("warn","cli_sse_post_network_error",{attempt:I})}if(I===ND){z(`SSETransport: POST failed after ${ND} attempts, continuing`),p("warn","cli_sse_post_retries_exhausted");return}let E=Math.min(BmA*Math.pow(2,I-1),ImA);await RB(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}[Symbol.dispose](){this.close()}}function JmA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}RQ();fQ();WQ();function SEA(A){let Q=Buffer.from(A,"base64url").toString("utf-8"),B=mQ(Q);if(!B||typeof B!=="object"||!("version"in B)||B.version!==1)throw Error(`Unsupported work secret version: ${B&&typeof B==="object"&&"version"in B?B.version:"unknown"}`);let I=B;if(typeof I.session_ingress_token!=="string"||I.session_ingress_token.length===0)throw Error("Invalid work secret: missing or empty session_ingress_token");if(typeof I.api_base_url!=="string")throw Error("Invalid work secret: missing api_base_url");return B}function vEA(A,Q){let B=A.includes("localhost")||A.includes("127.0.0.1"),I=B?"ws":"wss",E=B?"v2":"v1",C=A.replace(/^https?:\/\//,"").replace(/\/+$/,"");return`${I}://${C}/${E}/session_ingress/ws/${Q}`}function Jq(A,Q){if(A===Q)return!0;let B=A.slice(A.lastIndexOf("_")+1),I=Q.slice(Q.lastIndexOf("_")+1);return B.length>=4&&B===I}function _EA(A,Q){return`${A.replace(/\/+$/,"")}/v1/code/sessions/${Q}`}async function PEA(A,Q){let B=await BB.post(`${A}/worker/register`,{},{headers:{Authorization:`Bearer ${Q}`,"Content-Type":"application/json","anthropic-version":"2023-06-01"},timeout:1e4}),I=B.data?.worker_epoch,E=typeof I==="string"?Number(I):I;if(typeof E!=="number"||!Number.isFinite(E)||!Number.isSafeInteger(E))throw Error(`registerWorker: invalid worker_epoch in response: ${zA(B.data)}`);return E}function TEA(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 bEA(A){let{sessionUrl:Q,ingressToken:B,sessionId:I,initialSequenceNum:E,getAuthToken:C}=A,Y;if(C)Y=()=>{let V=C();if(!V)return{};return{Authorization:`Bearer ${V}`}};else tN(B);let J=A.epoch??await PEA(Q,B);z(`[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 Yq(G,{},I,void 0,E,Y),F,N=new Cq(U,new URL(Q),{getAuthHeaders:Y,heartbeatIntervalMs:A.heartbeatIntervalMs,heartbeatJitterFraction:A.heartbeatJitterFraction,onEpochMismatch:()=>{z("[bridge:repl] CCR v2: epoch superseded (409) — closing for poll-loop recovery");try{N.close(),U.close(),F?.(4090)}catch(V){z(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${YA(V)}`,{level:"error"})}throw Error("epoch superseded")}});U.setOnEvent((V)=>{N.reportDelivery(V.event_id,"received"),N.reportDelivery(V.event_id,"processed")});let $,W=!1,D=!1;return{write(V){return N.writeEvent(V)},async writeBatch(V){for(let X of V){if(D)break;await N.writeEvent(X)}},close(){D=!0,N.close(),U.close()},isConnectedStatus(){return W},getStateLabel(){if(U.isClosedStatus())return"closed";if(U.isConnectedStatus())return W?"connected":"init";return"connecting"},setOnData(V){U.setOnData(V)},setOnClose(V){F=V,U.setOnClose((X)=>{N.close(),V(X??4092)})},setOnConnect(V){$=V},getLastSequenceNum(){return U.getLastSequenceNum()},droppedBatchCount:0,reportState(V,X){N.reportState(V,X)},reportMetadata(V){N.reportMetadata(V)},reportDelivery(V,X){N.reportDelivery(V,X)},flush(){return N.flush()},getInternalEventWriter(){return(V,X,M)=>N.writeInternalEvent(V,X,M)},getInternalEventReaders(){return{readMain:()=>N.readInternalEvents(),readSubagents:()=>N.readSubagentInternalEvents()}},connect(){if(!A.outboundOnly)U.connect();N.initialize(J).then(()=>{W=!0,z(`[bridge:repl] v2 transport ready for writes (epoch=${J}, sse=${U.isConnectedStatus()?"open":"opening"})`),$?.()},(V)=>{z(`[bridge:repl] CCR v2 initialize failed: ${YA(V)}`,{level:"error"}),N.close(),U.close(),F?.(4091)})}}}RQ();fQ();var UmA="2023-06-01",FmA="ccr-byoc-2025-07-29";async function yEA({environmentId:A,title:Q,tags:B,signal:I},E){let{baseUrl:C,getAccessToken:Y,orgUUID:J,model:G}=E,U=Y();if(!U)return z("[bridge] No access token for session creation"),null;let F=`${C}/v1/sessions`,N;try{N=await BB.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:G2(U,J),signal:I,validateStatus:(W)=>W<500})}catch(W){return z(`[bridge] Session creation request failed: ${YA(W)}`),null}if(N.status!==200&&N.status!==201){let W=nJ(N.data);return z(`[bridge] Session creation failed with status ${N.status}${W?`: ${W}`:""}`),null}let $=N.data;if(!$||typeof $!=="object"||!("id"in $)||typeof $.id!=="string")return z("[bridge] No session ID in response"),null;return $.id}async function fEA(A,Q){let{baseUrl:B,getAccessToken:I,orgUUID:E}=Q,C=I();if(!C){z("[bridge] No access token for session archive");return}let Y=`${B}/v1/sessions/${A}/archive`;z(`[bridge] Archiving session ${A}`);try{let J=await BB.post(Y,{},{headers:G2(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)z(`[bridge] Session ${A} archived successfully`);else{let G=nJ(J.data);z(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){z(`[bridge] Session archive request failed: ${YA(J)}`)}}async function Y2(A,Q,B,I,E,C){let Y=C();if(!Y)return z(`[bridge] No access token for ${A}-pr`),!1;let J=`${E}/v1/code/github/${A}-pr`,G={session_id:cF(Q),repo:B,pr_number:I},U;try{U=await BB.post(J,G,{headers:G2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-pr request failed: ${YA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=nJ(U.data);return z(`[bridge] ${A}-pr failed ${U.status}${N?`: ${N}`:""}`),!1}return z(`[bridge] ${A}-pr ${B}#${I} ok`),!0}async function J2(A,Q,B,I,E,C){let Y=C();if(!Y)return z(`[bridge] No access token for ${A}-thread`),!1;let J=`${E}/v1/code/slack/${A}-thread`,G={session_id:cF(Q),channel:B,thread_ts:I},U;try{U=await BB.post(J,G,{headers:G2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-thread request failed: ${YA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=nJ(U.data);return z(`[bridge] ${A}-thread failed ${U.status}${N?`: ${N}`:""}`),!1}return z(`[bridge] ${A}-thread ${B}/${I} ok`),!0}function G2(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":UmA,"anthropic-beta":FmA};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}var nEA=2000,lEA=60000,iEA=900000,ZmA=300000,dEA=3;function oEA(A){return A*(0.8+Math.random()*0.4)}var LmA=0;async function aEA(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:$,getCurrentTitle:W=()=>Y,toSDKMessages:D=()=>{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:V,getTrustedDeviceToken:X,getPollIntervalConfig:M=()=>ON,initialHistoryCap:L=200,initialMessages:K,previouslyFlushedUUIDs:R,onInboundMessage:O,onPermissionResponse:v,onInterrupt:S,onSetModel:m,onSetMaxThinkingTokens:o,onSetPermissionMode:wA,onRenameSession:PA,onSetColor:UA,onFileSuggestions:QA,onReadFile:gA,onMcpAuthenticate:IQ,onMcpOauthCallbackUrl:P,onMcpReconnect:SA,onMcpStatus:e,onStateChange:jA,onUserMessage:r,onSessionEstablished:n,onInitError:yA,perpetual:TA,initialSSESequenceNum:uA=0,onTransportPersistenceReady:pA,onTransportPersistenceTeardown:bQ}=A,GB=++LmA,{writeBridgePointer:UB,clearBridgePointer:fB,readBridgePointer:tQ}=await Promise.resolve().then(() => (cEA(),uEA)),oJ=TA?await tQ(Q):null,AI=oJ?.source==="repl"?oJ:null;z(`[bridge:repl] initBridgeCore #${GB} starting (initialMessages=${K?.length??0}${AI?` perpetual prior=env:${AI.environmentId}`:""})`);let rA=zEA({baseUrl:J,getAccessToken:F,runnerVersion:"0.2.126",onDebug:z,onAuth401:V,getTrustedDeviceToken:X}),NQ={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:pEA(),workerType:U,environmentId:pEA(),reuseEnvironmentId:AI?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},a,HE;try{let b=await rA.registerBridgeEnvironment(NQ);a=b.environment_id,HE=b.environment_secret}catch(b){if(wEA("registration_failed",`[bridge:repl] Environment registration failed: ${YA(b)}`),yA?.(`[bridge:repl] Environment registration failed: ${YA(b)}`),AI&&b instanceof KE&&(b.status===410||b.status!==401&&B2(b.errorType)))await fB(Q);return jA?.("failed",YA(b)),null}z(`[bridge:repl] Environment registered: ${a}`),p("info","bridge_repl_env_registered"),YQ("tengu_bridge_repl_env_registered",{});async function RY(b,IA){if(a!==b)return z(`[bridge:repl] Env mismatch (requested ${b}, got ${a}) — cannot reconnect in place`),!1;let QQ=Uq(IA),GQ=QQ===IA?[IA]:[IA,QQ];for(let vA of GQ)try{return await rA.reconnectSession(a,vA),z(`[bridge:repl] Reconnected session ${vA} in place on env ${a}`),!0}catch(EB){z(`[bridge:repl] reconnectSession(${vA}) failed: ${YA(EB)}`)}return z("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let qC=AI?await RY(AI.environmentId,AI.sessionId):!1;if(AI&&!qC)await fB(Q);let $A,LI=new Set,sQ=null,oE=new Set;if(qC&&AI){if($A=AI.sessionId,z(`[bridge:repl] Perpetual session reused: ${$A}`),K&&R)for(let b of K)R.add(b.uuid)}else{let b=await N({environmentId:a,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!b)return z("[bridge:repl] Session creation failed, deregistering environment"),yA?.("[bridge:repl] Session creation failed, deregistering environment"),YQ("tengu_bridge_repl_session_failed",{}),await rA.deregisterEnvironment(a).catch(()=>{}),jA?.("failed","Session creation failed"),null;$A=b,z(`[bridge:repl] Session created: ${$A}`)}n?.($A),await UB(Q,{sessionId:$A,environmentId:a,source:"repl"}),p("info","bridge_repl_session_created"),YQ("tengu_bridge_repl_started",{has_initial_messages:!!(K&&K.length>0),inProtectedNamespace:kx(),...uIA()});let xC=new Set;if(K)for(let b of K)xC.add(b.uuid);let ZE=new I2(2000);for(let b of xC)ZE.add(b);let aJ=new I2(2000),FB=new AbortController,t=null,oI=0,LB=qC?uA:0,VB=null,aI=null,pF=qEA(FB.signal),jY=pF.wake,lF=pF.signal,kQ=new Iq,nB=!r,QI=3,RI=0,rI=null;async function Dq(){if(rI)return rI;rI=sEA();try{return await rI}finally{rI=null}}async function sEA(){if(RI++,oI++,z(`[bridge:repl] Reconnecting after env lost (attempt ${RI}/${QI})`),RI>QI)return z(`[bridge:repl] Environment reconnect limit reached (${QI}), giving up`),!1;if(t){let vA=t.getLastSequenceNum();if(vA>LB)LB=vA;bQ?.(),t.close(),t=null}if(jY(),kQ.drop(),VB){let vA=VB;if(await rA.stopWork(a,vA,!1).catch(()=>{}),VB!==vA)return z("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),RI=0,!0;VB=null,aI=null}if(FB.signal.aborted)return z("[bridge:repl] Reconnect aborted by teardown"),!1;let b=a;NQ.reuseEnvironmentId=b;let IA;for(let vA=1;;vA++)try{IA=await rA.registerBridgeEnvironment(NQ);break}catch(EB){if(EB instanceof KE||vA>=dEA||FB.signal.aborted)return NQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Environment re-registration failed (attempt ${vA}): ${YA(EB)}`),!1;let DD=oEA(nEA*2**(vA-1));if(z(`[bridge:repl] Environment re-registration transient failure (attempt ${vA}/${dEA}), retrying in ${Math.round(DD)}ms: ${YA(EB)}`),await RB(DD,FB.signal),FB.signal.aborted)return NQ.reuseEnvironmentId=void 0,!1}if(a=IA.environment_id,HE=IA.environment_secret,NQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Re-registered: requested=${b} got=${a}`),FB.signal.aborted)return z("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await rA.deregisterEnvironment(a).catch(()=>{}),!1;if(t!==null)return z("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),RI=0,!0;if(await RY(b,$A))return YQ("tengu_bridge_repl_reconnected_in_place",{}),RI=0,!0;if(a!==b)YQ("tengu_bridge_repl_env_expired_fresh_session",{});if(await $($A),FB.signal.aborted)return z("[bridge:repl] Reconnect aborted after archive, cleaning up"),await rA.deregisterEnvironment(a).catch(()=>{}),!1;let QQ=W(),GQ=await N({environmentId:a,title:QQ,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!GQ)return z("[bridge:repl] Session creation failed during reconnection"),!1;if(FB.signal.aborted)return z("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await $(GQ),!1;if($A=GQ,iIA(cF(GQ)).catch(()=>{}),n?.($A),LB=0,aJ.clear(),nB=!r,z(`[bridge:repl] Re-created session: ${$A}`),await UB(Q,{sessionId:$A,environmentId:a,source:"repl"}),R?.clear(),LI.size>0){z(`[bridge:repl] Replaying ${LI.size} PR subscription(s) against new session`);for(let vA of LI){let EB=vA.lastIndexOf("#");Y2("subscribe",$A,vA.slice(0,EB),Number(vA.slice(EB+1)),J,F)}}if(oE.size>0){z(`[bridge:repl] Replaying ${oE.size} Slack thread subscription(s) against new session`);for(let vA of oE){let EB=vA.indexOf("/");J2("subscribe",$A,vA.slice(0,EB),vA.slice(EB+1),J,F)}}return RI=0,!0}function F2(){return F()}function Wq(){let b=kQ.end();if(b.length===0)return;if(!t){z(`[bridge:repl] Cannot drain ${b.length} pending message(s): no transport`);return}for(let GQ of b)ZE.add(GQ.uuid);let QQ=D(b).map((GQ)=>({...GQ,session_id:$A}));z(`[bridge:repl] Drained ${b.length} pending message(s) after flush`),t.writeBatch(QQ)}let N2=null;function $2(){N2?.()}function Xq(b){if(z(`[bridge:repl] Transport permanently closed: code=${b}`),YQ("tengu_bridge_repl_ws_closed",{code:b}),t){let QQ=t.getLastSequenceNum();if(QQ>LB)LB=QQ;bQ?.(),t=null}jY();let IA=kQ.drop();if(IA>0)z(`[bridge:repl] Dropping ${IA} pending message(s) on transport close (code=${b})`,{level:"warn"});if(b===1000){jA?.("failed","session ended"),FB.abort(),$2();return}jA?.("reconnecting",`Remote Control connection lost (code ${b})`),z(`[bridge:repl] Transport reconnect budget exhausted (code=${b}), attempting env reconnect`),Dq().then((QQ)=>{if(QQ)return;if(FB.signal.aborted)return;z("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),YQ("tengu_bridge_repl_reconnect_failed",{close_code:b}),jA?.("failed","reconnection failed"),$2()})}let Vq,eEA=null,ACA={api:rA,getCredentials:()=>({environmentId:a,environmentSecret:HE}),signal:FB.signal,getPollIntervalConfig:M,onStateChange:jA,getWsState:()=>t?.getStateLabel()??"null",isAtCapacity:()=>t!==null,capacitySignal:lF,onFatalError:$2,getHeartbeatInfo:()=>{if(!VB||!aI)return null;return{environmentId:a,workId:VB,sessionToken:aI}},onHeartbeatFatal:(b)=>{if(z(`[bridge:repl] heartbeatWork fatal (status=${b.status}) — tearing down work item for fast re-dispatch`),t){let IA=t.getLastSequenceNum();if(IA>LB)LB=IA;bQ?.(),t.close(),t=null}if(kQ.drop(),VB)rA.stopWork(a,VB,!1).catch((IA)=>{z(`[bridge:repl] stopWork after heartbeat fatal: ${YA(IA)}`)});VB=null,aI=null,jY(),jA?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await Dq())return null;return{environmentId:a,environmentSecret:HE}},onWorkReceived:(b,IA,QQ,GQ)=>{if(t?.isConnectedStatus())z(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${QQ})`);if(z(`[bridge:repl] Work received: workId=${QQ} workSessionId=${b} currentSessionId=${$A} match=${Jq(b,$A)}`),UB(Q,{sessionId:$A,environmentId:a,source:"repl"}),!Jq(b,$A)){z(`[bridge:repl] Rejecting foreign session: expected=${$A} got=${b}`);return}VB=QQ,aI=IA;let vA=GQ||BQ(process.env.CLAUDE_BRIDGE_USE_CCR_V2),EB;if(!vA){if(EB=F2(),!EB){z("[bridge:repl] No OAuth token available for session ingress, skipping work");return}tN(EB)}if(YQ("tengu_bridge_repl_work_received",{}),t){bQ?.();let pQ=t;t=null;let eQ=pQ.getLastSequenceNum();if(eQ>LB)LB=eQ;pQ.close()}kQ.deactivate();let DD=(pQ)=>jEA(pQ,{transport:t,sessionId:$A,onInterrupt:S,onSetModel:m,onSetMaxThinkingTokens:o,onSetPermissionMode:wA,onRenameSession:PA,onSetColor:UA,onFileSuggestions:QA,onReadFile:gA,onMcpAuthenticate:IQ,onMcpOauthCallbackUrl:P,onMcpReconnect:SA,onMcpStatus:e}),V2=!1,wq=(pQ)=>{if(t=pQ,pQ.setOnConnect(()=>{if(t!==pQ)return;if(z("[bridge:repl] Ingress transport connected"),YQ("tengu_bridge_repl_ws_connected",{}),!vA){let eQ=F2();if(eQ)tN(eQ)}if(X2=!1,!V2&&K&&K.length>0){V2=!0;let eQ=L,BI=K.filter((WD)=>Qq(WD)&&!R?.has(WD.uuid)),OC=eQ>0&&BI.length>eQ?BI.slice(-eQ):BI;if(OC.length<BI.length)z(`[bridge:repl] Capped initial flush: ${BI.length} -> ${OC.length} (cap=${eQ})`),YQ("tengu_bridge_repl_history_capped",{eligible_count:BI.length,capped_count:OC.length});let Z0=D(OC);if(Z0.length>0){z(`[bridge:repl] Flushing ${Z0.length} initial message(s) via transport`);let WD=Z0.map((rJ)=>({...rJ,session_id:$A})),zq=pQ.droppedBatchCount;pQ.writeBatch(WD).then(()=>{if(pQ.droppedBatchCount>zq){z(`[bridge:repl] Initial flush dropped ${pQ.droppedBatchCount-zq} batch(es) — not marking ${Z0.length} UUID(s) as flushed`);return}if(R){for(let rJ of Z0)if(rJ.uuid)R.add(rJ.uuid)}}).catch((rJ)=>z(`[bridge:repl] Initial flush failed: ${rJ}`)).finally(()=>{if(t!==pQ)return;Wq(),jA?.("connected")})}else Wq(),jA?.("connected")}else if(!kQ.active)jA?.("connected")}),pQ.setOnData((eQ)=>{REA(eQ,ZE,aJ,O,v,DD)}),eEA=Xq,pQ.setOnClose((eQ)=>{if(t!==pQ)return;Xq(eQ)}),!V2&&K&&K.length>0)kQ.start();pQ.connect()};if(oI++,vA){let pQ=_EA(J,b),eQ=oI;z(`[bridge:repl] CCR v2: sessionUrl=${pQ} session=${b} gen=${eQ}`),bEA({sessionUrl:pQ,ingressToken:IA,sessionId:b,initialSequenceNum:LB}).then((BI)=>{if(FB.signal.aborted){BI.close();return}if(eQ!==oI){z(`[bridge:repl] CCR v2: discarding stale handshake gen=${eQ} current=${oI}`),BI.close();return}if(wq(BI),pA){let OC=BI.getInternalEventWriter?.(),Z0=BI.getInternalEventReaders?.();if(OC&&Z0)pA(OC,Z0)}},(BI)=>{if(z(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${YA(BI)}`,{level:"error"}),YQ("tengu_bridge_repl_ccr_v2_init_failed",{}),eQ!==oI)return;if(VB)rA.stopWork(a,VB,!1).catch((OC)=>{z(`[bridge:repl] stopWork after v2 init failure: ${YA(OC)}`)}),VB=null,aI=null;jY()})}else{let pQ=vEA(G,b);z(`[bridge:repl] Ingress URL: ${pQ}`),z(`[bridge:repl] Creating HybridTransport: session=${b}`);let eQ=EB??"";wq(TEA(new dj(new URL(pQ),{Authorization:`Bearer ${eQ}`,"anthropic-version":"2023-06-01"},b,()=>({Authorization:`Bearer ${F2()??eQ}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{jA?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),jY()}})))}}};RmA(ACA);let D2=TA?setInterval(()=>{if(rI)return;UB(Q,{sessionId:$A,environmentId:a,source:"repl"})},3600000):null;D2?.unref?.();let Mq=M().session_keepalive_interval_v2_ms,W2=Mq>0?setInterval(()=>{if(!t)return;z("[bridge:repl] keep_alive sent"),t.write({type:"keep_alive"}).catch((b)=>{z(`[bridge:repl] keep_alive write failed: ${YA(b)}`)})},Mq):null;W2?.unref?.();let X2=!1;N2=async()=>{if(X2){z(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${a} session=${$A}`);return}X2=!0,bQ?.();let b=Date.now();if(z(`[bridge:repl] Teardown starting: env=${a} session=${$A} workId=${VB??"none"} transportState=${t?.getStateLabel()??"null"}`),D2!==null)clearInterval(D2);if(W2!==null)clearInterval(W2);if(Vq)process.off("SIGUSR2",Vq);if(FB.abort(),z("[bridge:repl] Teardown: poll loop aborted"),t){let GQ=t.getLastSequenceNum();if(GQ>LB)LB=GQ}if(TA){t=null,kQ.drop(),await UB(Q,{sessionId:$A,environmentId:a,source:"repl"}),z(`[bridge:repl] Teardown (perpetual): leaving env=${a} session=${$A} alive on server, duration=${Date.now()-b}ms`);return}let IA=t;if(t=null,kQ.drop(),IA)IA.write(Bq($A));let QQ=VB?rA.stopWork(a,VB,!0).then(()=>{z("[bridge:repl] Teardown: stopWork completed")}).catch((GQ)=>{z(`[bridge:repl] Teardown stopWork failed: ${YA(GQ)}`)}):Promise.resolve();await Promise.all([QQ,$($A)]),IA?.close(),z("[bridge:repl] Teardown: transport closed"),await rA.deregisterEnvironment(a).catch((GQ)=>{z(`[bridge:repl] Teardown deregister failed: ${YA(GQ)}`)}),await fB(Q),z(`[bridge:repl] Teardown complete: env=${a} duration=${Date.now()-b}ms`)},z(`[bridge:repl] Ready: env=${a} session=${$A}`),jA?.("ready");let $D={get bridgeSessionId(){return $A},get environmentId(){return a},getLastSequenceNum(){return $D.getSSESequenceNum()},flush(){return t?.flush()??Promise.resolve()},getSSESequenceNum(){let b=t?.getLastSequenceNum()??0;return Math.max(LB,b)},sessionIngressUrl:G,writeMessages(b){let IA=b.filter((vA)=>Qq(vA)&&!xC.has(vA.uuid)&&!ZE.has(vA.uuid));if(IA.length===0)return;if(!nB)for(let vA of IA){let EB=LEA(vA);if(EB!==void 0&&r?.(EB,$A)){nB=!0;break}}if(kQ.enqueue(...IA)){z(`[bridge:repl] Queued ${IA.length} message(s) during initial flush`);return}if(!t){let vA=IA.map((EB)=>EB.type).join(",");z(`[bridge:repl] Transport not configured, dropping ${IA.length} message(s) [${vA}] for session=${$A}`,{level:"warn"});return}for(let vA of IA)ZE.add(vA.uuid);z(`[bridge:repl] Sending ${IA.length} message(s) via transport`);let GQ=D(IA).map((vA)=>({...vA,session_id:$A}));t.writeBatch(GQ)},writeSdkMessages(b){let IA=b.filter((GQ)=>!GQ.uuid||!ZE.has(GQ.uuid));if(IA.length===0)return;if(!t){z(`[bridge:repl] Transport not configured, dropping ${IA.length} SDK message(s) for session=${$A}`,{level:"warn"});return}for(let GQ of IA)if(GQ.uuid)ZE.add(GQ.uuid);let QQ=IA.map((GQ)=>({...GQ,session_id:$A}));t.writeBatch(QQ)},sendControlRequest(b){if(!t){z("[bridge:repl] Transport not configured, skipping control_request");return}let IA={...b,session_id:$A};t.write(IA),z(`[bridge:repl] Sent control_request request_id=${b.request_id}`)},sendControlResponse(b){if(!t){z("[bridge:repl] Transport not configured, skipping control_response");return}let IA={...b,session_id:$A};t.write(IA),z("[bridge:repl] Sent control_response")},sendControlCancelRequest(b){if(!t){z("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let IA={type:"control_cancel_request",request_id:b,session_id:$A};t.write(IA),z(`[bridge:repl] Sent control_cancel_request request_id=${b}`)},reportMetadata(b){t?.reportMetadata(b)},sendResult(){if(!t){z(`[bridge:repl] sendResult: skipping, transport not configured session=${$A}`);return}t.write(Bq($A)),z(`[bridge:repl] Sent result for session=${$A}`)},async subscribePR(b,IA,QQ){let GQ=sQ;if(QQ)sQ={agentId:QQ,repo:b,prNumber:IA};let vA=await Y2("subscribe",$A,b,IA,J,F);if(vA)LI.add(`${b}#${IA}`);else if(QQ)sQ=GQ;return vA},async unsubscribePR(b,IA){let QQ=await Y2("unsubscribe",$A,b,IA,J,F);if(QQ){if(LI.delete(`${b}#${IA}`),sQ?.repo===b&&sQ.prNumber===IA)sQ=null}return QQ},async subscribeSlackThread(b,IA){let QQ=await J2("subscribe",$A,b,IA,J,F);if(QQ)oE.add(`${b}/${IA}`);return QQ},async unsubscribeSlackThread(b,IA){let QQ=await J2("unsubscribe",$A,b,IA,J,F);if(QQ)oE.delete(`${b}/${IA}`);return QQ},getPRWebhookTarget(){return sQ},async teardown(){QCA(),await N2?.(),z("[bridge:repl] Torn down"),YQ("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return $D.teardown()}},QCA=_0($D);return $D}async function RmA({api:A,getCredentials:Q,signal:B,onStateChange:I,onWorkReceived:E,onEnvironmentLost:C,getWsState:Y,isAtCapacity:J,capacitySignal:G,onFatalError:U,getPollIntervalConfig:F=()=>ON,getHeartbeatInfo:N,onHeartbeatFatal:$}){z(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let D=0,V=null,X=null,M=0,L=0,K=!1;while(!B.aborted){let{environmentId:R,environmentSecret:O}=Q(),v=F();try{let S=await A.pollForWork(R,O,B,v.reclaim_older_than_ms);if(L=0,D>0)z(`[bridge:repl] Poll recovered after ${D} consecutive error(s)`),D=0,V=null,X=null,M=0,I?.("ready");if(!S){let o=K;if(K=!1,J?.()&&G&&!o){let wA=v.poll_interval_ms_at_capacity;if(v.non_exclusive_heartbeat_interval_ms>0&&N){YQ("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:v.non_exclusive_heartbeat_interval_ms});let UA=wA>0?Date.now()+wA:null,QA=!1,gA=0;while(!B.aborted&&J()&&(UA===null||Date.now()<UA)){let P=F();if(P.non_exclusive_heartbeat_interval_ms<=0)break;let SA=N();if(!SA)break;let e=G();try{await A.heartbeatWork(SA.environmentId,SA.workId,SA.sessionToken)}catch(jA){if(z(`[bridge:repl:heartbeat] Failed: ${YA(jA)}`),jA instanceof KE){if(e.cleanup(),YQ("tengu_bridge_heartbeat_error",{status:jA.status,error_type:jA.status===401||jA.status===403?"auth_failed":"fatal"}),$)$(jA),z(`[bridge:repl:heartbeat] Fatal (status=${jA.status}), work state cleared — fast-polling for re-dispatch`);else QA=!0;break}}gA++,await RB(P.non_exclusive_heartbeat_interval_ms,e.signal),e.cleanup()}let IQ=QA?"error":B.aborted?"shutdown":!J()?"capacity_changed":UA!==null&&Date.now()>=UA?"poll_due":"config_disabled";if(YQ("tengu_bridge_heartbeat_mode_exited",{reason:IQ,heartbeat_cycles:gA}),!QA){if(IQ==="poll_due")z(`[bridge:repl] Heartbeat poll_due after ${gA} cycles — falling through to pollForWork`);continue}}let PA=wA>0?wA:v.non_exclusive_heartbeat_interval_ms;if(PA>0){let UA=G(),QA=Date.now();await RB(PA,UA.signal),UA.cleanup();let gA=Date.now()-QA-PA;if(gA>60000)z(`[bridge:repl] At-capacity sleep overran by ${Math.round(gA/1000)}s — process suspension detected, forcing one fast-poll cycle`),YQ("tengu_bridge_repl_suspension_detected",{overrun_ms:gA}),K=!0}}else await RB(v.poll_interval_ms_not_at_capacity,B);continue}let m;try{m=SEA(S.secret)}catch(o){z(`[bridge:repl] Failed to decode work secret: ${YA(o)}`),YQ("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(R,S.id,!1).catch(()=>{});continue}z(`[bridge:repl] Acknowledging workId=${S.id}`);try{await A.acknowledgeWork(R,S.id,m.session_ingress_token)}catch(o){z(`[bridge:repl] Acknowledge failed workId=${S.id}: ${YA(o)}`)}if(S.data.type==="healthcheck"){z("[bridge:repl] Healthcheck received");continue}if(S.data.type==="session"){let o=S.data.id;try{ZI(o,"session_id")}catch{z(`[bridge:repl] Invalid session_id in work: ${o}`);continue}E(o,m.session_ingress_token,S.id,m.use_code_sessions===!0),z("[bridge:repl] Work accepted, continuing poll loop")}}catch(S){if(B.aborted)break;if(S instanceof KE&&S.status===404&&C){let P=Q().environmentId;if(R!==P){z(`[bridge:repl] Stale poll error for old env=${R}, current env=${P} — skipping onEnvironmentLost`),D=0,V=null;continue}if(L++,z(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${L}/3)`),YQ("tengu_bridge_repl_env_lost",{attempt:L}),L>3){z("[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 SA=await C();if(B.aborted)break;if(SA){D=0,V=null,I?.("ready"),z(`[bridge:repl] Re-registered environment: ${SA.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(S instanceof KE){let P=B2(S.errorType),SA=KEA(S);if(z(`[bridge:repl] Fatal poll error: ${S.message} (status=${S.status}, type=${S.errorType??"unknown"})${SA?" (suppressed)":""}`),YQ("tengu_bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),p(P?"info":"error","bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),!SA)I?.("failed",P?"session expired · /remote-control to reconnect":S.message);U?.();break}let m=Date.now();if(X!==null&&m-X>Math.max(lEA,M)*2)z(`[bridge:repl] Detected system sleep (${Math.round((m-X)/1000)}s gap), resetting poll error budget`),p("info","bridge_repl_poll_sleep_detected",{gapMs:m-X}),D=0,V=null;if(X=m,D++,V===null)V=m;let o=m-V,wA=VEA(S),PA=XEA(S),UA=Y?.()??"unknown";if(z(`[bridge:repl] Poll error (attempt ${D}, elapsed ${Math.round(o/1000)}s, ws=${UA}): ${PA}`),YQ("tengu_bridge_repl_poll_error",{status:wA,consecutiveErrors:D,elapsedMs:o}),D===1)I?.("reconnecting",PA);if(o>=iEA){z(`[bridge:repl] Poll failures exceeded ${iEA/1000}s (${D} errors), giving up`),p("info","bridge_repl_poll_give_up"),YQ("tengu_bridge_repl_poll_give_up",{consecutiveErrors:D,elapsedMs:o,lastStatus:wA}),I?.("failed","connection to server lost");break}let QA=MEA(S),gA=Math.min(nEA*2**(D-1),lEA),IQ=oEA(QA!==void 0?Math.max(gA,Math.min(QA,ZmA)):gA);if(M=IQ,F().non_exclusive_heartbeat_interval_ms>0){let P=N?.();if(P)try{await A.heartbeatWork(P.environmentId,P.workId,P.sessionToken)}catch{}}await RB(IQ,B)}}z(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function jmA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function qmA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function xmA(A,Q){if(qmA(A,Q))return"http://localhost:4000";if(jmA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function rEA(A,Q){let{toCompatSessionId:B}=JCA(kEA),I=B(A);return`${xmA(I,Q)}/code/${I}`}RQ();async function tEA(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:$=!1,initialSSESequenceNum:W,onConflict:D}=A,V=A.onAuth401;if(!J())return z("[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 X=U,M={baseUrl:U,getAccessToken:J,orgUUID:F,model:N},L=[],K=null,R=[],O=null,v=[],S=null,m=!1,o=null,wA={detail:null},PA=OmA(),UA=()=>aEA({dir:Q,registrationDir:B,machineName:PA,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:X,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:V,onInitError:console.error,createSession:({environmentId:e,title:jA,signal:r})=>yEA({environmentId:e,title:jA,tags:["claude-code-assistant"],signal:r},M),archiveSession:(e)=>fEA(e,M),perpetual:$,initialSSESequenceNum:W,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...ON,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(e){let jA=hc(e);if(!jA)return;L.push({content:jA.content,uuid:jA.uuid}),K?.(),K=null},onInterrupt(){R.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),O?.(),O=null},onSetModel(e){R.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:e}}),O?.(),O=null},onSetMaxThinkingTokens(e){R.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:e}}),O?.(),O=null},onPermissionResponse(e){v.push(e),S?.(),S=null},onStateChange(e,jA){if(o?.(e,jA),e==="failed")wA.detail=jA??"unknown failure",m=!0,K?.(),O?.(),S?.()}}),QA=await UA();if(!QA&&D&&wA.detail?.includes("409")){if(await D({machineName:PA,message:wA.detail})==="takeover")m=!1,wA.detail=null,QA=await UA()}if(!QA){let e=wA.detail??"initBridgeCore returned null (env registration or session creation failed)";return z(`[bridge:daemon] connectRemoteControl failed: ${e}`),{ok:!1,error:{kind:wA.detail?.includes("409")?"conflict":wA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:e}}}async function*gA(){while(!m){while(L.length>0)if(yield L.shift(),m)return;await new Promise((e)=>{K=e})}}async function*IQ(){while(!m){while(R.length>0)if(yield R.shift(),m)return;await new Promise((e)=>{O=e})}}async function*P(){while(!m){while(v.length>0)if(yield v.shift(),m)return;await new Promise((e)=>{S=e})}}return{ok:!0,handle:{get sessionUrl(){return rEA(QA.bridgeSessionId,X)},get environmentId(){return QA.environmentId},get bridgeSessionId(){return QA.bridgeSessionId},getSSESequenceNum(){return QA.getSSESequenceNum()},hasPendingPrompts(){return L.length>0},write(e){QA.writeSdkMessages([e])},sendResult(){QA.sendResult()},sendControlRequest(e){QA.sendControlRequest(e)},sendControlResponse(e){QA.sendControlResponse(e)},sendControlCancelRequest(e){QA.sendControlCancelRequest(e)},inboundPrompts:gA,controlRequests:IQ,permissionResponses:P,onStateChange(e){o=e},async teardown(){m=!0,K?.(),O?.(),S?.(),await QA.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var SmA=1000,vmA=1e4,_mA=5000,PmA=60000,$q=3;function TmA(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 bmA(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"&&Rq(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}async function kmA(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:$=()=>{}}=A;$("─── worker start ───");let W=await G?.load(),D={...Q,initialSSESequenceNum:Q.initialSSESequenceNum??W?.lastSSESequenceNum};if(!D.getAccessToken())return{ok:!1,error:{kind:"auth",detail:"getAccessToken returned empty"}};let V=await tEA(D);if(!V.ok)return $(`bridge connection failed: ${V.error.kind} — ${V.error.detail}`),{ok:!1,error:V.error};let X=V.handle;$(`bridge connected url=${X.sessionUrl} env=${X.environmentId}`);let M=W?.claudeSessionId,L=X.bridgeSessionId,K=[],R=null,O=!1,v=null,S=0,m=!0,o=0,wA=Promise.resolve();function PA(){if(!G)return;let FA={claudeSessionId:M,lastSSESequenceNum:X.getSSESequenceNum(),bridgeSessionId:X.bridgeSessionId};wA=wA.then(()=>G.save(FA).catch((rA)=>{$(`stateAdapter.save threw: ${rA}`)}))}function UA(){if(K.length>0||X.hasPendingPrompts()){$("persist skipped: prompt queued");return}PA()}PA();let QA=new AbortController,gA=new Map,IQ=null;function P(){return IQ??=(async()=>{UA();for(let FA of gA.keys())X.sendControlCancelRequest(FA);gA.clear(),await X.teardown(),await wA})()}if(N.addEventListener("abort",()=>{QA.abort(),P().catch((FA)=>$(`teardown threw: ${FA}`))}),N.aborted)return await P(),{ok:!1,error:{kind:"unknown",detail:"aborted before start"}};let SA="connected";X.onStateChange((FA,rA)=>{if($(`bridge state=${FA} detail=${rA??""}`),SA=FA,FA==="ready"&&X.bridgeSessionId!==L)L=X.bridgeSessionId,PA();else if(FA==="connected")UA();if(FA==="failed")$(`bridge failed: ${rA??"unknown"}`),QA.abort(),P().catch((NQ)=>$(`teardown threw: ${NQ}`))});let e=I?.horizonMs??600000,jA=I?.leadMs??_mA,r=null,n=!1,yA=!1,TA="";async function uA(){if(!I)return;let FA=await kc(I.dir).catch((NQ)=>{return $(`computeCronHorizon threw: ${NQ}`),{nextFire:null,hasOverdue:!1}});r=FA.nextFire,yA=FA.hasOverdue;let rA=FA.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(FA.nextFire).toISOString()} hasOverdue=${FA.hasOverdue}`;if(rA!==TA)TA=rA,$(rA)}let pA;if(I)await uA(),pA=setInterval(uA,vmA),pA.unref?.();function bQ(FA){K.push({type:"user",message:{role:"user",content:FA},parent_tool_use_id:null,session_id:""}),R?.(),R=null}async function GB(FA,rA,NQ){if(C){let sQ=await C(FA,rA,NQ);if(sQ)return Y?.(FA,sQ),sQ}if(SA!=="connected"){$(`permission denied — bridge state=${SA}, request would drop`);let sQ={behavior:"deny",message:`Cannot request permission: remote control is ${SA}. Try again in a moment.`};return Y?.(FA,sQ),sQ}let a=gmA();$(`permission request tool=${FA} req=${a}`);let{signal:HE,suggestions:RY,blockedPath:qC,toolUseID:$A}=NQ;X.sendControlRequest({type:"control_request",request_id:a,request:{subtype:"can_use_tool",tool_name:FA,display_name:jq(FA),input:rA,tool_use_id:$A,...RY&&{permission_suggestions:RY},...qC&&{blocked_path:qC},..."decisionReason"in NQ&&NQ.decisionReason&&{decision_reason:NQ.decisionReason},..."agentID"in NQ&&NQ.agentID&&{agent_id:NQ.agentID}}});let LI;try{let sQ=await new Promise((xC,ZE)=>{gA.set(a,xC),LI=setTimeout((aJ,FB,t,oI,LB)=>{if(aJ.delete(FB))t(`permission timeout req=${FB}`),oI.sendControlCancelRequest(FB),LB({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},PmA,gA,a,$,X,xC),LI.unref?.(),HE.addEventListener("abort",()=>{if(gA.delete(a))X.sendControlCancelRequest(a);ZE(Error("aborted"))},{once:!0})});$(`permission response req=${a} behavior=${sQ.behavior}`);let oE=sQ.behavior==="allow"?{behavior:"allow",updatedInput:sQ.updatedInput,updatedPermissions:sQ.updatedPermissions}:{behavior:"deny",message:sQ.message??"Denied via remote control"};return Y?.(FA,oE),oE}finally{if(LI)clearTimeout(LI);gA.delete(a)}}let UB=!1;async function fB(){if(v!==null||UB||QA.signal.aborted)return;if(UB=!0,O=!1,K.length>0)m=!1;async function*FA(){while(!O){while(K.length>0)if(m=!1,yield K.shift(),O)return;await new Promise((a)=>{R=a})}}$(`spawning query resume=${M??"<fresh>"}`);let rA={assistant:!0,cwd:Q.dir,resume:M,stderr:(a)=>$(`[child] ${a.trimEnd()}`),canUseTool:GB},NQ;try{if(NQ=await E(rA),B)NQ={...NQ,env:{...NQ.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(a){if($(`buildQueryOptions threw: ${a}`),UB=!1,o++,o>=$q)$(`${o} consecutive buildQueryOptions failures — dropping ${K.length} queued input(s)`),K.length=0;else if(K.length>0&&!QA.signal.aborted)fB();return}if(QA.signal.aborted){UB=!1;return}try{v=Qm({prompt:FA(),options:NQ})}finally{UB=!1}(async()=>{try{$("output pump started");for await(let a of v){if(a.type==="system"&&a.subtype==="init"){if(a.session_id!==M)M=a.session_id,UA()}if(a.type==="result")m=!0,o=0,n=!0,UA();if(!TmA(a))continue;let HE=J?J(a):a;if(HE===null)continue;X.write(HE)}}catch(a){$(`query threw: ${a}`),o++}finally{$("output pump ended"),v=null;for(let a of gA.keys())X.sendControlCancelRequest(a);if(gA.clear(),K.length>0&&!QA.signal.aborted)if(o>=$q)$(`${o} consecutive crashes — dropping ${K.length} queued input(s)`),K.length=0;else fB()}})()}let tQ=setInterval(()=>{let FA=Date.now(),rA=r!==null&&r-FA<e;if(v===null){let NQ=r!==null&&r-FA<jA;if((NQ||yA&&!n)&&o<$q&&!QA.signal.aborted)$(NQ?`cron due in ${r-FA}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),fB();return}if(O)return;if(!m||K.length>0)return;if(FA-S<F)return;if(rA)return;if(yA&&!n)return;$("idle conditions met → closing input gen"),UA(),O=!0,R?.(),R=null},SmA);if(tQ.unref?.(),U)$("initialPrompt → injecting"),S=Date.now(),bQ(U),fB();let oJ=(async()=>{if(await Promise.all([(async()=>{for await(let FA of X.inboundPrompts()){if(QA.signal.aborted)return;if($("bridge prompt received"),S=Date.now(),FA.uuid)X.write({type:"user",uuid:FA.uuid,session_id:"",message:{role:"user",content:FA.content},parent_tool_use_id:null});bQ(FA.content),fB()}})(),(async()=>{for await(let FA of X.controlRequests()){if(QA.signal.aborted)return;switch(FA.request.subtype){case"interrupt":$("bridge interrupt"),v?.interrupt();break;case"set_model":$(`bridge setModel=${FA.request.model??"<default>"}`),v?.setModel(FA.request.model);break;case"set_max_thinking_tokens":$(`bridge setMaxThinkingTokens=${FA.request.max_thinking_tokens}`),v?.setMaxThinkingTokens(FA.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let FA of X.permissionResponses()){if(QA.signal.aborted)return;let rA=bmA(FA,gA,X.sendControlCancelRequest);if(rA)$(`permission response for unknown req=${rA} (stale)`)}})()]),clearInterval(tQ),pA)clearInterval(pA);v?.close(),await P(),$("─── worker stop ───")})();return{ok:!0,handle:{get sessionUrl(){return X.sessionUrl},get bridgeSessionId(){return X.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(FA){S=Date.now(),bQ(FA),fB()},async interrupt(){await v?.interrupt()},done:oJ,teardown:P,[Symbol.asyncDispose]:P}}}export{kmA as runAssistantWorker};