@anthropic-ai/claude-agent-sdk 0.2.111 → 0.2.112
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/cli.js +1532 -1532
- package/manifest.json +14 -14
- package/manifest.zst.json +22 -22
- package/package.json +2 -2
- 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.112
|
|
4
4
|
import{createRequire as os}from"node:module";var ms=Object.create;var{getPrototypeOf:us,defineProperty:vU,getOwnPropertyNames:RL,getOwnPropertyDescriptor:cs}=Object,jL=Object.prototype.hasOwnProperty;function gL(A){return this[A]}var ps,ls,_I=(A,Q,B)=>{var I=A!=null&&typeof A==="object";if(I){var E=Q?ps??=new WeakMap:ls??=new WeakMap,C=E.get(A);if(C)return C}B=A!=null?ms(us(A)):{};let Y=Q||!A||!A.__esModule?vU(B,"default",{value:A,enumerable:!0}):B;for(let J of RL(A))if(!jL.call(Y,J))vU(Y,J,{get:gL.bind(A,J),enumerable:!0});if(I)E.set(A,Y);return Y},is=(A)=>{var Q=(xL??=new WeakMap).get(A),B;if(Q)return Q;if(Q=vU({},"__esModule",{value:!0}),A&&typeof A==="object"||typeof A==="function"){for(var I of RL(A))if(!jL.call(Q,I))vU(Q,I,{get:gL.bind(A,I),enumerable:!(B=cs(A,I))||B.enumerable})}return xL.set(A,Q),Q},xL,w=(A,Q)=>()=>(Q||A((Q={exports:{}}).exports,Q),Q.exports);var ds=(A)=>A;function ns(A,Q){this[A]=ds.bind(null,Q)}var eI=(A,Q)=>{for(var B in Q)vU(A,B,{get:Q[B],enumerable:!0,configurable:!0,set:ns.bind(Q,B)})};var H=(A,Q)=>()=>(A&&(Q=A(A=0)),Q);var j=os(import.meta.url),as=Symbol.dispose||Symbol.for("Symbol.dispose"),rs=Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose"),DQ=(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[rs];if(I===void 0)I=Q[as];if(typeof I!=="function")throw TypeError("Object not disposable");A.push([B,I,Q])}else if(B)A.push([B]);return Q},$Q=(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 lA(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 CJ(){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 m4=()=>{};var Qe,SL;var _L=H(()=>{Qe=typeof global=="object"&&global&&global.Object===Object&&global,SL=Qe});var Be,Ie,YJ;var u4=H(()=>{_L();Be=typeof self=="object"&&self&&self.Object===Object&&self,Ie=SL||Be||Function("return this")(),YJ=Ie});var Ee,JJ;var q2=H(()=>{u4();Ee=YJ.Symbol,JJ=Ee});function Je(A){var Q=Ce.call(A,bU),B=A[bU];try{A[bU]=void 0;var I=!0}catch(C){}var E=Ye.call(A);if(I)if(Q)A[bU]=B;else delete A[bU];return E}var PL,Ce,Ye,bU,vL;var TL=H(()=>{q2();PL=Object.prototype,Ce=PL.hasOwnProperty,Ye=PL.toString,bU=JJ?JJ.toStringTag:void 0;vL=Je});function Fe(A){return Ue.call(A)}var Ge,Ue,kL;var bL=H(()=>{Ge=Object.prototype,Ue=Ge.toString;kL=Fe});function $e(A){if(A==null)return A===void 0?De:Ne;return yL&&yL in Object(A)?vL(A):kL(A)}var Ne="[object Null]",De="[object Undefined]",yL,fL;var hL=H(()=>{q2();TL();bL();yL=JJ?JJ.toStringTag:void 0;fL=$e});function We(A){var Q=typeof A;return A!=null&&(Q=="object"||Q=="function")}var c4;var O2=H(()=>{c4=We});function we(A){if(!c4(A))return!1;var Q=fL(A);return Q==Xe||Q==Me||Q==Ve||Q==Ze}var Ve="[object AsyncFunction]",Xe="[object Function]",Me="[object GeneratorFunction]",Ze="[object Proxy]",mL;var uL=H(()=>{hL();O2();mL=we});var ze,p4;var cL=H(()=>{u4();ze=YJ["__core-js_shared__"],p4=ze});function Ke(A){return!!pL&&pL in A}var pL,lL;var iL=H(()=>{cL();pL=function(){var A=/[^.]+$/.exec(p4&&p4.keys&&p4.keys.IE_PROTO||"");return A?"Symbol(src)_1."+A:""}();lL=Ke});function xe(A){if(A!=null){try{return Le.call(A)}catch(Q){}try{return A+""}catch(Q){}}return""}var He,Le,dL;var nL=H(()=>{He=Function.prototype,Le=He.toString;dL=xe});function Pe(A){if(!c4(A)||lL(A))return!1;var Q=mL(A)?_e:je;return Q.test(dL(A))}var Re,je,ge,qe,Oe,Se,_e,oL;var aL=H(()=>{uL();iL();O2();nL();Re=/[\\^$.*+?()[\]{}|]/g,je=/^\[object .+?Constructor\]$/,ge=Function.prototype,qe=Object.prototype,Oe=ge.toString,Se=qe.hasOwnProperty,_e=RegExp("^"+Oe.call(Se).replace(Re,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");oL=Pe});function ve(A,Q){return A==null?void 0:A[Q]}var rL;var tL=H(()=>{rL=ve});function Te(A,Q){var B=rL(A,Q);return oL(B)?B:void 0}var l4;var S2=H(()=>{aL();tL();l4=Te});var ke,eE;var yU=H(()=>{S2();ke=l4(Object,"create"),eE=ke});function be(){this.__data__=eE?eE(null):{},this.size=0}var sL;var eL=H(()=>{yU();sL=be});function ye(A){var Q=this.has(A)&&delete this.__data__[A];return this.size-=Q?1:0,Q}var Ax;var Qx=H(()=>{Ax=ye});function ue(A){var Q=this.__data__;if(eE){var B=Q[A];return B===fe?void 0:B}return me.call(Q,A)?Q[A]:void 0}var fe="__lodash_hash_undefined__",he,me,Bx;var Ix=H(()=>{yU();he=Object.prototype,me=he.hasOwnProperty;Bx=ue});function le(A){var Q=this.__data__;return eE?Q[A]!==void 0:pe.call(Q,A)}var ce,pe,Ex;var Cx=H(()=>{yU();ce=Object.prototype,pe=ce.hasOwnProperty;Ex=le});function de(A,Q){var B=this.__data__;return this.size+=this.has(A)?0:1,B[A]=eE&&Q===void 0?ie:Q,this}var ie="__lodash_hash_undefined__",Yx;var Jx=H(()=>{yU();Yx=de});function GJ(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 _2;var Gx=H(()=>{eL();Qx();Ix();Cx();Jx();GJ.prototype.clear=sL;GJ.prototype.delete=Ax;GJ.prototype.get=Bx;GJ.prototype.has=Ex;GJ.prototype.set=Yx;_2=GJ});function ne(){this.__data__=[],this.size=0}var Ux;var Fx=H(()=>{Ux=ne});function oe(A,Q){return A===Q||A!==A&&Q!==Q}var Nx;var Dx=H(()=>{Nx=oe});function ae(A,Q){var B=A.length;while(B--)if(Nx(A[B][0],Q))return B;return-1}var aC;var fU=H(()=>{Dx();aC=ae});function se(A){var Q=this.__data__,B=aC(Q,A);if(B<0)return!1;var I=Q.length-1;if(B==I)Q.pop();else te.call(Q,B,1);return--this.size,!0}var re,te,$x;var Wx=H(()=>{fU();re=Array.prototype,te=re.splice;$x=se});function ee(A){var Q=this.__data__,B=aC(Q,A);return B<0?void 0:Q[B][1]}var Vx;var Xx=H(()=>{fU();Vx=ee});function AAA(A){return aC(this.__data__,A)>-1}var Mx;var Zx=H(()=>{fU();Mx=AAA});function QAA(A,Q){var B=this.__data__,I=aC(B,A);if(I<0)++this.size,B.push([A,Q]);else B[I][1]=Q;return this}var wx;var zx=H(()=>{fU();wx=QAA});function UJ(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 Kx;var Hx=H(()=>{Fx();Wx();Xx();Zx();zx();UJ.prototype.clear=Ux;UJ.prototype.delete=$x;UJ.prototype.get=Vx;UJ.prototype.has=Mx;UJ.prototype.set=wx;Kx=UJ});var BAA,Lx;var xx=H(()=>{S2();u4();BAA=l4(YJ,"Map"),Lx=BAA});function IAA(){this.size=0,this.__data__={hash:new _2,map:new(Lx||Kx),string:new _2}}var Rx;var jx=H(()=>{Gx();Hx();xx();Rx=IAA});function EAA(A){var Q=typeof A;return Q=="string"||Q=="number"||Q=="symbol"||Q=="boolean"?A!=="__proto__":A===null}var gx;var qx=H(()=>{gx=EAA});function CAA(A,Q){var B=A.__data__;return gx(Q)?B[typeof Q=="string"?"string":"hash"]:B.map}var rC;var hU=H(()=>{qx();rC=CAA});function YAA(A){var Q=rC(this,A).delete(A);return this.size-=Q?1:0,Q}var Ox;var Sx=H(()=>{hU();Ox=YAA});function JAA(A){return rC(this,A).get(A)}var _x;var Px=H(()=>{hU();_x=JAA});function GAA(A){return rC(this,A).has(A)}var vx;var Tx=H(()=>{hU();vx=GAA});function UAA(A,Q){var B=rC(this,A),I=B.size;return B.set(A,Q),this.size+=B.size==I?0:1,this}var kx;var bx=H(()=>{hU();kx=UAA});function FJ(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 P2;var yx=H(()=>{jx();Sx();Px();Tx();bx();FJ.prototype.clear=Rx;FJ.prototype.delete=Ox;FJ.prototype.get=_x;FJ.prototype.has=vx;FJ.prototype.set=kx;P2=FJ});function v2(A,Q){if(typeof A!="function"||Q!=null&&typeof Q!="function")throw TypeError(FAA);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(v2.Cache||P2),B}var FAA="Expected a function",JQ;var xE=H(()=>{yx();v2.Cache=P2;JQ=v2});import{homedir as NAA}from"os";import{join as DAA}from"path";function T2(A){let Q=process.env.NODE_OPTIONS;if(!Q)return!1;return Q.split(/\s+/).includes(A)}function fx(){return!1}function hx(){return{namespace:void 0,cluster:void 0}}var RE;var QB=H(()=>{m4();xE();m4();RE=JQ(()=>{return(process.env.CLAUDE_CONFIG_DIR??DAA(NAA(),".claude")).normalize("NFC")},()=>process.env.CLAUDE_CONFIG_DIR)});function u(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 g(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 AC=()=>{};var k2=function(){let{crypto:A}=globalThis;if(A?.randomUUID)return k2=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 QC(A){return typeof A==="object"&&A!==null&&(("name"in A)&&A.name==="AbortError"||("message"in A)&&String(A.message).includes("FetchRequestCanceledException"))}var mU=(A)=>{if(A instanceof Error)return A;if(typeof A==="object"&&A!==null){try{if(Object.prototype.toString.call(A)==="[object Error]"){let Q=Error(A.message,A.cause?{cause:A.cause}:{});if(A.stack)Q.stack=A.stack;if(A.cause&&!Q.cause)Q.cause=A.cause;if(A.name)Q.name=A.name;return Q}}catch{}try{return Error(JSON.stringify(A))}catch{}}return Error(A)};var o,BB,ZB,n0,uU,cU,pU,lU,iU,dU,nU,oU,aU;var cB=H(()=>{o=class o extends Error{};BB=class BB extends o{constructor(A,Q,B,I,E){super(`${BB.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 n0({message:B,cause:mU(Q)});let E=Q,C=E?.error?.type;if(A===400)return new cU(A,E,B,I,C);if(A===401)return new pU(A,E,B,I,C);if(A===403)return new lU(A,E,B,I,C);if(A===404)return new iU(A,E,B,I,C);if(A===409)return new dU(A,E,B,I,C);if(A===422)return new nU(A,E,B,I,C);if(A===429)return new oU(A,E,B,I,C);if(A>=500)return new aU(A,E,B,I,C);return new BB(A,E,B,I,C)}};ZB=class ZB extends BB{constructor({message:A}={}){super(void 0,void 0,A||"Request was aborted.",void 0)}};n0=class n0 extends BB{constructor({message:A,cause:Q}){super(void 0,void 0,A||"Connection error.",void 0);if(Q)this.cause=Q}};uU=class uU extends n0{constructor({message:A}={}){super({message:A??"Request timed out."})}};cU=class cU extends BB{};pU=class pU extends BB{};lU=class lU extends BB{};iU=class iU extends BB{};dU=class dU extends BB{};nU=class nU extends BB{};oU=class oU extends BB{};aU=class aU extends BB{}});function i4(A){if(typeof A!=="object")return{};return A??{}}function f2(A){if(!A)return!0;for(let Q in A)return!1;return!0}function ux(A,Q){return Object.prototype.hasOwnProperty.call(A,Q)}var WAA,mx=(A)=>{return WAA.test(A)},b2=(A)=>(b2=Array.isArray,b2(A)),y2,cx=(A,Q)=>{if(typeof Q!=="number"||!Number.isInteger(Q))throw new o(`${A} must be an integer`);if(Q<0)throw new o(`${A} must be a positive integer`);return Q},d4=(A)=>{try{return JSON.parse(A)}catch(Q){return}};var o0=H(()=>{cB();WAA=/^[a-z][a-z0-9+.-]*:/i,y2=b2});var px=(A)=>new Promise((Q)=>setTimeout(Q,A));var tC="0.81.0";function VAA(){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 MAA(){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 nx=()=>{return typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u"},XAA=()=>{let A=VAA();if(A==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":tC,"X-Stainless-OS":ix(Deno.build.os),"X-Stainless-Arch":lx(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":tC,"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":tC,"X-Stainless-OS":ix(globalThis.process.platform??"unknown"),"X-Stainless-Arch":lx(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let Q=MAA();if(Q)return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":tC,"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":tC,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}},lx=(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"},ix=(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"},dx,ox=()=>{return dx??(dx=XAA())};var h2=()=>{};function ax(){if(typeof fetch<"u")return fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function m2(...A){let Q=globalThis.ReadableStream;if(typeof Q>"u")throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new Q(...A)}function n4(A){let Q=Symbol.asyncIterator in A?A[Symbol.asyncIterator]():A[Symbol.iterator]();return m2({start(){},async pull(B){let{done:I,value:E}=await Q.next();if(I)B.close();else B.enqueue(E)},async cancel(){await Q.return?.()}})}function rU(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 rx(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 tx=({headers:A,body:Q})=>{return{bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(Q)}};function sx(A){return Object.entries(A).filter(([Q,B])=>typeof B<"u").map(([Q,B])=>{if(typeof B==="string"||typeof B==="number"||typeof B==="boolean")return`${encodeURIComponent(Q)}=${encodeURIComponent(B)}`;if(B===null)return`${encodeURIComponent(Q)}=`;throw new o(`Cannot stringify type ${typeof B}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join("&")}var ex=H(()=>{cB()});function BR(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 tU(A){let Q;return(AR??(Q=new globalThis.TextEncoder,AR=Q.encode.bind(Q)))(A)}function u2(A){let Q;return(QR??(Q=new globalThis.TextDecoder,QR=Q.decode.bind(Q)))(A)}var AR,QR;class sC{constructor(){JI.set(this,void 0),GI.set(this,void 0),u(this,JI,new Uint8Array,"f"),u(this,GI,null,"f")}decode(A){if(A==null)return[];let Q=A instanceof ArrayBuffer?new Uint8Array(A):typeof A==="string"?tU(A):A;u(this,JI,BR([g(this,JI,"f"),Q]),"f");let B=[],I;while((I=zAA(g(this,JI,"f"),g(this,GI,"f")))!=null){if(I.carriage&&g(this,GI,"f")==null){u(this,GI,I.index,"f");continue}if(g(this,GI,"f")!=null&&(I.index!==g(this,GI,"f")+1||I.carriage)){B.push(u2(g(this,JI,"f").subarray(0,g(this,GI,"f")-1))),u(this,JI,g(this,JI,"f").subarray(g(this,GI,"f")),"f"),u(this,GI,null,"f");continue}let E=g(this,GI,"f")!==null?I.preceding-1:I.preceding,C=u2(g(this,JI,"f").subarray(0,E));B.push(C),u(this,JI,g(this,JI,"f").subarray(I.index),"f"),u(this,GI,null,"f")}return B}flush(){if(!g(this,JI,"f").length)return[];return this.decode(`
|
|
5
5
|
`)}}function zAA(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 IR(A){for(let I=0;I<A.length-1;I++){if(A[I]===10&&A[I+1]===10)return I+2;if(A[I]===13&&A[I+1]===13)return I+2;if(A[I]===13&&A[I+1]===10&&I+3<A.length&&A[I+2]===13&&A[I+3]===10)return I+4}return-1}var JI,GI;var c2=H(()=>{AC();JI=new WeakMap,GI=new WeakMap;sC.NEWLINE_CHARS=new Set([`
|
|
6
6
|
`,"\r"]);sC.NEWLINE_REGEXP=/\r\n|[\n\r]/g});function sU(){}function o4(A,Q,B){if(!Q||a4[A]>a4[B])return sU;else return Q[A].bind(Q)}function UB(A){let Q=A.logger,B=A.logLevel??"off";if(!Q)return KAA;let I=ER.get(Q);if(I&&I[0]===B)return I[1];let E={error:o4("error",Q,B),warn:o4("warn",Q,B),info:o4("info",Q,B),debug:o4("debug",Q,B)};return ER.set(Q,[B,E]),E}var a4,p2=(A,Q,B)=>{if(!A)return;if(ux(a4,A))return A;UB(B).warn(`${Q} was set to ${JSON.stringify(A)}, expected one of ${JSON.stringify(Object.keys(a4))}`);return},KAA,ER,BC=(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 r4=H(()=>{o0();a4={off:0,error:200,warn:300,info:400,debug:500};KAA={error:sU,warn:sU,info:sU,debug:sU},ER=new WeakMap});async function*HAA(A,Q){if(!A.body){if(Q.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative")throw new o("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api");throw new o("Attempted to iterate over a response with no body")}let B=new CR,I=new sC,E=rU(A.body);for await(let C of LAA(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*LAA(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"?tU(B):B,E=new Uint8Array(Q.length+I.length);E.set(Q),E.set(I,Q.length),Q=E;let C;while((C=IR(Q))!==-1)yield Q.slice(0,C),Q=Q.slice(C)}if(Q.length>0)yield Q}class CR{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(yr(E))Q[I]=E;break;case"id":if(fr(E))Q[I]=E;break;cas
|
|
|
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 OCQ=JQ(()=>{if(process.platform!=="darwin")return;let Q=bm().match(/^(\d+)\./);if(!Q||!Q[1])return;return parseInt(Q[1],10)-9});GQ();import{AsyncLocalStorage as N8A}from"async_hooks";var PCQ=new N8A;QB();function V8A(){return fm(RE(),"sessions")}var ym=Promise.resolve();async function X8A(A){let Q=fm(V8A(),`${process.pid}.json`),B=ym.then(async()=>{try{let I=_Q(await $8A(Q,"utf8"));await W8A(Q,zA({...I,...A}))}catch(I){Z(`[concurrentSessions] updatePidFile failed: ${JA(I)}`)}});ym=B,await B}async function hm(A){await X8A({bridgeSessionId:A})}WQ();LC();OQ();QE();QE();WQ();QB();OQ();BE();import{mkdirSync as M8A,writeFileSync as Z8A}from"fs";var zV="/home/claude/.claude/remote",V0Q=`${zV}/.oauth_token`,X0Q=`${zV}/.api_key`,KV=`${zV}/.session_ingress_token`;function mm(A,Q,B){if(!lA(process.env.CLAUDE_CODE_REMOTE))return;try{M8A(zV,{recursive:!0,mode:448}),Z8A(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): ${JA(I)}`,{level:"error"})}}function Z3(A,Q){try{let I=pQ().readFileSync(A,{encoding:"utf8"}).trim();if(!I)return null;return Z(`Read ${Q} from well-known file ${A}`),I}catch(B){if(!YC(B))Z(`Failed to read ${Q} from ${A}: ${JA(B)}`,{level:"debug"});return null}}WQ();OQ();BE();function w8A(){let A=nR();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??KV,E=Z3(I,"session ingress token");return jJ(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"}),jJ(null),null;try{let I=pQ(),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"}),jJ(null),null;return Z(`Successfully read token from file descriptor ${B}`),jJ(C),mm(KV,C,"session ingress token"),C}catch(I){Z(`Failed to read token from file descriptor ${B}: ${JA(I)}`,{level:"error"});let E=process.env.CLAUDE_SESSION_INGRESS_TOKEN_FILE??KV,C=Z3(E,"session ingress token");return jJ(C),C}}function LD(){let A=process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN;if(A)return A;return w8A()}function HV(){let A=LD();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 xD(A){process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN=A}GQ();class gG extends Error{retryAfterMs;constructor(A,Q){super(A);this.retryAfterMs=Q}}class OY{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 gG?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(zA(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 w3{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}}WQ();LC();QB();xE();import{Agent as K8A}from"https";xE();function um(A){return[...new Set(A)]}WQ();QB();BE();var cm=["bundled","system"];function z8A(){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:cm}if(T2("--use-system-ca")||T2("--use-openssl-ca"))return["system"];return cm}var qG=JQ(()=>{let A=z8A(),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=j("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=pQ().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?um(Y):void 0});WQ();BE();var RD=JQ(()=>{let A={};if(process.env.CLAUDE_CODE_CLIENT_CERT)try{A.cert=pQ().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=pQ().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}),pm=JQ(()=>{let A=RD(),Q=qG();if(!A&&!Q)return;let B={...A,...Q&&{ca:Q},keepAlive:!0};return Z("mTLS: Creating HTTPS agent with custom certificates"),new K8A(B)});function z3(){let A=RD(),Q=qG();if(!A&&!Q)return;return{...A,...Q&&{ca:Q}}}xE();QE();var At=_I(Eu(),1);WQ();QB();I3();function YqA(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 lH(A=process.env){return A.https_proxy||A.HTTPS_PROXY||A.http_proxy||A.HTTP_PROXY}function JqA(A=process.env){return A.no_proxy||A.NO_PROXY}function iH(A,Q=JqA()){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 Qt(A,Q={}){let B=RD(),I=qG(),E={...B&&{cert:B.cert,key:B.key,passphrase:B.passphrase},...I&&{ca:I}};if(lA(process.env.CLAUDE_CODE_PROXY_RESOLVES_HOSTS))E.lookup=(C,Y,J)=>{J(null,C,YqA(Y))};return new At.HttpsProxyAgent(A,{...E,...Q})}function Bt(A={}){let Q=lH(),B=pm(),I=PQ.create({proxy:!1});if(!Q){if(B)I.defaults.httpsAgent=B;return I}let E=Qt(Q,A);return I.interceptors.request.use((C)=>{if(C.url&&iH(C.url))C.httpsAgent=B,C.httpAgent=B;else C.httpsAgent=E,C.httpAgent=E;return C}),I}var mJQ=JQ((A)=>{let Q=er(),B=RD(),I=qG(),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 It(A){let Q=lH();if(!Q)return;if(iH(A))return;return Qt(Q)}function Et(A){let Q=lH();if(!Q)return;if(iH(A))return;return Q}gJ();LC();QB();var GqA=30000,nH=null,Ct=0;var g4=null,dH=null;function UqA(){Yt(),g4=setInterval(()=>{if(c("debug","session_keepalive_heartbeat",{refcount:Ct}),lA(process.env.CLAUDE_CODE_REMOTE_SEND_KEEPALIVES))nH?.()},GqA)}function Yt(){if(dH!==null)clearTimeout(dH),dH=null}function E2(A){if(nH=A,Ct>0&&g4===null)UqA()}function q4(){if(nH=null,g4!==null)clearInterval(g4),g4=null;Yt()}GQ();var qOA=`{"type":"keep_alive"}
|
|
181
181
|
`,OOA=1000,SOA=1000,Xs=30000,_OA=600000,POA=1e4,vOA=300000,Vs=Xs*2,TOA=new Set([1002,4001,4003]);class UL{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 w3(OOA)}async connect(){if(this.state!=="idle"&&this.state!=="reconnecting"){Z(`WebSocketTransport: Cannot connect, current state is ${this.state}`,{level:"error"}),c("error","cli_websocket_connect_failed");return}this.state="reconnecting",this.connectStartTime=Date.now(),Z(`WebSocketTransport: Opening ${this.url.href}`),c("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:Et(this.url.href),tls:z3()||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(() => (Ws(),$s)),B=new Q(this.url.href,{headers:A,agent:It(this.url.href),...z3()});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(),c("info","cli_websocket_message_received",{length:Q.length}),this.onData)this.onData(Q)};onBunError=()=>{Z("WebSocketTransport: Error",{level:"error"}),c("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"}),c("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(),c("info","cli_websocket_message_received",{length:Q.length}),this.onData)this.onData(Q)};onNodeError=(A)=>{Z(`WebSocketTransport: Error: ${A.message}`,{level:"error"}),c("error","cli_websocket_connect_error")};onNodeClose=(A,Q)=>{let B=A===1000||A===1001;Z(`WebSocketTransport: Closed: ${A}`,B?void 0:{level:"error"}),c("error","cli_websocket_connect_closed"),this.handleConnectionError(A)};onPong=()=>{this.pongReceived=!0};handleOpenEvent(){let A=Date.now()-this.connectStartTime;if(Z("WebSocketTransport: Connected"),c("info","cli_websocket_connect_connected",{duration_ms:A}),this.isBridge&&this.reconnectStartTime!==null)rA("tengu_ws_transport_reconnected",{attempts:this.reconnectAttempts,downtimeMs:Date.now()-this.reconnectStartTime});this.reconnectAttempts=0,this.reconnectStartTime=null,this.lastReconnectAttemptTime=null,this.lastActivityTime=Date.now(),this.state="connected",this.onConnectCallback?.(),this.startPingInterval(),this.startKeepaliveInterval(),E2(()=>{this.write({type:"keep_alive"})})}sendLine(A){if(!this.ws||this.state!=="connected")return Z("WebSocketTransport: Not connected"),c("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"}),c("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(),q4(),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})`:"")),c("info","cli_websocket_disconnected"),this.isBridge)rA("tengu_ws_transport_closed",{closeCode:A,msSinceLastActivity:this.lastActivityTime>0?Date.now()-this.lastActivityTime:-1,wasConnected:this.state==="connected",reconnectAttempts:this.reconnectAttempts});if(this.doDisconnect(),this.state==="closing"||this.state==="closed")return;let Q=!1;if(A===4003&&this.refreshHeaders){let E=this.refreshHeaders();if(E.Authorization!==this.headers.Authorization)Object.assign(this.headers,E),Q=!0,Z("WebSocketTransport: 4003 received but headers refreshed, scheduling reconnect"),c("info","cli_websocket_4003_token_refreshed")}if(A!=null&&TOA.has(A)&&!Q){Z(`WebSocketTransport: Permanent close code ${A}, not reconnecting`,{level:"error"}),c("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>Vs)Z(`WebSocketTransport: Detected system sleep (${Math.round((B-this.lastReconnectAttemptTime)/1000)}s gap), resetting reconnection budget`),c("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<_OA){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(SOA*Math.pow(2,this.reconnectAttempts-1),Xs),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)`),c("error","cli_websocket_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.isBridge)rA("tengu_ws_transport_reconnecting",{attempt:this.reconnectAttempts,elapsedMs:I,delayMs:Math.round(C)});this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},C)}else if(Z(`WebSocketTransport: Reconnection time budget exhausted after ${Math.round(I/1000)}s for ${this.url.href}`,{level:"error"}),c("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(),q4(),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`),c("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"),c("info","cli_websocket_no_messages_to_replay");return}Z(`WebSocketTransport: Replaying ${I.length} buffered messages`),c("info","cli_websocket_messages_to_replay",{count:I.length});for(let E of I){let C=zA(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=zA(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>Vs){Z(`WebSocketTransport: ${Math.round(B/1000)}s tick gap detected — process was suspended, forcing reconnect`),c("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"}),c("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(I){Z(`WebSocketTransport: Ping failed: ${I}`,{level:"error"}),c("error","cli_websocket_ping_failed")}}},POA)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),lA(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(qOA),this.lastActivityTime=Date.now(),Z("WebSocketTransport: Sent periodic keep_alive data frame")}catch(A){Z(`WebSocketTransport: Periodic keep_alive failed: ${A}`,{level:"error"}),c("error","cli_websocket_keepalive_failed")}},vOA)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var kOA=100,bOA=15000,yOA=3000;class FL extends UL{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=fOA(A),this.uploader=new OY({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:C,onBatchDropped:(J,G)=>{c("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}`),c("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(),kOA);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,yOA)})]).finally(()=>{clearTimeout(Q),A.close()}),super.close()}async postOnce(A){let Q=LD();if(!Q){Z("HybridTransport: No session token available for POST"),c("warn","cli_hybrid_post_no_token");return}let B={Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},I;try{I=await PQ.post(this.postUrl,{events:A},{headers:B,validateStatus:()=>!0,timeout:bOA})}catch(E){throw Z(`HybridTransport: POST error: ${JA(E)}`),c("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`),c("warn","cli_hybrid_post_client_error",{status:I.status});return}throw Z(`HybridTransport: POST returned ${I.status} (retryable)`),c("warn","cli_hybrid_post_retryable_error",{status:I.status}),Error(`POST failed with ${I.status}`)}}function fOA(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 ws}from"crypto";WQ();LC();OQ();GQ();function hOA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return _Q(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function Ms(A){let Q=hOA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}WQ();LC();OQ();function PU(){return"claude-code/0.2.111"}class NL{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?Zs(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 mB(this.retryDelay(B)),this.pending&&!this.closed)Q=Zs(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 Zs(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 mOA=20000,uOA=100;function zs(){return!0}class M2 extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var cOA=10;function pOA(){return{byMessage:new Map,scopeToMessage:new Map}}function Z2(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function lOA(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(Z2(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(Z2(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(Z2(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 iOA(A,Q){A.byMessage.delete(Q.message.id);let B=Z2(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class DL{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;currentState=null;sessionBaseUrl;sessionId;http=Bt({keepAlive:!0});streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=pOA();workerState;eventUploader;internalEventUploader;deliveryUploader;onEpochMismatch;getAuthHeaders;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??mOA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??HV,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 NL({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 OY({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 gG("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new OY({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 gG("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new OY({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 gG("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 M2("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 M2("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 M2("worker_register_failed");this.currentState="idle",this.startHeartbeat(),E2(()=>{this.writeEvent({type:"keep_alive"})}),Z(`CCRClient: initialized, epoch=${this.workerEpoch}`),c("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:E,durationMs:C}=await B;if(!this.closed)c("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":PU()},validateStatus:zs,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=LD(),G=J?Ms(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"}),c("error","cli_worker_token_expired_no_refresh"),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=cOA)Z(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),c("error","cli_worker_auth_failures_exhausted"),this.onEpochMismatch()}if(Z(`CCRClient: ${I} returned ${Y.status}`,{level:"warn"}),c("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: ${JA(Y)}`,{level:"warn"}),c("warn","cli_worker_request_error",{method:A,path:Q,error_code:TI(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"}),c("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(),uOA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")iOA(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:ws()}}}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=lOA(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:ws()},...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":PU()},validateStatus:zs,timeout:30000})}catch(C){if(Z(`CCRClient: GET ${A} failed (attempt ${I}/10): ${JA(C)}`,{level:"warn"}),I<10){let Y=Math.min(500*2**(I-1),30000)+Math.random()*500;await mB(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 mB(C)}}return Z("CCRClient: GET retries exhausted",{level:"error"}),c("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(),q4(),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()}}WQ();LC();OQ();GQ();var dOA=1000,nOA=30000,oOA=600000,aOA=45000,rOA=new Set([401,403,404]),y4=10,tOA=500,sOA=8000,eOA={stream:!0};function ASA(){return!0}function QSA(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>Vs){Z(`WebSocketTransport: ${Math.round(B/1000)}s tick gap detected — process was suspended, forcing reconnect`),c("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"}),c("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(I){Z(`WebSocketTransport: Ping failed: ${I}`,{level:"error"}),c("error","cli_websocket_ping_failed")}}},POA)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),lA(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(qOA),this.lastActivityTime=Date.now(),Z("WebSocketTransport: Sent periodic keep_alive data frame")}catch(A){Z(`WebSocketTransport: Periodic keep_alive failed: ${A}`,{level:"error"}),c("error","cli_websocket_keepalive_failed")}},vOA)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var kOA=100,bOA=15000,yOA=3000;class FL extends UL{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=fOA(A),this.uploader=new OY({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:C,onBatchDropped:(J,G)=>{c("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}`),c("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(),kOA);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,yOA)})]).finally(()=>{clearTimeout(Q),A.close()}),super.close()}async postOnce(A){let Q=LD();if(!Q){Z("HybridTransport: No session token available for POST"),c("warn","cli_hybrid_post_no_token");return}let B={Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},I;try{I=await PQ.post(this.postUrl,{events:A},{headers:B,validateStatus:()=>!0,timeout:bOA})}catch(E){throw Z(`HybridTransport: POST error: ${JA(E)}`),c("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`),c("warn","cli_hybrid_post_client_error",{status:I.status});return}throw Z(`HybridTransport: POST returned ${I.status} (retryable)`),c("warn","cli_hybrid_post_retryable_error",{status:I.status}),Error(`POST failed with ${I.status}`)}}function fOA(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 ws}from"crypto";WQ();LC();OQ();GQ();function hOA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return _Q(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function Ms(A){let Q=hOA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}WQ();LC();OQ();function PU(){return"claude-code/0.2.112"}class NL{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?Zs(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 mB(this.retryDelay(B)),this.pending&&!this.closed)Q=Zs(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 Zs(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 mOA=20000,uOA=100;function zs(){return!0}class M2 extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var cOA=10;function pOA(){return{byMessage:new Map,scopeToMessage:new Map}}function Z2(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function lOA(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(Z2(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(Z2(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(Z2(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 iOA(A,Q){A.byMessage.delete(Q.message.id);let B=Z2(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class DL{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;currentState=null;sessionBaseUrl;sessionId;http=Bt({keepAlive:!0});streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=pOA();workerState;eventUploader;internalEventUploader;deliveryUploader;onEpochMismatch;getAuthHeaders;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??mOA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??HV,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 NL({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 OY({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 gG("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new OY({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 gG("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new OY({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 gG("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 M2("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 M2("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 M2("worker_register_failed");this.currentState="idle",this.startHeartbeat(),E2(()=>{this.writeEvent({type:"keep_alive"})}),Z(`CCRClient: initialized, epoch=${this.workerEpoch}`),c("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:E,durationMs:C}=await B;if(!this.closed)c("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":PU()},validateStatus:zs,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=LD(),G=J?Ms(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"}),c("error","cli_worker_token_expired_no_refresh"),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=cOA)Z(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),c("error","cli_worker_auth_failures_exhausted"),this.onEpochMismatch()}if(Z(`CCRClient: ${I} returned ${Y.status}`,{level:"warn"}),c("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: ${JA(Y)}`,{level:"warn"}),c("warn","cli_worker_request_error",{method:A,path:Q,error_code:TI(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"}),c("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(),uOA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")iOA(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:ws()}}}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=lOA(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:ws()},...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":PU()},validateStatus:zs,timeout:30000})}catch(C){if(Z(`CCRClient: GET ${A} failed (attempt ${I}/10): ${JA(C)}`,{level:"warn"}),I<10){let Y=Math.min(500*2**(I-1),30000)+Math.random()*500;await mB(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 mB(C)}}return Z("CCRClient: GET retries exhausted",{level:"error"}),c("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(),q4(),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()}}WQ();LC();OQ();GQ();var dOA=1000,nOA=30000,oOA=600000,aOA=45000,rOA=new Set([401,403,404]),y4=10,tOA=500,sOA=8000,eOA={stream:!0};function ASA(){return!0}function QSA(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(yr(E))Q[I]=E;break;case"id":if(fr(E))Q[I]=E;break;cas
|
|
|
190
190
|
`);if(I.push(J),!G){E=J.endsWith(`
|
|
191
191
|
`);continue}let{frames:U,remaining:F}=QSA(I.join(""));I=F?[F]:[],E=F.endsWith(`
|
|
192
192
|
`);for(let N of U){if(this.resetLivenessTimer(),N.id){let D=parseInt(N.id,10);if(!isNaN(D)){if(this.seenSequenceNums.has(D))Z(`SSETransport: DUPLICATE frame seq=${D} (lastSequenceNum=${this.lastSequenceNum}, seenCount=${this.seenSequenceNums.size})`,{level:"warn"}),c("warn","cli_sse_duplicate_sequence");else if(this.seenSequenceNums.add(D),this.seenSequenceNums.size>1000){let W=this.lastSequenceNum-200;for(let $ of this.seenSequenceNums)if($<W)this.seenSequenceNums.delete($)}if(D>this.lastSequenceNum)this.lastSequenceNum=D}}if(N.event&&N.data)this.handleSSEFrame(N.event,N.data);else if(N.data)Z("SSETransport: Frame has data: but no event: field — dropped",{level:"warn"}),c("warn","cli_sse_frame_missing_event_field")}}}catch(C){if(this.abortController?.signal.aborted)return;Z(`SSETransport: Stream read error: ${JA(C)}`,{level:"error"}),c("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"}),c("warn","cli_sse_unexpected_event_type",{event_type:A});return}let B;try{B=_Q(Q)}catch(E){Z(`SSETransport: Failed to parse client_event data: ${JA(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}`),c("info","cli_sse_message_received"),this.onData?.(zA(I)+`
|
|
193
|
-
`)}else Z(`SSETransport: Ignoring client_event with no type in payload: event_id=${B.event_id}`);this.onEventCallback?.(B)}handleConnectionError(){if(this.clearLivenessTimer(),this.state==="closing"||this.state==="closed")return;this.abortController?.abort(),this.abortController=null;let A=Date.now();if(!this.reconnectStartTime)this.reconnectStartTime=A;let Q=A-this.reconnectStartTime;if(Q<oOA){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(dOA*Math.pow(2,this.reconnectAttempts-1),nOA),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)`),c("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"}),c("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"}),c("error","cli_sse_liveness_timeout"),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,aOA)}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"),c("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":PU()};Z(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=y4;I++){try{let C=await PQ.post(this.postUrl,A,{headers:B,validateStatus:ASA});if(C.status===200||C.status===201){Z(`SSETransport: POST success type=${A.type}`);return}if(Z(`SSETransport: POST ${C.status} body=${zA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){Z(`SSETransport: POST returned ${C.status} (client error), not retrying`),c("warn","cli_sse_post_client_error",{status:C.status});return}Z(`SSETransport: POST returned ${C.status}, attempt ${I}/${y4}`),c("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){Z(`SSETransport: POST error: ${JA(C)}, attempt ${I}/${y4}`),c("warn","cli_sse_post_network_error",{attempt:I})}if(I===y4){Z(`SSETransport: POST failed after ${y4} attempts, continuing`),c("warn","cli_sse_post_retries_exhausted");return}let E=Math.min(tOA*Math.pow(2,I-1),sOA);await mB(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 BSA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}WQ();OQ();function Ks(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 Hs(A){let{sessionUrl:Q,ingressToken:B,sessionId:I,initialSequenceNum:E,getAuthToken:C}=A,Y;if(C)Y=()=>{let X=C();if(!X)return{};return{Authorization:`Bearer ${X}`}};else xD(B);let J=A.epoch??await Tm(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 $L(G,{},I,void 0,E,Y),F,N=new DL(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(X){Z(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${JA(X)}`,{level:"error"})}throw Error("epoch superseded")}});U.setOnEvent((X)=>{N.reportDelivery(X.event_id,"received"),N.reportDelivery(X.event_id,"processed")});let D,W=!1,$=!1;return{write(X){return N.writeEvent(X)},async writeBatch(X){for(let V of X){if($)break;await N.writeEvent(V)}},close(){$=!0,N.close(),U.close()},isConnectedStatus(){return W},getStateLabel(){if(U.isClosedStatus())return"closed";if(U.isConnectedStatus())return W?"connected":"init";return"connecting"},setOnData(X){U.setOnData(X)},setOnClose(X){F=X,U.setOnClose((V)=>{N.close(),X(V??4092)})},setOnConnect(X){D=X},getLastSequenceNum(){return U.getLastSequenceNum()},droppedBatchCount:0,reportState(X,V){N.reportState(X,V)},reportMetadata(X){N.reportMetadata(X)},reportDelivery(X,V){N.reportDelivery(X,V)},flush(){return N.flush()},getInternalEventWriter(){return(X,V,M)=>N.writeInternalEvent(X,V,M)},getInternalEventReaders(){return{readMain:()=>N.readInternalEvents(),readSubagents:()=>N.readSubagentInternalEvents()}},connect(){if(!A.outboundOnly)U.connect();N.initialize(J).then(()=>{W=!0,Z(`[bridge:repl] v2 transport ready for writes (epoch=${J}, sse=${U.isConnectedStatus()?"open":"opening"})`),D?.()},(X)=>{Z(`[bridge:repl] CCR v2 initialize failed: ${JA(X)}`,{level:"error"}),N.close(),U.close(),F?.(4091)})}}}WQ();OQ();var ISA="2023-06-01",ESA="ccr-byoc-2025-07-29";async function Ls({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 PQ.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:K2(U,J),signal:I,validateStatus:(W)=>W<500})}catch(W){return Z(`[bridge] Session creation request failed: ${JA(W)}`),null}if(N.status!==200&&N.status!==201){let W=qY(N.data);return Z(`[bridge] Session creation failed with status ${N.status}${W?`: ${W}`:""}`),null}let D=N.data;if(!D||typeof D!=="object"||!("id"in D)||typeof D.id!=="string")return Z("[bridge] No session ID in response"),null;return D.id}async function xs(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 PQ.post(Y,{},{headers:K2(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)Z(`[bridge] Session ${A} archived successfully`);else{let G=qY(J.data);Z(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){Z(`[bridge] Session archive request failed: ${JA(J)}`)}}async function w2(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:jG(Q),repo:B,pr_number:I},U;try{U=await PQ.post(J,G,{headers:K2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return Z(`[bridge] ${A}-pr request failed: ${JA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=qY(U.data);return Z(`[bridge] ${A}-pr failed ${U.status}${N?`: ${N}`:""}`),!1}return Z(`[bridge] ${A}-pr ${B}#${I} ok`),!0}async function z2(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:jG(Q),channel:B,thread_ts:I},U;try{U=await PQ.post(J,G,{headers:K2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return Z(`[bridge] ${A}-thread request failed: ${JA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=qY(U.data);return Z(`[bridge] ${A}-thread failed ${U.status}${N?`: ${N}`:""}`),!1}return Z(`[bridge] ${A}-thread ${B}/${I} ok`),!0}function K2(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":ISA,"anthropic-beta":ESA};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}QB();function Rs(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 WL{_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}}OQ();WQ();var XSA=2000,_s=60000,Ps=900000,MSA=0;async function vs(A){let{dir:Q,registrationDir:B,machineName:I,branch:E,gitRepoUrl:C,title:Y,baseUrl:J,sessionIngressUrl:G,workerType:U,getAccessToken:F,createSession:N,archiveSession:D,getCurrentTitle:W=()=>Y,toSDKMessages:$=()=>{throw Error("BridgeCoreParams.toSDKMessages not provided. Pass it if you use writeMessages() or initialMessages — daemon callers that only use writeSdkMessages() never hit this path.")},onAuth401:X,getTrustedDeviceToken:V,getPollIntervalConfig:M=()=>nN,initialHistoryCap:L=200,initialMessages:z,previouslyFlushedUUIDs:x,onInboundMessage:q,onPermissionResponse:O,onInterrupt:P,onSetModel:y,onSetMaxThinkingTokens:a,onSetPermissionMode:EA,onRenameSession:xA,onStateChange:r,onUserMessage:p,onSessionEstablished:gA,onInitError:l,perpetual:XA,initialSSESequenceNum:cA=0,onTransportPersistenceReady:n,onTransportPersistenceTeardown:QQ}=A,t=++MSA,{writeBridgePointer:i,clearBridgePointer:IA,readBridgePointer:sA}=await Promise.resolve().then(() => (Os(),qs)),_A=XA?await sA(Q):null,BQ=_A?.source==="repl"?_A:null;Z(`[bridge:repl] initBridgeCore #${t} starting (initialMessages=${z?.length??0}${BQ?` perpetual prior=env:${BQ.environmentId}`:""})`);let oA=Lm({baseUrl:J,getAccessToken:F,runnerVersion:"0.2.111",onDebug:Z,onAuth401:X,getTrustedDeviceToken:V}),JB={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:Ss(),workerType:U,environmentId:Ss(),reuseEnvironmentId:BQ?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},WA,ZQ;try{let k=await oA.registerBridgeEnvironment(JB);WA=k.environment_id,ZQ=k.environment_secret}catch(k){if(Hm("registration_failed",`[bridge:repl] Environment registration failed: ${JA(k)}`),l?.(`[bridge:repl] Environment registration failed: ${JA(k)}`),BQ&&k instanceof $E&&(k.status===410||k.status!==401&&ZV(k.errorType)))await IA(Q);return r?.("failed",JA(k)),null}Z(`[bridge:repl] Environment registered: ${WA}`),c("info","bridge_repl_env_registered"),rA("tengu_bridge_repl_env_registered",{});async function BJ(k,QA){if(WA!==k)return Z(`[bridge:repl] Env mismatch (requested ${k}, got ${WA}) — cannot reconnect in place`),!1;let bA=M3(QA),LA=bA===QA?[QA]:[QA,bA];for(let xQ of LA)try{return await oA.reconnectSession(WA,xQ),Z(`[bridge:repl] Reconnected session ${xQ} in place on env ${WA}`),!0}catch(sI){Z(`[bridge:repl] reconnectSession(${xQ}) failed: ${JA(sI)}`)}return Z("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let i0=BQ?await BJ(BQ.environmentId,BQ.sessionId):!1;if(BQ&&!i0)await IA(Q);let v,wQ=new Set,IQ=new Set;if(i0&&BQ){if(v=BQ.sessionId,Z(`[bridge:repl] Perpetual session reused: ${v}`),z&&x)for(let k of z)x.add(k.uuid)}else{let k=await N({environmentId:WA,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!k)return Z("[bridge:repl] Session creation failed, deregistering environment"),l?.("[bridge:repl] Session creation failed, deregistering environment"),rA("tengu_bridge_repl_session_failed",{}),await oA.deregisterEnvironment(WA).catch(()=>{}),r?.("failed","Session creation failed"),null;v=k,Z(`[bridge:repl] Session created: ${v}`)}gA?.(v),await i(Q,{sessionId:v,environmentId:WA,source:"repl"}),c("info","bridge_repl_session_created"),rA("tengu_bridge_repl_started",{has_initial_messages:!!(z&&z.length>0),inProtectedNamespace:fx(),...Rm()});let pA=new Set;if(z)for(let k of z)pA.add(k.uuid);let _B=new wV(2000);for(let k of pA)_B.add(k);let pC=new wV(2000),PB=new AbortController,YA=null,YI=0,YQ=i0?cA:0,dQ=null,OI=null,XB=Rs(PB.signal),LE=XB.wake,lC=XB.signal,GB=new WL,iC=!p,d0=3,tI=0,MB=null;async function SI(){if(MB)return MB;MB=dC();try{return await MB}finally{MB=null}}async function dC(){if(tI++,YI++,Z(`[bridge:repl] Reconnecting after env lost (attempt ${tI}/${d0})`),tI>d0)return Z(`[bridge:repl] Environment reconnect limit reached (${d0}), giving up`),!1;if(YA){let LA=YA.getLastSequenceNum();if(LA>YQ)YQ=LA;QQ?.(),YA.close(),YA=null}if(LE(),GB.drop(),dQ){let LA=dQ;if(await oA.stopWork(WA,LA,!1).catch(()=>{}),dQ!==LA)return Z("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),tI=0,!0;dQ=null,OI=null}if(PB.signal.aborted)return Z("[bridge:repl] Reconnect aborted by teardown"),!1;let k=WA;JB.reuseEnvironmentId=k;try{let LA=await oA.registerBridgeEnvironment(JB);WA=LA.environment_id,ZQ=LA.environment_secret}catch(LA){return JB.reuseEnvironmentId=void 0,Z(`[bridge:repl] Environment re-registration failed: ${JA(LA)}`),!1}if(JB.reuseEnvironmentId=void 0,Z(`[bridge:repl] Re-registered: requested=${k} got=${WA}`),PB.signal.aborted)return Z("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await oA.deregisterEnvironment(WA).catch(()=>{}),!1;if(YA!==null)return Z("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),tI=0,!0;if(await BJ(k,v))return rA("tengu_bridge_repl_reconnected_in_place",{}),tI=0,!0;if(WA!==k)rA("tengu_bridge_repl_env_expired_fresh_session",{});if(await D(v),PB.signal.aborted)return Z("[bridge:repl] Reconnect aborted after archive, cleaning up"),await oA.deregisterEnvironment(WA).catch(()=>{}),!1;let QA=W(),bA=await N({environmentId:WA,title:QA,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!bA)return Z("[bridge:repl] Session creation failed during reconnection"),!1;if(PB.signal.aborted)return Z("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await D(bA),!1;if(v=bA,hm(jG(bA)).catch(()=>{}),gA?.(v),YQ=0,pC.clear(),iC=!p,Z(`[bridge:repl] Re-created session: ${v}`),await i(Q,{sessionId:v,environmentId:WA,source:"repl"}),x?.clear(),wQ.size>0){Z(`[bridge:repl] Replaying ${wQ.size} PR subscription(s) against new session`);for(let LA of wQ){let xQ=LA.lastIndexOf("#");w2("subscribe",v,LA.slice(0,xQ),Number(LA.slice(xQ+1)),J,F)}}if(IQ.size>0){Z(`[bridge:repl] Replaying ${IQ.size} Slack thread subscription(s) against new session`);for(let LA of IQ){let xQ=LA.indexOf("/");z2("subscribe",v,LA.slice(0,xQ),LA.slice(xQ+1),J,F)}}return tI=0,!0}function tE(){return F()}function nC(){let k=GB.end();if(k.length===0)return;if(!YA){Z(`[bridge:repl] Cannot drain ${k.length} pending message(s): no transport`);return}for(let LA of k)_B.add(LA.uuid);let bA=$(k).map((LA)=>({...LA,session_id:v}));Z(`[bridge:repl] Drained ${k.length} pending message(s) after flush`),YA.writeBatch(bA)}let f4=null;function L2(){f4?.()}function ZL(k){if(Z(`[bridge:repl] Transport permanently closed: code=${k}`),rA("tengu_bridge_repl_ws_closed",{code:k}),YA){let bA=YA.getLastSequenceNum();if(bA>YQ)YQ=bA;QQ?.(),YA=null}LE();let QA=GB.drop();if(QA>0)Z(`[bridge:repl] Dropping ${QA} pending message(s) on transport close (code=${k})`,{level:"warn"});if(k===1000){r?.("failed","session ended"),PB.abort(),L2();return}r?.("reconnecting",`Remote Control connection lost (code ${k})`),Z(`[bridge:repl] Transport reconnect budget exhausted (code=${k}), attempting env reconnect`),SI().then((bA)=>{if(bA)return;if(PB.signal.aborted)return;Z("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),rA("tengu_bridge_repl_reconnect_failed",{close_code:k}),r?.("failed","reconnection failed"),L2()})}let wL,bs=null,ys={api:oA,getCredentials:()=>({environmentId:WA,environmentSecret:ZQ}),signal:PB.signal,getPollIntervalConfig:M,onStateChange:r,getWsState:()=>YA?.getStateLabel()??"null",isAtCapacity:()=>YA!==null,capacitySignal:lC,onFatalError:L2,getHeartbeatInfo:()=>{if(!dQ||!OI)return null;return{environmentId:WA,workId:dQ,sessionToken:OI}},onHeartbeatFatal:(k)=>{if(Z(`[bridge:repl] heartbeatWork fatal (status=${k.status}) — tearing down work item for fast re-dispatch`),YA){let QA=YA.getLastSequenceNum();if(QA>YQ)YQ=QA;QQ?.(),YA.close(),YA=null}if(GB.drop(),dQ)oA.stopWork(WA,dQ,!1).catch((QA)=>{Z(`[bridge:repl] stopWork after heartbeat fatal: ${JA(QA)}`)});dQ=null,OI=null,LE(),r?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await SI())return null;return{environmentId:WA,environmentSecret:ZQ}},onWorkReceived:(k,QA,bA,LA)=>{if(YA?.isConnectedStatus())Z(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${bA})`);if(Z(`[bridge:repl] Work received: workId=${bA} workSessionId=${k} currentSessionId=${v} match=${V3(k,v)}`),i(Q,{sessionId:v,environmentId:WA,source:"repl"}),!V3(k,v)){Z(`[bridge:repl] Rejecting foreign session: expected=${v} got=${k}`);return}dQ=bA,OI=QA;let xQ=LA||lA(process.env.CLAUDE_BRIDGE_USE_CCR_V2),sI;if(!xQ){if(sI=tE(),!sI){Z("[bridge:repl] No OAuth token available for session ingress, skipping work");return}xD(sI)}if(rA("tengu_bridge_repl_work_received",{}),YA){QQ?.();let kQ=YA;YA=null;let uQ=kQ.getLastSequenceNum();if(uQ>YQ)YQ=uQ;kQ.close()}GB.deactivate();let hs=(kQ)=>Sm(kQ,{transport:YA,sessionId:v,onInterrupt:P,onSetModel:y,onSetMaxThinkingTokens:a,onSetPermissionMode:EA,onRenameSession:xA}),g2=!1,HL=(kQ)=>{if(YA=kQ,kQ.setOnConnect(()=>{if(YA!==kQ)return;if(Z("[bridge:repl] Ingress transport connected"),rA("tengu_bridge_repl_ws_connected",{}),!xQ){let uQ=tE();if(uQ)xD(uQ)}if(j2=!1,!g2&&z&&z.length>0){g2=!0;let uQ=L,hB=z.filter((h4)=>$3(h4)&&!x?.has(h4.uuid)),sE=uQ>0&&hB.length>uQ?hB.slice(-uQ):hB;if(sE.length<hB.length)Z(`[bridge:repl] Capped initial flush: ${hB.length} -> ${sE.length} (cap=${uQ})`),rA("tengu_bridge_repl_history_capped",{eligible_count:hB.length,capped_count:sE.length});let oC=$(sE);if(oC.length>0){Z(`[bridge:repl] Flushing ${oC.length} initial message(s) via transport`);let h4=oC.map((IJ)=>({...IJ,session_id:v})),LL=kQ.droppedBatchCount;kQ.writeBatch(h4).then(()=>{if(kQ.droppedBatchCount>LL){Z(`[bridge:repl] Initial flush dropped ${kQ.droppedBatchCount-LL} batch(es) — not marking ${oC.length} UUID(s) as flushed`);return}if(x){for(let IJ of oC)if(IJ.uuid)x.add(IJ.uuid)}}).catch((IJ)=>Z(`[bridge:repl] Initial flush failed: ${IJ}`)).finally(()=>{if(YA!==kQ)return;nC(),r?.("connected")})}else nC(),r?.("connected")}else if(!GB.active)r?.("connected")}),kQ.setOnData((uQ)=>{Om(uQ,_B,pC,q,O,hs)}),bs=ZL,kQ.setOnClose((uQ)=>{if(YA!==kQ)return;ZL(uQ)}),!g2&&z&&z.length>0)GB.start();kQ.connect()};if(YI++,xQ){let kQ=vm(J,k),uQ=YI;Z(`[bridge:repl] CCR v2: sessionUrl=${kQ} session=${k} gen=${uQ}`),Hs({sessionUrl:kQ,ingressToken:QA,sessionId:k,initialSequenceNum:YQ}).then((hB)=>{if(PB.signal.aborted){hB.close();return}if(uQ!==YI){Z(`[bridge:repl] CCR v2: discarding stale handshake gen=${uQ} current=${YI}`),hB.close();return}if(HL(hB),n){let sE=hB.getInternalEventWriter?.(),oC=hB.getInternalEventReaders?.();if(sE&&oC)n(sE,oC)}},(hB)=>{if(Z(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${JA(hB)}`,{level:"error"}),rA("tengu_bridge_repl_ccr_v2_init_failed",{}),uQ!==YI)return;if(dQ)oA.stopWork(WA,dQ,!1).catch((sE)=>{Z(`[bridge:repl] stopWork after v2 init failure: ${JA(sE)}`)}),dQ=null,OI=null;LE()})}else{let kQ=Pm(G,k);Z(`[bridge:repl] Ingress URL: ${kQ}`),Z(`[bridge:repl] Creating HybridTransport: session=${k}`);let uQ=sI??"";HL(Ks(new FL(new URL(kQ),{Authorization:`Bearer ${uQ}`,"anthropic-version":"2023-06-01"},k,()=>({Authorization:`Bearer ${tE()??uQ}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{r?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),LE()}})))}}};ZSA(ys);let x2=XA?setInterval(()=>{if(MB)return;i(Q,{sessionId:v,environmentId:WA,source:"repl"})},3600000):null;x2?.unref?.();let zL=M().session_keepalive_interval_v2_ms,R2=zL>0?setInterval(()=>{if(!YA)return;Z("[bridge:repl] keep_alive sent"),YA.write({type:"keep_alive"}).catch((k)=>{Z(`[bridge:repl] keep_alive write failed: ${JA(k)}`)})},zL):null;R2?.unref?.();let j2=!1;f4=async()=>{if(j2){Z(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${WA} session=${v}`);return}j2=!0,QQ?.();let k=Date.now();if(Z(`[bridge:repl] Teardown starting: env=${WA} session=${v} workId=${dQ??"none"} transportState=${YA?.getStateLabel()??"null"}`),x2!==null)clearInterval(x2);if(R2!==null)clearInterval(R2);if(wL)process.off("SIGUSR2",wL);if(PB.abort(),Z("[bridge:repl] Teardown: poll loop aborted"),YA){let LA=YA.getLastSequenceNum();if(LA>YQ)YQ=LA}if(XA){YA=null,GB.drop(),await i(Q,{sessionId:v,environmentId:WA,source:"repl"}),Z(`[bridge:repl] Teardown (perpetual): leaving env=${WA} session=${v} alive on server, duration=${Date.now()-k}ms`);return}let QA=YA;if(YA=null,GB.drop(),QA)QA.write(W3(v));let bA=dQ?oA.stopWork(WA,dQ,!0).then(()=>{Z("[bridge:repl] Teardown: stopWork completed")}).catch((LA)=>{Z(`[bridge:repl] Teardown stopWork failed: ${JA(LA)}`)}):Promise.resolve();await Promise.all([bA,D(v)]),QA?.close(),Z("[bridge:repl] Teardown: transport closed"),await oA.deregisterEnvironment(WA).catch((LA)=>{Z(`[bridge:repl] Teardown deregister failed: ${JA(LA)}`)}),await IA(Q),Z(`[bridge:repl] Teardown complete: env=${WA} duration=${Date.now()-k}ms`)};let fs=E0(()=>f4?.());Z(`[bridge:repl] Ready: env=${WA} session=${v}`),r?.("ready");let KL={get bridgeSessionId(){return v},get environmentId(){return WA},getSSESequenceNum(){let k=YA?.getLastSequenceNum()??0;return Math.max(YQ,k)},sessionIngressUrl:G,writeMessages(k){let QA=k.filter((xQ)=>$3(xQ)&&!pA.has(xQ.uuid)&&!_B.has(xQ.uuid));if(QA.length===0)return;if(!iC)for(let xQ of QA){let sI=qm(xQ);if(sI!==void 0&&p?.(sI,v)){iC=!0;break}}if(GB.enqueue(...QA)){Z(`[bridge:repl] Queued ${QA.length} message(s) during initial flush`);return}if(!YA){let xQ=QA.map((sI)=>sI.type).join(",");Z(`[bridge:repl] Transport not configured, dropping ${QA.length} message(s) [${xQ}] for session=${v}`,{level:"warn"});return}for(let xQ of QA)_B.add(xQ.uuid);Z(`[bridge:repl] Sending ${QA.length} message(s) via transport`);let LA=$(QA).map((xQ)=>({...xQ,session_id:v}));YA.writeBatch(LA)},writeSdkMessages(k){let QA=k.filter((LA)=>!LA.uuid||!_B.has(LA.uuid));if(QA.length===0)return;if(!YA){Z(`[bridge:repl] Transport not configured, dropping ${QA.length} SDK message(s) for session=${v}`,{level:"warn"});return}for(let LA of QA)if(LA.uuid)_B.add(LA.uuid);let bA=QA.map((LA)=>({...LA,session_id:v}));YA.writeBatch(bA)},sendControlRequest(k){if(!YA){Z("[bridge:repl] Transport not configured, skipping control_request");return}let QA={...k,session_id:v};YA.write(QA),Z(`[bridge:repl] Sent control_request request_id=${k.request_id}`)},sendControlResponse(k){if(!YA){Z("[bridge:repl] Transport not configured, skipping control_response");return}let QA={...k,session_id:v};YA.write(QA),Z("[bridge:repl] Sent control_response")},sendControlCancelRequest(k){if(!YA){Z("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let QA={type:"control_cancel_request",request_id:k,session_id:v};YA.write(QA),Z(`[bridge:repl] Sent control_cancel_request request_id=${k}`)},reportMetadata(k){YA?.reportMetadata(k)},sendResult(){if(!YA){Z(`[bridge:repl] sendResult: skipping, transport not configured session=${v}`);return}YA.write(W3(v)),Z(`[bridge:repl] Sent result for session=${v}`)},async subscribePR(k,QA){let bA=await w2("subscribe",v,k,QA,J,F);if(bA)wQ.add(`${k}#${QA}`);return bA},async unsubscribePR(k,QA){let bA=await w2("unsubscribe",v,k,QA,J,F);if(bA)wQ.delete(`${k}#${QA}`);return bA},async subscribeSlackThread(k,QA){let bA=await z2("subscribe",v,k,QA,J,F);if(bA)IQ.add(`${k}/${QA}`);return bA},async unsubscribeSlackThread(k,QA){let bA=await z2("unsubscribe",v,k,QA,J,F);if(bA)IQ.delete(`${k}/${QA}`);return bA},async teardown(){fs(),await f4?.(),Z("[bridge:repl] Torn down"),rA("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return KL.teardown()}};return KL}async function ZSA({api:A,getCredentials:Q,signal:B,onStateChange:I,onWorkReceived:E,onEnvironmentLost:C,getWsState:Y,isAtCapacity:J,capacitySignal:G,onFatalError:U,getPollIntervalConfig:F=()=>nN,getHeartbeatInfo:N,onHeartbeatFatal:D}){Z(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let $=0,X=null,V=null,M=0,L=!1;while(!B.aborted){let{environmentId:z,environmentSecret:x}=Q(),q=F();try{let O=await A.pollForWork(z,x,B,q.reclaim_older_than_ms);if(M=0,$>0)Z(`[bridge:repl] Poll recovered after ${$} consecutive error(s)`),$=0,X=null,V=null,I?.("ready");if(!O){let y=L;if(L=!1,J?.()&&G&&!y){let a=q.poll_interval_ms_at_capacity;if(q.non_exclusive_heartbeat_interval_ms>0&&N){rA("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:q.non_exclusive_heartbeat_interval_ms});let xA=a>0?Date.now()+a:null,r=!1,p=0;while(!B.aborted&&J()&&(xA===null||Date.now()<xA)){let l=F();if(l.non_exclusive_heartbeat_interval_ms<=0)break;let XA=N();if(!XA)break;let cA=G();try{await A.heartbeatWork(XA.environmentId,XA.workId,XA.sessionToken)}catch(n){if(Z(`[bridge:repl:heartbeat] Failed: ${JA(n)}`),n instanceof $E){if(cA.cleanup(),rA("tengu_bridge_heartbeat_error",{status:n.status,error_type:n.status===401||n.status===403?"auth_failed":"fatal"}),D)D(n),Z(`[bridge:repl:heartbeat] Fatal (status=${n.status}), work state cleared — fast-polling for re-dispatch`);else r=!0;break}}p++,await mB(l.non_exclusive_heartbeat_interval_ms,cA.signal),cA.cleanup()}let gA=r?"error":B.aborted?"shutdown":!J()?"capacity_changed":xA!==null&&Date.now()>=xA?"poll_due":"config_disabled";if(rA("tengu_bridge_heartbeat_mode_exited",{reason:gA,heartbeat_cycles:p}),!r){if(gA==="poll_due")Z(`[bridge:repl] Heartbeat poll_due after ${p} cycles — falling through to pollForWork`);continue}}let EA=a>0?a:q.non_exclusive_heartbeat_interval_ms;if(EA>0){let xA=G(),r=Date.now();await mB(EA,xA.signal),xA.cleanup();let p=Date.now()-r-EA;if(p>60000)Z(`[bridge:repl] At-capacity sleep overran by ${Math.round(p/1000)}s — process suspension detected, forcing one fast-poll cycle`),rA("tengu_bridge_repl_suspension_detected",{overrun_ms:p}),L=!0}}else await mB(q.poll_interval_ms_not_at_capacity,B);continue}let P;try{P=_m(O.secret)}catch(y){Z(`[bridge:repl] Failed to decode work secret: ${JA(y)}`),rA("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(z,O.id,!1).catch(()=>{});continue}Z(`[bridge:repl] Acknowledging workId=${O.id}`);try{await A.acknowledgeWork(z,O.id,P.session_ingress_token)}catch(y){Z(`[bridge:repl] Acknowledge failed workId=${O.id}: ${JA(y)}`)}if(O.data.type==="healthcheck"){Z("[bridge:repl] Healthcheck received");continue}if(O.data.type==="session"){let y=O.data.id;try{sB(y,"session_id")}catch{Z(`[bridge:repl] Invalid session_id in work: ${y}`);continue}E(y,P.session_ingress_token,O.id,P.use_code_sessions===!0),Z("[bridge:repl] Work accepted, continuing poll loop")}}catch(O){if(B.aborted)break;if(O instanceof $E&&O.status===404&&C){let p=Q().environmentId;if(z!==p){Z(`[bridge:repl] Stale poll error for old env=${z}, current env=${p} — skipping onEnvironmentLost`),$=0,X=null;continue}if(M++,Z(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${M}/3)`),rA("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 gA=await C();if(B.aborted)break;if(gA){$=0,X=null,I?.("ready"),Z(`[bridge:repl] Re-registered environment: ${gA.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(O instanceof $E){let p=ZV(O.errorType),gA=xm(O);if(Z(`[bridge:repl] Fatal poll error: ${O.message} (status=${O.status}, type=${O.errorType??"unknown"})${gA?" (suppressed)":""}`),rA("tengu_bridge_repl_fatal_error",{status:O.status,error_type:O.errorType}),c(p?"info":"error","bridge_repl_fatal_error",{status:O.status,error_type:O.errorType}),!gA)I?.("failed",p?"session expired · /remote-control to reconnect":O.message);U?.();break}let P=Date.now();if(V!==null&&P-V>_s*2)Z(`[bridge:repl] Detected system sleep (${Math.round((P-V)/1000)}s gap), resetting poll error budget`),c("info","bridge_repl_poll_sleep_detected",{gapMs:P-V}),$=0,X=null;if(V=P,$++,X===null)X=P;let y=P-X,a=Km(O),EA=zm(O),xA=Y?.()??"unknown";if(Z(`[bridge:repl] Poll error (attempt ${$}, elapsed ${Math.round(y/1000)}s, ws=${xA}): ${EA}`),rA("tengu_bridge_repl_poll_error",{status:a,consecutiveErrors:$,elapsedMs:y}),$===1)I?.("reconnecting",EA);if(y>=Ps){Z(`[bridge:repl] Poll failures exceeded ${Ps/1000}s (${$} errors), giving up`),c("info","bridge_repl_poll_give_up"),rA("tengu_bridge_repl_poll_give_up",{consecutiveErrors:$,elapsedMs:y,lastStatus:a}),I?.("failed","connection to server lost");break}let r=Math.min(XSA*2**($-1),_s);if(F().non_exclusive_heartbeat_interval_ms>0){let p=N?.();if(p)try{await A.heartbeatWork(p.environmentId,p.workId,p.sessionToken)}catch{}}await mB(r,B)}}Z(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function wSA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function zSA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function KSA(A,Q){if(zSA(A,Q))return"http://localhost:4000";if(wSA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function Ts(A,Q){let{toCompatSessionId:B}=is(km),I=B(A);return`${KSA(I,Q)}/code/${I}`}WQ();async function ks(A){let{dir:Q,registrationDir:B,name:I="Assistant",workerType:E="claude_code_assistant",branch:C="",gitRepoUrl:Y=null,getAccessToken:J,getTrustedDeviceToken:G,baseUrl:U,orgUUID:F,model:N,perpetual:D=!1,initialSSESequenceNum:W,onConflict:$}=A,X=A.onAuth401;if(!J())return 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 V=U,M={baseUrl:U,getAccessToken:J,orgUUID:F,model:N},L=[],z=null,x=[],q=null,O=[],P=null,y=!1,a=null,EA={detail:null},xA=HSA(),r=()=>vs({dir:Q,registrationDir:B,machineName:xA,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:V,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:X,onInitError:console.error,createSession:({environmentId:n,title:QQ,signal:t})=>Ls({environmentId:n,title:QQ,tags:["claude-code-assistant"],signal:t},M),archiveSession:(n)=>xs(n,M),perpetual:D,initialSSESequenceNum:W,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...nN,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(n){let QQ=wT(n);if(!QQ)return;L.push({content:QQ.content,uuid:QQ.uuid}),z?.(),z=null},onInterrupt(){x.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),q?.(),q=null},onSetModel(n){x.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:n}}),q?.(),q=null},onSetMaxThinkingTokens(n){x.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:n}}),q?.(),q=null},onPermissionResponse(n){O.push(n),P?.(),P=null},onStateChange(n,QQ){if(a?.(n,QQ),n==="failed")EA.detail=QQ??"unknown failure",y=!0,z?.(),q?.(),P?.()}}),p=await r();if(!p&&$&&EA.detail?.includes("409")){if(await $({machineName:xA,message:EA.detail})==="takeover")y=!1,EA.detail=null,p=await r()}if(!p){let n=EA.detail??"initBridgeCore returned null (env registration or session creation failed)";return Z(`[bridge:daemon] connectRemoteControl failed: ${n}`),{ok:!1,error:{kind:EA.detail?.includes("409")?"conflict":EA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:n}}}async function*gA(){while(!y){while(L.length>0)if(yield L.shift(),y)return;await new Promise((n)=>{z=n})}}async function*l(){while(!y){while(x.length>0)if(yield x.shift(),y)return;await new Promise((n)=>{q=n})}}async function*XA(){while(!y){while(O.length>0)if(yield O.shift(),y)return;await new Promise((n)=>{P=n})}}return{ok:!0,handle:{get sessionUrl(){return Ts(p.bridgeSessionId,V)},get environmentId(){return p.environmentId},get bridgeSessionId(){return p.bridgeSessionId},getSSESequenceNum(){return p.getSSESequenceNum()},hasPendingPrompts(){return L.length>0},write(n){p.writeSdkMessages([n])},sendResult(){p.sendResult()},sendControlRequest(n){p.sendControlRequest(n)},sendControlResponse(n){p.sendControlResponse(n)},sendControlCancelRequest(n){p.sendControlCancelRequest(n)},inboundPrompts:gA,controlRequests:l,permissionResponses:XA,onStateChange(n){a=n},async teardown(){y=!0,z?.(),q?.(),P?.(),await p.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var xSA=1000,RSA=1e4,jSA=5000,gSA=60000,ML=3;function qSA(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 OSA(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"&&qL(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}async function SSA(A){let{bridge:Q,sandboxed:B=!1,scheduling:I,buildQueryOptions:E,canUseToolPreFilter:C,onPermissionResolved:Y,transformOutbound:J,stateAdapter:G,initialPrompt:U,userIdleMs:F=300000,signal:N,log:D=()=>{}}=A;D("─── worker start ───");let W=await G?.load(),$={...Q,initialSSESequenceNum:Q.initialSSESequenceNum??W?.lastSSESequenceNum};if(!$.getAccessToken())return{ok:!1,error:{kind:"auth",detail:"getAccessToken returned empty"}};let X=await ks($);if(!X.ok)return D(`bridge connection failed: ${X.error.kind} — ${X.error.detail}`),{ok:!1,error:X.error};let V=X.handle;D(`bridge connected url=${V.sessionUrl} env=${V.environmentId}`);let M=W?.claudeSessionId,L=V.bridgeSessionId,z=[],x=null,q=!1,O=null,P=0,y=!0,a=0,EA=Promise.resolve();function xA(){if(!G)return;let v={claudeSessionId:M,lastSSESequenceNum:V.getSSESequenceNum(),bridgeSessionId:V.bridgeSessionId};EA=EA.then(()=>G.save(v).catch((wQ)=>{D(`stateAdapter.save threw: ${wQ}`)}))}function r(){if(z.length>0||V.hasPendingPrompts()){D("persist skipped: prompt queued");return}xA()}xA();let p=new AbortController,gA=new Map,l=null;function XA(){return l??=(async()=>{r();for(let v of gA.keys())V.sendControlCancelRequest(v);gA.clear(),await V.teardown(),await EA})()}if(N.addEventListener("abort",()=>{p.abort(),XA().catch((v)=>D(`teardown threw: ${v}`))}),N.aborted)return await XA(),{ok:!1,error:{kind:"unknown",detail:"aborted before start"}};let cA="connected";V.onStateChange((v,wQ)=>{if(D(`bridge state=${v} detail=${wQ??""}`),cA=v,v==="ready"&&V.bridgeSessionId!==L)L=V.bridgeSessionId,xA();else if(v==="connected")r();if(v==="failed")D(`bridge failed: ${wQ??"unknown"}`),p.abort(),XA().catch((IQ)=>D(`teardown threw: ${IQ}`))});let n=I?.horizonMs??600000,QQ=I?.leadMs??jSA,t=null,i=!1,IA=!1,sA="";async function _A(){if(!I)return;let v=await XT(I.dir).catch((IQ)=>{return D(`computeCronHorizon threw: ${IQ}`),{nextFire:null,hasOverdue:!1}});t=v.nextFire,IA=v.hasOverdue;let wQ=v.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(v.nextFire).toISOString()} hasOverdue=${v.hasOverdue}`;if(wQ!==sA)sA=wQ,D(wQ)}let BQ;if(I)await _A(),BQ=setInterval(_A,RSA),BQ.unref?.();function VB(v){z.push({type:"user",message:{role:"user",content:v},parent_tool_use_id:null,session_id:""}),x?.(),x=null}async function oA(v,wQ,IQ){if(C){let YQ=await C(v,wQ,IQ);if(YQ)return Y?.(v,YQ),YQ}if(cA!=="connected"){D(`permission denied — bridge state=${cA}, request would drop`);let YQ={behavior:"deny",message:`Cannot request permission: remote control is ${cA}. Try again in a moment.`};return Y?.(v,YQ),YQ}let pA=LSA();D(`permission request tool=${v} req=${pA}`);let{signal:_B,suggestions:pC,blockedPath:PB,toolUseID:YA}=IQ;V.sendControlRequest({type:"control_request",request_id:pA,request:{subtype:"can_use_tool",tool_name:v,display_name:OL(v),input:wQ,tool_use_id:YA,...pC&&{permission_suggestions:pC},...PB&&{blocked_path:PB},..."decisionReason"in IQ&&IQ.decisionReason&&{decision_reason:IQ.decisionReason},..."agentID"in IQ&&IQ.agentID&&{agent_id:IQ.agentID}}});let YI;try{let YQ=await new Promise((OI,XB)=>{gA.set(pA,OI),YI=setTimeout((LE,lC,GB,iC,d0)=>{if(LE.delete(lC))GB(`permission timeout req=${lC}`),iC.sendControlCancelRequest(lC),d0({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},gSA,gA,pA,D,V,OI),YI.unref?.(),_B.addEventListener("abort",()=>{if(gA.delete(pA))V.sendControlCancelRequest(pA);XB(Error("aborted"))},{once:!0})});D(`permission response req=${pA} behavior=${YQ.behavior}`);let dQ=YQ.behavior==="allow"?{behavior:"allow",updatedInput:YQ.updatedInput,updatedPermissions:YQ.updatedPermissions}:{behavior:"deny",message:YQ.message??"Denied via remote control"};return Y?.(v,dQ),dQ}finally{if(YI)clearTimeout(YI);gA.delete(pA)}}let JB=!1;async function WA(){if(O!==null||JB||p.signal.aborted)return;if(JB=!0,q=!1,z.length>0)y=!1;async function*v(){while(!q){while(z.length>0)if(y=!1,yield z.shift(),q)return;await new Promise((pA)=>{x=pA})}}D(`spawning query resume=${M??"<fresh>"}`);let wQ={assistant:!0,cwd:Q.dir,resume:M,stderr:(pA)=>D(`[child] ${pA.trimEnd()}`),canUseTool:oA},IQ;try{if(IQ=await E(wQ),B)IQ={...IQ,env:{...IQ.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(pA){if(D(`buildQueryOptions threw: ${pA}`),JB=!1,a++,a>=ML)D(`${a} consecutive buildQueryOptions failures — dropping ${z.length} queued input(s)`),z.length=0;else if(z.length>0&&!p.signal.aborted)WA();return}if(p.signal.aborted){JB=!1;return}try{O=hv({prompt:v(),options:IQ})}finally{JB=!1}(async()=>{try{D("output pump started");for await(let pA of O){if(pA.type==="system"&&pA.subtype==="init"){if(pA.session_id!==M)M=pA.session_id,r()}if(pA.type==="result")y=!0,a=0,i=!0,r();if(!qSA(pA))continue;let _B=J?J(pA):pA;if(_B===null)continue;V.write(_B)}}catch(pA){D(`query threw: ${pA}`),a++}finally{D("output pump ended"),O=null;for(let pA of gA.keys())V.sendControlCancelRequest(pA);if(gA.clear(),z.length>0&&!p.signal.aborted)if(a>=ML)D(`${a} consecutive crashes — dropping ${z.length} queued input(s)`),z.length=0;else WA()}})()}let ZQ=setInterval(()=>{let v=Date.now(),wQ=t!==null&&t-v<n;if(O===null){let IQ=t!==null&&t-v<QQ;if((IQ||IA&&!i)&&a<ML&&!p.signal.aborted)D(IQ?`cron due in ${t-v}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),WA();return}if(q)return;if(!y||z.length>0)return;if(v-P<F)return;if(wQ)return;if(IA&&!i)return;D("idle conditions met → closing input gen"),r(),q=!0,x?.(),x=null},xSA);if(ZQ.unref?.(),U)D("initialPrompt → injecting"),P=Date.now(),VB(U),WA();let BJ=(async()=>{if(await Promise.all([(async()=>{for await(let v of V.inboundPrompts()){if(p.signal.aborted)return;if(D("bridge prompt received"),P=Date.now(),v.uuid)V.write({type:"user",uuid:v.uuid,session_id:"",message:{role:"user",content:v.content},parent_tool_use_id:null});VB(v.content),WA()}})(),(async()=>{for await(let v of V.controlRequests()){if(p.signal.aborted)return;switch(v.request.subtype){case"interrupt":D("bridge interrupt"),O?.interrupt();break;case"set_model":D(`bridge setModel=${v.request.model??"<default>"}`),O?.setModel(v.request.model);break;case"set_max_thinking_tokens":D(`bridge setMaxThinkingTokens=${v.request.max_thinking_tokens}`),O?.setMaxThinkingTokens(v.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let v of V.permissionResponses()){if(p.signal.aborted)return;let wQ=OSA(v,gA,V.sendControlCancelRequest);if(wQ)D(`permission response for unknown req=${wQ} (stale)`)}})()]),clearInterval(ZQ),BQ)clearInterval(BQ);O?.close(),await XA(),D("─── worker stop ───")})();return{ok:!0,handle:{get sessionUrl(){return V.sessionUrl},get bridgeSessionId(){return V.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(v){P=Date.now(),VB(v),WA()},async interrupt(){await O?.interrupt()},done:BJ,teardown:XA,[Symbol.asyncDispose]:XA}}}export{SSA 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<oOA){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(dOA*Math.pow(2,this.reconnectAttempts-1),nOA),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)`),c("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"}),c("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"}),c("error","cli_sse_liveness_timeout"),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,aOA)}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"),c("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":PU()};Z(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=y4;I++){try{let C=await PQ.post(this.postUrl,A,{headers:B,validateStatus:ASA});if(C.status===200||C.status===201){Z(`SSETransport: POST success type=${A.type}`);return}if(Z(`SSETransport: POST ${C.status} body=${zA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){Z(`SSETransport: POST returned ${C.status} (client error), not retrying`),c("warn","cli_sse_post_client_error",{status:C.status});return}Z(`SSETransport: POST returned ${C.status}, attempt ${I}/${y4}`),c("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){Z(`SSETransport: POST error: ${JA(C)}, attempt ${I}/${y4}`),c("warn","cli_sse_post_network_error",{attempt:I})}if(I===y4){Z(`SSETransport: POST failed after ${y4} attempts, continuing`),c("warn","cli_sse_post_retries_exhausted");return}let E=Math.min(tOA*Math.pow(2,I-1),sOA);await mB(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 BSA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}WQ();OQ();function Ks(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 Hs(A){let{sessionUrl:Q,ingressToken:B,sessionId:I,initialSequenceNum:E,getAuthToken:C}=A,Y;if(C)Y=()=>{let X=C();if(!X)return{};return{Authorization:`Bearer ${X}`}};else xD(B);let J=A.epoch??await Tm(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 $L(G,{},I,void 0,E,Y),F,N=new DL(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(X){Z(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${JA(X)}`,{level:"error"})}throw Error("epoch superseded")}});U.setOnEvent((X)=>{N.reportDelivery(X.event_id,"received"),N.reportDelivery(X.event_id,"processed")});let D,W=!1,$=!1;return{write(X){return N.writeEvent(X)},async writeBatch(X){for(let V of X){if($)break;await N.writeEvent(V)}},close(){$=!0,N.close(),U.close()},isConnectedStatus(){return W},getStateLabel(){if(U.isClosedStatus())return"closed";if(U.isConnectedStatus())return W?"connected":"init";return"connecting"},setOnData(X){U.setOnData(X)},setOnClose(X){F=X,U.setOnClose((V)=>{N.close(),X(V??4092)})},setOnConnect(X){D=X},getLastSequenceNum(){return U.getLastSequenceNum()},droppedBatchCount:0,reportState(X,V){N.reportState(X,V)},reportMetadata(X){N.reportMetadata(X)},reportDelivery(X,V){N.reportDelivery(X,V)},flush(){return N.flush()},getInternalEventWriter(){return(X,V,M)=>N.writeInternalEvent(X,V,M)},getInternalEventReaders(){return{readMain:()=>N.readInternalEvents(),readSubagents:()=>N.readSubagentInternalEvents()}},connect(){if(!A.outboundOnly)U.connect();N.initialize(J).then(()=>{W=!0,Z(`[bridge:repl] v2 transport ready for writes (epoch=${J}, sse=${U.isConnectedStatus()?"open":"opening"})`),D?.()},(X)=>{Z(`[bridge:repl] CCR v2 initialize failed: ${JA(X)}`,{level:"error"}),N.close(),U.close(),F?.(4091)})}}}WQ();OQ();var ISA="2023-06-01",ESA="ccr-byoc-2025-07-29";async function Ls({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 PQ.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:K2(U,J),signal:I,validateStatus:(W)=>W<500})}catch(W){return Z(`[bridge] Session creation request failed: ${JA(W)}`),null}if(N.status!==200&&N.status!==201){let W=qY(N.data);return Z(`[bridge] Session creation failed with status ${N.status}${W?`: ${W}`:""}`),null}let D=N.data;if(!D||typeof D!=="object"||!("id"in D)||typeof D.id!=="string")return Z("[bridge] No session ID in response"),null;return D.id}async function xs(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 PQ.post(Y,{},{headers:K2(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)Z(`[bridge] Session ${A} archived successfully`);else{let G=qY(J.data);Z(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){Z(`[bridge] Session archive request failed: ${JA(J)}`)}}async function w2(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:jG(Q),repo:B,pr_number:I},U;try{U=await PQ.post(J,G,{headers:K2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return Z(`[bridge] ${A}-pr request failed: ${JA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=qY(U.data);return Z(`[bridge] ${A}-pr failed ${U.status}${N?`: ${N}`:""}`),!1}return Z(`[bridge] ${A}-pr ${B}#${I} ok`),!0}async function z2(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:jG(Q),channel:B,thread_ts:I},U;try{U=await PQ.post(J,G,{headers:K2(Y),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return Z(`[bridge] ${A}-thread request failed: ${JA(N)}`),!1}if(!(U.status>=200&&U.status<300||U.status===409)){let N=qY(U.data);return Z(`[bridge] ${A}-thread failed ${U.status}${N?`: ${N}`:""}`),!1}return Z(`[bridge] ${A}-thread ${B}/${I} ok`),!0}function K2(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":ISA,"anthropic-beta":ESA};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}QB();function Rs(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 WL{_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}}OQ();WQ();var XSA=2000,_s=60000,Ps=900000,MSA=0;async function vs(A){let{dir:Q,registrationDir:B,machineName:I,branch:E,gitRepoUrl:C,title:Y,baseUrl:J,sessionIngressUrl:G,workerType:U,getAccessToken:F,createSession:N,archiveSession:D,getCurrentTitle:W=()=>Y,toSDKMessages:$=()=>{throw Error("BridgeCoreParams.toSDKMessages not provided. Pass it if you use writeMessages() or initialMessages — daemon callers that only use writeSdkMessages() never hit this path.")},onAuth401:X,getTrustedDeviceToken:V,getPollIntervalConfig:M=()=>nN,initialHistoryCap:L=200,initialMessages:z,previouslyFlushedUUIDs:x,onInboundMessage:q,onPermissionResponse:O,onInterrupt:P,onSetModel:y,onSetMaxThinkingTokens:a,onSetPermissionMode:EA,onRenameSession:xA,onStateChange:r,onUserMessage:p,onSessionEstablished:gA,onInitError:l,perpetual:XA,initialSSESequenceNum:cA=0,onTransportPersistenceReady:n,onTransportPersistenceTeardown:QQ}=A,t=++MSA,{writeBridgePointer:i,clearBridgePointer:IA,readBridgePointer:sA}=await Promise.resolve().then(() => (Os(),qs)),_A=XA?await sA(Q):null,BQ=_A?.source==="repl"?_A:null;Z(`[bridge:repl] initBridgeCore #${t} starting (initialMessages=${z?.length??0}${BQ?` perpetual prior=env:${BQ.environmentId}`:""})`);let oA=Lm({baseUrl:J,getAccessToken:F,runnerVersion:"0.2.112",onDebug:Z,onAuth401:X,getTrustedDeviceToken:V}),JB={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:Ss(),workerType:U,environmentId:Ss(),reuseEnvironmentId:BQ?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},WA,ZQ;try{let k=await oA.registerBridgeEnvironment(JB);WA=k.environment_id,ZQ=k.environment_secret}catch(k){if(Hm("registration_failed",`[bridge:repl] Environment registration failed: ${JA(k)}`),l?.(`[bridge:repl] Environment registration failed: ${JA(k)}`),BQ&&k instanceof $E&&(k.status===410||k.status!==401&&ZV(k.errorType)))await IA(Q);return r?.("failed",JA(k)),null}Z(`[bridge:repl] Environment registered: ${WA}`),c("info","bridge_repl_env_registered"),rA("tengu_bridge_repl_env_registered",{});async function BJ(k,QA){if(WA!==k)return Z(`[bridge:repl] Env mismatch (requested ${k}, got ${WA}) — cannot reconnect in place`),!1;let bA=M3(QA),LA=bA===QA?[QA]:[QA,bA];for(let xQ of LA)try{return await oA.reconnectSession(WA,xQ),Z(`[bridge:repl] Reconnected session ${xQ} in place on env ${WA}`),!0}catch(sI){Z(`[bridge:repl] reconnectSession(${xQ}) failed: ${JA(sI)}`)}return Z("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let i0=BQ?await BJ(BQ.environmentId,BQ.sessionId):!1;if(BQ&&!i0)await IA(Q);let v,wQ=new Set,IQ=new Set;if(i0&&BQ){if(v=BQ.sessionId,Z(`[bridge:repl] Perpetual session reused: ${v}`),z&&x)for(let k of z)x.add(k.uuid)}else{let k=await N({environmentId:WA,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!k)return Z("[bridge:repl] Session creation failed, deregistering environment"),l?.("[bridge:repl] Session creation failed, deregistering environment"),rA("tengu_bridge_repl_session_failed",{}),await oA.deregisterEnvironment(WA).catch(()=>{}),r?.("failed","Session creation failed"),null;v=k,Z(`[bridge:repl] Session created: ${v}`)}gA?.(v),await i(Q,{sessionId:v,environmentId:WA,source:"repl"}),c("info","bridge_repl_session_created"),rA("tengu_bridge_repl_started",{has_initial_messages:!!(z&&z.length>0),inProtectedNamespace:fx(),...Rm()});let pA=new Set;if(z)for(let k of z)pA.add(k.uuid);let _B=new wV(2000);for(let k of pA)_B.add(k);let pC=new wV(2000),PB=new AbortController,YA=null,YI=0,YQ=i0?cA:0,dQ=null,OI=null,XB=Rs(PB.signal),LE=XB.wake,lC=XB.signal,GB=new WL,iC=!p,d0=3,tI=0,MB=null;async function SI(){if(MB)return MB;MB=dC();try{return await MB}finally{MB=null}}async function dC(){if(tI++,YI++,Z(`[bridge:repl] Reconnecting after env lost (attempt ${tI}/${d0})`),tI>d0)return Z(`[bridge:repl] Environment reconnect limit reached (${d0}), giving up`),!1;if(YA){let LA=YA.getLastSequenceNum();if(LA>YQ)YQ=LA;QQ?.(),YA.close(),YA=null}if(LE(),GB.drop(),dQ){let LA=dQ;if(await oA.stopWork(WA,LA,!1).catch(()=>{}),dQ!==LA)return Z("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),tI=0,!0;dQ=null,OI=null}if(PB.signal.aborted)return Z("[bridge:repl] Reconnect aborted by teardown"),!1;let k=WA;JB.reuseEnvironmentId=k;try{let LA=await oA.registerBridgeEnvironment(JB);WA=LA.environment_id,ZQ=LA.environment_secret}catch(LA){return JB.reuseEnvironmentId=void 0,Z(`[bridge:repl] Environment re-registration failed: ${JA(LA)}`),!1}if(JB.reuseEnvironmentId=void 0,Z(`[bridge:repl] Re-registered: requested=${k} got=${WA}`),PB.signal.aborted)return Z("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await oA.deregisterEnvironment(WA).catch(()=>{}),!1;if(YA!==null)return Z("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),tI=0,!0;if(await BJ(k,v))return rA("tengu_bridge_repl_reconnected_in_place",{}),tI=0,!0;if(WA!==k)rA("tengu_bridge_repl_env_expired_fresh_session",{});if(await D(v),PB.signal.aborted)return Z("[bridge:repl] Reconnect aborted after archive, cleaning up"),await oA.deregisterEnvironment(WA).catch(()=>{}),!1;let QA=W(),bA=await N({environmentId:WA,title:QA,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!bA)return Z("[bridge:repl] Session creation failed during reconnection"),!1;if(PB.signal.aborted)return Z("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await D(bA),!1;if(v=bA,hm(jG(bA)).catch(()=>{}),gA?.(v),YQ=0,pC.clear(),iC=!p,Z(`[bridge:repl] Re-created session: ${v}`),await i(Q,{sessionId:v,environmentId:WA,source:"repl"}),x?.clear(),wQ.size>0){Z(`[bridge:repl] Replaying ${wQ.size} PR subscription(s) against new session`);for(let LA of wQ){let xQ=LA.lastIndexOf("#");w2("subscribe",v,LA.slice(0,xQ),Number(LA.slice(xQ+1)),J,F)}}if(IQ.size>0){Z(`[bridge:repl] Replaying ${IQ.size} Slack thread subscription(s) against new session`);for(let LA of IQ){let xQ=LA.indexOf("/");z2("subscribe",v,LA.slice(0,xQ),LA.slice(xQ+1),J,F)}}return tI=0,!0}function tE(){return F()}function nC(){let k=GB.end();if(k.length===0)return;if(!YA){Z(`[bridge:repl] Cannot drain ${k.length} pending message(s): no transport`);return}for(let LA of k)_B.add(LA.uuid);let bA=$(k).map((LA)=>({...LA,session_id:v}));Z(`[bridge:repl] Drained ${k.length} pending message(s) after flush`),YA.writeBatch(bA)}let f4=null;function L2(){f4?.()}function ZL(k){if(Z(`[bridge:repl] Transport permanently closed: code=${k}`),rA("tengu_bridge_repl_ws_closed",{code:k}),YA){let bA=YA.getLastSequenceNum();if(bA>YQ)YQ=bA;QQ?.(),YA=null}LE();let QA=GB.drop();if(QA>0)Z(`[bridge:repl] Dropping ${QA} pending message(s) on transport close (code=${k})`,{level:"warn"});if(k===1000){r?.("failed","session ended"),PB.abort(),L2();return}r?.("reconnecting",`Remote Control connection lost (code ${k})`),Z(`[bridge:repl] Transport reconnect budget exhausted (code=${k}), attempting env reconnect`),SI().then((bA)=>{if(bA)return;if(PB.signal.aborted)return;Z("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),rA("tengu_bridge_repl_reconnect_failed",{close_code:k}),r?.("failed","reconnection failed"),L2()})}let wL,bs=null,ys={api:oA,getCredentials:()=>({environmentId:WA,environmentSecret:ZQ}),signal:PB.signal,getPollIntervalConfig:M,onStateChange:r,getWsState:()=>YA?.getStateLabel()??"null",isAtCapacity:()=>YA!==null,capacitySignal:lC,onFatalError:L2,getHeartbeatInfo:()=>{if(!dQ||!OI)return null;return{environmentId:WA,workId:dQ,sessionToken:OI}},onHeartbeatFatal:(k)=>{if(Z(`[bridge:repl] heartbeatWork fatal (status=${k.status}) — tearing down work item for fast re-dispatch`),YA){let QA=YA.getLastSequenceNum();if(QA>YQ)YQ=QA;QQ?.(),YA.close(),YA=null}if(GB.drop(),dQ)oA.stopWork(WA,dQ,!1).catch((QA)=>{Z(`[bridge:repl] stopWork after heartbeat fatal: ${JA(QA)}`)});dQ=null,OI=null,LE(),r?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await SI())return null;return{environmentId:WA,environmentSecret:ZQ}},onWorkReceived:(k,QA,bA,LA)=>{if(YA?.isConnectedStatus())Z(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${bA})`);if(Z(`[bridge:repl] Work received: workId=${bA} workSessionId=${k} currentSessionId=${v} match=${V3(k,v)}`),i(Q,{sessionId:v,environmentId:WA,source:"repl"}),!V3(k,v)){Z(`[bridge:repl] Rejecting foreign session: expected=${v} got=${k}`);return}dQ=bA,OI=QA;let xQ=LA||lA(process.env.CLAUDE_BRIDGE_USE_CCR_V2),sI;if(!xQ){if(sI=tE(),!sI){Z("[bridge:repl] No OAuth token available for session ingress, skipping work");return}xD(sI)}if(rA("tengu_bridge_repl_work_received",{}),YA){QQ?.();let kQ=YA;YA=null;let uQ=kQ.getLastSequenceNum();if(uQ>YQ)YQ=uQ;kQ.close()}GB.deactivate();let hs=(kQ)=>Sm(kQ,{transport:YA,sessionId:v,onInterrupt:P,onSetModel:y,onSetMaxThinkingTokens:a,onSetPermissionMode:EA,onRenameSession:xA}),g2=!1,HL=(kQ)=>{if(YA=kQ,kQ.setOnConnect(()=>{if(YA!==kQ)return;if(Z("[bridge:repl] Ingress transport connected"),rA("tengu_bridge_repl_ws_connected",{}),!xQ){let uQ=tE();if(uQ)xD(uQ)}if(j2=!1,!g2&&z&&z.length>0){g2=!0;let uQ=L,hB=z.filter((h4)=>$3(h4)&&!x?.has(h4.uuid)),sE=uQ>0&&hB.length>uQ?hB.slice(-uQ):hB;if(sE.length<hB.length)Z(`[bridge:repl] Capped initial flush: ${hB.length} -> ${sE.length} (cap=${uQ})`),rA("tengu_bridge_repl_history_capped",{eligible_count:hB.length,capped_count:sE.length});let oC=$(sE);if(oC.length>0){Z(`[bridge:repl] Flushing ${oC.length} initial message(s) via transport`);let h4=oC.map((IJ)=>({...IJ,session_id:v})),LL=kQ.droppedBatchCount;kQ.writeBatch(h4).then(()=>{if(kQ.droppedBatchCount>LL){Z(`[bridge:repl] Initial flush dropped ${kQ.droppedBatchCount-LL} batch(es) — not marking ${oC.length} UUID(s) as flushed`);return}if(x){for(let IJ of oC)if(IJ.uuid)x.add(IJ.uuid)}}).catch((IJ)=>Z(`[bridge:repl] Initial flush failed: ${IJ}`)).finally(()=>{if(YA!==kQ)return;nC(),r?.("connected")})}else nC(),r?.("connected")}else if(!GB.active)r?.("connected")}),kQ.setOnData((uQ)=>{Om(uQ,_B,pC,q,O,hs)}),bs=ZL,kQ.setOnClose((uQ)=>{if(YA!==kQ)return;ZL(uQ)}),!g2&&z&&z.length>0)GB.start();kQ.connect()};if(YI++,xQ){let kQ=vm(J,k),uQ=YI;Z(`[bridge:repl] CCR v2: sessionUrl=${kQ} session=${k} gen=${uQ}`),Hs({sessionUrl:kQ,ingressToken:QA,sessionId:k,initialSequenceNum:YQ}).then((hB)=>{if(PB.signal.aborted){hB.close();return}if(uQ!==YI){Z(`[bridge:repl] CCR v2: discarding stale handshake gen=${uQ} current=${YI}`),hB.close();return}if(HL(hB),n){let sE=hB.getInternalEventWriter?.(),oC=hB.getInternalEventReaders?.();if(sE&&oC)n(sE,oC)}},(hB)=>{if(Z(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${JA(hB)}`,{level:"error"}),rA("tengu_bridge_repl_ccr_v2_init_failed",{}),uQ!==YI)return;if(dQ)oA.stopWork(WA,dQ,!1).catch((sE)=>{Z(`[bridge:repl] stopWork after v2 init failure: ${JA(sE)}`)}),dQ=null,OI=null;LE()})}else{let kQ=Pm(G,k);Z(`[bridge:repl] Ingress URL: ${kQ}`),Z(`[bridge:repl] Creating HybridTransport: session=${k}`);let uQ=sI??"";HL(Ks(new FL(new URL(kQ),{Authorization:`Bearer ${uQ}`,"anthropic-version":"2023-06-01"},k,()=>({Authorization:`Bearer ${tE()??uQ}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{r?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),LE()}})))}}};ZSA(ys);let x2=XA?setInterval(()=>{if(MB)return;i(Q,{sessionId:v,environmentId:WA,source:"repl"})},3600000):null;x2?.unref?.();let zL=M().session_keepalive_interval_v2_ms,R2=zL>0?setInterval(()=>{if(!YA)return;Z("[bridge:repl] keep_alive sent"),YA.write({type:"keep_alive"}).catch((k)=>{Z(`[bridge:repl] keep_alive write failed: ${JA(k)}`)})},zL):null;R2?.unref?.();let j2=!1;f4=async()=>{if(j2){Z(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${WA} session=${v}`);return}j2=!0,QQ?.();let k=Date.now();if(Z(`[bridge:repl] Teardown starting: env=${WA} session=${v} workId=${dQ??"none"} transportState=${YA?.getStateLabel()??"null"}`),x2!==null)clearInterval(x2);if(R2!==null)clearInterval(R2);if(wL)process.off("SIGUSR2",wL);if(PB.abort(),Z("[bridge:repl] Teardown: poll loop aborted"),YA){let LA=YA.getLastSequenceNum();if(LA>YQ)YQ=LA}if(XA){YA=null,GB.drop(),await i(Q,{sessionId:v,environmentId:WA,source:"repl"}),Z(`[bridge:repl] Teardown (perpetual): leaving env=${WA} session=${v} alive on server, duration=${Date.now()-k}ms`);return}let QA=YA;if(YA=null,GB.drop(),QA)QA.write(W3(v));let bA=dQ?oA.stopWork(WA,dQ,!0).then(()=>{Z("[bridge:repl] Teardown: stopWork completed")}).catch((LA)=>{Z(`[bridge:repl] Teardown stopWork failed: ${JA(LA)}`)}):Promise.resolve();await Promise.all([bA,D(v)]),QA?.close(),Z("[bridge:repl] Teardown: transport closed"),await oA.deregisterEnvironment(WA).catch((LA)=>{Z(`[bridge:repl] Teardown deregister failed: ${JA(LA)}`)}),await IA(Q),Z(`[bridge:repl] Teardown complete: env=${WA} duration=${Date.now()-k}ms`)};let fs=E0(()=>f4?.());Z(`[bridge:repl] Ready: env=${WA} session=${v}`),r?.("ready");let KL={get bridgeSessionId(){return v},get environmentId(){return WA},getSSESequenceNum(){let k=YA?.getLastSequenceNum()??0;return Math.max(YQ,k)},sessionIngressUrl:G,writeMessages(k){let QA=k.filter((xQ)=>$3(xQ)&&!pA.has(xQ.uuid)&&!_B.has(xQ.uuid));if(QA.length===0)return;if(!iC)for(let xQ of QA){let sI=qm(xQ);if(sI!==void 0&&p?.(sI,v)){iC=!0;break}}if(GB.enqueue(...QA)){Z(`[bridge:repl] Queued ${QA.length} message(s) during initial flush`);return}if(!YA){let xQ=QA.map((sI)=>sI.type).join(",");Z(`[bridge:repl] Transport not configured, dropping ${QA.length} message(s) [${xQ}] for session=${v}`,{level:"warn"});return}for(let xQ of QA)_B.add(xQ.uuid);Z(`[bridge:repl] Sending ${QA.length} message(s) via transport`);let LA=$(QA).map((xQ)=>({...xQ,session_id:v}));YA.writeBatch(LA)},writeSdkMessages(k){let QA=k.filter((LA)=>!LA.uuid||!_B.has(LA.uuid));if(QA.length===0)return;if(!YA){Z(`[bridge:repl] Transport not configured, dropping ${QA.length} SDK message(s) for session=${v}`,{level:"warn"});return}for(let LA of QA)if(LA.uuid)_B.add(LA.uuid);let bA=QA.map((LA)=>({...LA,session_id:v}));YA.writeBatch(bA)},sendControlRequest(k){if(!YA){Z("[bridge:repl] Transport not configured, skipping control_request");return}let QA={...k,session_id:v};YA.write(QA),Z(`[bridge:repl] Sent control_request request_id=${k.request_id}`)},sendControlResponse(k){if(!YA){Z("[bridge:repl] Transport not configured, skipping control_response");return}let QA={...k,session_id:v};YA.write(QA),Z("[bridge:repl] Sent control_response")},sendControlCancelRequest(k){if(!YA){Z("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let QA={type:"control_cancel_request",request_id:k,session_id:v};YA.write(QA),Z(`[bridge:repl] Sent control_cancel_request request_id=${k}`)},reportMetadata(k){YA?.reportMetadata(k)},sendResult(){if(!YA){Z(`[bridge:repl] sendResult: skipping, transport not configured session=${v}`);return}YA.write(W3(v)),Z(`[bridge:repl] Sent result for session=${v}`)},async subscribePR(k,QA){let bA=await w2("subscribe",v,k,QA,J,F);if(bA)wQ.add(`${k}#${QA}`);return bA},async unsubscribePR(k,QA){let bA=await w2("unsubscribe",v,k,QA,J,F);if(bA)wQ.delete(`${k}#${QA}`);return bA},async subscribeSlackThread(k,QA){let bA=await z2("subscribe",v,k,QA,J,F);if(bA)IQ.add(`${k}/${QA}`);return bA},async unsubscribeSlackThread(k,QA){let bA=await z2("unsubscribe",v,k,QA,J,F);if(bA)IQ.delete(`${k}/${QA}`);return bA},async teardown(){fs(),await f4?.(),Z("[bridge:repl] Torn down"),rA("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return KL.teardown()}};return KL}async function ZSA({api:A,getCredentials:Q,signal:B,onStateChange:I,onWorkReceived:E,onEnvironmentLost:C,getWsState:Y,isAtCapacity:J,capacitySignal:G,onFatalError:U,getPollIntervalConfig:F=()=>nN,getHeartbeatInfo:N,onHeartbeatFatal:D}){Z(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let $=0,X=null,V=null,M=0,L=!1;while(!B.aborted){let{environmentId:z,environmentSecret:x}=Q(),q=F();try{let O=await A.pollForWork(z,x,B,q.reclaim_older_than_ms);if(M=0,$>0)Z(`[bridge:repl] Poll recovered after ${$} consecutive error(s)`),$=0,X=null,V=null,I?.("ready");if(!O){let y=L;if(L=!1,J?.()&&G&&!y){let a=q.poll_interval_ms_at_capacity;if(q.non_exclusive_heartbeat_interval_ms>0&&N){rA("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:q.non_exclusive_heartbeat_interval_ms});let xA=a>0?Date.now()+a:null,r=!1,p=0;while(!B.aborted&&J()&&(xA===null||Date.now()<xA)){let l=F();if(l.non_exclusive_heartbeat_interval_ms<=0)break;let XA=N();if(!XA)break;let cA=G();try{await A.heartbeatWork(XA.environmentId,XA.workId,XA.sessionToken)}catch(n){if(Z(`[bridge:repl:heartbeat] Failed: ${JA(n)}`),n instanceof $E){if(cA.cleanup(),rA("tengu_bridge_heartbeat_error",{status:n.status,error_type:n.status===401||n.status===403?"auth_failed":"fatal"}),D)D(n),Z(`[bridge:repl:heartbeat] Fatal (status=${n.status}), work state cleared — fast-polling for re-dispatch`);else r=!0;break}}p++,await mB(l.non_exclusive_heartbeat_interval_ms,cA.signal),cA.cleanup()}let gA=r?"error":B.aborted?"shutdown":!J()?"capacity_changed":xA!==null&&Date.now()>=xA?"poll_due":"config_disabled";if(rA("tengu_bridge_heartbeat_mode_exited",{reason:gA,heartbeat_cycles:p}),!r){if(gA==="poll_due")Z(`[bridge:repl] Heartbeat poll_due after ${p} cycles — falling through to pollForWork`);continue}}let EA=a>0?a:q.non_exclusive_heartbeat_interval_ms;if(EA>0){let xA=G(),r=Date.now();await mB(EA,xA.signal),xA.cleanup();let p=Date.now()-r-EA;if(p>60000)Z(`[bridge:repl] At-capacity sleep overran by ${Math.round(p/1000)}s — process suspension detected, forcing one fast-poll cycle`),rA("tengu_bridge_repl_suspension_detected",{overrun_ms:p}),L=!0}}else await mB(q.poll_interval_ms_not_at_capacity,B);continue}let P;try{P=_m(O.secret)}catch(y){Z(`[bridge:repl] Failed to decode work secret: ${JA(y)}`),rA("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(z,O.id,!1).catch(()=>{});continue}Z(`[bridge:repl] Acknowledging workId=${O.id}`);try{await A.acknowledgeWork(z,O.id,P.session_ingress_token)}catch(y){Z(`[bridge:repl] Acknowledge failed workId=${O.id}: ${JA(y)}`)}if(O.data.type==="healthcheck"){Z("[bridge:repl] Healthcheck received");continue}if(O.data.type==="session"){let y=O.data.id;try{sB(y,"session_id")}catch{Z(`[bridge:repl] Invalid session_id in work: ${y}`);continue}E(y,P.session_ingress_token,O.id,P.use_code_sessions===!0),Z("[bridge:repl] Work accepted, continuing poll loop")}}catch(O){if(B.aborted)break;if(O instanceof $E&&O.status===404&&C){let p=Q().environmentId;if(z!==p){Z(`[bridge:repl] Stale poll error for old env=${z}, current env=${p} — skipping onEnvironmentLost`),$=0,X=null;continue}if(M++,Z(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${M}/3)`),rA("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 gA=await C();if(B.aborted)break;if(gA){$=0,X=null,I?.("ready"),Z(`[bridge:repl] Re-registered environment: ${gA.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(O instanceof $E){let p=ZV(O.errorType),gA=xm(O);if(Z(`[bridge:repl] Fatal poll error: ${O.message} (status=${O.status}, type=${O.errorType??"unknown"})${gA?" (suppressed)":""}`),rA("tengu_bridge_repl_fatal_error",{status:O.status,error_type:O.errorType}),c(p?"info":"error","bridge_repl_fatal_error",{status:O.status,error_type:O.errorType}),!gA)I?.("failed",p?"session expired · /remote-control to reconnect":O.message);U?.();break}let P=Date.now();if(V!==null&&P-V>_s*2)Z(`[bridge:repl] Detected system sleep (${Math.round((P-V)/1000)}s gap), resetting poll error budget`),c("info","bridge_repl_poll_sleep_detected",{gapMs:P-V}),$=0,X=null;if(V=P,$++,X===null)X=P;let y=P-X,a=Km(O),EA=zm(O),xA=Y?.()??"unknown";if(Z(`[bridge:repl] Poll error (attempt ${$}, elapsed ${Math.round(y/1000)}s, ws=${xA}): ${EA}`),rA("tengu_bridge_repl_poll_error",{status:a,consecutiveErrors:$,elapsedMs:y}),$===1)I?.("reconnecting",EA);if(y>=Ps){Z(`[bridge:repl] Poll failures exceeded ${Ps/1000}s (${$} errors), giving up`),c("info","bridge_repl_poll_give_up"),rA("tengu_bridge_repl_poll_give_up",{consecutiveErrors:$,elapsedMs:y,lastStatus:a}),I?.("failed","connection to server lost");break}let r=Math.min(XSA*2**($-1),_s);if(F().non_exclusive_heartbeat_interval_ms>0){let p=N?.();if(p)try{await A.heartbeatWork(p.environmentId,p.workId,p.sessionToken)}catch{}}await mB(r,B)}}Z(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function wSA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function zSA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function KSA(A,Q){if(zSA(A,Q))return"http://localhost:4000";if(wSA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function Ts(A,Q){let{toCompatSessionId:B}=is(km),I=B(A);return`${KSA(I,Q)}/code/${I}`}WQ();async function ks(A){let{dir:Q,registrationDir:B,name:I="Assistant",workerType:E="claude_code_assistant",branch:C="",gitRepoUrl:Y=null,getAccessToken:J,getTrustedDeviceToken:G,baseUrl:U,orgUUID:F,model:N,perpetual:D=!1,initialSSESequenceNum:W,onConflict:$}=A,X=A.onAuth401;if(!J())return 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 V=U,M={baseUrl:U,getAccessToken:J,orgUUID:F,model:N},L=[],z=null,x=[],q=null,O=[],P=null,y=!1,a=null,EA={detail:null},xA=HSA(),r=()=>vs({dir:Q,registrationDir:B,machineName:xA,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:V,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:X,onInitError:console.error,createSession:({environmentId:n,title:QQ,signal:t})=>Ls({environmentId:n,title:QQ,tags:["claude-code-assistant"],signal:t},M),archiveSession:(n)=>xs(n,M),perpetual:D,initialSSESequenceNum:W,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...nN,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(n){let QQ=wT(n);if(!QQ)return;L.push({content:QQ.content,uuid:QQ.uuid}),z?.(),z=null},onInterrupt(){x.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),q?.(),q=null},onSetModel(n){x.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:n}}),q?.(),q=null},onSetMaxThinkingTokens(n){x.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:n}}),q?.(),q=null},onPermissionResponse(n){O.push(n),P?.(),P=null},onStateChange(n,QQ){if(a?.(n,QQ),n==="failed")EA.detail=QQ??"unknown failure",y=!0,z?.(),q?.(),P?.()}}),p=await r();if(!p&&$&&EA.detail?.includes("409")){if(await $({machineName:xA,message:EA.detail})==="takeover")y=!1,EA.detail=null,p=await r()}if(!p){let n=EA.detail??"initBridgeCore returned null (env registration or session creation failed)";return Z(`[bridge:daemon] connectRemoteControl failed: ${n}`),{ok:!1,error:{kind:EA.detail?.includes("409")?"conflict":EA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:n}}}async function*gA(){while(!y){while(L.length>0)if(yield L.shift(),y)return;await new Promise((n)=>{z=n})}}async function*l(){while(!y){while(x.length>0)if(yield x.shift(),y)return;await new Promise((n)=>{q=n})}}async function*XA(){while(!y){while(O.length>0)if(yield O.shift(),y)return;await new Promise((n)=>{P=n})}}return{ok:!0,handle:{get sessionUrl(){return Ts(p.bridgeSessionId,V)},get environmentId(){return p.environmentId},get bridgeSessionId(){return p.bridgeSessionId},getSSESequenceNum(){return p.getSSESequenceNum()},hasPendingPrompts(){return L.length>0},write(n){p.writeSdkMessages([n])},sendResult(){p.sendResult()},sendControlRequest(n){p.sendControlRequest(n)},sendControlResponse(n){p.sendControlResponse(n)},sendControlCancelRequest(n){p.sendControlCancelRequest(n)},inboundPrompts:gA,controlRequests:l,permissionResponses:XA,onStateChange(n){a=n},async teardown(){y=!0,z?.(),q?.(),P?.(),await p.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var xSA=1000,RSA=1e4,jSA=5000,gSA=60000,ML=3;function qSA(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 OSA(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"&&qL(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}async function SSA(A){let{bridge:Q,sandboxed:B=!1,scheduling:I,buildQueryOptions:E,canUseToolPreFilter:C,onPermissionResolved:Y,transformOutbound:J,stateAdapter:G,initialPrompt:U,userIdleMs:F=300000,signal:N,log:D=()=>{}}=A;D("─── worker start ───");let W=await G?.load(),$={...Q,initialSSESequenceNum:Q.initialSSESequenceNum??W?.lastSSESequenceNum};if(!$.getAccessToken())return{ok:!1,error:{kind:"auth",detail:"getAccessToken returned empty"}};let X=await ks($);if(!X.ok)return D(`bridge connection failed: ${X.error.kind} — ${X.error.detail}`),{ok:!1,error:X.error};let V=X.handle;D(`bridge connected url=${V.sessionUrl} env=${V.environmentId}`);let M=W?.claudeSessionId,L=V.bridgeSessionId,z=[],x=null,q=!1,O=null,P=0,y=!0,a=0,EA=Promise.resolve();function xA(){if(!G)return;let v={claudeSessionId:M,lastSSESequenceNum:V.getSSESequenceNum(),bridgeSessionId:V.bridgeSessionId};EA=EA.then(()=>G.save(v).catch((wQ)=>{D(`stateAdapter.save threw: ${wQ}`)}))}function r(){if(z.length>0||V.hasPendingPrompts()){D("persist skipped: prompt queued");return}xA()}xA();let p=new AbortController,gA=new Map,l=null;function XA(){return l??=(async()=>{r();for(let v of gA.keys())V.sendControlCancelRequest(v);gA.clear(),await V.teardown(),await EA})()}if(N.addEventListener("abort",()=>{p.abort(),XA().catch((v)=>D(`teardown threw: ${v}`))}),N.aborted)return await XA(),{ok:!1,error:{kind:"unknown",detail:"aborted before start"}};let cA="connected";V.onStateChange((v,wQ)=>{if(D(`bridge state=${v} detail=${wQ??""}`),cA=v,v==="ready"&&V.bridgeSessionId!==L)L=V.bridgeSessionId,xA();else if(v==="connected")r();if(v==="failed")D(`bridge failed: ${wQ??"unknown"}`),p.abort(),XA().catch((IQ)=>D(`teardown threw: ${IQ}`))});let n=I?.horizonMs??600000,QQ=I?.leadMs??jSA,t=null,i=!1,IA=!1,sA="";async function _A(){if(!I)return;let v=await XT(I.dir).catch((IQ)=>{return D(`computeCronHorizon threw: ${IQ}`),{nextFire:null,hasOverdue:!1}});t=v.nextFire,IA=v.hasOverdue;let wQ=v.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(v.nextFire).toISOString()} hasOverdue=${v.hasOverdue}`;if(wQ!==sA)sA=wQ,D(wQ)}let BQ;if(I)await _A(),BQ=setInterval(_A,RSA),BQ.unref?.();function VB(v){z.push({type:"user",message:{role:"user",content:v},parent_tool_use_id:null,session_id:""}),x?.(),x=null}async function oA(v,wQ,IQ){if(C){let YQ=await C(v,wQ,IQ);if(YQ)return Y?.(v,YQ),YQ}if(cA!=="connected"){D(`permission denied — bridge state=${cA}, request would drop`);let YQ={behavior:"deny",message:`Cannot request permission: remote control is ${cA}. Try again in a moment.`};return Y?.(v,YQ),YQ}let pA=LSA();D(`permission request tool=${v} req=${pA}`);let{signal:_B,suggestions:pC,blockedPath:PB,toolUseID:YA}=IQ;V.sendControlRequest({type:"control_request",request_id:pA,request:{subtype:"can_use_tool",tool_name:v,display_name:OL(v),input:wQ,tool_use_id:YA,...pC&&{permission_suggestions:pC},...PB&&{blocked_path:PB},..."decisionReason"in IQ&&IQ.decisionReason&&{decision_reason:IQ.decisionReason},..."agentID"in IQ&&IQ.agentID&&{agent_id:IQ.agentID}}});let YI;try{let YQ=await new Promise((OI,XB)=>{gA.set(pA,OI),YI=setTimeout((LE,lC,GB,iC,d0)=>{if(LE.delete(lC))GB(`permission timeout req=${lC}`),iC.sendControlCancelRequest(lC),d0({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},gSA,gA,pA,D,V,OI),YI.unref?.(),_B.addEventListener("abort",()=>{if(gA.delete(pA))V.sendControlCancelRequest(pA);XB(Error("aborted"))},{once:!0})});D(`permission response req=${pA} behavior=${YQ.behavior}`);let dQ=YQ.behavior==="allow"?{behavior:"allow",updatedInput:YQ.updatedInput,updatedPermissions:YQ.updatedPermissions}:{behavior:"deny",message:YQ.message??"Denied via remote control"};return Y?.(v,dQ),dQ}finally{if(YI)clearTimeout(YI);gA.delete(pA)}}let JB=!1;async function WA(){if(O!==null||JB||p.signal.aborted)return;if(JB=!0,q=!1,z.length>0)y=!1;async function*v(){while(!q){while(z.length>0)if(y=!1,yield z.shift(),q)return;await new Promise((pA)=>{x=pA})}}D(`spawning query resume=${M??"<fresh>"}`);let wQ={assistant:!0,cwd:Q.dir,resume:M,stderr:(pA)=>D(`[child] ${pA.trimEnd()}`),canUseTool:oA},IQ;try{if(IQ=await E(wQ),B)IQ={...IQ,env:{...IQ.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(pA){if(D(`buildQueryOptions threw: ${pA}`),JB=!1,a++,a>=ML)D(`${a} consecutive buildQueryOptions failures — dropping ${z.length} queued input(s)`),z.length=0;else if(z.length>0&&!p.signal.aborted)WA();return}if(p.signal.aborted){JB=!1;return}try{O=hv({prompt:v(),options:IQ})}finally{JB=!1}(async()=>{try{D("output pump started");for await(let pA of O){if(pA.type==="system"&&pA.subtype==="init"){if(pA.session_id!==M)M=pA.session_id,r()}if(pA.type==="result")y=!0,a=0,i=!0,r();if(!qSA(pA))continue;let _B=J?J(pA):pA;if(_B===null)continue;V.write(_B)}}catch(pA){D(`query threw: ${pA}`),a++}finally{D("output pump ended"),O=null;for(let pA of gA.keys())V.sendControlCancelRequest(pA);if(gA.clear(),z.length>0&&!p.signal.aborted)if(a>=ML)D(`${a} consecutive crashes — dropping ${z.length} queued input(s)`),z.length=0;else WA()}})()}let ZQ=setInterval(()=>{let v=Date.now(),wQ=t!==null&&t-v<n;if(O===null){let IQ=t!==null&&t-v<QQ;if((IQ||IA&&!i)&&a<ML&&!p.signal.aborted)D(IQ?`cron due in ${t-v}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),WA();return}if(q)return;if(!y||z.length>0)return;if(v-P<F)return;if(wQ)return;if(IA&&!i)return;D("idle conditions met → closing input gen"),r(),q=!0,x?.(),x=null},xSA);if(ZQ.unref?.(),U)D("initialPrompt → injecting"),P=Date.now(),VB(U),WA();let BJ=(async()=>{if(await Promise.all([(async()=>{for await(let v of V.inboundPrompts()){if(p.signal.aborted)return;if(D("bridge prompt received"),P=Date.now(),v.uuid)V.write({type:"user",uuid:v.uuid,session_id:"",message:{role:"user",content:v.content},parent_tool_use_id:null});VB(v.content),WA()}})(),(async()=>{for await(let v of V.controlRequests()){if(p.signal.aborted)return;switch(v.request.subtype){case"interrupt":D("bridge interrupt"),O?.interrupt();break;case"set_model":D(`bridge setModel=${v.request.model??"<default>"}`),O?.setModel(v.request.model);break;case"set_max_thinking_tokens":D(`bridge setMaxThinkingTokens=${v.request.max_thinking_tokens}`),O?.setMaxThinkingTokens(v.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let v of V.permissionResponses()){if(p.signal.aborted)return;let wQ=OSA(v,gA,V.sendControlCancelRequest);if(wQ)D(`permission response for unknown req=${wQ} (stale)`)}})()]),clearInterval(ZQ),BQ)clearInterval(BQ);O?.close(),await XA(),D("─── worker stop ───")})();return{ok:!0,handle:{get sessionUrl(){return V.sessionUrl},get bridgeSessionId(){return V.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(v){P=Date.now(),VB(v),WA()},async interrupt(){await O?.interrupt()},done:BJ,teardown:XA,[Symbol.asyncDispose]:XA}}}export{SSA as runAssistantWorker};
|