@anthropic-ai/claude-agent-sdk 0.2.113 → 0.2.114
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 +3 -3
- package/bridge.mjs +2 -2
- package/browser-sdk.js +1 -1
- package/manifest.json +10 -10
- package/manifest.zst.json +22 -22
- package/package.json +10 -10
- package/sdk.mjs +2 -2
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.
|
|
3
|
+
// Version: 0.2.114
|
|
4
4
|
import{createRequire as vEA}from"node:module";var LEA=Object.create;var{getPrototypeOf:REA,defineProperty:uF,getOwnPropertyNames:Qq,getOwnPropertyDescriptor:jEA}=Object,Bq=Object.prototype.hasOwnProperty;function Iq(A){return this[A]}var qEA,xEA,ZI=(A,Q,B)=>{var I=A!=null&&typeof A==="object";if(I){var E=Q?qEA??=new WeakMap:xEA??=new WeakMap,C=E.get(A);if(C)return C}B=A!=null?LEA(REA(A)):{};let Y=Q||!A||!A.__esModule?uF(B,"default",{value:A,enumerable:!0}):B;for(let J of Qq(A))if(!Bq.call(Y,J))uF(Y,J,{get:Iq.bind(A,J),enumerable:!0});if(I)E.set(A,Y);return Y},OEA=(A)=>{var Q=(Aq??=new WeakMap).get(A),B;if(Q)return Q;if(Q=uF({},"__esModule",{value:!0}),A&&typeof A==="object"||typeof A==="function"){for(var I of Qq(A))if(!Bq.call(Q,I))uF(Q,I,{get:Iq.bind(A,I),enumerable:!(B=jEA(A,I))||B.enumerable})}return Aq.set(A,Q),Q},Aq,w=(A,Q)=>()=>(Q||A((Q={exports:{}}).exports,Q),Q.exports);var gEA=(A)=>A;function SEA(A,Q){this[A]=gEA.bind(null,Q)}var nI=(A,Q)=>{for(var B in Q)uF(A,B,{get:Q[B],enumerable:!0,configurable:!0,set:SEA.bind(Q,B)})};var Z=(A,Q)=>()=>(A&&(Q=A(A=0)),Q);var q=vEA(import.meta.url),_EA=Symbol.dispose||Symbol.for("Symbol.dispose"),PEA=Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose"),KQ=(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[PEA];if(I===void 0)I=Q[_EA];if(typeof I!=="function")throw TypeError("Object not disposable");A.push([B,I,Q])}else if(B)A.push([B]);return Q},HQ=(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()};function QQ(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 dJ(){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 JD=()=>{};var hEA,Yq;var Jq=Z(()=>{hEA=typeof global=="object"&&global&&global.Object===Object&&global,Yq=hEA});var mEA,uEA,nJ;var GD=Z(()=>{Jq();mEA=typeof self=="object"&&self&&self.Object===Object&&self,uEA=Yq||mEA||Function("return this")(),nJ=uEA});var cEA,oJ;var J2=Z(()=>{GD();cEA=nJ.Symbol,oJ=cEA});function iEA(A){var Q=pEA.call(A,lF),B=A[lF];try{A[lF]=void 0;var I=!0}catch(C){}var E=lEA.call(A);if(I)if(Q)A[lF]=B;else delete A[lF];return E}var Gq,pEA,lEA,lF,Uq;var Fq=Z(()=>{J2();Gq=Object.prototype,pEA=Gq.hasOwnProperty,lEA=Gq.toString,lF=oJ?oJ.toStringTag:void 0;Uq=iEA});function oEA(A){return nEA.call(A)}var dEA,nEA,Nq;var $q=Z(()=>{dEA=Object.prototype,nEA=dEA.toString;Nq=oEA});function tEA(A){if(A==null)return A===void 0?rEA:aEA;return Dq&&Dq in Object(A)?Uq(A):Nq(A)}var aEA="[object Null]",rEA="[object Undefined]",Dq,Wq;var Xq=Z(()=>{J2();Fq();$q();Dq=oJ?oJ.toStringTag:void 0;Wq=tEA});function sEA(A){var Q=typeof A;return A!=null&&(Q=="object"||Q=="function")}var UD;var G2=Z(()=>{UD=sEA});function ICA(A){if(!UD(A))return!1;var Q=Wq(A);return Q==ACA||Q==QCA||Q==eEA||Q==BCA}var eEA="[object AsyncFunction]",ACA="[object Function]",QCA="[object GeneratorFunction]",BCA="[object Proxy]",Vq;var Mq=Z(()=>{Xq();G2();Vq=ICA});var ECA,FD;var wq=Z(()=>{GD();ECA=nJ["__core-js_shared__"],FD=ECA});function CCA(A){return!!zq&&zq in A}var zq,Kq;var Hq=Z(()=>{wq();zq=function(){var A=/[^.]+$/.exec(FD&&FD.keys&&FD.keys.IE_PROTO||"");return A?"Symbol(src)_1."+A:""}();Kq=CCA});function GCA(A){if(A!=null){try{return JCA.call(A)}catch(Q){}try{return A+""}catch(Q){}}return""}var YCA,JCA,Zq;var Lq=Z(()=>{YCA=Function.prototype,JCA=YCA.toString;Zq=GCA});function VCA(A){if(!UD(A)||Kq(A))return!1;var Q=Vq(A)?XCA:FCA;return Q.test(Zq(A))}var UCA,FCA,NCA,$CA,DCA,WCA,XCA,Rq;var jq=Z(()=>{Mq();Hq();G2();Lq();UCA=/[\\^$.*+?()[\]{}|]/g,FCA=/^\[object .+?Constructor\]$/,NCA=Function.prototype,$CA=Object.prototype,DCA=NCA.toString,WCA=$CA.hasOwnProperty,XCA=RegExp("^"+DCA.call(WCA).replace(UCA,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");Rq=VCA});function MCA(A,Q){return A==null?void 0:A[Q]}var qq;var xq=Z(()=>{qq=MCA});function wCA(A,Q){var B=qq(A,Q);return Rq(B)?B:void 0}var ND;var U2=Z(()=>{jq();xq();ND=wCA});var zCA,LC;var iF=Z(()=>{U2();zCA=ND(Object,"create"),LC=zCA});function KCA(){this.__data__=LC?LC(null):{},this.size=0}var Oq;var gq=Z(()=>{iF();Oq=KCA});function HCA(A){var Q=this.has(A)&&delete this.__data__[A];return this.size-=Q?1:0,Q}var Sq;var vq=Z(()=>{Sq=HCA});function jCA(A){var Q=this.__data__;if(LC){var B=Q[A];return B===ZCA?void 0:B}return RCA.call(Q,A)?Q[A]:void 0}var ZCA="__lodash_hash_undefined__",LCA,RCA,_q;var Pq=Z(()=>{iF();LCA=Object.prototype,RCA=LCA.hasOwnProperty;_q=jCA});function OCA(A){var Q=this.__data__;return LC?Q[A]!==void 0:xCA.call(Q,A)}var qCA,xCA,Tq;var bq=Z(()=>{iF();qCA=Object.prototype,xCA=qCA.hasOwnProperty;Tq=OCA});function SCA(A,Q){var B=this.__data__;return this.size+=this.has(A)?0:1,B[A]=LC&&Q===void 0?gCA:Q,this}var gCA="__lodash_hash_undefined__",kq;var yq=Z(()=>{iF();kq=SCA});function aJ(A){var Q=-1,B=A==null?0:A.length;this.clear();while(++Q<B){var I=A[Q];this.set(I[0],I[1])}}var F2;var fq=Z(()=>{gq();vq();Pq();bq();yq();aJ.prototype.clear=Oq;aJ.prototype.delete=Sq;aJ.prototype.get=_q;aJ.prototype.has=Tq;aJ.prototype.set=kq;F2=aJ});function vCA(){this.__data__=[],this.size=0}var hq;var mq=Z(()=>{hq=vCA});function _CA(A,Q){return A===Q||A!==A&&Q!==Q}var uq;var cq=Z(()=>{uq=_CA});function PCA(A,Q){var B=A.length;while(B--)if(uq(A[B][0],Q))return B;return-1}var L0;var dF=Z(()=>{cq();L0=PCA});function kCA(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 bCA.call(Q,B,1);return--this.size,!0}var TCA,bCA,pq;var lq=Z(()=>{dF();TCA=Array.prototype,bCA=TCA.splice;pq=kCA});function yCA(A){var Q=this.__data__,B=L0(Q,A);return B<0?void 0:Q[B][1]}var iq;var dq=Z(()=>{dF();iq=yCA});function fCA(A){return L0(this.__data__,A)>-1}var nq;var oq=Z(()=>{dF();nq=fCA});function hCA(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 aq;var rq=Z(()=>{dF();aq=hCA});function rJ(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 tq;var sq=Z(()=>{mq();lq();dq();oq();rq();rJ.prototype.clear=hq;rJ.prototype.delete=pq;rJ.prototype.get=iq;rJ.prototype.has=nq;rJ.prototype.set=aq;tq=rJ});var mCA,eq;var Ax=Z(()=>{U2();GD();mCA=ND(nJ,"Map"),eq=mCA});function uCA(){this.size=0,this.__data__={hash:new F2,map:new(eq||tq),string:new F2}}var Qx;var Bx=Z(()=>{fq();sq();Ax();Qx=uCA});function cCA(A){var Q=typeof A;return Q=="string"||Q=="number"||Q=="symbol"||Q=="boolean"?A!=="__proto__":A===null}var Ix;var Ex=Z(()=>{Ix=cCA});function pCA(A,Q){var B=A.__data__;return Ix(Q)?B[typeof Q=="string"?"string":"hash"]:B.map}var R0;var nF=Z(()=>{Ex();R0=pCA});function lCA(A){var Q=R0(this,A).delete(A);return this.size-=Q?1:0,Q}var Cx;var Yx=Z(()=>{nF();Cx=lCA});function iCA(A){return R0(this,A).get(A)}var Jx;var Gx=Z(()=>{nF();Jx=iCA});function dCA(A){return R0(this,A).has(A)}var Ux;var Fx=Z(()=>{nF();Ux=dCA});function nCA(A,Q){var B=R0(this,A),I=B.size;return B.set(A,Q),this.size+=B.size==I?0:1,this}var Nx;var $x=Z(()=>{nF();Nx=nCA});function tJ(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 N2;var Dx=Z(()=>{Bx();Yx();Gx();Fx();$x();tJ.prototype.clear=Qx;tJ.prototype.delete=Cx;tJ.prototype.get=Jx;tJ.prototype.has=Ux;tJ.prototype.set=Nx;N2=tJ});function $2(A,Q){if(typeof A!="function"||Q!=null&&typeof Q!="function")throw TypeError(oCA);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($2.Cache||N2),B}var oCA="Expected a function",WQ;var lE=Z(()=>{Dx();$2.Cache=N2;WQ=$2});import{homedir as aCA}from"os";import{join as rCA}from"path";function D2(A){let Q=process.env.NODE_OPTIONS;if(!Q)return!1;return Q.split(/\s+/).includes(A)}function Wx(){return!1}function Xx(){return{namespace:void 0,cluster:void 0}}var iE;var XB=Z(()=>{JD();lE();JD();iE=WQ(()=>{return(process.env.CLAUDE_CONFIG_DIR??rCA(aCA(),".claude")).normalize("NFC")},()=>process.env.CLAUDE_CONFIG_DIR)});function p(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 RC=()=>{};var W2=function(){let{crypto:A}=globalThis;if(A?.randomUUID)return W2=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 jC(A){return typeof A==="object"&&A!==null&&(("name"in A)&&A.name==="AbortError"||("message"in A)&&String(A.message).includes("FetchRequestCanceledException"))}var oF=(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,VB,SB,qY,aF,rF,tF,sF,eF,AN,QN,BN,IN;var BI=Z(()=>{s=class s extends Error{};VB=class VB extends s{constructor(A,Q,B,I,E){super(`${VB.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 qY({message:B,cause:oF(Q)});let E=Q,C=E?.error?.type;if(A===400)return new rF(A,E,B,I,C);if(A===401)return new tF(A,E,B,I,C);if(A===403)return new sF(A,E,B,I,C);if(A===404)return new eF(A,E,B,I,C);if(A===409)return new AN(A,E,B,I,C);if(A===422)return new QN(A,E,B,I,C);if(A===429)return new BN(A,E,B,I,C);if(A>=500)return new IN(A,E,B,I,C);return new VB(A,E,B,I,C)}};SB=class SB extends VB{constructor({message:A}={}){super(void 0,void 0,A||"Request was aborted.",void 0)}};qY=class qY extends VB{constructor({message:A,cause:Q}){super(void 0,void 0,A||"Connection error.",void 0);if(Q)this.cause=Q}};aF=class aF extends qY{constructor({message:A}={}){super({message:A??"Request timed out."})}};rF=class rF extends VB{};tF=class tF extends VB{};sF=class sF extends VB{};eF=class eF extends VB{};AN=class AN extends VB{};QN=class QN extends VB{};BN=class BN extends VB{};IN=class IN extends VB{}});function $D(A){if(typeof A!=="object")return{};return A??{}}function M2(A){if(!A)return!0;for(let Q in A)return!1;return!0}function Mx(A,Q){return Object.prototype.hasOwnProperty.call(A,Q)}var sCA,Vx=(A)=>{return sCA.test(A)},X2=(A)=>(X2=Array.isArray,X2(A)),V2,wx=(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},DD=(A)=>{try{return JSON.parse(A)}catch(Q){return}};var xY=Z(()=>{BI();sCA=/^[a-z][a-z0-9+.-]*:/i,V2=X2});var zx=(A)=>new Promise((Q)=>setTimeout(Q,A));var j0="0.81.0";function eCA(){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 Q0A(){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 Lx=()=>{return typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u"},A0A=()=>{let A=eCA();if(A==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":j0,"X-Stainless-OS":Hx(Deno.build.os),"X-Stainless-Arch":Kx(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":Hx(globalThis.process.platform??"unknown"),"X-Stainless-Arch":Kx(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let Q=Q0A();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"}},Kx=(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"},Hx=(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"},Zx,Rx=()=>{return Zx??(Zx=A0A())};var w2=()=>{};function jx(){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 z2(...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 WD(A){let Q=Symbol.asyncIterator in A?A[Symbol.asyncIterator]():A[Symbol.iterator]();return z2({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 EN(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 qx(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 xx=({headers:A,body:Q})=>{return{bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(Q)}};function Ox(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 gx=Z(()=>{BI()});function _x(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 CN(A){let Q;return(Sx??(Q=new globalThis.TextEncoder,Sx=Q.encode.bind(Q)))(A)}function K2(A){let Q;return(vx??(Q=new globalThis.TextDecoder,vx=Q.decode.bind(Q)))(A)}var Sx,vx;class q0{constructor(){LI.set(this,void 0),RI.set(this,void 0),p(this,LI,new Uint8Array,"f"),p(this,RI,null,"f")}decode(A){if(A==null)return[];let Q=A instanceof ArrayBuffer?new Uint8Array(A):typeof A==="string"?CN(A):A;p(this,LI,_x([x(this,LI,"f"),Q]),"f");let B=[],I;while((I=E0A(x(this,LI,"f"),x(this,RI,"f")))!=null){if(I.carriage&&x(this,RI,"f")==null){p(this,RI,I.index,"f");continue}if(x(this,RI,"f")!=null&&(I.index!==x(this,RI,"f")+1||I.carriage)){B.push(K2(x(this,LI,"f").subarray(0,x(this,RI,"f")-1))),p(this,LI,x(this,LI,"f").subarray(x(this,RI,"f")),"f"),p(this,RI,null,"f");continue}let E=x(this,RI,"f")!==null?I.preceding-1:I.preceding,C=K2(x(this,LI,"f").subarray(0,E));B.push(C),p(this,LI,x(this,LI,"f").subarray(I.index),"f"),p(this,RI,null,"f")}return B}flush(){if(!x(this,LI,"f").length)return[];return this.decode(`
|
|
5
5
|
`)}}function E0A(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 Px(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 LI,RI;var H2=Z(()=>{RC();LI=new WeakMap,RI=new WeakMap;q0.NEWLINE_CHARS=new Set([`
|
|
6
6
|
`,"\r"]);q0.NEWLINE_REGEXP=/\r\n|[\n\r]/g});function YN(){}function XD(A,Q,B){if(!Q||VD[A]>VD[B])return YN;else return Q[A].bind(Q)}function RB(A){let Q=A.logger,B=A.logLevel??"off";if(!Q)return C0A;let I=Tx.get(Q);if(I&&I[0]===B)return I[1];let E={error:XD("error",Q,B),warn:XD("warn",Q,B),info:XD("info",Q,B),debug:XD("debug",Q,B)};return Tx.set(Q,[B,E]),E}var VD,Z2=(A,Q,B)=>{if(!A)return;if(Mx(VD,A))return A;RB(B).warn(`${Q} was set to ${JSON.stringify(A)}, expected one of ${JSON.stringify(Object.keys(VD))}`);return},C0A,Tx,qC=(A)=>{if(A.options)A.options={...A.options},delete A.options.headers;if(A.headers)A.headers=Object.fromEntries((A.headers instanceof Headers?[...A.headers]:Object.entries(A.headers)).map(([Q,B])=>[Q,Q.toLowerCase()==="x-api-key"||Q.toLowerCase()==="authorization"||Q.toLowerCase()==="cookie"||Q.toLowerCase()==="set-cookie"?"***":B]));if("retryOfRequestLogID"in A){if(A.retryOfRequestLogID)A.retryOf=A.retryOfRequestLogID;delete A.retryOfRequestLogID}return A};var MD=Z(()=>{xY();VD={off:0,error:200,warn:300,info:400,debug:500};C0A={error:YN,warn:YN,info:YN,debug:YN},Tx=new WeakMap});async function*Y0A(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 bx,I=new q0,E=EN(A.body);for await(let C of J0A(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*J0A(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"?CN(B):B,E=new Uint8Array(Q.length+I.length);E.set(Q),E.set(I,Q.length),Q=E;let C;while((C=Px(Q))!==-1)yield Q.slice(0,C),Q=Q.slice(C)}if(Q.length>0)yield Q}class bx{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(KBA(E))Q[I]=E;break;case"id":if(HBA(E))Q[I]=E;break;c
|
|
|
180
180
|
`)){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 _DQ=WQ(()=>{if(process.platform!=="darwin")return;let Q=Kd().match(/^(\d+)\./);if(!Q||!Q[1])return;return parseInt(Q[1],10)-9});XQ();import{AsyncLocalStorage as zZA}from"async_hooks";var bDQ=new zZA;XB();var FWQ=FU(()=>sE.object({pid:sE.number(),sessionId:sE.string(),cwd:sE.string().optional(),startedAt:sE.number(),version:sE.string().optional(),kind:sE.enum(["interactive","bg","daemon","daemon-worker"])}));function LZA(){return Zd(iE(),"sessions")}var Hd=Promise.resolve();async function RZA(A){let Q=Zd(LZA(),`${process.pid}.json`),B=Hd.then(async()=>{try{let I=hQ(await HZA(Q,"utf8"));await ZZA(Q,xA({...I,...A}))}catch(I){z(`[concurrentSessions] updatePidFile failed: ${FA(I)}`)}});Hd=B,await B}async function Ld(A){await RZA({bridgeSessionId:A})}ZQ();tC();yQ();ME();ME();ZQ();XB();yQ();wE();import{mkdirSync as jZA,writeFileSync as qZA}from"fs";var eX="/home/claude/.claude/remote",ZWQ=`${eX}/.oauth_token`,LWQ=`${eX}/.api_key`,A8=`${eX}/.session_ingress_token`;function Rd(A,Q,B){if(!QQ(process.env.CLAUDE_CODE_REMOTE))return;try{jZA(eX,{recursive:!0,mode:448}),qZA(A,Q,{encoding:"utf8",mode:384}),z(`Persisted ${B} to ${A} for subprocess access`)}catch(I){z(`Failed to persist ${B} to disk (non-fatal): ${FA(I)}`,{level:"error"})}}function oZ(A,Q){try{let I=eQ().readFileSync(A,{encoding:"utf8"}).trim();if(!I)return null;return z(`Read ${Q} from well-known file ${A}`),I}catch(B){if(!SC(B))z(`Failed to read ${Q} from ${A}: ${FA(B)}`,{level:"debug"});return null}}ZQ();yQ();wE();function xZA(){let A=LO();if(A!==void 0)return A;let Q=process.env.CLAUDE_CODE_WEBSOCKET_AUTH_FILE_DESCRIPTOR;if(!Q){let I=process.env.CLAUDE_SESSION_INGRESS_TOKEN_FILE??A8,E=oZ(I,"session ingress token");return DG(E),E}let B=parseInt(Q,10);if(Number.isNaN(B))return z(`CLAUDE_CODE_WEBSOCKET_AUTH_FILE_DESCRIPTOR must be a valid file descriptor number, got: ${Q}`,{level:"error"}),DG(null),null;try{let I=eQ(),E=process.platform==="darwin"||process.platform==="freebsd"?`/dev/fd/${B}`:`/proc/self/fd/${B}`,C=I.readFileSync(E,{encoding:"utf8"}).trim();if(!C)return z("File descriptor contained empty token",{level:"error"}),DG(null),null;return z(`Successfully read token from file descriptor ${B}`),DG(C),Rd(A8,C,"session ingress token"),C}catch(I){z(`Failed to read token from file descriptor ${B}: ${FA(I)}`,{level:"error"});let E=process.env.CLAUDE_SESSION_INGRESS_TOKEN_FILE??A8,C=oZ(E,"session ingress token");return DG(C),C}}function l4(){let A=process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN;if(A)return A;return xZA()}function Q8(){let A=l4();if(!A)return{};if(A.startsWith("sk-ant-sid")){let Q={Cookie:`sessionKey=${A}`},B=process.env.CLAUDE_CODE_ORGANIZATION_UUID;if(B)Q["X-Organization-Uuid"]=B;return Q}return{Authorization:`Bearer ${A}`}}function i4(A){process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN=A}XQ();class TU extends Error{retryAfterMs;constructor(A,Q){super(A);this.retryAfterMs=Q}}class VJ{pending=[];pendingAtClose=0;draining=!1;closed=!1;backpressureResolvers=[];sleepResolve=null;flushResolvers=[];droppedBatches=0;config;constructor(A){this.config=A}get droppedBatchCount(){return this.droppedBatches}get pendingCount(){return this.closed?this.pendingAtClose:this.pending.length}async enqueue(A){if(this.closed)return;let Q=Array.isArray(A)?A:[A];if(Q.length===0)return;while(this.pending.length+Q.length>this.config.maxQueueSize&&!this.closed)await new Promise((B)=>{this.backpressureResolvers.push(B)});if(this.closed)return;this.pending.push(...Q),this.drain()}flush(){if(this.pending.length===0&&!this.draining)return Promise.resolve();return this.drain(),new Promise((A)=>{this.flushResolvers.push(A)})}close(){if(this.closed)return;this.closed=!0,this.pendingAtClose=this.pending.length,this.pending=[],this.sleepResolve?.(),this.sleepResolve=null;for(let A of this.backpressureResolvers)A();this.backpressureResolvers=[];for(let A of this.flushResolvers)A();this.flushResolvers=[]}async drain(){if(this.draining||this.closed)return;this.draining=!0;let A=0;try{while(this.pending.length>0&&!this.closed){let Q=this.takeBatch();if(Q.length===0)continue;try{await this.config.send(Q),A=0}catch(B){if(A++,this.config.maxConsecutiveFailures!==void 0&&A>=this.config.maxConsecutiveFailures){this.droppedBatches++,this.config.onBatchDropped?.(Q.length,A),A=0,this.releaseBackpressure();continue}this.pending=Q.concat(this.pending);let I=B instanceof TU?B.retryAfterMs:void 0;await this.sleep(this.retryDelay(A,I));continue}this.releaseBackpressure()}}finally{if(this.draining=!1,this.pending.length===0){for(let Q of this.flushResolvers)Q();this.flushResolvers=[]}}}takeBatch(){let{maxBatchSize:A,maxBatchBytes:Q}=this.config;if(Q===void 0)return this.pending.splice(0,A);let B=0,I=0;while(I<this.pending.length&&I<A){let E;try{E=Buffer.byteLength(xA(this.pending[I]))}catch{this.pending.splice(I,1);continue}if(I>0&&B+E>Q)break;B+=E,I++}return this.pending.splice(0,I)}retryDelay(A,Q){let B=Math.random()*this.config.jitterMs;if(Q!==void 0)return Math.max(this.config.baseDelayMs,Math.min(Q,this.config.maxDelayMs))+B;return Math.min(this.config.baseDelayMs*2**(A-1),this.config.maxDelayMs)+B}releaseBackpressure(){let A=this.backpressureResolvers;this.backpressureResolvers=[];for(let Q of A)Q()}sleep(A){return new Promise((Q)=>{this.sleepResolve=Q,setTimeout((B,I)=>{B.sleepResolve=null,I()},A,this,Q)})}}class aZ{capacity;buffer;head=0;size=0;constructor(A){this.capacity=A;this.buffer=Array(A)}add(A){if(this.buffer[this.head]=A,this.head=(this.head+1)%this.capacity,this.size<this.capacity)this.size++}addAll(A){for(let Q of A)this.add(Q)}getRecent(A){let Q=[],B=this.size<this.capacity?0:this.head,I=Math.min(A,this.size);for(let E=0;E<I;E++){let C=(B+this.size-I+E)%this.capacity;Q.push(this.buffer[C])}return Q}toArray(){if(this.size===0)return[];let A=[],Q=this.size<this.capacity?0:this.head;for(let B=0;B<this.size;B++){let I=(Q+B)%this.capacity;A.push(this.buffer[I])}return A}clear(){this.buffer.length=0,this.head=0,this.size=0}length(){return this.size}}ZQ();tC();XB();lE();import{Agent as gZA}from"https";lE();ZQ();XB();wE();var jd=["bundled","system"];function OZA(){let A=process.env.CLAUDE_CODE_CERT_STORE;if(A){let Q=[];for(let B of A.split(",")){let I=B.trim().toLowerCase();if(I==="bundled"||I==="system"){if(!Q.includes(I))Q.push(I)}else if(I)z(`CA certs: unrecognized CLAUDE_CODE_CERT_STORE source '${I}', ignoring`,{level:"warn"})}return Q.length>0?Q:jd}if(D2("--use-system-ca")||D2("--use-openssl-ca"))return["system"];return jd}var bU=WQ(()=>{let A=OZA(),Q=process.env.NODE_EXTRA_CA_CERTS,B=A.includes("bundled"),I=A.includes("system");if(z(`CA certs: stores=${A.join(",")}, extraCertsPath=${Q}`),typeof Bun>"u"&&!Q&&!process.env.CLAUDE_CODE_CERT_STORE)return;let E=q("tls"),C=E.getCACertificates;if(!B&&I&&!C){z("CA certs: stores=system but system CA API unavailable, deferring to runtime");return}let Y=[];if(B)Y.push(...E.rootCertificates),z(`CA certs: Loaded ${E.rootCertificates.length} bundled root certificates`);if(I)try{let J=C?.("system");if(J&&J.length>0)Y.push(...J),z(`CA certs: Loaded ${J.length} system CA certificates`);else if(z(`CA certs: system store ${C?"returned empty":"unavailable"}`),!B)Y.push(...E.rootCertificates)}catch(J){if(z(`CA certs: Failed to load system CA certificates: ${J}`,{level:"error"}),!B)Y.push(...E.rootCertificates)}if(Q)try{let J=eQ().readFileSync(Q,{encoding:"utf8"});Y.push(J),z(`CA certs: Appended extra certificates from NODE_EXTRA_CA_CERTS (${Q})`)}catch(J){z(`CA certs: Failed to read NODE_EXTRA_CA_CERTS file (${Q}): ${J}`,{level:"error"})}return Y.length>0?BW(Y):void 0});ZQ();wE();var d4=WQ(()=>{let A={};if(process.env.CLAUDE_CODE_CLIENT_CERT)try{A.cert=eQ().readFileSync(process.env.CLAUDE_CODE_CLIENT_CERT,{encoding:"utf8"}),z("mTLS: Loaded client certificate from CLAUDE_CODE_CLIENT_CERT")}catch(Q){z(`mTLS: Failed to load client certificate: ${Q}`,{level:"error"})}if(process.env.CLAUDE_CODE_CLIENT_KEY)try{A.key=eQ().readFileSync(process.env.CLAUDE_CODE_CLIENT_KEY,{encoding:"utf8"}),z("mTLS: Loaded client key from CLAUDE_CODE_CLIENT_KEY")}catch(Q){z(`mTLS: Failed to load client key: ${Q}`,{level:"error"})}if(process.env.CLAUDE_CODE_CLIENT_KEY_PASSPHRASE)A.passphrase=process.env.CLAUDE_CODE_CLIENT_KEY_PASSPHRASE,z("mTLS: Using client key passphrase");if(Object.keys(A).length===0)return;return A}),qd=WQ(()=>{let A=d4(),Q=bU();if(!A&&!Q)return;let B={...A,...Q&&{ca:Q},keepAlive:!0};return z("mTLS: Creating HTTPS agent with custom certificates"),new gZA(B)});function rZ(){let A=d4(),Q=bU();if(!A&&!Q)return;return{...A,...Q&&{ca:Q}}}lE();ME();var yBA=ZI(ud(),1);ZQ();XB();PZ();function WyA(A){switch(A.family){case 0:case 4:case 6:return A.family;case"IPv6":return 6;case"IPv4":case void 0:return 4;default:throw Error(`Unsupported address family: ${A.family}`)}}function Kj(A=process.env){return A.https_proxy||A.HTTPS_PROXY||A.http_proxy||A.HTTP_PROXY}function XyA(A=process.env){return A.no_proxy||A.NO_PROXY}function Hj(A,Q=XyA()){if(!Q)return!1;if(Q==="*")return!0;try{let B=new URL(A),I=B.hostname.toLowerCase(),E=B.port||(B.protocol==="https:"?"443":"80"),C=`${I}:${E}`;return Q.split(/[,\s]+/).filter(Boolean).some((J)=>{if(J=J.toLowerCase().trim(),J.includes(":"))return C===J;if(J.startsWith(".")){let G=J;return I===J.substring(1)||I.endsWith(G)}return I===J})}catch{return!1}}function fBA(A,Q={}){let B=d4(),I=bU(),E={...B&&{cert:B.cert,key:B.key,passphrase:B.passphrase},...I&&{ca:I}};if(QQ(process.env.CLAUDE_CODE_PROXY_RESOLVES_HOSTS))E.lookup=(C,Y,J)=>{J(null,C,WyA(Y))};return new yBA.HttpsProxyAgent(A,{...E,...Q})}function hBA(A={}){let Q=Kj(),B=qd(),I=mQ.create({proxy:!1});if(!Q){if(B)I.defaults.httpsAgent=B;return I}let E=fBA(Q,A);return I.interceptors.request.use((C)=>{if(C.url&&Hj(C.url))C.httpsAgent=B,C.httpAgent=void 0;else C.httpsAgent=E,C.httpAgent=E;return C}),I}var dXQ=WQ((A)=>{let Q=kBA(),B=d4(),I=bU(),E={httpProxy:A,httpsProxy:A,noProxy:process.env.NO_PROXY||process.env.no_proxy};if(B||I){let C={...B&&{cert:B.cert,key:B.key,passphrase:B.passphrase},...I&&{ca:I}};E.connect=C,E.requestTls=C}return new Q.EnvHttpProxyAgent(E)});function mBA(A){let Q=Kj();if(!Q)return;if(Hj(A))return;return fBA(Q)}function uBA(A){let Q=Kj();if(!Q)return;if(Hj(A))return;return Q}WG();tC();XB();var VyA=30000,Lj=null,cBA=0;var o$=null,Zj=null;function MyA(){pBA(),o$=setInterval(()=>{if(l("debug","session_keepalive_heartbeat",{refcount:cBA}),QQ(process.env.CLAUDE_CODE_REMOTE_SEND_KEEPALIVES))Lj?.()},VyA)}function pBA(){if(Zj!==null)clearTimeout(Zj),Zj=null}function y6(A){if(Lj=A,cBA>0&&o$===null)MyA()}function a$(){if(Lj=null,o$!==null)clearInterval(o$),o$=null;pBA()}XQ();var kfA=`{"type":"keep_alive"}
|
|
181
181
|
`,yfA=1000,ffA=1000,eIA=30000,hfA=600000,mfA=1e4,ufA=300000,sIA=eIA*2,cfA=new Set([1002,4001,4003]);class hj{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 aZ(yfA)}async connect(){if(this.state!=="idle"&&this.state!=="reconnecting"){z(`WebSocketTransport: Cannot connect, current state is ${this.state}`,{level:"error"}),l("error","cli_websocket_connect_failed");return}this.state="reconnecting",this.connectStartTime=Date.now(),z(`WebSocketTransport: Opening ${this.url.href}`),l("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:uBA(this.url.href),tls:rZ()||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(() => (tIA(),rIA)),B=new Q(this.url.href,{headers:A,agent:mBA(this.url.href),...rZ()});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(),l("info","cli_websocket_message_received",{length:Q.length}),this.onData)this.onData(Q)};onBunError=()=>{z("WebSocketTransport: Error",{level:"error"}),l("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"}),l("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(),l("info","cli_websocket_message_received",{length:Q.length}),this.onData)this.onData(Q)};onNodeError=(A)=>{z(`WebSocketTransport: Error: ${A.message}`,{level:"error"}),l("error","cli_websocket_connect_error")};onNodeClose=(A,Q)=>{let B=A===1000||A===1001;z(`WebSocketTransport: Closed: ${A}`,B?void 0:{level:"error"}),l("error","cli_websocket_connect_closed"),this.handleConnectionError(A)};onPong=()=>{this.pongReceived=!0};handleOpenEvent(){let A=Date.now()-this.connectStartTime;if(z("WebSocketTransport: Connected"),l("info","cli_websocket_connect_connected",{duration_ms:A}),this.isBridge&&this.reconnectStartTime!==null)EQ("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(),y6(()=>{this.write({type:"keep_alive"})})}sendLine(A){if(!this.ws||this.state!=="connected")return z("WebSocketTransport: Not connected"),l("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"}),l("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(),a$(),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})`:"")),l("info","cli_websocket_disconnected"),this.isBridge)EQ("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"),l("info","cli_websocket_4003_token_refreshed")}if(A!=null&&cfA.has(A)&&!Q){z(`WebSocketTransport: Permanent close code ${A}, not reconnecting`,{level:"error"}),l("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>sIA)z(`WebSocketTransport: Detected system sleep (${Math.round((B-this.lastReconnectAttemptTime)/1000)}s gap), resetting reconnection budget`),l("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<hfA){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(ffA*Math.pow(2,this.reconnectAttempts-1),eIA),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)`),l("error","cli_websocket_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.isBridge)EQ("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"}),l("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(),a$(),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`),l("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"),l("info","cli_websocket_no_messages_to_replay");return}z(`WebSocketTransport: Replaying ${I.length} buffered messages`),l("info","cli_websocket_messages_to_replay",{count:I.length});for(let E of I){let C=xA(E)+`
|
|
182
182
|
`;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=xA(A)+`
|
|
183
|
-
`;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>sIA){z(`WebSocketTransport: ${Math.round(B/1000)}s tick gap detected — process was suspended, forcing reconnect`),l("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"}),l("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(I){z(`WebSocketTransport: Ping failed: ${I}`,{level:"error"}),l("error","cli_websocket_ping_failed")}}},mfA)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),QQ(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(kfA),this.lastActivityTime=Date.now(),z("WebSocketTransport: Sent periodic keep_alive data frame")}catch(A){z(`WebSocketTransport: Periodic keep_alive failed: ${A}`,{level:"error"}),l("error","cli_websocket_keepalive_failed")}},ufA)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var pfA=100,lfA=15000,ifA=3000;class mj extends hj{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=dfA(A),this.uploader=new VJ({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:C,onBatchDropped:(J,G)=>{l("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}`),l("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(),pfA);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,ifA)})]).finally(()=>{clearTimeout(Q),A.close()}),super.close()}async postOnce(A){let Q=l4();if(!Q){z("HybridTransport: No session token available for POST"),l("warn","cli_hybrid_post_no_token");return}let B={Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},I;try{I=await mQ.post(this.postUrl,{events:A},{headers:B,validateStatus:()=>!0,timeout:lfA})}catch(E){throw z(`HybridTransport: POST error: ${FA(E)}`),l("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`),l("warn","cli_hybrid_post_client_error",{status:I.status});return}throw z(`HybridTransport: POST returned ${I.status} (retryable)`),l("warn","cli_hybrid_post_retryable_error",{status:I.status}),Error(`POST failed with ${I.status}`)}}function dfA(A){let Q=A.protocol==="wss:"?"https:":"http:",B=A.pathname;if(B=B.replace("/ws/","/session/"),!B.endsWith("/events"))B=B.endsWith("/")?B+"events":B+"/events";return`${Q}//${A.host}${B}${A.search}`}import{randomUUID as BEA}from"crypto";ZQ();tC();yQ();XQ();function nfA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return hQ(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function AEA(A){let Q=nfA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}ZQ();tC();yQ();function hF(){return"claude-code/0.2.113"}class uj{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?QEA(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 AI(this.retryDelay(B)),this.pending&&!this.closed)Q=QEA(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 QEA(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 ofA=20000,afA=100;function IEA(){return!0}class r6 extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var rfA=10;function tfA(){return{byMessage:new Map,scopeToMessage:new Map}}function t6(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function sfA(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(t6(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(t6(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(t6(E)),Y=C?Q.byMessage.get(C):void 0;if(!Y){B.push(E);break}let J=Y[E.event.index]??=[];J.push(E.event.delta.text);let G=I.get(J);if(G){G.event.delta.text=J.join("");break}let U={type:"stream_event",uuid:E.uuid,session_id:E.session_id,parent_tool_use_id:E.parent_tool_use_id,event:{type:"content_block_delta",index:E.event.index,delta:{type:"text_delta",text:J.join("")}}};I.set(J,U),B.push(U);break}default:B.push(E)}return B}function efA(A,Q){A.byMessage.delete(Q.message.id);let B=t6(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class cj{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;currentState=null;sessionBaseUrl;sessionId;http=hBA({keepAlive:!0});streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=tfA();workerState;eventUploader;internalEventUploader;deliveryUploader;onEpochMismatch;getAuthHeaders;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??ofA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??Q8,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 uj({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 VJ({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 TU("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new VJ({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 TU("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new VJ({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 TU("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 r6("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 r6("missing_epoch");this.workerEpoch=A;let B=this.getWorkerState();if(!(await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)")).ok)throw new r6("worker_register_failed");this.currentState="idle",this.startHeartbeat(),y6(()=>{this.writeEvent({type:"keep_alive"})}),z(`CCRClient: initialized, epoch=${this.workerEpoch}`),l("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:E,durationMs:C}=await B;if(!this.closed)l("info","cli_worker_state_restored",{duration_ms:C,had_state:E!==null});return E}async getWorkerState(){let A=Date.now(),Q=this.getAuthHeaders();if(Object.keys(Q).length===0)return{metadata:null,durationMs:0};return{metadata:(await this.getWithRetry(`${this.sessionBaseUrl}/worker`,Q,"worker_state"))?.worker?.external_metadata??null,durationMs:Date.now()-A}}async request(A,Q,B,I,{timeout:E=1e4}={}){let C=this.getAuthHeaders();if(Object.keys(C).length===0)return{ok:!1};try{let Y=await this.http[A](`${this.sessionBaseUrl}${Q}`,B,{headers:{...C,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":hF()},validateStatus:IEA,timeout:E});if(Y.status>=200&&Y.status<300)return this.consecutiveAuthFailures=0,{ok:!0};if(Y.status===409)this.handleEpochMismatch();if(Y.status===401||Y.status===403){let J=l4(),G=J?AEA(J):null;if(G!==null&&G*1000<Date.now())z(`CCRClient: session_token expired (exp=${new Date(G*1000).toISOString()}) — no refresh was delivered, exiting`,{level:"error"}),l("error","cli_worker_token_expired_no_refresh"),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=rfA)z(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),l("error","cli_worker_auth_failures_exhausted"),this.onEpochMismatch()}if(z(`CCRClient: ${I} returned ${Y.status}`,{level:"warn"}),l("warn","cli_worker_request_failed",{method:A,path:Q,status:Y.status}),Y.status===429){let J=Y.headers?.["retry-after"],G=typeof J==="string"?parseInt(J,10):NaN;if(!isNaN(G)&&G>=0)return{ok:!1,retryAfterMs:G*1000}}return{ok:!1}}catch(Y){return z(`CCRClient: ${I} failed: ${FA(Y)}`,{level:"warn"}),l("warn","cli_worker_request_error",{method:A,path:Q,error_code:rI(Y)}),{ok:!1}}}reportState(A,Q){if(A===this.currentState&&!Q)return;this.currentState=A,this.workerState.enqueue({worker_status:A,requires_action_details:Q?{tool_name:Q.tool_name,action_description:Q.action_description,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:A})}handleEpochMismatch(){z("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),l("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(),afA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")efA(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:BEA()}}}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=sfA(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:BEA()},...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{E=await this.http.get(A,{headers:{...Q,"anthropic-version":"2023-06-01","User-Agent":hF()},validateStatus:IEA,timeout:30000})}catch(C){if(z(`CCRClient: GET ${A} failed (attempt ${I}/10): ${FA(C)}`,{level:"warn"}),I<10){let Y=Math.min(500*2**(I-1),30000)+Math.random()*500;await AI(Y)}continue}if(E.status>=200&&E.status<300)return E.data;if(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 AI(C)}}return z("CCRClient: GET retries exhausted",{level:"error"}),l("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(),a$(),this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[],this.streamTextAccumulator.byMessage.clear(),this.streamTextAccumulator.scopeToMessage.clear(),this.workerState.close(),this.eventUploader.close(),this.internalEventUploader.close(),this.deliveryUploader.close()}}ZQ();tC();yQ();XQ();var AhA=1000,QhA=30000,BhA=600000,IhA=45000,EhA=new Set([401,403,404]),ED=10,ChA=500,YhA=8000,JhA={stream:!0};function GhA(){return!0}function UhA(A){let Q=[],B=0,I;while((I=A.indexOf(`
|
|
183
|
+
`;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>sIA){z(`WebSocketTransport: ${Math.round(B/1000)}s tick gap detected — process was suspended, forcing reconnect`),l("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"}),l("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(I){z(`WebSocketTransport: Ping failed: ${I}`,{level:"error"}),l("error","cli_websocket_ping_failed")}}},mfA)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),QQ(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(kfA),this.lastActivityTime=Date.now(),z("WebSocketTransport: Sent periodic keep_alive data frame")}catch(A){z(`WebSocketTransport: Periodic keep_alive failed: ${A}`,{level:"error"}),l("error","cli_websocket_keepalive_failed")}},ufA)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var pfA=100,lfA=15000,ifA=3000;class mj extends hj{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=dfA(A),this.uploader=new VJ({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:C,onBatchDropped:(J,G)=>{l("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}`),l("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(),pfA);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,ifA)})]).finally(()=>{clearTimeout(Q),A.close()}),super.close()}async postOnce(A){let Q=l4();if(!Q){z("HybridTransport: No session token available for POST"),l("warn","cli_hybrid_post_no_token");return}let B={Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},I;try{I=await mQ.post(this.postUrl,{events:A},{headers:B,validateStatus:()=>!0,timeout:lfA})}catch(E){throw z(`HybridTransport: POST error: ${FA(E)}`),l("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`),l("warn","cli_hybrid_post_client_error",{status:I.status});return}throw z(`HybridTransport: POST returned ${I.status} (retryable)`),l("warn","cli_hybrid_post_retryable_error",{status:I.status}),Error(`POST failed with ${I.status}`)}}function dfA(A){let Q=A.protocol==="wss:"?"https:":"http:",B=A.pathname;if(B=B.replace("/ws/","/session/"),!B.endsWith("/events"))B=B.endsWith("/")?B+"events":B+"/events";return`${Q}//${A.host}${B}${A.search}`}import{randomUUID as BEA}from"crypto";ZQ();tC();yQ();XQ();function nfA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return hQ(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function AEA(A){let Q=nfA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}ZQ();tC();yQ();function hF(){return"claude-code/0.2.114"}class uj{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?QEA(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 AI(this.retryDelay(B)),this.pending&&!this.closed)Q=QEA(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 QEA(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 ofA=20000,afA=100;function IEA(){return!0}class r6 extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var rfA=10;function tfA(){return{byMessage:new Map,scopeToMessage:new Map}}function t6(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function sfA(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(t6(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(t6(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(t6(E)),Y=C?Q.byMessage.get(C):void 0;if(!Y){B.push(E);break}let J=Y[E.event.index]??=[];J.push(E.event.delta.text);let G=I.get(J);if(G){G.event.delta.text=J.join("");break}let U={type:"stream_event",uuid:E.uuid,session_id:E.session_id,parent_tool_use_id:E.parent_tool_use_id,event:{type:"content_block_delta",index:E.event.index,delta:{type:"text_delta",text:J.join("")}}};I.set(J,U),B.push(U);break}default:B.push(E)}return B}function efA(A,Q){A.byMessage.delete(Q.message.id);let B=t6(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class cj{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;currentState=null;sessionBaseUrl;sessionId;http=hBA({keepAlive:!0});streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=tfA();workerState;eventUploader;internalEventUploader;deliveryUploader;onEpochMismatch;getAuthHeaders;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??ofA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??Q8,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 uj({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 VJ({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 TU("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new VJ({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 TU("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new VJ({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 TU("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 r6("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 r6("missing_epoch");this.workerEpoch=A;let B=this.getWorkerState();if(!(await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)")).ok)throw new r6("worker_register_failed");this.currentState="idle",this.startHeartbeat(),y6(()=>{this.writeEvent({type:"keep_alive"})}),z(`CCRClient: initialized, epoch=${this.workerEpoch}`),l("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:E,durationMs:C}=await B;if(!this.closed)l("info","cli_worker_state_restored",{duration_ms:C,had_state:E!==null});return E}async getWorkerState(){let A=Date.now(),Q=this.getAuthHeaders();if(Object.keys(Q).length===0)return{metadata:null,durationMs:0};return{metadata:(await this.getWithRetry(`${this.sessionBaseUrl}/worker`,Q,"worker_state"))?.worker?.external_metadata??null,durationMs:Date.now()-A}}async request(A,Q,B,I,{timeout:E=1e4}={}){let C=this.getAuthHeaders();if(Object.keys(C).length===0)return{ok:!1};try{let Y=await this.http[A](`${this.sessionBaseUrl}${Q}`,B,{headers:{...C,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":hF()},validateStatus:IEA,timeout:E});if(Y.status>=200&&Y.status<300)return this.consecutiveAuthFailures=0,{ok:!0};if(Y.status===409)this.handleEpochMismatch();if(Y.status===401||Y.status===403){let J=l4(),G=J?AEA(J):null;if(G!==null&&G*1000<Date.now())z(`CCRClient: session_token expired (exp=${new Date(G*1000).toISOString()}) — no refresh was delivered, exiting`,{level:"error"}),l("error","cli_worker_token_expired_no_refresh"),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=rfA)z(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),l("error","cli_worker_auth_failures_exhausted"),this.onEpochMismatch()}if(z(`CCRClient: ${I} returned ${Y.status}`,{level:"warn"}),l("warn","cli_worker_request_failed",{method:A,path:Q,status:Y.status}),Y.status===429){let J=Y.headers?.["retry-after"],G=typeof J==="string"?parseInt(J,10):NaN;if(!isNaN(G)&&G>=0)return{ok:!1,retryAfterMs:G*1000}}return{ok:!1}}catch(Y){return z(`CCRClient: ${I} failed: ${FA(Y)}`,{level:"warn"}),l("warn","cli_worker_request_error",{method:A,path:Q,error_code:rI(Y)}),{ok:!1}}}reportState(A,Q){if(A===this.currentState&&!Q)return;this.currentState=A,this.workerState.enqueue({worker_status:A,requires_action_details:Q?{tool_name:Q.tool_name,action_description:Q.action_description,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:A})}handleEpochMismatch(){z("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),l("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(),afA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")efA(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:BEA()}}}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=sfA(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:BEA()},...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{E=await this.http.get(A,{headers:{...Q,"anthropic-version":"2023-06-01","User-Agent":hF()},validateStatus:IEA,timeout:30000})}catch(C){if(z(`CCRClient: GET ${A} failed (attempt ${I}/10): ${FA(C)}`,{level:"warn"}),I<10){let Y=Math.min(500*2**(I-1),30000)+Math.random()*500;await AI(Y)}continue}if(E.status>=200&&E.status<300)return E.data;if(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 AI(C)}}return z("CCRClient: GET retries exhausted",{level:"error"}),l("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(),a$(),this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[],this.streamTextAccumulator.byMessage.clear(),this.streamTextAccumulator.scopeToMessage.clear(),this.workerState.close(),this.eventUploader.close(),this.internalEventUploader.close(),this.deliveryUploader.close()}}ZQ();tC();yQ();XQ();var AhA=1000,QhA=30000,BhA=600000,IhA=45000,EhA=new Set([401,403,404]),ED=10,ChA=500,YhA=8000,JhA={stream:!0};function GhA(){return!0}function UhA(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(KBA(E))Q[I]=E;break;case"id":if(HBA(E))Q[I]=E;break;c
|
|
|
190
190
|
`);if(I.push(J),!G){E=J.endsWith(`
|
|
191
191
|
`);continue}let{frames:U,remaining:F}=UhA(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"}),l("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"}),l("warn","cli_sse_frame_missing_event_field")}}}catch(C){if(this.abortController?.signal.aborted)return;z(`SSETransport: Stream read error: ${FA(C)}`,{level:"error"}),l("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"}),l("warn","cli_sse_unexpected_event_type",{event_type:A});return}let B;try{B=hQ(Q)}catch(E){z(`SSETransport: Failed to parse client_event data: ${FA(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}`),l("info","cli_sse_message_received"),this.onData?.(xA(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<BhA){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(AhA*Math.pow(2,this.reconnectAttempts-1),QhA),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)`),l("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"}),l("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"}),l("error","cli_sse_liveness_timeout"),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,IhA)}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"),l("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":hF()};z(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=ED;I++){try{let C=await mQ.post(this.postUrl,A,{headers:B,validateStatus:GhA});if(C.status===200||C.status===201){z(`SSETransport: POST success type=${A.type}`);return}if(z(`SSETransport: POST ${C.status} body=${xA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){z(`SSETransport: POST returned ${C.status} (client error), not retrying`),l("warn","cli_sse_post_client_error",{status:C.status});return}z(`SSETransport: POST returned ${C.status}, attempt ${I}/${ED}`),l("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){z(`SSETransport: POST error: ${FA(C)}, attempt ${I}/${ED}`),l("warn","cli_sse_post_network_error",{attempt:I})}if(I===ED){z(`SSETransport: POST failed after ${ED} attempts, continuing`),l("warn","cli_sse_post_retries_exhausted");return}let E=Math.min(ChA*Math.pow(2,I-1),YhA);await AI(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 FhA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}ZQ();yQ();function EEA(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 CEA(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 i4(B);let J=A.epoch??await wd(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 pj(G,{},I,void 0,E,Y),F,N=new cj(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: ${FA(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: ${FA(V)}`,{level:"error"}),N.close(),U.close(),F?.(4091)})}}}ZQ();yQ();var NhA="2023-06-01",$hA="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 mQ.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:A2(U,J),signal:I,validateStatus:(W)=>W<500})}catch(W){return z(`[bridge] Session creation request failed: ${FA(W)}`),null}if(N.status!==200&&N.status!==201){let W=XJ(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 JEA(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 mQ.post(Y,{},{headers:A2(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)z(`[bridge] Session ${A} archived successfully`);else{let G=XJ(J.data);z(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){z(`[bridge] Session archive request failed: ${FA(J)}`)}}async function s6(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:PU(Q),repo:B,pr_number:I},U;try{U=await mQ.post(J,G,{headers:A2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-pr request failed: ${FA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=XJ(U.data);return z(`[bridge] ${A}-pr failed ${U.status}${N?`: ${N}`:""}`),!1}return z(`[bridge] ${A}-pr ${B}#${I} ok`),!0}async function e6(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:PU(Q),channel:B,thread_ts:I},U;try{U=await mQ.post(J,G,{headers:A2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-thread request failed: ${FA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=XJ(U.data);return z(`[bridge] ${A}-thread failed ${U.status}${N?`: ${N}`:""}`),!1}return z(`[bridge] ${A}-thread ${B}/${I} ok`),!0}function A2(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":NhA,"anthropic-beta":$hA};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}XB();function GEA(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 lj{_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}}yQ();ZQ();var RhA=2000,WEA=60000,XEA=900000,jhA=0;async function VEA(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=()=>W4,initialHistoryCap:L=200,initialMessages:K,previouslyFlushedUUIDs:R,onInboundMessage:O,onPermissionResponse:g,onInterrupt:_,onSetModel:f,onSetMaxThinkingTokens:e,onSetPermissionMode:DA,onRenameSession:_A,onFileSuggestions:WA,onStateChange:h,onUserMessage:PA,onSessionEstablished:d,onInitError:jA,perpetual:nA,initialSSESequenceNum:o=0,onTransportPersistenceReady:qQ,onTransportPersistenceTeardown:t}=A,a=++jhA,{writeBridgePointer:CA,clearBridgePointer:mA,readBridgePointer:lA}=await Promise.resolve().then(() => ($EA(),NEA)),BB=nA?await lA(Q):null,zQ=BB?.source==="repl"?BB:null;z(`[bridge:repl] initBridgeCore #${a} starting (initialMessages=${K?.length??0}${zQ?` perpetual prior=env:${zQ.environmentId}`:""})`);let vQ=Jd({baseUrl:J,getAccessToken:F,runnerVersion:"0.2.113",onDebug:z,onAuth401:V,getTrustedDeviceToken:X}),HB={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:DEA(),workerType:U,environmentId:DEA(),reuseEnvironmentId:zQ?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},IA,M0;try{let b=await vQ.registerBridgeEnvironment(HB);IA=b.environment_id,M0=b.environment_secret}catch(b){if(Yd("registration_failed",`[bridge:repl] Environment registration failed: ${FA(b)}`),jA?.(`[bridge:repl] Environment registration failed: ${FA(b)}`),zQ&&b instanceof TE&&(b.status===410||b.status!==401&&tX(b.errorType)))await mA(Q);return h?.("failed",FA(b)),null}z(`[bridge:repl] Environment registered: ${IA}`),l("info","bridge_repl_env_registered"),EQ("tengu_bridge_repl_env_registered",{});async function pJ(b,JA){if(IA!==b)return z(`[bridge:repl] Env mismatch (requested ${b}, got ${IA}) — cannot reconnect in place`),!1;let aA=nZ(JA),SA=aA===JA?[JA]:[JA,aA];for(let _Q of SA)try{return await vQ.reconnectSession(IA,_Q),z(`[bridge:repl] Reconnected session ${_Q} in place on env ${IA}`),!0}catch(XE){z(`[bridge:repl] reconnectSession(${_Q}) failed: ${FA(XE)}`)}return z("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let YA=zQ?await pJ(zQ.environmentId,zQ.sessionId):!1;if(zQ&&!YA)await mA(Q);let r,FQ=new Set,oA=new Set;if(YA&&zQ){if(r=zQ.sessionId,z(`[bridge:repl] Perpetual session reused: ${r}`),K&&R)for(let b of K)R.add(b.uuid)}else{let b=await N({environmentId:IA,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!b)return z("[bridge:repl] Session creation failed, deregistering environment"),jA?.("[bridge:repl] Session creation failed, deregistering environment"),EQ("tengu_bridge_repl_session_failed",{}),await vQ.deregisterEnvironment(IA).catch(()=>{}),h?.("failed","Session creation failed"),null;r=b,z(`[bridge:repl] Session created: ${r}`)}d?.(r),await CA(Q,{sessionId:r,environmentId:IA,source:"repl"}),l("info","bridge_repl_session_created"),EQ("tengu_bridge_repl_started",{has_initial_messages:!!(K&&K.length>0),inProtectedNamespace:Wx(),...Ud()});let DE=new Set;if(K)for(let b of K)DE.add(b.uuid);let HI=new sX(2000);for(let b of DE)HI.add(b);let w0=new sX(2000),tB=new AbortController,GA=null,IB=0,ZB=YA?o:0,rQ=null,JB=null,z0=GEA(tB.signal),iI=z0.wake,lJ=z0.signal,LB=new lj,K0=!PA,mF=3,WE=0,GB=null;async function sB(){if(GB)return GB;GB=dI();try{return await GB}finally{GB=null}}async function dI(){if(WE++,IB++,z(`[bridge:repl] Reconnecting after env lost (attempt ${WE}/${mF})`),WE>mF)return z(`[bridge:repl] Environment reconnect limit reached (${mF}), giving up`),!1;if(GA){let SA=GA.getLastSequenceNum();if(SA>ZB)ZB=SA;t?.(),GA.close(),GA=null}if(iI(),LB.drop(),rQ){let SA=rQ;if(await vQ.stopWork(IA,SA,!1).catch(()=>{}),rQ!==SA)return z("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),WE=0,!0;rQ=null,JB=null}if(tB.signal.aborted)return z("[bridge:repl] Reconnect aborted by teardown"),!1;let b=IA;HB.reuseEnvironmentId=b;try{let SA=await vQ.registerBridgeEnvironment(HB);IA=SA.environment_id,M0=SA.environment_secret}catch(SA){return HB.reuseEnvironmentId=void 0,z(`[bridge:repl] Environment re-registration failed: ${FA(SA)}`),!1}if(HB.reuseEnvironmentId=void 0,z(`[bridge:repl] Re-registered: requested=${b} got=${IA}`),tB.signal.aborted)return z("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await vQ.deregisterEnvironment(IA).catch(()=>{}),!1;if(GA!==null)return z("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),WE=0,!0;if(await pJ(b,r))return EQ("tengu_bridge_repl_reconnected_in_place",{}),WE=0,!0;if(IA!==b)EQ("tengu_bridge_repl_env_expired_fresh_session",{});if(await $(r),tB.signal.aborted)return z("[bridge:repl] Reconnect aborted after archive, cleaning up"),await vQ.deregisterEnvironment(IA).catch(()=>{}),!1;let JA=W(),aA=await N({environmentId:IA,title:JA,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!aA)return z("[bridge:repl] Session creation failed during reconnection"),!1;if(tB.signal.aborted)return z("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await $(aA),!1;if(r=aA,Ld(PU(aA)).catch(()=>{}),d?.(r),ZB=0,w0.clear(),K0=!PA,z(`[bridge:repl] Re-created session: ${r}`),await CA(Q,{sessionId:r,environmentId:IA,source:"repl"}),R?.clear(),FQ.size>0){z(`[bridge:repl] Replaying ${FQ.size} PR subscription(s) against new session`);for(let SA of FQ){let _Q=SA.lastIndexOf("#");s6("subscribe",r,SA.slice(0,_Q),Number(SA.slice(_Q+1)),J,F)}}if(oA.size>0){z(`[bridge:repl] Replaying ${oA.size} Slack thread subscription(s) against new session`);for(let SA of oA){let _Q=SA.indexOf("/");e6("subscribe",r,SA.slice(0,_Q),SA.slice(_Q+1),J,F)}}return WE=0,!0}function HC(){return F()}function H0(){let b=LB.end();if(b.length===0)return;if(!GA){z(`[bridge:repl] Cannot drain ${b.length} pending message(s): no transport`);return}for(let SA of b)HI.add(SA.uuid);let aA=D(b).map((SA)=>({...SA,session_id:r}));z(`[bridge:repl] Drained ${b.length} pending message(s) after flush`),GA.writeBatch(aA)}let CD=null;function B2(){CD?.()}function oj(b){if(z(`[bridge:repl] Transport permanently closed: code=${b}`),EQ("tengu_bridge_repl_ws_closed",{code:b}),GA){let aA=GA.getLastSequenceNum();if(aA>ZB)ZB=aA;t?.(),GA=null}iI();let JA=LB.drop();if(JA>0)z(`[bridge:repl] Dropping ${JA} pending message(s) on transport close (code=${b})`,{level:"warn"});if(b===1000){h?.("failed","session ended"),tB.abort(),B2();return}h?.("reconnecting",`Remote Control connection lost (code ${b})`),z(`[bridge:repl] Transport reconnect budget exhausted (code=${b}), attempting env reconnect`),sB().then((aA)=>{if(aA)return;if(tB.signal.aborted)return;z("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),EQ("tengu_bridge_repl_reconnect_failed",{close_code:b}),h?.("failed","reconnection failed"),B2()})}let aj,zEA=null,KEA={api:vQ,getCredentials:()=>({environmentId:IA,environmentSecret:M0}),signal:tB.signal,getPollIntervalConfig:M,onStateChange:h,getWsState:()=>GA?.getStateLabel()??"null",isAtCapacity:()=>GA!==null,capacitySignal:lJ,onFatalError:B2,getHeartbeatInfo:()=>{if(!rQ||!JB)return null;return{environmentId:IA,workId:rQ,sessionToken:JB}},onHeartbeatFatal:(b)=>{if(z(`[bridge:repl] heartbeatWork fatal (status=${b.status}) — tearing down work item for fast re-dispatch`),GA){let JA=GA.getLastSequenceNum();if(JA>ZB)ZB=JA;t?.(),GA.close(),GA=null}if(LB.drop(),rQ)vQ.stopWork(IA,rQ,!1).catch((JA)=>{z(`[bridge:repl] stopWork after heartbeat fatal: ${FA(JA)}`)});rQ=null,JB=null,iI(),h?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await sB())return null;return{environmentId:IA,environmentSecret:M0}},onWorkReceived:(b,JA,aA,SA)=>{if(GA?.isConnectedStatus())z(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${aA})`);if(z(`[bridge:repl] Work received: workId=${aA} workSessionId=${b} currentSessionId=${r} match=${iZ(b,r)}`),CA(Q,{sessionId:r,environmentId:IA,source:"repl"}),!iZ(b,r)){z(`[bridge:repl] Rejecting foreign session: expected=${r} got=${b}`);return}rQ=aA,JB=JA;let _Q=SA||QQ(process.env.CLAUDE_BRIDGE_USE_CCR_V2),XE;if(!_Q){if(XE=HC(),!XE){z("[bridge:repl] No OAuth token available for session ingress, skipping work");return}i4(XE)}if(EQ("tengu_bridge_repl_work_received",{}),GA){t?.();let pQ=GA;GA=null;let tQ=pQ.getLastSequenceNum();if(tQ>ZB)ZB=tQ;pQ.close()}LB.deactivate();let ZEA=(pQ)=>Wd(pQ,{transport:GA,sessionId:r,onInterrupt:_,onSetModel:f,onSetMaxThinkingTokens:e,onSetPermissionMode:DA,onRenameSession:_A,onFileSuggestions:WA}),Y2=!1,sj=(pQ)=>{if(GA=pQ,pQ.setOnConnect(()=>{if(GA!==pQ)return;if(z("[bridge:repl] Ingress transport connected"),EQ("tengu_bridge_repl_ws_connected",{}),!_Q){let tQ=HC();if(tQ)i4(tQ)}if(C2=!1,!Y2&&K&&K.length>0){Y2=!0;let tQ=L,eB=K.filter((YD)=>pZ(YD)&&!R?.has(YD.uuid)),ZC=tQ>0&&eB.length>tQ?eB.slice(-tQ):eB;if(ZC.length<eB.length)z(`[bridge:repl] Capped initial flush: ${eB.length} -> ${ZC.length} (cap=${tQ})`),EQ("tengu_bridge_repl_history_capped",{eligible_count:eB.length,capped_count:ZC.length});let Z0=D(ZC);if(Z0.length>0){z(`[bridge:repl] Flushing ${Z0.length} initial message(s) via transport`);let YD=Z0.map((iJ)=>({...iJ,session_id:r})),ej=pQ.droppedBatchCount;pQ.writeBatch(YD).then(()=>{if(pQ.droppedBatchCount>ej){z(`[bridge:repl] Initial flush dropped ${pQ.droppedBatchCount-ej} batch(es) — not marking ${Z0.length} UUID(s) as flushed`);return}if(R){for(let iJ of Z0)if(iJ.uuid)R.add(iJ.uuid)}}).catch((iJ)=>z(`[bridge:repl] Initial flush failed: ${iJ}`)).finally(()=>{if(GA!==pQ)return;H0(),h?.("connected")})}else H0(),h?.("connected")}else if(!LB.active)h?.("connected")}),pQ.setOnData((tQ)=>{Dd(tQ,HI,w0,O,g,ZEA)}),zEA=oj,pQ.setOnClose((tQ)=>{if(GA!==pQ)return;oj(tQ)}),!Y2&&K&&K.length>0)LB.start();pQ.connect()};if(IB++,_Q){let pQ=Md(J,b),tQ=IB;z(`[bridge:repl] CCR v2: sessionUrl=${pQ} session=${b} gen=${tQ}`),CEA({sessionUrl:pQ,ingressToken:JA,sessionId:b,initialSequenceNum:ZB}).then((eB)=>{if(tB.signal.aborted){eB.close();return}if(tQ!==IB){z(`[bridge:repl] CCR v2: discarding stale handshake gen=${tQ} current=${IB}`),eB.close();return}if(sj(eB),qQ){let ZC=eB.getInternalEventWriter?.(),Z0=eB.getInternalEventReaders?.();if(ZC&&Z0)qQ(ZC,Z0)}},(eB)=>{if(z(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${FA(eB)}`,{level:"error"}),EQ("tengu_bridge_repl_ccr_v2_init_failed",{}),tQ!==IB)return;if(rQ)vQ.stopWork(IA,rQ,!1).catch((ZC)=>{z(`[bridge:repl] stopWork after v2 init failure: ${FA(ZC)}`)}),rQ=null,JB=null;iI()})}else{let pQ=Vd(G,b);z(`[bridge:repl] Ingress URL: ${pQ}`),z(`[bridge:repl] Creating HybridTransport: session=${b}`);let tQ=XE??"";sj(EEA(new mj(new URL(pQ),{Authorization:`Bearer ${tQ}`,"anthropic-version":"2023-06-01"},b,()=>({Authorization:`Bearer ${HC()??tQ}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{h?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),iI()}})))}}};qhA(KEA);let I2=nA?setInterval(()=>{if(GB)return;CA(Q,{sessionId:r,environmentId:IA,source:"repl"})},3600000):null;I2?.unref?.();let rj=M().session_keepalive_interval_v2_ms,E2=rj>0?setInterval(()=>{if(!GA)return;z("[bridge:repl] keep_alive sent"),GA.write({type:"keep_alive"}).catch((b)=>{z(`[bridge:repl] keep_alive write failed: ${FA(b)}`)})},rj):null;E2?.unref?.();let C2=!1;CD=async()=>{if(C2){z(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${IA} session=${r}`);return}C2=!0,t?.();let b=Date.now();if(z(`[bridge:repl] Teardown starting: env=${IA} session=${r} workId=${rQ??"none"} transportState=${GA?.getStateLabel()??"null"}`),I2!==null)clearInterval(I2);if(E2!==null)clearInterval(E2);if(aj)process.off("SIGUSR2",aj);if(tB.abort(),z("[bridge:repl] Teardown: poll loop aborted"),GA){let SA=GA.getLastSequenceNum();if(SA>ZB)ZB=SA}if(nA){GA=null,LB.drop(),await CA(Q,{sessionId:r,environmentId:IA,source:"repl"}),z(`[bridge:repl] Teardown (perpetual): leaving env=${IA} session=${r} alive on server, duration=${Date.now()-b}ms`);return}let JA=GA;if(GA=null,LB.drop(),JA)JA.write(lZ(r));let aA=rQ?vQ.stopWork(IA,rQ,!0).then(()=>{z("[bridge:repl] Teardown: stopWork completed")}).catch((SA)=>{z(`[bridge:repl] Teardown stopWork failed: ${FA(SA)}`)}):Promise.resolve();await Promise.all([aA,$(r)]),JA?.close(),z("[bridge:repl] Teardown: transport closed"),await vQ.deregisterEnvironment(IA).catch((SA)=>{z(`[bridge:repl] Teardown deregister failed: ${FA(SA)}`)}),await mA(Q),z(`[bridge:repl] Teardown complete: env=${IA} duration=${Date.now()-b}ms`)};let HEA=_0(()=>CD?.());z(`[bridge:repl] Ready: env=${IA} session=${r}`),h?.("ready");let tj={get bridgeSessionId(){return r},get environmentId(){return IA},getSSESequenceNum(){let b=GA?.getLastSequenceNum()??0;return Math.max(ZB,b)},sessionIngressUrl:G,writeMessages(b){let JA=b.filter((_Q)=>pZ(_Q)&&!DE.has(_Q.uuid)&&!HI.has(_Q.uuid));if(JA.length===0)return;if(!K0)for(let _Q of JA){let XE=$d(_Q);if(XE!==void 0&&PA?.(XE,r)){K0=!0;break}}if(LB.enqueue(...JA)){z(`[bridge:repl] Queued ${JA.length} message(s) during initial flush`);return}if(!GA){let _Q=JA.map((XE)=>XE.type).join(",");z(`[bridge:repl] Transport not configured, dropping ${JA.length} message(s) [${_Q}] for session=${r}`,{level:"warn"});return}for(let _Q of JA)HI.add(_Q.uuid);z(`[bridge:repl] Sending ${JA.length} message(s) via transport`);let SA=D(JA).map((_Q)=>({..._Q,session_id:r}));GA.writeBatch(SA)},writeSdkMessages(b){let JA=b.filter((SA)=>!SA.uuid||!HI.has(SA.uuid));if(JA.length===0)return;if(!GA){z(`[bridge:repl] Transport not configured, dropping ${JA.length} SDK message(s) for session=${r}`,{level:"warn"});return}for(let SA of JA)if(SA.uuid)HI.add(SA.uuid);let aA=JA.map((SA)=>({...SA,session_id:r}));GA.writeBatch(aA)},sendControlRequest(b){if(!GA){z("[bridge:repl] Transport not configured, skipping control_request");return}let JA={...b,session_id:r};GA.write(JA),z(`[bridge:repl] Sent control_request request_id=${b.request_id}`)},sendControlResponse(b){if(!GA){z("[bridge:repl] Transport not configured, skipping control_response");return}let JA={...b,session_id:r};GA.write(JA),z("[bridge:repl] Sent control_response")},sendControlCancelRequest(b){if(!GA){z("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let JA={type:"control_cancel_request",request_id:b,session_id:r};GA.write(JA),z(`[bridge:repl] Sent control_cancel_request request_id=${b}`)},reportMetadata(b){GA?.reportMetadata(b)},sendResult(){if(!GA){z(`[bridge:repl] sendResult: skipping, transport not configured session=${r}`);return}GA.write(lZ(r)),z(`[bridge:repl] Sent result for session=${r}`)},async subscribePR(b,JA){let aA=await s6("subscribe",r,b,JA,J,F);if(aA)FQ.add(`${b}#${JA}`);return aA},async unsubscribePR(b,JA){let aA=await s6("unsubscribe",r,b,JA,J,F);if(aA)FQ.delete(`${b}#${JA}`);return aA},async subscribeSlackThread(b,JA){let aA=await e6("subscribe",r,b,JA,J,F);if(aA)oA.add(`${b}/${JA}`);return aA},async unsubscribeSlackThread(b,JA){let aA=await e6("unsubscribe",r,b,JA,J,F);if(aA)oA.delete(`${b}/${JA}`);return aA},async teardown(){HEA(),await CD?.(),z("[bridge:repl] Torn down"),EQ("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return tj.teardown()}};return tj}async function qhA({api:A,getCredentials:Q,signal:B,onStateChange:I,onWorkReceived:E,onEnvironmentLost:C,getWsState:Y,isAtCapacity:J,capacitySignal:G,onFatalError:U,getPollIntervalConfig:F=()=>W4,getHeartbeatInfo:N,onHeartbeatFatal:$}){z(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let D=0,V=null,X=null,M=0,L=!1;while(!B.aborted){let{environmentId:K,environmentSecret:R}=Q(),O=F();try{let g=await A.pollForWork(K,R,B,O.reclaim_older_than_ms);if(M=0,D>0)z(`[bridge:repl] Poll recovered after ${D} consecutive error(s)`),D=0,V=null,X=null,I?.("ready");if(!g){let f=L;if(L=!1,J?.()&&G&&!f){let e=O.poll_interval_ms_at_capacity;if(O.non_exclusive_heartbeat_interval_ms>0&&N){EQ("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:O.non_exclusive_heartbeat_interval_ms});let _A=e>0?Date.now()+e:null,WA=!1,h=0;while(!B.aborted&&J()&&(_A===null||Date.now()<_A)){let d=F();if(d.non_exclusive_heartbeat_interval_ms<=0)break;let jA=N();if(!jA)break;let nA=G();try{await A.heartbeatWork(jA.environmentId,jA.workId,jA.sessionToken)}catch(o){if(z(`[bridge:repl:heartbeat] Failed: ${FA(o)}`),o instanceof TE){if(nA.cleanup(),EQ("tengu_bridge_heartbeat_error",{status:o.status,error_type:o.status===401||o.status===403?"auth_failed":"fatal"}),$)$(o),z(`[bridge:repl:heartbeat] Fatal (status=${o.status}), work state cleared — fast-polling for re-dispatch`);else WA=!0;break}}h++,await AI(d.non_exclusive_heartbeat_interval_ms,nA.signal),nA.cleanup()}let PA=WA?"error":B.aborted?"shutdown":!J()?"capacity_changed":_A!==null&&Date.now()>=_A?"poll_due":"config_disabled";if(EQ("tengu_bridge_heartbeat_mode_exited",{reason:PA,heartbeat_cycles:h}),!WA){if(PA==="poll_due")z(`[bridge:repl] Heartbeat poll_due after ${h} cycles — falling through to pollForWork`);continue}}let DA=e>0?e:O.non_exclusive_heartbeat_interval_ms;if(DA>0){let _A=G(),WA=Date.now();await AI(DA,_A.signal),_A.cleanup();let h=Date.now()-WA-DA;if(h>60000)z(`[bridge:repl] At-capacity sleep overran by ${Math.round(h/1000)}s — process suspension detected, forcing one fast-poll cycle`),EQ("tengu_bridge_repl_suspension_detected",{overrun_ms:h}),L=!0}}else await AI(O.poll_interval_ms_not_at_capacity,B);continue}let _;try{_=Xd(g.secret)}catch(f){z(`[bridge:repl] Failed to decode work secret: ${FA(f)}`),EQ("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(K,g.id,!1).catch(()=>{});continue}z(`[bridge:repl] Acknowledging workId=${g.id}`);try{await A.acknowledgeWork(K,g.id,_.session_ingress_token)}catch(f){z(`[bridge:repl] Acknowledge failed workId=${g.id}: ${FA(f)}`)}if(g.data.type==="healthcheck"){z("[bridge:repl] Healthcheck received");continue}if(g.data.type==="session"){let f=g.data.id;try{DI(f,"session_id")}catch{z(`[bridge:repl] Invalid session_id in work: ${f}`);continue}E(f,_.session_ingress_token,g.id,_.use_code_sessions===!0),z("[bridge:repl] Work accepted, continuing poll loop")}}catch(g){if(B.aborted)break;if(g instanceof TE&&g.status===404&&C){let h=Q().environmentId;if(K!==h){z(`[bridge:repl] Stale poll error for old env=${K}, current env=${h} — skipping onEnvironmentLost`),D=0,V=null;continue}if(M++,z(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${M}/3)`),EQ("tengu_bridge_repl_env_lost",{attempt:M}),M>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 PA=await C();if(B.aborted)break;if(PA){D=0,V=null,I?.("ready"),z(`[bridge:repl] Re-registered environment: ${PA.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(g instanceof TE){let h=tX(g.errorType),PA=Gd(g);if(z(`[bridge:repl] Fatal poll error: ${g.message} (status=${g.status}, type=${g.errorType??"unknown"})${PA?" (suppressed)":""}`),EQ("tengu_bridge_repl_fatal_error",{status:g.status,error_type:g.errorType}),l(h?"info":"error","bridge_repl_fatal_error",{status:g.status,error_type:g.errorType}),!PA)I?.("failed",h?"session expired · /remote-control to reconnect":g.message);U?.();break}let _=Date.now();if(X!==null&&_-X>WEA*2)z(`[bridge:repl] Detected system sleep (${Math.round((_-X)/1000)}s gap), resetting poll error budget`),l("info","bridge_repl_poll_sleep_detected",{gapMs:_-X}),D=0,V=null;if(X=_,D++,V===null)V=_;let f=_-V,e=Cd(g),DA=Ed(g),_A=Y?.()??"unknown";if(z(`[bridge:repl] Poll error (attempt ${D}, elapsed ${Math.round(f/1000)}s, ws=${_A}): ${DA}`),EQ("tengu_bridge_repl_poll_error",{status:e,consecutiveErrors:D,elapsedMs:f}),D===1)I?.("reconnecting",DA);if(f>=XEA){z(`[bridge:repl] Poll failures exceeded ${XEA/1000}s (${D} errors), giving up`),l("info","bridge_repl_poll_give_up"),EQ("tengu_bridge_repl_poll_give_up",{consecutiveErrors:D,elapsedMs:f,lastStatus:e}),I?.("failed","connection to server lost");break}let WA=Math.min(RhA*2**(D-1),WEA);if(F().non_exclusive_heartbeat_interval_ms>0){let h=N?.();if(h)try{await A.heartbeatWork(h.environmentId,h.workId,h.sessionToken)}catch{}}await AI(WA,B)}}z(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function xhA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function OhA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function ghA(A,Q){if(OhA(A,Q))return"http://localhost:4000";if(xhA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function MEA(A,Q){let{toCompatSessionId:B}=OEA(zd),I=B(A);return`${ghA(I,Q)}/code/${I}`}ZQ();async function wEA(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,g=[],_=null,f=!1,e=null,DA={detail:null},_A=ShA(),WA=()=>VEA({dir:Q,registrationDir:B,machineName:_A,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:X,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:V,onInitError:console.error,createSession:({environmentId:o,title:qQ,signal:t})=>YEA({environmentId:o,title:qQ,tags:["claude-code-assistant"],signal:t},M),archiveSession:(o)=>JEA(o,M),perpetual:$,initialSSESequenceNum:W,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...W4,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(o){let qQ=Em(o);if(!qQ)return;L.push({content:qQ.content,uuid:qQ.uuid}),K?.(),K=null},onInterrupt(){R.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),O?.(),O=null},onSetModel(o){R.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:o}}),O?.(),O=null},onSetMaxThinkingTokens(o){R.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:o}}),O?.(),O=null},onPermissionResponse(o){g.push(o),_?.(),_=null},onStateChange(o,qQ){if(e?.(o,qQ),o==="failed")DA.detail=qQ??"unknown failure",f=!0,K?.(),O?.(),_?.()}}),h=await WA();if(!h&&D&&DA.detail?.includes("409")){if(await D({machineName:_A,message:DA.detail})==="takeover")f=!1,DA.detail=null,h=await WA()}if(!h){let o=DA.detail??"initBridgeCore returned null (env registration or session creation failed)";return z(`[bridge:daemon] connectRemoteControl failed: ${o}`),{ok:!1,error:{kind:DA.detail?.includes("409")?"conflict":DA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:o}}}async function*PA(){while(!f){while(L.length>0)if(yield L.shift(),f)return;await new Promise((o)=>{K=o})}}async function*d(){while(!f){while(R.length>0)if(yield R.shift(),f)return;await new Promise((o)=>{O=o})}}async function*jA(){while(!f){while(g.length>0)if(yield g.shift(),f)return;await new Promise((o)=>{_=o})}}return{ok:!0,handle:{get sessionUrl(){return MEA(h.bridgeSessionId,X)},get environmentId(){return h.environmentId},get bridgeSessionId(){return h.bridgeSessionId},getSSESequenceNum(){return h.getSSESequenceNum()},hasPendingPrompts(){return L.length>0},write(o){h.writeSdkMessages([o])},sendResult(){h.sendResult()},sendControlRequest(o){h.sendControlRequest(o)},sendControlResponse(o){h.sendControlResponse(o)},sendControlCancelRequest(o){h.sendControlCancelRequest(o)},inboundPrompts:PA,controlRequests:d,permissionResponses:jA,onStateChange(o){e=o},async teardown(){f=!0,K?.(),O?.(),_?.(),await h.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var _hA=1000,PhA=1e4,ThA=5000,bhA=60000,nj=3;function khA(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 yhA(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"&&Eq(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}async function fhA(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 wEA(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,g=null,_=0,f=!0,e=0,DA=Promise.resolve();function _A(){if(!G)return;let YA={claudeSessionId:M,lastSSESequenceNum:X.getSSESequenceNum(),bridgeSessionId:X.bridgeSessionId};DA=DA.then(()=>G.save(YA).catch((r)=>{$(`stateAdapter.save threw: ${r}`)}))}function WA(){if(K.length>0||X.hasPendingPrompts()){$("persist skipped: prompt queued");return}_A()}_A();let h=new AbortController,PA=new Map,d=null;function jA(){return d??=(async()=>{WA();for(let YA of PA.keys())X.sendControlCancelRequest(YA);PA.clear(),await X.teardown(),await DA})()}if(N.addEventListener("abort",()=>{h.abort(),jA().catch((YA)=>$(`teardown threw: ${YA}`))}),N.aborted)return await jA(),{ok:!1,error:{kind:"unknown",detail:"aborted before start"}};let nA="connected";X.onStateChange((YA,r)=>{if($(`bridge state=${YA} detail=${r??""}`),nA=YA,YA==="ready"&&X.bridgeSessionId!==L)L=X.bridgeSessionId,_A();else if(YA==="connected")WA();if(YA==="failed")$(`bridge failed: ${r??"unknown"}`),h.abort(),jA().catch((FQ)=>$(`teardown threw: ${FQ}`))});let o=I?.horizonMs??600000,qQ=I?.leadMs??ThA,t=null,a=!1,CA=!1,mA="";async function lA(){if(!I)return;let YA=await Qm(I.dir).catch((FQ)=>{return $(`computeCronHorizon threw: ${FQ}`),{nextFire:null,hasOverdue:!1}});t=YA.nextFire,CA=YA.hasOverdue;let r=YA.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(YA.nextFire).toISOString()} hasOverdue=${YA.hasOverdue}`;if(r!==mA)mA=r,$(r)}let BB;if(I)await lA(),BB=setInterval(lA,PhA),BB.unref?.();function zQ(YA){K.push({type:"user",message:{role:"user",content:YA},parent_tool_use_id:null,session_id:""}),R?.(),R=null}async function WB(YA,r,FQ){if(C){let IB=await C(YA,r,FQ);if(IB)return Y?.(YA,IB),IB}if(nA!=="connected"){$(`permission denied — bridge state=${nA}, request would drop`);let IB={behavior:"deny",message:`Cannot request permission: remote control is ${nA}. Try again in a moment.`};return Y?.(YA,IB),IB}let oA=vhA();$(`permission request tool=${YA} req=${oA}`);let{signal:DE,suggestions:HI,blockedPath:w0,toolUseID:tB}=FQ;X.sendControlRequest({type:"control_request",request_id:oA,request:{subtype:"can_use_tool",tool_name:YA,display_name:Cq(YA),input:r,tool_use_id:tB,...HI&&{permission_suggestions:HI},...w0&&{blocked_path:w0},..."decisionReason"in FQ&&FQ.decisionReason&&{decision_reason:FQ.decisionReason},..."agentID"in FQ&&FQ.agentID&&{agent_id:FQ.agentID}}});let GA;try{let IB=await new Promise((rQ,JB)=>{PA.set(oA,rQ),GA=setTimeout((z0,iI,lJ,LB,K0)=>{if(z0.delete(iI))lJ(`permission timeout req=${iI}`),LB.sendControlCancelRequest(iI),K0({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},bhA,PA,oA,$,X,rQ),GA.unref?.(),DE.addEventListener("abort",()=>{if(PA.delete(oA))X.sendControlCancelRequest(oA);JB(Error("aborted"))},{once:!0})});$(`permission response req=${oA} behavior=${IB.behavior}`);let ZB=IB.behavior==="allow"?{behavior:"allow",updatedInput:IB.updatedInput,updatedPermissions:IB.updatedPermissions}:{behavior:"deny",message:IB.message??"Denied via remote control"};return Y?.(YA,ZB),ZB}finally{if(GA)clearTimeout(GA);PA.delete(oA)}}let vQ=!1;async function HB(){if(g!==null||vQ||h.signal.aborted)return;if(vQ=!0,O=!1,K.length>0)f=!1;async function*YA(){while(!O){while(K.length>0)if(f=!1,yield K.shift(),O)return;await new Promise((oA)=>{R=oA})}}$(`spawning query resume=${M??"<fresh>"}`);let r={assistant:!0,cwd:Q.dir,resume:M,stderr:(oA)=>$(`[child] ${oA.trimEnd()}`),canUseTool:WB},FQ;try{if(FQ=await E(r),B)FQ={...FQ,env:{...FQ.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(oA){if($(`buildQueryOptions threw: ${oA}`),vQ=!1,e++,e>=nj)$(`${e} consecutive buildQueryOptions failures — dropping ${K.length} queued input(s)`),K.length=0;else if(K.length>0&&!h.signal.aborted)HB();return}if(h.signal.aborted){vQ=!1;return}try{g=Rh({prompt:YA(),options:FQ})}finally{vQ=!1}(async()=>{try{$("output pump started");for await(let oA of g){if(oA.type==="system"&&oA.subtype==="init"){if(oA.session_id!==M)M=oA.session_id,WA()}if(oA.type==="result")f=!0,e=0,a=!0,WA();if(!khA(oA))continue;let DE=J?J(oA):oA;if(DE===null)continue;X.write(DE)}}catch(oA){$(`query threw: ${oA}`),e++}finally{$("output pump ended"),g=null;for(let oA of PA.keys())X.sendControlCancelRequest(oA);if(PA.clear(),K.length>0&&!h.signal.aborted)if(e>=nj)$(`${e} consecutive crashes — dropping ${K.length} queued input(s)`),K.length=0;else HB()}})()}let IA=setInterval(()=>{let YA=Date.now(),r=t!==null&&t-YA<o;if(g===null){let FQ=t!==null&&t-YA<qQ;if((FQ||CA&&!a)&&e<nj&&!h.signal.aborted)$(FQ?`cron due in ${t-YA}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),HB();return}if(O)return;if(!f||K.length>0)return;if(YA-_<F)return;if(r)return;if(CA&&!a)return;$("idle conditions met → closing input gen"),WA(),O=!0,R?.(),R=null},_hA);if(IA.unref?.(),U)$("initialPrompt → injecting"),_=Date.now(),zQ(U),HB();let M0=(async()=>{if(await Promise.all([(async()=>{for await(let YA of X.inboundPrompts()){if(h.signal.aborted)return;if($("bridge prompt received"),_=Date.now(),YA.uuid)X.write({type:"user",uuid:YA.uuid,session_id:"",message:{role:"user",content:YA.content},parent_tool_use_id:null});zQ(YA.content),HB()}})(),(async()=>{for await(let YA of X.controlRequests()){if(h.signal.aborted)return;switch(YA.request.subtype){case"interrupt":$("bridge interrupt"),g?.interrupt();break;case"set_model":$(`bridge setModel=${YA.request.model??"<default>"}`),g?.setModel(YA.request.model);break;case"set_max_thinking_tokens":$(`bridge setMaxThinkingTokens=${YA.request.max_thinking_tokens}`),g?.setMaxThinkingTokens(YA.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let YA of X.permissionResponses()){if(h.signal.aborted)return;let r=yhA(YA,PA,X.sendControlCancelRequest);if(r)$(`permission response for unknown req=${r} (stale)`)}})()]),clearInterval(IA),BB)clearInterval(BB);g?.close(),await jA(),$("─── worker stop ───")})();return{ok:!0,handle:{get sessionUrl(){return X.sessionUrl},get bridgeSessionId(){return X.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(YA){_=Date.now(),zQ(YA),HB()},async interrupt(){await g?.interrupt()},done:M0,teardown:jA,[Symbol.asyncDispose]:jA}}}export{fhA 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<BhA){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(AhA*Math.pow(2,this.reconnectAttempts-1),QhA),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)`),l("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"}),l("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"}),l("error","cli_sse_liveness_timeout"),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,IhA)}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"),l("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":hF()};z(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=ED;I++){try{let C=await mQ.post(this.postUrl,A,{headers:B,validateStatus:GhA});if(C.status===200||C.status===201){z(`SSETransport: POST success type=${A.type}`);return}if(z(`SSETransport: POST ${C.status} body=${xA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){z(`SSETransport: POST returned ${C.status} (client error), not retrying`),l("warn","cli_sse_post_client_error",{status:C.status});return}z(`SSETransport: POST returned ${C.status}, attempt ${I}/${ED}`),l("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){z(`SSETransport: POST error: ${FA(C)}, attempt ${I}/${ED}`),l("warn","cli_sse_post_network_error",{attempt:I})}if(I===ED){z(`SSETransport: POST failed after ${ED} attempts, continuing`),l("warn","cli_sse_post_retries_exhausted");return}let E=Math.min(ChA*Math.pow(2,I-1),YhA);await AI(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 FhA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}ZQ();yQ();function EEA(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 CEA(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 i4(B);let J=A.epoch??await wd(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 pj(G,{},I,void 0,E,Y),F,N=new cj(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: ${FA(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: ${FA(V)}`,{level:"error"}),N.close(),U.close(),F?.(4091)})}}}ZQ();yQ();var NhA="2023-06-01",$hA="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 mQ.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:A2(U,J),signal:I,validateStatus:(W)=>W<500})}catch(W){return z(`[bridge] Session creation request failed: ${FA(W)}`),null}if(N.status!==200&&N.status!==201){let W=XJ(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 JEA(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 mQ.post(Y,{},{headers:A2(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)z(`[bridge] Session ${A} archived successfully`);else{let G=XJ(J.data);z(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){z(`[bridge] Session archive request failed: ${FA(J)}`)}}async function s6(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:PU(Q),repo:B,pr_number:I},U;try{U=await mQ.post(J,G,{headers:A2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-pr request failed: ${FA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=XJ(U.data);return z(`[bridge] ${A}-pr failed ${U.status}${N?`: ${N}`:""}`),!1}return z(`[bridge] ${A}-pr ${B}#${I} ok`),!0}async function e6(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:PU(Q),channel:B,thread_ts:I},U;try{U=await mQ.post(J,G,{headers:A2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-thread request failed: ${FA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=XJ(U.data);return z(`[bridge] ${A}-thread failed ${U.status}${N?`: ${N}`:""}`),!1}return z(`[bridge] ${A}-thread ${B}/${I} ok`),!0}function A2(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":NhA,"anthropic-beta":$hA};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}XB();function GEA(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 lj{_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}}yQ();ZQ();var RhA=2000,WEA=60000,XEA=900000,jhA=0;async function VEA(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=()=>W4,initialHistoryCap:L=200,initialMessages:K,previouslyFlushedUUIDs:R,onInboundMessage:O,onPermissionResponse:g,onInterrupt:_,onSetModel:f,onSetMaxThinkingTokens:e,onSetPermissionMode:DA,onRenameSession:_A,onFileSuggestions:WA,onStateChange:h,onUserMessage:PA,onSessionEstablished:d,onInitError:jA,perpetual:nA,initialSSESequenceNum:o=0,onTransportPersistenceReady:qQ,onTransportPersistenceTeardown:t}=A,a=++jhA,{writeBridgePointer:CA,clearBridgePointer:mA,readBridgePointer:lA}=await Promise.resolve().then(() => ($EA(),NEA)),BB=nA?await lA(Q):null,zQ=BB?.source==="repl"?BB:null;z(`[bridge:repl] initBridgeCore #${a} starting (initialMessages=${K?.length??0}${zQ?` perpetual prior=env:${zQ.environmentId}`:""})`);let vQ=Jd({baseUrl:J,getAccessToken:F,runnerVersion:"0.2.114",onDebug:z,onAuth401:V,getTrustedDeviceToken:X}),HB={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:DEA(),workerType:U,environmentId:DEA(),reuseEnvironmentId:zQ?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},IA,M0;try{let b=await vQ.registerBridgeEnvironment(HB);IA=b.environment_id,M0=b.environment_secret}catch(b){if(Yd("registration_failed",`[bridge:repl] Environment registration failed: ${FA(b)}`),jA?.(`[bridge:repl] Environment registration failed: ${FA(b)}`),zQ&&b instanceof TE&&(b.status===410||b.status!==401&&tX(b.errorType)))await mA(Q);return h?.("failed",FA(b)),null}z(`[bridge:repl] Environment registered: ${IA}`),l("info","bridge_repl_env_registered"),EQ("tengu_bridge_repl_env_registered",{});async function pJ(b,JA){if(IA!==b)return z(`[bridge:repl] Env mismatch (requested ${b}, got ${IA}) — cannot reconnect in place`),!1;let aA=nZ(JA),SA=aA===JA?[JA]:[JA,aA];for(let _Q of SA)try{return await vQ.reconnectSession(IA,_Q),z(`[bridge:repl] Reconnected session ${_Q} in place on env ${IA}`),!0}catch(XE){z(`[bridge:repl] reconnectSession(${_Q}) failed: ${FA(XE)}`)}return z("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let YA=zQ?await pJ(zQ.environmentId,zQ.sessionId):!1;if(zQ&&!YA)await mA(Q);let r,FQ=new Set,oA=new Set;if(YA&&zQ){if(r=zQ.sessionId,z(`[bridge:repl] Perpetual session reused: ${r}`),K&&R)for(let b of K)R.add(b.uuid)}else{let b=await N({environmentId:IA,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!b)return z("[bridge:repl] Session creation failed, deregistering environment"),jA?.("[bridge:repl] Session creation failed, deregistering environment"),EQ("tengu_bridge_repl_session_failed",{}),await vQ.deregisterEnvironment(IA).catch(()=>{}),h?.("failed","Session creation failed"),null;r=b,z(`[bridge:repl] Session created: ${r}`)}d?.(r),await CA(Q,{sessionId:r,environmentId:IA,source:"repl"}),l("info","bridge_repl_session_created"),EQ("tengu_bridge_repl_started",{has_initial_messages:!!(K&&K.length>0),inProtectedNamespace:Wx(),...Ud()});let DE=new Set;if(K)for(let b of K)DE.add(b.uuid);let HI=new sX(2000);for(let b of DE)HI.add(b);let w0=new sX(2000),tB=new AbortController,GA=null,IB=0,ZB=YA?o:0,rQ=null,JB=null,z0=GEA(tB.signal),iI=z0.wake,lJ=z0.signal,LB=new lj,K0=!PA,mF=3,WE=0,GB=null;async function sB(){if(GB)return GB;GB=dI();try{return await GB}finally{GB=null}}async function dI(){if(WE++,IB++,z(`[bridge:repl] Reconnecting after env lost (attempt ${WE}/${mF})`),WE>mF)return z(`[bridge:repl] Environment reconnect limit reached (${mF}), giving up`),!1;if(GA){let SA=GA.getLastSequenceNum();if(SA>ZB)ZB=SA;t?.(),GA.close(),GA=null}if(iI(),LB.drop(),rQ){let SA=rQ;if(await vQ.stopWork(IA,SA,!1).catch(()=>{}),rQ!==SA)return z("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),WE=0,!0;rQ=null,JB=null}if(tB.signal.aborted)return z("[bridge:repl] Reconnect aborted by teardown"),!1;let b=IA;HB.reuseEnvironmentId=b;try{let SA=await vQ.registerBridgeEnvironment(HB);IA=SA.environment_id,M0=SA.environment_secret}catch(SA){return HB.reuseEnvironmentId=void 0,z(`[bridge:repl] Environment re-registration failed: ${FA(SA)}`),!1}if(HB.reuseEnvironmentId=void 0,z(`[bridge:repl] Re-registered: requested=${b} got=${IA}`),tB.signal.aborted)return z("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await vQ.deregisterEnvironment(IA).catch(()=>{}),!1;if(GA!==null)return z("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),WE=0,!0;if(await pJ(b,r))return EQ("tengu_bridge_repl_reconnected_in_place",{}),WE=0,!0;if(IA!==b)EQ("tengu_bridge_repl_env_expired_fresh_session",{});if(await $(r),tB.signal.aborted)return z("[bridge:repl] Reconnect aborted after archive, cleaning up"),await vQ.deregisterEnvironment(IA).catch(()=>{}),!1;let JA=W(),aA=await N({environmentId:IA,title:JA,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!aA)return z("[bridge:repl] Session creation failed during reconnection"),!1;if(tB.signal.aborted)return z("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await $(aA),!1;if(r=aA,Ld(PU(aA)).catch(()=>{}),d?.(r),ZB=0,w0.clear(),K0=!PA,z(`[bridge:repl] Re-created session: ${r}`),await CA(Q,{sessionId:r,environmentId:IA,source:"repl"}),R?.clear(),FQ.size>0){z(`[bridge:repl] Replaying ${FQ.size} PR subscription(s) against new session`);for(let SA of FQ){let _Q=SA.lastIndexOf("#");s6("subscribe",r,SA.slice(0,_Q),Number(SA.slice(_Q+1)),J,F)}}if(oA.size>0){z(`[bridge:repl] Replaying ${oA.size} Slack thread subscription(s) against new session`);for(let SA of oA){let _Q=SA.indexOf("/");e6("subscribe",r,SA.slice(0,_Q),SA.slice(_Q+1),J,F)}}return WE=0,!0}function HC(){return F()}function H0(){let b=LB.end();if(b.length===0)return;if(!GA){z(`[bridge:repl] Cannot drain ${b.length} pending message(s): no transport`);return}for(let SA of b)HI.add(SA.uuid);let aA=D(b).map((SA)=>({...SA,session_id:r}));z(`[bridge:repl] Drained ${b.length} pending message(s) after flush`),GA.writeBatch(aA)}let CD=null;function B2(){CD?.()}function oj(b){if(z(`[bridge:repl] Transport permanently closed: code=${b}`),EQ("tengu_bridge_repl_ws_closed",{code:b}),GA){let aA=GA.getLastSequenceNum();if(aA>ZB)ZB=aA;t?.(),GA=null}iI();let JA=LB.drop();if(JA>0)z(`[bridge:repl] Dropping ${JA} pending message(s) on transport close (code=${b})`,{level:"warn"});if(b===1000){h?.("failed","session ended"),tB.abort(),B2();return}h?.("reconnecting",`Remote Control connection lost (code ${b})`),z(`[bridge:repl] Transport reconnect budget exhausted (code=${b}), attempting env reconnect`),sB().then((aA)=>{if(aA)return;if(tB.signal.aborted)return;z("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),EQ("tengu_bridge_repl_reconnect_failed",{close_code:b}),h?.("failed","reconnection failed"),B2()})}let aj,zEA=null,KEA={api:vQ,getCredentials:()=>({environmentId:IA,environmentSecret:M0}),signal:tB.signal,getPollIntervalConfig:M,onStateChange:h,getWsState:()=>GA?.getStateLabel()??"null",isAtCapacity:()=>GA!==null,capacitySignal:lJ,onFatalError:B2,getHeartbeatInfo:()=>{if(!rQ||!JB)return null;return{environmentId:IA,workId:rQ,sessionToken:JB}},onHeartbeatFatal:(b)=>{if(z(`[bridge:repl] heartbeatWork fatal (status=${b.status}) — tearing down work item for fast re-dispatch`),GA){let JA=GA.getLastSequenceNum();if(JA>ZB)ZB=JA;t?.(),GA.close(),GA=null}if(LB.drop(),rQ)vQ.stopWork(IA,rQ,!1).catch((JA)=>{z(`[bridge:repl] stopWork after heartbeat fatal: ${FA(JA)}`)});rQ=null,JB=null,iI(),h?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await sB())return null;return{environmentId:IA,environmentSecret:M0}},onWorkReceived:(b,JA,aA,SA)=>{if(GA?.isConnectedStatus())z(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${aA})`);if(z(`[bridge:repl] Work received: workId=${aA} workSessionId=${b} currentSessionId=${r} match=${iZ(b,r)}`),CA(Q,{sessionId:r,environmentId:IA,source:"repl"}),!iZ(b,r)){z(`[bridge:repl] Rejecting foreign session: expected=${r} got=${b}`);return}rQ=aA,JB=JA;let _Q=SA||QQ(process.env.CLAUDE_BRIDGE_USE_CCR_V2),XE;if(!_Q){if(XE=HC(),!XE){z("[bridge:repl] No OAuth token available for session ingress, skipping work");return}i4(XE)}if(EQ("tengu_bridge_repl_work_received",{}),GA){t?.();let pQ=GA;GA=null;let tQ=pQ.getLastSequenceNum();if(tQ>ZB)ZB=tQ;pQ.close()}LB.deactivate();let ZEA=(pQ)=>Wd(pQ,{transport:GA,sessionId:r,onInterrupt:_,onSetModel:f,onSetMaxThinkingTokens:e,onSetPermissionMode:DA,onRenameSession:_A,onFileSuggestions:WA}),Y2=!1,sj=(pQ)=>{if(GA=pQ,pQ.setOnConnect(()=>{if(GA!==pQ)return;if(z("[bridge:repl] Ingress transport connected"),EQ("tengu_bridge_repl_ws_connected",{}),!_Q){let tQ=HC();if(tQ)i4(tQ)}if(C2=!1,!Y2&&K&&K.length>0){Y2=!0;let tQ=L,eB=K.filter((YD)=>pZ(YD)&&!R?.has(YD.uuid)),ZC=tQ>0&&eB.length>tQ?eB.slice(-tQ):eB;if(ZC.length<eB.length)z(`[bridge:repl] Capped initial flush: ${eB.length} -> ${ZC.length} (cap=${tQ})`),EQ("tengu_bridge_repl_history_capped",{eligible_count:eB.length,capped_count:ZC.length});let Z0=D(ZC);if(Z0.length>0){z(`[bridge:repl] Flushing ${Z0.length} initial message(s) via transport`);let YD=Z0.map((iJ)=>({...iJ,session_id:r})),ej=pQ.droppedBatchCount;pQ.writeBatch(YD).then(()=>{if(pQ.droppedBatchCount>ej){z(`[bridge:repl] Initial flush dropped ${pQ.droppedBatchCount-ej} batch(es) — not marking ${Z0.length} UUID(s) as flushed`);return}if(R){for(let iJ of Z0)if(iJ.uuid)R.add(iJ.uuid)}}).catch((iJ)=>z(`[bridge:repl] Initial flush failed: ${iJ}`)).finally(()=>{if(GA!==pQ)return;H0(),h?.("connected")})}else H0(),h?.("connected")}else if(!LB.active)h?.("connected")}),pQ.setOnData((tQ)=>{Dd(tQ,HI,w0,O,g,ZEA)}),zEA=oj,pQ.setOnClose((tQ)=>{if(GA!==pQ)return;oj(tQ)}),!Y2&&K&&K.length>0)LB.start();pQ.connect()};if(IB++,_Q){let pQ=Md(J,b),tQ=IB;z(`[bridge:repl] CCR v2: sessionUrl=${pQ} session=${b} gen=${tQ}`),CEA({sessionUrl:pQ,ingressToken:JA,sessionId:b,initialSequenceNum:ZB}).then((eB)=>{if(tB.signal.aborted){eB.close();return}if(tQ!==IB){z(`[bridge:repl] CCR v2: discarding stale handshake gen=${tQ} current=${IB}`),eB.close();return}if(sj(eB),qQ){let ZC=eB.getInternalEventWriter?.(),Z0=eB.getInternalEventReaders?.();if(ZC&&Z0)qQ(ZC,Z0)}},(eB)=>{if(z(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${FA(eB)}`,{level:"error"}),EQ("tengu_bridge_repl_ccr_v2_init_failed",{}),tQ!==IB)return;if(rQ)vQ.stopWork(IA,rQ,!1).catch((ZC)=>{z(`[bridge:repl] stopWork after v2 init failure: ${FA(ZC)}`)}),rQ=null,JB=null;iI()})}else{let pQ=Vd(G,b);z(`[bridge:repl] Ingress URL: ${pQ}`),z(`[bridge:repl] Creating HybridTransport: session=${b}`);let tQ=XE??"";sj(EEA(new mj(new URL(pQ),{Authorization:`Bearer ${tQ}`,"anthropic-version":"2023-06-01"},b,()=>({Authorization:`Bearer ${HC()??tQ}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{h?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),iI()}})))}}};qhA(KEA);let I2=nA?setInterval(()=>{if(GB)return;CA(Q,{sessionId:r,environmentId:IA,source:"repl"})},3600000):null;I2?.unref?.();let rj=M().session_keepalive_interval_v2_ms,E2=rj>0?setInterval(()=>{if(!GA)return;z("[bridge:repl] keep_alive sent"),GA.write({type:"keep_alive"}).catch((b)=>{z(`[bridge:repl] keep_alive write failed: ${FA(b)}`)})},rj):null;E2?.unref?.();let C2=!1;CD=async()=>{if(C2){z(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${IA} session=${r}`);return}C2=!0,t?.();let b=Date.now();if(z(`[bridge:repl] Teardown starting: env=${IA} session=${r} workId=${rQ??"none"} transportState=${GA?.getStateLabel()??"null"}`),I2!==null)clearInterval(I2);if(E2!==null)clearInterval(E2);if(aj)process.off("SIGUSR2",aj);if(tB.abort(),z("[bridge:repl] Teardown: poll loop aborted"),GA){let SA=GA.getLastSequenceNum();if(SA>ZB)ZB=SA}if(nA){GA=null,LB.drop(),await CA(Q,{sessionId:r,environmentId:IA,source:"repl"}),z(`[bridge:repl] Teardown (perpetual): leaving env=${IA} session=${r} alive on server, duration=${Date.now()-b}ms`);return}let JA=GA;if(GA=null,LB.drop(),JA)JA.write(lZ(r));let aA=rQ?vQ.stopWork(IA,rQ,!0).then(()=>{z("[bridge:repl] Teardown: stopWork completed")}).catch((SA)=>{z(`[bridge:repl] Teardown stopWork failed: ${FA(SA)}`)}):Promise.resolve();await Promise.all([aA,$(r)]),JA?.close(),z("[bridge:repl] Teardown: transport closed"),await vQ.deregisterEnvironment(IA).catch((SA)=>{z(`[bridge:repl] Teardown deregister failed: ${FA(SA)}`)}),await mA(Q),z(`[bridge:repl] Teardown complete: env=${IA} duration=${Date.now()-b}ms`)};let HEA=_0(()=>CD?.());z(`[bridge:repl] Ready: env=${IA} session=${r}`),h?.("ready");let tj={get bridgeSessionId(){return r},get environmentId(){return IA},getSSESequenceNum(){let b=GA?.getLastSequenceNum()??0;return Math.max(ZB,b)},sessionIngressUrl:G,writeMessages(b){let JA=b.filter((_Q)=>pZ(_Q)&&!DE.has(_Q.uuid)&&!HI.has(_Q.uuid));if(JA.length===0)return;if(!K0)for(let _Q of JA){let XE=$d(_Q);if(XE!==void 0&&PA?.(XE,r)){K0=!0;break}}if(LB.enqueue(...JA)){z(`[bridge:repl] Queued ${JA.length} message(s) during initial flush`);return}if(!GA){let _Q=JA.map((XE)=>XE.type).join(",");z(`[bridge:repl] Transport not configured, dropping ${JA.length} message(s) [${_Q}] for session=${r}`,{level:"warn"});return}for(let _Q of JA)HI.add(_Q.uuid);z(`[bridge:repl] Sending ${JA.length} message(s) via transport`);let SA=D(JA).map((_Q)=>({..._Q,session_id:r}));GA.writeBatch(SA)},writeSdkMessages(b){let JA=b.filter((SA)=>!SA.uuid||!HI.has(SA.uuid));if(JA.length===0)return;if(!GA){z(`[bridge:repl] Transport not configured, dropping ${JA.length} SDK message(s) for session=${r}`,{level:"warn"});return}for(let SA of JA)if(SA.uuid)HI.add(SA.uuid);let aA=JA.map((SA)=>({...SA,session_id:r}));GA.writeBatch(aA)},sendControlRequest(b){if(!GA){z("[bridge:repl] Transport not configured, skipping control_request");return}let JA={...b,session_id:r};GA.write(JA),z(`[bridge:repl] Sent control_request request_id=${b.request_id}`)},sendControlResponse(b){if(!GA){z("[bridge:repl] Transport not configured, skipping control_response");return}let JA={...b,session_id:r};GA.write(JA),z("[bridge:repl] Sent control_response")},sendControlCancelRequest(b){if(!GA){z("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let JA={type:"control_cancel_request",request_id:b,session_id:r};GA.write(JA),z(`[bridge:repl] Sent control_cancel_request request_id=${b}`)},reportMetadata(b){GA?.reportMetadata(b)},sendResult(){if(!GA){z(`[bridge:repl] sendResult: skipping, transport not configured session=${r}`);return}GA.write(lZ(r)),z(`[bridge:repl] Sent result for session=${r}`)},async subscribePR(b,JA){let aA=await s6("subscribe",r,b,JA,J,F);if(aA)FQ.add(`${b}#${JA}`);return aA},async unsubscribePR(b,JA){let aA=await s6("unsubscribe",r,b,JA,J,F);if(aA)FQ.delete(`${b}#${JA}`);return aA},async subscribeSlackThread(b,JA){let aA=await e6("subscribe",r,b,JA,J,F);if(aA)oA.add(`${b}/${JA}`);return aA},async unsubscribeSlackThread(b,JA){let aA=await e6("unsubscribe",r,b,JA,J,F);if(aA)oA.delete(`${b}/${JA}`);return aA},async teardown(){HEA(),await CD?.(),z("[bridge:repl] Torn down"),EQ("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return tj.teardown()}};return tj}async function qhA({api:A,getCredentials:Q,signal:B,onStateChange:I,onWorkReceived:E,onEnvironmentLost:C,getWsState:Y,isAtCapacity:J,capacitySignal:G,onFatalError:U,getPollIntervalConfig:F=()=>W4,getHeartbeatInfo:N,onHeartbeatFatal:$}){z(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let D=0,V=null,X=null,M=0,L=!1;while(!B.aborted){let{environmentId:K,environmentSecret:R}=Q(),O=F();try{let g=await A.pollForWork(K,R,B,O.reclaim_older_than_ms);if(M=0,D>0)z(`[bridge:repl] Poll recovered after ${D} consecutive error(s)`),D=0,V=null,X=null,I?.("ready");if(!g){let f=L;if(L=!1,J?.()&&G&&!f){let e=O.poll_interval_ms_at_capacity;if(O.non_exclusive_heartbeat_interval_ms>0&&N){EQ("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:O.non_exclusive_heartbeat_interval_ms});let _A=e>0?Date.now()+e:null,WA=!1,h=0;while(!B.aborted&&J()&&(_A===null||Date.now()<_A)){let d=F();if(d.non_exclusive_heartbeat_interval_ms<=0)break;let jA=N();if(!jA)break;let nA=G();try{await A.heartbeatWork(jA.environmentId,jA.workId,jA.sessionToken)}catch(o){if(z(`[bridge:repl:heartbeat] Failed: ${FA(o)}`),o instanceof TE){if(nA.cleanup(),EQ("tengu_bridge_heartbeat_error",{status:o.status,error_type:o.status===401||o.status===403?"auth_failed":"fatal"}),$)$(o),z(`[bridge:repl:heartbeat] Fatal (status=${o.status}), work state cleared — fast-polling for re-dispatch`);else WA=!0;break}}h++,await AI(d.non_exclusive_heartbeat_interval_ms,nA.signal),nA.cleanup()}let PA=WA?"error":B.aborted?"shutdown":!J()?"capacity_changed":_A!==null&&Date.now()>=_A?"poll_due":"config_disabled";if(EQ("tengu_bridge_heartbeat_mode_exited",{reason:PA,heartbeat_cycles:h}),!WA){if(PA==="poll_due")z(`[bridge:repl] Heartbeat poll_due after ${h} cycles — falling through to pollForWork`);continue}}let DA=e>0?e:O.non_exclusive_heartbeat_interval_ms;if(DA>0){let _A=G(),WA=Date.now();await AI(DA,_A.signal),_A.cleanup();let h=Date.now()-WA-DA;if(h>60000)z(`[bridge:repl] At-capacity sleep overran by ${Math.round(h/1000)}s — process suspension detected, forcing one fast-poll cycle`),EQ("tengu_bridge_repl_suspension_detected",{overrun_ms:h}),L=!0}}else await AI(O.poll_interval_ms_not_at_capacity,B);continue}let _;try{_=Xd(g.secret)}catch(f){z(`[bridge:repl] Failed to decode work secret: ${FA(f)}`),EQ("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(K,g.id,!1).catch(()=>{});continue}z(`[bridge:repl] Acknowledging workId=${g.id}`);try{await A.acknowledgeWork(K,g.id,_.session_ingress_token)}catch(f){z(`[bridge:repl] Acknowledge failed workId=${g.id}: ${FA(f)}`)}if(g.data.type==="healthcheck"){z("[bridge:repl] Healthcheck received");continue}if(g.data.type==="session"){let f=g.data.id;try{DI(f,"session_id")}catch{z(`[bridge:repl] Invalid session_id in work: ${f}`);continue}E(f,_.session_ingress_token,g.id,_.use_code_sessions===!0),z("[bridge:repl] Work accepted, continuing poll loop")}}catch(g){if(B.aborted)break;if(g instanceof TE&&g.status===404&&C){let h=Q().environmentId;if(K!==h){z(`[bridge:repl] Stale poll error for old env=${K}, current env=${h} — skipping onEnvironmentLost`),D=0,V=null;continue}if(M++,z(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${M}/3)`),EQ("tengu_bridge_repl_env_lost",{attempt:M}),M>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 PA=await C();if(B.aborted)break;if(PA){D=0,V=null,I?.("ready"),z(`[bridge:repl] Re-registered environment: ${PA.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(g instanceof TE){let h=tX(g.errorType),PA=Gd(g);if(z(`[bridge:repl] Fatal poll error: ${g.message} (status=${g.status}, type=${g.errorType??"unknown"})${PA?" (suppressed)":""}`),EQ("tengu_bridge_repl_fatal_error",{status:g.status,error_type:g.errorType}),l(h?"info":"error","bridge_repl_fatal_error",{status:g.status,error_type:g.errorType}),!PA)I?.("failed",h?"session expired · /remote-control to reconnect":g.message);U?.();break}let _=Date.now();if(X!==null&&_-X>WEA*2)z(`[bridge:repl] Detected system sleep (${Math.round((_-X)/1000)}s gap), resetting poll error budget`),l("info","bridge_repl_poll_sleep_detected",{gapMs:_-X}),D=0,V=null;if(X=_,D++,V===null)V=_;let f=_-V,e=Cd(g),DA=Ed(g),_A=Y?.()??"unknown";if(z(`[bridge:repl] Poll error (attempt ${D}, elapsed ${Math.round(f/1000)}s, ws=${_A}): ${DA}`),EQ("tengu_bridge_repl_poll_error",{status:e,consecutiveErrors:D,elapsedMs:f}),D===1)I?.("reconnecting",DA);if(f>=XEA){z(`[bridge:repl] Poll failures exceeded ${XEA/1000}s (${D} errors), giving up`),l("info","bridge_repl_poll_give_up"),EQ("tengu_bridge_repl_poll_give_up",{consecutiveErrors:D,elapsedMs:f,lastStatus:e}),I?.("failed","connection to server lost");break}let WA=Math.min(RhA*2**(D-1),WEA);if(F().non_exclusive_heartbeat_interval_ms>0){let h=N?.();if(h)try{await A.heartbeatWork(h.environmentId,h.workId,h.sessionToken)}catch{}}await AI(WA,B)}}z(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function xhA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function OhA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function ghA(A,Q){if(OhA(A,Q))return"http://localhost:4000";if(xhA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function MEA(A,Q){let{toCompatSessionId:B}=OEA(zd),I=B(A);return`${ghA(I,Q)}/code/${I}`}ZQ();async function wEA(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,g=[],_=null,f=!1,e=null,DA={detail:null},_A=ShA(),WA=()=>VEA({dir:Q,registrationDir:B,machineName:_A,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:X,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:V,onInitError:console.error,createSession:({environmentId:o,title:qQ,signal:t})=>YEA({environmentId:o,title:qQ,tags:["claude-code-assistant"],signal:t},M),archiveSession:(o)=>JEA(o,M),perpetual:$,initialSSESequenceNum:W,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...W4,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(o){let qQ=Em(o);if(!qQ)return;L.push({content:qQ.content,uuid:qQ.uuid}),K?.(),K=null},onInterrupt(){R.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),O?.(),O=null},onSetModel(o){R.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:o}}),O?.(),O=null},onSetMaxThinkingTokens(o){R.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:o}}),O?.(),O=null},onPermissionResponse(o){g.push(o),_?.(),_=null},onStateChange(o,qQ){if(e?.(o,qQ),o==="failed")DA.detail=qQ??"unknown failure",f=!0,K?.(),O?.(),_?.()}}),h=await WA();if(!h&&D&&DA.detail?.includes("409")){if(await D({machineName:_A,message:DA.detail})==="takeover")f=!1,DA.detail=null,h=await WA()}if(!h){let o=DA.detail??"initBridgeCore returned null (env registration or session creation failed)";return z(`[bridge:daemon] connectRemoteControl failed: ${o}`),{ok:!1,error:{kind:DA.detail?.includes("409")?"conflict":DA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:o}}}async function*PA(){while(!f){while(L.length>0)if(yield L.shift(),f)return;await new Promise((o)=>{K=o})}}async function*d(){while(!f){while(R.length>0)if(yield R.shift(),f)return;await new Promise((o)=>{O=o})}}async function*jA(){while(!f){while(g.length>0)if(yield g.shift(),f)return;await new Promise((o)=>{_=o})}}return{ok:!0,handle:{get sessionUrl(){return MEA(h.bridgeSessionId,X)},get environmentId(){return h.environmentId},get bridgeSessionId(){return h.bridgeSessionId},getSSESequenceNum(){return h.getSSESequenceNum()},hasPendingPrompts(){return L.length>0},write(o){h.writeSdkMessages([o])},sendResult(){h.sendResult()},sendControlRequest(o){h.sendControlRequest(o)},sendControlResponse(o){h.sendControlResponse(o)},sendControlCancelRequest(o){h.sendControlCancelRequest(o)},inboundPrompts:PA,controlRequests:d,permissionResponses:jA,onStateChange(o){e=o},async teardown(){f=!0,K?.(),O?.(),_?.(),await h.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var _hA=1000,PhA=1e4,ThA=5000,bhA=60000,nj=3;function khA(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 yhA(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"&&Eq(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}async function fhA(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 wEA(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,g=null,_=0,f=!0,e=0,DA=Promise.resolve();function _A(){if(!G)return;let YA={claudeSessionId:M,lastSSESequenceNum:X.getSSESequenceNum(),bridgeSessionId:X.bridgeSessionId};DA=DA.then(()=>G.save(YA).catch((r)=>{$(`stateAdapter.save threw: ${r}`)}))}function WA(){if(K.length>0||X.hasPendingPrompts()){$("persist skipped: prompt queued");return}_A()}_A();let h=new AbortController,PA=new Map,d=null;function jA(){return d??=(async()=>{WA();for(let YA of PA.keys())X.sendControlCancelRequest(YA);PA.clear(),await X.teardown(),await DA})()}if(N.addEventListener("abort",()=>{h.abort(),jA().catch((YA)=>$(`teardown threw: ${YA}`))}),N.aborted)return await jA(),{ok:!1,error:{kind:"unknown",detail:"aborted before start"}};let nA="connected";X.onStateChange((YA,r)=>{if($(`bridge state=${YA} detail=${r??""}`),nA=YA,YA==="ready"&&X.bridgeSessionId!==L)L=X.bridgeSessionId,_A();else if(YA==="connected")WA();if(YA==="failed")$(`bridge failed: ${r??"unknown"}`),h.abort(),jA().catch((FQ)=>$(`teardown threw: ${FQ}`))});let o=I?.horizonMs??600000,qQ=I?.leadMs??ThA,t=null,a=!1,CA=!1,mA="";async function lA(){if(!I)return;let YA=await Qm(I.dir).catch((FQ)=>{return $(`computeCronHorizon threw: ${FQ}`),{nextFire:null,hasOverdue:!1}});t=YA.nextFire,CA=YA.hasOverdue;let r=YA.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(YA.nextFire).toISOString()} hasOverdue=${YA.hasOverdue}`;if(r!==mA)mA=r,$(r)}let BB;if(I)await lA(),BB=setInterval(lA,PhA),BB.unref?.();function zQ(YA){K.push({type:"user",message:{role:"user",content:YA},parent_tool_use_id:null,session_id:""}),R?.(),R=null}async function WB(YA,r,FQ){if(C){let IB=await C(YA,r,FQ);if(IB)return Y?.(YA,IB),IB}if(nA!=="connected"){$(`permission denied — bridge state=${nA}, request would drop`);let IB={behavior:"deny",message:`Cannot request permission: remote control is ${nA}. Try again in a moment.`};return Y?.(YA,IB),IB}let oA=vhA();$(`permission request tool=${YA} req=${oA}`);let{signal:DE,suggestions:HI,blockedPath:w0,toolUseID:tB}=FQ;X.sendControlRequest({type:"control_request",request_id:oA,request:{subtype:"can_use_tool",tool_name:YA,display_name:Cq(YA),input:r,tool_use_id:tB,...HI&&{permission_suggestions:HI},...w0&&{blocked_path:w0},..."decisionReason"in FQ&&FQ.decisionReason&&{decision_reason:FQ.decisionReason},..."agentID"in FQ&&FQ.agentID&&{agent_id:FQ.agentID}}});let GA;try{let IB=await new Promise((rQ,JB)=>{PA.set(oA,rQ),GA=setTimeout((z0,iI,lJ,LB,K0)=>{if(z0.delete(iI))lJ(`permission timeout req=${iI}`),LB.sendControlCancelRequest(iI),K0({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},bhA,PA,oA,$,X,rQ),GA.unref?.(),DE.addEventListener("abort",()=>{if(PA.delete(oA))X.sendControlCancelRequest(oA);JB(Error("aborted"))},{once:!0})});$(`permission response req=${oA} behavior=${IB.behavior}`);let ZB=IB.behavior==="allow"?{behavior:"allow",updatedInput:IB.updatedInput,updatedPermissions:IB.updatedPermissions}:{behavior:"deny",message:IB.message??"Denied via remote control"};return Y?.(YA,ZB),ZB}finally{if(GA)clearTimeout(GA);PA.delete(oA)}}let vQ=!1;async function HB(){if(g!==null||vQ||h.signal.aborted)return;if(vQ=!0,O=!1,K.length>0)f=!1;async function*YA(){while(!O){while(K.length>0)if(f=!1,yield K.shift(),O)return;await new Promise((oA)=>{R=oA})}}$(`spawning query resume=${M??"<fresh>"}`);let r={assistant:!0,cwd:Q.dir,resume:M,stderr:(oA)=>$(`[child] ${oA.trimEnd()}`),canUseTool:WB},FQ;try{if(FQ=await E(r),B)FQ={...FQ,env:{...FQ.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(oA){if($(`buildQueryOptions threw: ${oA}`),vQ=!1,e++,e>=nj)$(`${e} consecutive buildQueryOptions failures — dropping ${K.length} queued input(s)`),K.length=0;else if(K.length>0&&!h.signal.aborted)HB();return}if(h.signal.aborted){vQ=!1;return}try{g=Rh({prompt:YA(),options:FQ})}finally{vQ=!1}(async()=>{try{$("output pump started");for await(let oA of g){if(oA.type==="system"&&oA.subtype==="init"){if(oA.session_id!==M)M=oA.session_id,WA()}if(oA.type==="result")f=!0,e=0,a=!0,WA();if(!khA(oA))continue;let DE=J?J(oA):oA;if(DE===null)continue;X.write(DE)}}catch(oA){$(`query threw: ${oA}`),e++}finally{$("output pump ended"),g=null;for(let oA of PA.keys())X.sendControlCancelRequest(oA);if(PA.clear(),K.length>0&&!h.signal.aborted)if(e>=nj)$(`${e} consecutive crashes — dropping ${K.length} queued input(s)`),K.length=0;else HB()}})()}let IA=setInterval(()=>{let YA=Date.now(),r=t!==null&&t-YA<o;if(g===null){let FQ=t!==null&&t-YA<qQ;if((FQ||CA&&!a)&&e<nj&&!h.signal.aborted)$(FQ?`cron due in ${t-YA}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),HB();return}if(O)return;if(!f||K.length>0)return;if(YA-_<F)return;if(r)return;if(CA&&!a)return;$("idle conditions met → closing input gen"),WA(),O=!0,R?.(),R=null},_hA);if(IA.unref?.(),U)$("initialPrompt → injecting"),_=Date.now(),zQ(U),HB();let M0=(async()=>{if(await Promise.all([(async()=>{for await(let YA of X.inboundPrompts()){if(h.signal.aborted)return;if($("bridge prompt received"),_=Date.now(),YA.uuid)X.write({type:"user",uuid:YA.uuid,session_id:"",message:{role:"user",content:YA.content},parent_tool_use_id:null});zQ(YA.content),HB()}})(),(async()=>{for await(let YA of X.controlRequests()){if(h.signal.aborted)return;switch(YA.request.subtype){case"interrupt":$("bridge interrupt"),g?.interrupt();break;case"set_model":$(`bridge setModel=${YA.request.model??"<default>"}`),g?.setModel(YA.request.model);break;case"set_max_thinking_tokens":$(`bridge setMaxThinkingTokens=${YA.request.max_thinking_tokens}`),g?.setMaxThinkingTokens(YA.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let YA of X.permissionResponses()){if(h.signal.aborted)return;let r=yhA(YA,PA,X.sendControlCancelRequest);if(r)$(`permission response for unknown req=${r} (stale)`)}})()]),clearInterval(IA),BB)clearInterval(BB);g?.close(),await jA(),$("─── worker stop ───")})();return{ok:!0,handle:{get sessionUrl(){return X.sessionUrl},get bridgeSessionId(){return X.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(YA){_=Date.now(),zQ(YA),HB()},async interrupt(){await g?.interrupt()},done:M0,teardown:jA,[Symbol.asyncDispose]:jA}}}export{fhA as runAssistantWorker};
|