@anthropic-ai/claude-agent-sdk 0.3.147 → 0.3.148
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assistant.mjs +3 -3
- package/bridge.mjs +2 -2
- package/browser-sdk.js +1 -1
- package/manifest.json +13 -13
- package/manifest.zst.json +23 -23
- package/package.json +10 -10
- package/sdk.mjs +2 -2
package/assistant.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// (c) Anthropic PBC. All rights reserved. Use is subject to the Legal Agreements outlined here: https://code.claude.com/docs/en/legal-and-compliance.
|
|
2
2
|
|
|
3
|
-
// Version: 0.3.
|
|
3
|
+
// Version: 0.3.148
|
|
4
4
|
import{createRequire as U0A}from"node:module";var Q0A=Object.create;var{getPrototypeOf:B0A,defineProperty:A4,getOwnPropertyNames:Ex,getOwnPropertyDescriptor:I0A}=Object,Cx=Object.prototype.hasOwnProperty;function Yx(A){return this[A]}var E0A,C0A,kY=(A,Q,B)=>{var I=A!=null&&typeof A==="object";if(I){var E=Q?E0A??=new WeakMap:C0A??=new WeakMap,C=E.get(A);if(C)return C}B=A!=null?Q0A(B0A(A)):{};let Y=Q||!A||!A.__esModule?A4(B,"default",{value:A,enumerable:!0}):B;for(let J of Ex(A))if(!Cx.call(Y,J))A4(Y,J,{get:Yx.bind(A,J),enumerable:!0});if(I)E.set(A,Y);return Y},Y0A=(A)=>{var Q=(Ix??=new WeakMap).get(A),B;if(Q)return Q;if(Q=A4({},"__esModule",{value:!0}),A&&typeof A==="object"||typeof A==="function"){for(var I of Ex(A))if(!Cx.call(Q,I))A4(Q,I,{get:Yx.bind(A,I),enumerable:!(B=I0A(A,I))||B.enumerable})}return Ix.set(A,Q),Q},Ix,K=(A,Q)=>()=>(Q||A((Q={exports:{}}).exports,Q),Q.exports);var J0A=(A)=>A;function G0A(A,Q){this[A]=J0A.bind(null,Q)}var _E=(A,Q)=>{for(var B in Q)A4(A,B,{get:Q[B],enumerable:!0,configurable:!0,set:G0A.bind(Q,B)})};var H=(A,Q)=>()=>(A&&(Q=A(A=0)),Q);var O=U0A(import.meta.url),F0A=Symbol.dispose||Symbol.for("Symbol.dispose"),$0A=Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose"),fQ=(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[$0A];if(I===void 0)I=Q[F0A];if(typeof I!=="function")throw TypeError("Object not disposable");A.push([B,I,Q])}else if(B)A.push([B]);return Q},hQ=(A,Q,B)=>{var I=typeof SuppressedError==="function"?SuppressedError:function(Y,J,G,U){return U=Error(G),U.name="SuppressedError",U.error=Y,U.suppressed=J,U},E=(Y)=>Q=B?new I(Y,Q,"An error was suppressed during disposal"):(B=!0,Y),C=(Y)=>{while(Y=A.pop())try{var J=Y[1]&&Y[1].call(Y[2]);if(Y[0])return Promise.resolve(J).then(C,(G)=>(E(G),C()))}catch(G){E(G)}if(B)throw Q};return C()};var fD=()=>{};function aA(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 I4(A){if(!A||A.startsWith("-")||A.startsWith("/"))return!1;if(A.includes(".."))return!1;if(A.split("/").some((Q)=>Q==="."||Q===""))return!1;return/^[a-zA-Z0-9/._+@-]+$/.test(A)}function P0(){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 Fx=()=>{};var E4=H(()=>{Fx()});var M0A,$x;var Wx=H(()=>{M0A=typeof global=="object"&&global&&global.Object===Object&&global,$x=M0A});var K0A,z0A,UG;var PW=H(()=>{Wx();K0A=typeof self=="object"&&self&&self.Object===Object&&self,z0A=$x||K0A||Function("return this")(),UG=z0A});var Z0A,FG;var hD=H(()=>{PW();Z0A=UG.Symbol,FG=Z0A});function q0A(A){var Q=H0A.call(A,C4),B=A[C4];try{A[C4]=void 0;var I=!0}catch(C){}var E=L0A.call(A);if(I)if(Q)A[C4]=B;else delete A[C4];return E}var Nx,H0A,L0A,C4,Xx;var Dx=H(()=>{hD();Nx=Object.prototype,H0A=Nx.hasOwnProperty,L0A=Nx.toString,C4=FG?FG.toStringTag:void 0;Xx=q0A});function x0A(A){return R0A.call(A)}var j0A,R0A,Vx;var wx=H(()=>{j0A=Object.prototype,R0A=j0A.toString;Vx=x0A});function v0A(A){if(A==null)return A===void 0?g0A:O0A;return Mx&&Mx in Object(A)?Xx(A):Vx(A)}var O0A="[object Null]",g0A="[object Undefined]",Mx,Kx;var zx=H(()=>{hD();Dx();wx();Mx=FG?FG.toStringTag:void 0;Kx=v0A});function S0A(A){var Q=typeof A;return A!=null&&(Q=="object"||Q=="function")}var TW;var mD=H(()=>{TW=S0A});function b0A(A){if(!TW(A))return!1;var Q=Kx(A);return Q==P0A||Q==T0A||Q==_0A||Q==k0A}var _0A="[object AsyncFunction]",P0A="[object Function]",T0A="[object GeneratorFunction]",k0A="[object Proxy]",Zx;var Hx=H(()=>{zx();mD();Zx=b0A});var y0A,kW;var Lx=H(()=>{PW();y0A=UG["__core-js_shared__"],kW=y0A});function f0A(A){return!!qx&&qx in A}var qx,jx;var Rx=H(()=>{Lx();qx=function(){var A=/[^.]+$/.exec(kW&&kW.keys&&kW.keys.IE_PROTO||"");return A?"Symbol(src)_1."+A:""}();jx=f0A});function u0A(A){if(A!=null){try{return m0A.call(A)}catch(Q){}try{return A+""}catch(Q){}}return""}var h0A,m0A,xx;var Ox=H(()=>{h0A=Function.prototype,m0A=h0A.toString;xx=u0A});function a0A(A){if(!TW(A)||jx(A))return!1;var Q=Zx(A)?o0A:p0A;return Q.test(xx(A))}var c0A,p0A,l0A,i0A,d0A,n0A,o0A,gx;var vx=H(()=>{Hx();Rx();mD();Ox();c0A=/[\\^$.*+?()[\]{}|]/g,p0A=/^\[object .+?Constructor\]$/,l0A=Function.prototype,i0A=Object.prototype,d0A=l0A.toString,n0A=i0A.hasOwnProperty,o0A=RegExp("^"+d0A.call(n0A).replace(c0A,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");gx=a0A});function r0A(A,Q){return A==null?void 0:A[Q]}var Sx;var _x=H(()=>{Sx=r0A});function t0A(A,Q){var B=Sx(A,Q);return gx(B)?B:void 0}var bW;var uD=H(()=>{vx();_x();bW=t0A});var s0A,cC;var Y4=H(()=>{uD();s0A=bW(Object,"create"),cC=s0A});function e0A(){this.__data__=cC?cC(null):{},this.size=0}var Px;var Tx=H(()=>{Y4();Px=e0A});function AYA(A){var Q=this.has(A)&&delete this.__data__[A];return this.size-=Q?1:0,Q}var kx;var bx=H(()=>{kx=AYA});function EYA(A){var Q=this.__data__;if(cC){var B=Q[A];return B===QYA?void 0:B}return IYA.call(Q,A)?Q[A]:void 0}var QYA="__lodash_hash_undefined__",BYA,IYA,yx;var fx=H(()=>{Y4();BYA=Object.prototype,IYA=BYA.hasOwnProperty;yx=EYA});function JYA(A){var Q=this.__data__;return cC?Q[A]!==void 0:YYA.call(Q,A)}var CYA,YYA,hx;var mx=H(()=>{Y4();CYA=Object.prototype,YYA=CYA.hasOwnProperty;hx=JYA});function UYA(A,Q){var B=this.__data__;return this.size+=this.has(A)?0:1,B[A]=cC&&Q===void 0?GYA:Q,this}var GYA="__lodash_hash_undefined__",ux;var cx=H(()=>{Y4();ux=UYA});function $G(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 cD;var px=H(()=>{Tx();bx();fx();mx();cx();$G.prototype.clear=Px;$G.prototype.delete=kx;$G.prototype.get=yx;$G.prototype.has=hx;$G.prototype.set=ux;cD=$G});function FYA(){this.__data__=[],this.size=0}var lx;var ix=H(()=>{lx=FYA});function $YA(A,Q){return A===Q||A!==A&&Q!==Q}var dx;var nx=H(()=>{dx=$YA});function WYA(A,Q){var B=A.length;while(B--)if(dx(A[B][0],Q))return B;return-1}var T0;var J4=H(()=>{nx();T0=WYA});function DYA(A){var Q=this.__data__,B=T0(Q,A);if(B<0)return!1;var I=Q.length-1;if(B==I)Q.pop();else XYA.call(Q,B,1);return--this.size,!0}var NYA,XYA,ox;var ax=H(()=>{J4();NYA=Array.prototype,XYA=NYA.splice;ox=DYA});function VYA(A){var Q=this.__data__,B=T0(Q,A);return B<0?void 0:Q[B][1]}var rx;var tx=H(()=>{J4();rx=VYA});function wYA(A){return T0(this.__data__,A)>-1}var sx;var ex=H(()=>{J4();sx=wYA});function MYA(A,Q){var B=this.__data__,I=T0(B,A);if(I<0)++this.size,B.push([A,Q]);else B[I][1]=Q;return this}var AO;var QO=H(()=>{J4();AO=MYA});function WG(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 BO;var IO=H(()=>{ix();ax();tx();ex();QO();WG.prototype.clear=lx;WG.prototype.delete=ox;WG.prototype.get=rx;WG.prototype.has=sx;WG.prototype.set=AO;BO=WG});var KYA,EO;var CO=H(()=>{uD();PW();KYA=bW(UG,"Map"),EO=KYA});function zYA(){this.size=0,this.__data__={hash:new cD,map:new(EO||BO),string:new cD}}var YO;var JO=H(()=>{px();IO();CO();YO=zYA});function ZYA(A){var Q=typeof A;return Q=="string"||Q=="number"||Q=="symbol"||Q=="boolean"?A!=="__proto__":A===null}var GO;var UO=H(()=>{GO=ZYA});function HYA(A,Q){var B=A.__data__;return GO(Q)?B[typeof Q=="string"?"string":"hash"]:B.map}var k0;var G4=H(()=>{UO();k0=HYA});function LYA(A){var Q=k0(this,A).delete(A);return this.size-=Q?1:0,Q}var FO;var $O=H(()=>{G4();FO=LYA});function qYA(A){return k0(this,A).get(A)}var WO;var NO=H(()=>{G4();WO=qYA});function jYA(A){return k0(this,A).has(A)}var XO;var DO=H(()=>{G4();XO=jYA});function RYA(A,Q){var B=k0(this,A),I=B.size;return B.set(A,Q),this.size+=B.size==I?0:1,this}var VO;var wO=H(()=>{G4();VO=RYA});function NG(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 pD;var MO=H(()=>{JO();$O();NO();DO();wO();NG.prototype.clear=YO;NG.prototype.delete=FO;NG.prototype.get=WO;NG.prototype.has=XO;NG.prototype.set=VO;pD=NG});function lD(A,Q){if(typeof A!="function"||Q!=null&&typeof Q!="function")throw TypeError(xYA);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(lD.Cache||pD),B}var xYA="Expected a function",FQ;var PE=H(()=>{MO();lD.Cache=pD;FQ=lD});import{homedir as OYA}from"os";import{join as gYA}from"path";function iD(A){let Q=process.env.NODE_OPTIONS;if(!Q)return!1;return Q.split(/\s+/).includes(A)}function KO(){return!1}function zO(){return{namespace:void 0,cluster:void 0}}var FE,ziA;var GB=H(()=>{E4();PE();E4();FE=FQ(()=>{return(process.env.CLAUDE_CONFIG_DIR??gYA(OYA(),".claude")).normalize("NFC")},()=>process.env.CLAUDE_CONFIG_DIR);ziA=FQ(()=>aA(process.env.CLAUDE_CODE_SUPERVISED))});function o(A,Q,B,I,E){if(I==="m")throw TypeError("Private method is not writable");if(I==="a"&&!E)throw TypeError("Private accessor was defined without a setter");if(typeof Q==="function"?A!==Q||!E:!Q.has(A))throw TypeError("Cannot write private member to an object whose class did not declare it");return I==="a"?E.call(A,B):E?E.value=B:Q.set(A,B),B}function x(A,Q,B,I){if(B==="a"&&!I)throw TypeError("Private accessor was defined without a getter");if(typeof Q==="function"?A!==Q||!I:!Q.has(A))throw TypeError("Cannot read private member from an object whose class did not declare it");return B==="m"?I:B==="a"?I.call(A):I?I.value:Q.get(A)}var pC=()=>{};var dD=function(){let{crypto:A}=globalThis;if(A?.randomUUID)return dD=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 lC(A){return typeof A==="object"&&A!==null&&(("name"in A)&&A.name==="AbortError"||("message"in A)&&String(A.message).includes("FetchRequestCanceledException"))}var U4=(A)=>{if(A instanceof Error)return A;if(typeof A==="object"&&A!==null){try{if(Object.prototype.toString.call(A)==="[object Error]"){let Q=Error(A.message,A.cause?{cause:A.cause}:{});if(A.stack)Q.stack=A.stack;if(A.cause&&!Q.cause)Q.cause=A.cause;if(A.name)Q.name=A.name;return Q}}catch{}try{return Error(JSON.stringify(A))}catch{}}return Error(A)};var s,gB,uB,yY,F4,$4,W4,N4,X4,D4,V4,w4,M4;var cB=H(()=>{s=class s extends Error{};gB=class gB extends s{constructor(A,Q,B,I,E){super(`${gB.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 yY({message:B,cause:U4(Q)});let E=Q,C=E?.error?.type;if(A===400)return new $4(A,E,B,I,C);if(A===401)return new W4(A,E,B,I,C);if(A===403)return new N4(A,E,B,I,C);if(A===404)return new X4(A,E,B,I,C);if(A===409)return new D4(A,E,B,I,C);if(A===422)return new V4(A,E,B,I,C);if(A===429)return new w4(A,E,B,I,C);if(A>=500)return new M4(A,E,B,I,C);return new gB(A,E,B,I,C)}};uB=class uB extends gB{constructor({message:A}={}){super(void 0,void 0,A||"Request was aborted.",void 0)}};yY=class yY extends gB{constructor({message:A,cause:Q}){super(void 0,void 0,A||"Connection error.",void 0);if(Q)this.cause=Q}};F4=class F4 extends yY{constructor({message:A}={}){super({message:A??"Request timed out."})}};$4=class $4 extends gB{};W4=class W4 extends gB{};N4=class N4 extends gB{};X4=class X4 extends gB{};D4=class D4 extends gB{};V4=class V4 extends gB{};w4=class w4 extends gB{};M4=class M4 extends gB{}});function yW(A){if(typeof A!=="object")return{};return A??{}}function aD(A){if(!A)return!0;for(let Q in A)return!1;return!0}function HO(A,Q){return Object.prototype.hasOwnProperty.call(A,Q)}var SYA,ZO=(A)=>{return SYA.test(A)},nD=(A)=>(nD=Array.isArray,nD(A)),oD,LO=(A,Q)=>{if(typeof Q!=="number"||!Number.isInteger(Q))throw new s(`${A} must be an integer`);if(Q<0)throw new s(`${A} must be a positive integer`);return Q},fW=(A)=>{try{return JSON.parse(A)}catch(Q){return}};var b0=H(()=>{cB();SYA=/^[a-z][a-z0-9+.-]*:/i,oD=nD});var qO=(A)=>new Promise((Q)=>setTimeout(Q,A));var $E="0.94.0";function _YA(){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 TYA(){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 OO=()=>{return typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u"},PYA=()=>{let A=_YA();if(A==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":$E,"X-Stainless-OS":RO(Deno.build.os),"X-Stainless-Arch":jO(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":$E,"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":$E,"X-Stainless-OS":RO(globalThis.process.platform??"unknown"),"X-Stainless-Arch":jO(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let Q=TYA();if(Q)return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":$E,"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":$E,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}},jO=(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"},RO=(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"},xO,K4=()=>{return xO??(xO=PYA())};var hW=()=>{};function gO(){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 rD(...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 mW(A){let Q=Symbol.asyncIterator in A?A[Symbol.asyncIterator]():A[Symbol.iterator]();return rD({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 z4(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 vO(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 SO=({headers:A,body:Q})=>{return{bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(Q)}};function _O(A){return Object.entries(A).filter(([Q,B])=>typeof B<"u").map(([Q,B])=>{if(typeof B==="string"||typeof B==="number"||typeof B==="boolean")return`${encodeURIComponent(Q)}=${encodeURIComponent(B)}`;if(B===null)return`${encodeURIComponent(Q)}=`;throw new s(`Cannot stringify type ${typeof B}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join("&")}var tD=H(()=>{cB()});function cW(A){if(!A)return;let Q;try{Q=new URL(A)}catch(I){throw new qQ(`Invalid token endpoint base URL "${A}": ${I}`)}if(Q.protocol==="https:")return;let B=Q.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(Q.protocol==="http:"&&(B==="localhost"||B==="127.0.0.1"||B==="::1"))return;throw new qQ(`Refusing to send credential over non-https token endpoint "${A}"`)}async function pW(A,Q){let B=await fYA(A),I;try{I=JSON.parse(B)}catch{throw new qQ(`Token endpoint returned non-JSON response (status ${A.status})`,A.status,DI(B),Q)}if(!I.access_token)throw new qQ(`Token endpoint response missing access_token: ${JSON.stringify(DI(I))}`,A.status,DI(I),Q);if(I.token_type&&I.token_type.toLowerCase()!=="bearer")throw new qQ(`Token endpoint response: unsupported token_type "${I.token_type}" (want Bearer)`,A.status,DI(I),Q);return I}function DI(A){if(A==null)return A;if(typeof A==="string"){let Q;try{Q=JSON.parse(A)}catch{if(A.length<=sD)return A;return A.slice(0,sD)+`... <${A.length-sD} more chars>`}return JSON.stringify(DI(Q))}if(typeof A==="object"&&!Array.isArray(A)){let Q={};for(let[B,I]of Object.entries(A))if(yYA.has(B))Q[B]=I;return Q}return null}async function lW(A,Q=(B)=>console.warn(`anthropic-sdk: ${B}`)){if(typeof process>"u"||process.platform==="win32")return;let B=await import("node:fs"),I=A,E;try{I=await B.promises.realpath(A),E=await B.promises.stat(I)}catch{return}let C=E.mode&511;if(C&18)throw new qQ(`Credentials file at ${I} is group/world-writable (mode 0o${C.toString(8)}); this allows other local users to plant tokens. Run \`chmod 600 ${I}\`.`);if(C&36)throw new qQ(`Credentials file at ${I} is group/world-readable (mode 0o${C.toString(8)}); run \`chmod 600 ${I}\` before retrying.`);if(typeof process.getuid==="function"&&E.uid!==process.getuid())Q(`credentials file at ${I} is owned by uid ${E.uid} (current process uid ${process.getuid()}); verify this is intentional.`)}async function iW(A,Q){let B=await import("node:fs"),E=(await import("node:path")).dirname(A);await B.promises.mkdir(E,{recursive:!0,mode:448});let C=`${A}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;try{let Y=await B.promises.open(C,"w",384);try{await Y.writeFile(JSON.stringify(Q,null,2)),await Y.sync()}finally{await Y.close()}await B.promises.rename(C,A)}catch(Y){throw await B.promises.unlink(C).catch(()=>{}),Y}try{let Y=await B.promises.open(E,"r");try{await Y.sync()}finally{await Y.close()}}catch{}}async function fYA(A){if(!A.body)return"";let Q=A.body.getReader(),B=[],I=0;for(;;){let{done:C,value:Y}=await Q.read();if(C)break;if(I+Y.length>PO){let J=PO-I;if(J>0)B.push(Y.subarray(0,J));await Q.cancel();break}B.push(Y),I+=Y.length}let E;if(B.length===1)E=B[0];else{E=new Uint8Array(B.reduce((Y,J)=>Y+J.length,0));let C=0;for(let Y of B)E.set(Y,C),C+=Y.length}return new TextDecoder("utf-8").decode(E)}var TO="urn:ietf:params:oauth:grant-type:jwt-bearer",kO="refresh_token",uW="/v1/oauth/token",fY="oauth-2025-04-20",bO="oidc-federation-2026-04-01",yO=120,XG=30,fO=5,PO=1048576,sD=2000,yYA,qQ;var DG=H(()=>{cB();yYA=new Set(["error","error_description","error_uri"]);qQ=class qQ extends s{constructor(A,Q=null,B=null,I=null){super(A);this.statusCode=Q,this.body=B,this.requestId=I}}});function TE(){return Math.floor(Date.now()/1000)}class eD{constructor(A,Q){this.cached=null,this.pendingRefresh=null,this.nextForce=!1,this.lastAdvisoryError=0,this.provider=A,this.onAdvisoryRefreshError=Q}async getToken(){let A=this.nextForce;this.nextForce=!1;let Q=this.cached;if(A||Q==null)return(await this.refresh(A)).token;if(Q.expiresAt==null)return Q.token;let B=Q.expiresAt-TE();if(B>yO)return Q.token;if(B>XG)return this.backgroundRefresh(),Q.token;return(await this.refresh()).token}invalidate(){this.cached=null,this.nextForce=!0}refresh(A=!1){if(this.pendingRefresh&&!A)return this.pendingRefresh;return this.doRefresh(A)}backgroundRefresh(){if(this.pendingRefresh)return;if(TE()-this.lastAdvisoryError<fO)return;this.doRefresh().catch((A)=>{this.lastAdvisoryError=TE(),this.onAdvisoryRefreshError?.(A)})}doRefresh(A=!1){return this.pendingRefresh=this.provider(A?{forceRefresh:!0}:void 0).then((Q)=>{return this.cached=Q,this.pendingRefresh=null,Q},(Q)=>{throw this.pendingRefresh=null,Q}),this.pendingRefresh}}var hO=H(()=>{DG()});var MQ=(A)=>{if(typeof globalThis.process<"u")return globalThis.process.env?.[A]?.trim()||void 0;if(typeof globalThis.Deno<"u")return globalThis.Deno.env?.get?.(A)?.trim()||void 0;return};function cO(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 VG(A){let Q;return(mO??(Q=new globalThis.TextEncoder,mO=Q.encode.bind(Q)))(A)}function AV(A){let Q;return(uO??(Q=new globalThis.TextDecoder,uO=Q.decode.bind(Q)))(A)}var mO,uO;var pO=H(()=>{cB()});function Z4(){}function dW(A,Q,B){if(!Q||nW[A]>nW[B])return Z4;else return Q[A].bind(Q)}function DB(A){let Q=A.logger,B=A.logLevel??"off";if(!Q)return hYA;let I=lO.get(Q);if(I&&I[0]===B)return I[1];let E={error:dW("error",Q,B),warn:dW("warn",Q,B),info:dW("info",Q,B),debug:dW("debug",Q,B)};return lO.set(Q,[B,E]),E}var nW,QV=(A,Q,B)=>{if(!A)return;if(HO(nW,A))return A;DB(B).warn(`${Q} was set to ${JSON.stringify(A)}, expected one of ${JSON.stringify(Object.keys(nW))}`);return},hYA,lO,iC=(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 H4=H(()=>{b0();nW={off:0,error:200,warn:300,info:400,debug:500};hYA={error:Z4,warn:Z4,info:Z4,debug:Z4},lO=new WeakMap});var iO=H(()=>{b0();pO();H4();tD()});function dO(A){if(!A)throw Error("profile name is empty");if(A==="."||A==="..")throw Error(`profile name "${A}" is not allowed`);if(A.includes("/")||A.includes("\\"))throw Error(`profile name "${A}" must not contain path separators`);if(!mYA.test(A))throw Error(`profile name "${A}" contains disallowed characters (allowed: letters, digits, '_', '.', '-')`)}var oW="1.0",mYA,nO=async(A)=>{var Q,B;let I=await BV();if(I===null)return null;let E=A??await aO();if(E===null)return null;dO(E);let C=await import("node:fs"),J=(await import("node:path")).join(I,"configs",`${E}.json`),G;try{G=await C.promises.readFile(J,"utf-8")}catch(N){if(N?.code!=="ENOENT")throw Error(`failed to read config file ${J}: ${N}`);G=null}if(G===null){let N=MQ("ANTHROPIC_ORGANIZATION_ID"),W=MQ("ANTHROPIC_IDENTITY_TOKEN_FILE"),X=MQ("ANTHROPIC_FEDERATION_RULE_ID");if(X&&N)return{fromFile:!1,config:{organization_id:N,workspace_id:MQ("ANTHROPIC_WORKSPACE_ID"),base_url:MQ("ANTHROPIC_BASE_URL"),authentication:{type:"oidc_federation",federation_rule_id:X,service_account_id:MQ("ANTHROPIC_SERVICE_ACCOUNT_ID"),identity_token:W?{source:"file",path:W}:void 0,scope:MQ("ANTHROPIC_SCOPE")}}};return null}let U;try{U=JSON.parse(G)}catch(N){throw Error(`failed to parse config file ${J}: ${N}`)}if(!U.authentication)throw Error(`config file ${J} is missing "authentication"`);let F=U.authentication.type;if(F!=="oidc_federation"&&F!=="user_oauth")throw Error(`authentication.type "${F}" is not a known authentication type`);if(U.organization_id??(U.organization_id=MQ("ANTHROPIC_ORGANIZATION_ID")),U.workspace_id??(U.workspace_id=MQ("ANTHROPIC_WORKSPACE_ID")),U.base_url??(U.base_url=MQ("ANTHROPIC_BASE_URL")),(Q=U.authentication).scope??(Q.scope=MQ("ANTHROPIC_SCOPE")),U.authentication.type==="oidc_federation"){if(!U.authentication.identity_token){let N=MQ("ANTHROPIC_IDENTITY_TOKEN_FILE");if(N)U.authentication.identity_token={source:"file",path:N}}if(!U.authentication.federation_rule_id)U.authentication.federation_rule_id=MQ("ANTHROPIC_FEDERATION_RULE_ID")??"";(B=U.authentication).service_account_id??(B.service_account_id=MQ("ANTHROPIC_SERVICE_ACCOUNT_ID"))}return{config:U,fromFile:!0}},oO=async(A,Q)=>{if(A?.authentication.credentials_path)return A.authentication.credentials_path;let B=await BV();if(!B)return null;let I=Q??await aO();if(!I)return null;return dO(I),(await import("node:path")).join(B,"credentials",`${I}.json`)},BV=async()=>{if(!uYA())return null;let A=await import("node:path"),Q=MQ("ANTHROPIC_CONFIG_DIR");if(Q)return Q;if(K4()["X-Stainless-OS"]==="Windows"){let C=MQ("APPDATA");if(C)return A.join(C,"Anthropic");let Y=MQ("USERPROFILE");if(Y)return A.join(Y,"AppData","Roaming","Anthropic");return null}let I=MQ("XDG_CONFIG_HOME");if(I)return A.join(I,"anthropic");let E=MQ("HOME");if(E)return A.join(E,".config","anthropic");return null},uYA=()=>{let A=K4()["X-Stainless-Runtime"];return A==="node"||A==="deno"},aO=async()=>{let A=await BV();if(!A)return null;let Q=MQ("ANTHROPIC_PROFILE");if(Q)return Q;let B=await import("node:fs"),E=(await import("node:path")).join(A,"active_config");try{return(await B.promises.readFile(E,"utf-8")).trim()||"default"}catch(C){if(C?.code!=="ENOENT")throw Error(`failed to read ${E}: ${C}`);return"default"}};var IV=H(()=>{hW();iO();mYA=/^[A-Za-z0-9_.-]+$/});function EV(A){if(!A)throw new s("Identity token file path is empty");return async()=>{let Q=await import("node:fs"),B;try{B=await Q.promises.readFile(A,"utf-8")}catch(E){throw new s(`Failed to read identity token file at ${A}: ${E}`)}let I=B.trim();if(!I)throw new s(`Identity token file at ${A} is empty`);return I}}function rO(A){if(!A)throw new s("Identity token value is empty");return()=>A}var tO=H(()=>{cB()});function sO(A){return async()=>{cW(A.baseURL);let Q=await A.identityTokenProvider();if(Q.length>16384)throw new qQ(`Identity token is ${Math.ceil(Q.length/1024)} KiB, exceeds the 16 KiB assertion limit`);let B={grant_type:TO,assertion:Q,federation_rule_id:A.federationRuleId,organization_id:A.organizationId};if(A.serviceAccountId)B.service_account_id=A.serviceAccountId;if(A.workspaceId)B.workspace_id=A.workspaceId;let I=`${A.baseURL}${uW}`,E;try{E=await A.fetch(I,{method:"POST",headers:{"Content-Type":"application/json","anthropic-beta":`${fY},${bO}`,"User-Agent":A.userAgent||`anthropic-sdk-typescript/${$E} oidcFederationProvider`},body:JSON.stringify(B)})}catch(G){throw new qQ(`Failed to reach token endpoint ${I}: ${G}`)}let C=E.headers.get("Request-Id");if(!E.ok){let G=await E.text().catch(()=>""),U=DI(G),F="";if(E.status===401)F=` Ensure your federation rule matches your identity token. ${A.workspaceId?"":"If your federation rule is scoped to multiple workspaces, set the ANTHROPIC_WORKSPACE_ID environment variable, the 'workspace_id' config key, or the `workspaceId` option. "}View your authentication events in the Workload identity page of Claude Console for more details.`;throw new qQ(`Token exchange failed with status ${E.status}${C?` (request-id ${C})`:""}: ${U}${F}`,E.status,U,C)}let Y=await pW(E,C),J=Number(Y.expires_in);if(!Number.isFinite(J))throw new qQ(`Token endpoint response missing required fields: ${JSON.stringify(DI(Y))}`,E.status,DI(Y),C);return{token:Y.access_token,expiresAt:TE()+J}}}var eO=H(()=>{DG()});function Ag(A){return async(Q)=>{let B=await import("node:fs");await lW(A.credentialsPath,A.onSafetyWarning);let I;try{I=await B.promises.readFile(A.credentialsPath,"utf-8")}catch(V){throw new qQ(`Credentials file not found at ${A.credentialsPath}: ${V}`)}let E;try{E=JSON.parse(I)}catch(V){throw new qQ(`Credentials file at ${A.credentialsPath} is not valid JSON: ${V}`)}let C=E.access_token;if(!C)throw new qQ(`Credentials file at ${A.credentialsPath} must include 'access_token'`);let Y=E.expires_at;if(!Q?.forceRefresh&&(Y==null||TE()<Y-XG))return{token:C,expiresAt:Y??null};let J=E.refresh_token;if(!A.clientId||!J)throw new qQ(`Access token at ${A.credentialsPath} has expired and no refresh is available (client_id ${A.clientId?"set":"empty"}, refresh_token ${J?"set":"empty"})`);cW(A.baseURL);let G={grant_type:kO,refresh_token:J,client_id:A.clientId},U=`${A.baseURL}${uW}`,F;try{F=await A.fetch(U,{method:"POST",headers:{"Content-Type":"application/json","anthropic-beta":fY,"User-Agent":A.userAgent||`anthropic-sdk-typescript/${$E} userOAuthProvider`},body:JSON.stringify(G)})}catch(V){throw new qQ(`User OAuth refresh failed to reach token endpoint: ${V}`)}let N=F.headers.get("Request-Id");if(!F.ok){let V=await F.text().catch(()=>"");throw new qQ(`User OAuth refresh failed (HTTP ${F.status}): ${DI(V)}`,F.status,DI(V),N)}let W=await pW(F,N),X=Number(W.expires_in);if(!Number.isFinite(X))throw new qQ(`User OAuth refresh response missing or invalid expires_in: ${JSON.stringify(DI(W))}`,F.status,DI(W),N);let D=TE()+X,w=W.refresh_token||J;return await iW(A.credentialsPath,{...E,version:oW,type:"oauth_token",access_token:W.access_token,expires_at:D,refresh_token:w}),{token:W.access_token,expiresAt:D}}}var Qg=H(()=>{IV();DG()});function CV(A,Q){let B=A.authentication.credentials_path??null,I=(A.base_url||Q.baseURL).replace(/\/+$/,""),E=cYA(A,B,I,Q),C={};if(A.workspace_id&&A.authentication.type==="user_oauth")C["anthropic-workspace-id"]=A.workspace_id;return{provider:E,extraHeaders:C,baseURL:A.base_url||void 0}}async function Bg(A,Q){let B=await nO(Q);if(!B)return null;let{config:I,fromFile:E}=B,C=I.authentication.credentials_path||!E?I:{...I,authentication:{...I.authentication,credentials_path:await oO(I,Q)??void 0}};return CV(C,A)}function cYA(A,Q,B,I){switch(A.authentication.type){case"oidc_federation":{let E=A.authentication,C=pYA(E);if(!C)throw new qQ("oidc_federation config requires an identity token (set authentication.identity_token, ANTHROPIC_IDENTITY_TOKEN_FILE, or ANTHROPIC_IDENTITY_TOKEN)");if(!E.federation_rule_id)throw new qQ("oidc_federation config requires 'federation_rule_id'. Set it in authentication.federation_rule_id in your profile, or via ANTHROPIC_FEDERATION_RULE_ID (profile takes precedence).");if(!A.organization_id)throw new qQ("oidc_federation config requires organization_id (set ANTHROPIC_ORGANIZATION_ID or config.organization_id)");let Y=sO({identityTokenProvider:C,federationRuleId:E.federation_rule_id,organizationId:A.organization_id,serviceAccountId:E.service_account_id,workspaceId:A.workspace_id,baseURL:B,fetch:I.fetch,userAgent:I.userAgent});if(Q)return lYA(Y,Q,I.onCacheWriteError,I.onSafetyWarning);return Y}case"user_oauth":{if(!Q)throw new qQ("user_oauth config requires authentication.credentials_path (or load via a profile so it defaults to <config_dir>/credentials/<profile>.json)");return Ag({credentialsPath:Q,clientId:A.authentication.client_id,baseURL:B,fetch:I.fetch,userAgent:I.userAgent,onSafetyWarning:I.onSafetyWarning})}default:{let E=A.authentication.type;throw new qQ(`authentication.type "${E}" is not a known authentication type`)}}}function pYA(A){if(A.identity_token){let I=A.identity_token.source;if(I!=="file")throw new qQ(`identity_token.source "${I}" is not supported by this SDK version (only "file")`);if(!A.identity_token.path)throw new qQ('identity_token.source "file" requires a non-empty path');return EV(A.identity_token.path)}let Q=MQ("ANTHROPIC_IDENTITY_TOKEN_FILE");if(Q)return EV(Q);let B=MQ("ANTHROPIC_IDENTITY_TOKEN");if(B)return rO(B);return null}function lYA(A,Q,B,I){return async(E)=>{let C=await import("node:fs");await lW(Q,I);let Y;try{let G=await C.promises.readFile(Q,"utf-8");Y=JSON.parse(G);let U=Y?.access_token;if(U&&!E?.forceRefresh){let F=Y?.expires_at;if(F==null||TE()<F-XG)return{token:U,expiresAt:F??null}}}catch(G){if(G?.code!=="ENOENT"&&!(G instanceof SyntaxError))B?.(G)}let J=await A(E);try{await iW(Q,{...Y??{},version:oW,type:"oauth_token",access_token:J.token,expires_at:J.expiresAt})}catch(G){B?.(G)}return J}}var Ig=H(()=>{IV();DG();tO();eO();Qg()});class y0{constructor(){yI.set(this,void 0),fI.set(this,void 0),o(this,yI,new Uint8Array,"f"),o(this,fI,null,"f")}decode(A){if(A==null)return[];let Q=A instanceof ArrayBuffer?new Uint8Array(A):typeof A==="string"?VG(A):A;o(this,yI,cO([x(this,yI,"f"),Q]),"f");let B=[],I;while((I=iYA(x(this,yI,"f"),x(this,fI,"f")))!=null){if(I.carriage&&x(this,fI,"f")==null){o(this,fI,I.index,"f");continue}if(x(this,fI,"f")!=null&&(I.index!==x(this,fI,"f")+1||I.carriage)){B.push(AV(x(this,yI,"f").subarray(0,x(this,fI,"f")-1))),o(this,yI,x(this,yI,"f").subarray(x(this,fI,"f")),"f"),o(this,fI,null,"f");continue}let E=x(this,fI,"f")!==null?I.preceding-1:I.preceding,C=AV(x(this,yI,"f").subarray(0,E));B.push(C),o(this,yI,x(this,yI,"f").subarray(I.index),"f"),o(this,fI,null,"f")}return B}flush(){if(!x(this,yI,"f").length)return[];return this.decode(`
|
|
5
5
|
`)}}function iYA(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 Eg(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 yI,fI;var YV=H(()=>{pC();yI=new WeakMap,fI=new WeakMap;y0.NEWLINE_CHARS=new Set([`
|
|
6
6
|
`,"\r"]);y0.NEWLINE_REGEXP=/\r\n|[\n\r]/g});async function*dYA(A,Q){if(!A.body){if(Q.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative")throw new s("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api");throw new s("Attempted to iterate over a response with no body")}let B=new Cg,I=new y0,E=z4(A.body);for await(let C of nYA(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*nYA(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"?VG(B):B,E=new Uint8Array(Q.length+I.length);E.set(Q),E.set(I,Q.length),Q=E;let C;while((C=Eg(Q))!==-1)yield Q.slice(0,C),Q=Q.slice(C)}if(Q.length>0)yield Q}class Cg{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(`
|
|
@@ -177,7 +177,7 @@ ${E}`;break;case"retry":if(GEA(E))Q[I]=E;break;case"id":if(UEA(E))Q[I]=E;break;c
|
|
|
177
177
|
`+E}}catch(C){}}throw B}}_request(A,Q){if(typeof A==="string")Q=Q||{},Q.url=A;else Q=A||{};Q=AC(this.defaults,Q);let{transitional:B,paramsSerializer:I,headers:E}=Q;if(B!==void 0)w9.assertOptions(B,{silentJSONParsing:zE.transitional(zE.boolean),forcedJSONParsing:zE.transitional(zE.boolean),clarifyTimeoutError:zE.transitional(zE.boolean),legacyInterceptorReqResOrdering:zE.transitional(zE.boolean)},!1);if(I!=null)if(q.isFunction(I))Q.paramsSerializer={serialize:I};else w9.assertOptions(I,{encode:zE.function,serialize:zE.function},!0);if(Q.allowAbsoluteUrls!==void 0);else if(this.defaults.allowAbsoluteUrls!==void 0)Q.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls;else Q.allowAbsoluteUrls=!0;w9.assertOptions(Q,{baseUrl:zE.spelling("baseURL"),withXsrfToken:zE.spelling("withXSRFToken")},!0),Q.method=(Q.method||this.defaults.method||"get").toLowerCase();let C=E&&q.merge(E.common,E[Q.method]);E&&q.forEach(["delete","get","head","post","put","patch","common"],(X)=>{delete E[X]}),Q.headers=EB.concat(C,E);let Y=[],J=!0;this.interceptors.request.forEach(function(D){if(typeof D.runWhen==="function"&&D.runWhen(Q)===!1)return;J=J&&D.synchronous;let w=Q.transitional||$Y;if(w&&w.legacyInterceptorReqResOrdering)Y.unshift(D.fulfilled,D.rejected);else Y.push(D.fulfilled,D.rejected)});let G=[];this.interceptors.response.forEach(function(D){G.push(D.fulfilled,D.rejected)});let U,F=0,N;if(!J){let X=[g6.bind(this),void 0];X.unshift(...Y),X.push(...G),N=X.length,U=Promise.resolve(Q);while(F<N)U=U.then(X[F++],X[F++]);return U}N=Y.length;let W=Q;while(F<N){let X=Y[F++],D=Y[F++];try{W=X(W)}catch(w){D.call(this,w);break}}try{U=g6.call(this,W)}catch(X){return Promise.reject(X)}F=0,N=G.length;while(F<N)U=U.then(G[F++],G[F++]);return U}getUri(A){A=AC(this.defaults,A);let Q=gJ(A.baseURL,A.url,A.allowAbsoluteUrls);return OJ(Q,A.params,A.paramsSerializer)}}q.forEach(["delete","get","head","options"],function(Q){M9.prototype[Q]=function(B,I){return this.request(AC(I||{},{method:Q,url:B,data:(I||{}).data}))}});q.forEach(["post","put","patch"],function(Q){function B(I){return function(C,Y,J){return this.request(AC(J||{},{method:Q,headers:I?{"Content-Type":"multipart/form-data"}:{},url:C,data:Y}))}}M9.prototype[Q]=B(),M9.prototype[Q+"Form"]=B(!0)});var K9=M9;class sL{constructor(A){if(typeof A!=="function")throw TypeError("executor must be a function.");let Q;this.promise=new Promise(function(E){Q=E});let B=this;this.promise.then((I)=>{if(!B._listeners)return;let E=B._listeners.length;while(E-- >0)B._listeners[E](I);B._listeners=null}),this.promise.then=(I)=>{let E,C=new Promise((Y)=>{B.subscribe(Y),E=Y}).then(I);return C.cancel=function(){B.unsubscribe(E)},C},A(function(E,C,Y){if(B.reason)return;B.reason=new aI(E,C,Y),Q(B.reason)})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(A){if(this.reason){A(this.reason);return}if(this._listeners)this._listeners.push(A);else this._listeners=[A]}unsubscribe(A){if(!this._listeners)return;let Q=this._listeners.indexOf(A);if(Q!==-1)this._listeners.splice(Q,1)}toAbortSignal(){let A=new AbortController,Q=(B)=>{A.abort(B)};return this.subscribe(Q),A.signal.unsubscribe=()=>this.unsubscribe(Q),A.signal}static source(){let A;return{token:new sL(function(I){A=I}),cancel:A}}}var Fo=sL;function eL(A){return function(B){return A.apply(null,B)}}function Aq(A){return q.isObject(A)&&A.isAxiosError===!0}var Qq={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Qq).forEach(([A,Q])=>{Qq[Q]=A});var $o=Qq;function Wo(A){let Q=new K9(A),B=e$(K9.prototype.request,Q);return q.extend(B,K9.prototype,Q,{allOwnKeys:!0}),q.extend(B,Q,null,{allOwnKeys:!0}),B.create=function(E){return Wo(AC(A,E))},B}var qB=Wo(dU);qB.Axios=K9;qB.CanceledError=aI;qB.CancelToken=Fo;qB.isCancel=F9;qB.VERSION=TJ;qB.toFormData=FY;qB.AxiosError=c;qB.Cancel=qB.CanceledError;qB.all=function(Q){return Promise.all(Q)};qB.spread=eL;qB.isAxiosError=Aq;qB.mergeConfig=AC;qB.AxiosHeaders=EB;qB.formToJSON=(A)=>D6(q.isHTMLForm(A)?new FormData(A):A);qB.getAdapter=O6.getAdapter;qB.HttpStatusCode=$o;qB.default=qB;var WB=qB;eA();oE();gQ();uI();import{mkdirSync as PjA,writeFileSync as TjA}from"fs";uI();eA();GB();gQ();tB();var S6="/home/claude/.claude/remote",t5Q=`${S6}/.oauth_token`,s5Q=`${S6}/.api_key`,_6=`${S6}/.session_ingress_token`;function No(A,Q,B){if(!aA(process.env.CLAUDE_CODE_REMOTE))return;try{PjA(S6,{recursive:!0,mode:448}),TjA(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): ${UA(I)}`,{level:"error"})}}function Bq(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(!bE(B))z(`Failed to read ${Q} from ${A}: ${UA(B)}`,{level:"debug"});return null}}eA();gQ();tB();function kjA(){let A=eg();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??_6,E=Bq(I,"session ingress token");return _G(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"}),_G(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"}),_G(null),null;return z(`Successfully read token from file descriptor ${B}`),_G(C),No(_6,C,"session ingress token"),C}catch(I){z(`Failed to read token from file descriptor ${B}: ${UA(I)}`,{level:"error"});let E=process.env.CLAUDE_SESSION_INGRESS_TOKEN_FILE??_6,C=Bq(E,"session ingress token");return _G(C),C}}function z9(){let A=process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN;if(A)return A;return kjA()}function P6(){let A=z9();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 Z9(A){process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN=A}IQ();class sU extends Error{retryAfterMs;constructor(A,Q){super(A);this.retryAfterMs=Q}}class bJ{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 sU?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(LA(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)})}}p0();class Iq{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}}eA();oE();GB();PE();import{Agent as yjA}from"https";PE();eA();GB();tB();var Xo=["bundled","system"];function bjA(){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:Xo}if(iD("--use-system-ca")||iD("--use-openssl-ca"))return["system"];return Xo}var eU=FQ(()=>{let A=bjA(),Q=process.env.NODE_EXTRA_CA_CERTS,B=A.includes("bundled"),I=A.includes("system");z(`CA certs: stores=${A.join(",")}, extraCertsPath=${Q}`);let E=O("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?wF(Y):void 0});eA();tB();var H9=FQ(()=>{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}),fjA=FQ(()=>{let A=H9(),Q=eU();if(!A&&!Q)return;let B={...A,...Q&&{ca:Q},keepAlive:!0};return z("mTLS: Creating HTTPS agent with custom certificates"),new yjA(B)});function Do(){let A=H9(),Q=eU();if(!A&&!Q)return;return{...A,...Q&&{ca:Q}}}function T6(){let A=H9(),Q=eU();if(!A&&!Q)return{};return{tls:{...A,...Q&&{ca:Q}}}}PE();uI();var LmA=kY(vo(),1);eA();GB();pH();var qmA=!1;function jEA(A=process.env){return A.https_proxy||A.HTTPS_PROXY||A.http_proxy||A.HTTP_PROXY}function jmA(A=process.env){return A.no_proxy||A.NO_PROXY}function REA(A,Q=jmA()){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}}var K3Q=FQ((A)=>{let Q=qEA(),B=H9(),I=eU(),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 xEA(A){let Q=jEA();if(!Q)return;if(REA(A))return;return Q}var RmA=null;function xmA(){return RmA?.value??null}function xR(A){let Q={...qmA&&{keepalive:!1},...A.forAnthropicAPI&&!aA(process.env.API_FORCE_IDLE_TIMEOUT)&&{timeout:!1}};if(A.forAnthropicAPI){let I=process.env.ANTHROPIC_UNIX_SOCKET;if(I)return{...Q,unix:I}}let B=jEA();if(B){if(A.url&&REA(A.url))return{...Q,...T6()};let I=xmA();return{...Q,proxy:I?{url:B,headers:{"Proxy-Authorization":I}}:B,...T6()}}return{...Q,...T6()}}PG();oE();GB();var OmA=30000;function gmA(){return{activityCallback:null,refcount:0,activeReasons:new Map,oldestActivityStartedAt:null,heartbeatTimer:null,idleTimer:null,cleanupHandle:null}}var vmA="cli",OEA=()=>vmA;var OR=new Map;function SmA(){let A=OEA(),Q=OR.get(A);if(!Q)Q=gmA(),OR.set(A,Q);return Q}function _mA(){return OR.get(OEA())??null}function PmA(A){gEA(A),A.heartbeatTimer=setInterval((Q)=>{if(a("debug","session_keepalive_heartbeat",{refcount:Q.refcount}),aA(process.env.CLAUDE_CODE_REMOTE_SEND_KEEPALIVES))Q.activityCallback?.()},OmA,A)}function gEA(A){if(A.idleTimer!==null)clearTimeout(A.idleTimer),A.idleTimer=null}function VD(A){let Q=SmA();if(Q.activityCallback=A,Q.refcount>0&&Q.heartbeatTimer===null)PmA(Q)}function qW(){let A=_mA();if(!A)return;if(A.activityCallback=null,A.heartbeatTimer!==null)clearInterval(A.heartbeatTimer),A.heartbeatTimer=null;gEA(A)}IQ();var TmA=`{"type":"keep_alive"}
|
|
178
178
|
`,kmA=1000,bmA=1000,SEA=30000,ymA=600000,fmA=1e4,hmA=300000,vEA=SEA*2,mmA=new Set([1002,4001,4003]);class gR{ws=null;lastSentId=null;url;state="idle";onData;onCloseCallback;onConnectCallback;onDiagnostic;headers;sessionId;autoReconnect;isBridge;reconnectAttempts=0;reconnectStartTime=null;reconnectTimer=null;lastReconnectAttemptTime=null;connectErrorsSeen=new Set;lastActivityTime=0;pingInterval=null;pongReceived=!0;keepAliveInterval=null;messageBuffer;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 Iq(kmA)}async connect(){if(this.state!=="idle"&&this.state!=="reconnecting"){z(`WebSocketTransport: Cannot connect, current state is ${this.state}`,{level:"error"}),a("error","cli_websocket_connect_failed");return}this.state="reconnecting",this.connectStartTime=Date.now(),z(`WebSocketTransport: Opening ${this.url.href}`),a("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}`);let Q=new globalThis.WebSocket(this.url.href,{headers:A,proxy:xEA(this.url.href),tls:Do()||void 0});this.ws=Q,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)}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(),a("info","cli_websocket_message_received",{length:Q.length}),this.onData)this.onData(Q)};onBunError=()=>{z("WebSocketTransport: Error",{level:"error"}),a("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"}),a("error","cli_websocket_connect_closed"),this.handleConnectionError(A.code)};onPong=()=>{this.pongReceived=!0};handleOpenEvent(){let A=Date.now()-this.connectStartTime;if(z("WebSocketTransport: Connected"),a("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});if(this.reconnectAttempts>0){let Q=this.reconnectStartTime?Math.round((Date.now()-this.reconnectStartTime)/1000):0;this.onDiagnostic?.(`WS reconnected after ${this.reconnectAttempts} attempt(s), ${Q}s downtime`+(this.connectErrorsSeen.size>0?`, errors=[${[...this.connectErrorsSeen].join(",")}]`:""))}else this.onDiagnostic?.(`WS connected in ${A}ms`);this.connectErrorsSeen.clear(),this.reconnectAttempts=0,this.reconnectStartTime=null,this.lastReconnectAttemptTime=null,this.lastActivityTime=Date.now(),this.state="connected",this.onConnectCallback?.(),this.startPingInterval(),this.startKeepaliveInterval(),VD(()=>{this.write({type:"keep_alive"})})}sendLine(A){if(!this.ws||this.state!=="connected")return z("WebSocketTransport: Not connected"),a("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"}),a("error","cli_websocket_send_error"),this.handleConnectionError(),!1}}removeWsListeners(A){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)}doDisconnect(){if(this.stopPingInterval(),this.stopKeepaliveInterval(),qW(),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})`:"")),a("info","cli_websocket_disconnected"),A!=null)this.connectErrorsSeen.add(`ws_${A}`);if(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"),a("info","cli_websocket_4003_token_refreshed")}if(A!=null&&mmA.has(A)&&!Q){z(`WebSocketTransport: Permanent close code ${A}, not reconnecting`,{level:"error"}),a("error","cli_websocket_permanent_close",{closeCode:A}),this.onDiagnostic?.(`WS permanent close (code ${A}), not reconnecting`),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>vEA)z(`WebSocketTransport: Detected system sleep (${Math.round((B-this.lastReconnectAttemptTime)/1000)}s gap), resetting reconnection budget`),a("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<ymA){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(bmA*Math.pow(2,this.reconnectAttempts-1),SEA),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)`),a("error","cli_websocket_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.onDiagnostic?.(`WS reconnect (${A!=null?`code ${A}`:"no code"}) attempt=${this.reconnectAttempts} ${Math.round(I/1000)}s elapsed, retry in ${Math.round(C)}ms`+(this.connectErrorsSeen.size>1?`, errors=[${[...this.connectErrorsSeen].join(",")}]`:"")),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"}),a("error","cli_websocket_reconnect_exhausted",{reconnectAttempts:this.reconnectAttempts,elapsedMs:I}),this.onDiagnostic?.(`WS reconnection budget exhausted: ${this.reconnectAttempts} attempts over ${Math.round(I/1000)}s, errors=[${[...this.connectErrorsSeen].join(",")||"none"}], last code=${A??"none"}`),this.state="closed",this.onCloseCallback)this.onCloseCallback(A)}close(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;this.stopPingInterval(),this.stopKeepaliveInterval(),qW(),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`),a("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"),a("info","cli_websocket_no_messages_to_replay");return}z(`WebSocketTransport: Replaying ${I.length} buffered messages`),a("info","cli_websocket_messages_to_replay",{count:I.length});for(let E of I){let C=LA(E)+`
|
|
179
179
|
`;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}setOnDiagnostic(A){this.onDiagnostic=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=LA(A)+`
|
|
180
|
-
`;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>vEA){z(`WebSocketTransport: ${Math.round(B/1000)}s tick gap detected — process was suspended, forcing reconnect`),a("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"}),a("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(I){z(`WebSocketTransport: Ping failed: ${I}`,{level:"error"}),a("error","cli_websocket_ping_failed")}}},fmA)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),aA(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(TmA),this.lastActivityTime=Date.now(),z("WebSocketTransport: Sent periodic keep_alive data frame")}catch(A){z(`WebSocketTransport: Periodic keep_alive failed: ${A}`,{level:"error"}),a("error","cli_websocket_keepalive_failed")}},hmA)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var umA=100,cmA=15000,pmA=3000;class vR extends gR{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=lmA(A),this.uploader=new bJ({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:C,onBatchDropped:(J,G)=>{a("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}`),a("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(),umA);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,pmA)})]).finally(()=>{clearTimeout(Q),A.close()}),super.close()}async postOnce(A){let Q=z9();if(!Q){z("HybridTransport: No session token available for POST"),a("warn","cli_hybrid_post_no_token");return}let B={Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},I;try{I=await WB.post(this.postUrl,{events:A},{headers:B,validateStatus:()=>!0,timeout:cmA})}catch(E){throw z(`HybridTransport: POST error: ${UA(E)}`),a("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`),a("warn","cli_hybrid_post_client_error",{status:I.status});return}throw z(`HybridTransport: POST returned ${I.status} (retryable)`),a("warn","cli_hybrid_post_retryable_error",{status:I.status}),Error(`POST failed with ${I.status}`)}}function lmA(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}`}p0();GB();function _EA(){let{namespace:A,cluster:Q}=zO();return{...A&&{cooNamespace:A},...Q&&{cooCluster:Q}}}PG();import{chmod as J7Q,mkdir as G7Q,readdir as U7Q,readFile as omA,unlink as F7Q,writeFile as amA}from"fs/promises";import{join as TEA}from"path";uI();p0();PG();eA();GB();gQ();sX();IQ();import{AsyncLocalStorage as imA}from"async_hooks";var d3Q=new imA;GB();var x7Q=k(()=>XC.object({pid:XC.number(),sessionId:XC.string(),cwd:XC.string().optional(),startedAt:XC.number(),version:XC.string().optional(),kind:XC.enum(["interactive","bg","daemon","daemon-worker"])}));function rmA(){return TEA(FE(),"sessions")}var PEA=Promise.resolve();async function tmA(A){let Q=TEA(rmA(),`${process.pid}.json`),B=PEA.then(async()=>{try{let I=mQ(await omA(Q,"utf8"));await amA(Q,LA({...I,...A}))}catch(I){z(`[concurrentSessions] updatePidFile failed: ${UA(I)}`)}});PEA=B,await B}async function kEA(A){await tmA({bridgeSessionId:A})}eA();oE();GB();gQ();function XB(A,Q){return Object.freeze({name:A,header:Q})}var smA=XB("claude_code","claude-code-20250219"),emA=XB("oauth_auth",vP),AuA=XB("interleaved_thinking","interleaved-thinking-2025-05-14"),QuA=XB("long_context","context-1m-2025-08-07"),BuA=XB("context_management","context-management-2025-06-27"),IuA=XB("structured_outputs","structured-outputs-2025-12-15"),EuA=XB("web_search","web-search-2025-03-05"),CuA=XB("tool_search","advanced-tool-use-2025-11-20"),YuA=XB("tool_search","tool-search-tool-2025-10-19"),JuA=XB("effort","effort-2025-11-24"),GuA=XB("task_budgets","task-budgets-2026-03-13"),UuA=XB("prompt_caching_scope","prompt-caching-scope-2026-01-05"),FuA=XB("extended_cache_ttl","extended-cache-ttl-2025-04-11"),$uA=XB("speed","fast-mode-2026-02-01"),WuA=XB("redact_thinking","redact-thinking-2026-02-12"),NuA=null,XuA=null,DuA=null,VuA=XB("advisor_tool","advisor-tool-2026-03-01"),wuA=XB("cache_diagnosis","cache-diagnosis-2026-04-07"),MuA=XB("context_hint","context-hint-2026-04-09"),KuA=XB("mcp_servers","mcp-servers-2025-12-04"),zuA=XB("files_api","files-api-2025-04-14"),_R=XB("environments","environments-2025-11-01"),ZuA=XB("ccr_byoc","ccr-byoc-2025-07-29"),HuA=null,LuA=Object.freeze([smA,emA,AuA,QuA,BuA,IuA,EuA,CuA,YuA,JuA,GuA,UuA,FuA,$uA,WuA,NuA,XuA,DuA,VuA,wuA,MuA,KuA,zuA,_R,ZuA,HuA].filter((A)=>A!==null)),v7Q=new Map(LuA.map((A)=>[A.header,A]));aC();yR();function bC(){return"claude-code/0.3.147"}import{randomUUID as duA}from"crypto";function GCA(A,Q,B,I){if(!I)return{url:`${A}/v1/sessions/${Q}/events`,body:{events:B}};let E=RW(Q);return{url:`${A}/v1/code/sessions/${encodeURIComponent(E)}/events`,body:{events:B.map((C)=>({payload:typeof C.uuid==="string"&&C.uuid?C:{...C,uuid:duA()}}))}}}p0();eA();gQ();IQ();var UCA=2000,nuA=["session_ingress_token","environment_secret","access_token","secret","token"],ouA=new RegExp(`"(${nuA.join("|")})"\\s*:\\s*"([^"]*)"`,"g"),auA=16;function ruA(A){return A.replace(ouA,(Q,B,I)=>{if(I.length<auA)return`"${B}":"[REDACTED]"`;let E=`${I.slice(0,8)}...${I.slice(-4)}`;return`"${B}":"${E}"`})}function t1(A){let Q=typeof A==="string"?A:LA(A),B=ruA(Q);if(B.length<=UCA)return B;return B.slice(0,UCA)+`... (${B.length} chars)`}function FCA(A){let Q=UA(A);if(A&&typeof A==="object"&&"response"in A){let B=A.response;if(B?.data&&typeof B.data==="object"){let I=B.data,E=typeof I.message==="string"?I.message:typeof I.error==="object"&&I.error&&("message"in I.error)&&typeof I.error.message==="string"?I.error.message:void 0;if(E)return`${Q}: ${E}`}}return Q}function $CA(A){if(A&&typeof A==="object"&&"response"in A&&A.response&&typeof A.response.status==="number")return A.response.status;return}function mR(A,Q=Date.now()){if(!A)return;let B=Number(A);if(Number.isFinite(B)&&B>=0)return B*1000;let I=Date.parse(A);if(Number.isFinite(I)){let E=I-Q;return E>0?E:void 0}return}function WCA(A){if(!A||typeof A!=="object")return;if("retryAfterMs"in A&&typeof A.retryAfterMs==="number")return A.retryAfterMs;if("response"in A){let B=A.response?.headers?.["retry-after"];if(typeof B==="string")return mR(B)}return}function YG(A){if(!A||typeof A!=="object")return;if("message"in A&&typeof A.message==="string")return A.message;if("error"in A&&A.error!==null&&typeof A.error==="object"&&"message"in A.error&&typeof A.error.message==="string")return A.error.message;return}function NCA(A,Q,B){if(Q)z(Q);rA("tengu_bridge_repl_skipped",{reason:A,...B!==void 0&&{v2:B}})}var HD="Remote Control is only available with claude.ai subscriptions. Please use `/login` to sign in with your claude.ai account.";var tuA=/^[a-zA-Z0-9_-]+$/;function TI(A,Q){if(!A||!tuA.test(A))throw Error(`Invalid ${Q}: contains unsafe characters`);return A}class YE extends Error{status;errorType;constructor(A,Q,B){super(A);this.name="BridgeFatalError",this.status=Q,this.errorType=B}}function DCA(A){function Q(J){A.onDebug?.(J)}let B=0,I=100;async function E(J){let G={Authorization:`Bearer ${J}`,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-beta":_R.header,"x-environment-runner-version":A.runnerVersion,"User-Agent":bC()},U=await A.getTrustedDeviceToken?.();if(U)G["X-Trusted-Device-Token"]=U;return G}function C(){let J=A.getAccessToken();if(!J)throw Error(HD);return J}async function Y(J,G){let U=C(),F=await J(U);if(F.status!==401)return F;if(!A.onAuth401)return Q(`[bridge:api] ${G}: 401 received, no refresh handler`),F;if(Q(`[bridge:api] ${G}: 401 received, attempting token refresh`),await A.onAuth401(U)){Q(`[bridge:api] ${G}: Token refreshed, retrying request`);let W=C(),X=await J(W);if(X.status!==401)return X;Q(`[bridge:api] ${G}: Retry after refresh also got 401`)}else Q(`[bridge:api] ${G}: Token refresh failed`);return F}return{async registerBridgeEnvironment(J){return pI("bridge_environment_register",async()=>{Q(`[bridge:api] POST /v1/environments/bridge bridgeId=${J.bridgeId}`);let G=await Y(async(U)=>WB.post(`${A.baseUrl}/v1/environments/bridge`,{machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:J.gitRepoUrl,max_sessions:J.maxSessions,metadata:{worker_type:J.workerType},...J.reuseEnvironmentId&&{environment_id:J.reuseEnvironmentId}},{headers:await E(U),timeout:15000,validateStatus:(F)=>F<500}),"Registration");return v0(G.status,G.data,"Registration"),Q(`[bridge:api] POST /v1/environments/bridge -> ${G.status} environment_id=${G.data.environment_id}`),Q(`[bridge:api] >>> ${t1({machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:YCA(J.gitRepoUrl),max_sessions:J.maxSessions,metadata:{worker_type:J.workerType}})}`),Q(`[bridge:api] <<< ${t1(G.data)}`),G.data},XCA)},async pollForWork(J,G,U,F){TI(J,"environmentId");let N=B;B=0;let W=await WB.get(`${A.baseUrl}/v1/environments/${J}/work/poll`,{headers:await E(G),params:F!==void 0?{reclaim_older_than_ms:F}:void 0,timeout:1e4,signal:U,validateStatus:(X)=>X<500});if(v0(W.status,W.data,"Poll",W.headers),!W.data){if(B=N+1,B===1||B%I===0)Q(`[bridge:api] GET .../work/poll -> ${W.status} (no work, ${B} consecutive empty polls)`);return null}return Q(`[bridge:api] GET .../work/poll -> ${W.status} workId=${W.data.id} type=${W.data.data?.type}${W.data.data?.id?` sessionId=${W.data.data.id}`:""}`),Q(`[bridge:api] <<< ${t1(W.data)}`),W.data},async acknowledgeWork(J,G,U){TI(J,"environmentId"),TI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/ack`);let F=await WB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/ack`,{},{headers:await E(U),timeout:1e4,validateStatus:(N)=>N<500});v0(F.status,F.data,"Acknowledge"),Q(`[bridge:api] POST .../work/${G}/ack -> ${F.status}`)},async stopWork(J,G,U){TI(J,"environmentId"),TI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/stop force=${U}`);let F=await Y(async(N)=>WB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/stop`,{force:U},{headers:await E(N),timeout:1e4,validateStatus:(W)=>W<500}),"StopWork");v0(F.status,F.data,"StopWork"),Q(`[bridge:api] POST .../work/${G}/stop -> ${F.status}`)},async deregisterEnvironment(J){TI(J,"environmentId"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J}`);let G=await Y(async(U)=>WB.delete(`${A.baseUrl}/v1/environments/bridge/${J}`,{headers:await E(U),timeout:1e4,validateStatus:(F)=>F<500}),"Deregister");v0(G.status,G.data,"Deregister"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J} -> ${G.status}`)},async archiveSession(J){TI(J,"sessionId"),Q(`[bridge:api] POST /v1/sessions/${J}/archive`);let G=await Y(async(U)=>WB.post(`${A.baseUrl}/v1/sessions/${J}/archive`,{},{headers:await E(U),timeout:1e4,validateStatus:(F)=>F<500}),"ArchiveSession");if(G.status===409){Q(`[bridge:api] POST /v1/sessions/${J}/archive -> 409 (already archived)`);return}v0(G.status,G.data,"ArchiveSession"),Q(`[bridge:api] POST /v1/sessions/${J}/archive -> ${G.status}`)},async reconnectSession(J,G){return pI("bridge_session_reconnect",async()=>{TI(J,"environmentId"),TI(G,"sessionId"),Q(`[bridge:api] POST /v1/environments/${J}/bridge/reconnect session_id=${G}`);let U=await Y(async(F)=>WB.post(`${A.baseUrl}/v1/environments/${J}/bridge/reconnect`,{session_id:G},{headers:await E(F),timeout:1e4,validateStatus:(N)=>N<500}),"ReconnectSession");v0(U.status,U.data,"ReconnectSession"),Q(`[bridge:api] POST .../bridge/reconnect -> ${U.status}`)},XCA)},async heartbeatWork(J,G,U){TI(J,"environmentId"),TI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/heartbeat`);let F=await WB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/heartbeat`,{},{headers:await E(U),timeout:1e4,validateStatus:(N)=>N<500});return v0(F.status,F.data,"Heartbeat"),Q(`[bridge:api] POST .../work/${G}/heartbeat -> ${F.status} lease_extended=${F.data.lease_extended} state=${F.data.state}`),F.data},async sendPermissionResponseEvent(J,G,U){TI(J,"sessionId");let{url:F,body:N}=GCA(A.baseUrl,J,[G],A.useCcrV2Routing?.()??!1);Q(`[bridge:api] POST ${F} type=${G.type}`);let W=await WB.post(F,N,{headers:await E(U),timeout:1e4,validateStatus:(X)=>X<500});v0(W.status,W.data,"SendPermissionResponseEvent"),Q(`[bridge:api] POST ${F} -> ${W.status}`),Q(`[bridge:api] >>> ${t1(N)}`),Q(`[bridge:api] <<< ${t1(W.data)}`)}}}function v0(A,Q,B,I){if(A===200||A===204)return;let E=YG(Q),C=suA(Q);switch(A){case 401:throw new YE(`${B}: Authentication failed (401)${E?`: ${E}`:""}. ${HD}`,401,C);case 403:throw new YE(LD(C)?"Remote Control session expired.":`${B}: Access denied (403)${E?`: ${E}`:""}. Check your organization permissions.`,403,C);case 404:throw new YE(E??`${B}: Not found (404). Remote Control may not be available for this organization.`,404,C);case 410:throw new YE(E??"Remote Control session expired.",410,C??"environment_expired");case 429:{let Y=mR(typeof I?.["retry-after"]==="string"?I["retry-after"]:void 0);throw Object.assign(Error(`${B}: Rate limited (429). Polling too frequently.`),Y!==void 0?{status:A,retryAfterMs:Y}:{status:A})}default:throw Object.assign(Error(`${B}: Failed with status ${A}${E?`: ${E}`:""}`),{status:A})}}function LD(A){if(!A)return!1;return A.includes("expired")||A.includes("lifetime")}function VCA(A){if(A.status!==403)return!1;return A.message.includes("external_poll_sessions")||A.message.includes("environments:manage")}function XCA(A){if(A instanceof YE)return A.status===401?"auth_failed":"http_error";if(A instanceof Error){if(A.message===HD)return"no_token";if("status"in A&&typeof A.status==="number")return"http_error"}return"request_failed"}function suA(A){if(A&&typeof A==="object"){if("error"in A&&A.error&&typeof A.error==="object"&&"type"in A.error&&typeof A.error.type==="string")return A.error.type}return}eA();import{randomUUID as euA}from"crypto";aC();p0();var wCA={input_tokens:0,cache_creation_input_tokens:0,cache_read_input_tokens:0,output_tokens:0,server_tool_use:{web_search_requests:0,web_fetch_requests:0},service_tier:"standard",cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},inference_geo:"",iterations:[],speed:"standard"};function MCA(A){if(A===null||typeof A!=="object")return A;let Q=A;if("requestId"in Q&&!("request_id"in Q))Q.request_id=Q.requestId,delete Q.requestId;if("response"in Q&&Q.response!==null&&typeof Q.response==="object"){let B=Q.response;if("requestId"in B&&!("request_id"in B))B.request_id=B.requestId,delete B.requestId}return A}eA();dZ();gQ();IQ();function AcA(A){return A!==null&&typeof A==="object"&&"type"in A&&typeof A.type==="string"}function QcA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_response"&&"response"in A}function BcA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_request"&&"request_id"in A&&"request"in A}function uR(A){if((A.type==="user"||A.type==="assistant")&&A.isVirtual)return!1;return A.type==="user"||A.type==="assistant"||A.type==="system"&&A.subtype==="local_command"}function KCA(A){if(A.type!=="user"||A.isMeta||A.toolUseResult||A.isCompactSummary)return;if(A.origin&&A.origin.kind!=="human")return;let Q=A.message.content,B;if(typeof Q==="string")B=Q;else for(let E of Q)if(E.type==="text"){B=E.text;break}if(!B)return;return iZ(B)||void 0}function zCA(A,Q,B,I,E,C){try{let Y=MCA(mQ(A));if(QcA(Y)){z("[bridge:repl] Ingress message type=control_response"),E?.(Y);return}if(BcA(Y)){z(`[bridge:repl] Inbound control_request subtype=${Y.request.subtype}`),C?.(Y);return}if(!AcA(Y))return;let J="uuid"in Y&&typeof Y.uuid==="string"?Y.uuid:void 0;if(J&&Q.has(J)){z(`[bridge:repl] Ignoring echo: type=${Y.type} uuid=${J}`);return}if(J&&B.has(J)){z(`[bridge:repl] Ignoring re-delivered inbound: type=${Y.type} uuid=${J}`);return}if(z(`[bridge:repl] Ingress message type=${Y.type}${J?` uuid=${J}`:""}`),Y.type==="user"){if(J)B.add(J);rA("tengu_bridge_message_received",{is_repl:!0}),cI("bridge_message_receive"),I?.(Y)}else z(`[bridge:repl] Ignoring non-user inbound message: type=${Y.type}`)}catch(Y){z(`[bridge:repl] Failed to parse ingress message: ${UA(Y)}`),sB("bridge_message_receive","bridge_message_receive_parse_failed")}}var IcA="This session is outbound-only. Enable Remote Control locally to allow inbound control.";function ZCA(A,Q){let{transport:B,sessionId:I,outboundOnly:E,onInterrupt:C,onSetModel:Y,onSetMaxThinkingTokens:J,onSetPermissionMode:G,onRenameSession:U,onSetColor:F,onFileSuggestions:N,onReadFile:W,onGetContextUsage:X,onMcpAuthenticate:D,onMcpOauthCallbackUrl:w,onMcpReconnect:V,onMcpStatus:M}=Q;if(!B){z("[bridge:repl] Cannot respond to control_request: transport not configured");return}let j;if(E&&A.request.subtype!=="initialize"){j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:IcA}};let Z={...j,session_id:I};B.write(Z),z(`[bridge:repl] Rejected ${A.request.subtype} (outbound-only) request_id=${A.request_id}`);return}switch(A.request.subtype){case"initialize":j={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{commands:[],output_style:"normal",available_output_styles:["normal"],models:[],account:{},pid:process.pid}}};break;case"set_model":Y?.(A.request.model),j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_max_thinking_tokens":J?.(A.request.max_thinking_tokens),j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_permission_mode":{let Z=G?.(A.request.mode)??{ok:!1,error:"set_permission_mode is not supported in this context (onSetPermissionMode callback not registered)"};if(Z.ok)j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:Z.error}};break}case"rename_session":{let Z=U?.(A.request.title)??{ok:!1,error:"rename_session is not supported in this context (onRenameSession callback not registered)"};if(Z.ok)j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:Z.error}};break}case"set_color":{let Z=F?.(A.request.color)??{ok:!1,error:"set_color is not supported in this context (onSetColor callback not registered)"};if(Z.ok)j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:Z.error}};break}case"file_suggestions":{if(!N){j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"file_suggestions is not supported in this context (onFileSuggestions callback not registered)"}};break}N(A.request.query).then((Z)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{suggestions:Z}}})).catch((Z)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:UA(Z)}})).then((Z)=>{let g={...Z,session_id:I};B.write(g),z(`[bridge:repl] Sent control_response for file_suggestions request_id=${A.request_id} result=${Z.response.subtype}`)});return}case"read_file":{if(!W){j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"read_file is not supported in this context (onReadFile callback not registered)"}};break}W(A.request.path,A.request.max_bytes,A.request.encoding).then((Z)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:Z}})).catch((Z)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:UA(Z)}})).then((Z)=>{let g={...Z,session_id:I};B.write(g),z(`[bridge:repl] Sent control_response for read_file request_id=${A.request_id} result=${Z.response.subtype}`)});return}case"get_context_usage":{if(!X){j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"get_context_usage is not supported in this context (onGetContextUsage callback not registered)"}};break}X().then((Z)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{...Z}}})).catch((Z)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:UA(Z)}})).then((Z)=>{let g={...Z,session_id:I};B.write(g),z(`[bridge:repl] Sent control_response for get_context_usage request_id=${A.request_id} result=${Z.response.subtype}`)});return}case"mcp_status":j={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{mcpServers:M?.()??[]}}};break;case"mcp_authenticate":case"mcp_oauth_callback_url":case"mcp_reconnect":{let Z=A.request,{subtype:g,serverName:T}=Z,S=Z.subtype==="mcp_authenticate"?D&&((d)=>D(d,Z.redirectUri)):Z.subtype==="mcp_oauth_callback_url"?w&&((d)=>w(d,Z.callbackUrl)):V;if(!S){j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`${g} is not supported in this context (callback not registered)`}};break}S(T).then((d)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:d??{}}})).catch((d)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:UA(d)}})).then((d)=>{let r={...d,session_id:I};B.write(r),z(`[bridge:repl] Sent control_response for ${g} request_id=${A.request_id} result=${d.response.subtype}`)});return}case"interrupt":C?.(),j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;default:j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`REPL bridge does not handle control_request subtype: ${A.request.subtype}`}}}let L={...j,session_id:I};B.write(L),z(`[bridge:repl] Sent control_response for ${A.request.subtype} request_id=${A.request_id} result=${j.response.subtype}`)}function cR(A){return{type:"result",subtype:"success",duration_ms:0,duration_api_ms:0,is_error:!1,num_turns:0,result:"",stop_reason:null,total_cost_usd:0,usage:{...wCA},modelUsage:{},permission_denials:[],session_id:A,uuid:euA()}}class qD{capacity;ring;set=new Set;writeIdx=0;constructor(A){this.capacity=A,this.ring=Array(A)}add(A){if(this.set.has(A))return;let Q=this.ring[this.writeIdx];if(Q!==void 0)this.set.delete(Q);this.ring[this.writeIdx]=A,this.set.add(A),this.writeIdx=(this.writeIdx+1)%this.capacity}has(A){return this.set.has(A)}clear(){this.set.clear(),this.ring.fill(void 0),this.writeIdx=0}}function HCA(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 pR{_active=!1;_pending=[];get active(){return this._active}get pendingCount(){return this._pending.length}start(){this._active=!0}end(){return this._active=!1,this._pending.splice(0)}enqueue(...A){if(!this._active)return!1;return this._pending.push(...A),!0}drop(){this._active=!1;let A=this._pending.length;return this._pending.length=0,A}deactivate(){this._active=!1}}import{randomUUID as jCA}from"crypto";p0();eA();oE();gQ();IQ();function EcA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return mQ(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function LCA(A){let Q=EcA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}eA();oE();gQ();IQ();class lR{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?qCA(this.pending,A):A,this.drain()}close(){this.closed=!0,this.pending=null}async flush(){while(!this.closed)if(this.inflight)await this.inflight;else if(this.pending)await this.drain();else return}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 kB(this.retryDelay(B)),this.pending&&!this.closed)Q=qCA(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 qCA(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 CcA=20000,YcA=100;function RCA(A){let Q=SB(A);if(Q)return Q;if(A&&typeof A==="object"&&"name"in A&&typeof A.name==="string")return A.name;return}class jD extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var JcA=10,GcA=3;function UcA(){return{byMessage:new Map,scopeToMessage:new Map}}function RD(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function FcA(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(RD(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(RD(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(RD(E)),Y=C?Q.byMessage.get(C):void 0;if(!Y){B.push(E);break}let J=Y[E.event.index]??=[];if(J.push(E.event.delta.text),I.has(J))break;let G={type:"stream_event",uuid:E.uuid,session_id:E.session_id,parent_tool_use_id:E.parent_tool_use_id,event:{type:"content_block_delta",index:E.event.index,delta:{type:"text_delta",text:""}}};I.set(J,G),B.push(G);break}default:B.push(E)}for(let[E,C]of I)C.event.delta.text=E.join("");return B}function $cA(A,Q){A.byMessage.delete(Q.message.id);let B=RD(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class iR{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;consecutiveNotFound=0;currentState=null;sessionBaseUrl;sessionId;streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=UcA();workerState;eventUploader;internalEventUploader;deliveryUploader;pendingProcessingAcks=[];onEpochMismatch;getAuthHeaders;onDiagnostic;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??CcA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??P6,this.onDiagnostic=B?.onDiagnostic,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 lR({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 bJ({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 sU("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new bJ({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 sU("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new bJ({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 sU("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 jD("no_auth_headers");if(A===void 0){let G=process.env.CLAUDE_CODE_WORKER_EPOCH;A=G?parseInt(G,10):NaN}if(isNaN(A))throw new jD("missing_epoch");this.workerEpoch=A;let B=this.getWorkerState(),I={ok:!1},E=new Set,C=3;for(let G=1;G<=C;G++){if(I=await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)"),I.ok||this.closed)break;if(I.reason)E.add(I.reason);if(this.onDiagnostic?.(`PUT /worker failed (${I.reason??"unknown"}) attempt=${G}/${C}, ${Math.round((Date.now()-Q)/1000)}s elapsed`),G<C){let U=Math.min(500*2**(G-1),30000)+Math.random()*500;await kB(U)}}if(!I.ok){if(!this.closed)a("error","cli_worker_init_put_retries_exhausted"),this.onDiagnostic?.(`PUT /worker retries exhausted: ${C} attempts over ${Math.round((Date.now()-Q)/1000)}s, errors=[${[...E].join(",")||"unknown"}]`);throw new jD("worker_register_failed")}this.currentState="idle",this.startHeartbeat(),VD(()=>{this.writeEvent({type:"keep_alive"})}),z(`CCRClient: initialized, epoch=${this.workerEpoch}`),a("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:Y,durationMs:J}=await B;if(!this.closed)a("info","cli_worker_state_restored",{duration_ms:J,had_state:Y.external!==null||Y.internal!==null});return Y}async getWorkerState(){let A=Date.now(),Q=this.getAuthHeaders();if(Object.keys(Q).length===0)return{metadata:{external:null,internal:null},durationMs:0};let B=await this.getWithRetry(`${this.sessionBaseUrl}/worker`,Q,"worker_state");return{metadata:{external:B?.worker?.external_metadata??null,internal:B?.worker?.internal_metadata??null},durationMs:Date.now()-A}}async request(A,Q,B,I,{timeout:E=1e4}={}){let C=this.getAuthHeaders();if(Object.keys(C).length===0)return{ok:!1,reason:"no_auth_headers"};let Y=`${this.sessionBaseUrl}${Q}`;try{let J=await fetch(Y,{method:A.toUpperCase(),headers:{...C,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":bC()},body:LA(B),signal:AbortSignal.timeout(E),...xR({url:Y})});if(J.body?.cancel(),J.ok)return this.consecutiveAuthFailures=0,this.consecutiveNotFound=0,{ok:!0};if(J.status===409)this.handleEpochMismatch();if(J.status===404){if(this.consecutiveNotFound++,this.consecutiveNotFound>=GcA)z(`CCRClient: ${this.consecutiveNotFound} consecutive 404s — session gone, exiting`,{level:"error"}),a("error","cli_worker_session_not_found"),this.onDiagnostic?.(`${this.consecutiveNotFound} consecutive 404s on ${Q} — session gone, exiting`),this.onEpochMismatch()}if(J.status===401||J.status===403){let G=z9(),U=G?LCA(G):null;if(U!==null&&U*1000<Date.now())z(`CCRClient: session_token expired (exp=${new Date(U*1000).toISOString()}) — no refresh was delivered, exiting`,{level:"error"}),a("error","cli_worker_token_expired_no_refresh"),this.onDiagnostic?.(`session_token expired (exp=${new Date(U*1000).toISOString()}) — no refresh delivered, exiting`),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=JcA)z(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),a("error","cli_worker_auth_failures_exhausted"),this.onDiagnostic?.(`${this.consecutiveAuthFailures} consecutive auth failures (HTTP ${J.status}) with valid-looking token — exiting`),this.onEpochMismatch()}if(z(`CCRClient: ${I} returned ${J.status}`,{level:"warn"}),a("warn","cli_worker_request_failed",{method:A,path:Q,status:J.status}),J.status===429){let G=J.headers.get("retry-after"),U=G?parseInt(G,10):NaN;if(!isNaN(U)&&U>=0)return{ok:!1,retryAfterMs:U*1000,reason:`http_${J.status}`}}return{ok:!1,reason:`http_${J.status}`}}catch(J){return z(`CCRClient: ${I} failed: ${UA(J)}`,{level:"warn"}),a("warn","cli_worker_request_error",{method:A,path:Q,error_code:RCA(J)}),{ok:!1,reason:`fetch_failed:${RCA(J)}`}}}reportState(A,Q){if(A===this.currentState&&!Q)return;this.currentState=A,this.workerState.enqueue({worker_status:A,requires_action_details:Q?{tool_name:Q.tool_name,display_tool_name:Q.display_tool_name,action_description:Q.action_description,raw_command:Q.raw_command,request_id:Q.request_id,tool_use_id:Q.tool_use_id}:null})}reportMetadata(A){this.workerState.enqueue({external_metadata:WcA(A)})}reportInternalMetadata(A){this.workerState.enqueue({internal_metadata:A})}handleEpochMismatch(){z("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),a("error","cli_worker_epoch_mismatch"),this.onDiagnostic?.(`worker epoch mismatch (409), epoch=${this.workerEpoch} — superseded by a newer worker, exiting`),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(),YcA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")$cA(this.streamTextAccumulator,A);await this.eventUploader.enqueue(this.toClientEvent(A))}toClientEvent(A){let Q=A,B=Q.historical===!0;return{payload:{...Q,uuid:typeof Q.uuid==="string"?Q.uuid:jCA()},...B&&{historical:!0}}}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=FcA(A,this.streamTextAccumulator);await this.eventUploader.enqueue(Q.map((B)=>({payload:B,ephemeral:!0})))}async writeInternalEvent(A,Q,{isCompaction:B=!1,agentId:I,preservedEventIds:E}={}){let C={payload:{type:A,...Q,uuid:typeof Q.uuid==="string"?Q.uuid:jCA()},...B&&{is_compaction:!0},...I&&{agent_id:I},...E?.length&&{preserved_event_ids:E}};await this.internalEventUploader.enqueue(C)}flushInternalEvents(){return this.internalEventUploader.flush()}flushDeliveryAcks(){return this.deliveryUploader.flush()}async flush(){return await this.flushStreamEventBuffer(),this.eventUploader.flush()}async flushWorkerState(){return this.workerState.flush()}async readInternalEvents(){return this.paginatedGet("/worker/internal-events",{},"internal_events")}async readSubagentInternalEvents(){return this.paginatedGet("/worker/internal-events",{subagents:"true"},"subagent_events")}async paginatedGet(A,Q,B){let I=this.getAuthHeaders();if(Object.keys(I).length===0)return null;let E=[],C;do{let Y=new URL(`${this.sessionBaseUrl}${A}`);for(let[G,U]of Object.entries(Q))Y.searchParams.set(G,U);if(C)Y.searchParams.set("cursor",C);let J=await this.getWithRetry(Y.toString(),I,B);if(!J)return null;E.push(...J.data??[]),C=J.next_cursor}while(C);return z(`CCRClient: Read ${E.length} internal events from ${A}${Q.subagents?" (subagents)":""}`),E}async getWithRetry(A,Q,B){for(let I=1;I<=10;I++){let E;try{if(E=await fetch(A,{headers:{...Q,"anthropic-version":"2023-06-01","User-Agent":bC()},signal:AbortSignal.timeout(30000),...xR({url:A})}),E.ok)return await E.json()}catch(C){if(z(`CCRClient: GET ${A} failed (attempt ${I}/10): ${UA(C)}`,{level:"warn"}),I<10){let Y=Math.min(500*2**(I-1),30000)+Math.random()*500;await kB(Y)}continue}if(E.body?.cancel(),E.status===409)this.handleEpochMismatch();if(z(`CCRClient: GET ${A} returned ${E.status} (attempt ${I}/10)`,{level:"warn"}),I<10){let C=Math.min(500*2**(I-1),30000)+Math.random()*500;await kB(C)}}return z("CCRClient: GET retries exhausted",{level:"error"}),a("error","cli_worker_get_retries_exhausted",{context:B}),null}reportDelivery(A,Q){if(Q==="processing"){if(this.closed)return;if(this.pendingProcessingAcks.push(A)===1)queueMicrotask(()=>{let B=this.pendingProcessingAcks;if(this.pendingProcessingAcks=[],this.closed||B.length===0)return;this.request("post","/worker/events/delivery",{worker_epoch:this.workerEpoch,updates:B.map((I)=>({event_id:I,status:"processing"}))},"processing ack")});return}this.deliveryUploader.enqueue({eventId:A,status:Q})}getWorkerEpoch(){return this.workerEpoch}get internalEventsPending(){return this.internalEventUploader.pendingCount}close(){if(this.closed=!0,this.stopHeartbeat(),qW(),this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[],this.pendingProcessingAcks=[],this.streamTextAccumulator.byMessage.clear(),this.streamTextAccumulator.scopeToMessage.clear(),this.workerState.close(),this.eventUploader.close(),this.internalEventUploader.close(),this.deliveryUploader.close()}}function WcA(A){let Q=A.post_turn_summary;if(!NcA(Q)||Q.status_category!=="blocked")return A;return{...A,post_turn_summary:{...Q,status_category:"need_input"}}}function NcA(A){return A!==null&&typeof A==="object"&&"status_category"in A&&typeof A.status_category==="string"}eA();oE();gQ();IQ();var XcA=1000,DcA=30000,xCA=45000,VcA=new Set([401,403,404]),xW=10,wcA=500,McA=8000,KcA={stream:!0};function zcA(){return!0}function ZcA(A){let Q=[],B=0,I;while((I=A.indexOf(`
|
|
180
|
+
`;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>vEA){z(`WebSocketTransport: ${Math.round(B/1000)}s tick gap detected — process was suspended, forcing reconnect`),a("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"}),a("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(I){z(`WebSocketTransport: Ping failed: ${I}`,{level:"error"}),a("error","cli_websocket_ping_failed")}}},fmA)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),aA(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(TmA),this.lastActivityTime=Date.now(),z("WebSocketTransport: Sent periodic keep_alive data frame")}catch(A){z(`WebSocketTransport: Periodic keep_alive failed: ${A}`,{level:"error"}),a("error","cli_websocket_keepalive_failed")}},hmA)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var umA=100,cmA=15000,pmA=3000;class vR extends gR{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=lmA(A),this.uploader=new bJ({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:C,onBatchDropped:(J,G)=>{a("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}`),a("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(),umA);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,pmA)})]).finally(()=>{clearTimeout(Q),A.close()}),super.close()}async postOnce(A){let Q=z9();if(!Q){z("HybridTransport: No session token available for POST"),a("warn","cli_hybrid_post_no_token");return}let B={Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},I;try{I=await WB.post(this.postUrl,{events:A},{headers:B,validateStatus:()=>!0,timeout:cmA})}catch(E){throw z(`HybridTransport: POST error: ${UA(E)}`),a("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`),a("warn","cli_hybrid_post_client_error",{status:I.status});return}throw z(`HybridTransport: POST returned ${I.status} (retryable)`),a("warn","cli_hybrid_post_retryable_error",{status:I.status}),Error(`POST failed with ${I.status}`)}}function lmA(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}`}p0();GB();function _EA(){let{namespace:A,cluster:Q}=zO();return{...A&&{cooNamespace:A},...Q&&{cooCluster:Q}}}PG();import{chmod as J7Q,mkdir as G7Q,readdir as U7Q,readFile as omA,unlink as F7Q,writeFile as amA}from"fs/promises";import{join as TEA}from"path";uI();p0();PG();eA();GB();gQ();sX();IQ();import{AsyncLocalStorage as imA}from"async_hooks";var d3Q=new imA;GB();var x7Q=k(()=>XC.object({pid:XC.number(),sessionId:XC.string(),cwd:XC.string().optional(),startedAt:XC.number(),version:XC.string().optional(),kind:XC.enum(["interactive","bg","daemon","daemon-worker"])}));function rmA(){return TEA(FE(),"sessions")}var PEA=Promise.resolve();async function tmA(A){let Q=TEA(rmA(),`${process.pid}.json`),B=PEA.then(async()=>{try{let I=mQ(await omA(Q,"utf8"));await amA(Q,LA({...I,...A}))}catch(I){z(`[concurrentSessions] updatePidFile failed: ${UA(I)}`)}});PEA=B,await B}async function kEA(A){await tmA({bridgeSessionId:A})}eA();oE();GB();gQ();function XB(A,Q){return Object.freeze({name:A,header:Q})}var smA=XB("claude_code","claude-code-20250219"),emA=XB("oauth_auth",vP),AuA=XB("interleaved_thinking","interleaved-thinking-2025-05-14"),QuA=XB("long_context","context-1m-2025-08-07"),BuA=XB("context_management","context-management-2025-06-27"),IuA=XB("structured_outputs","structured-outputs-2025-12-15"),EuA=XB("web_search","web-search-2025-03-05"),CuA=XB("tool_search","advanced-tool-use-2025-11-20"),YuA=XB("tool_search","tool-search-tool-2025-10-19"),JuA=XB("effort","effort-2025-11-24"),GuA=XB("task_budgets","task-budgets-2026-03-13"),UuA=XB("prompt_caching_scope","prompt-caching-scope-2026-01-05"),FuA=XB("extended_cache_ttl","extended-cache-ttl-2025-04-11"),$uA=XB("speed","fast-mode-2026-02-01"),WuA=XB("redact_thinking","redact-thinking-2026-02-12"),NuA=null,XuA=null,DuA=null,VuA=XB("advisor_tool","advisor-tool-2026-03-01"),wuA=XB("cache_diagnosis","cache-diagnosis-2026-04-07"),MuA=XB("context_hint","context-hint-2026-04-09"),KuA=XB("mcp_servers","mcp-servers-2025-12-04"),zuA=XB("files_api","files-api-2025-04-14"),_R=XB("environments","environments-2025-11-01"),ZuA=XB("ccr_byoc","ccr-byoc-2025-07-29"),HuA=null,LuA=Object.freeze([smA,emA,AuA,QuA,BuA,IuA,EuA,CuA,YuA,JuA,GuA,UuA,FuA,$uA,WuA,NuA,XuA,DuA,VuA,wuA,MuA,KuA,zuA,_R,ZuA,HuA].filter((A)=>A!==null)),v7Q=new Map(LuA.map((A)=>[A.header,A]));aC();yR();function bC(){return"claude-code/0.3.148"}import{randomUUID as duA}from"crypto";function GCA(A,Q,B,I){if(!I)return{url:`${A}/v1/sessions/${Q}/events`,body:{events:B}};let E=RW(Q);return{url:`${A}/v1/code/sessions/${encodeURIComponent(E)}/events`,body:{events:B.map((C)=>({payload:typeof C.uuid==="string"&&C.uuid?C:{...C,uuid:duA()}}))}}}p0();eA();gQ();IQ();var UCA=2000,nuA=["session_ingress_token","environment_secret","access_token","secret","token"],ouA=new RegExp(`"(${nuA.join("|")})"\\s*:\\s*"([^"]*)"`,"g"),auA=16;function ruA(A){return A.replace(ouA,(Q,B,I)=>{if(I.length<auA)return`"${B}":"[REDACTED]"`;let E=`${I.slice(0,8)}...${I.slice(-4)}`;return`"${B}":"${E}"`})}function t1(A){let Q=typeof A==="string"?A:LA(A),B=ruA(Q);if(B.length<=UCA)return B;return B.slice(0,UCA)+`... (${B.length} chars)`}function FCA(A){let Q=UA(A);if(A&&typeof A==="object"&&"response"in A){let B=A.response;if(B?.data&&typeof B.data==="object"){let I=B.data,E=typeof I.message==="string"?I.message:typeof I.error==="object"&&I.error&&("message"in I.error)&&typeof I.error.message==="string"?I.error.message:void 0;if(E)return`${Q}: ${E}`}}return Q}function $CA(A){if(A&&typeof A==="object"&&"response"in A&&A.response&&typeof A.response.status==="number")return A.response.status;return}function mR(A,Q=Date.now()){if(!A)return;let B=Number(A);if(Number.isFinite(B)&&B>=0)return B*1000;let I=Date.parse(A);if(Number.isFinite(I)){let E=I-Q;return E>0?E:void 0}return}function WCA(A){if(!A||typeof A!=="object")return;if("retryAfterMs"in A&&typeof A.retryAfterMs==="number")return A.retryAfterMs;if("response"in A){let B=A.response?.headers?.["retry-after"];if(typeof B==="string")return mR(B)}return}function YG(A){if(!A||typeof A!=="object")return;if("message"in A&&typeof A.message==="string")return A.message;if("error"in A&&A.error!==null&&typeof A.error==="object"&&"message"in A.error&&typeof A.error.message==="string")return A.error.message;return}function NCA(A,Q,B){if(Q)z(Q);rA("tengu_bridge_repl_skipped",{reason:A,...B!==void 0&&{v2:B}})}var HD="Remote Control is only available with claude.ai subscriptions. Please use `/login` to sign in with your claude.ai account.";var tuA=/^[a-zA-Z0-9_-]+$/;function TI(A,Q){if(!A||!tuA.test(A))throw Error(`Invalid ${Q}: contains unsafe characters`);return A}class YE extends Error{status;errorType;constructor(A,Q,B){super(A);this.name="BridgeFatalError",this.status=Q,this.errorType=B}}function DCA(A){function Q(J){A.onDebug?.(J)}let B=0,I=100;async function E(J){let G={Authorization:`Bearer ${J}`,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-beta":_R.header,"x-environment-runner-version":A.runnerVersion,"User-Agent":bC()},U=await A.getTrustedDeviceToken?.();if(U)G["X-Trusted-Device-Token"]=U;return G}function C(){let J=A.getAccessToken();if(!J)throw Error(HD);return J}async function Y(J,G){let U=C(),F=await J(U);if(F.status!==401)return F;if(!A.onAuth401)return Q(`[bridge:api] ${G}: 401 received, no refresh handler`),F;if(Q(`[bridge:api] ${G}: 401 received, attempting token refresh`),await A.onAuth401(U)){Q(`[bridge:api] ${G}: Token refreshed, retrying request`);let W=C(),X=await J(W);if(X.status!==401)return X;Q(`[bridge:api] ${G}: Retry after refresh also got 401`)}else Q(`[bridge:api] ${G}: Token refresh failed`);return F}return{async registerBridgeEnvironment(J){return pI("bridge_environment_register",async()=>{Q(`[bridge:api] POST /v1/environments/bridge bridgeId=${J.bridgeId}`);let G=await Y(async(U)=>WB.post(`${A.baseUrl}/v1/environments/bridge`,{machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:J.gitRepoUrl,max_sessions:J.maxSessions,metadata:{worker_type:J.workerType},...J.reuseEnvironmentId&&{environment_id:J.reuseEnvironmentId}},{headers:await E(U),timeout:15000,validateStatus:(F)=>F<500}),"Registration");return v0(G.status,G.data,"Registration"),Q(`[bridge:api] POST /v1/environments/bridge -> ${G.status} environment_id=${G.data.environment_id}`),Q(`[bridge:api] >>> ${t1({machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:YCA(J.gitRepoUrl),max_sessions:J.maxSessions,metadata:{worker_type:J.workerType}})}`),Q(`[bridge:api] <<< ${t1(G.data)}`),G.data},XCA)},async pollForWork(J,G,U,F){TI(J,"environmentId");let N=B;B=0;let W=await WB.get(`${A.baseUrl}/v1/environments/${J}/work/poll`,{headers:await E(G),params:F!==void 0?{reclaim_older_than_ms:F}:void 0,timeout:1e4,signal:U,validateStatus:(X)=>X<500});if(v0(W.status,W.data,"Poll",W.headers),!W.data){if(B=N+1,B===1||B%I===0)Q(`[bridge:api] GET .../work/poll -> ${W.status} (no work, ${B} consecutive empty polls)`);return null}return Q(`[bridge:api] GET .../work/poll -> ${W.status} workId=${W.data.id} type=${W.data.data?.type}${W.data.data?.id?` sessionId=${W.data.data.id}`:""}`),Q(`[bridge:api] <<< ${t1(W.data)}`),W.data},async acknowledgeWork(J,G,U){TI(J,"environmentId"),TI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/ack`);let F=await WB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/ack`,{},{headers:await E(U),timeout:1e4,validateStatus:(N)=>N<500});v0(F.status,F.data,"Acknowledge"),Q(`[bridge:api] POST .../work/${G}/ack -> ${F.status}`)},async stopWork(J,G,U){TI(J,"environmentId"),TI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/stop force=${U}`);let F=await Y(async(N)=>WB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/stop`,{force:U},{headers:await E(N),timeout:1e4,validateStatus:(W)=>W<500}),"StopWork");v0(F.status,F.data,"StopWork"),Q(`[bridge:api] POST .../work/${G}/stop -> ${F.status}`)},async deregisterEnvironment(J){TI(J,"environmentId"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J}`);let G=await Y(async(U)=>WB.delete(`${A.baseUrl}/v1/environments/bridge/${J}`,{headers:await E(U),timeout:1e4,validateStatus:(F)=>F<500}),"Deregister");v0(G.status,G.data,"Deregister"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J} -> ${G.status}`)},async archiveSession(J){TI(J,"sessionId"),Q(`[bridge:api] POST /v1/sessions/${J}/archive`);let G=await Y(async(U)=>WB.post(`${A.baseUrl}/v1/sessions/${J}/archive`,{},{headers:await E(U),timeout:1e4,validateStatus:(F)=>F<500}),"ArchiveSession");if(G.status===409){Q(`[bridge:api] POST /v1/sessions/${J}/archive -> 409 (already archived)`);return}v0(G.status,G.data,"ArchiveSession"),Q(`[bridge:api] POST /v1/sessions/${J}/archive -> ${G.status}`)},async reconnectSession(J,G){return pI("bridge_session_reconnect",async()=>{TI(J,"environmentId"),TI(G,"sessionId"),Q(`[bridge:api] POST /v1/environments/${J}/bridge/reconnect session_id=${G}`);let U=await Y(async(F)=>WB.post(`${A.baseUrl}/v1/environments/${J}/bridge/reconnect`,{session_id:G},{headers:await E(F),timeout:1e4,validateStatus:(N)=>N<500}),"ReconnectSession");v0(U.status,U.data,"ReconnectSession"),Q(`[bridge:api] POST .../bridge/reconnect -> ${U.status}`)},XCA)},async heartbeatWork(J,G,U){TI(J,"environmentId"),TI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/heartbeat`);let F=await WB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/heartbeat`,{},{headers:await E(U),timeout:1e4,validateStatus:(N)=>N<500});return v0(F.status,F.data,"Heartbeat"),Q(`[bridge:api] POST .../work/${G}/heartbeat -> ${F.status} lease_extended=${F.data.lease_extended} state=${F.data.state}`),F.data},async sendPermissionResponseEvent(J,G,U){TI(J,"sessionId");let{url:F,body:N}=GCA(A.baseUrl,J,[G],A.useCcrV2Routing?.()??!1);Q(`[bridge:api] POST ${F} type=${G.type}`);let W=await WB.post(F,N,{headers:await E(U),timeout:1e4,validateStatus:(X)=>X<500});v0(W.status,W.data,"SendPermissionResponseEvent"),Q(`[bridge:api] POST ${F} -> ${W.status}`),Q(`[bridge:api] >>> ${t1(N)}`),Q(`[bridge:api] <<< ${t1(W.data)}`)}}}function v0(A,Q,B,I){if(A===200||A===204)return;let E=YG(Q),C=suA(Q);switch(A){case 401:throw new YE(`${B}: Authentication failed (401)${E?`: ${E}`:""}. ${HD}`,401,C);case 403:throw new YE(LD(C)?"Remote Control session expired.":`${B}: Access denied (403)${E?`: ${E}`:""}. Check your organization permissions.`,403,C);case 404:throw new YE(E??`${B}: Not found (404). Remote Control may not be available for this organization.`,404,C);case 410:throw new YE(E??"Remote Control session expired.",410,C??"environment_expired");case 429:{let Y=mR(typeof I?.["retry-after"]==="string"?I["retry-after"]:void 0);throw Object.assign(Error(`${B}: Rate limited (429). Polling too frequently.`),Y!==void 0?{status:A,retryAfterMs:Y}:{status:A})}default:throw Object.assign(Error(`${B}: Failed with status ${A}${E?`: ${E}`:""}`),{status:A})}}function LD(A){if(!A)return!1;return A.includes("expired")||A.includes("lifetime")}function VCA(A){if(A.status!==403)return!1;return A.message.includes("external_poll_sessions")||A.message.includes("environments:manage")}function XCA(A){if(A instanceof YE)return A.status===401?"auth_failed":"http_error";if(A instanceof Error){if(A.message===HD)return"no_token";if("status"in A&&typeof A.status==="number")return"http_error"}return"request_failed"}function suA(A){if(A&&typeof A==="object"){if("error"in A&&A.error&&typeof A.error==="object"&&"type"in A.error&&typeof A.error.type==="string")return A.error.type}return}eA();import{randomUUID as euA}from"crypto";aC();p0();var wCA={input_tokens:0,cache_creation_input_tokens:0,cache_read_input_tokens:0,output_tokens:0,server_tool_use:{web_search_requests:0,web_fetch_requests:0},service_tier:"standard",cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},inference_geo:"",iterations:[],speed:"standard"};function MCA(A){if(A===null||typeof A!=="object")return A;let Q=A;if("requestId"in Q&&!("request_id"in Q))Q.request_id=Q.requestId,delete Q.requestId;if("response"in Q&&Q.response!==null&&typeof Q.response==="object"){let B=Q.response;if("requestId"in B&&!("request_id"in B))B.request_id=B.requestId,delete B.requestId}return A}eA();dZ();gQ();IQ();function AcA(A){return A!==null&&typeof A==="object"&&"type"in A&&typeof A.type==="string"}function QcA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_response"&&"response"in A}function BcA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_request"&&"request_id"in A&&"request"in A}function uR(A){if((A.type==="user"||A.type==="assistant")&&A.isVirtual)return!1;return A.type==="user"||A.type==="assistant"||A.type==="system"&&A.subtype==="local_command"}function KCA(A){if(A.type!=="user"||A.isMeta||A.toolUseResult||A.isCompactSummary)return;if(A.origin&&A.origin.kind!=="human")return;let Q=A.message.content,B;if(typeof Q==="string")B=Q;else for(let E of Q)if(E.type==="text"){B=E.text;break}if(!B)return;return iZ(B)||void 0}function zCA(A,Q,B,I,E,C){try{let Y=MCA(mQ(A));if(QcA(Y)){z("[bridge:repl] Ingress message type=control_response"),E?.(Y);return}if(BcA(Y)){z(`[bridge:repl] Inbound control_request subtype=${Y.request.subtype}`),C?.(Y);return}if(!AcA(Y))return;let J="uuid"in Y&&typeof Y.uuid==="string"?Y.uuid:void 0;if(J&&Q.has(J)){z(`[bridge:repl] Ignoring echo: type=${Y.type} uuid=${J}`);return}if(J&&B.has(J)){z(`[bridge:repl] Ignoring re-delivered inbound: type=${Y.type} uuid=${J}`);return}if(z(`[bridge:repl] Ingress message type=${Y.type}${J?` uuid=${J}`:""}`),Y.type==="user"){if(J)B.add(J);rA("tengu_bridge_message_received",{is_repl:!0}),cI("bridge_message_receive"),I?.(Y)}else z(`[bridge:repl] Ignoring non-user inbound message: type=${Y.type}`)}catch(Y){z(`[bridge:repl] Failed to parse ingress message: ${UA(Y)}`),sB("bridge_message_receive","bridge_message_receive_parse_failed")}}var IcA="This session is outbound-only. Enable Remote Control locally to allow inbound control.";function ZCA(A,Q){let{transport:B,sessionId:I,outboundOnly:E,onInterrupt:C,onSetModel:Y,onSetMaxThinkingTokens:J,onSetPermissionMode:G,onRenameSession:U,onSetColor:F,onFileSuggestions:N,onReadFile:W,onGetContextUsage:X,onMcpAuthenticate:D,onMcpOauthCallbackUrl:w,onMcpReconnect:V,onMcpStatus:M}=Q;if(!B){z("[bridge:repl] Cannot respond to control_request: transport not configured");return}let j;if(E&&A.request.subtype!=="initialize"){j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:IcA}};let Z={...j,session_id:I};B.write(Z),z(`[bridge:repl] Rejected ${A.request.subtype} (outbound-only) request_id=${A.request_id}`);return}switch(A.request.subtype){case"initialize":j={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{commands:[],output_style:"normal",available_output_styles:["normal"],models:[],account:{},pid:process.pid}}};break;case"set_model":Y?.(A.request.model),j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_max_thinking_tokens":J?.(A.request.max_thinking_tokens),j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_permission_mode":{let Z=G?.(A.request.mode)??{ok:!1,error:"set_permission_mode is not supported in this context (onSetPermissionMode callback not registered)"};if(Z.ok)j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:Z.error}};break}case"rename_session":{let Z=U?.(A.request.title)??{ok:!1,error:"rename_session is not supported in this context (onRenameSession callback not registered)"};if(Z.ok)j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:Z.error}};break}case"set_color":{let Z=F?.(A.request.color)??{ok:!1,error:"set_color is not supported in this context (onSetColor callback not registered)"};if(Z.ok)j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:Z.error}};break}case"file_suggestions":{if(!N){j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"file_suggestions is not supported in this context (onFileSuggestions callback not registered)"}};break}N(A.request.query).then((Z)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{suggestions:Z}}})).catch((Z)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:UA(Z)}})).then((Z)=>{let g={...Z,session_id:I};B.write(g),z(`[bridge:repl] Sent control_response for file_suggestions request_id=${A.request_id} result=${Z.response.subtype}`)});return}case"read_file":{if(!W){j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"read_file is not supported in this context (onReadFile callback not registered)"}};break}W(A.request.path,A.request.max_bytes,A.request.encoding).then((Z)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:Z}})).catch((Z)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:UA(Z)}})).then((Z)=>{let g={...Z,session_id:I};B.write(g),z(`[bridge:repl] Sent control_response for read_file request_id=${A.request_id} result=${Z.response.subtype}`)});return}case"get_context_usage":{if(!X){j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"get_context_usage is not supported in this context (onGetContextUsage callback not registered)"}};break}X().then((Z)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{...Z}}})).catch((Z)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:UA(Z)}})).then((Z)=>{let g={...Z,session_id:I};B.write(g),z(`[bridge:repl] Sent control_response for get_context_usage request_id=${A.request_id} result=${Z.response.subtype}`)});return}case"mcp_status":j={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{mcpServers:M?.()??[]}}};break;case"mcp_authenticate":case"mcp_oauth_callback_url":case"mcp_reconnect":{let Z=A.request,{subtype:g,serverName:T}=Z,S=Z.subtype==="mcp_authenticate"?D&&((d)=>D(d,Z.redirectUri)):Z.subtype==="mcp_oauth_callback_url"?w&&((d)=>w(d,Z.callbackUrl)):V;if(!S){j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`${g} is not supported in this context (callback not registered)`}};break}S(T).then((d)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:d??{}}})).catch((d)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:UA(d)}})).then((d)=>{let r={...d,session_id:I};B.write(r),z(`[bridge:repl] Sent control_response for ${g} request_id=${A.request_id} result=${d.response.subtype}`)});return}case"interrupt":C?.(),j={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;default:j={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`REPL bridge does not handle control_request subtype: ${A.request.subtype}`}}}let L={...j,session_id:I};B.write(L),z(`[bridge:repl] Sent control_response for ${A.request.subtype} request_id=${A.request_id} result=${j.response.subtype}`)}function cR(A){return{type:"result",subtype:"success",duration_ms:0,duration_api_ms:0,is_error:!1,num_turns:0,result:"",stop_reason:null,total_cost_usd:0,usage:{...wCA},modelUsage:{},permission_denials:[],session_id:A,uuid:euA()}}class qD{capacity;ring;set=new Set;writeIdx=0;constructor(A){this.capacity=A,this.ring=Array(A)}add(A){if(this.set.has(A))return;let Q=this.ring[this.writeIdx];if(Q!==void 0)this.set.delete(Q);this.ring[this.writeIdx]=A,this.set.add(A),this.writeIdx=(this.writeIdx+1)%this.capacity}has(A){return this.set.has(A)}clear(){this.set.clear(),this.ring.fill(void 0),this.writeIdx=0}}function HCA(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 pR{_active=!1;_pending=[];get active(){return this._active}get pendingCount(){return this._pending.length}start(){this._active=!0}end(){return this._active=!1,this._pending.splice(0)}enqueue(...A){if(!this._active)return!1;return this._pending.push(...A),!0}drop(){this._active=!1;let A=this._pending.length;return this._pending.length=0,A}deactivate(){this._active=!1}}import{randomUUID as jCA}from"crypto";p0();eA();oE();gQ();IQ();function EcA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return mQ(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function LCA(A){let Q=EcA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}eA();oE();gQ();IQ();class lR{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?qCA(this.pending,A):A,this.drain()}close(){this.closed=!0,this.pending=null}async flush(){while(!this.closed)if(this.inflight)await this.inflight;else if(this.pending)await this.drain();else return}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 kB(this.retryDelay(B)),this.pending&&!this.closed)Q=qCA(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 qCA(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 CcA=20000,YcA=100;function RCA(A){let Q=SB(A);if(Q)return Q;if(A&&typeof A==="object"&&"name"in A&&typeof A.name==="string")return A.name;return}class jD extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var JcA=10,GcA=3;function UcA(){return{byMessage:new Map,scopeToMessage:new Map}}function RD(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function FcA(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(RD(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(RD(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(RD(E)),Y=C?Q.byMessage.get(C):void 0;if(!Y){B.push(E);break}let J=Y[E.event.index]??=[];if(J.push(E.event.delta.text),I.has(J))break;let G={type:"stream_event",uuid:E.uuid,session_id:E.session_id,parent_tool_use_id:E.parent_tool_use_id,event:{type:"content_block_delta",index:E.event.index,delta:{type:"text_delta",text:""}}};I.set(J,G),B.push(G);break}default:B.push(E)}for(let[E,C]of I)C.event.delta.text=E.join("");return B}function $cA(A,Q){A.byMessage.delete(Q.message.id);let B=RD(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class iR{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;consecutiveNotFound=0;currentState=null;sessionBaseUrl;sessionId;streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=UcA();workerState;eventUploader;internalEventUploader;deliveryUploader;pendingProcessingAcks=[];onEpochMismatch;getAuthHeaders;onDiagnostic;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??CcA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??P6,this.onDiagnostic=B?.onDiagnostic,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 lR({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 bJ({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 sU("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new bJ({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 sU("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new bJ({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 sU("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 jD("no_auth_headers");if(A===void 0){let G=process.env.CLAUDE_CODE_WORKER_EPOCH;A=G?parseInt(G,10):NaN}if(isNaN(A))throw new jD("missing_epoch");this.workerEpoch=A;let B=this.getWorkerState(),I={ok:!1},E=new Set,C=3;for(let G=1;G<=C;G++){if(I=await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)"),I.ok||this.closed)break;if(I.reason)E.add(I.reason);if(this.onDiagnostic?.(`PUT /worker failed (${I.reason??"unknown"}) attempt=${G}/${C}, ${Math.round((Date.now()-Q)/1000)}s elapsed`),G<C){let U=Math.min(500*2**(G-1),30000)+Math.random()*500;await kB(U)}}if(!I.ok){if(!this.closed)a("error","cli_worker_init_put_retries_exhausted"),this.onDiagnostic?.(`PUT /worker retries exhausted: ${C} attempts over ${Math.round((Date.now()-Q)/1000)}s, errors=[${[...E].join(",")||"unknown"}]`);throw new jD("worker_register_failed")}this.currentState="idle",this.startHeartbeat(),VD(()=>{this.writeEvent({type:"keep_alive"})}),z(`CCRClient: initialized, epoch=${this.workerEpoch}`),a("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:Y,durationMs:J}=await B;if(!this.closed)a("info","cli_worker_state_restored",{duration_ms:J,had_state:Y.external!==null||Y.internal!==null});return Y}async getWorkerState(){let A=Date.now(),Q=this.getAuthHeaders();if(Object.keys(Q).length===0)return{metadata:{external:null,internal:null},durationMs:0};let B=await this.getWithRetry(`${this.sessionBaseUrl}/worker`,Q,"worker_state");return{metadata:{external:B?.worker?.external_metadata??null,internal:B?.worker?.internal_metadata??null},durationMs:Date.now()-A}}async request(A,Q,B,I,{timeout:E=1e4}={}){let C=this.getAuthHeaders();if(Object.keys(C).length===0)return{ok:!1,reason:"no_auth_headers"};let Y=`${this.sessionBaseUrl}${Q}`;try{let J=await fetch(Y,{method:A.toUpperCase(),headers:{...C,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":bC()},body:LA(B),signal:AbortSignal.timeout(E),...xR({url:Y})});if(J.body?.cancel(),J.ok)return this.consecutiveAuthFailures=0,this.consecutiveNotFound=0,{ok:!0};if(J.status===409)this.handleEpochMismatch();if(J.status===404){if(this.consecutiveNotFound++,this.consecutiveNotFound>=GcA)z(`CCRClient: ${this.consecutiveNotFound} consecutive 404s — session gone, exiting`,{level:"error"}),a("error","cli_worker_session_not_found"),this.onDiagnostic?.(`${this.consecutiveNotFound} consecutive 404s on ${Q} — session gone, exiting`),this.onEpochMismatch()}if(J.status===401||J.status===403){let G=z9(),U=G?LCA(G):null;if(U!==null&&U*1000<Date.now())z(`CCRClient: session_token expired (exp=${new Date(U*1000).toISOString()}) — no refresh was delivered, exiting`,{level:"error"}),a("error","cli_worker_token_expired_no_refresh"),this.onDiagnostic?.(`session_token expired (exp=${new Date(U*1000).toISOString()}) — no refresh delivered, exiting`),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=JcA)z(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),a("error","cli_worker_auth_failures_exhausted"),this.onDiagnostic?.(`${this.consecutiveAuthFailures} consecutive auth failures (HTTP ${J.status}) with valid-looking token — exiting`),this.onEpochMismatch()}if(z(`CCRClient: ${I} returned ${J.status}`,{level:"warn"}),a("warn","cli_worker_request_failed",{method:A,path:Q,status:J.status}),J.status===429){let G=J.headers.get("retry-after"),U=G?parseInt(G,10):NaN;if(!isNaN(U)&&U>=0)return{ok:!1,retryAfterMs:U*1000,reason:`http_${J.status}`}}return{ok:!1,reason:`http_${J.status}`}}catch(J){return z(`CCRClient: ${I} failed: ${UA(J)}`,{level:"warn"}),a("warn","cli_worker_request_error",{method:A,path:Q,error_code:RCA(J)}),{ok:!1,reason:`fetch_failed:${RCA(J)}`}}}reportState(A,Q){if(A===this.currentState&&!Q)return;this.currentState=A,this.workerState.enqueue({worker_status:A,requires_action_details:Q?{tool_name:Q.tool_name,display_tool_name:Q.display_tool_name,action_description:Q.action_description,raw_command:Q.raw_command,request_id:Q.request_id,tool_use_id:Q.tool_use_id}:null})}reportMetadata(A){this.workerState.enqueue({external_metadata:WcA(A)})}reportInternalMetadata(A){this.workerState.enqueue({internal_metadata:A})}handleEpochMismatch(){z("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),a("error","cli_worker_epoch_mismatch"),this.onDiagnostic?.(`worker epoch mismatch (409), epoch=${this.workerEpoch} — superseded by a newer worker, exiting`),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(),YcA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")$cA(this.streamTextAccumulator,A);await this.eventUploader.enqueue(this.toClientEvent(A))}toClientEvent(A){let Q=A,B=Q.historical===!0;return{payload:{...Q,uuid:typeof Q.uuid==="string"?Q.uuid:jCA()},...B&&{historical:!0}}}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=FcA(A,this.streamTextAccumulator);await this.eventUploader.enqueue(Q.map((B)=>({payload:B,ephemeral:!0})))}async writeInternalEvent(A,Q,{isCompaction:B=!1,agentId:I,preservedEventIds:E}={}){let C={payload:{type:A,...Q,uuid:typeof Q.uuid==="string"?Q.uuid:jCA()},...B&&{is_compaction:!0},...I&&{agent_id:I},...E?.length&&{preserved_event_ids:E}};await this.internalEventUploader.enqueue(C)}flushInternalEvents(){return this.internalEventUploader.flush()}flushDeliveryAcks(){return this.deliveryUploader.flush()}async flush(){return await this.flushStreamEventBuffer(),this.eventUploader.flush()}async flushWorkerState(){return this.workerState.flush()}async readInternalEvents(){return this.paginatedGet("/worker/internal-events",{},"internal_events")}async readSubagentInternalEvents(){return this.paginatedGet("/worker/internal-events",{subagents:"true"},"subagent_events")}async paginatedGet(A,Q,B){let I=this.getAuthHeaders();if(Object.keys(I).length===0)return null;let E=[],C;do{let Y=new URL(`${this.sessionBaseUrl}${A}`);for(let[G,U]of Object.entries(Q))Y.searchParams.set(G,U);if(C)Y.searchParams.set("cursor",C);let J=await this.getWithRetry(Y.toString(),I,B);if(!J)return null;E.push(...J.data??[]),C=J.next_cursor}while(C);return z(`CCRClient: Read ${E.length} internal events from ${A}${Q.subagents?" (subagents)":""}`),E}async getWithRetry(A,Q,B){for(let I=1;I<=10;I++){let E;try{if(E=await fetch(A,{headers:{...Q,"anthropic-version":"2023-06-01","User-Agent":bC()},signal:AbortSignal.timeout(30000),...xR({url:A})}),E.ok)return await E.json()}catch(C){if(z(`CCRClient: GET ${A} failed (attempt ${I}/10): ${UA(C)}`,{level:"warn"}),I<10){let Y=Math.min(500*2**(I-1),30000)+Math.random()*500;await kB(Y)}continue}if(E.body?.cancel(),E.status===409)this.handleEpochMismatch();if(z(`CCRClient: GET ${A} returned ${E.status} (attempt ${I}/10)`,{level:"warn"}),I<10){let C=Math.min(500*2**(I-1),30000)+Math.random()*500;await kB(C)}}return z("CCRClient: GET retries exhausted",{level:"error"}),a("error","cli_worker_get_retries_exhausted",{context:B}),null}reportDelivery(A,Q){if(Q==="processing"){if(this.closed)return;if(this.pendingProcessingAcks.push(A)===1)queueMicrotask(()=>{let B=this.pendingProcessingAcks;if(this.pendingProcessingAcks=[],this.closed||B.length===0)return;this.request("post","/worker/events/delivery",{worker_epoch:this.workerEpoch,updates:B.map((I)=>({event_id:I,status:"processing"}))},"processing ack")});return}this.deliveryUploader.enqueue({eventId:A,status:Q})}getWorkerEpoch(){return this.workerEpoch}get internalEventsPending(){return this.internalEventUploader.pendingCount}close(){if(this.closed=!0,this.stopHeartbeat(),qW(),this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[],this.pendingProcessingAcks=[],this.streamTextAccumulator.byMessage.clear(),this.streamTextAccumulator.scopeToMessage.clear(),this.workerState.close(),this.eventUploader.close(),this.internalEventUploader.close(),this.deliveryUploader.close()}}function WcA(A){let Q=A.post_turn_summary;if(!NcA(Q)||Q.status_category!=="blocked")return A;return{...A,post_turn_summary:{...Q,status_category:"need_input"}}}function NcA(A){return A!==null&&typeof A==="object"&&"status_category"in A&&typeof A.status_category==="string"}eA();oE();gQ();IQ();var XcA=1000,DcA=30000,xCA=45000,VcA=new Set([401,403,404]),xW=10,wcA=500,McA=8000,KcA={stream:!0};function zcA(){return!0}function ZcA(A){let Q=[],B=0,I;while((I=A.indexOf(`
|
|
181
181
|
|
|
182
182
|
`,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(`
|
|
183
183
|
`)){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+`
|
|
@@ -187,4 +187,4 @@ ${E}`;break;case"retry":if(GEA(E))Q[I]=E;break;case"id":if(UEA(E))Q[I]=E;break;c
|
|
|
187
187
|
`);if(I.push(J),!G){E=J.endsWith(`
|
|
188
188
|
`);continue}let{frames:U,remaining:F}=ZcA(I.join(""));I=F?[F]:[],E=F.endsWith(`
|
|
189
189
|
`);for(let N of U){if(this.resetLivenessTimer(),N.id){let W=parseInt(N.id,10);if(!isNaN(W)){if(this.seenSequenceNums.has(W))z(`SSETransport: DUPLICATE frame seq=${W} (lastSequenceNum=${this.lastSequenceNum}, seenCount=${this.seenSequenceNums.size})`,{level:"warn"}),a("warn","cli_sse_duplicate_sequence");else if(this.seenSequenceNums.add(W),this.seenSequenceNums.size>1000){let X=this.lastSequenceNum-200;for(let D of this.seenSequenceNums)if(D<X)this.seenSequenceNums.delete(D)}if(W>this.lastSequenceNum)this.lastSequenceNum=W}}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"}),a("warn","cli_sse_frame_missing_event_field")}}}catch(C){if(this.abortController?.signal.aborted)return;z(`SSETransport: Stream read error: ${UA(C)}`,{level:"error"}),a("error","cli_sse_stream_read_error")}finally{Q.releaseLock()}if(this.state!=="closing"&&this.state!=="closed"){if(z("SSETransport: Stream ended, reconnecting"),this.state==="connected")this.connectErrorsSeen.add("stream_ended"),this.onDiagnostic?.("SSE stream ended by server, reconnecting");this.handleConnectionError()}}handleSSEFrame(A,Q){if(A!=="client_event"){z(`SSETransport: Unexpected SSE event type '${A}' on worker stream`,{level:"warn"}),a("warn","cli_sse_unexpected_event_type",{event_type:A});return}let B;try{B=mQ(Q)}catch(E){z(`SSETransport: Failed to parse client_event data: ${UA(E)}`,{level:"error"});return}let I=B.payload;if(I&&typeof I==="object"&&"type"in I){let E=this.sessionId?` session=${this.sessionId}`:"",C=B.device_attestation_status?` attestation=${B.device_attestation_status}`:"";if(z(`SSETransport: Event seq=${B.sequence_num} event_id=${B.event_id} event_type=${B.event_type} payload_type=${String(I.type)}${C}${E}`),a("info","cli_sse_message_received"),this.eventFilter?.(B))a("warn","cli_sse_event_filtered");else this.onData?.(LA(I)+`
|
|
190
|
-
`)}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(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(XcA*Math.pow(2,this.reconnectAttempts-1),DcA),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)`),a("error","cli_sse_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},I)}onLivenessTimeout=()=>{this.livenessTimer=null,z("SSETransport: Liveness timeout, reconnecting",{level:"error"}),a("error","cli_sse_liveness_timeout"),this.connectErrorsSeen.add("liveness_timeout"),this.onDiagnostic?.(`SSE liveness timeout — no frame in ${xCA/1000}s, reconnecting`),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,xCA)}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"),a("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":bC()};z(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=xW;I++){try{let C=await WB.post(this.postUrl,A,{headers:B,validateStatus:zcA});if(C.status===200||C.status===201){z(`SSETransport: POST success type=${A.type}`);return}if(z(`SSETransport: POST ${C.status} body=${LA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){z(`SSETransport: POST returned ${C.status} (client error), not retrying`),a("warn","cli_sse_post_client_error",{status:C.status});return}z(`SSETransport: POST returned ${C.status}, attempt ${I}/${xW}`),a("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){z(`SSETransport: POST error: ${UA(C)}, attempt ${I}/${xW}`),a("warn","cli_sse_post_network_error",{attempt:I})}if(I===xW){z(`SSETransport: POST failed after ${xW} attempts, continuing`),a("warn","cli_sse_post_retries_exhausted");return}let E=Math.min(wcA*Math.pow(2,I-1),McA);await kB(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}setOnDiagnostic(A){this.onDiagnostic=A}setEventFilter(A){this.eventFilter=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 HcA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}eA();gQ();nI();aC();eA();var OCA="DEVICE_ATTESTATION_STATUS_",gCA=["UNSPECIFIED","ABSENT","VERIFIED","VERIFIED_BY_GATE","INVALID","UNCHECKED"];function LcA(A){if(A===void 0||A===null)return"UNSPECIFIED";if(typeof A==="number")return gCA[A]??"UNSPECIFIED";if(typeof A!=="string")return"UNSPECIFIED";let Q=A.startsWith(OCA)?A.slice(OCA.length):A;if(gCA.includes(Q))return Q;return"UNSPECIFIED"}function qcA(A){return A==="VERIFIED"||A==="VERIFIED_BY_GATE"}var jcA={enforce:!1,acceptStatuses:new Set},RcA=["UNSPECIFIED","ABSENT","VERIFIED","VERIFIED_BY_GATE","INVALID","UNCHECKED"],azQ=k(()=>$.object({accept_statuses:$.array($.enum(RcA)).default([])}));var xcA;function vCA(A){let Q=typeof A.payload?.type==="string"?A.payload.type:A.event_type,B=Q==="user"||Q==="control_response",I=LcA(A.device_attestation_status);if(qcA(I)){if(B)cI("bridge_event_attestation");return!1}let E=xcA?.()??jcA;if(!E.enforce){if(I==="UNSPECIFIED")return!1;if(B)z(`[bridge:attestation] accepting unverified ${Q} event_id=${A.event_id} status=${I}`,{level:"info"}),l0("bridge_event_attestation",`${I.toLowerCase()}_${Q}`);return!1}let C=E.acceptStatuses.has(I);if(B){let Y=`${I.toLowerCase()}_${Q}`;if(z(`[bridge:attestation] ${C?"accepting (config exception)":"DROPPING"} unverified ${Q} event_id=${A.event_id} status=${I}`,{level:C?"info":"warn"}),C)l0("bridge_event_attestation",Y);else sB("bridge_event_attestation",Y)}return!C}IQ();function SCA(A){let Q=Buffer.from(A,"base64url").toString("utf-8"),B=mQ(Q);if(!B||typeof B!=="object"||!("version"in B)||B.version!==1)throw Error(`Unsupported work secret version: ${B&&typeof B==="object"&&"version"in B?B.version:"unknown"}`);let I=B;if(typeof I.session_ingress_token!=="string"||I.session_ingress_token.length===0)throw Error("Invalid work secret: missing or empty session_ingress_token");if(typeof I.api_base_url!=="string")throw Error("Invalid work secret: missing api_base_url");return B}function _CA(A,Q){let B=A.includes("localhost")||A.includes("127.0.0.1"),I=B?"ws":"wss",E=B?"v2":"v1",C=A.replace(/^https?:\/\//,"").replace(/\/+$/,"");return`${I}://${C}/${E}/session_ingress/ws/${Q}`}function nR(A,Q){if(A===Q)return!0;let B=A.slice(A.lastIndexOf("_")+1),I=Q.slice(Q.lastIndexOf("_")+1);return B.length>=4&&B===I}function PCA(A,Q){return`${A.replace(/\/+$/,"")}/v1/code/sessions/${Q}`}async function TCA(A,Q){let B=await WB.post(`${A}/worker/register`,{},{headers:{Authorization:`Bearer ${Q}`,"Content-Type":"application/json","anthropic-version":"2023-06-01"},timeout:1e4}),I=B.data?.worker_epoch,E=typeof I==="string"?Number(I):I;if(typeof E!=="number"||!Number.isFinite(E)||!Number.isSafeInteger(E))throw Error(`registerWorker: invalid worker_epoch in response: ${LA(B.data)}`);return E}function kCA(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 bCA(A){let{sessionUrl:Q,ingressToken:B,sessionId:I,initialSequenceNum:E,getAuthToken:C}=A,Y;if(C)Y=()=>{let w=C();if(!w)return{};return{Authorization:`Bearer ${w}`}};else Z9(B);let J=A.epoch??await TCA(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 dR(G,{},I,void 0,E,Y),F,N=new iR(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(w){z(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${UA(w)}`,{level:"error"})}throw Error("epoch superseded")}});U.setOnEvent((w)=>{N.reportDelivery(w.event_id,"received"),N.reportDelivery(w.event_id,"processed")}),U.setEventFilter(vCA);let W,X=!1,D=!1;return{write(w){return N.writeEvent(w)},async writeBatch(w){for(let V of w){if(D)break;await N.writeEvent(V)}},close(){D=!0,N.close(),U.close()},isConnectedStatus(){return X},getStateLabel(){if(U.isClosedStatus())return"closed";if(U.isConnectedStatus())return X?"connected":"init";return"connecting"},setOnData(w){U.setOnData(w)},setOnClose(w){F=w,U.setOnClose((V)=>{N.close(),w(V??4092)})},setOnConnect(w){W=w},getLastSequenceNum(){return U.getLastSequenceNum()},droppedBatchCount:0,reportState(w,V){N.reportState(w,V)},reportMetadata(w){N.reportMetadata(w)},reportDelivery(w,V){N.reportDelivery(w,V)},flush(){return N.flush()},getInternalEventWriter(){return(w,V,M)=>N.writeInternalEvent(w,V,M)},getInternalEventReaders(){return{readMain:()=>N.readInternalEvents(),readSubagents:()=>N.readSubagentInternalEvents()}},connect(){if(!A.outboundOnly)U.connect();N.initialize(J).then(()=>{X=!0,z(`[bridge:repl] v2 transport ready for writes (epoch=${J}, sse=${U.isConnectedStatus()?"open":"opening"})`),W?.()},(w)=>{z(`[bridge:repl] CCR v2 initialize failed: ${UA(w)}`,{level:"error"}),N.close(),U.close(),F?.(4091)})}}}aC();eA();gQ();var OcA="2023-06-01",gcA="ccr-byoc-2025-07-29";async function yCA({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 WB.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:gD(U,J),signal:I,validateStatus:(X)=>X<500})}catch(X){return z(`[bridge] Session creation request failed: ${UA(X)}`),null}if(N.status!==200&&N.status!==201){let X=YG(N.data);return z(`[bridge] Session creation failed with status ${N.status}${X?`: ${X}`:""}`),null}let W=N.data;if(!W||typeof W!=="object"||!("id"in W)||typeof W.id!=="string")return z("[bridge] No session ID in response"),null;return W.id}async function fCA(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 WB.post(Y,{},{headers:gD(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)z(`[bridge] Session ${A} archived successfully`);else{let G=YG(J.data);z(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){z(`[bridge] Session archive request failed: ${UA(J)}`)}}async function xD(A,Q,B,I,E,C){let Y=A==="subscribe"?"bridge_pr_subscribe":"bridge_pr_unsubscribe",J=C();if(!J)return z(`[bridge] No access token for ${A}-pr`),sB(Y,"no_token"),!1;let G=`${E}/v1/code/github/${A}-pr`,U={session_id:r1(Q),repo:B,pr_number:I},F;try{F=await WB.post(G,U,{headers:gD(J),timeout:1e4,validateStatus:(W)=>W<500})}catch(W){return z(`[bridge] ${A}-pr request failed: ${UA(W)}`),sB(Y,"request_failed"),!1}if(!(F.status>=200&&F.status<300||F.status===409)){let W=YG(F.data);return z(`[bridge] ${A}-pr failed ${F.status}${W?`: ${W}`:""}`),sB(Y,"http_error"),!1}return z(`[bridge] ${A}-pr ${B}#${I} ok`),cI(Y),!0}async function OD(A,Q,B,I,E,C){let Y=A==="subscribe"?"bridge_slack_subscribe":"bridge_slack_unsubscribe",J=C();if(!J)return z(`[bridge] No access token for ${A}-thread`),sB(Y,"no_token"),!1;let G=`${E}/v1/code/slack/${A}-thread`,U={session_id:r1(Q),channel:B,thread_ts:I},F;try{F=await WB.post(G,U,{headers:gD(J),timeout:1e4,validateStatus:(W)=>W<500})}catch(W){return z(`[bridge] ${A}-thread request failed: ${UA(W)}`),sB(Y,"request_failed"),!1}if(!(F.status>=200&&F.status<300||F.status===409)){let W=YG(F.data);return z(`[bridge] ${A}-thread failed ${F.status}${W?`: ${W}`:""}`),sB(Y,"http_error"),!1}return z(`[bridge] ${A}-thread ${B}/${I} ok`),cI(Y),!0}function gD(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":OcA,"anthropic-beta":gcA,"User-Agent":bC()};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}var nCA=2000,lCA=60000,iCA=900000,ucA=300000,dCA=3;function oCA(A){return A*(0.8+Math.random()*0.4)}var ccA=0;async function aCA(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:W,getCurrentTitle:X=()=>Y,toSDKMessages:D=()=>{throw Error("BridgeCoreParams.toSDKMessages not provided. Pass it if you use writeMessages() or initialMessages — daemon callers that only use writeSdkMessages() never hit this path.")},onAuth401:w,getTrustedDeviceToken:V,getPollIntervalConfig:M=()=>s$,initialHistoryCap:j=200,initialMessages:L,previouslyFlushedUUIDs:Z,onInboundMessage:g,onPermissionResponse:T,onInterrupt:S,onSetModel:d,onSetMaxThinkingTokens:r,onSetPermissionMode:wA,onRenameSession:iA,onSetColor:DA,onFileSuggestions:BA,onReadFile:PA,onMcpAuthenticate:ZQ,onMcpOauthCallbackUrl:b,onMcpReconnect:VQ,onMcpStatus:YA,onStateChange:$A,onUserMessage:yQ,onSessionEstablished:HQ,onInitError:AA,perpetual:f,initialSSESequenceNum:WA=0,onTransportPersistenceReady:mA,onTransportPersistenceTeardown:bA}=A,KB=++ccA,{writeBridgePointer:iQ,clearBridgePointer:GQ,readBridgePointer:kI}=await Promise.resolve().then(() => (cCA(),uCA)),JE=f?await kI(Q):null,QQ=JE?.source==="repl"?JE:null;z(`[bridge:repl] initBridgeCore #${KB} starting (initialMessages=${L?.length??0}${QQ?` perpetual prior=env:${QQ.environmentId}`:""})`);let BQ=DCA({baseUrl:J,getAccessToken:F,runnerVersion:"0.3.147",onDebug:z,onAuth401:w,getTrustedDeviceToken:V}),wQ={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:pCA(),workerType:U,environmentId:pCA(),reuseEnvironmentId:QQ?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},QA,gE;try{let m=await BQ.registerBridgeEnvironment(wQ);QA=m.environment_id,gE=m.environment_secret}catch(m){if(NCA("registration_failed",`[bridge:repl] Environment registration failed: ${UA(m)}`),AA?.(`[bridge:repl] Environment registration failed: ${UA(m)}`),QQ&&m instanceof YE&&(m.status===410||m.status!==401&&LD(m.errorType)))await GQ(Q);return $A?.("failed",UA(m)),null}z(`[bridge:repl] Environment registered: ${QA}`),a("info","bridge_repl_env_registered"),rA("tengu_bridge_repl_env_registered",{});async function PY(m,JA){if(QA!==m)return z(`[bridge:repl] Env mismatch (requested ${m}, got ${QA}) — cannot reconnect in place`),!1;let UQ=RW(JA),pA=UQ===JA?[JA]:[JA,UQ];for(let TA of pA)try{return await BQ.reconnectSession(QA,TA),z(`[bridge:repl] Reconnected session ${TA} in place on env ${QA}`),!0}catch(rQ){z(`[bridge:repl] reconnectSession(${TA}) failed: ${UA(rQ)}`)}return z("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let yC=QQ?await PY(QQ.environmentId,QQ.sessionId):!1;if(QQ&&!yC)await GQ(Q);let MA,bI=new Set,YB=new Map,UC=new Set;if(yC&&QQ){if(MA=QQ.sessionId,z(`[bridge:repl] Perpetual session reused: ${MA}`),L&&Z)for(let m of L)Z.add(m.uuid)}else{let m=await N({environmentId:QA,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!m)return z("[bridge:repl] Session creation failed, deregistering environment"),AA?.("[bridge:repl] Session creation failed, deregistering environment"),rA("tengu_bridge_repl_session_failed",{}),await BQ.deregisterEnvironment(QA).catch(()=>{}),$A?.("failed","Session creation failed"),null;MA=m,z(`[bridge:repl] Session created: ${MA}`)}HQ?.(MA),await iQ(Q,{sessionId:MA,environmentId:QA,source:"repl"}),a("info","bridge_repl_session_created"),rA("tengu_bridge_repl_started",{has_initial_messages:!!(L&&L.length>0),inProtectedNamespace:KO(),..._EA()});let S0=new Set;if(L)for(let m of L)S0.add(m.uuid);let GE=new qD(2000);for(let m of S0)GE.add(m);let JG=new qD(2000),xB=new AbortController,NA=null,vE=0,LQ=yC?WA:0,zB=null,fC=null,s1=HCA(xB.signal),SE=s1.wake,OW=s1.signal,UE=new pR,TY=!yQ,mB=3,OB=0,NI=null;async function hC(){if(NI)return NI;NI=e1();try{return await NI}finally{NI=null}}async function e1(){if(OB++,vE++,z(`[bridge:repl] Reconnecting after env lost (attempt ${OB}/${mB})`),OB>mB)return z(`[bridge:repl] Environment reconnect limit reached (${mB}), giving up`),!1;if(NA){let TA=NA.getLastSequenceNum();if(TA>LQ)LQ=TA;bA?.(),NA.close(),NA=null}if(SE(),UE.drop(),zB){let TA=zB;if(await BQ.stopWork(QA,TA,!1).catch(()=>{}),zB!==TA)return z("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),OB=0,!0;zB=null,fC=null}if(xB.signal.aborted)return z("[bridge:repl] Reconnect aborted by teardown"),!1;let m=QA;wQ.reuseEnvironmentId=m;let JA;for(let TA=1;;TA++)try{JA=await BQ.registerBridgeEnvironment(wQ);break}catch(rQ){if(rQ instanceof YE||TA>=dCA||xB.signal.aborted)return wQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Environment re-registration failed (attempt ${TA}): ${UA(rQ)}`),!1;let vW=oCA(nCA*2**(TA-1));if(z(`[bridge:repl] Environment re-registration transient failure (attempt ${TA}/${dCA}), retrying in ${Math.round(vW)}ms: ${UA(rQ)}`),await kB(vW,xB.signal),xB.signal.aborted)return wQ.reuseEnvironmentId=void 0,!1}if(QA=JA.environment_id,gE=JA.environment_secret,wQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Re-registered: requested=${m} got=${QA}`),xB.signal.aborted)return z("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await BQ.deregisterEnvironment(QA).catch(()=>{}),!1;if(NA!==null)return z("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),OB=0,!0;if(await PY(m,MA))return rA("tengu_bridge_repl_reconnected_in_place",{}),OB=0,!0;if(QA!==m)rA("tengu_bridge_repl_env_expired_fresh_session",{});if(await W(MA),xB.signal.aborted)return z("[bridge:repl] Reconnect aborted after archive, cleaning up"),await BQ.deregisterEnvironment(QA).catch(()=>{}),!1;let UQ=X(),pA=await N({environmentId:QA,title:UQ,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!pA)return z("[bridge:repl] Session creation failed during reconnection"),!1;if(xB.signal.aborted)return z("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await W(pA),!1;if(MA=pA,kEA(r1(pA)).catch(()=>{}),HQ?.(MA),LQ=0,JG.clear(),TY=!yQ,z(`[bridge:repl] Re-created session: ${MA}`),await iQ(Q,{sessionId:MA,environmentId:QA,source:"repl"}),Z?.clear(),bI.size>0){z(`[bridge:repl] Replaying ${bI.size} PR subscription(s) against new session`);for(let TA of bI){let rQ=TA.lastIndexOf("#");xD("subscribe",MA,TA.slice(0,rQ),Number(TA.slice(rQ+1)),J,F)}}if(UC.size>0){z(`[bridge:repl] Replaying ${UC.size} Slack thread subscription(s) against new session`);for(let TA of UC){let rQ=TA.indexOf("/");OD("subscribe",MA,TA.slice(0,rQ),TA.slice(rQ+1),J,F)}}return OB=0,!0}function mC(){return F()}function tR(){let m=UE.end();if(m.length===0)return;if(!NA){z(`[bridge:repl] Cannot drain ${m.length} pending message(s): no transport`);return}for(let pA of m)GE.add(pA.uuid);let UQ=D(m).map((pA)=>({...pA,session_id:MA}));z(`[bridge:repl] Drained ${m.length} pending message(s) after flush`),NA.writeBatch(UQ)}let _D=null;function PD(){_D?.()}function sR(m){if(z(`[bridge:repl] Transport permanently closed: code=${m}`),rA("tengu_bridge_repl_ws_closed",{code:m}),NA){let UQ=NA.getLastSequenceNum();if(UQ>LQ)LQ=UQ;bA?.(),NA=null}SE();let JA=UE.drop();if(JA>0)z(`[bridge:repl] Dropping ${JA} pending message(s) on transport close (code=${m})`,{level:"warn"});if(m===1000){$A?.("failed","session ended"),xB.abort(),PD();return}$A?.("reconnecting",`Remote Control connection lost (code ${m})`),z(`[bridge:repl] Transport reconnect budget exhausted (code=${m}), attempting env reconnect`),hC().then((UQ)=>{if(UQ)return;if(xB.signal.aborted)return;z("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),rA("tengu_bridge_repl_reconnect_failed",{close_code:m}),$A?.("failed","reconnection failed"),PD()})}let eR,sCA=null,eCA={api:BQ,getCredentials:()=>({environmentId:QA,environmentSecret:gE}),signal:xB.signal,getPollIntervalConfig:M,onStateChange:$A,getWsState:()=>NA?.getStateLabel()??"null",isAtCapacity:()=>NA!==null,capacitySignal:OW,onFatalError:PD,getHeartbeatInfo:()=>{if(!zB||!fC)return null;return{environmentId:QA,workId:zB,sessionToken:fC}},onHeartbeatFatal:(m)=>{if(z(`[bridge:repl] heartbeatWork fatal (status=${m.status}) — tearing down work item for fast re-dispatch`),NA){let JA=NA.getLastSequenceNum();if(JA>LQ)LQ=JA;bA?.(),NA.close(),NA=null}if(UE.drop(),zB)BQ.stopWork(QA,zB,!1).catch((JA)=>{z(`[bridge:repl] stopWork after heartbeat fatal: ${UA(JA)}`)});zB=null,fC=null,SE(),$A?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await hC())return null;return{environmentId:QA,environmentSecret:gE}},onWorkReceived:(m,JA,UQ,pA)=>{if(NA?.isConnectedStatus())z(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${UQ})`);if(z(`[bridge:repl] Work received: workId=${UQ} workSessionId=${m} currentSessionId=${MA} match=${nR(m,MA)}`),iQ(Q,{sessionId:MA,environmentId:QA,source:"repl"}),!nR(m,MA)){z(`[bridge:repl] Rejecting foreign session: expected=${MA} got=${m}`);return}zB=UQ,fC=JA;let TA=pA||aA(process.env.CLAUDE_BRIDGE_USE_CCR_V2),rQ;if(!TA){if(rQ=mC(),!rQ){z("[bridge:repl] No OAuth token available for session ingress, skipping work");return}Z9(rQ)}if(rA("tengu_bridge_repl_work_received",{}),NA){bA?.();let AB=NA;NA=null;let JB=AB.getLastSequenceNum();if(JB>LQ)LQ=JB;AB.close()}UE.deactivate();let vW=(AB)=>ZCA(AB,{transport:NA,sessionId:MA,onInterrupt:S,onSetModel:d,onSetMaxThinkingTokens:r,onSetPermissionMode:wA,onRenameSession:iA,onSetColor:DA,onFileSuggestions:BA,onReadFile:PA,onMcpAuthenticate:ZQ,onMcpOauthCallbackUrl:b,onMcpReconnect:VQ,onMcpStatus:YA}),yD=!1,Qx=(AB)=>{if(NA=AB,AB.setOnConnect(()=>{if(NA!==AB)return;if(z("[bridge:repl] Ingress transport connected"),rA("tengu_bridge_repl_ws_connected",{}),!TA){let JB=mC();if(JB)Z9(JB)}if(bD=!1,!yD&&L&&L.length>0){yD=!0;let JB=j,XI=L.filter((SW)=>uR(SW)&&!Z?.has(SW.uuid)),uC=JB>0&&XI.length>JB?XI.slice(-JB):XI;if(uC.length<XI.length)z(`[bridge:repl] Capped initial flush: ${XI.length} -> ${uC.length} (cap=${JB})`),rA("tengu_bridge_repl_history_capped",{eligible_count:XI.length,capped_count:uC.length});let _0=D(uC);if(_0.length>0){z(`[bridge:repl] Flushing ${_0.length} initial message(s) via transport`);let SW=_0.map((GG)=>({...GG,session_id:MA,historical:!0})),Bx=AB.droppedBatchCount;AB.writeBatch(SW).then(()=>{if(AB.droppedBatchCount>Bx){z(`[bridge:repl] Initial flush dropped ${AB.droppedBatchCount-Bx} batch(es) — not marking ${_0.length} UUID(s) as flushed`);return}if(Z){for(let GG of _0)if(GG.uuid)Z.add(GG.uuid)}}).catch((GG)=>z(`[bridge:repl] Initial flush failed: ${GG}`)).finally(()=>{if(NA!==AB)return;tR(),$A?.("connected")})}else tR(),$A?.("connected")}else if(!UE.active)$A?.("connected")}),AB.setOnData((JB)=>{zCA(JB,GE,JG,g,T,vW)}),sCA=sR,AB.setOnClose((JB)=>{if(NA!==AB)return;sR(JB)}),!yD&&L&&L.length>0)UE.start();AB.connect()};if(vE++,TA){let AB=PCA(J,m),JB=vE;z(`[bridge:repl] CCR v2: sessionUrl=${AB} session=${m} gen=${JB}`),bCA({sessionUrl:AB,ingressToken:JA,sessionId:m,initialSequenceNum:LQ}).then((XI)=>{if(xB.signal.aborted){XI.close();return}if(JB!==vE){z(`[bridge:repl] CCR v2: discarding stale handshake gen=${JB} current=${vE}`),XI.close();return}if(Qx(XI),mA){let uC=XI.getInternalEventWriter?.(),_0=XI.getInternalEventReaders?.();if(uC&&_0)mA(uC,_0)}},(XI)=>{if(z(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${UA(XI)}`,{level:"error"}),rA("tengu_bridge_repl_ccr_v2_init_failed",{}),JB!==vE)return;if(zB)BQ.stopWork(QA,zB,!1).catch((uC)=>{z(`[bridge:repl] stopWork after v2 init failure: ${UA(uC)}`)}),zB=null,fC=null;SE()})}else{let AB=_CA(G,m);z(`[bridge:repl] Ingress URL: ${AB}`),z(`[bridge:repl] Creating HybridTransport: session=${m}`);let JB=rQ??"";Qx(kCA(new vR(new URL(AB),{Authorization:`Bearer ${JB}`,"anthropic-version":"2023-06-01"},m,()=>({Authorization:`Bearer ${mC()??JB}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{$A?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),SE()}})))}}};pcA(eCA);let TD=f?setInterval(()=>{if(NI)return;iQ(Q,{sessionId:MA,environmentId:QA,source:"repl"})},3600000):null;TD?.unref?.();let Ax=M().session_keepalive_interval_v2_ms,kD=Ax>0?setInterval(()=>{if(!NA)return;z("[bridge:repl] keep_alive sent"),NA.write({type:"keep_alive"}).catch((m)=>{z(`[bridge:repl] keep_alive write failed: ${UA(m)}`)})},Ax):null;kD?.unref?.();let bD=!1;_D=async()=>{if(bD){z(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${QA} session=${MA}`);return}bD=!0,bA?.();let m=Date.now();if(z(`[bridge:repl] Teardown starting: env=${QA} session=${MA} workId=${zB??"none"} transportState=${NA?.getStateLabel()??"null"}`),TD!==null)clearInterval(TD);if(kD!==null)clearInterval(kD);if(eR)process.off("SIGUSR2",eR);if(xB.abort(),z("[bridge:repl] Teardown: poll loop aborted"),NA){let pA=NA.getLastSequenceNum();if(pA>LQ)LQ=pA}if(f){NA=null,UE.drop(),await iQ(Q,{sessionId:MA,environmentId:QA,source:"repl"}),z(`[bridge:repl] Teardown (perpetual): leaving env=${QA} session=${MA} alive on server, duration=${Date.now()-m}ms`);return}let JA=NA;if(NA=null,UE.drop(),JA)JA.write(cR(MA));let UQ=zB?BQ.stopWork(QA,zB,!0).then(()=>{z("[bridge:repl] Teardown: stopWork completed")}).catch((pA)=>{z(`[bridge:repl] Teardown stopWork failed: ${UA(pA)}`)}):Promise.resolve();await Promise.all([UQ,W(MA)]),JA?.close(),z("[bridge:repl] Teardown: transport closed"),await BQ.deregisterEnvironment(QA).catch((pA)=>{z(`[bridge:repl] Teardown deregister failed: ${UA(pA)}`)}),await GQ(Q),z(`[bridge:repl] Teardown complete: env=${QA} duration=${Date.now()-m}ms`)},z(`[bridge:repl] Ready: env=${QA} session=${MA}`),$A?.("ready");let gW={get bridgeSessionId(){return MA},outboundOnly:!1,get environmentId(){return QA},getLastSequenceNum(){return gW.getSSESequenceNum()},flush(){return NA?.flush()??Promise.resolve()},getSSESequenceNum(){let m=NA?.getLastSequenceNum()??0;return Math.max(LQ,m)},sessionIngressUrl:G,writeMessages(m){let JA=m.filter((TA)=>uR(TA)&&!S0.has(TA.uuid)&&!GE.has(TA.uuid));if(JA.length===0)return;if(!TY)for(let TA of JA){let rQ=KCA(TA);if(rQ!==void 0&&yQ?.(rQ,MA)){TY=!0;break}}if(UE.enqueue(...JA)){z(`[bridge:repl] Queued ${JA.length} message(s) during initial flush`);return}if(!NA){let TA=JA.map((rQ)=>rQ.type).join(",");z(`[bridge:repl] Transport not configured, dropping ${JA.length} message(s) [${TA}] for session=${MA}`,{level:"warn"});return}for(let TA of JA)GE.add(TA.uuid);z(`[bridge:repl] Sending ${JA.length} message(s) via transport`);let pA=D(JA).map((TA)=>({...TA,session_id:MA}));NA.writeBatch(pA)},writeSdkMessages(m){let JA=m.filter((pA)=>!pA.uuid||!GE.has(pA.uuid));if(JA.length===0)return;if(!NA){z(`[bridge:repl] Transport not configured, dropping ${JA.length} SDK message(s) for session=${MA}`,{level:"warn"});return}for(let pA of JA)if(pA.uuid)GE.add(pA.uuid);let UQ=JA.map((pA)=>({...pA,session_id:MA}));NA.writeBatch(UQ)},sendControlRequest(m){if(!NA){z("[bridge:repl] Transport not configured, skipping control_request");return}let JA={...m,session_id:MA};NA.write(JA),z(`[bridge:repl] Sent control_request request_id=${m.request_id}`)},sendControlResponse(m){if(!NA){z("[bridge:repl] Transport not configured, skipping control_response");return}let JA={...m,session_id:MA};NA.write(JA),z("[bridge:repl] Sent control_response")},sendControlCancelRequest(m){if(!NA){z("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let JA={type:"control_cancel_request",request_id:m,session_id:MA};NA.write(JA),z(`[bridge:repl] Sent control_cancel_request request_id=${m}`)},reportMetadata(m){NA?.reportMetadata(m)},sendResult(){if(!NA){z(`[bridge:repl] sendResult: skipping, transport not configured session=${MA}`);return}NA.write(cR(MA)),z(`[bridge:repl] Sent result for session=${MA}`)},async subscribePR(m,JA,UQ){let pA=`${m}#${JA}`,TA=YB.get(pA);if(UQ)YB.set(pA,{agentId:UQ,repo:m,prNumber:JA});let rQ=await xD("subscribe",MA,m,JA,J,F);if(rQ)bI.add(pA);else if(UQ)if(TA)YB.set(pA,TA);else YB.delete(pA);return rQ},async unsubscribePR(m,JA){let UQ=await xD("unsubscribe",MA,m,JA,J,F);if(UQ){let pA=`${m}#${JA}`;bI.delete(pA),YB.delete(pA)}return UQ},async subscribeSlackThread(m,JA){let UQ=await OD("subscribe",MA,m,JA,J,F);if(UQ)UC.add(`${m}/${JA}`);return UQ},async unsubscribeSlackThread(m,JA){let UQ=await OD("unsubscribe",MA,m,JA,J,F);if(UQ)UC.delete(`${m}/${JA}`);return UQ},getPRWebhookTargets(){return[...YB.values()]},async teardown(){A0A(),await _D?.(),z("[bridge:repl] Torn down"),rA("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return gW.teardown()}},A0A=c0(gW);return gW}async function pcA({api:A,getCredentials:Q,signal:B,onStateChange:I,onWorkReceived:E,onEnvironmentLost:C,getWsState:Y,isAtCapacity:J,capacitySignal:G,onFatalError:U,getPollIntervalConfig:F=()=>s$,getHeartbeatInfo:N,onHeartbeatFatal:W}){z(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let D=0,w=null,V=null,M=0,j=0,L=!1;while(!B.aborted){let{environmentId:Z,environmentSecret:g}=Q(),T=F();try{let S=await A.pollForWork(Z,g,B,T.reclaim_older_than_ms);if(j=0,D>0)z(`[bridge:repl] Poll recovered after ${D} consecutive error(s)`),D=0,w=null,V=null,M=0,I?.("ready");if(!S){let r=L;if(L=!1,J?.()&&G&&!r){let wA=T.poll_interval_ms_at_capacity;if(T.non_exclusive_heartbeat_interval_ms>0&&N){rA("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:T.non_exclusive_heartbeat_interval_ms});let DA=wA>0?Date.now()+wA:null,BA=!1,PA=0;while(!B.aborted&&J()&&(DA===null||Date.now()<DA)){let b=F();if(b.non_exclusive_heartbeat_interval_ms<=0)break;let VQ=N();if(!VQ)break;let YA=G();try{await A.heartbeatWork(VQ.environmentId,VQ.workId,VQ.sessionToken)}catch($A){if(z(`[bridge:repl:heartbeat] Failed: ${UA($A)}`),$A instanceof YE){if(YA.cleanup(),rA("tengu_bridge_heartbeat_error",{status:$A.status,error_type:$A.status===401||$A.status===403?"auth_failed":"fatal"}),W)W($A),z(`[bridge:repl:heartbeat] Fatal (status=${$A.status}), work state cleared — fast-polling for re-dispatch`);else BA=!0;break}}PA++,await kB(b.non_exclusive_heartbeat_interval_ms,YA.signal),YA.cleanup()}let ZQ=BA?"error":B.aborted?"shutdown":!J()?"capacity_changed":DA!==null&&Date.now()>=DA?"poll_due":"config_disabled";if(rA("tengu_bridge_heartbeat_mode_exited",{reason:ZQ,heartbeat_cycles:PA}),!BA){if(ZQ==="poll_due")z(`[bridge:repl] Heartbeat poll_due after ${PA} cycles — falling through to pollForWork`);continue}}let iA=wA>0?wA:T.non_exclusive_heartbeat_interval_ms;if(iA>0){let DA=G(),BA=Date.now();await kB(iA,DA.signal),DA.cleanup();let PA=Date.now()-BA-iA;if(PA>60000)z(`[bridge:repl] At-capacity sleep overran by ${Math.round(PA/1000)}s — process suspension detected, forcing one fast-poll cycle`),rA("tengu_bridge_repl_suspension_detected",{overrun_ms:PA}),L=!0}}else await kB(T.poll_interval_ms_not_at_capacity,B);continue}let d;try{d=SCA(S.secret)}catch(r){z(`[bridge:repl] Failed to decode work secret: ${UA(r)}`),rA("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(Z,S.id,!1).catch(()=>{});continue}z(`[bridge:repl] Acknowledging workId=${S.id}`);try{await A.acknowledgeWork(Z,S.id,d.session_ingress_token)}catch(r){z(`[bridge:repl] Acknowledge failed workId=${S.id}: ${UA(r)}`)}if(S.data.type==="healthcheck"){z("[bridge:repl] Healthcheck received");continue}if(S.data.type==="session"){let r=S.data.id;try{TI(r,"session_id")}catch{z(`[bridge:repl] Invalid session_id in work: ${r}`);continue}E(r,d.session_ingress_token,S.id,d.use_code_sessions===!0),z("[bridge:repl] Work accepted, continuing poll loop")}}catch(S){if(B.aborted)break;if(S instanceof YE&&S.status===404&&C){let b=Q().environmentId;if(Z!==b){z(`[bridge:repl] Stale poll error for old env=${Z}, current env=${b} — skipping onEnvironmentLost`),D=0,w=null;continue}if(j++,z(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${j}/3)`),rA("tengu_bridge_repl_env_lost",{attempt:j}),j>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 VQ=await C();if(B.aborted)break;if(VQ){D=0,w=null,I?.("ready"),z(`[bridge:repl] Re-registered environment: ${VQ.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(S instanceof YE){let b=LD(S.errorType),VQ=VCA(S);if(z(`[bridge:repl] Fatal poll error: ${S.message} (status=${S.status}, type=${S.errorType??"unknown"})${VQ?" (suppressed)":""}`),rA("tengu_bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),a(b?"info":"error","bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),!VQ)I?.("failed",b?"Remote Control session expired.":S.message);U?.();break}let d=Date.now();if(V!==null&&d-V>Math.max(lCA,M)*2)z(`[bridge:repl] Detected system sleep (${Math.round((d-V)/1000)}s gap), resetting poll error budget`),a("info","bridge_repl_poll_sleep_detected",{gapMs:d-V}),D=0,w=null;if(V=d,D++,w===null)w=d;let r=d-w,wA=$CA(S),iA=FCA(S),DA=Y?.()??"unknown";if(z(`[bridge:repl] Poll error (attempt ${D}, elapsed ${Math.round(r/1000)}s, ws=${DA}): ${iA}`),rA("tengu_bridge_repl_poll_error",{status:wA,consecutiveErrors:D,elapsedMs:r}),D===1)I?.("reconnecting",iA);if(r>=iCA){z(`[bridge:repl] Poll failures exceeded ${iCA/1000}s (${D} errors), giving up`),a("info","bridge_repl_poll_give_up"),rA("tengu_bridge_repl_poll_give_up",{consecutiveErrors:D,elapsedMs:r,lastStatus:wA}),I?.("failed","connection to server lost");break}let BA=WCA(S),PA=Math.min(nCA*2**(D-1),lCA),ZQ=oCA(BA!==void 0?Math.max(PA,Math.min(BA,ucA)):PA);if(M=ZQ,F().non_exclusive_heartbeat_interval_ms>0){let b=N?.();if(b)try{await A.heartbeatWork(b.environmentId,b.workId,b.sessionToken)}catch{}}await kB(ZQ,B)}}z(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function lcA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function icA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function dcA(A,Q){if(icA(A,Q))return"http://localhost:4000";if(lcA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function rCA(A,Q,B){let{toCompatSessionId:I}=Y0A(JCA),E=I(A),Y=`${dcA(E,Q)}/code/${E}`;return B?`${Y}?${new URLSearchParams(B)}`:Y}eA();async function tCA(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:W=!1,initialSSESequenceNum:X,onConflict:D}=A,w=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},j=[],L=null,Z=[],g=null,T=[],S=null,d=!1,r=null,wA={detail:null},iA=ncA(),DA=()=>aCA({dir:Q,registrationDir:B,machineName:iA,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:V,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:w,onInitError:console.error,createSession:({environmentId:YA,title:$A,signal:yQ})=>yCA({environmentId:YA,title:$A,tags:["claude-code-assistant"],signal:yQ},M),archiveSession:(YA)=>fCA(YA,M),perpetual:W,initialSSESequenceNum:X,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...s$,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(YA){let $A=_l(YA);if(!$A)return;j.push({content:$A.content,uuid:$A.uuid}),L?.(),L=null},onInterrupt(){Z.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),g?.(),g=null},onSetModel(YA){Z.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:YA}}),g?.(),g=null},onSetMaxThinkingTokens(YA){Z.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:YA}}),g?.(),g=null},onPermissionResponse(YA){T.push(YA),S?.(),S=null},onStateChange(YA,$A){if(r?.(YA,$A),YA==="failed")wA.detail=$A??"unknown failure",d=!0,L?.(),g?.(),S?.()}}),BA=await DA();if(!BA&&D&&wA.detail?.includes("409")){if(await D({machineName:iA,message:wA.detail})==="takeover")d=!1,wA.detail=null,BA=await DA()}if(!BA){let YA=wA.detail??"initBridgeCore returned null (env registration or session creation failed)";return z(`[bridge:daemon] connectRemoteControl failed: ${YA}`),{ok:!1,error:{kind:wA.detail?.includes("409")?"conflict":wA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:YA}}}async function*PA(){while(!d){while(j.length>0)if(yield j.shift(),d)return;await new Promise((YA)=>{L=YA})}}async function*ZQ(){while(!d){while(Z.length>0)if(yield Z.shift(),d)return;await new Promise((YA)=>{g=YA})}}async function*b(){while(!d){while(T.length>0)if(yield T.shift(),d)return;await new Promise((YA)=>{S=YA})}}return{ok:!0,handle:{get sessionUrl(){return rCA(BA.bridgeSessionId,V)},get environmentId(){return BA.environmentId},get bridgeSessionId(){return BA.bridgeSessionId},getSSESequenceNum(){return BA.getSSESequenceNum()},hasPendingPrompts(){return j.length>0},write(YA){BA.writeSdkMessages([YA])},sendResult(){BA.sendResult()},sendControlRequest(YA){BA.sendControlRequest(YA)},sendControlResponse(YA){BA.sendControlResponse(YA)},sendControlCancelRequest(YA){BA.sendControlCancelRequest(YA)},inboundPrompts:PA,controlRequests:ZQ,permissionResponses:b,onStateChange(YA){r=YA},async teardown(){d=!0,L?.(),g?.(),S?.(),await BA.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var acA=1000,rcA=1e4,tcA=5000,scA=60000,rR=3;function ecA(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 ApA(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"&&Jx(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}function SD(A){if(!A){cI("assistant_worker_start");return}if(A.kind==="auth"||A.kind==="conflict")l0("assistant_worker_start",A.kind);else sB("assistant_worker_start",A.kind)}async function QpA(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:W=()=>{}}=A;W("─── worker start ───");let X=await G?.load(),D={...Q,initialSSESequenceNum:Q.initialSSESequenceNum??X?.lastSSESequenceNum};if(!D.getAccessToken()){let IA={kind:"auth",detail:"getAccessToken returned empty"};return SD(IA),{ok:!1,error:IA}}let w=await tCA(D);if(!w.ok)return W(`bridge connection failed: ${w.error.kind} — ${w.error.detail}`),SD(w.error),{ok:!1,error:w.error};let V=w.handle;W(`bridge connected url=${V.sessionUrl} env=${V.environmentId}`);let M=X?.claudeSessionId,j=V.bridgeSessionId,L=[],Z=null,g=!1,T=null,S=0,d=!0,r=0,wA=Promise.resolve();function iA(){if(!G)return;let IA={claudeSessionId:M,lastSSESequenceNum:V.getSSESequenceNum(),bridgeSessionId:V.bridgeSessionId};wA=wA.then(()=>G.save(IA).catch((BQ)=>{W(`stateAdapter.save threw: ${BQ}`)}))}function DA(){if(L.length>0||V.hasPendingPrompts()){W("persist skipped: prompt queued");return}iA()}iA();let BA=new AbortController,PA=new Map,ZQ=null;function b(){return ZQ??=(async()=>{DA();for(let IA of PA.keys())V.sendControlCancelRequest(IA);PA.clear(),await V.teardown(),await wA})()}if(N.addEventListener("abort",()=>{BA.abort(),b().catch((IA)=>W(`teardown threw: ${IA}`))}),N.aborted){await b();let IA={kind:"unknown",detail:"aborted before start"};return SD(IA),{ok:!1,error:IA}}let VQ="connected";V.onStateChange((IA,BQ)=>{if(W(`bridge state=${IA} detail=${BQ??""}`),VQ=IA,IA==="ready"&&V.bridgeSessionId!==j)j=V.bridgeSessionId,iA();else if(IA==="connected")DA();if(IA==="failed")W(`bridge failed: ${BQ??"unknown"}`),BA.abort(),b().catch((wQ)=>W(`teardown threw: ${wQ}`))});let YA=I?.horizonMs??600000,$A=I?.leadMs??tcA,yQ=null,HQ=!1,AA=!1,f="";async function WA(){if(!I)return;let IA=await gl(I.dir).catch((wQ)=>{return W(`computeCronHorizon threw: ${wQ}`),{nextFire:null,hasOverdue:!1}});yQ=IA.nextFire,AA=IA.hasOverdue;let BQ=IA.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(IA.nextFire).toISOString()} hasOverdue=${IA.hasOverdue}`;if(BQ!==f)f=BQ,W(BQ)}let mA;if(I)await WA(),mA=setInterval(WA,rcA),mA.unref?.();function bA(IA){L.push({type:"user",message:{role:"user",content:IA},parent_tool_use_id:null,session_id:""}),Z?.(),Z=null}async function KB(IA,BQ,wQ){if(C){let YB=await C(IA,BQ,wQ);if(YB)return Y?.(IA,YB),YB}if(VQ!=="connected"){W(`permission denied — bridge state=${VQ}, request would drop`);let YB={behavior:"deny",message:`Cannot request permission: remote control is ${VQ}. Try again in a moment.`};return Y?.(IA,YB),YB}let QA=ocA();W(`permission request tool=${IA} req=${QA}`);let{signal:gE,suggestions:PY,blockedPath:yC,toolUseID:MA}=wQ;V.sendControlRequest({type:"control_request",request_id:QA,request:{subtype:"can_use_tool",tool_name:IA,display_name:Gx(IA),input:BQ,tool_use_id:MA,...PY&&{permission_suggestions:PY},...yC&&{blocked_path:yC},..."decisionReason"in wQ&&wQ.decisionReason&&{decision_reason:wQ.decisionReason},..."agentID"in wQ&&wQ.agentID&&{agent_id:wQ.agentID}}});let bI;try{let YB=await new Promise((S0,GE)=>{PA.set(QA,S0),bI=setTimeout((JG,xB,NA,vE,LQ)=>{if(JG.delete(xB))NA(`permission timeout req=${xB}`),vE.sendControlCancelRequest(xB),LQ({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},scA,PA,QA,W,V,S0),bI.unref?.(),gE.addEventListener("abort",()=>{if(PA.delete(QA))V.sendControlCancelRequest(QA);GE(Error("aborted"))},{once:!0})});W(`permission response req=${QA} behavior=${YB.behavior}`);let UC=YB.behavior==="allow"?{behavior:"allow",updatedInput:YB.updatedInput,updatedPermissions:YB.updatedPermissions}:{behavior:"deny",message:YB.message??"Denied via remote control"};return Y?.(IA,UC),UC}finally{if(bI)clearTimeout(bI);PA.delete(QA)}}let iQ=!1;async function GQ(){if(T!==null||iQ||BA.signal.aborted)return;if(iQ=!0,g=!1,L.length>0)d=!1;async function*IA(){while(!g){while(L.length>0)if(d=!1,yield L.shift(),g)return;await new Promise((QA)=>{Z=QA})}}W(`spawning query resume=${M??"<fresh>"}`);let BQ={assistant:!0,cwd:Q.dir,resume:M,stderr:(QA)=>W(`[child] ${QA.trimEnd()}`),canUseTool:KB},wQ;try{if(wQ=await E(BQ),B)wQ={...wQ,env:{...wQ.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(QA){if(W(`buildQueryOptions threw: ${QA}`),iQ=!1,r++,r>=rR)W(`${r} consecutive buildQueryOptions failures — dropping ${L.length} queued input(s)`),L.length=0;else if(L.length>0&&!BA.signal.aborted)GQ();return}if(BA.signal.aborted){iQ=!1;return}try{T=Kc({prompt:IA(),options:wQ})}finally{iQ=!1}(async()=>{try{W("output pump started");for await(let QA of T){if(QA.type==="system"&&QA.subtype==="init"){if(QA.session_id!==M)M=QA.session_id,DA()}if(QA.type==="result")d=!0,r=0,HQ=!0,DA();if(!ecA(QA))continue;let gE=J?J(QA):QA;if(gE===null)continue;V.write(gE)}}catch(QA){W(`query threw: ${QA}`),r++}finally{W("output pump ended"),T=null;for(let QA of PA.keys())V.sendControlCancelRequest(QA);if(PA.clear(),L.length>0&&!BA.signal.aborted)if(r>=rR)W(`${r} consecutive crashes — dropping ${L.length} queued input(s)`),L.length=0;else GQ()}})()}let kI=setInterval(()=>{let IA=Date.now(),BQ=yQ!==null&&yQ-IA<YA;if(T===null){let wQ=yQ!==null&&yQ-IA<$A;if((wQ||AA&&!HQ)&&r<rR&&!BA.signal.aborted)W(wQ?`cron due in ${yQ-IA}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),GQ();return}if(g)return;if(!d||L.length>0)return;if(IA-S<F)return;if(BQ)return;if(AA&&!HQ)return;W("idle conditions met → closing input gen"),DA(),g=!0,Z?.(),Z=null},acA);if(kI.unref?.(),U)W("initialPrompt → injecting"),S=Date.now(),bA(U),GQ();let JE=(async()=>{if(await Promise.all([(async()=>{for await(let IA of V.inboundPrompts()){if(BA.signal.aborted)return;if(W("bridge prompt received"),S=Date.now(),IA.uuid)V.write({type:"user",uuid:IA.uuid,session_id:"",message:{role:"user",content:IA.content},parent_tool_use_id:null});bA(IA.content),GQ()}})(),(async()=>{for await(let IA of V.controlRequests()){if(BA.signal.aborted)return;switch(IA.request.subtype){case"interrupt":W("bridge interrupt"),T?.interrupt();break;case"set_model":W(`bridge setModel=${IA.request.model??"<default>"}`),T?.setModel(IA.request.model);break;case"set_max_thinking_tokens":W(`bridge setMaxThinkingTokens=${IA.request.max_thinking_tokens}`),T?.setMaxThinkingTokens(IA.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let IA of V.permissionResponses()){if(BA.signal.aborted)return;let BQ=ApA(IA,PA,V.sendControlCancelRequest);if(BQ)W(`permission response for unknown req=${BQ} (stale)`)}})()]),clearInterval(kI),mA)clearInterval(mA);T?.close(),await b(),W("─── worker stop ───")})(),QQ={get sessionUrl(){return V.sessionUrl},get bridgeSessionId(){return V.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(IA){S=Date.now(),bA(IA),GQ()},async interrupt(){await T?.interrupt()},done:JE,teardown:b,[Symbol.asyncDispose]:b};return SD(null),{ok:!0,handle:QQ}}export{QpA as runAssistantWorker};
|
|
190
|
+
`)}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(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(XcA*Math.pow(2,this.reconnectAttempts-1),DcA),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)`),a("error","cli_sse_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},I)}onLivenessTimeout=()=>{this.livenessTimer=null,z("SSETransport: Liveness timeout, reconnecting",{level:"error"}),a("error","cli_sse_liveness_timeout"),this.connectErrorsSeen.add("liveness_timeout"),this.onDiagnostic?.(`SSE liveness timeout — no frame in ${xCA/1000}s, reconnecting`),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,xCA)}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"),a("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":bC()};z(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=xW;I++){try{let C=await WB.post(this.postUrl,A,{headers:B,validateStatus:zcA});if(C.status===200||C.status===201){z(`SSETransport: POST success type=${A.type}`);return}if(z(`SSETransport: POST ${C.status} body=${LA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){z(`SSETransport: POST returned ${C.status} (client error), not retrying`),a("warn","cli_sse_post_client_error",{status:C.status});return}z(`SSETransport: POST returned ${C.status}, attempt ${I}/${xW}`),a("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){z(`SSETransport: POST error: ${UA(C)}, attempt ${I}/${xW}`),a("warn","cli_sse_post_network_error",{attempt:I})}if(I===xW){z(`SSETransport: POST failed after ${xW} attempts, continuing`),a("warn","cli_sse_post_retries_exhausted");return}let E=Math.min(wcA*Math.pow(2,I-1),McA);await kB(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}setOnDiagnostic(A){this.onDiagnostic=A}setEventFilter(A){this.eventFilter=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 HcA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}eA();gQ();nI();aC();eA();var OCA="DEVICE_ATTESTATION_STATUS_",gCA=["UNSPECIFIED","ABSENT","VERIFIED","VERIFIED_BY_GATE","INVALID","UNCHECKED"];function LcA(A){if(A===void 0||A===null)return"UNSPECIFIED";if(typeof A==="number")return gCA[A]??"UNSPECIFIED";if(typeof A!=="string")return"UNSPECIFIED";let Q=A.startsWith(OCA)?A.slice(OCA.length):A;if(gCA.includes(Q))return Q;return"UNSPECIFIED"}function qcA(A){return A==="VERIFIED"||A==="VERIFIED_BY_GATE"}var jcA={enforce:!1,acceptStatuses:new Set},RcA=["UNSPECIFIED","ABSENT","VERIFIED","VERIFIED_BY_GATE","INVALID","UNCHECKED"],azQ=k(()=>$.object({accept_statuses:$.array($.enum(RcA)).default([])}));var xcA;function vCA(A){let Q=typeof A.payload?.type==="string"?A.payload.type:A.event_type,B=Q==="user"||Q==="control_response",I=LcA(A.device_attestation_status);if(qcA(I)){if(B)cI("bridge_event_attestation");return!1}let E=xcA?.()??jcA;if(!E.enforce){if(I==="UNSPECIFIED")return!1;if(B)z(`[bridge:attestation] accepting unverified ${Q} event_id=${A.event_id} status=${I}`,{level:"info"}),l0("bridge_event_attestation",`${I.toLowerCase()}_${Q}`);return!1}let C=E.acceptStatuses.has(I);if(B){let Y=`${I.toLowerCase()}_${Q}`;if(z(`[bridge:attestation] ${C?"accepting (config exception)":"DROPPING"} unverified ${Q} event_id=${A.event_id} status=${I}`,{level:C?"info":"warn"}),C)l0("bridge_event_attestation",Y);else sB("bridge_event_attestation",Y)}return!C}IQ();function SCA(A){let Q=Buffer.from(A,"base64url").toString("utf-8"),B=mQ(Q);if(!B||typeof B!=="object"||!("version"in B)||B.version!==1)throw Error(`Unsupported work secret version: ${B&&typeof B==="object"&&"version"in B?B.version:"unknown"}`);let I=B;if(typeof I.session_ingress_token!=="string"||I.session_ingress_token.length===0)throw Error("Invalid work secret: missing or empty session_ingress_token");if(typeof I.api_base_url!=="string")throw Error("Invalid work secret: missing api_base_url");return B}function _CA(A,Q){let B=A.includes("localhost")||A.includes("127.0.0.1"),I=B?"ws":"wss",E=B?"v2":"v1",C=A.replace(/^https?:\/\//,"").replace(/\/+$/,"");return`${I}://${C}/${E}/session_ingress/ws/${Q}`}function nR(A,Q){if(A===Q)return!0;let B=A.slice(A.lastIndexOf("_")+1),I=Q.slice(Q.lastIndexOf("_")+1);return B.length>=4&&B===I}function PCA(A,Q){return`${A.replace(/\/+$/,"")}/v1/code/sessions/${Q}`}async function TCA(A,Q){let B=await WB.post(`${A}/worker/register`,{},{headers:{Authorization:`Bearer ${Q}`,"Content-Type":"application/json","anthropic-version":"2023-06-01"},timeout:1e4}),I=B.data?.worker_epoch,E=typeof I==="string"?Number(I):I;if(typeof E!=="number"||!Number.isFinite(E)||!Number.isSafeInteger(E))throw Error(`registerWorker: invalid worker_epoch in response: ${LA(B.data)}`);return E}function kCA(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 bCA(A){let{sessionUrl:Q,ingressToken:B,sessionId:I,initialSequenceNum:E,getAuthToken:C}=A,Y;if(C)Y=()=>{let w=C();if(!w)return{};return{Authorization:`Bearer ${w}`}};else Z9(B);let J=A.epoch??await TCA(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 dR(G,{},I,void 0,E,Y),F,N=new iR(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(w){z(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${UA(w)}`,{level:"error"})}throw Error("epoch superseded")}});U.setOnEvent((w)=>{N.reportDelivery(w.event_id,"received"),N.reportDelivery(w.event_id,"processed")}),U.setEventFilter(vCA);let W,X=!1,D=!1;return{write(w){return N.writeEvent(w)},async writeBatch(w){for(let V of w){if(D)break;await N.writeEvent(V)}},close(){D=!0,N.close(),U.close()},isConnectedStatus(){return X},getStateLabel(){if(U.isClosedStatus())return"closed";if(U.isConnectedStatus())return X?"connected":"init";return"connecting"},setOnData(w){U.setOnData(w)},setOnClose(w){F=w,U.setOnClose((V)=>{N.close(),w(V??4092)})},setOnConnect(w){W=w},getLastSequenceNum(){return U.getLastSequenceNum()},droppedBatchCount:0,reportState(w,V){N.reportState(w,V)},reportMetadata(w){N.reportMetadata(w)},reportDelivery(w,V){N.reportDelivery(w,V)},flush(){return N.flush()},getInternalEventWriter(){return(w,V,M)=>N.writeInternalEvent(w,V,M)},getInternalEventReaders(){return{readMain:()=>N.readInternalEvents(),readSubagents:()=>N.readSubagentInternalEvents()}},connect(){if(!A.outboundOnly)U.connect();N.initialize(J).then(()=>{X=!0,z(`[bridge:repl] v2 transport ready for writes (epoch=${J}, sse=${U.isConnectedStatus()?"open":"opening"})`),W?.()},(w)=>{z(`[bridge:repl] CCR v2 initialize failed: ${UA(w)}`,{level:"error"}),N.close(),U.close(),F?.(4091)})}}}aC();eA();gQ();var OcA="2023-06-01",gcA="ccr-byoc-2025-07-29";async function yCA({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 WB.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:gD(U,J),signal:I,validateStatus:(X)=>X<500})}catch(X){return z(`[bridge] Session creation request failed: ${UA(X)}`),null}if(N.status!==200&&N.status!==201){let X=YG(N.data);return z(`[bridge] Session creation failed with status ${N.status}${X?`: ${X}`:""}`),null}let W=N.data;if(!W||typeof W!=="object"||!("id"in W)||typeof W.id!=="string")return z("[bridge] No session ID in response"),null;return W.id}async function fCA(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 WB.post(Y,{},{headers:gD(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)z(`[bridge] Session ${A} archived successfully`);else{let G=YG(J.data);z(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){z(`[bridge] Session archive request failed: ${UA(J)}`)}}async function xD(A,Q,B,I,E,C){let Y=A==="subscribe"?"bridge_pr_subscribe":"bridge_pr_unsubscribe",J=C();if(!J)return z(`[bridge] No access token for ${A}-pr`),sB(Y,"no_token"),!1;let G=`${E}/v1/code/github/${A}-pr`,U={session_id:r1(Q),repo:B,pr_number:I},F;try{F=await WB.post(G,U,{headers:gD(J),timeout:1e4,validateStatus:(W)=>W<500})}catch(W){return z(`[bridge] ${A}-pr request failed: ${UA(W)}`),sB(Y,"request_failed"),!1}if(!(F.status>=200&&F.status<300||F.status===409)){let W=YG(F.data);return z(`[bridge] ${A}-pr failed ${F.status}${W?`: ${W}`:""}`),sB(Y,"http_error"),!1}return z(`[bridge] ${A}-pr ${B}#${I} ok`),cI(Y),!0}async function OD(A,Q,B,I,E,C){let Y=A==="subscribe"?"bridge_slack_subscribe":"bridge_slack_unsubscribe",J=C();if(!J)return z(`[bridge] No access token for ${A}-thread`),sB(Y,"no_token"),!1;let G=`${E}/v1/code/slack/${A}-thread`,U={session_id:r1(Q),channel:B,thread_ts:I},F;try{F=await WB.post(G,U,{headers:gD(J),timeout:1e4,validateStatus:(W)=>W<500})}catch(W){return z(`[bridge] ${A}-thread request failed: ${UA(W)}`),sB(Y,"request_failed"),!1}if(!(F.status>=200&&F.status<300||F.status===409)){let W=YG(F.data);return z(`[bridge] ${A}-thread failed ${F.status}${W?`: ${W}`:""}`),sB(Y,"http_error"),!1}return z(`[bridge] ${A}-thread ${B}/${I} ok`),cI(Y),!0}function gD(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":OcA,"anthropic-beta":gcA,"User-Agent":bC()};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}var nCA=2000,lCA=60000,iCA=900000,ucA=300000,dCA=3;function oCA(A){return A*(0.8+Math.random()*0.4)}var ccA=0;async function aCA(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:W,getCurrentTitle:X=()=>Y,toSDKMessages:D=()=>{throw Error("BridgeCoreParams.toSDKMessages not provided. Pass it if you use writeMessages() or initialMessages — daemon callers that only use writeSdkMessages() never hit this path.")},onAuth401:w,getTrustedDeviceToken:V,getPollIntervalConfig:M=()=>s$,initialHistoryCap:j=200,initialMessages:L,previouslyFlushedUUIDs:Z,onInboundMessage:g,onPermissionResponse:T,onInterrupt:S,onSetModel:d,onSetMaxThinkingTokens:r,onSetPermissionMode:wA,onRenameSession:iA,onSetColor:DA,onFileSuggestions:BA,onReadFile:PA,onMcpAuthenticate:ZQ,onMcpOauthCallbackUrl:b,onMcpReconnect:VQ,onMcpStatus:YA,onStateChange:$A,onUserMessage:yQ,onSessionEstablished:HQ,onInitError:AA,perpetual:f,initialSSESequenceNum:WA=0,onTransportPersistenceReady:mA,onTransportPersistenceTeardown:bA}=A,KB=++ccA,{writeBridgePointer:iQ,clearBridgePointer:GQ,readBridgePointer:kI}=await Promise.resolve().then(() => (cCA(),uCA)),JE=f?await kI(Q):null,QQ=JE?.source==="repl"?JE:null;z(`[bridge:repl] initBridgeCore #${KB} starting (initialMessages=${L?.length??0}${QQ?` perpetual prior=env:${QQ.environmentId}`:""})`);let BQ=DCA({baseUrl:J,getAccessToken:F,runnerVersion:"0.3.148",onDebug:z,onAuth401:w,getTrustedDeviceToken:V}),wQ={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:pCA(),workerType:U,environmentId:pCA(),reuseEnvironmentId:QQ?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},QA,gE;try{let m=await BQ.registerBridgeEnvironment(wQ);QA=m.environment_id,gE=m.environment_secret}catch(m){if(NCA("registration_failed",`[bridge:repl] Environment registration failed: ${UA(m)}`),AA?.(`[bridge:repl] Environment registration failed: ${UA(m)}`),QQ&&m instanceof YE&&(m.status===410||m.status!==401&&LD(m.errorType)))await GQ(Q);return $A?.("failed",UA(m)),null}z(`[bridge:repl] Environment registered: ${QA}`),a("info","bridge_repl_env_registered"),rA("tengu_bridge_repl_env_registered",{});async function PY(m,JA){if(QA!==m)return z(`[bridge:repl] Env mismatch (requested ${m}, got ${QA}) — cannot reconnect in place`),!1;let UQ=RW(JA),pA=UQ===JA?[JA]:[JA,UQ];for(let TA of pA)try{return await BQ.reconnectSession(QA,TA),z(`[bridge:repl] Reconnected session ${TA} in place on env ${QA}`),!0}catch(rQ){z(`[bridge:repl] reconnectSession(${TA}) failed: ${UA(rQ)}`)}return z("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let yC=QQ?await PY(QQ.environmentId,QQ.sessionId):!1;if(QQ&&!yC)await GQ(Q);let MA,bI=new Set,YB=new Map,UC=new Set;if(yC&&QQ){if(MA=QQ.sessionId,z(`[bridge:repl] Perpetual session reused: ${MA}`),L&&Z)for(let m of L)Z.add(m.uuid)}else{let m=await N({environmentId:QA,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!m)return z("[bridge:repl] Session creation failed, deregistering environment"),AA?.("[bridge:repl] Session creation failed, deregistering environment"),rA("tengu_bridge_repl_session_failed",{}),await BQ.deregisterEnvironment(QA).catch(()=>{}),$A?.("failed","Session creation failed"),null;MA=m,z(`[bridge:repl] Session created: ${MA}`)}HQ?.(MA),await iQ(Q,{sessionId:MA,environmentId:QA,source:"repl"}),a("info","bridge_repl_session_created"),rA("tengu_bridge_repl_started",{has_initial_messages:!!(L&&L.length>0),inProtectedNamespace:KO(),..._EA()});let S0=new Set;if(L)for(let m of L)S0.add(m.uuid);let GE=new qD(2000);for(let m of S0)GE.add(m);let JG=new qD(2000),xB=new AbortController,NA=null,vE=0,LQ=yC?WA:0,zB=null,fC=null,s1=HCA(xB.signal),SE=s1.wake,OW=s1.signal,UE=new pR,TY=!yQ,mB=3,OB=0,NI=null;async function hC(){if(NI)return NI;NI=e1();try{return await NI}finally{NI=null}}async function e1(){if(OB++,vE++,z(`[bridge:repl] Reconnecting after env lost (attempt ${OB}/${mB})`),OB>mB)return z(`[bridge:repl] Environment reconnect limit reached (${mB}), giving up`),!1;if(NA){let TA=NA.getLastSequenceNum();if(TA>LQ)LQ=TA;bA?.(),NA.close(),NA=null}if(SE(),UE.drop(),zB){let TA=zB;if(await BQ.stopWork(QA,TA,!1).catch(()=>{}),zB!==TA)return z("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),OB=0,!0;zB=null,fC=null}if(xB.signal.aborted)return z("[bridge:repl] Reconnect aborted by teardown"),!1;let m=QA;wQ.reuseEnvironmentId=m;let JA;for(let TA=1;;TA++)try{JA=await BQ.registerBridgeEnvironment(wQ);break}catch(rQ){if(rQ instanceof YE||TA>=dCA||xB.signal.aborted)return wQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Environment re-registration failed (attempt ${TA}): ${UA(rQ)}`),!1;let vW=oCA(nCA*2**(TA-1));if(z(`[bridge:repl] Environment re-registration transient failure (attempt ${TA}/${dCA}), retrying in ${Math.round(vW)}ms: ${UA(rQ)}`),await kB(vW,xB.signal),xB.signal.aborted)return wQ.reuseEnvironmentId=void 0,!1}if(QA=JA.environment_id,gE=JA.environment_secret,wQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Re-registered: requested=${m} got=${QA}`),xB.signal.aborted)return z("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await BQ.deregisterEnvironment(QA).catch(()=>{}),!1;if(NA!==null)return z("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),OB=0,!0;if(await PY(m,MA))return rA("tengu_bridge_repl_reconnected_in_place",{}),OB=0,!0;if(QA!==m)rA("tengu_bridge_repl_env_expired_fresh_session",{});if(await W(MA),xB.signal.aborted)return z("[bridge:repl] Reconnect aborted after archive, cleaning up"),await BQ.deregisterEnvironment(QA).catch(()=>{}),!1;let UQ=X(),pA=await N({environmentId:QA,title:UQ,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!pA)return z("[bridge:repl] Session creation failed during reconnection"),!1;if(xB.signal.aborted)return z("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await W(pA),!1;if(MA=pA,kEA(r1(pA)).catch(()=>{}),HQ?.(MA),LQ=0,JG.clear(),TY=!yQ,z(`[bridge:repl] Re-created session: ${MA}`),await iQ(Q,{sessionId:MA,environmentId:QA,source:"repl"}),Z?.clear(),bI.size>0){z(`[bridge:repl] Replaying ${bI.size} PR subscription(s) against new session`);for(let TA of bI){let rQ=TA.lastIndexOf("#");xD("subscribe",MA,TA.slice(0,rQ),Number(TA.slice(rQ+1)),J,F)}}if(UC.size>0){z(`[bridge:repl] Replaying ${UC.size} Slack thread subscription(s) against new session`);for(let TA of UC){let rQ=TA.indexOf("/");OD("subscribe",MA,TA.slice(0,rQ),TA.slice(rQ+1),J,F)}}return OB=0,!0}function mC(){return F()}function tR(){let m=UE.end();if(m.length===0)return;if(!NA){z(`[bridge:repl] Cannot drain ${m.length} pending message(s): no transport`);return}for(let pA of m)GE.add(pA.uuid);let UQ=D(m).map((pA)=>({...pA,session_id:MA}));z(`[bridge:repl] Drained ${m.length} pending message(s) after flush`),NA.writeBatch(UQ)}let _D=null;function PD(){_D?.()}function sR(m){if(z(`[bridge:repl] Transport permanently closed: code=${m}`),rA("tengu_bridge_repl_ws_closed",{code:m}),NA){let UQ=NA.getLastSequenceNum();if(UQ>LQ)LQ=UQ;bA?.(),NA=null}SE();let JA=UE.drop();if(JA>0)z(`[bridge:repl] Dropping ${JA} pending message(s) on transport close (code=${m})`,{level:"warn"});if(m===1000){$A?.("failed","session ended"),xB.abort(),PD();return}$A?.("reconnecting",`Remote Control connection lost (code ${m})`),z(`[bridge:repl] Transport reconnect budget exhausted (code=${m}), attempting env reconnect`),hC().then((UQ)=>{if(UQ)return;if(xB.signal.aborted)return;z("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),rA("tengu_bridge_repl_reconnect_failed",{close_code:m}),$A?.("failed","reconnection failed"),PD()})}let eR,sCA=null,eCA={api:BQ,getCredentials:()=>({environmentId:QA,environmentSecret:gE}),signal:xB.signal,getPollIntervalConfig:M,onStateChange:$A,getWsState:()=>NA?.getStateLabel()??"null",isAtCapacity:()=>NA!==null,capacitySignal:OW,onFatalError:PD,getHeartbeatInfo:()=>{if(!zB||!fC)return null;return{environmentId:QA,workId:zB,sessionToken:fC}},onHeartbeatFatal:(m)=>{if(z(`[bridge:repl] heartbeatWork fatal (status=${m.status}) — tearing down work item for fast re-dispatch`),NA){let JA=NA.getLastSequenceNum();if(JA>LQ)LQ=JA;bA?.(),NA.close(),NA=null}if(UE.drop(),zB)BQ.stopWork(QA,zB,!1).catch((JA)=>{z(`[bridge:repl] stopWork after heartbeat fatal: ${UA(JA)}`)});zB=null,fC=null,SE(),$A?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await hC())return null;return{environmentId:QA,environmentSecret:gE}},onWorkReceived:(m,JA,UQ,pA)=>{if(NA?.isConnectedStatus())z(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${UQ})`);if(z(`[bridge:repl] Work received: workId=${UQ} workSessionId=${m} currentSessionId=${MA} match=${nR(m,MA)}`),iQ(Q,{sessionId:MA,environmentId:QA,source:"repl"}),!nR(m,MA)){z(`[bridge:repl] Rejecting foreign session: expected=${MA} got=${m}`);return}zB=UQ,fC=JA;let TA=pA||aA(process.env.CLAUDE_BRIDGE_USE_CCR_V2),rQ;if(!TA){if(rQ=mC(),!rQ){z("[bridge:repl] No OAuth token available for session ingress, skipping work");return}Z9(rQ)}if(rA("tengu_bridge_repl_work_received",{}),NA){bA?.();let AB=NA;NA=null;let JB=AB.getLastSequenceNum();if(JB>LQ)LQ=JB;AB.close()}UE.deactivate();let vW=(AB)=>ZCA(AB,{transport:NA,sessionId:MA,onInterrupt:S,onSetModel:d,onSetMaxThinkingTokens:r,onSetPermissionMode:wA,onRenameSession:iA,onSetColor:DA,onFileSuggestions:BA,onReadFile:PA,onMcpAuthenticate:ZQ,onMcpOauthCallbackUrl:b,onMcpReconnect:VQ,onMcpStatus:YA}),yD=!1,Qx=(AB)=>{if(NA=AB,AB.setOnConnect(()=>{if(NA!==AB)return;if(z("[bridge:repl] Ingress transport connected"),rA("tengu_bridge_repl_ws_connected",{}),!TA){let JB=mC();if(JB)Z9(JB)}if(bD=!1,!yD&&L&&L.length>0){yD=!0;let JB=j,XI=L.filter((SW)=>uR(SW)&&!Z?.has(SW.uuid)),uC=JB>0&&XI.length>JB?XI.slice(-JB):XI;if(uC.length<XI.length)z(`[bridge:repl] Capped initial flush: ${XI.length} -> ${uC.length} (cap=${JB})`),rA("tengu_bridge_repl_history_capped",{eligible_count:XI.length,capped_count:uC.length});let _0=D(uC);if(_0.length>0){z(`[bridge:repl] Flushing ${_0.length} initial message(s) via transport`);let SW=_0.map((GG)=>({...GG,session_id:MA,historical:!0})),Bx=AB.droppedBatchCount;AB.writeBatch(SW).then(()=>{if(AB.droppedBatchCount>Bx){z(`[bridge:repl] Initial flush dropped ${AB.droppedBatchCount-Bx} batch(es) — not marking ${_0.length} UUID(s) as flushed`);return}if(Z){for(let GG of _0)if(GG.uuid)Z.add(GG.uuid)}}).catch((GG)=>z(`[bridge:repl] Initial flush failed: ${GG}`)).finally(()=>{if(NA!==AB)return;tR(),$A?.("connected")})}else tR(),$A?.("connected")}else if(!UE.active)$A?.("connected")}),AB.setOnData((JB)=>{zCA(JB,GE,JG,g,T,vW)}),sCA=sR,AB.setOnClose((JB)=>{if(NA!==AB)return;sR(JB)}),!yD&&L&&L.length>0)UE.start();AB.connect()};if(vE++,TA){let AB=PCA(J,m),JB=vE;z(`[bridge:repl] CCR v2: sessionUrl=${AB} session=${m} gen=${JB}`),bCA({sessionUrl:AB,ingressToken:JA,sessionId:m,initialSequenceNum:LQ}).then((XI)=>{if(xB.signal.aborted){XI.close();return}if(JB!==vE){z(`[bridge:repl] CCR v2: discarding stale handshake gen=${JB} current=${vE}`),XI.close();return}if(Qx(XI),mA){let uC=XI.getInternalEventWriter?.(),_0=XI.getInternalEventReaders?.();if(uC&&_0)mA(uC,_0)}},(XI)=>{if(z(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${UA(XI)}`,{level:"error"}),rA("tengu_bridge_repl_ccr_v2_init_failed",{}),JB!==vE)return;if(zB)BQ.stopWork(QA,zB,!1).catch((uC)=>{z(`[bridge:repl] stopWork after v2 init failure: ${UA(uC)}`)}),zB=null,fC=null;SE()})}else{let AB=_CA(G,m);z(`[bridge:repl] Ingress URL: ${AB}`),z(`[bridge:repl] Creating HybridTransport: session=${m}`);let JB=rQ??"";Qx(kCA(new vR(new URL(AB),{Authorization:`Bearer ${JB}`,"anthropic-version":"2023-06-01"},m,()=>({Authorization:`Bearer ${mC()??JB}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{$A?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),SE()}})))}}};pcA(eCA);let TD=f?setInterval(()=>{if(NI)return;iQ(Q,{sessionId:MA,environmentId:QA,source:"repl"})},3600000):null;TD?.unref?.();let Ax=M().session_keepalive_interval_v2_ms,kD=Ax>0?setInterval(()=>{if(!NA)return;z("[bridge:repl] keep_alive sent"),NA.write({type:"keep_alive"}).catch((m)=>{z(`[bridge:repl] keep_alive write failed: ${UA(m)}`)})},Ax):null;kD?.unref?.();let bD=!1;_D=async()=>{if(bD){z(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${QA} session=${MA}`);return}bD=!0,bA?.();let m=Date.now();if(z(`[bridge:repl] Teardown starting: env=${QA} session=${MA} workId=${zB??"none"} transportState=${NA?.getStateLabel()??"null"}`),TD!==null)clearInterval(TD);if(kD!==null)clearInterval(kD);if(eR)process.off("SIGUSR2",eR);if(xB.abort(),z("[bridge:repl] Teardown: poll loop aborted"),NA){let pA=NA.getLastSequenceNum();if(pA>LQ)LQ=pA}if(f){NA=null,UE.drop(),await iQ(Q,{sessionId:MA,environmentId:QA,source:"repl"}),z(`[bridge:repl] Teardown (perpetual): leaving env=${QA} session=${MA} alive on server, duration=${Date.now()-m}ms`);return}let JA=NA;if(NA=null,UE.drop(),JA)JA.write(cR(MA));let UQ=zB?BQ.stopWork(QA,zB,!0).then(()=>{z("[bridge:repl] Teardown: stopWork completed")}).catch((pA)=>{z(`[bridge:repl] Teardown stopWork failed: ${UA(pA)}`)}):Promise.resolve();await Promise.all([UQ,W(MA)]),JA?.close(),z("[bridge:repl] Teardown: transport closed"),await BQ.deregisterEnvironment(QA).catch((pA)=>{z(`[bridge:repl] Teardown deregister failed: ${UA(pA)}`)}),await GQ(Q),z(`[bridge:repl] Teardown complete: env=${QA} duration=${Date.now()-m}ms`)},z(`[bridge:repl] Ready: env=${QA} session=${MA}`),$A?.("ready");let gW={get bridgeSessionId(){return MA},outboundOnly:!1,get environmentId(){return QA},getLastSequenceNum(){return gW.getSSESequenceNum()},flush(){return NA?.flush()??Promise.resolve()},getSSESequenceNum(){let m=NA?.getLastSequenceNum()??0;return Math.max(LQ,m)},sessionIngressUrl:G,writeMessages(m){let JA=m.filter((TA)=>uR(TA)&&!S0.has(TA.uuid)&&!GE.has(TA.uuid));if(JA.length===0)return;if(!TY)for(let TA of JA){let rQ=KCA(TA);if(rQ!==void 0&&yQ?.(rQ,MA)){TY=!0;break}}if(UE.enqueue(...JA)){z(`[bridge:repl] Queued ${JA.length} message(s) during initial flush`);return}if(!NA){let TA=JA.map((rQ)=>rQ.type).join(",");z(`[bridge:repl] Transport not configured, dropping ${JA.length} message(s) [${TA}] for session=${MA}`,{level:"warn"});return}for(let TA of JA)GE.add(TA.uuid);z(`[bridge:repl] Sending ${JA.length} message(s) via transport`);let pA=D(JA).map((TA)=>({...TA,session_id:MA}));NA.writeBatch(pA)},writeSdkMessages(m){let JA=m.filter((pA)=>!pA.uuid||!GE.has(pA.uuid));if(JA.length===0)return;if(!NA){z(`[bridge:repl] Transport not configured, dropping ${JA.length} SDK message(s) for session=${MA}`,{level:"warn"});return}for(let pA of JA)if(pA.uuid)GE.add(pA.uuid);let UQ=JA.map((pA)=>({...pA,session_id:MA}));NA.writeBatch(UQ)},sendControlRequest(m){if(!NA){z("[bridge:repl] Transport not configured, skipping control_request");return}let JA={...m,session_id:MA};NA.write(JA),z(`[bridge:repl] Sent control_request request_id=${m.request_id}`)},sendControlResponse(m){if(!NA){z("[bridge:repl] Transport not configured, skipping control_response");return}let JA={...m,session_id:MA};NA.write(JA),z("[bridge:repl] Sent control_response")},sendControlCancelRequest(m){if(!NA){z("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let JA={type:"control_cancel_request",request_id:m,session_id:MA};NA.write(JA),z(`[bridge:repl] Sent control_cancel_request request_id=${m}`)},reportMetadata(m){NA?.reportMetadata(m)},sendResult(){if(!NA){z(`[bridge:repl] sendResult: skipping, transport not configured session=${MA}`);return}NA.write(cR(MA)),z(`[bridge:repl] Sent result for session=${MA}`)},async subscribePR(m,JA,UQ){let pA=`${m}#${JA}`,TA=YB.get(pA);if(UQ)YB.set(pA,{agentId:UQ,repo:m,prNumber:JA});let rQ=await xD("subscribe",MA,m,JA,J,F);if(rQ)bI.add(pA);else if(UQ)if(TA)YB.set(pA,TA);else YB.delete(pA);return rQ},async unsubscribePR(m,JA){let UQ=await xD("unsubscribe",MA,m,JA,J,F);if(UQ){let pA=`${m}#${JA}`;bI.delete(pA),YB.delete(pA)}return UQ},async subscribeSlackThread(m,JA){let UQ=await OD("subscribe",MA,m,JA,J,F);if(UQ)UC.add(`${m}/${JA}`);return UQ},async unsubscribeSlackThread(m,JA){let UQ=await OD("unsubscribe",MA,m,JA,J,F);if(UQ)UC.delete(`${m}/${JA}`);return UQ},getPRWebhookTargets(){return[...YB.values()]},async teardown(){A0A(),await _D?.(),z("[bridge:repl] Torn down"),rA("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return gW.teardown()}},A0A=c0(gW);return gW}async function pcA({api:A,getCredentials:Q,signal:B,onStateChange:I,onWorkReceived:E,onEnvironmentLost:C,getWsState:Y,isAtCapacity:J,capacitySignal:G,onFatalError:U,getPollIntervalConfig:F=()=>s$,getHeartbeatInfo:N,onHeartbeatFatal:W}){z(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let D=0,w=null,V=null,M=0,j=0,L=!1;while(!B.aborted){let{environmentId:Z,environmentSecret:g}=Q(),T=F();try{let S=await A.pollForWork(Z,g,B,T.reclaim_older_than_ms);if(j=0,D>0)z(`[bridge:repl] Poll recovered after ${D} consecutive error(s)`),D=0,w=null,V=null,M=0,I?.("ready");if(!S){let r=L;if(L=!1,J?.()&&G&&!r){let wA=T.poll_interval_ms_at_capacity;if(T.non_exclusive_heartbeat_interval_ms>0&&N){rA("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:T.non_exclusive_heartbeat_interval_ms});let DA=wA>0?Date.now()+wA:null,BA=!1,PA=0;while(!B.aborted&&J()&&(DA===null||Date.now()<DA)){let b=F();if(b.non_exclusive_heartbeat_interval_ms<=0)break;let VQ=N();if(!VQ)break;let YA=G();try{await A.heartbeatWork(VQ.environmentId,VQ.workId,VQ.sessionToken)}catch($A){if(z(`[bridge:repl:heartbeat] Failed: ${UA($A)}`),$A instanceof YE){if(YA.cleanup(),rA("tengu_bridge_heartbeat_error",{status:$A.status,error_type:$A.status===401||$A.status===403?"auth_failed":"fatal"}),W)W($A),z(`[bridge:repl:heartbeat] Fatal (status=${$A.status}), work state cleared — fast-polling for re-dispatch`);else BA=!0;break}}PA++,await kB(b.non_exclusive_heartbeat_interval_ms,YA.signal),YA.cleanup()}let ZQ=BA?"error":B.aborted?"shutdown":!J()?"capacity_changed":DA!==null&&Date.now()>=DA?"poll_due":"config_disabled";if(rA("tengu_bridge_heartbeat_mode_exited",{reason:ZQ,heartbeat_cycles:PA}),!BA){if(ZQ==="poll_due")z(`[bridge:repl] Heartbeat poll_due after ${PA} cycles — falling through to pollForWork`);continue}}let iA=wA>0?wA:T.non_exclusive_heartbeat_interval_ms;if(iA>0){let DA=G(),BA=Date.now();await kB(iA,DA.signal),DA.cleanup();let PA=Date.now()-BA-iA;if(PA>60000)z(`[bridge:repl] At-capacity sleep overran by ${Math.round(PA/1000)}s — process suspension detected, forcing one fast-poll cycle`),rA("tengu_bridge_repl_suspension_detected",{overrun_ms:PA}),L=!0}}else await kB(T.poll_interval_ms_not_at_capacity,B);continue}let d;try{d=SCA(S.secret)}catch(r){z(`[bridge:repl] Failed to decode work secret: ${UA(r)}`),rA("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(Z,S.id,!1).catch(()=>{});continue}z(`[bridge:repl] Acknowledging workId=${S.id}`);try{await A.acknowledgeWork(Z,S.id,d.session_ingress_token)}catch(r){z(`[bridge:repl] Acknowledge failed workId=${S.id}: ${UA(r)}`)}if(S.data.type==="healthcheck"){z("[bridge:repl] Healthcheck received");continue}if(S.data.type==="session"){let r=S.data.id;try{TI(r,"session_id")}catch{z(`[bridge:repl] Invalid session_id in work: ${r}`);continue}E(r,d.session_ingress_token,S.id,d.use_code_sessions===!0),z("[bridge:repl] Work accepted, continuing poll loop")}}catch(S){if(B.aborted)break;if(S instanceof YE&&S.status===404&&C){let b=Q().environmentId;if(Z!==b){z(`[bridge:repl] Stale poll error for old env=${Z}, current env=${b} — skipping onEnvironmentLost`),D=0,w=null;continue}if(j++,z(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${j}/3)`),rA("tengu_bridge_repl_env_lost",{attempt:j}),j>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 VQ=await C();if(B.aborted)break;if(VQ){D=0,w=null,I?.("ready"),z(`[bridge:repl] Re-registered environment: ${VQ.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(S instanceof YE){let b=LD(S.errorType),VQ=VCA(S);if(z(`[bridge:repl] Fatal poll error: ${S.message} (status=${S.status}, type=${S.errorType??"unknown"})${VQ?" (suppressed)":""}`),rA("tengu_bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),a(b?"info":"error","bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),!VQ)I?.("failed",b?"Remote Control session expired.":S.message);U?.();break}let d=Date.now();if(V!==null&&d-V>Math.max(lCA,M)*2)z(`[bridge:repl] Detected system sleep (${Math.round((d-V)/1000)}s gap), resetting poll error budget`),a("info","bridge_repl_poll_sleep_detected",{gapMs:d-V}),D=0,w=null;if(V=d,D++,w===null)w=d;let r=d-w,wA=$CA(S),iA=FCA(S),DA=Y?.()??"unknown";if(z(`[bridge:repl] Poll error (attempt ${D}, elapsed ${Math.round(r/1000)}s, ws=${DA}): ${iA}`),rA("tengu_bridge_repl_poll_error",{status:wA,consecutiveErrors:D,elapsedMs:r}),D===1)I?.("reconnecting",iA);if(r>=iCA){z(`[bridge:repl] Poll failures exceeded ${iCA/1000}s (${D} errors), giving up`),a("info","bridge_repl_poll_give_up"),rA("tengu_bridge_repl_poll_give_up",{consecutiveErrors:D,elapsedMs:r,lastStatus:wA}),I?.("failed","connection to server lost");break}let BA=WCA(S),PA=Math.min(nCA*2**(D-1),lCA),ZQ=oCA(BA!==void 0?Math.max(PA,Math.min(BA,ucA)):PA);if(M=ZQ,F().non_exclusive_heartbeat_interval_ms>0){let b=N?.();if(b)try{await A.heartbeatWork(b.environmentId,b.workId,b.sessionToken)}catch{}}await kB(ZQ,B)}}z(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function lcA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function icA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function dcA(A,Q){if(icA(A,Q))return"http://localhost:4000";if(lcA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function rCA(A,Q,B){let{toCompatSessionId:I}=Y0A(JCA),E=I(A),Y=`${dcA(E,Q)}/code/${E}`;return B?`${Y}?${new URLSearchParams(B)}`:Y}eA();async function tCA(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:W=!1,initialSSESequenceNum:X,onConflict:D}=A,w=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},j=[],L=null,Z=[],g=null,T=[],S=null,d=!1,r=null,wA={detail:null},iA=ncA(),DA=()=>aCA({dir:Q,registrationDir:B,machineName:iA,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:V,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:w,onInitError:console.error,createSession:({environmentId:YA,title:$A,signal:yQ})=>yCA({environmentId:YA,title:$A,tags:["claude-code-assistant"],signal:yQ},M),archiveSession:(YA)=>fCA(YA,M),perpetual:W,initialSSESequenceNum:X,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...s$,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(YA){let $A=_l(YA);if(!$A)return;j.push({content:$A.content,uuid:$A.uuid}),L?.(),L=null},onInterrupt(){Z.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),g?.(),g=null},onSetModel(YA){Z.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:YA}}),g?.(),g=null},onSetMaxThinkingTokens(YA){Z.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:YA}}),g?.(),g=null},onPermissionResponse(YA){T.push(YA),S?.(),S=null},onStateChange(YA,$A){if(r?.(YA,$A),YA==="failed")wA.detail=$A??"unknown failure",d=!0,L?.(),g?.(),S?.()}}),BA=await DA();if(!BA&&D&&wA.detail?.includes("409")){if(await D({machineName:iA,message:wA.detail})==="takeover")d=!1,wA.detail=null,BA=await DA()}if(!BA){let YA=wA.detail??"initBridgeCore returned null (env registration or session creation failed)";return z(`[bridge:daemon] connectRemoteControl failed: ${YA}`),{ok:!1,error:{kind:wA.detail?.includes("409")?"conflict":wA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:YA}}}async function*PA(){while(!d){while(j.length>0)if(yield j.shift(),d)return;await new Promise((YA)=>{L=YA})}}async function*ZQ(){while(!d){while(Z.length>0)if(yield Z.shift(),d)return;await new Promise((YA)=>{g=YA})}}async function*b(){while(!d){while(T.length>0)if(yield T.shift(),d)return;await new Promise((YA)=>{S=YA})}}return{ok:!0,handle:{get sessionUrl(){return rCA(BA.bridgeSessionId,V)},get environmentId(){return BA.environmentId},get bridgeSessionId(){return BA.bridgeSessionId},getSSESequenceNum(){return BA.getSSESequenceNum()},hasPendingPrompts(){return j.length>0},write(YA){BA.writeSdkMessages([YA])},sendResult(){BA.sendResult()},sendControlRequest(YA){BA.sendControlRequest(YA)},sendControlResponse(YA){BA.sendControlResponse(YA)},sendControlCancelRequest(YA){BA.sendControlCancelRequest(YA)},inboundPrompts:PA,controlRequests:ZQ,permissionResponses:b,onStateChange(YA){r=YA},async teardown(){d=!0,L?.(),g?.(),S?.(),await BA.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var acA=1000,rcA=1e4,tcA=5000,scA=60000,rR=3;function ecA(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 ApA(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"&&Jx(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}function SD(A){if(!A){cI("assistant_worker_start");return}if(A.kind==="auth"||A.kind==="conflict")l0("assistant_worker_start",A.kind);else sB("assistant_worker_start",A.kind)}async function QpA(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:W=()=>{}}=A;W("─── worker start ───");let X=await G?.load(),D={...Q,initialSSESequenceNum:Q.initialSSESequenceNum??X?.lastSSESequenceNum};if(!D.getAccessToken()){let IA={kind:"auth",detail:"getAccessToken returned empty"};return SD(IA),{ok:!1,error:IA}}let w=await tCA(D);if(!w.ok)return W(`bridge connection failed: ${w.error.kind} — ${w.error.detail}`),SD(w.error),{ok:!1,error:w.error};let V=w.handle;W(`bridge connected url=${V.sessionUrl} env=${V.environmentId}`);let M=X?.claudeSessionId,j=V.bridgeSessionId,L=[],Z=null,g=!1,T=null,S=0,d=!0,r=0,wA=Promise.resolve();function iA(){if(!G)return;let IA={claudeSessionId:M,lastSSESequenceNum:V.getSSESequenceNum(),bridgeSessionId:V.bridgeSessionId};wA=wA.then(()=>G.save(IA).catch((BQ)=>{W(`stateAdapter.save threw: ${BQ}`)}))}function DA(){if(L.length>0||V.hasPendingPrompts()){W("persist skipped: prompt queued");return}iA()}iA();let BA=new AbortController,PA=new Map,ZQ=null;function b(){return ZQ??=(async()=>{DA();for(let IA of PA.keys())V.sendControlCancelRequest(IA);PA.clear(),await V.teardown(),await wA})()}if(N.addEventListener("abort",()=>{BA.abort(),b().catch((IA)=>W(`teardown threw: ${IA}`))}),N.aborted){await b();let IA={kind:"unknown",detail:"aborted before start"};return SD(IA),{ok:!1,error:IA}}let VQ="connected";V.onStateChange((IA,BQ)=>{if(W(`bridge state=${IA} detail=${BQ??""}`),VQ=IA,IA==="ready"&&V.bridgeSessionId!==j)j=V.bridgeSessionId,iA();else if(IA==="connected")DA();if(IA==="failed")W(`bridge failed: ${BQ??"unknown"}`),BA.abort(),b().catch((wQ)=>W(`teardown threw: ${wQ}`))});let YA=I?.horizonMs??600000,$A=I?.leadMs??tcA,yQ=null,HQ=!1,AA=!1,f="";async function WA(){if(!I)return;let IA=await gl(I.dir).catch((wQ)=>{return W(`computeCronHorizon threw: ${wQ}`),{nextFire:null,hasOverdue:!1}});yQ=IA.nextFire,AA=IA.hasOverdue;let BQ=IA.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(IA.nextFire).toISOString()} hasOverdue=${IA.hasOverdue}`;if(BQ!==f)f=BQ,W(BQ)}let mA;if(I)await WA(),mA=setInterval(WA,rcA),mA.unref?.();function bA(IA){L.push({type:"user",message:{role:"user",content:IA},parent_tool_use_id:null,session_id:""}),Z?.(),Z=null}async function KB(IA,BQ,wQ){if(C){let YB=await C(IA,BQ,wQ);if(YB)return Y?.(IA,YB),YB}if(VQ!=="connected"){W(`permission denied — bridge state=${VQ}, request would drop`);let YB={behavior:"deny",message:`Cannot request permission: remote control is ${VQ}. Try again in a moment.`};return Y?.(IA,YB),YB}let QA=ocA();W(`permission request tool=${IA} req=${QA}`);let{signal:gE,suggestions:PY,blockedPath:yC,toolUseID:MA}=wQ;V.sendControlRequest({type:"control_request",request_id:QA,request:{subtype:"can_use_tool",tool_name:IA,display_name:Gx(IA),input:BQ,tool_use_id:MA,...PY&&{permission_suggestions:PY},...yC&&{blocked_path:yC},..."decisionReason"in wQ&&wQ.decisionReason&&{decision_reason:wQ.decisionReason},..."agentID"in wQ&&wQ.agentID&&{agent_id:wQ.agentID}}});let bI;try{let YB=await new Promise((S0,GE)=>{PA.set(QA,S0),bI=setTimeout((JG,xB,NA,vE,LQ)=>{if(JG.delete(xB))NA(`permission timeout req=${xB}`),vE.sendControlCancelRequest(xB),LQ({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},scA,PA,QA,W,V,S0),bI.unref?.(),gE.addEventListener("abort",()=>{if(PA.delete(QA))V.sendControlCancelRequest(QA);GE(Error("aborted"))},{once:!0})});W(`permission response req=${QA} behavior=${YB.behavior}`);let UC=YB.behavior==="allow"?{behavior:"allow",updatedInput:YB.updatedInput,updatedPermissions:YB.updatedPermissions}:{behavior:"deny",message:YB.message??"Denied via remote control"};return Y?.(IA,UC),UC}finally{if(bI)clearTimeout(bI);PA.delete(QA)}}let iQ=!1;async function GQ(){if(T!==null||iQ||BA.signal.aborted)return;if(iQ=!0,g=!1,L.length>0)d=!1;async function*IA(){while(!g){while(L.length>0)if(d=!1,yield L.shift(),g)return;await new Promise((QA)=>{Z=QA})}}W(`spawning query resume=${M??"<fresh>"}`);let BQ={assistant:!0,cwd:Q.dir,resume:M,stderr:(QA)=>W(`[child] ${QA.trimEnd()}`),canUseTool:KB},wQ;try{if(wQ=await E(BQ),B)wQ={...wQ,env:{...wQ.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(QA){if(W(`buildQueryOptions threw: ${QA}`),iQ=!1,r++,r>=rR)W(`${r} consecutive buildQueryOptions failures — dropping ${L.length} queued input(s)`),L.length=0;else if(L.length>0&&!BA.signal.aborted)GQ();return}if(BA.signal.aborted){iQ=!1;return}try{T=Kc({prompt:IA(),options:wQ})}finally{iQ=!1}(async()=>{try{W("output pump started");for await(let QA of T){if(QA.type==="system"&&QA.subtype==="init"){if(QA.session_id!==M)M=QA.session_id,DA()}if(QA.type==="result")d=!0,r=0,HQ=!0,DA();if(!ecA(QA))continue;let gE=J?J(QA):QA;if(gE===null)continue;V.write(gE)}}catch(QA){W(`query threw: ${QA}`),r++}finally{W("output pump ended"),T=null;for(let QA of PA.keys())V.sendControlCancelRequest(QA);if(PA.clear(),L.length>0&&!BA.signal.aborted)if(r>=rR)W(`${r} consecutive crashes — dropping ${L.length} queued input(s)`),L.length=0;else GQ()}})()}let kI=setInterval(()=>{let IA=Date.now(),BQ=yQ!==null&&yQ-IA<YA;if(T===null){let wQ=yQ!==null&&yQ-IA<$A;if((wQ||AA&&!HQ)&&r<rR&&!BA.signal.aborted)W(wQ?`cron due in ${yQ-IA}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),GQ();return}if(g)return;if(!d||L.length>0)return;if(IA-S<F)return;if(BQ)return;if(AA&&!HQ)return;W("idle conditions met → closing input gen"),DA(),g=!0,Z?.(),Z=null},acA);if(kI.unref?.(),U)W("initialPrompt → injecting"),S=Date.now(),bA(U),GQ();let JE=(async()=>{if(await Promise.all([(async()=>{for await(let IA of V.inboundPrompts()){if(BA.signal.aborted)return;if(W("bridge prompt received"),S=Date.now(),IA.uuid)V.write({type:"user",uuid:IA.uuid,session_id:"",message:{role:"user",content:IA.content},parent_tool_use_id:null});bA(IA.content),GQ()}})(),(async()=>{for await(let IA of V.controlRequests()){if(BA.signal.aborted)return;switch(IA.request.subtype){case"interrupt":W("bridge interrupt"),T?.interrupt();break;case"set_model":W(`bridge setModel=${IA.request.model??"<default>"}`),T?.setModel(IA.request.model);break;case"set_max_thinking_tokens":W(`bridge setMaxThinkingTokens=${IA.request.max_thinking_tokens}`),T?.setMaxThinkingTokens(IA.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let IA of V.permissionResponses()){if(BA.signal.aborted)return;let BQ=ApA(IA,PA,V.sendControlCancelRequest);if(BQ)W(`permission response for unknown req=${BQ} (stale)`)}})()]),clearInterval(kI),mA)clearInterval(mA);T?.close(),await b(),W("─── worker stop ───")})(),QQ={get sessionUrl(){return V.sessionUrl},get bridgeSessionId(){return V.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(IA){S=Date.now(),bA(IA),GQ()},async interrupt(){await T?.interrupt()},done:JE,teardown:b,[Symbol.asyncDispose]:b};return SD(null),{ok:!0,handle:QQ}}export{QpA as runAssistantWorker};
|