@anthropic-ai/claude-agent-sdk 0.2.136 → 0.2.137
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 +11 -11
- 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.2.
|
|
3
|
+
// Version: 0.2.137
|
|
4
4
|
import{createRequire as SCA}from"node:module";var LCA=Object.create;var{getPrototypeOf:qCA,defineProperty:r1,getOwnPropertyNames:nR,getOwnPropertyDescriptor:jCA}=Object,oR=Object.prototype.hasOwnProperty;function aR(A){return this[A]}var RCA,xCA,S0=(A,Q,B)=>{var I=A!=null&&typeof A==="object";if(I){var E=Q?RCA??=new WeakMap:xCA??=new WeakMap,C=E.get(A);if(C)return C}B=A!=null?LCA(qCA(A)):{};let Y=Q||!A||!A.__esModule?r1(B,"default",{value:A,enumerable:!0}):B;for(let J of nR(A))if(!oR.call(Y,J))r1(Y,J,{get:aR.bind(A,J),enumerable:!0});if(I)E.set(A,Y);return Y},OCA=(A)=>{var Q=(dR??=new WeakMap).get(A),B;if(Q)return Q;if(Q=r1({},"__esModule",{value:!0}),A&&typeof A==="object"||typeof A==="function"){for(var I of nR(A))if(!oR.call(Q,I))r1(Q,I,{get:aR.bind(A,I),enumerable:!(B=jCA(A,I))||B.enumerable})}return dR.set(A,Q),Q},dR,K=(A,Q)=>()=>(Q||A((Q={exports:{}}).exports,Q),Q.exports);var gCA=(A)=>A;function vCA(A,Q){this[A]=gCA.bind(null,Q)}var _E=(A,Q)=>{for(var B in Q)r1(A,B,{get:Q[B],enumerable:!0,configurable:!0,set:vCA.bind(Q,B)})};var Z=(A,Q)=>()=>(A&&(Q=A(A=0)),Q);var O=SCA(import.meta.url),_CA=Symbol.dispose||Symbol.for("Symbol.dispose"),PCA=Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose"),gQ=(A,Q,B)=>{if(Q!=null){if(typeof Q!=="object"&&typeof Q!=="function")throw TypeError('Object expected to be assigned to "using" declaration');var I;if(B)I=Q[PCA];if(I===void 0)I=Q[_CA];if(typeof I!=="function")throw TypeError("Object not disposable");A.push([B,I,Q])}else if(B)A.push([B]);return Q},vQ=(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 g2=()=>{};function AQ(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 A4(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 _Y(){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 eR=()=>{};var Q4=Z(()=>{eR()});var mCA,Ax;var Qx=Z(()=>{mCA=typeof global=="object"&&global&&global.Object===Object&&global,Ax=mCA});var cCA,uCA,EG;var x9=Z(()=>{Qx();cCA=typeof self=="object"&&self&&self.Object===Object&&self,uCA=Ax||cCA||Function("return this")(),EG=uCA});var pCA,CG;var v2=Z(()=>{x9();pCA=EG.Symbol,CG=pCA});function dCA(A){var Q=lCA.call(A,B4),B=A[B4];try{A[B4]=void 0;var I=!0}catch(C){}var E=iCA.call(A);if(I)if(Q)A[B4]=B;else delete A[B4];return E}var Bx,lCA,iCA,B4,Ix;var Ex=Z(()=>{v2();Bx=Object.prototype,lCA=Bx.hasOwnProperty,iCA=Bx.toString,B4=CG?CG.toStringTag:void 0;Ix=dCA});function aCA(A){return oCA.call(A)}var nCA,oCA,Cx;var Yx=Z(()=>{nCA=Object.prototype,oCA=nCA.toString;Cx=aCA});function sCA(A){if(A==null)return A===void 0?tCA:rCA;return Jx&&Jx in Object(A)?Ix(A):Cx(A)}var rCA="[object Null]",tCA="[object Undefined]",Jx,Gx;var Ux=Z(()=>{v2();Ex();Yx();Jx=CG?CG.toStringTag:void 0;Gx=sCA});function eCA(A){var Q=typeof A;return A!=null&&(Q=="object"||Q=="function")}var O9;var S2=Z(()=>{O9=eCA});function E0A(A){if(!O9(A))return!1;var Q=Gx(A);return Q==Q0A||Q==B0A||Q==A0A||Q==I0A}var A0A="[object AsyncFunction]",Q0A="[object Function]",B0A="[object GeneratorFunction]",I0A="[object Proxy]",Fx;var $x=Z(()=>{Ux();S2();Fx=E0A});var C0A,g9;var Wx=Z(()=>{x9();C0A=EG["__core-js_shared__"],g9=C0A});function Y0A(A){return!!Nx&&Nx in A}var Nx,Xx;var Dx=Z(()=>{Wx();Nx=function(){var A=/[^.]+$/.exec(g9&&g9.keys&&g9.keys.IE_PROTO||"");return A?"Symbol(src)_1."+A:""}();Xx=Y0A});function U0A(A){if(A!=null){try{return G0A.call(A)}catch(Q){}try{return A+""}catch(Q){}}return""}var J0A,G0A,Vx;var wx=Z(()=>{J0A=Function.prototype,G0A=J0A.toString;Vx=U0A});function w0A(A){if(!O9(A)||Xx(A))return!1;var Q=Fx(A)?V0A:$0A;return Q.test(Vx(A))}var F0A,$0A,W0A,N0A,X0A,D0A,V0A,Mx;var Kx=Z(()=>{$x();Dx();S2();wx();F0A=/[\\^$.*+?()[\]{}|]/g,$0A=/^\[object .+?Constructor\]$/,W0A=Function.prototype,N0A=Object.prototype,X0A=W0A.toString,D0A=N0A.hasOwnProperty,V0A=RegExp("^"+X0A.call(D0A).replace(F0A,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");Mx=w0A});function M0A(A,Q){return A==null?void 0:A[Q]}var zx;var Hx=Z(()=>{zx=M0A});function K0A(A,Q){var B=zx(A,Q);return Mx(B)?B:void 0}var v9;var _2=Z(()=>{Kx();Hx();v9=K0A});var z0A,yC;var I4=Z(()=>{_2();z0A=v9(Object,"create"),yC=z0A});function H0A(){this.__data__=yC?yC(null):{},this.size=0}var Zx;var Lx=Z(()=>{I4();Zx=H0A});function Z0A(A){var Q=this.has(A)&&delete this.__data__[A];return this.size-=Q?1:0,Q}var qx;var jx=Z(()=>{qx=Z0A});function R0A(A){var Q=this.__data__;if(yC){var B=Q[A];return B===L0A?void 0:B}return j0A.call(Q,A)?Q[A]:void 0}var L0A="__lodash_hash_undefined__",q0A,j0A,Rx;var xx=Z(()=>{I4();q0A=Object.prototype,j0A=q0A.hasOwnProperty;Rx=R0A});function g0A(A){var Q=this.__data__;return yC?Q[A]!==void 0:O0A.call(Q,A)}var x0A,O0A,Ox;var gx=Z(()=>{I4();x0A=Object.prototype,O0A=x0A.hasOwnProperty;Ox=g0A});function S0A(A,Q){var B=this.__data__;return this.size+=this.has(A)?0:1,B[A]=yC&&Q===void 0?v0A:Q,this}var v0A="__lodash_hash_undefined__",vx;var Sx=Z(()=>{I4();vx=S0A});function YG(A){var Q=-1,B=A==null?0:A.length;this.clear();while(++Q<B){var I=A[Q];this.set(I[0],I[1])}}var P2;var _x=Z(()=>{Lx();jx();xx();gx();Sx();YG.prototype.clear=Zx;YG.prototype.delete=qx;YG.prototype.get=Rx;YG.prototype.has=Ox;YG.prototype.set=vx;P2=YG});function _0A(){this.__data__=[],this.size=0}var Px;var Tx=Z(()=>{Px=_0A});function P0A(A,Q){return A===Q||A!==A&&Q!==Q}var kx;var bx=Z(()=>{kx=P0A});function T0A(A,Q){var B=A.length;while(B--)if(kx(A[B][0],Q))return B;return-1}var _0;var E4=Z(()=>{bx();_0=T0A});function y0A(A){var Q=this.__data__,B=_0(Q,A);if(B<0)return!1;var I=Q.length-1;if(B==I)Q.pop();else b0A.call(Q,B,1);return--this.size,!0}var k0A,b0A,yx;var fx=Z(()=>{E4();k0A=Array.prototype,b0A=k0A.splice;yx=y0A});function f0A(A){var Q=this.__data__,B=_0(Q,A);return B<0?void 0:Q[B][1]}var hx;var mx=Z(()=>{E4();hx=f0A});function h0A(A){return _0(this.__data__,A)>-1}var cx;var ux=Z(()=>{E4();cx=h0A});function m0A(A,Q){var B=this.__data__,I=_0(B,A);if(I<0)++this.size,B.push([A,Q]);else B[I][1]=Q;return this}var px;var lx=Z(()=>{E4();px=m0A});function JG(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 ix;var dx=Z(()=>{Tx();fx();mx();ux();lx();JG.prototype.clear=Px;JG.prototype.delete=yx;JG.prototype.get=hx;JG.prototype.has=cx;JG.prototype.set=px;ix=JG});var c0A,nx;var ox=Z(()=>{_2();x9();c0A=v9(EG,"Map"),nx=c0A});function u0A(){this.size=0,this.__data__={hash:new P2,map:new(nx||ix),string:new P2}}var ax;var rx=Z(()=>{_x();dx();ox();ax=u0A});function p0A(A){var Q=typeof A;return Q=="string"||Q=="number"||Q=="symbol"||Q=="boolean"?A!=="__proto__":A===null}var tx;var sx=Z(()=>{tx=p0A});function l0A(A,Q){var B=A.__data__;return tx(Q)?B[typeof Q=="string"?"string":"hash"]:B.map}var P0;var C4=Z(()=>{sx();P0=l0A});function i0A(A){var Q=P0(this,A).delete(A);return this.size-=Q?1:0,Q}var ex;var AO=Z(()=>{C4();ex=i0A});function d0A(A){return P0(this,A).get(A)}var QO;var BO=Z(()=>{C4();QO=d0A});function n0A(A){return P0(this,A).has(A)}var IO;var EO=Z(()=>{C4();IO=n0A});function o0A(A,Q){var B=P0(this,A),I=B.size;return B.set(A,Q),this.size+=B.size==I?0:1,this}var CO;var YO=Z(()=>{C4();CO=o0A});function GG(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 T2;var JO=Z(()=>{rx();AO();BO();EO();YO();GG.prototype.clear=ax;GG.prototype.delete=ex;GG.prototype.get=QO;GG.prototype.has=IO;GG.prototype.set=CO;T2=GG});function k2(A,Q){if(typeof A!="function"||Q!=null&&typeof Q!="function")throw TypeError(a0A);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(k2.Cache||T2),B}var a0A="Expected a function",XQ;var PE=Z(()=>{JO();k2.Cache=T2;XQ=k2});import{homedir as r0A}from"os";import{join as t0A}from"path";function b2(A){let Q=process.env.NODE_OPTIONS;if(!Q)return!1;return Q.split(/\s+/).includes(A)}function GO(){return!1}function UO(){return{namespace:void 0,cluster:void 0}}var FE;var CB=Z(()=>{Q4();PE();Q4();FE=XQ(()=>{return(process.env.CLAUDE_CONFIG_DIR??t0A(r0A(),".claude")).normalize("NFC")},()=>process.env.CLAUDE_CONFIG_DIR)});function i(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 fC=()=>{};var y2=function(){let{crypto:A}=globalThis;if(A?.randomUUID)return y2=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 hC(A){return typeof A==="object"&&A!==null&&(("name"in A)&&A.name==="AbortError"||("message"in A)&&String(A.message).includes("FetchRequestCanceledException"))}var Y4=(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 r,xB,mB,PY,J4,G4,U4,F4,$4,W4,N4,X4,D4;var cB=Z(()=>{r=class r extends Error{};xB=class xB extends r{constructor(A,Q,B,I,E){super(`${xB.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 PY({message:B,cause:Y4(Q)});let E=Q,C=E?.error?.type;if(A===400)return new G4(A,E,B,I,C);if(A===401)return new U4(A,E,B,I,C);if(A===403)return new F4(A,E,B,I,C);if(A===404)return new $4(A,E,B,I,C);if(A===409)return new W4(A,E,B,I,C);if(A===422)return new N4(A,E,B,I,C);if(A===429)return new X4(A,E,B,I,C);if(A>=500)return new D4(A,E,B,I,C);return new xB(A,E,B,I,C)}};mB=class mB extends xB{constructor({message:A}={}){super(void 0,void 0,A||"Request was aborted.",void 0)}};PY=class PY extends xB{constructor({message:A,cause:Q}){super(void 0,void 0,A||"Connection error.",void 0);if(Q)this.cause=Q}};J4=class J4 extends PY{constructor({message:A}={}){super({message:A??"Request timed out."})}};G4=class G4 extends xB{};U4=class U4 extends xB{};F4=class F4 extends xB{};$4=class $4 extends xB{};W4=class W4 extends xB{};N4=class N4 extends xB{};X4=class X4 extends xB{};D4=class D4 extends xB{}});function S9(A){if(typeof A!=="object")return{};return A??{}}function m2(A){if(!A)return!0;for(let Q in A)return!1;return!0}function $O(A,Q){return Object.prototype.hasOwnProperty.call(A,Q)}var e0A,FO=(A)=>{return e0A.test(A)},f2=(A)=>(f2=Array.isArray,f2(A)),h2,WO=(A,Q)=>{if(typeof Q!=="number"||!Number.isInteger(Q))throw new r(`${A} must be an integer`);if(Q<0)throw new r(`${A} must be a positive integer`);return Q},_9=(A)=>{try{return JSON.parse(A)}catch(Q){return}};var T0=Z(()=>{cB();e0A=/^[a-z][a-z0-9+.-]*:/i,h2=f2});var NO=(A)=>new Promise((Q)=>setTimeout(Q,A));var $E="0.93.0";function AYA(){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 BYA(){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 wO=()=>{return typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u"},QYA=()=>{let A=AYA();if(A==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":$E,"X-Stainless-OS":DO(Deno.build.os),"X-Stainless-Arch":XO(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":DO(globalThis.process.platform??"unknown"),"X-Stainless-Arch":XO(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let Q=BYA();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"}},XO=(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"},DO=(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"},VO,V4=()=>{return VO??(VO=QYA())};var P9=()=>{};function MO(){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 c2(...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 T9(A){let Q=Symbol.asyncIterator in A?A[Symbol.asyncIterator]():A[Symbol.iterator]();return c2({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 w4(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 KO(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 zO=({headers:A,body:Q})=>{return{bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(Q)}};function HO(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 r(`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 u2=Z(()=>{cB()});function b9(A){if(!A)return;let Q;try{Q=new URL(A)}catch(I){throw new zQ(`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 zQ(`Refusing to send credential over non-https token endpoint "${A}"`)}async function y9(A,Q){let B=await YYA(A),I;try{I=JSON.parse(B)}catch{throw new zQ(`Token endpoint returned non-JSON response (status ${A.status})`,A.status,MI(B),Q)}if(!I.access_token)throw new zQ(`Token endpoint response missing access_token: ${JSON.stringify(MI(I))}`,A.status,MI(I),Q);if(I.token_type&&I.token_type.toLowerCase()!=="bearer")throw new zQ(`Token endpoint response: unsupported token_type "${I.token_type}" (want Bearer)`,A.status,MI(I),Q);return I}function MI(A){if(A==null)return A;if(typeof A==="string"){let Q;try{Q=JSON.parse(A)}catch{if(A.length<=p2)return A;return A.slice(0,p2)+`... <${A.length-p2} more chars>`}return JSON.stringify(MI(Q))}if(typeof A==="object"&&!Array.isArray(A)){let Q={};for(let[B,I]of Object.entries(A))if(CYA.has(B))Q[B]=I;return Q}return null}async function f9(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 zQ(`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 zQ(`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 h9(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 YYA(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>ZO){let J=ZO-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 LO="urn:ietf:params:oauth:grant-type:jwt-bearer",qO="refresh_token",k9="/v1/oauth/token",TY="oauth-2025-04-20",jO="oidc-federation-2026-04-01",RO=120,UG=30,xO=5,ZO=1048576,p2=2000,CYA,zQ;var FG=Z(()=>{cB();CYA=new Set(["error","error_description","error_uri"]);zQ=class zQ extends r{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 l2{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>RO)return Q.token;if(B>UG)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<xO)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 OO=Z(()=>{FG()});var jQ=(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 SO(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 $G(A){let Q;return(gO??(Q=new globalThis.TextEncoder,gO=Q.encode.bind(Q)))(A)}function i2(A){let Q;return(vO??(Q=new globalThis.TextDecoder,vO=Q.decode.bind(Q)))(A)}var gO,vO;var _O=Z(()=>{cB()});function M4(){}function m9(A,Q,B){if(!Q||c9[A]>c9[B])return M4;else return Q[A].bind(Q)}function WB(A){let Q=A.logger,B=A.logLevel??"off";if(!Q)return JYA;let I=PO.get(Q);if(I&&I[0]===B)return I[1];let E={error:m9("error",Q,B),warn:m9("warn",Q,B),info:m9("info",Q,B),debug:m9("debug",Q,B)};return PO.set(Q,[B,E]),E}var c9,d2=(A,Q,B)=>{if(!A)return;if($O(c9,A))return A;WB(B).warn(`${Q} was set to ${JSON.stringify(A)}, expected one of ${JSON.stringify(Object.keys(c9))}`);return},JYA,PO,mC=(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 K4=Z(()=>{T0();c9={off:0,error:200,warn:300,info:400,debug:500};JYA={error:M4,warn:M4,info:M4,debug:M4},PO=new WeakMap});var TO=Z(()=>{T0();_O();K4();u2()});function kO(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(!GYA.test(A))throw Error(`profile name "${A}" contains disallowed characters (allowed: letters, digits, '_', '.', '-')`)}var u9="1.0",GYA,bO=async(A)=>{var Q,B;let I=await n2();if(I===null)return null;let E=A??await fO();if(E===null)return null;kO(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(W){if(W?.code!=="ENOENT")throw Error(`failed to read config file ${J}: ${W}`);G=null}if(G===null){let W=jQ("ANTHROPIC_ORGANIZATION_ID"),N=jQ("ANTHROPIC_IDENTITY_TOKEN_FILE"),D=jQ("ANTHROPIC_FEDERATION_RULE_ID");if(D&&W)return{organization_id:W,base_url:jQ("ANTHROPIC_BASE_URL"),authentication:{type:"oidc_federation",federation_rule_id:D,service_account_id:jQ("ANTHROPIC_SERVICE_ACCOUNT_ID"),identity_token:N?{source:"file",path:N}:void 0,scope:jQ("ANTHROPIC_SCOPE")}};return null}let U;try{U=JSON.parse(G)}catch(W){throw Error(`failed to parse config file ${J}: ${W}`)}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=jQ("ANTHROPIC_ORGANIZATION_ID")),U.base_url??(U.base_url=jQ("ANTHROPIC_BASE_URL")),(Q=U.authentication).scope??(Q.scope=jQ("ANTHROPIC_SCOPE")),U.authentication.type==="oidc_federation"){if(!U.authentication.identity_token){let W=jQ("ANTHROPIC_IDENTITY_TOKEN_FILE");if(W)U.authentication.identity_token={source:"file",path:W}}if(!U.authentication.federation_rule_id)U.authentication.federation_rule_id=jQ("ANTHROPIC_FEDERATION_RULE_ID")??"";(B=U.authentication).service_account_id??(B.service_account_id=jQ("ANTHROPIC_SERVICE_ACCOUNT_ID"))}return U},yO=async(A,Q)=>{if(A?.authentication.credentials_path)return A.authentication.credentials_path;let B=await n2();if(!B)return null;let I=Q??await fO();if(!I)return null;return kO(I),(await import("node:path")).join(B,"credentials",`${I}.json`)},n2=async()=>{if(!UYA())return null;let A=await import("node:path"),Q=jQ("ANTHROPIC_CONFIG_DIR");if(Q)return Q;if(V4()["X-Stainless-OS"]==="Windows"){let C=jQ("APPDATA");if(C)return A.join(C,"Anthropic");let Y=jQ("USERPROFILE");if(Y)return A.join(Y,"AppData","Roaming","Anthropic");return null}let I=jQ("XDG_CONFIG_HOME");if(I)return A.join(I,"anthropic");let E=jQ("HOME");if(E)return A.join(E,".config","anthropic");return null},UYA=()=>{let A=V4()["X-Stainless-Runtime"];return A==="node"||A==="deno"},fO=async()=>{let A=await n2();if(!A)return null;let Q=jQ("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 o2=Z(()=>{P9();TO();GYA=/^[A-Za-z0-9_.-]+$/});function a2(A){if(!A)throw new r("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 r(`Failed to read identity token file at ${A}: ${E}`)}let I=B.trim();if(!I)throw new r(`Identity token file at ${A} is empty`);return I}}function hO(A){if(!A)throw new r("Identity token value is empty");return()=>A}var mO=Z(()=>{cB()});function cO(A){return async()=>{b9(A.baseURL);let Q=await A.identityTokenProvider();if(Q.length>16384)throw new zQ(`Identity token is ${Math.ceil(Q.length/1024)} KiB, exceeds the 16 KiB assertion limit`);let B={grant_type:LO,assertion:Q,federation_rule_id:A.federationRuleId,organization_id:A.organizationId};if(A.serviceAccountId)B.service_account_id=A.serviceAccountId;let I=`${A.baseURL}${k9}`,E;try{E=await A.fetch(I,{method:"POST",headers:{"Content-Type":"application/json","anthropic-beta":`${TY},${jO}`,"User-Agent":A.userAgent||`anthropic-sdk-typescript/${$E} oidcFederationProvider`},body:JSON.stringify(B)})}catch(G){throw new zQ(`Failed to reach token endpoint ${I}: ${G}`)}let C=E.headers.get("Request-Id");if(!E.ok){let G=await E.text().catch(()=>""),U=MI(G);throw new zQ(`Token exchange failed with status ${E.status}${C?` (request-id ${C})`:""}: ${U}`,E.status,U,C)}let Y=await y9(E,C),J=Number(Y.expires_in);if(!Number.isFinite(J))throw new zQ(`Token endpoint response missing required fields: ${JSON.stringify(MI(Y))}`,E.status,MI(Y),C);return{token:Y.access_token,expiresAt:TE()+J}}}var uO=Z(()=>{FG()});function pO(A){return async(Q)=>{let B=await import("node:fs");await f9(A.credentialsPath,A.onSafetyWarning);let I;try{I=await B.promises.readFile(A.credentialsPath,"utf-8")}catch(V){throw new zQ(`Credentials file not found at ${A.credentialsPath}: ${V}`)}let E;try{E=JSON.parse(I)}catch(V){throw new zQ(`Credentials file at ${A.credentialsPath} is not valid JSON: ${V}`)}let C=E.access_token;if(!C)throw new zQ(`Credentials file at ${A.credentialsPath} must include 'access_token'`);let Y=E.expires_at;if(!Q?.forceRefresh&&(Y==null||TE()<Y-UG))return{token:C,expiresAt:Y??null};let J=E.refresh_token;if(!A.clientId||!J)throw new zQ(`Access token at ${A.credentialsPath} has expired and no refresh is available (client_id ${A.clientId?"set":"empty"}, refresh_token ${J?"set":"empty"})`);b9(A.baseURL);let G={grant_type:qO,refresh_token:J,client_id:A.clientId},U=`${A.baseURL}${k9}`,F;try{F=await A.fetch(U,{method:"POST",headers:{"Content-Type":"application/json","anthropic-beta":TY,"User-Agent":A.userAgent||`anthropic-sdk-typescript/${$E} userOAuthProvider`},body:JSON.stringify(G)})}catch(V){throw new zQ(`User OAuth refresh failed to reach token endpoint: ${V}`)}let W=F.headers.get("Request-Id");if(!F.ok){let V=await F.text().catch(()=>"");throw new zQ(`User OAuth refresh failed (HTTP ${F.status}): ${MI(V)}`,F.status,MI(V),W)}let N=await y9(F,W),D=Number(N.expires_in);if(!Number.isFinite(D))throw new zQ(`User OAuth refresh response missing or invalid expires_in: ${JSON.stringify(MI(N))}`,F.status,MI(N),W);let X=TE()+D,w=N.refresh_token||J;return await h9(A.credentialsPath,{...E,version:u9,type:"oauth_token",access_token:N.access_token,expires_at:X,refresh_token:w}),{token:N.access_token,expiresAt:X}}}var lO=Z(()=>{o2();FG()});function r2(A,Q){let B=A.authentication.credentials_path??null,I=(A.base_url||Q.baseURL).replace(/\/+$/,""),E=FYA(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 iO(A,Q){let B=await bO(Q);if(!B)return null;let I=B.authentication.credentials_path?B:{...B,authentication:{...B.authentication,credentials_path:await yO(B,Q)??void 0}};return r2(I,A)}function FYA(A,Q,B,I){switch(A.authentication.type){case"oidc_federation":{let E=A.authentication,C=$YA(E);if(!C)throw new zQ("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 zQ("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 zQ("oidc_federation config requires organization_id (set ANTHROPIC_ORGANIZATION_ID or config.organization_id)");let Y=cO({identityTokenProvider:C,federationRuleId:E.federation_rule_id,organizationId:A.organization_id,serviceAccountId:E.service_account_id,baseURL:B,fetch:I.fetch,userAgent:I.userAgent});if(Q)return WYA(Y,Q,I.onCacheWriteError,I.onSafetyWarning);return Y}case"user_oauth":{if(!Q)throw new zQ("user_oauth config requires authentication.credentials_path (or load via a profile so it defaults to <config_dir>/credentials/<profile>.json)");return pO({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 zQ(`authentication.type "${E}" is not a known authentication type`)}}}function $YA(A){if(A.identity_token){let I=A.identity_token.source;if(I!=="file")throw new zQ(`identity_token.source "${I}" is not supported by this SDK version (only "file")`);if(!A.identity_token.path)throw new zQ('identity_token.source "file" requires a non-empty path');return a2(A.identity_token.path)}let Q=jQ("ANTHROPIC_IDENTITY_TOKEN_FILE");if(Q)return a2(Q);let B=jQ("ANTHROPIC_IDENTITY_TOKEN");if(B)return hO(B);return null}function WYA(A,Q,B,I){return async(E)=>{let C=await import("node:fs");await f9(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-UG)return{token:U,expiresAt:F??null}}}catch(G){if(G?.code!=="ENOENT"&&!(G instanceof SyntaxError))B?.(G)}let J=await A(E);try{await h9(Q,{...Y??{},version:u9,type:"oauth_token",access_token:J.token,expires_at:J.expiresAt})}catch(G){B?.(G)}return J}}var dO=Z(()=>{o2();FG();mO();uO();lO()});class k0{constructor(){mI.set(this,void 0),cI.set(this,void 0),i(this,mI,new Uint8Array,"f"),i(this,cI,null,"f")}decode(A){if(A==null)return[];let Q=A instanceof ArrayBuffer?new Uint8Array(A):typeof A==="string"?$G(A):A;i(this,mI,SO([x(this,mI,"f"),Q]),"f");let B=[],I;while((I=NYA(x(this,mI,"f"),x(this,cI,"f")))!=null){if(I.carriage&&x(this,cI,"f")==null){i(this,cI,I.index,"f");continue}if(x(this,cI,"f")!=null&&(I.index!==x(this,cI,"f")+1||I.carriage)){B.push(i2(x(this,mI,"f").subarray(0,x(this,cI,"f")-1))),i(this,mI,x(this,mI,"f").subarray(x(this,cI,"f")),"f"),i(this,cI,null,"f");continue}let E=x(this,cI,"f")!==null?I.preceding-1:I.preceding,C=i2(x(this,mI,"f").subarray(0,E));B.push(C),i(this,mI,x(this,mI,"f").subarray(I.index),"f"),i(this,cI,null,"f")}return B}flush(){if(!x(this,mI,"f").length)return[];return this.decode(`
|
|
5
5
|
`)}}function NYA(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 nO(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 mI,cI;var t2=Z(()=>{fC();mI=new WeakMap,cI=new WeakMap;k0.NEWLINE_CHARS=new Set([`
|
|
6
6
|
`,"\r"]);k0.NEWLINE_REGEXP=/\r\n|[\n\r]/g});async function*XYA(A,Q){if(!A.body){if(Q.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative")throw new r("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 r("Attempted to iterate over a response with no body")}let B=new oO,I=new k0,E=w4(A.body);for await(let C of DYA(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*DYA(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"?$G(B):B,E=new Uint8Array(Q.length+I.length);E.set(Q),E.set(I,Q.length),Q=E;let C;while((C=nO(Q))!==-1)yield Q.slice(0,C),Q=Q.slice(C)}if(Q.length>0)yield Q}class oO{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(`
|
|
@@ -175,7 +175,7 @@ ${E}`;break;case"retry":if(uIA(E))Q[I]=E;break;case"id":if(pIA(E))Q[I]=E;break;c
|
|
|
175
175
|
`+E}catch(C){}}throw B}}_request(A,Q){if(typeof A==="string")Q=Q||{},Q.url=A;else Q=A||{};Q=sE(this.defaults,Q);let{transitional:B,paramsSerializer:I,headers:E}=Q;if(B!==void 0)WW.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(L.isFunction(I))Q.paramsSerializer={serialize:I};else WW.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;WW.assertOptions(Q,{baseUrl:ZE.spelling("baseURL"),withXsrfToken:ZE.spelling("withXSRFToken")},!0),Q.method=(Q.method||this.defaults.method||"get").toLowerCase();let C=E&&L.merge(E.common,E[Q.method]);E&&L.forEach(["delete","get","head","post","put","patch","common"],(D)=>{delete E[D]}),Q.headers=AB.concat(C,E);let Y=[],J=!0;this.interceptors.request.forEach(function(X){if(typeof X.runWhen==="function"&&X.runWhen(Q)===!1)return;J=J&&X.synchronous;let w=Q.transitional||JY;if(w&&w.legacyInterceptorReqResOrdering)Y.unshift(X.fulfilled,X.rejected);else Y.push(X.fulfilled,X.rejected)});let G=[];this.interceptors.response.forEach(function(X){G.push(X.fulfilled,X.rejected)});let U,F=0,W;if(!J){let D=[zD.bind(this),void 0];D.unshift(...Y),D.push(...G),W=D.length,U=Promise.resolve(Q);while(F<W)U=U.then(D[F++],D[F++]);return U}W=Y.length;let N=Q;while(F<W){let D=Y[F++],X=Y[F++];try{N=D(N)}catch(w){X.call(this,w);break}}try{U=zD.call(this,N)}catch(D){return Promise.reject(D)}F=0,W=G.length;while(F<W)U=U.then(G[F++],G[F++]);return U}getUri(A){A=sE(this.defaults,A);let Q=LJ(A.baseURL,A.url,A.allowAbsoluteUrls);return ZJ(Q,A.params,A.paramsSerializer)}}L.forEach(["delete","get","head","options"],function(Q){NW.prototype[Q]=function(B,I){return this.request(sE(I||{},{method:Q,url:B,data:(I||{}).data}))}});L.forEach(["post","put","patch"],function(Q){function B(I){return function(C,Y,J){return this.request(sE(J||{},{method:Q,headers:I?{"Content-Type":"multipart/form-data"}:{},url:C,data:Y}))}}NW.prototype[Q]=B(),NW.prototype[Q+"Form"]=B(!0)});var XW=NW;class hL{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 tI(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 hL(function(I){A=I}),cancel:A}}}var pn=hL;function mL(A){return function(B){return A.apply(null,B)}}function cL(A){return L.isObject(A)&&A.isAxiosError===!0}var uL={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(uL).forEach(([A,Q])=>{uL[Q]=A});var ln=uL;function dn(A){let Q=new XW(A),B=o$(XW.prototype.request,Q);return L.extend(B,XW.prototype,Q,{allOwnKeys:!0}),L.extend(B,Q,null,{allOwnKeys:!0}),B.create=function(E){return dn(sE(A,E))},B}var HB=dn(uU);HB.Axios=XW;HB.CanceledError=tI;HB.CancelToken=pn;HB.isCancel=CW;HB.VERSION=OJ;HB.toFormData=YY;HB.AxiosError=d;HB.Cancel=HB.CanceledError;HB.all=function(Q){return Promise.all(Q)};HB.spread=mL;HB.isAxiosError=cL;HB.mergeConfig=sE;HB.AxiosHeaders=AB;HB.formToJSON=(A)=>JD(L.isHTMLForm(A)?new FormData(A):A);HB.getAdapter=KD.getAdapter;HB.HttpStatusCode=ln;HB.default=HB;var UB=HB;DQ();nE();cQ();JI();JI();DQ();CB();cQ();rB();import{mkdirSync as kqA,writeFileSync as bqA}from"fs";var ZD="/home/claude/.claude/remote",vVQ=`${ZD}/.oauth_token`,SVQ=`${ZD}/.api_key`,LD=`${ZD}/.session_ingress_token`;function nn(A,Q,B){if(!AQ(process.env.CLAUDE_CODE_REMOTE))return;try{kqA(ZD,{recursive:!0,mode:448}),bqA(A,Q,{encoding:"utf8",mode:384}),z(`Persisted ${B} to ${A} for subprocess access`)}catch(I){z(`Failed to persist ${B} to disk (non-fatal): ${FA(I)}`,{level:"error"})}}function pL(A,Q){try{let I=SQ().readFileSync(A,{encoding:"utf8"}).trim();if(!I)return null;return z(`Read ${Q} from well-known file ${A}`),I}catch(B){if(!iI(B))z(`Failed to read ${Q} from ${A}: ${FA(B)}`,{level:"debug"});return null}}DQ();cQ();rB();function yqA(){let A=fg();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??LD,E=pL(I,"session ingress token");return OG(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"}),OG(null),null;try{let I=SQ(),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"}),OG(null),null;return z(`Successfully read token from file descriptor ${B}`),OG(C),nn(LD,C,"session ingress token"),C}catch(I){z(`Failed to read token from file descriptor ${B}: ${FA(I)}`,{level:"error"});let E=process.env.CLAUDE_SESSION_INGRESS_TOKEN_FILE??LD,C=pL(E,"session ingress token");return OG(C),C}}function DW(){let A=process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN;if(A)return A;return yqA()}function qD(){let A=DW();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 VW(A){process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN=A}BQ();class aU extends Error{retryAfterMs;constructor(A,Q){super(A);this.retryAfterMs=Q}}class vJ{pending=[];pendingAtClose=0;draining=!1;closed=!1;backpressureResolvers=[];sleepResolve=null;flushResolvers=[];droppedBatches=0;config;constructor(A){this.config=A}get droppedBatchCount(){return this.droppedBatches}get pendingCount(){return this.closed?this.pendingAtClose:this.pending.length}async enqueue(A){if(this.closed)return;let Q=Array.isArray(A)?A:[A];if(Q.length===0)return;while(this.pending.length+Q.length>this.config.maxQueueSize&&!this.closed)await new Promise((B)=>{this.backpressureResolvers.push(B)});if(this.closed)return;this.pending.push(...Q),this.drain()}flush(){if(this.pending.length===0&&!this.draining)return Promise.resolve();return this.drain(),new Promise((A)=>{this.flushResolvers.push(A)})}close(){if(this.closed)return;this.closed=!0,this.pendingAtClose=this.pending.length,this.pending=[],this.sleepResolve?.(),this.sleepResolve=null;for(let A of this.backpressureResolvers)A();this.backpressureResolvers=[];for(let A of this.flushResolvers)A();this.flushResolvers=[]}async drain(){if(this.draining||this.closed)return;this.draining=!0;let A=0;try{while(this.pending.length>0&&!this.closed){let Q=this.takeBatch();if(Q.length===0)continue;try{await this.config.send(Q),A=0}catch(B){if(A++,this.config.maxConsecutiveFailures!==void 0&&A>=this.config.maxConsecutiveFailures){this.droppedBatches++,this.config.onBatchDropped?.(Q.length,A),A=0,this.releaseBackpressure();continue}this.pending=Q.concat(this.pending);let I=B instanceof aU?B.retryAfterMs:void 0;await this.sleep(this.retryDelay(A,I));continue}this.releaseBackpressure()}}finally{if(this.draining=!1,this.pending.length===0){for(let Q of this.flushResolvers)Q();this.flushResolvers=[]}}}takeBatch(){let{maxBatchSize:A,maxBatchBytes:Q}=this.config;if(Q===void 0)return this.pending.splice(0,A);let B=0,I=0;while(I<this.pending.length&&I<A){let E;try{E=Buffer.byteLength(zA(this.pending[I]))}catch{this.pending.splice(I,1);continue}if(I>0&&B+E>Q)break;B+=E,I++}return this.pending.splice(0,I)}retryDelay(A,Q){let B=Math.random()*this.config.jitterMs;if(Q!==void 0)return Math.max(this.config.baseDelayMs,Math.min(Q,this.config.maxDelayMs))+B;return Math.min(this.config.baseDelayMs*2**(A-1),this.config.maxDelayMs)+B}releaseBackpressure(){let A=this.backpressureResolvers;this.backpressureResolvers=[];for(let Q of A)Q()}sleep(A){return new Promise((Q)=>{this.sleepResolve=Q,setTimeout((B,I)=>{B.sleepResolve=null,I()},A,this,Q)})}}c0();class lL{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}}DQ();nE();CB();PE();import{Agent as hqA}from"https";PE();DQ();CB();rB();var on=["bundled","system"];function fqA(){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:on}if(b2("--use-system-ca")||b2("--use-openssl-ca"))return["system"];return on}var rU=XQ(()=>{let A=fqA(),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=SQ().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?NF(Y):void 0});DQ();rB();var wW=XQ(()=>{let A={};if(process.env.CLAUDE_CODE_CLIENT_CERT)try{A.cert=SQ().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=SQ().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}),mqA=XQ(()=>{let A=wW(),Q=rU();if(!A&&!Q)return;let B={...A,...Q&&{ca:Q},keepAlive:!0};return z("mTLS: Creating HTTPS agent with custom certificates"),new hqA(B)});function an(){let A=wW(),Q=rU();if(!A&&!Q)return;return{...A,...Q&&{ca:Q}}}function jD(){let A=wW(),Q=rU();if(!A&&!Q)return{};return{tls:{...A,...Q&&{ca:Q}}}}PE();JI();var jhA=S0(Fo(),1);DQ();CB();SZ();var RhA=!1;function CEA(A=process.env){return A.https_proxy||A.HTTPS_PROXY||A.http_proxy||A.HTTP_PROXY}function xhA(A=process.env){return A.no_proxy||A.NO_PROXY}function YEA(A,Q=xhA()){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 s5Q=XQ((A)=>{let Q=EEA(),B=wW(),I=rU(),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 JEA(A){let Q=CEA();if(!Q)return;if(YEA(A))return;return Q}var OhA=null;function ghA(){return OhA?.value??null}function XR(A){let Q={...RhA&&{keepalive:!1},...A.forAnthropicAPI&&!AQ(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=CEA();if(B){if(A.url&&YEA(A.url))return{...Q,...jD()};let I=ghA();return{...Q,proxy:I?{url:B,headers:{"Proxy-Authorization":I}}:B,...jD()}}return{...Q,...jD()}}gG();nE();CB();var vhA=30000,VR=null,GEA=0;var K9=null,DR=null;function ShA(){UEA(),K9=setInterval(()=>{if(o("debug","session_keepalive_heartbeat",{refcount:GEA}),AQ(process.env.CLAUDE_CODE_REMOTE_SEND_KEEPALIVES))VR?.()},vhA)}function UEA(){if(DR!==null)clearTimeout(DR),DR=null}function J2(A){if(VR=A,GEA>0&&K9===null)ShA()}function z9(){if(VR=null,K9!==null)clearInterval(K9),K9=null;UEA()}BQ();var _hA=`{"type":"keep_alive"}
|
|
176
176
|
`,PhA=1000,ThA=1000,$EA=30000,khA=600000,bhA=1e4,yhA=300000,FEA=$EA*2,fhA=new Set([1002,4001,4003]);class wR{ws=null;lastSentId=null;url;state="idle";onData;onCloseCallback;onConnectCallback;headers;sessionId;autoReconnect;isBridge;reconnectAttempts=0;reconnectStartTime=null;reconnectTimer=null;lastReconnectAttemptTime=null;lastActivityTime=0;pingInterval=null;pongReceived=!0;keepAliveInterval=null;messageBuffer;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 lL(PhA)}async connect(){if(this.state!=="idle"&&this.state!=="reconnecting"){z(`WebSocketTransport: Cannot connect, current state is ${this.state}`,{level:"error"}),o("error","cli_websocket_connect_failed");return}this.state="reconnecting",this.connectStartTime=Date.now(),z(`WebSocketTransport: Opening ${this.url.href}`),o("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:JEA(this.url.href),tls:an()||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(),o("info","cli_websocket_message_received",{length:Q.length}),this.onData)this.onData(Q)};onBunError=()=>{z("WebSocketTransport: Error",{level:"error"}),o("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"}),o("error","cli_websocket_connect_closed"),this.handleConnectionError(A.code)};onPong=()=>{this.pongReceived=!0};handleOpenEvent(){let A=Date.now()-this.connectStartTime;if(z("WebSocketTransport: Connected"),o("info","cli_websocket_connect_connected",{duration_ms:A}),this.isBridge&&this.reconnectStartTime!==null)tA("tengu_ws_transport_reconnected",{attempts:this.reconnectAttempts,downtimeMs:Date.now()-this.reconnectStartTime});this.reconnectAttempts=0,this.reconnectStartTime=null,this.lastReconnectAttemptTime=null,this.lastActivityTime=Date.now(),this.state="connected",this.onConnectCallback?.(),this.startPingInterval(),this.startKeepaliveInterval(),J2(()=>{this.write({type:"keep_alive"})})}sendLine(A){if(!this.ws||this.state!=="connected")return z("WebSocketTransport: Not connected"),o("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"}),o("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(),z9(),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})`:"")),o("info","cli_websocket_disconnected"),this.isBridge)tA("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"),o("info","cli_websocket_4003_token_refreshed")}if(A!=null&&fhA.has(A)&&!Q){z(`WebSocketTransport: Permanent close code ${A}, not reconnecting`,{level:"error"}),o("error","cli_websocket_permanent_close",{closeCode:A}),this.state="closed",this.onCloseCallback?.(A);return}if(!this.autoReconnect){this.state="closed",this.onCloseCallback?.(A);return}let B=Date.now();if(!this.reconnectStartTime)this.reconnectStartTime=B;if(this.lastReconnectAttemptTime!==null&&B-this.lastReconnectAttemptTime>FEA)z(`WebSocketTransport: Detected system sleep (${Math.round((B-this.lastReconnectAttemptTime)/1000)}s gap), resetting reconnection budget`),o("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<khA){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(ThA*Math.pow(2,this.reconnectAttempts-1),$EA),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)`),o("error","cli_websocket_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.isBridge)tA("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"}),o("error","cli_websocket_reconnect_exhausted",{reconnectAttempts:this.reconnectAttempts,elapsedMs:I}),this.state="closed",this.onCloseCallback)this.onCloseCallback(A)}close(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;this.stopPingInterval(),this.stopKeepaliveInterval(),z9(),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`),o("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"),o("info","cli_websocket_no_messages_to_replay");return}z(`WebSocketTransport: Replaying ${I.length} buffered messages`),o("info","cli_websocket_messages_to_replay",{count:I.length});for(let E of I){let C=zA(E)+`
|
|
177
177
|
`;if(!this.sendLine(C)){this.handleConnectionError();break}}}isConnectedStatus(){return this.state==="connected"}isClosedStatus(){return this.state==="closed"}setOnData(A){this.onData=A}setOnConnect(A){this.onConnectCallback=A}setOnClose(A){this.onCloseCallback=A}getStateLabel(){return this.state}async write(A){if("uuid"in A&&typeof A.uuid==="string")this.messageBuffer.add(A),this.lastSentId=A.uuid;let Q=zA(A)+`
|
|
178
|
-
`;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>FEA){z(`WebSocketTransport: ${Math.round(B/1000)}s tick gap detected — process was suspended, forcing reconnect`),o("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"}),o("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(I){z(`WebSocketTransport: Ping failed: ${I}`,{level:"error"}),o("error","cli_websocket_ping_failed")}}},bhA)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),AQ(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(_hA),this.lastActivityTime=Date.now(),z("WebSocketTransport: Sent periodic keep_alive data frame")}catch(A){z(`WebSocketTransport: Periodic keep_alive failed: ${A}`,{level:"error"}),o("error","cli_websocket_keepalive_failed")}},yhA)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var hhA=100,mhA=15000,chA=3000;class MR extends wR{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=uhA(A),this.uploader=new vJ({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:C,onBatchDropped:(J,G)=>{o("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}`),o("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(),hhA);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,chA)})]).finally(()=>{clearTimeout(Q),A.close()}),super.close()}async postOnce(A){let Q=DW();if(!Q){z("HybridTransport: No session token available for POST"),o("warn","cli_hybrid_post_no_token");return}let B={Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},I;try{I=await UB.post(this.postUrl,{events:A},{headers:B,validateStatus:()=>!0,timeout:mhA})}catch(E){throw z(`HybridTransport: POST error: ${FA(E)}`),o("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`),o("warn","cli_hybrid_post_client_error",{status:I.status});return}throw z(`HybridTransport: POST returned ${I.status} (retryable)`),o("warn","cli_hybrid_post_retryable_error",{status:I.status}),Error(`POST failed with ${I.status}`)}}function uhA(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}`}c0();CB();function WEA(){let{namespace:A,cluster:Q}=UO();return{...A&&{cooNamespace:A},...Q&&{cooCluster:Q}}}gG();import{chmod as mMQ,mkdir as cMQ,readdir as uMQ,readFile as dhA,unlink as pMQ,writeFile as nhA}from"fs/promises";import{join as XEA}from"path";JI();c0();gG();DQ();CB();cQ();iX();BQ();import{AsyncLocalStorage as phA}from"async_hooks";var jMQ=new phA;CB();var Y3Q=y(()=>WC.object({pid:WC.number(),sessionId:WC.string(),cwd:WC.string().optional(),startedAt:WC.number(),version:WC.string().optional(),kind:WC.enum(["interactive","bg","daemon","daemon-worker"])}));function ohA(){return XEA(FE(),"sessions")}var NEA=Promise.resolve();async function ahA(A){let Q=XEA(ohA(),`${process.pid}.json`),B=NEA.then(async()=>{try{let I=kQ(await dhA(Q,"utf8"));await nhA(Q,zA({...I,...A}))}catch(I){z(`[concurrentSessions] updatePidFile failed: ${FA(I)}`)}});NEA=B,await B}async function DEA(A){await ahA({bridgeSessionId:A})}DQ();nE();CB();cQ();function $B(A,Q){return Object.freeze({name:A,header:Q})}var rhA=$B("claude_code","claude-code-20250219"),thA=$B("oauth_auth",DP),shA=$B("interleaved_thinking","interleaved-thinking-2025-05-14"),ehA=$B("long_context","context-1m-2025-08-07"),AmA=$B("context_management","context-management-2025-06-27"),QmA=$B("structured_outputs","structured-outputs-2025-12-15"),BmA=$B("web_search","web-search-2025-03-05"),ImA=$B("tool_search","advanced-tool-use-2025-11-20"),EmA=$B("tool_search","tool-search-tool-2025-10-19"),CmA=$B("effort","effort-2025-11-24"),YmA=$B("task_budgets","task-budgets-2026-03-13"),JmA=$B("prompt_caching_scope","prompt-caching-scope-2026-01-05"),GmA=$B("extended_cache_ttl","extended-cache-ttl-2025-04-11"),UmA=$B("speed","fast-mode-2026-02-01"),FmA=$B("redact_thinking","redact-thinking-2026-02-12"),$mA=null,WmA=null,NmA=$B("advisor_tool","advisor-tool-2026-03-01"),XmA=$B("cache_diagnosis","cache-diagnosis-2026-04-07"),DmA=$B("context_hint","context-hint-2026-04-09"),VmA=$B("mcp_servers","mcp-servers-2025-12-04"),wmA=$B("files_api","files-api-2025-04-14"),zR=$B("environments","environments-2025-11-01"),MmA=$B("ccr_byoc","ccr-byoc-2025-07-29"),KmA=null,zmA=null,HmA=Object.freeze([rhA,thA,shA,ehA,AmA,QmA,BmA,ImA,EmA,CmA,YmA,JmA,GmA,UmA,FmA,$mA,WmA,NmA,XmA,DmA,VmA,wmA,zR,MmA,KmA,zmA].filter((A)=>A!==null)),U3Q=new Map(HmA.map((A)=>[A.header,A]));lC();jR();c0();DQ();cQ();BQ();var kEA=2000,hmA=["session_ingress_token","environment_secret","access_token","secret","token"],mmA=new RegExp(`"(${hmA.join("|")})"\\s*:\\s*"([^"]*)"`,"g"),cmA=16;function umA(A){return A.replace(mmA,(Q,B,I)=>{if(I.length<cmA)return`"${B}":"[REDACTED]"`;let E=`${I.slice(0,8)}...${I.slice(-4)}`;return`"${B}":"${E}"`})}function n1(A){let Q=typeof A==="string"?A:zA(A),B=umA(Q);if(B.length<=kEA)return B;return B.slice(0,kEA)+`... (${B.length} chars)`}function bEA(A){let Q=FA(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 yEA(A){if(A&&typeof A==="object"&&"response"in A&&A.response&&typeof A.response.status==="number")return A.response.status;return}function xR(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 fEA(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 xR(B)}return}function eJ(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 hEA(A,Q,B){if(Q)z(Q);tA("tengu_bridge_repl_skipped",{reason:A,...B!==void 0&&{v2:B}})}var $2="Remote Control is only available with claude.ai subscriptions. Please use `/login` to sign in with your claude.ai account.";var pmA=/^[a-zA-Z0-9_-]+$/;function yI(A,Q){if(!A||!pmA.test(A))throw Error(`Invalid ${Q}: contains unsafe characters`);return A}class GE extends Error{status;errorType;constructor(A,Q,B){super(A);this.name="BridgeFatalError",this.status=Q,this.errorType=B}}function cEA(A){function Q(J){A.onDebug?.(J)}let B=0,I=100;function E(J){let G={Authorization:`Bearer ${J}`,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-beta":zR.header,"x-environment-runner-version":A.runnerVersion},U=A.getTrustedDeviceToken?.();if(U)G["X-Trusted-Device-Token"]=U;return G}function C(){let J=A.getAccessToken();if(!J)throw Error($2);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 N=C(),D=await J(N);if(D.status!==401)return D;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 dI("bridge_environment_register",async()=>{Q(`[bridge:api] POST /v1/environments/bridge bridgeId=${J.bridgeId}`);let G=await Y((U)=>UB.post(`${A.baseUrl}/v1/environments/bridge`,{machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:J.gitRepoUrl,max_sessions:J.maxSessions,metadata:{worker_type:J.workerType},...J.reuseEnvironmentId&&{environment_id:J.reuseEnvironmentId}},{headers:E(U),timeout:15000,validateStatus:(F)=>F<500}),"Registration");return j0(G.status,G.data,"Registration"),Q(`[bridge:api] POST /v1/environments/bridge -> ${G.status} environment_id=${G.data.environment_id}`),Q(`[bridge:api] >>> ${n1({machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:TEA(J.gitRepoUrl),max_sessions:J.maxSessions,metadata:{worker_type:J.workerType}})}`),Q(`[bridge:api] <<< ${n1(G.data)}`),G.data},mEA)},async pollForWork(J,G,U,F){yI(J,"environmentId");let W=B;B=0;let N=await UB.get(`${A.baseUrl}/v1/environments/${J}/work/poll`,{headers:E(G),params:F!==void 0?{reclaim_older_than_ms:F}:void 0,timeout:1e4,signal:U,validateStatus:(D)=>D<500});if(j0(N.status,N.data,"Poll",N.headers),!N.data){if(B=W+1,B===1||B%I===0)Q(`[bridge:api] GET .../work/poll -> ${N.status} (no work, ${B} consecutive empty polls)`);return null}return Q(`[bridge:api] GET .../work/poll -> ${N.status} workId=${N.data.id} type=${N.data.data?.type}${N.data.data?.id?` sessionId=${N.data.data.id}`:""}`),Q(`[bridge:api] <<< ${n1(N.data)}`),N.data},async acknowledgeWork(J,G,U){yI(J,"environmentId"),yI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/ack`);let F=await UB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/ack`,{},{headers:E(U),timeout:1e4,validateStatus:(W)=>W<500});j0(F.status,F.data,"Acknowledge"),Q(`[bridge:api] POST .../work/${G}/ack -> ${F.status}`)},async stopWork(J,G,U){yI(J,"environmentId"),yI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/stop force=${U}`);let F=await Y((W)=>UB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/stop`,{force:U},{headers:E(W),timeout:1e4,validateStatus:(N)=>N<500}),"StopWork");j0(F.status,F.data,"StopWork"),Q(`[bridge:api] POST .../work/${G}/stop -> ${F.status}`)},async deregisterEnvironment(J){yI(J,"environmentId"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J}`);let G=await Y((U)=>UB.delete(`${A.baseUrl}/v1/environments/bridge/${J}`,{headers:E(U),timeout:1e4,validateStatus:(F)=>F<500}),"Deregister");j0(G.status,G.data,"Deregister"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J} -> ${G.status}`)},async archiveSession(J){yI(J,"sessionId"),Q(`[bridge:api] POST /v1/sessions/${J}/archive`);let G=await Y((U)=>UB.post(`${A.baseUrl}/v1/sessions/${J}/archive`,{},{headers:E(U),timeout:1e4,validateStatus:(F)=>F<500}),"ArchiveSession");if(G.status===409){Q(`[bridge:api] POST /v1/sessions/${J}/archive -> 409 (already archived)`);return}j0(G.status,G.data,"ArchiveSession"),Q(`[bridge:api] POST /v1/sessions/${J}/archive -> ${G.status}`)},async reconnectSession(J,G){return dI("bridge_session_reconnect",async()=>{yI(J,"environmentId"),yI(G,"sessionId"),Q(`[bridge:api] POST /v1/environments/${J}/bridge/reconnect session_id=${G}`);let U=await Y((F)=>UB.post(`${A.baseUrl}/v1/environments/${J}/bridge/reconnect`,{session_id:G},{headers:E(F),timeout:1e4,validateStatus:(W)=>W<500}),"ReconnectSession");j0(U.status,U.data,"ReconnectSession"),Q(`[bridge:api] POST .../bridge/reconnect -> ${U.status}`)},mEA)},async heartbeatWork(J,G,U){yI(J,"environmentId"),yI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/heartbeat`);let F=await UB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/heartbeat`,{},{headers:E(U),timeout:1e4,validateStatus:(W)=>W<500});return j0(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){yI(J,"sessionId"),Q(`[bridge:api] POST /v1/sessions/${J}/events type=${G.type}`);let F=await UB.post(`${A.baseUrl}/v1/sessions/${J}/events`,{events:[G]},{headers:E(U),timeout:1e4,validateStatus:(W)=>W<500});j0(F.status,F.data,"SendPermissionResponseEvent"),Q(`[bridge:api] POST /v1/sessions/${J}/events -> ${F.status}`),Q(`[bridge:api] >>> ${n1({events:[G]})}`),Q(`[bridge:api] <<< ${n1(F.data)}`)}}}function j0(A,Q,B,I){if(A===200||A===204)return;let E=eJ(Q),C=lmA(Q);switch(A){case 401:throw new GE(`${B}: Authentication failed (401)${E?`: ${E}`:""}. ${$2}`,401,C);case 403:throw new GE(W2(C)?"Remote Control session has expired. Please restart with `claude remote-control` or /remote-control.":`${B}: Access denied (403)${E?`: ${E}`:""}. Check your organization permissions.`,403,C);case 404:throw new GE(E??`${B}: Not found (404). Remote Control may not be available for this organization.`,404,C);case 410:throw new GE(E??"Remote Control session has expired. Please restart with `claude remote-control` or /remote-control.",410,C??"environment_expired");case 429:{let Y=xR(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 W2(A){if(!A)return!1;return A.includes("expired")||A.includes("lifetime")}function uEA(A){if(A.status!==403)return!1;return A.message.includes("external_poll_sessions")||A.message.includes("environments:manage")}function mEA(A){if(A instanceof GE)return A.status===401?"auth_failed":"http_error";if(A instanceof Error){if(A.message===$2)return"no_token";if("status"in A&&typeof A.status==="number")return"http_error"}return"request_failed"}function lmA(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}DQ();import{randomUUID as imA}from"crypto";lC();c0();var pEA={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 lEA(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}DQ();TH();cQ();BQ();function dmA(A){return A!==null&&typeof A==="object"&&"type"in A&&typeof A.type==="string"}function nmA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_response"&&"response"in A}function omA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_request"&&"request_id"in A&&"request"in A}function OR(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 iEA(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 PH(B)||void 0}function dEA(A,Q,B,I,E,C){try{let Y=lEA(kQ(A));if(nmA(Y)){z("[bridge:repl] Ingress message type=control_response"),E?.(Y);return}if(omA(Y)){z(`[bridge:repl] Inbound control_request subtype=${Y.request.subtype}`),C?.(Y);return}if(!dmA(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);tA("tengu_bridge_message_received",{is_repl:!0}),XE("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: ${FA(Y)}`),GI("bridge_message_receive","bridge_message_receive_parse_failed")}}var amA="This session is outbound-only. Enable Remote Control locally to allow inbound control.";function nEA(A,Q){let{transport:B,sessionId:I,outboundOnly:E,onInterrupt:C,onSetModel:Y,onSetMaxThinkingTokens:J,onSetPermissionMode:G,onRenameSession:U,onSetColor:F,onFileSuggestions:W,onReadFile:N,onMcpAuthenticate:D,onMcpOauthCallbackUrl:X,onMcpReconnect:w,onMcpStatus:V}=Q;if(!B){z("[bridge:repl] Cannot respond to control_request: transport not configured");return}let M;if(E&&A.request.subtype!=="initialize"){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:amA}};let H={...M,session_id:I};B.write(H),z(`[bridge:repl] Rejected ${A.request.subtype} (outbound-only) request_id=${A.request_id}`);return}switch(A.request.subtype){case"initialize":M={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{commands:[],output_style:"normal",available_output_styles:["normal"],models:[],account:{},pid:process.pid}}};break;case"set_model":Y?.(A.request.model),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_max_thinking_tokens":J?.(A.request.max_thinking_tokens),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_permission_mode":{let H=G?.(A.request.mode)??{ok:!1,error:"set_permission_mode is not supported in this context (onSetPermissionMode callback not registered)"};if(H.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:H.error}};break}case"rename_session":{let H=U?.(A.request.title)??{ok:!1,error:"rename_session is not supported in this context (onRenameSession callback not registered)"};if(H.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:H.error}};break}case"set_color":{let H=F?.(A.request.color)??{ok:!1,error:"set_color is not supported in this context (onSetColor callback not registered)"};if(H.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:H.error}};break}case"file_suggestions":{if(!W){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"file_suggestions is not supported in this context (onFileSuggestions callback not registered)"}};break}W(A.request.query).then((H)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{suggestions:H}}})).catch((H)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:FA(H)}})).then((H)=>{let j={...H,session_id:I};B.write(j),z(`[bridge:repl] Sent control_response for file_suggestions request_id=${A.request_id} result=${H.response.subtype}`)});return}case"read_file":{if(!N){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"read_file is not supported in this context (onReadFile callback not registered)"}};break}N(A.request.path,A.request.max_bytes,A.request.encoding).then((H)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:H}})).catch((H)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:FA(H)}})).then((H)=>{let j={...H,session_id:I};B.write(j),z(`[bridge:repl] Sent control_response for read_file request_id=${A.request_id} result=${H.response.subtype}`)});return}case"mcp_status":M={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{mcpServers:V?.()??[]}}};break;case"mcp_authenticate":case"mcp_oauth_callback_url":case"mcp_reconnect":{let H=A.request,{subtype:j,serverName:v}=H,_=H.subtype==="mcp_authenticate"?D&&((S)=>D(S,H.redirectUri)):H.subtype==="mcp_oauth_callback_url"?X&&((S)=>X(S,H.callbackUrl)):w;if(!_){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`${j} is not supported in this context (callback not registered)`}};break}_(v).then((S)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:S??{}}})).catch((S)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:FA(S)}})).then((S)=>{let n={...S,session_id:I};B.write(n),z(`[bridge:repl] Sent control_response for ${j} request_id=${A.request_id} result=${S.response.subtype}`)});return}case"interrupt":C?.(),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;default:M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`REPL bridge does not handle control_request subtype: ${A.request.subtype}`}}}let q={...M,session_id:I};B.write(q),z(`[bridge:repl] Sent control_response for ${A.request.subtype} request_id=${A.request_id} result=${M.response.subtype}`)}function gR(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:{...pEA},modelUsage:{},permission_denials:[],session_id:A,uuid:imA()}}class N2{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 oEA(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 vR{_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 tEA}from"crypto";c0();DQ();nE();cQ();BQ();function rmA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return kQ(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function aEA(A){let Q=rmA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}DQ();nE();cQ();BQ();function o1(){return"claude-code/0.2.136"}class SR{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?rEA(this.pending,A):A,this.drain()}close(){this.closed=!0,this.pending=null}async drain(){if(this.inflight||this.closed)return;if(!this.pending)return;let A=this.pending;this.pending=null,this.inflight=this.sendWithRetry(A).then(()=>{if(this.inflight=null,this.pending&&!this.closed)this.drain()})}async sendWithRetry(A){let Q=A,B=0;while(!this.closed){if(await this.config.send(Q))return;if(B++,await TB(this.retryDelay(B)),this.pending&&!this.closed)Q=rEA(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 rEA(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 tmA=20000,smA=100;function emA(A){let Q=lI(A);if(Q)return Q;if(A&&typeof A==="object"&&"name"in A&&typeof A.name==="string")return A.name;return}class X2 extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var AcA=10;function QcA(){return{byMessage:new Map,scopeToMessage:new Map}}function D2(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function BcA(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(D2(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(D2(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(D2(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 IcA(A,Q){A.byMessage.delete(Q.message.id);let B=D2(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class _R{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;currentState=null;sessionBaseUrl;sessionId;streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=QcA();workerState;eventUploader;internalEventUploader;deliveryUploader;onEpochMismatch;getAuthHeaders;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??tmA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??qD,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 SR({send:(E)=>this.request("put","/worker",{worker_epoch:this.workerEpoch,...E},"PUT worker").then((C)=>C.ok),baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.eventUploader=new vJ({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:1e5,send:async(E)=>{let C=await this.request("post","/worker/events",{worker_epoch:this.workerEpoch,events:E},"client events");if(!C.ok)throw new aU("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new vJ({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:200,send:async(E)=>{let C=await this.request("post","/worker/internal-events",{worker_epoch:this.workerEpoch,events:E},"internal events");if(!C.ok)throw new aU("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new vJ({maxBatchSize:64,maxQueueSize:64,send:async(E)=>{let C=await this.request("post","/worker/events/delivery",{worker_epoch:this.workerEpoch,updates:E.map((Y)=>({event_id:Y.eventId,status:Y.status}))},"delivery batch");if(!C.ok)throw new aU("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 X2("no_auth_headers");if(A===void 0){let Y=process.env.CLAUDE_CODE_WORKER_EPOCH;A=Y?parseInt(Y,10):NaN}if(isNaN(A))throw new X2("missing_epoch");this.workerEpoch=A;let B=this.getWorkerState(),I={ok:!1};for(let Y=1;Y<=3;Y++){if(I=await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)"),I.ok||this.closed)break;if(Y<3){let J=Math.min(500*2**(Y-1),30000)+Math.random()*500;await TB(J)}}if(!I.ok){if(!this.closed)o("error","cli_worker_init_put_retries_exhausted");throw new X2("worker_register_failed")}this.currentState="idle",this.startHeartbeat(),J2(()=>{this.writeEvent({type:"keep_alive"})}),z(`CCRClient: initialized, epoch=${this.workerEpoch}`),o("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:E,durationMs:C}=await B;if(!this.closed)o("info","cli_worker_state_restored",{duration_ms:C,had_state:E.external!==null||E.internal!==null});return E}async getWorkerState(){let A=Date.now(),Q=this.getAuthHeaders();if(Object.keys(Q).length===0)return{metadata:{external:null,internal:null},durationMs:0};let B=await this.getWithRetry(`${this.sessionBaseUrl}/worker`,Q,"worker_state");return{metadata:{external:B?.worker?.external_metadata??null,internal:B?.worker?.internal_metadata??null},durationMs:Date.now()-A}}async request(A,Q,B,I,{timeout:E=1e4}={}){let C=this.getAuthHeaders();if(Object.keys(C).length===0)return{ok:!1};let Y=`${this.sessionBaseUrl}${Q}`;try{let J=await fetch(Y,{method:A.toUpperCase(),headers:{...C,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":o1()},body:zA(B),signal:AbortSignal.timeout(E),...XR({url:Y})});if(J.body?.cancel(),J.ok)return this.consecutiveAuthFailures=0,{ok:!0};if(J.status===409)this.handleEpochMismatch();if(J.status===401||J.status===403){let G=DW(),U=G?aEA(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"}),o("error","cli_worker_token_expired_no_refresh"),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=AcA)z(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),o("error","cli_worker_auth_failures_exhausted"),this.onEpochMismatch()}if(z(`CCRClient: ${I} returned ${J.status}`,{level:"warn"}),o("warn","cli_worker_request_failed",{method:A,path:Q,status:J.status}),J.status===429){let G=J.headers.get("retry-after"),U=G?parseInt(G,10):NaN;if(!isNaN(U)&&U>=0)return{ok:!1,retryAfterMs:U*1000}}return{ok:!1}}catch(J){return z(`CCRClient: ${I} failed: ${FA(J)}`,{level:"warn"}),o("warn","cli_worker_request_error",{method:A,path:Q,error_code:emA(J)}),{ok:!1}}}reportState(A,Q){if(A===this.currentState&&!Q)return;this.currentState=A,this.workerState.enqueue({worker_status:A,requires_action_details:Q?{tool_name:Q.tool_name,display_tool_name:Q.display_tool_name,action_description:Q.action_description,raw_command:Q.raw_command,request_id:Q.request_id,tool_use_id:Q.tool_use_id}:null})}reportMetadata(A){this.workerState.enqueue({external_metadata:EcA(A)})}reportInternalMetadata(A){this.workerState.enqueue({internal_metadata:A})}handleEpochMismatch(){z("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),o("error","cli_worker_epoch_mismatch"),this.onEpochMismatch()}startHeartbeat(){this.stopHeartbeat();let A=()=>{let B=this.heartbeatIntervalMs*this.heartbeatJitterFraction*(2*Math.random()-1);this.heartbeatTimer=setTimeout(Q,this.heartbeatIntervalMs+B)},Q=()=>{if(this.sendHeartbeat(),this.heartbeatTimer===null)return;A()};A()}stopHeartbeat(){if(this.heartbeatTimer)clearTimeout(this.heartbeatTimer),this.heartbeatTimer=null}async sendHeartbeat(){if(this.heartbeatInFlight)return;this.heartbeatInFlight=!0;try{if((await this.request("post","/worker/heartbeat",{session_id:this.sessionId,worker_epoch:this.workerEpoch},"Heartbeat",{timeout:5000})).ok)z("CCRClient: Heartbeat sent")}finally{this.heartbeatInFlight=!1}}async writeEvent(A){if(A.type==="stream_event"){if(this.streamEventBuffer.push(A),!this.streamEventTimer)this.streamEventTimer=setTimeout(()=>void this.flushStreamEventBuffer(),smA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")IcA(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:tEA()},...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=BcA(A,this.streamTextAccumulator);await this.eventUploader.enqueue(Q.map((B)=>({payload:B,ephemeral:!0})))}async writeInternalEvent(A,Q,{isCompaction:B=!1,agentId:I}={}){let E={payload:{type:A,...Q,uuid:typeof Q.uuid==="string"?Q.uuid:tEA()},...B&&{is_compaction:!0},...I&&{agent_id:I}};await this.internalEventUploader.enqueue(E)}flushInternalEvents(){return this.internalEventUploader.flush()}flushDeliveryAcks(){return this.deliveryUploader.flush()}async flush(){return await this.flushStreamEventBuffer(),this.eventUploader.flush()}async readInternalEvents(){return this.paginatedGet("/worker/internal-events",{},"internal_events")}async readSubagentInternalEvents(){return this.paginatedGet("/worker/internal-events",{subagents:"true"},"subagent_events")}async paginatedGet(A,Q,B){let I=this.getAuthHeaders();if(Object.keys(I).length===0)return null;let E=[],C;do{let Y=new URL(`${this.sessionBaseUrl}${A}`);for(let[G,U]of Object.entries(Q))Y.searchParams.set(G,U);if(C)Y.searchParams.set("cursor",C);let J=await this.getWithRetry(Y.toString(),I,B);if(!J)return null;E.push(...J.data??[]),C=J.next_cursor}while(C);return z(`CCRClient: Read ${E.length} internal events from ${A}${Q.subagents?" (subagents)":""}`),E}async getWithRetry(A,Q,B){for(let I=1;I<=10;I++){let E;try{if(E=await fetch(A,{headers:{...Q,"anthropic-version":"2023-06-01","User-Agent":o1()},signal:AbortSignal.timeout(30000),...XR({url:A})}),E.ok)return await E.json()}catch(C){if(z(`CCRClient: GET ${A} failed (attempt ${I}/10): ${FA(C)}`,{level:"warn"}),I<10){let Y=Math.min(500*2**(I-1),30000)+Math.random()*500;await TB(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 TB(C)}}return z("CCRClient: GET retries exhausted",{level:"error"}),o("error","cli_worker_get_retries_exhausted",{context:B}),null}reportDelivery(A,Q){this.deliveryUploader.enqueue({eventId:A,status:Q})}getWorkerEpoch(){return this.workerEpoch}get internalEventsPending(){return this.internalEventUploader.pendingCount}close(){if(this.closed=!0,this.stopHeartbeat(),z9(),this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[],this.streamTextAccumulator.byMessage.clear(),this.streamTextAccumulator.scopeToMessage.clear(),this.workerState.close(),this.eventUploader.close(),this.internalEventUploader.close(),this.deliveryUploader.close()}}function EcA(A){let Q=A.post_turn_summary;if(!CcA(Q)||Q.status_category!=="blocked")return A;return{...A,post_turn_summary:{...Q,status_category:"need_input"}}}function CcA(A){return A!==null&&typeof A==="object"&&"status_category"in A&&typeof A.status_category==="string"}DQ();nE();cQ();BQ();var YcA=1000,JcA=30000,GcA=600000,UcA=45000,FcA=new Set([401,403,404]),L9=10,$cA=500,WcA=8000,NcA={stream:!0};function XcA(){return!0}function DcA(A){let Q=[],B=0,I;while((I=A.indexOf(`
|
|
178
|
+
`;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>FEA){z(`WebSocketTransport: ${Math.round(B/1000)}s tick gap detected — process was suspended, forcing reconnect`),o("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"}),o("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(I){z(`WebSocketTransport: Ping failed: ${I}`,{level:"error"}),o("error","cli_websocket_ping_failed")}}},bhA)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),AQ(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(_hA),this.lastActivityTime=Date.now(),z("WebSocketTransport: Sent periodic keep_alive data frame")}catch(A){z(`WebSocketTransport: Periodic keep_alive failed: ${A}`,{level:"error"}),o("error","cli_websocket_keepalive_failed")}},yhA)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var hhA=100,mhA=15000,chA=3000;class MR extends wR{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=uhA(A),this.uploader=new vJ({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:C,onBatchDropped:(J,G)=>{o("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}`),o("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(),hhA);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,chA)})]).finally(()=>{clearTimeout(Q),A.close()}),super.close()}async postOnce(A){let Q=DW();if(!Q){z("HybridTransport: No session token available for POST"),o("warn","cli_hybrid_post_no_token");return}let B={Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},I;try{I=await UB.post(this.postUrl,{events:A},{headers:B,validateStatus:()=>!0,timeout:mhA})}catch(E){throw z(`HybridTransport: POST error: ${FA(E)}`),o("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`),o("warn","cli_hybrid_post_client_error",{status:I.status});return}throw z(`HybridTransport: POST returned ${I.status} (retryable)`),o("warn","cli_hybrid_post_retryable_error",{status:I.status}),Error(`POST failed with ${I.status}`)}}function uhA(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}`}c0();CB();function WEA(){let{namespace:A,cluster:Q}=UO();return{...A&&{cooNamespace:A},...Q&&{cooCluster:Q}}}gG();import{chmod as mMQ,mkdir as cMQ,readdir as uMQ,readFile as dhA,unlink as pMQ,writeFile as nhA}from"fs/promises";import{join as XEA}from"path";JI();c0();gG();DQ();CB();cQ();iX();BQ();import{AsyncLocalStorage as phA}from"async_hooks";var jMQ=new phA;CB();var Y3Q=y(()=>WC.object({pid:WC.number(),sessionId:WC.string(),cwd:WC.string().optional(),startedAt:WC.number(),version:WC.string().optional(),kind:WC.enum(["interactive","bg","daemon","daemon-worker"])}));function ohA(){return XEA(FE(),"sessions")}var NEA=Promise.resolve();async function ahA(A){let Q=XEA(ohA(),`${process.pid}.json`),B=NEA.then(async()=>{try{let I=kQ(await dhA(Q,"utf8"));await nhA(Q,zA({...I,...A}))}catch(I){z(`[concurrentSessions] updatePidFile failed: ${FA(I)}`)}});NEA=B,await B}async function DEA(A){await ahA({bridgeSessionId:A})}DQ();nE();CB();cQ();function $B(A,Q){return Object.freeze({name:A,header:Q})}var rhA=$B("claude_code","claude-code-20250219"),thA=$B("oauth_auth",DP),shA=$B("interleaved_thinking","interleaved-thinking-2025-05-14"),ehA=$B("long_context","context-1m-2025-08-07"),AmA=$B("context_management","context-management-2025-06-27"),QmA=$B("structured_outputs","structured-outputs-2025-12-15"),BmA=$B("web_search","web-search-2025-03-05"),ImA=$B("tool_search","advanced-tool-use-2025-11-20"),EmA=$B("tool_search","tool-search-tool-2025-10-19"),CmA=$B("effort","effort-2025-11-24"),YmA=$B("task_budgets","task-budgets-2026-03-13"),JmA=$B("prompt_caching_scope","prompt-caching-scope-2026-01-05"),GmA=$B("extended_cache_ttl","extended-cache-ttl-2025-04-11"),UmA=$B("speed","fast-mode-2026-02-01"),FmA=$B("redact_thinking","redact-thinking-2026-02-12"),$mA=null,WmA=null,NmA=$B("advisor_tool","advisor-tool-2026-03-01"),XmA=$B("cache_diagnosis","cache-diagnosis-2026-04-07"),DmA=$B("context_hint","context-hint-2026-04-09"),VmA=$B("mcp_servers","mcp-servers-2025-12-04"),wmA=$B("files_api","files-api-2025-04-14"),zR=$B("environments","environments-2025-11-01"),MmA=$B("ccr_byoc","ccr-byoc-2025-07-29"),KmA=null,zmA=null,HmA=Object.freeze([rhA,thA,shA,ehA,AmA,QmA,BmA,ImA,EmA,CmA,YmA,JmA,GmA,UmA,FmA,$mA,WmA,NmA,XmA,DmA,VmA,wmA,zR,MmA,KmA,zmA].filter((A)=>A!==null)),U3Q=new Map(HmA.map((A)=>[A.header,A]));lC();jR();c0();DQ();cQ();BQ();var kEA=2000,hmA=["session_ingress_token","environment_secret","access_token","secret","token"],mmA=new RegExp(`"(${hmA.join("|")})"\\s*:\\s*"([^"]*)"`,"g"),cmA=16;function umA(A){return A.replace(mmA,(Q,B,I)=>{if(I.length<cmA)return`"${B}":"[REDACTED]"`;let E=`${I.slice(0,8)}...${I.slice(-4)}`;return`"${B}":"${E}"`})}function n1(A){let Q=typeof A==="string"?A:zA(A),B=umA(Q);if(B.length<=kEA)return B;return B.slice(0,kEA)+`... (${B.length} chars)`}function bEA(A){let Q=FA(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 yEA(A){if(A&&typeof A==="object"&&"response"in A&&A.response&&typeof A.response.status==="number")return A.response.status;return}function xR(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 fEA(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 xR(B)}return}function eJ(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 hEA(A,Q,B){if(Q)z(Q);tA("tengu_bridge_repl_skipped",{reason:A,...B!==void 0&&{v2:B}})}var $2="Remote Control is only available with claude.ai subscriptions. Please use `/login` to sign in with your claude.ai account.";var pmA=/^[a-zA-Z0-9_-]+$/;function yI(A,Q){if(!A||!pmA.test(A))throw Error(`Invalid ${Q}: contains unsafe characters`);return A}class GE extends Error{status;errorType;constructor(A,Q,B){super(A);this.name="BridgeFatalError",this.status=Q,this.errorType=B}}function cEA(A){function Q(J){A.onDebug?.(J)}let B=0,I=100;function E(J){let G={Authorization:`Bearer ${J}`,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-beta":zR.header,"x-environment-runner-version":A.runnerVersion},U=A.getTrustedDeviceToken?.();if(U)G["X-Trusted-Device-Token"]=U;return G}function C(){let J=A.getAccessToken();if(!J)throw Error($2);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 N=C(),D=await J(N);if(D.status!==401)return D;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 dI("bridge_environment_register",async()=>{Q(`[bridge:api] POST /v1/environments/bridge bridgeId=${J.bridgeId}`);let G=await Y((U)=>UB.post(`${A.baseUrl}/v1/environments/bridge`,{machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:J.gitRepoUrl,max_sessions:J.maxSessions,metadata:{worker_type:J.workerType},...J.reuseEnvironmentId&&{environment_id:J.reuseEnvironmentId}},{headers:E(U),timeout:15000,validateStatus:(F)=>F<500}),"Registration");return j0(G.status,G.data,"Registration"),Q(`[bridge:api] POST /v1/environments/bridge -> ${G.status} environment_id=${G.data.environment_id}`),Q(`[bridge:api] >>> ${n1({machine_name:J.machineName,directory:J.dir,branch:J.branch,git_repo_url:TEA(J.gitRepoUrl),max_sessions:J.maxSessions,metadata:{worker_type:J.workerType}})}`),Q(`[bridge:api] <<< ${n1(G.data)}`),G.data},mEA)},async pollForWork(J,G,U,F){yI(J,"environmentId");let W=B;B=0;let N=await UB.get(`${A.baseUrl}/v1/environments/${J}/work/poll`,{headers:E(G),params:F!==void 0?{reclaim_older_than_ms:F}:void 0,timeout:1e4,signal:U,validateStatus:(D)=>D<500});if(j0(N.status,N.data,"Poll",N.headers),!N.data){if(B=W+1,B===1||B%I===0)Q(`[bridge:api] GET .../work/poll -> ${N.status} (no work, ${B} consecutive empty polls)`);return null}return Q(`[bridge:api] GET .../work/poll -> ${N.status} workId=${N.data.id} type=${N.data.data?.type}${N.data.data?.id?` sessionId=${N.data.data.id}`:""}`),Q(`[bridge:api] <<< ${n1(N.data)}`),N.data},async acknowledgeWork(J,G,U){yI(J,"environmentId"),yI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/ack`);let F=await UB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/ack`,{},{headers:E(U),timeout:1e4,validateStatus:(W)=>W<500});j0(F.status,F.data,"Acknowledge"),Q(`[bridge:api] POST .../work/${G}/ack -> ${F.status}`)},async stopWork(J,G,U){yI(J,"environmentId"),yI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/stop force=${U}`);let F=await Y((W)=>UB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/stop`,{force:U},{headers:E(W),timeout:1e4,validateStatus:(N)=>N<500}),"StopWork");j0(F.status,F.data,"StopWork"),Q(`[bridge:api] POST .../work/${G}/stop -> ${F.status}`)},async deregisterEnvironment(J){yI(J,"environmentId"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J}`);let G=await Y((U)=>UB.delete(`${A.baseUrl}/v1/environments/bridge/${J}`,{headers:E(U),timeout:1e4,validateStatus:(F)=>F<500}),"Deregister");j0(G.status,G.data,"Deregister"),Q(`[bridge:api] DELETE /v1/environments/bridge/${J} -> ${G.status}`)},async archiveSession(J){yI(J,"sessionId"),Q(`[bridge:api] POST /v1/sessions/${J}/archive`);let G=await Y((U)=>UB.post(`${A.baseUrl}/v1/sessions/${J}/archive`,{},{headers:E(U),timeout:1e4,validateStatus:(F)=>F<500}),"ArchiveSession");if(G.status===409){Q(`[bridge:api] POST /v1/sessions/${J}/archive -> 409 (already archived)`);return}j0(G.status,G.data,"ArchiveSession"),Q(`[bridge:api] POST /v1/sessions/${J}/archive -> ${G.status}`)},async reconnectSession(J,G){return dI("bridge_session_reconnect",async()=>{yI(J,"environmentId"),yI(G,"sessionId"),Q(`[bridge:api] POST /v1/environments/${J}/bridge/reconnect session_id=${G}`);let U=await Y((F)=>UB.post(`${A.baseUrl}/v1/environments/${J}/bridge/reconnect`,{session_id:G},{headers:E(F),timeout:1e4,validateStatus:(W)=>W<500}),"ReconnectSession");j0(U.status,U.data,"ReconnectSession"),Q(`[bridge:api] POST .../bridge/reconnect -> ${U.status}`)},mEA)},async heartbeatWork(J,G,U){yI(J,"environmentId"),yI(G,"workId"),Q(`[bridge:api] POST .../work/${G}/heartbeat`);let F=await UB.post(`${A.baseUrl}/v1/environments/${J}/work/${G}/heartbeat`,{},{headers:E(U),timeout:1e4,validateStatus:(W)=>W<500});return j0(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){yI(J,"sessionId"),Q(`[bridge:api] POST /v1/sessions/${J}/events type=${G.type}`);let F=await UB.post(`${A.baseUrl}/v1/sessions/${J}/events`,{events:[G]},{headers:E(U),timeout:1e4,validateStatus:(W)=>W<500});j0(F.status,F.data,"SendPermissionResponseEvent"),Q(`[bridge:api] POST /v1/sessions/${J}/events -> ${F.status}`),Q(`[bridge:api] >>> ${n1({events:[G]})}`),Q(`[bridge:api] <<< ${n1(F.data)}`)}}}function j0(A,Q,B,I){if(A===200||A===204)return;let E=eJ(Q),C=lmA(Q);switch(A){case 401:throw new GE(`${B}: Authentication failed (401)${E?`: ${E}`:""}. ${$2}`,401,C);case 403:throw new GE(W2(C)?"Remote Control session has expired. Please restart with `claude remote-control` or /remote-control.":`${B}: Access denied (403)${E?`: ${E}`:""}. Check your organization permissions.`,403,C);case 404:throw new GE(E??`${B}: Not found (404). Remote Control may not be available for this organization.`,404,C);case 410:throw new GE(E??"Remote Control session has expired. Please restart with `claude remote-control` or /remote-control.",410,C??"environment_expired");case 429:{let Y=xR(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 W2(A){if(!A)return!1;return A.includes("expired")||A.includes("lifetime")}function uEA(A){if(A.status!==403)return!1;return A.message.includes("external_poll_sessions")||A.message.includes("environments:manage")}function mEA(A){if(A instanceof GE)return A.status===401?"auth_failed":"http_error";if(A instanceof Error){if(A.message===$2)return"no_token";if("status"in A&&typeof A.status==="number")return"http_error"}return"request_failed"}function lmA(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}DQ();import{randomUUID as imA}from"crypto";lC();c0();var pEA={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 lEA(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}DQ();TH();cQ();BQ();function dmA(A){return A!==null&&typeof A==="object"&&"type"in A&&typeof A.type==="string"}function nmA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_response"&&"response"in A}function omA(A){return A!==null&&typeof A==="object"&&"type"in A&&A.type==="control_request"&&"request_id"in A&&"request"in A}function OR(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 iEA(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 PH(B)||void 0}function dEA(A,Q,B,I,E,C){try{let Y=lEA(kQ(A));if(nmA(Y)){z("[bridge:repl] Ingress message type=control_response"),E?.(Y);return}if(omA(Y)){z(`[bridge:repl] Inbound control_request subtype=${Y.request.subtype}`),C?.(Y);return}if(!dmA(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);tA("tengu_bridge_message_received",{is_repl:!0}),XE("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: ${FA(Y)}`),GI("bridge_message_receive","bridge_message_receive_parse_failed")}}var amA="This session is outbound-only. Enable Remote Control locally to allow inbound control.";function nEA(A,Q){let{transport:B,sessionId:I,outboundOnly:E,onInterrupt:C,onSetModel:Y,onSetMaxThinkingTokens:J,onSetPermissionMode:G,onRenameSession:U,onSetColor:F,onFileSuggestions:W,onReadFile:N,onMcpAuthenticate:D,onMcpOauthCallbackUrl:X,onMcpReconnect:w,onMcpStatus:V}=Q;if(!B){z("[bridge:repl] Cannot respond to control_request: transport not configured");return}let M;if(E&&A.request.subtype!=="initialize"){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:amA}};let H={...M,session_id:I};B.write(H),z(`[bridge:repl] Rejected ${A.request.subtype} (outbound-only) request_id=${A.request_id}`);return}switch(A.request.subtype){case"initialize":M={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{commands:[],output_style:"normal",available_output_styles:["normal"],models:[],account:{},pid:process.pid}}};break;case"set_model":Y?.(A.request.model),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_max_thinking_tokens":J?.(A.request.max_thinking_tokens),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;case"set_permission_mode":{let H=G?.(A.request.mode)??{ok:!1,error:"set_permission_mode is not supported in this context (onSetPermissionMode callback not registered)"};if(H.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:H.error}};break}case"rename_session":{let H=U?.(A.request.title)??{ok:!1,error:"rename_session is not supported in this context (onRenameSession callback not registered)"};if(H.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:H.error}};break}case"set_color":{let H=F?.(A.request.color)??{ok:!1,error:"set_color is not supported in this context (onSetColor callback not registered)"};if(H.ok)M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};else M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:H.error}};break}case"file_suggestions":{if(!W){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"file_suggestions is not supported in this context (onFileSuggestions callback not registered)"}};break}W(A.request.query).then((H)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{suggestions:H}}})).catch((H)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:FA(H)}})).then((H)=>{let j={...H,session_id:I};B.write(j),z(`[bridge:repl] Sent control_response for file_suggestions request_id=${A.request_id} result=${H.response.subtype}`)});return}case"read_file":{if(!N){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:"read_file is not supported in this context (onReadFile callback not registered)"}};break}N(A.request.path,A.request.max_bytes,A.request.encoding).then((H)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:H}})).catch((H)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:FA(H)}})).then((H)=>{let j={...H,session_id:I};B.write(j),z(`[bridge:repl] Sent control_response for read_file request_id=${A.request_id} result=${H.response.subtype}`)});return}case"mcp_status":M={type:"control_response",response:{subtype:"success",request_id:A.request_id,response:{mcpServers:V?.()??[]}}};break;case"mcp_authenticate":case"mcp_oauth_callback_url":case"mcp_reconnect":{let H=A.request,{subtype:j,serverName:v}=H,_=H.subtype==="mcp_authenticate"?D&&((S)=>D(S,H.redirectUri)):H.subtype==="mcp_oauth_callback_url"?X&&((S)=>X(S,H.callbackUrl)):w;if(!_){M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`${j} is not supported in this context (callback not registered)`}};break}_(v).then((S)=>({type:"control_response",response:{subtype:"success",request_id:A.request_id,response:S??{}}})).catch((S)=>({type:"control_response",response:{subtype:"error",request_id:A.request_id,error:FA(S)}})).then((S)=>{let n={...S,session_id:I};B.write(n),z(`[bridge:repl] Sent control_response for ${j} request_id=${A.request_id} result=${S.response.subtype}`)});return}case"interrupt":C?.(),M={type:"control_response",response:{subtype:"success",request_id:A.request_id}};break;default:M={type:"control_response",response:{subtype:"error",request_id:A.request_id,error:`REPL bridge does not handle control_request subtype: ${A.request.subtype}`}}}let q={...M,session_id:I};B.write(q),z(`[bridge:repl] Sent control_response for ${A.request.subtype} request_id=${A.request_id} result=${M.response.subtype}`)}function gR(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:{...pEA},modelUsage:{},permission_denials:[],session_id:A,uuid:imA()}}class N2{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 oEA(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 vR{_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 tEA}from"crypto";c0();DQ();nE();cQ();BQ();function rmA(A){let B=(A.startsWith("sk-ant-si-")?A.slice(10):A).split(".");if(B.length!==3||!B[1])return null;try{return kQ(Buffer.from(B[1],"base64url").toString("utf8"))}catch{return null}}function aEA(A){let Q=rmA(A);if(Q!==null&&typeof Q==="object"&&"exp"in Q&&typeof Q.exp==="number")return Q.exp;return null}DQ();nE();cQ();BQ();function o1(){return"claude-code/0.2.137"}class SR{inflight=null;pending=null;closed=!1;config;constructor(A){this.config=A}enqueue(A){if(this.closed)return;this.pending=this.pending?rEA(this.pending,A):A,this.drain()}close(){this.closed=!0,this.pending=null}async drain(){if(this.inflight||this.closed)return;if(!this.pending)return;let A=this.pending;this.pending=null,this.inflight=this.sendWithRetry(A).then(()=>{if(this.inflight=null,this.pending&&!this.closed)this.drain()})}async sendWithRetry(A){let Q=A,B=0;while(!this.closed){if(await this.config.send(Q))return;if(B++,await TB(this.retryDelay(B)),this.pending&&!this.closed)Q=rEA(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 rEA(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 tmA=20000,smA=100;function emA(A){let Q=lI(A);if(Q)return Q;if(A&&typeof A==="object"&&"name"in A&&typeof A.name==="string")return A.name;return}class X2 extends Error{reason;constructor(A){super(`CCRClient init failed: ${A}`);this.reason=A}}var AcA=10;function QcA(){return{byMessage:new Map,scopeToMessage:new Map}}function D2(A){return`${A.session_id}:${A.parent_tool_use_id??""}`}function BcA(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(D2(E));if(Y)Q.byMessage.delete(Y);Q.scopeToMessage.set(D2(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(D2(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 IcA(A,Q){A.byMessage.delete(Q.message.id);let B=D2(Q);if(A.scopeToMessage.get(B)===Q.message.id)A.scopeToMessage.delete(B)}class _R{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;currentState=null;sessionBaseUrl;sessionId;streamEventBuffer=[];streamEventTimer=null;streamTextAccumulator=QcA();workerState;eventUploader;internalEventUploader;deliveryUploader;onEpochMismatch;getAuthHeaders;constructor(A,Q,B){if(this.onEpochMismatch=B?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=B?.heartbeatIntervalMs??tmA,this.heartbeatJitterFraction=B?.heartbeatJitterFraction??0,this.getAuthHeaders=B?.getAuthHeaders??qD,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 SR({send:(E)=>this.request("put","/worker",{worker_epoch:this.workerEpoch,...E},"PUT worker").then((C)=>C.ok),baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.eventUploader=new vJ({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:1e5,send:async(E)=>{let C=await this.request("post","/worker/events",{worker_epoch:this.workerEpoch,events:E},"client events");if(!C.ok)throw new aU("client event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new vJ({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:200,send:async(E)=>{let C=await this.request("post","/worker/internal-events",{worker_epoch:this.workerEpoch,events:E},"internal events");if(!C.ok)throw new aU("internal event POST failed",C.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new vJ({maxBatchSize:64,maxQueueSize:64,send:async(E)=>{let C=await this.request("post","/worker/events/delivery",{worker_epoch:this.workerEpoch,updates:E.map((Y)=>({event_id:Y.eventId,status:Y.status}))},"delivery batch");if(!C.ok)throw new aU("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 X2("no_auth_headers");if(A===void 0){let Y=process.env.CLAUDE_CODE_WORKER_EPOCH;A=Y?parseInt(Y,10):NaN}if(isNaN(A))throw new X2("missing_epoch");this.workerEpoch=A;let B=this.getWorkerState(),I={ok:!1};for(let Y=1;Y<=3;Y++){if(I=await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)"),I.ok||this.closed)break;if(Y<3){let J=Math.min(500*2**(Y-1),30000)+Math.random()*500;await TB(J)}}if(!I.ok){if(!this.closed)o("error","cli_worker_init_put_retries_exhausted");throw new X2("worker_register_failed")}this.currentState="idle",this.startHeartbeat(),J2(()=>{this.writeEvent({type:"keep_alive"})}),z(`CCRClient: initialized, epoch=${this.workerEpoch}`),o("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-Q});let{metadata:E,durationMs:C}=await B;if(!this.closed)o("info","cli_worker_state_restored",{duration_ms:C,had_state:E.external!==null||E.internal!==null});return E}async getWorkerState(){let A=Date.now(),Q=this.getAuthHeaders();if(Object.keys(Q).length===0)return{metadata:{external:null,internal:null},durationMs:0};let B=await this.getWithRetry(`${this.sessionBaseUrl}/worker`,Q,"worker_state");return{metadata:{external:B?.worker?.external_metadata??null,internal:B?.worker?.internal_metadata??null},durationMs:Date.now()-A}}async request(A,Q,B,I,{timeout:E=1e4}={}){let C=this.getAuthHeaders();if(Object.keys(C).length===0)return{ok:!1};let Y=`${this.sessionBaseUrl}${Q}`;try{let J=await fetch(Y,{method:A.toUpperCase(),headers:{...C,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":o1()},body:zA(B),signal:AbortSignal.timeout(E),...XR({url:Y})});if(J.body?.cancel(),J.ok)return this.consecutiveAuthFailures=0,{ok:!0};if(J.status===409)this.handleEpochMismatch();if(J.status===401||J.status===403){let G=DW(),U=G?aEA(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"}),o("error","cli_worker_token_expired_no_refresh"),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=AcA)z(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),o("error","cli_worker_auth_failures_exhausted"),this.onEpochMismatch()}if(z(`CCRClient: ${I} returned ${J.status}`,{level:"warn"}),o("warn","cli_worker_request_failed",{method:A,path:Q,status:J.status}),J.status===429){let G=J.headers.get("retry-after"),U=G?parseInt(G,10):NaN;if(!isNaN(U)&&U>=0)return{ok:!1,retryAfterMs:U*1000}}return{ok:!1}}catch(J){return z(`CCRClient: ${I} failed: ${FA(J)}`,{level:"warn"}),o("warn","cli_worker_request_error",{method:A,path:Q,error_code:emA(J)}),{ok:!1}}}reportState(A,Q){if(A===this.currentState&&!Q)return;this.currentState=A,this.workerState.enqueue({worker_status:A,requires_action_details:Q?{tool_name:Q.tool_name,display_tool_name:Q.display_tool_name,action_description:Q.action_description,raw_command:Q.raw_command,request_id:Q.request_id,tool_use_id:Q.tool_use_id}:null})}reportMetadata(A){this.workerState.enqueue({external_metadata:EcA(A)})}reportInternalMetadata(A){this.workerState.enqueue({internal_metadata:A})}handleEpochMismatch(){z("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),o("error","cli_worker_epoch_mismatch"),this.onEpochMismatch()}startHeartbeat(){this.stopHeartbeat();let A=()=>{let B=this.heartbeatIntervalMs*this.heartbeatJitterFraction*(2*Math.random()-1);this.heartbeatTimer=setTimeout(Q,this.heartbeatIntervalMs+B)},Q=()=>{if(this.sendHeartbeat(),this.heartbeatTimer===null)return;A()};A()}stopHeartbeat(){if(this.heartbeatTimer)clearTimeout(this.heartbeatTimer),this.heartbeatTimer=null}async sendHeartbeat(){if(this.heartbeatInFlight)return;this.heartbeatInFlight=!0;try{if((await this.request("post","/worker/heartbeat",{session_id:this.sessionId,worker_epoch:this.workerEpoch},"Heartbeat",{timeout:5000})).ok)z("CCRClient: Heartbeat sent")}finally{this.heartbeatInFlight=!1}}async writeEvent(A){if(A.type==="stream_event"){if(this.streamEventBuffer.push(A),!this.streamEventTimer)this.streamEventTimer=setTimeout(()=>void this.flushStreamEventBuffer(),smA);return}if(await this.flushStreamEventBuffer(),A.type==="assistant")IcA(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:tEA()},...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=BcA(A,this.streamTextAccumulator);await this.eventUploader.enqueue(Q.map((B)=>({payload:B,ephemeral:!0})))}async writeInternalEvent(A,Q,{isCompaction:B=!1,agentId:I}={}){let E={payload:{type:A,...Q,uuid:typeof Q.uuid==="string"?Q.uuid:tEA()},...B&&{is_compaction:!0},...I&&{agent_id:I}};await this.internalEventUploader.enqueue(E)}flushInternalEvents(){return this.internalEventUploader.flush()}flushDeliveryAcks(){return this.deliveryUploader.flush()}async flush(){return await this.flushStreamEventBuffer(),this.eventUploader.flush()}async readInternalEvents(){return this.paginatedGet("/worker/internal-events",{},"internal_events")}async readSubagentInternalEvents(){return this.paginatedGet("/worker/internal-events",{subagents:"true"},"subagent_events")}async paginatedGet(A,Q,B){let I=this.getAuthHeaders();if(Object.keys(I).length===0)return null;let E=[],C;do{let Y=new URL(`${this.sessionBaseUrl}${A}`);for(let[G,U]of Object.entries(Q))Y.searchParams.set(G,U);if(C)Y.searchParams.set("cursor",C);let J=await this.getWithRetry(Y.toString(),I,B);if(!J)return null;E.push(...J.data??[]),C=J.next_cursor}while(C);return z(`CCRClient: Read ${E.length} internal events from ${A}${Q.subagents?" (subagents)":""}`),E}async getWithRetry(A,Q,B){for(let I=1;I<=10;I++){let E;try{if(E=await fetch(A,{headers:{...Q,"anthropic-version":"2023-06-01","User-Agent":o1()},signal:AbortSignal.timeout(30000),...XR({url:A})}),E.ok)return await E.json()}catch(C){if(z(`CCRClient: GET ${A} failed (attempt ${I}/10): ${FA(C)}`,{level:"warn"}),I<10){let Y=Math.min(500*2**(I-1),30000)+Math.random()*500;await TB(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 TB(C)}}return z("CCRClient: GET retries exhausted",{level:"error"}),o("error","cli_worker_get_retries_exhausted",{context:B}),null}reportDelivery(A,Q){this.deliveryUploader.enqueue({eventId:A,status:Q})}getWorkerEpoch(){return this.workerEpoch}get internalEventsPending(){return this.internalEventUploader.pendingCount}close(){if(this.closed=!0,this.stopHeartbeat(),z9(),this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[],this.streamTextAccumulator.byMessage.clear(),this.streamTextAccumulator.scopeToMessage.clear(),this.workerState.close(),this.eventUploader.close(),this.internalEventUploader.close(),this.deliveryUploader.close()}}function EcA(A){let Q=A.post_turn_summary;if(!CcA(Q)||Q.status_category!=="blocked")return A;return{...A,post_turn_summary:{...Q,status_category:"need_input"}}}function CcA(A){return A!==null&&typeof A==="object"&&"status_category"in A&&typeof A.status_category==="string"}DQ();nE();cQ();BQ();var YcA=1000,JcA=30000,GcA=600000,UcA=45000,FcA=new Set([401,403,404]),L9=10,$cA=500,WcA=8000,NcA={stream:!0};function XcA(){return!0}function DcA(A){let Q=[],B=0,I;while((I=A.indexOf(`
|
|
179
179
|
|
|
180
180
|
`,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(`
|
|
181
181
|
`)){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+`
|
|
@@ -185,4 +185,4 @@ ${E}`;break;case"retry":if(uIA(E))Q[I]=E;break;case"id":if(pIA(E))Q[I]=E;break;c
|
|
|
185
185
|
`);if(I.push(J),!G){E=J.endsWith(`
|
|
186
186
|
`);continue}let{frames:U,remaining:F}=DcA(I.join(""));I=F?[F]:[],E=F.endsWith(`
|
|
187
187
|
`);for(let W of U){if(this.resetLivenessTimer(),W.id){let N=parseInt(W.id,10);if(!isNaN(N)){if(this.seenSequenceNums.has(N))z(`SSETransport: DUPLICATE frame seq=${N} (lastSequenceNum=${this.lastSequenceNum}, seenCount=${this.seenSequenceNums.size})`,{level:"warn"}),o("warn","cli_sse_duplicate_sequence");else if(this.seenSequenceNums.add(N),this.seenSequenceNums.size>1000){let D=this.lastSequenceNum-200;for(let X of this.seenSequenceNums)if(X<D)this.seenSequenceNums.delete(X)}if(N>this.lastSequenceNum)this.lastSequenceNum=N}}if(W.event&&W.data)this.handleSSEFrame(W.event,W.data);else if(W.data)z("SSETransport: Frame has data: but no event: field — dropped",{level:"warn"}),o("warn","cli_sse_frame_missing_event_field")}}}catch(C){if(this.abortController?.signal.aborted)return;z(`SSETransport: Stream read error: ${FA(C)}`,{level:"error"}),o("error","cli_sse_stream_read_error")}finally{Q.releaseLock()}if(this.state!=="closing"&&this.state!=="closed")z("SSETransport: Stream ended, reconnecting"),this.handleConnectionError()}handleSSEFrame(A,Q){if(A!=="client_event"){z(`SSETransport: Unexpected SSE event type '${A}' on worker stream`,{level:"warn"}),o("warn","cli_sse_unexpected_event_type",{event_type:A});return}let B;try{B=kQ(Q)}catch(E){z(`SSETransport: Failed to parse client_event data: ${FA(E)}`,{level:"error"});return}let I=B.payload;if(I&&typeof I==="object"&&"type"in I){let E=this.sessionId?` session=${this.sessionId}`:"";z(`SSETransport: Event seq=${B.sequence_num} event_id=${B.event_id} event_type=${B.event_type} payload_type=${String(I.type)}${E}`),o("info","cli_sse_message_received"),this.onData?.(zA(I)+`
|
|
188
|
-
`)}else z(`SSETransport: Ignoring client_event with no type in payload: event_id=${B.event_id}`);this.onEventCallback?.(B)}handleConnectionError(){if(this.clearLivenessTimer(),this.state==="closing"||this.state==="closed")return;this.abortController?.abort(),this.abortController=null;let A=Date.now();if(!this.reconnectStartTime)this.reconnectStartTime=A;let Q=A-this.reconnectStartTime;if(Q<GcA){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(YcA*Math.pow(2,this.reconnectAttempts-1),JcA),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)`),o("error","cli_sse_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},I)}else z(`SSETransport: Reconnection time budget exhausted after ${Math.round(Q/1000)}s`,{level:"error"}),o("error","cli_sse_reconnect_exhausted",{reconnectAttempts:this.reconnectAttempts,elapsedMs:Q}),this.state="closed",this.onCloseCallback?.()}onLivenessTimeout=()=>{this.livenessTimer=null,z("SSETransport: Liveness timeout, reconnecting",{level:"error"}),o("error","cli_sse_liveness_timeout"),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,UcA)}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"),o("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":o1()};z(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=L9;I++){try{let C=await UB.post(this.postUrl,A,{headers:B,validateStatus:XcA});if(C.status===200||C.status===201){z(`SSETransport: POST success type=${A.type}`);return}if(z(`SSETransport: POST ${C.status} body=${zA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){z(`SSETransport: POST returned ${C.status} (client error), not retrying`),o("warn","cli_sse_post_client_error",{status:C.status});return}z(`SSETransport: POST returned ${C.status}, attempt ${I}/${L9}`),o("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){z(`SSETransport: POST error: ${FA(C)}, attempt ${I}/${L9}`),o("warn","cli_sse_post_network_error",{attempt:I})}if(I===L9){z(`SSETransport: POST failed after ${L9} attempts, continuing`),o("warn","cli_sse_post_retries_exhausted");return}let E=Math.min($cA*Math.pow(2,I-1),WcA);await TB(E)}}isConnectedStatus(){return this.state==="connected"}isClosedStatus(){return this.state==="closed"}setOnData(A){this.onData=A}setOnClose(A){this.onCloseCallback=A}setOnEvent(A){this.onEventCallback=A}close(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;this.clearLivenessTimer(),this.state="closing",this.abortController?.abort(),this.abortController=null}[Symbol.dispose](){this.close()}}function VcA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}DQ();cQ();BQ();function sEA(A){let Q=Buffer.from(A,"base64url").toString("utf-8"),B=kQ(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 eEA(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 TR(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 ACA(A,Q){return`${A.replace(/\/+$/,"")}/v1/code/sessions/${Q}`}async function QCA(A,Q){let B=await UB.post(`${A}/worker/register`,{},{headers:{Authorization:`Bearer ${Q}`,"Content-Type":"application/json","anthropic-version":"2023-06-01"},timeout:1e4}),I=B.data?.worker_epoch,E=typeof I==="string"?Number(I):I;if(typeof E!=="number"||!Number.isFinite(E)||!Number.isSafeInteger(E))throw Error(`registerWorker: invalid worker_epoch in response: ${zA(B.data)}`);return E}function BCA(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 ICA(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 VW(B);let J=A.epoch??await QCA(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 PR(G,{},I,void 0,E,Y),F,W=new _R(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{W.close(),U.close(),F?.(4090)}catch(w){z(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${FA(w)}`,{level:"error"})}throw Error("epoch superseded")}});U.setOnEvent((w)=>{W.reportDelivery(w.event_id,"received"),W.reportDelivery(w.event_id,"processed")});let N,D=!1,X=!1;return{write(w){return W.writeEvent(w)},async writeBatch(w){for(let V of w){if(X)break;await W.writeEvent(V)}},close(){X=!0,W.close(),U.close()},isConnectedStatus(){return D},getStateLabel(){if(U.isClosedStatus())return"closed";if(U.isConnectedStatus())return D?"connected":"init";return"connecting"},setOnData(w){U.setOnData(w)},setOnClose(w){F=w,U.setOnClose((V)=>{W.close(),w(V??4092)})},setOnConnect(w){N=w},getLastSequenceNum(){return U.getLastSequenceNum()},droppedBatchCount:0,reportState(w,V){W.reportState(w,V)},reportMetadata(w){W.reportMetadata(w)},reportDelivery(w,V){W.reportDelivery(w,V)},flush(){return W.flush()},getInternalEventWriter(){return(w,V,M)=>W.writeInternalEvent(w,V,M)},getInternalEventReaders(){return{readMain:()=>W.readInternalEvents(),readSubagents:()=>W.readSubagentInternalEvents()}},connect(){if(!A.outboundOnly)U.connect();W.initialize(J).then(()=>{D=!0,z(`[bridge:repl] v2 transport ready for writes (epoch=${J}, sse=${U.isConnectedStatus()?"open":"opening"})`),N?.()},(w)=>{z(`[bridge:repl] CCR v2 initialize failed: ${FA(w)}`,{level:"error"}),W.close(),U.close(),F?.(4091)})}}}lC();DQ();cQ();var McA="2023-06-01",KcA="ccr-byoc-2025-07-29";async function CCA({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`,W;try{W=await UB.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:M2(U,J),signal:I,validateStatus:(D)=>D<500})}catch(D){return z(`[bridge] Session creation request failed: ${FA(D)}`),null}if(W.status!==200&&W.status!==201){let D=eJ(W.data);return z(`[bridge] Session creation failed with status ${W.status}${D?`: ${D}`:""}`),null}let N=W.data;if(!N||typeof N!=="object"||!("id"in N)||typeof N.id!=="string")return z("[bridge] No session ID in response"),null;return N.id}async function YCA(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 UB.post(Y,{},{headers:M2(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)z(`[bridge] Session ${A} archived successfully`);else{let G=eJ(J.data);z(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){z(`[bridge] Session archive request failed: ${FA(J)}`)}}async function V2(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`),GI(Y,"no_token"),!1;let G=`${E}/v1/code/github/${A}-pr`,U={session_id:a1(Q),repo:B,pr_number:I},F;try{F=await UB.post(G,U,{headers:M2(J),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-pr request failed: ${FA(N)}`),GI(Y,"request_failed"),!1}if(!(F.status>=200&&F.status<300||F.status===409)){let N=eJ(F.data);return z(`[bridge] ${A}-pr failed ${F.status}${N?`: ${N}`:""}`),GI(Y,"http_error"),!1}return z(`[bridge] ${A}-pr ${B}#${I} ok`),XE(Y),!0}async function w2(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`),GI(Y,"no_token"),!1;let G=`${E}/v1/code/slack/${A}-thread`,U={session_id:a1(Q),channel:B,thread_ts:I},F;try{F=await UB.post(G,U,{headers:M2(J),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-thread request failed: ${FA(N)}`),GI(Y,"request_failed"),!1}if(!(F.status>=200&&F.status<300||F.status===409)){let N=eJ(F.data);return z(`[bridge] ${A}-thread failed ${F.status}${N?`: ${N}`:""}`),GI(Y,"http_error"),!1}return z(`[bridge] ${A}-thread ${B}/${I} ok`),XE(Y),!0}function M2(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":McA,"anthropic-beta":KcA};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}var DCA=2000,WCA=60000,NCA=900000,ScA=300000,XCA=3;function VCA(A){return A*(0.8+Math.random()*0.4)}var _cA=0;async function wCA(A){let{dir:Q,registrationDir:B,machineName:I,branch:E,gitRepoUrl:C,title:Y,baseUrl:J,sessionIngressUrl:G,workerType:U,getAccessToken:F,createSession:W,archiveSession:N,getCurrentTitle:D=()=>Y,toSDKMessages:X=()=>{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=()=>n$,initialHistoryCap:q=200,initialMessages:H,previouslyFlushedUUIDs:j,onInboundMessage:v,onPermissionResponse:_,onInterrupt:S,onSetModel:n,onSetMaxThinkingTokens:e,onSetPermissionMode:RA,onRenameSession:bA,onSetColor:NA,onFileSuggestions:EA,onReadFile:_A,onMcpAuthenticate:UQ,onMcpOauthCallbackUrl:k,onMcpReconnect:PA,onMcpStatus:BA,onStateChange:gA,onUserMessage:QA,onSessionEstablished:s,onInitError:mA,perpetual:yA,initialSSESequenceNum:lA=0,onTransportPersistenceReady:nA,onTransportPersistenceTeardown:VB}=A,iQ=++_cA,{writeBridgePointer:_B,clearBridgePointer:PB,readBridgePointer:BB}=await Promise.resolve().then(() => (FCA(),UCA)),AG=yA?await BB(Q):null,DI=AG?.source==="repl"?AG:null;z(`[bridge:repl] initBridgeCore #${iQ} starting (initialMessages=${H?.length??0}${DI?` perpetual prior=env:${DI.environmentId}`:""})`);let JQ=cEA({baseUrl:J,getAccessToken:F,runnerVersion:"0.2.136",onDebug:z,onAuth401:w,getTrustedDeviceToken:V}),NQ={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:$CA(),workerType:U,environmentId:$CA(),reuseEnvironmentId:DI?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},AA,SE;try{let h=await JQ.registerBridgeEnvironment(NQ);AA=h.environment_id,SE=h.environment_secret}catch(h){if(hEA("registration_failed",`[bridge:repl] Environment registration failed: ${FA(h)}`),mA?.(`[bridge:repl] Environment registration failed: ${FA(h)}`),DI&&h instanceof GE&&(h.status===410||h.status!==401&&W2(h.errorType)))await PB(Q);return gA?.("failed",FA(h)),null}z(`[bridge:repl] Environment registered: ${AA}`),o("info","bridge_repl_env_registered"),tA("tengu_bridge_repl_env_registered",{});async function gY(h,JA){if(AA!==h)return z(`[bridge:repl] Env mismatch (requested ${h}, got ${AA}) — cannot reconnect in place`),!1;let GQ=bR(JA),iA=GQ===JA?[JA]:[JA,GQ];for(let TA of iA)try{return await JQ.reconnectSession(AA,TA),z(`[bridge:repl] Reconnected session ${TA} in place on env ${AA}`),!0}catch(dQ){z(`[bridge:repl] reconnectSession(${TA}) failed: ${FA(dQ)}`)}return z("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let R0=DI?await gY(DI.environmentId,DI.sessionId):!1;if(DI&&!R0)await PB(Q);let DA,fI=new Set,IB=new Map,JC=new Set;if(R0&&DI){if(DA=DI.sessionId,z(`[bridge:repl] Perpetual session reused: ${DA}`),H&&j)for(let h of H)j.add(h.uuid)}else{let h=await W({environmentId:AA,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!h)return z("[bridge:repl] Session creation failed, deregistering environment"),mA?.("[bridge:repl] Session creation failed, deregistering environment"),tA("tengu_bridge_repl_session_failed",{}),await JQ.deregisterEnvironment(AA).catch(()=>{}),gA?.("failed","Session creation failed"),null;DA=h,z(`[bridge:repl] Session created: ${DA}`)}s?.(DA),await _B(Q,{sessionId:DA,environmentId:AA,source:"repl"}),o("info","bridge_repl_session_created"),tA("tengu_bridge_repl_started",{has_initial_messages:!!(H&&H.length>0),inProtectedNamespace:GO(),...WEA()});let x0=new Set;if(H)for(let h of H)x0.add(h.uuid);let UE=new N2(2000);for(let h of x0)UE.add(h);let QG=new N2(2000),qB=new AbortController,WA=null,wB=0,jB=R0?lA:0,RB=null,kC=null,O0=oEA(qB.signal),g0=O0.wake,H2=O0.signal,VI=new vR,hB=!QA,oB=3,CI=0,hI=null;async function BG(){if(hI)return hI;hI=vY();try{return await hI}finally{hI=null}}async function vY(){if(CI++,wB++,z(`[bridge:repl] Reconnecting after env lost (attempt ${CI}/${oB})`),CI>oB)return z(`[bridge:repl] Environment reconnect limit reached (${oB}), giving up`),!1;if(WA){let TA=WA.getLastSequenceNum();if(TA>jB)jB=TA;VB?.(),WA.close(),WA=null}if(g0(),VI.drop(),RB){let TA=RB;if(await JQ.stopWork(AA,TA,!1).catch(()=>{}),RB!==TA)return z("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),CI=0,!0;RB=null,kC=null}if(qB.signal.aborted)return z("[bridge:repl] Reconnect aborted by teardown"),!1;let h=AA;NQ.reuseEnvironmentId=h;let JA;for(let TA=1;;TA++)try{JA=await JQ.registerBridgeEnvironment(NQ);break}catch(dQ){if(dQ instanceof GE||TA>=XCA||qB.signal.aborted)return NQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Environment re-registration failed (attempt ${TA}): ${FA(dQ)}`),!1;let j9=VCA(DCA*2**(TA-1));if(z(`[bridge:repl] Environment re-registration transient failure (attempt ${TA}/${XCA}), retrying in ${Math.round(j9)}ms: ${FA(dQ)}`),await TB(j9,qB.signal),qB.signal.aborted)return NQ.reuseEnvironmentId=void 0,!1}if(AA=JA.environment_id,SE=JA.environment_secret,NQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Re-registered: requested=${h} got=${AA}`),qB.signal.aborted)return z("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await JQ.deregisterEnvironment(AA).catch(()=>{}),!1;if(WA!==null)return z("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),CI=0,!0;if(await gY(h,DA))return tA("tengu_bridge_repl_reconnected_in_place",{}),CI=0,!0;if(AA!==h)tA("tengu_bridge_repl_env_expired_fresh_session",{});if(await N(DA),qB.signal.aborted)return z("[bridge:repl] Reconnect aborted after archive, cleaning up"),await JQ.deregisterEnvironment(AA).catch(()=>{}),!1;let GQ=D(),iA=await W({environmentId:AA,title:GQ,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!iA)return z("[bridge:repl] Session creation failed during reconnection"),!1;if(qB.signal.aborted)return z("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await N(iA),!1;if(DA=iA,DEA(a1(iA)).catch(()=>{}),s?.(DA),jB=0,QG.clear(),hB=!QA,z(`[bridge:repl] Re-created session: ${DA}`),await _B(Q,{sessionId:DA,environmentId:AA,source:"repl"}),j?.clear(),fI.size>0){z(`[bridge:repl] Replaying ${fI.size} PR subscription(s) against new session`);for(let TA of fI){let dQ=TA.lastIndexOf("#");V2("subscribe",DA,TA.slice(0,dQ),Number(TA.slice(dQ+1)),J,F)}}if(JC.size>0){z(`[bridge:repl] Replaying ${JC.size} Slack thread subscription(s) against new session`);for(let TA of JC){let dQ=TA.indexOf("/");w2("subscribe",DA,TA.slice(0,dQ),TA.slice(dQ+1),J,F)}}return CI=0,!0}function Z2(){return F()}function mR(){let h=VI.end();if(h.length===0)return;if(!WA){z(`[bridge:repl] Cannot drain ${h.length} pending message(s): no transport`);return}for(let iA of h)UE.add(iA.uuid);let GQ=X(h).map((iA)=>({...iA,session_id:DA}));z(`[bridge:repl] Drained ${h.length} pending message(s) after flush`),WA.writeBatch(GQ)}let L2=null;function q2(){L2?.()}function cR(h){if(z(`[bridge:repl] Transport permanently closed: code=${h}`),tA("tengu_bridge_repl_ws_closed",{code:h}),WA){let GQ=WA.getLastSequenceNum();if(GQ>jB)jB=GQ;VB?.(),WA=null}g0();let JA=VI.drop();if(JA>0)z(`[bridge:repl] Dropping ${JA} pending message(s) on transport close (code=${h})`,{level:"warn"});if(h===1000){gA?.("failed","session ended"),qB.abort(),q2();return}gA?.("reconnecting",`Remote Control connection lost (code ${h})`),z(`[bridge:repl] Transport reconnect budget exhausted (code=${h}), attempting env reconnect`),BG().then((GQ)=>{if(GQ)return;if(qB.signal.aborted)return;z("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),tA("tengu_bridge_repl_reconnect_failed",{close_code:h}),gA?.("failed","reconnection failed"),q2()})}let uR,zCA=null,HCA={api:JQ,getCredentials:()=>({environmentId:AA,environmentSecret:SE}),signal:qB.signal,getPollIntervalConfig:M,onStateChange:gA,getWsState:()=>WA?.getStateLabel()??"null",isAtCapacity:()=>WA!==null,capacitySignal:H2,onFatalError:q2,getHeartbeatInfo:()=>{if(!RB||!kC)return null;return{environmentId:AA,workId:RB,sessionToken:kC}},onHeartbeatFatal:(h)=>{if(z(`[bridge:repl] heartbeatWork fatal (status=${h.status}) — tearing down work item for fast re-dispatch`),WA){let JA=WA.getLastSequenceNum();if(JA>jB)jB=JA;VB?.(),WA.close(),WA=null}if(VI.drop(),RB)JQ.stopWork(AA,RB,!1).catch((JA)=>{z(`[bridge:repl] stopWork after heartbeat fatal: ${FA(JA)}`)});RB=null,kC=null,g0(),gA?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await BG())return null;return{environmentId:AA,environmentSecret:SE}},onWorkReceived:(h,JA,GQ,iA)=>{if(WA?.isConnectedStatus())z(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${GQ})`);if(z(`[bridge:repl] Work received: workId=${GQ} workSessionId=${h} currentSessionId=${DA} match=${TR(h,DA)}`),_B(Q,{sessionId:DA,environmentId:AA,source:"repl"}),!TR(h,DA)){z(`[bridge:repl] Rejecting foreign session: expected=${DA} got=${h}`);return}RB=GQ,kC=JA;let TA=iA||AQ(process.env.CLAUDE_BRIDGE_USE_CCR_V2),dQ;if(!TA){if(dQ=Z2(),!dQ){z("[bridge:repl] No OAuth token available for session ingress, skipping work");return}VW(dQ)}if(tA("tengu_bridge_repl_work_received",{}),WA){VB?.();let rQ=WA;WA=null;let EB=rQ.getLastSequenceNum();if(EB>jB)jB=EB;rQ.close()}VI.deactivate();let j9=(rQ)=>nEA(rQ,{transport:WA,sessionId:DA,onInterrupt:S,onSetModel:n,onSetMaxThinkingTokens:e,onSetPermissionMode:RA,onRenameSession:bA,onSetColor:NA,onFileSuggestions:EA,onReadFile:_A,onMcpAuthenticate:UQ,onMcpOauthCallbackUrl:k,onMcpReconnect:PA,onMcpStatus:BA}),O2=!1,lR=(rQ)=>{if(WA=rQ,rQ.setOnConnect(()=>{if(WA!==rQ)return;if(z("[bridge:repl] Ingress transport connected"),tA("tengu_bridge_repl_ws_connected",{}),!TA){let EB=Z2();if(EB)VW(EB)}if(x2=!1,!O2&&H&&H.length>0){O2=!0;let EB=q,wI=H.filter((R9)=>OR(R9)&&!j?.has(R9.uuid)),bC=EB>0&&wI.length>EB?wI.slice(-EB):wI;if(bC.length<wI.length)z(`[bridge:repl] Capped initial flush: ${wI.length} -> ${bC.length} (cap=${EB})`),tA("tengu_bridge_repl_history_capped",{eligible_count:wI.length,capped_count:bC.length});let v0=X(bC);if(v0.length>0){z(`[bridge:repl] Flushing ${v0.length} initial message(s) via transport`);let R9=v0.map((IG)=>({...IG,session_id:DA,historical:!0})),iR=rQ.droppedBatchCount;rQ.writeBatch(R9).then(()=>{if(rQ.droppedBatchCount>iR){z(`[bridge:repl] Initial flush dropped ${rQ.droppedBatchCount-iR} batch(es) — not marking ${v0.length} UUID(s) as flushed`);return}if(j){for(let IG of v0)if(IG.uuid)j.add(IG.uuid)}}).catch((IG)=>z(`[bridge:repl] Initial flush failed: ${IG}`)).finally(()=>{if(WA!==rQ)return;mR(),gA?.("connected")})}else mR(),gA?.("connected")}else if(!VI.active)gA?.("connected")}),rQ.setOnData((EB)=>{dEA(EB,UE,QG,v,_,j9)}),zCA=cR,rQ.setOnClose((EB)=>{if(WA!==rQ)return;cR(EB)}),!O2&&H&&H.length>0)VI.start();rQ.connect()};if(wB++,TA){let rQ=ACA(J,h),EB=wB;z(`[bridge:repl] CCR v2: sessionUrl=${rQ} session=${h} gen=${EB}`),ICA({sessionUrl:rQ,ingressToken:JA,sessionId:h,initialSequenceNum:jB}).then((wI)=>{if(qB.signal.aborted){wI.close();return}if(EB!==wB){z(`[bridge:repl] CCR v2: discarding stale handshake gen=${EB} current=${wB}`),wI.close();return}if(lR(wI),nA){let bC=wI.getInternalEventWriter?.(),v0=wI.getInternalEventReaders?.();if(bC&&v0)nA(bC,v0)}},(wI)=>{if(z(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${FA(wI)}`,{level:"error"}),tA("tengu_bridge_repl_ccr_v2_init_failed",{}),EB!==wB)return;if(RB)JQ.stopWork(AA,RB,!1).catch((bC)=>{z(`[bridge:repl] stopWork after v2 init failure: ${FA(bC)}`)}),RB=null,kC=null;g0()})}else{let rQ=eEA(G,h);z(`[bridge:repl] Ingress URL: ${rQ}`),z(`[bridge:repl] Creating HybridTransport: session=${h}`);let EB=dQ??"";lR(BCA(new MR(new URL(rQ),{Authorization:`Bearer ${EB}`,"anthropic-version":"2023-06-01"},h,()=>({Authorization:`Bearer ${Z2()??EB}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{gA?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),g0()}})))}}};PcA(HCA);let j2=yA?setInterval(()=>{if(hI)return;_B(Q,{sessionId:DA,environmentId:AA,source:"repl"})},3600000):null;j2?.unref?.();let pR=M().session_keepalive_interval_v2_ms,R2=pR>0?setInterval(()=>{if(!WA)return;z("[bridge:repl] keep_alive sent"),WA.write({type:"keep_alive"}).catch((h)=>{z(`[bridge:repl] keep_alive write failed: ${FA(h)}`)})},pR):null;R2?.unref?.();let x2=!1;L2=async()=>{if(x2){z(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${AA} session=${DA}`);return}x2=!0,VB?.();let h=Date.now();if(z(`[bridge:repl] Teardown starting: env=${AA} session=${DA} workId=${RB??"none"} transportState=${WA?.getStateLabel()??"null"}`),j2!==null)clearInterval(j2);if(R2!==null)clearInterval(R2);if(uR)process.off("SIGUSR2",uR);if(qB.abort(),z("[bridge:repl] Teardown: poll loop aborted"),WA){let iA=WA.getLastSequenceNum();if(iA>jB)jB=iA}if(yA){WA=null,VI.drop(),await _B(Q,{sessionId:DA,environmentId:AA,source:"repl"}),z(`[bridge:repl] Teardown (perpetual): leaving env=${AA} session=${DA} alive on server, duration=${Date.now()-h}ms`);return}let JA=WA;if(WA=null,VI.drop(),JA)JA.write(gR(DA));let GQ=RB?JQ.stopWork(AA,RB,!0).then(()=>{z("[bridge:repl] Teardown: stopWork completed")}).catch((iA)=>{z(`[bridge:repl] Teardown stopWork failed: ${FA(iA)}`)}):Promise.resolve();await Promise.all([GQ,N(DA)]),JA?.close(),z("[bridge:repl] Teardown: transport closed"),await JQ.deregisterEnvironment(AA).catch((iA)=>{z(`[bridge:repl] Teardown deregister failed: ${FA(iA)}`)}),await PB(Q),z(`[bridge:repl] Teardown complete: env=${AA} duration=${Date.now()-h}ms`)},z(`[bridge:repl] Ready: env=${AA} session=${DA}`),gA?.("ready");let q9={get bridgeSessionId(){return DA},get environmentId(){return AA},getLastSequenceNum(){return q9.getSSESequenceNum()},flush(){return WA?.flush()??Promise.resolve()},getSSESequenceNum(){let h=WA?.getLastSequenceNum()??0;return Math.max(jB,h)},sessionIngressUrl:G,writeMessages(h){let JA=h.filter((TA)=>OR(TA)&&!x0.has(TA.uuid)&&!UE.has(TA.uuid));if(JA.length===0)return;if(!hB)for(let TA of JA){let dQ=iEA(TA);if(dQ!==void 0&&QA?.(dQ,DA)){hB=!0;break}}if(VI.enqueue(...JA)){z(`[bridge:repl] Queued ${JA.length} message(s) during initial flush`);return}if(!WA){let TA=JA.map((dQ)=>dQ.type).join(",");z(`[bridge:repl] Transport not configured, dropping ${JA.length} message(s) [${TA}] for session=${DA}`,{level:"warn"});return}for(let TA of JA)UE.add(TA.uuid);z(`[bridge:repl] Sending ${JA.length} message(s) via transport`);let iA=X(JA).map((TA)=>({...TA,session_id:DA}));WA.writeBatch(iA)},writeSdkMessages(h){let JA=h.filter((iA)=>!iA.uuid||!UE.has(iA.uuid));if(JA.length===0)return;if(!WA){z(`[bridge:repl] Transport not configured, dropping ${JA.length} SDK message(s) for session=${DA}`,{level:"warn"});return}for(let iA of JA)if(iA.uuid)UE.add(iA.uuid);let GQ=JA.map((iA)=>({...iA,session_id:DA}));WA.writeBatch(GQ)},sendControlRequest(h){if(!WA){z("[bridge:repl] Transport not configured, skipping control_request");return}let JA={...h,session_id:DA};WA.write(JA),z(`[bridge:repl] Sent control_request request_id=${h.request_id}`)},sendControlResponse(h){if(!WA){z("[bridge:repl] Transport not configured, skipping control_response");return}let JA={...h,session_id:DA};WA.write(JA),z("[bridge:repl] Sent control_response")},sendControlCancelRequest(h){if(!WA){z("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let JA={type:"control_cancel_request",request_id:h,session_id:DA};WA.write(JA),z(`[bridge:repl] Sent control_cancel_request request_id=${h}`)},reportMetadata(h){WA?.reportMetadata(h)},sendResult(){if(!WA){z(`[bridge:repl] sendResult: skipping, transport not configured session=${DA}`);return}WA.write(gR(DA)),z(`[bridge:repl] Sent result for session=${DA}`)},async subscribePR(h,JA,GQ){let iA=`${h}#${JA}`,TA=IB.get(iA);if(GQ)IB.set(iA,{agentId:GQ,repo:h,prNumber:JA});let dQ=await V2("subscribe",DA,h,JA,J,F);if(dQ)fI.add(iA);else if(GQ)if(TA)IB.set(iA,TA);else IB.delete(iA);return dQ},async unsubscribePR(h,JA){let GQ=await V2("unsubscribe",DA,h,JA,J,F);if(GQ){let iA=`${h}#${JA}`;fI.delete(iA),IB.delete(iA)}return GQ},async subscribeSlackThread(h,JA){let GQ=await w2("subscribe",DA,h,JA,J,F);if(GQ)JC.add(`${h}/${JA}`);return GQ},async unsubscribeSlackThread(h,JA){let GQ=await w2("unsubscribe",DA,h,JA,J,F);if(GQ)JC.delete(`${h}/${JA}`);return GQ},getPRWebhookTargets(){return[...IB.values()]},async teardown(){ZCA(),await L2?.(),z("[bridge:repl] Torn down"),tA("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return q9.teardown()}},ZCA=m0(q9);return q9}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=()=>n$,getHeartbeatInfo:W,onHeartbeatFatal:N}){z(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let X=0,w=null,V=null,M=0,q=0,H=!1;while(!B.aborted){let{environmentId:j,environmentSecret:v}=Q(),_=F();try{let S=await A.pollForWork(j,v,B,_.reclaim_older_than_ms);if(q=0,X>0)z(`[bridge:repl] Poll recovered after ${X} consecutive error(s)`),X=0,w=null,V=null,M=0,I?.("ready");if(!S){let e=H;if(H=!1,J?.()&&G&&!e){let RA=_.poll_interval_ms_at_capacity;if(_.non_exclusive_heartbeat_interval_ms>0&&W){tA("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:_.non_exclusive_heartbeat_interval_ms});let NA=RA>0?Date.now()+RA:null,EA=!1,_A=0;while(!B.aborted&&J()&&(NA===null||Date.now()<NA)){let k=F();if(k.non_exclusive_heartbeat_interval_ms<=0)break;let PA=W();if(!PA)break;let BA=G();try{await A.heartbeatWork(PA.environmentId,PA.workId,PA.sessionToken)}catch(gA){if(z(`[bridge:repl:heartbeat] Failed: ${FA(gA)}`),gA instanceof GE){if(BA.cleanup(),tA("tengu_bridge_heartbeat_error",{status:gA.status,error_type:gA.status===401||gA.status===403?"auth_failed":"fatal"}),N)N(gA),z(`[bridge:repl:heartbeat] Fatal (status=${gA.status}), work state cleared — fast-polling for re-dispatch`);else EA=!0;break}}_A++,await TB(k.non_exclusive_heartbeat_interval_ms,BA.signal),BA.cleanup()}let UQ=EA?"error":B.aborted?"shutdown":!J()?"capacity_changed":NA!==null&&Date.now()>=NA?"poll_due":"config_disabled";if(tA("tengu_bridge_heartbeat_mode_exited",{reason:UQ,heartbeat_cycles:_A}),!EA){if(UQ==="poll_due")z(`[bridge:repl] Heartbeat poll_due after ${_A} cycles — falling through to pollForWork`);continue}}let bA=RA>0?RA:_.non_exclusive_heartbeat_interval_ms;if(bA>0){let NA=G(),EA=Date.now();await TB(bA,NA.signal),NA.cleanup();let _A=Date.now()-EA-bA;if(_A>60000)z(`[bridge:repl] At-capacity sleep overran by ${Math.round(_A/1000)}s — process suspension detected, forcing one fast-poll cycle`),tA("tengu_bridge_repl_suspension_detected",{overrun_ms:_A}),H=!0}}else await TB(_.poll_interval_ms_not_at_capacity,B);continue}let n;try{n=sEA(S.secret)}catch(e){z(`[bridge:repl] Failed to decode work secret: ${FA(e)}`),tA("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(j,S.id,!1).catch(()=>{});continue}z(`[bridge:repl] Acknowledging workId=${S.id}`);try{await A.acknowledgeWork(j,S.id,n.session_ingress_token)}catch(e){z(`[bridge:repl] Acknowledge failed workId=${S.id}: ${FA(e)}`)}if(S.data.type==="healthcheck"){z("[bridge:repl] Healthcheck received");continue}if(S.data.type==="session"){let e=S.data.id;try{yI(e,"session_id")}catch{z(`[bridge:repl] Invalid session_id in work: ${e}`);continue}E(e,n.session_ingress_token,S.id,n.use_code_sessions===!0),z("[bridge:repl] Work accepted, continuing poll loop")}}catch(S){if(B.aborted)break;if(S instanceof GE&&S.status===404&&C){let k=Q().environmentId;if(j!==k){z(`[bridge:repl] Stale poll error for old env=${j}, current env=${k} — skipping onEnvironmentLost`),X=0,w=null;continue}if(q++,z(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${q}/3)`),tA("tengu_bridge_repl_env_lost",{attempt:q}),q>3){z("[bridge:repl] Environment re-registration limit reached (3), giving up"),I?.("failed","Environment deleted and re-registration limit reached"),U?.();break}I?.("reconnecting","environment lost, recreating session");let PA=await C();if(B.aborted)break;if(PA){X=0,w=null,I?.("ready"),z(`[bridge:repl] Re-registered environment: ${PA.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(S instanceof GE){let k=W2(S.errorType),PA=uEA(S);if(z(`[bridge:repl] Fatal poll error: ${S.message} (status=${S.status}, type=${S.errorType??"unknown"})${PA?" (suppressed)":""}`),tA("tengu_bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),o(k?"info":"error","bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),!PA)I?.("failed",k?"session expired · /remote-control to reconnect":S.message);U?.();break}let n=Date.now();if(V!==null&&n-V>Math.max(WCA,M)*2)z(`[bridge:repl] Detected system sleep (${Math.round((n-V)/1000)}s gap), resetting poll error budget`),o("info","bridge_repl_poll_sleep_detected",{gapMs:n-V}),X=0,w=null;if(V=n,X++,w===null)w=n;let e=n-w,RA=yEA(S),bA=bEA(S),NA=Y?.()??"unknown";if(z(`[bridge:repl] Poll error (attempt ${X}, elapsed ${Math.round(e/1000)}s, ws=${NA}): ${bA}`),tA("tengu_bridge_repl_poll_error",{status:RA,consecutiveErrors:X,elapsedMs:e}),X===1)I?.("reconnecting",bA);if(e>=NCA){z(`[bridge:repl] Poll failures exceeded ${NCA/1000}s (${X} errors), giving up`),o("info","bridge_repl_poll_give_up"),tA("tengu_bridge_repl_poll_give_up",{consecutiveErrors:X,elapsedMs:e,lastStatus:RA}),I?.("failed","connection to server lost");break}let EA=fEA(S),_A=Math.min(DCA*2**(X-1),WCA),UQ=VCA(EA!==void 0?Math.max(_A,Math.min(EA,ScA)):_A);if(M=UQ,F().non_exclusive_heartbeat_interval_ms>0){let k=W?.();if(k)try{await A.heartbeatWork(k.environmentId,k.workId,k.sessionToken)}catch{}}await TB(UQ,B)}}z(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function TcA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function kcA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function bcA(A,Q){if(kcA(A,Q))return"http://localhost:4000";if(TcA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function MCA(A,Q,B){let{toCompatSessionId:I}=OCA(ECA),E=I(A),Y=`${bcA(E,Q)}/code/${E}`;return B?`${Y}?${new URLSearchParams(B)}`:Y}DQ();async function KCA(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:W,perpetual:N=!1,initialSSESequenceNum:D,onConflict:X}=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:W},q=[],H=null,j=[],v=null,_=[],S=null,n=!1,e=null,RA={detail:null},bA=ycA(),NA=()=>wCA({dir:Q,registrationDir:B,machineName:bA,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:V,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:w,onInitError:console.error,createSession:({environmentId:BA,title:gA,signal:QA})=>CCA({environmentId:BA,title:gA,tags:["claude-code-assistant"],signal:QA},M),archiveSession:(BA)=>YCA(BA,M),perpetual:N,initialSSESequenceNum:D,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...n$,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(BA){let gA=Vl(BA);if(!gA)return;q.push({content:gA.content,uuid:gA.uuid}),H?.(),H=null},onInterrupt(){j.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),v?.(),v=null},onSetModel(BA){j.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:BA}}),v?.(),v=null},onSetMaxThinkingTokens(BA){j.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:BA}}),v?.(),v=null},onPermissionResponse(BA){_.push(BA),S?.(),S=null},onStateChange(BA,gA){if(e?.(BA,gA),BA==="failed")RA.detail=gA??"unknown failure",n=!0,H?.(),v?.(),S?.()}}),EA=await NA();if(!EA&&X&&RA.detail?.includes("409")){if(await X({machineName:bA,message:RA.detail})==="takeover")n=!1,RA.detail=null,EA=await NA()}if(!EA){let BA=RA.detail??"initBridgeCore returned null (env registration or session creation failed)";return z(`[bridge:daemon] connectRemoteControl failed: ${BA}`),{ok:!1,error:{kind:RA.detail?.includes("409")?"conflict":RA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:BA}}}async function*_A(){while(!n){while(q.length>0)if(yield q.shift(),n)return;await new Promise((BA)=>{H=BA})}}async function*UQ(){while(!n){while(j.length>0)if(yield j.shift(),n)return;await new Promise((BA)=>{v=BA})}}async function*k(){while(!n){while(_.length>0)if(yield _.shift(),n)return;await new Promise((BA)=>{S=BA})}}return{ok:!0,handle:{get sessionUrl(){return MCA(EA.bridgeSessionId,V)},get environmentId(){return EA.environmentId},get bridgeSessionId(){return EA.bridgeSessionId},getSSESequenceNum(){return EA.getSSESequenceNum()},hasPendingPrompts(){return q.length>0},write(BA){EA.writeSdkMessages([BA])},sendResult(){EA.sendResult()},sendControlRequest(BA){EA.sendControlRequest(BA)},sendControlResponse(BA){EA.sendControlResponse(BA)},sendControlCancelRequest(BA){EA.sendControlCancelRequest(BA)},inboundPrompts:_A,controlRequests:UQ,permissionResponses:k,onStateChange(BA){e=BA},async teardown(){n=!0,H?.(),v?.(),S?.(),await EA.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var hcA=1000,mcA=1e4,ccA=5000,ucA=60000,hR=3;function pcA(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 lcA(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"&&rR(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}function z2(A){if(!A){XE("assistant_worker_start");return}if(A.kind==="auth"||A.kind==="conflict")CF("assistant_worker_start",A.kind);else GI("assistant_worker_start",A.kind)}async function icA(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:W,log:N=()=>{}}=A;N("─── worker start ───");let D=await G?.load(),X={...Q,initialSSESequenceNum:Q.initialSSESequenceNum??D?.lastSSESequenceNum};if(!X.getAccessToken()){let YA={kind:"auth",detail:"getAccessToken returned empty"};return z2(YA),{ok:!1,error:YA}}let w=await KCA(X);if(!w.ok)return N(`bridge connection failed: ${w.error.kind} — ${w.error.detail}`),z2(w.error),{ok:!1,error:w.error};let V=w.handle;N(`bridge connected url=${V.sessionUrl} env=${V.environmentId}`);let M=D?.claudeSessionId,q=V.bridgeSessionId,H=[],j=null,v=!1,_=null,S=0,n=!0,e=0,RA=Promise.resolve();function bA(){if(!G)return;let YA={claudeSessionId:M,lastSSESequenceNum:V.getSSESequenceNum(),bridgeSessionId:V.bridgeSessionId};RA=RA.then(()=>G.save(YA).catch((JQ)=>{N(`stateAdapter.save threw: ${JQ}`)}))}function NA(){if(H.length>0||V.hasPendingPrompts()){N("persist skipped: prompt queued");return}bA()}bA();let EA=new AbortController,_A=new Map,UQ=null;function k(){return UQ??=(async()=>{NA();for(let YA of _A.keys())V.sendControlCancelRequest(YA);_A.clear(),await V.teardown(),await RA})()}if(W.addEventListener("abort",()=>{EA.abort(),k().catch((YA)=>N(`teardown threw: ${YA}`))}),W.aborted){await k();let YA={kind:"unknown",detail:"aborted before start"};return z2(YA),{ok:!1,error:YA}}let PA="connected";V.onStateChange((YA,JQ)=>{if(N(`bridge state=${YA} detail=${JQ??""}`),PA=YA,YA==="ready"&&V.bridgeSessionId!==q)q=V.bridgeSessionId,bA();else if(YA==="connected")NA();if(YA==="failed")N(`bridge failed: ${JQ??"unknown"}`),EA.abort(),k().catch((NQ)=>N(`teardown threw: ${NQ}`))});let BA=I?.horizonMs??600000,gA=I?.leadMs??ccA,QA=null,s=!1,mA=!1,yA="";async function lA(){if(!I)return;let YA=await Nl(I.dir).catch((NQ)=>{return N(`computeCronHorizon threw: ${NQ}`),{nextFire:null,hasOverdue:!1}});QA=YA.nextFire,mA=YA.hasOverdue;let JQ=YA.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(YA.nextFire).toISOString()} hasOverdue=${YA.hasOverdue}`;if(JQ!==yA)yA=JQ,N(JQ)}let nA;if(I)await lA(),nA=setInterval(lA,mcA),nA.unref?.();function VB(YA){H.push({type:"user",message:{role:"user",content:YA},parent_tool_use_id:null,session_id:""}),j?.(),j=null}async function iQ(YA,JQ,NQ){if(C){let IB=await C(YA,JQ,NQ);if(IB)return Y?.(YA,IB),IB}if(PA!=="connected"){N(`permission denied — bridge state=${PA}, request would drop`);let IB={behavior:"deny",message:`Cannot request permission: remote control is ${PA}. Try again in a moment.`};return Y?.(YA,IB),IB}let AA=fcA();N(`permission request tool=${YA} req=${AA}`);let{signal:SE,suggestions:gY,blockedPath:R0,toolUseID:DA}=NQ;V.sendControlRequest({type:"control_request",request_id:AA,request:{subtype:"can_use_tool",tool_name:YA,display_name:tR(YA),input:JQ,tool_use_id:DA,...gY&&{permission_suggestions:gY},...R0&&{blocked_path:R0},..."decisionReason"in NQ&&NQ.decisionReason&&{decision_reason:NQ.decisionReason},..."agentID"in NQ&&NQ.agentID&&{agent_id:NQ.agentID}}});let fI;try{let IB=await new Promise((x0,UE)=>{_A.set(AA,x0),fI=setTimeout((QG,qB,WA,wB,jB)=>{if(QG.delete(qB))WA(`permission timeout req=${qB}`),wB.sendControlCancelRequest(qB),jB({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},ucA,_A,AA,N,V,x0),fI.unref?.(),SE.addEventListener("abort",()=>{if(_A.delete(AA))V.sendControlCancelRequest(AA);UE(Error("aborted"))},{once:!0})});N(`permission response req=${AA} behavior=${IB.behavior}`);let JC=IB.behavior==="allow"?{behavior:"allow",updatedInput:IB.updatedInput,updatedPermissions:IB.updatedPermissions}:{behavior:"deny",message:IB.message??"Denied via remote control"};return Y?.(YA,JC),JC}finally{if(fI)clearTimeout(fI);_A.delete(AA)}}let _B=!1;async function PB(){if(_!==null||_B||EA.signal.aborted)return;if(_B=!0,v=!1,H.length>0)n=!1;async function*YA(){while(!v){while(H.length>0)if(n=!1,yield H.shift(),v)return;await new Promise((AA)=>{j=AA})}}N(`spawning query resume=${M??"<fresh>"}`);let JQ={assistant:!0,cwd:Q.dir,resume:M,stderr:(AA)=>N(`[child] ${AA.trimEnd()}`),canUseTool:iQ},NQ;try{if(NQ=await E(JQ),B)NQ={...NQ,env:{...NQ.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(AA){if(N(`buildQueryOptions threw: ${AA}`),_B=!1,e++,e>=hR)N(`${e} consecutive buildQueryOptions failures — dropping ${H.length} queued input(s)`),H.length=0;else if(H.length>0&&!EA.signal.aborted)PB();return}if(EA.signal.aborted){_B=!1;return}try{_=Iu({prompt:YA(),options:NQ})}finally{_B=!1}(async()=>{try{N("output pump started");for await(let AA of _){if(AA.type==="system"&&AA.subtype==="init"){if(AA.session_id!==M)M=AA.session_id,NA()}if(AA.type==="result")n=!0,e=0,s=!0,NA();if(!pcA(AA))continue;let SE=J?J(AA):AA;if(SE===null)continue;V.write(SE)}}catch(AA){N(`query threw: ${AA}`),e++}finally{N("output pump ended"),_=null;for(let AA of _A.keys())V.sendControlCancelRequest(AA);if(_A.clear(),H.length>0&&!EA.signal.aborted)if(e>=hR)N(`${e} consecutive crashes — dropping ${H.length} queued input(s)`),H.length=0;else PB()}})()}let BB=setInterval(()=>{let YA=Date.now(),JQ=QA!==null&&QA-YA<BA;if(_===null){let NQ=QA!==null&&QA-YA<gA;if((NQ||mA&&!s)&&e<hR&&!EA.signal.aborted)N(NQ?`cron due in ${QA-YA}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),PB();return}if(v)return;if(!n||H.length>0)return;if(YA-S<F)return;if(JQ)return;if(mA&&!s)return;N("idle conditions met → closing input gen"),NA(),v=!0,j?.(),j=null},hcA);if(BB.unref?.(),U)N("initialPrompt → injecting"),S=Date.now(),VB(U),PB();let AG=(async()=>{if(await Promise.all([(async()=>{for await(let YA of V.inboundPrompts()){if(EA.signal.aborted)return;if(N("bridge prompt received"),S=Date.now(),YA.uuid)V.write({type:"user",uuid:YA.uuid,session_id:"",message:{role:"user",content:YA.content},parent_tool_use_id:null});VB(YA.content),PB()}})(),(async()=>{for await(let YA of V.controlRequests()){if(EA.signal.aborted)return;switch(YA.request.subtype){case"interrupt":N("bridge interrupt"),_?.interrupt();break;case"set_model":N(`bridge setModel=${YA.request.model??"<default>"}`),_?.setModel(YA.request.model);break;case"set_max_thinking_tokens":N(`bridge setMaxThinkingTokens=${YA.request.max_thinking_tokens}`),_?.setMaxThinkingTokens(YA.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let YA of V.permissionResponses()){if(EA.signal.aborted)return;let JQ=lcA(YA,_A,V.sendControlCancelRequest);if(JQ)N(`permission response for unknown req=${JQ} (stale)`)}})()]),clearInterval(BB),nA)clearInterval(nA);_?.close(),await k(),N("─── worker stop ───")})(),DI={get sessionUrl(){return V.sessionUrl},get bridgeSessionId(){return V.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(YA){S=Date.now(),VB(YA),PB()},async interrupt(){await _?.interrupt()},done:AG,teardown:k,[Symbol.asyncDispose]:k};return z2(null),{ok:!0,handle:DI}}export{icA as runAssistantWorker};
|
|
188
|
+
`)}else z(`SSETransport: Ignoring client_event with no type in payload: event_id=${B.event_id}`);this.onEventCallback?.(B)}handleConnectionError(){if(this.clearLivenessTimer(),this.state==="closing"||this.state==="closed")return;this.abortController?.abort(),this.abortController=null;let A=Date.now();if(!this.reconnectStartTime)this.reconnectStartTime=A;let Q=A-this.reconnectStartTime;if(Q<GcA){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(YcA*Math.pow(2,this.reconnectAttempts-1),JcA),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)`),o("error","cli_sse_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},I)}else z(`SSETransport: Reconnection time budget exhausted after ${Math.round(Q/1000)}s`,{level:"error"}),o("error","cli_sse_reconnect_exhausted",{reconnectAttempts:this.reconnectAttempts,elapsedMs:Q}),this.state="closed",this.onCloseCallback?.()}onLivenessTimeout=()=>{this.livenessTimer=null,z("SSETransport: Liveness timeout, reconnecting",{level:"error"}),o("error","cli_sse_liveness_timeout"),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,UcA)}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"),o("warn","cli_sse_post_no_token");return}let B={...Q,"Content-Type":"application/json","anthropic-version":"2023-06-01","User-Agent":o1()};z(`SSETransport: POST body keys=${Object.keys(A).join(",")}`);for(let I=1;I<=L9;I++){try{let C=await UB.post(this.postUrl,A,{headers:B,validateStatus:XcA});if(C.status===200||C.status===201){z(`SSETransport: POST success type=${A.type}`);return}if(z(`SSETransport: POST ${C.status} body=${zA(C.data).slice(0,200)}`),C.status>=400&&C.status<500&&C.status!==429){z(`SSETransport: POST returned ${C.status} (client error), not retrying`),o("warn","cli_sse_post_client_error",{status:C.status});return}z(`SSETransport: POST returned ${C.status}, attempt ${I}/${L9}`),o("warn","cli_sse_post_retryable_error",{status:C.status,attempt:I})}catch(C){z(`SSETransport: POST error: ${FA(C)}, attempt ${I}/${L9}`),o("warn","cli_sse_post_network_error",{attempt:I})}if(I===L9){z(`SSETransport: POST failed after ${L9} attempts, continuing`),o("warn","cli_sse_post_retries_exhausted");return}let E=Math.min($cA*Math.pow(2,I-1),WcA);await TB(E)}}isConnectedStatus(){return this.state==="connected"}isClosedStatus(){return this.state==="closed"}setOnData(A){this.onData=A}setOnClose(A){this.onCloseCallback=A}setOnEvent(A){this.onEventCallback=A}close(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;this.clearLivenessTimer(),this.state="closing",this.abortController?.abort(),this.abortController=null}[Symbol.dispose](){this.close()}}function VcA(A){let Q=A.pathname;if(Q.endsWith("/stream"))Q=Q.slice(0,-7);return`${A.protocol}//${A.host}${Q}`}DQ();cQ();BQ();function sEA(A){let Q=Buffer.from(A,"base64url").toString("utf-8"),B=kQ(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 eEA(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 TR(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 ACA(A,Q){return`${A.replace(/\/+$/,"")}/v1/code/sessions/${Q}`}async function QCA(A,Q){let B=await UB.post(`${A}/worker/register`,{},{headers:{Authorization:`Bearer ${Q}`,"Content-Type":"application/json","anthropic-version":"2023-06-01"},timeout:1e4}),I=B.data?.worker_epoch,E=typeof I==="string"?Number(I):I;if(typeof E!=="number"||!Number.isFinite(E)||!Number.isSafeInteger(E))throw Error(`registerWorker: invalid worker_epoch in response: ${zA(B.data)}`);return E}function BCA(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 ICA(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 VW(B);let J=A.epoch??await QCA(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 PR(G,{},I,void 0,E,Y),F,W=new _R(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{W.close(),U.close(),F?.(4090)}catch(w){z(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${FA(w)}`,{level:"error"})}throw Error("epoch superseded")}});U.setOnEvent((w)=>{W.reportDelivery(w.event_id,"received"),W.reportDelivery(w.event_id,"processed")});let N,D=!1,X=!1;return{write(w){return W.writeEvent(w)},async writeBatch(w){for(let V of w){if(X)break;await W.writeEvent(V)}},close(){X=!0,W.close(),U.close()},isConnectedStatus(){return D},getStateLabel(){if(U.isClosedStatus())return"closed";if(U.isConnectedStatus())return D?"connected":"init";return"connecting"},setOnData(w){U.setOnData(w)},setOnClose(w){F=w,U.setOnClose((V)=>{W.close(),w(V??4092)})},setOnConnect(w){N=w},getLastSequenceNum(){return U.getLastSequenceNum()},droppedBatchCount:0,reportState(w,V){W.reportState(w,V)},reportMetadata(w){W.reportMetadata(w)},reportDelivery(w,V){W.reportDelivery(w,V)},flush(){return W.flush()},getInternalEventWriter(){return(w,V,M)=>W.writeInternalEvent(w,V,M)},getInternalEventReaders(){return{readMain:()=>W.readInternalEvents(),readSubagents:()=>W.readSubagentInternalEvents()}},connect(){if(!A.outboundOnly)U.connect();W.initialize(J).then(()=>{D=!0,z(`[bridge:repl] v2 transport ready for writes (epoch=${J}, sse=${U.isConnectedStatus()?"open":"opening"})`),N?.()},(w)=>{z(`[bridge:repl] CCR v2 initialize failed: ${FA(w)}`,{level:"error"}),W.close(),U.close(),F?.(4091)})}}}lC();DQ();cQ();var McA="2023-06-01",KcA="ccr-byoc-2025-07-29";async function CCA({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`,W;try{W=await UB.post(F,{title:Q,events:[],session_context:{sources:[],outcomes:[],model:G},environment_id:A,source:"remote-control",...B!==void 0&&{tags:B}},{headers:M2(U,J),signal:I,validateStatus:(D)=>D<500})}catch(D){return z(`[bridge] Session creation request failed: ${FA(D)}`),null}if(W.status!==200&&W.status!==201){let D=eJ(W.data);return z(`[bridge] Session creation failed with status ${W.status}${D?`: ${D}`:""}`),null}let N=W.data;if(!N||typeof N!=="object"||!("id"in N)||typeof N.id!=="string")return z("[bridge] No session ID in response"),null;return N.id}async function YCA(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 UB.post(Y,{},{headers:M2(C,E),timeout:1e4,validateStatus:(G)=>G<500});if(J.status===200||J.status===409)z(`[bridge] Session ${A} archived successfully`);else{let G=eJ(J.data);z(`[bridge] Session archive failed with status ${J.status}${G?`: ${G}`:""}`)}}catch(J){z(`[bridge] Session archive request failed: ${FA(J)}`)}}async function V2(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`),GI(Y,"no_token"),!1;let G=`${E}/v1/code/github/${A}-pr`,U={session_id:a1(Q),repo:B,pr_number:I},F;try{F=await UB.post(G,U,{headers:M2(J),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-pr request failed: ${FA(N)}`),GI(Y,"request_failed"),!1}if(!(F.status>=200&&F.status<300||F.status===409)){let N=eJ(F.data);return z(`[bridge] ${A}-pr failed ${F.status}${N?`: ${N}`:""}`),GI(Y,"http_error"),!1}return z(`[bridge] ${A}-pr ${B}#${I} ok`),XE(Y),!0}async function w2(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`),GI(Y,"no_token"),!1;let G=`${E}/v1/code/slack/${A}-thread`,U={session_id:a1(Q),channel:B,thread_ts:I},F;try{F=await UB.post(G,U,{headers:M2(J),timeout:1e4,validateStatus:(N)=>N<500})}catch(N){return z(`[bridge] ${A}-thread request failed: ${FA(N)}`),GI(Y,"request_failed"),!1}if(!(F.status>=200&&F.status<300||F.status===409)){let N=eJ(F.data);return z(`[bridge] ${A}-thread failed ${F.status}${N?`: ${N}`:""}`),GI(Y,"http_error"),!1}return z(`[bridge] ${A}-thread ${B}/${I} ok`),XE(Y),!0}function M2(A,Q){let B={Authorization:`Bearer ${A}`,"Content-Type":"application/json","anthropic-version":McA,"anthropic-beta":KcA};if(Q!==void 0)B["x-organization-uuid"]=Q;return B}var DCA=2000,WCA=60000,NCA=900000,ScA=300000,XCA=3;function VCA(A){return A*(0.8+Math.random()*0.4)}var _cA=0;async function wCA(A){let{dir:Q,registrationDir:B,machineName:I,branch:E,gitRepoUrl:C,title:Y,baseUrl:J,sessionIngressUrl:G,workerType:U,getAccessToken:F,createSession:W,archiveSession:N,getCurrentTitle:D=()=>Y,toSDKMessages:X=()=>{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=()=>n$,initialHistoryCap:q=200,initialMessages:H,previouslyFlushedUUIDs:j,onInboundMessage:v,onPermissionResponse:_,onInterrupt:S,onSetModel:n,onSetMaxThinkingTokens:e,onSetPermissionMode:RA,onRenameSession:bA,onSetColor:NA,onFileSuggestions:EA,onReadFile:_A,onMcpAuthenticate:UQ,onMcpOauthCallbackUrl:k,onMcpReconnect:PA,onMcpStatus:BA,onStateChange:gA,onUserMessage:QA,onSessionEstablished:s,onInitError:mA,perpetual:yA,initialSSESequenceNum:lA=0,onTransportPersistenceReady:nA,onTransportPersistenceTeardown:VB}=A,iQ=++_cA,{writeBridgePointer:_B,clearBridgePointer:PB,readBridgePointer:BB}=await Promise.resolve().then(() => (FCA(),UCA)),AG=yA?await BB(Q):null,DI=AG?.source==="repl"?AG:null;z(`[bridge:repl] initBridgeCore #${iQ} starting (initialMessages=${H?.length??0}${DI?` perpetual prior=env:${DI.environmentId}`:""})`);let JQ=cEA({baseUrl:J,getAccessToken:F,runnerVersion:"0.2.137",onDebug:z,onAuth401:w,getTrustedDeviceToken:V}),NQ={dir:B??Q,machineName:I,branch:E,gitRepoUrl:C,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:$CA(),workerType:U,environmentId:$CA(),reuseEnvironmentId:DI?.environmentId,apiBaseUrl:J,sessionIngressUrl:G},AA,SE;try{let h=await JQ.registerBridgeEnvironment(NQ);AA=h.environment_id,SE=h.environment_secret}catch(h){if(hEA("registration_failed",`[bridge:repl] Environment registration failed: ${FA(h)}`),mA?.(`[bridge:repl] Environment registration failed: ${FA(h)}`),DI&&h instanceof GE&&(h.status===410||h.status!==401&&W2(h.errorType)))await PB(Q);return gA?.("failed",FA(h)),null}z(`[bridge:repl] Environment registered: ${AA}`),o("info","bridge_repl_env_registered"),tA("tengu_bridge_repl_env_registered",{});async function gY(h,JA){if(AA!==h)return z(`[bridge:repl] Env mismatch (requested ${h}, got ${AA}) — cannot reconnect in place`),!1;let GQ=bR(JA),iA=GQ===JA?[JA]:[JA,GQ];for(let TA of iA)try{return await JQ.reconnectSession(AA,TA),z(`[bridge:repl] Reconnected session ${TA} in place on env ${AA}`),!0}catch(dQ){z(`[bridge:repl] reconnectSession(${TA}) failed: ${FA(dQ)}`)}return z("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let R0=DI?await gY(DI.environmentId,DI.sessionId):!1;if(DI&&!R0)await PB(Q);let DA,fI=new Set,IB=new Map,JC=new Set;if(R0&&DI){if(DA=DI.sessionId,z(`[bridge:repl] Perpetual session reused: ${DA}`),H&&j)for(let h of H)j.add(h.uuid)}else{let h=await W({environmentId:AA,title:Y,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!h)return z("[bridge:repl] Session creation failed, deregistering environment"),mA?.("[bridge:repl] Session creation failed, deregistering environment"),tA("tengu_bridge_repl_session_failed",{}),await JQ.deregisterEnvironment(AA).catch(()=>{}),gA?.("failed","Session creation failed"),null;DA=h,z(`[bridge:repl] Session created: ${DA}`)}s?.(DA),await _B(Q,{sessionId:DA,environmentId:AA,source:"repl"}),o("info","bridge_repl_session_created"),tA("tengu_bridge_repl_started",{has_initial_messages:!!(H&&H.length>0),inProtectedNamespace:GO(),...WEA()});let x0=new Set;if(H)for(let h of H)x0.add(h.uuid);let UE=new N2(2000);for(let h of x0)UE.add(h);let QG=new N2(2000),qB=new AbortController,WA=null,wB=0,jB=R0?lA:0,RB=null,kC=null,O0=oEA(qB.signal),g0=O0.wake,H2=O0.signal,VI=new vR,hB=!QA,oB=3,CI=0,hI=null;async function BG(){if(hI)return hI;hI=vY();try{return await hI}finally{hI=null}}async function vY(){if(CI++,wB++,z(`[bridge:repl] Reconnecting after env lost (attempt ${CI}/${oB})`),CI>oB)return z(`[bridge:repl] Environment reconnect limit reached (${oB}), giving up`),!1;if(WA){let TA=WA.getLastSequenceNum();if(TA>jB)jB=TA;VB?.(),WA.close(),WA=null}if(g0(),VI.drop(),RB){let TA=RB;if(await JQ.stopWork(AA,TA,!1).catch(()=>{}),RB!==TA)return z("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),CI=0,!0;RB=null,kC=null}if(qB.signal.aborted)return z("[bridge:repl] Reconnect aborted by teardown"),!1;let h=AA;NQ.reuseEnvironmentId=h;let JA;for(let TA=1;;TA++)try{JA=await JQ.registerBridgeEnvironment(NQ);break}catch(dQ){if(dQ instanceof GE||TA>=XCA||qB.signal.aborted)return NQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Environment re-registration failed (attempt ${TA}): ${FA(dQ)}`),!1;let j9=VCA(DCA*2**(TA-1));if(z(`[bridge:repl] Environment re-registration transient failure (attempt ${TA}/${XCA}), retrying in ${Math.round(j9)}ms: ${FA(dQ)}`),await TB(j9,qB.signal),qB.signal.aborted)return NQ.reuseEnvironmentId=void 0,!1}if(AA=JA.environment_id,SE=JA.environment_secret,NQ.reuseEnvironmentId=void 0,z(`[bridge:repl] Re-registered: requested=${h} got=${AA}`),qB.signal.aborted)return z("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await JQ.deregisterEnvironment(AA).catch(()=>{}),!1;if(WA!==null)return z("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),CI=0,!0;if(await gY(h,DA))return tA("tengu_bridge_repl_reconnected_in_place",{}),CI=0,!0;if(AA!==h)tA("tengu_bridge_repl_env_expired_fresh_session",{});if(await N(DA),qB.signal.aborted)return z("[bridge:repl] Reconnect aborted after archive, cleaning up"),await JQ.deregisterEnvironment(AA).catch(()=>{}),!1;let GQ=D(),iA=await W({environmentId:AA,title:GQ,gitRepoUrl:C,branch:E,signal:AbortSignal.timeout(15000)});if(!iA)return z("[bridge:repl] Session creation failed during reconnection"),!1;if(qB.signal.aborted)return z("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await N(iA),!1;if(DA=iA,DEA(a1(iA)).catch(()=>{}),s?.(DA),jB=0,QG.clear(),hB=!QA,z(`[bridge:repl] Re-created session: ${DA}`),await _B(Q,{sessionId:DA,environmentId:AA,source:"repl"}),j?.clear(),fI.size>0){z(`[bridge:repl] Replaying ${fI.size} PR subscription(s) against new session`);for(let TA of fI){let dQ=TA.lastIndexOf("#");V2("subscribe",DA,TA.slice(0,dQ),Number(TA.slice(dQ+1)),J,F)}}if(JC.size>0){z(`[bridge:repl] Replaying ${JC.size} Slack thread subscription(s) against new session`);for(let TA of JC){let dQ=TA.indexOf("/");w2("subscribe",DA,TA.slice(0,dQ),TA.slice(dQ+1),J,F)}}return CI=0,!0}function Z2(){return F()}function mR(){let h=VI.end();if(h.length===0)return;if(!WA){z(`[bridge:repl] Cannot drain ${h.length} pending message(s): no transport`);return}for(let iA of h)UE.add(iA.uuid);let GQ=X(h).map((iA)=>({...iA,session_id:DA}));z(`[bridge:repl] Drained ${h.length} pending message(s) after flush`),WA.writeBatch(GQ)}let L2=null;function q2(){L2?.()}function cR(h){if(z(`[bridge:repl] Transport permanently closed: code=${h}`),tA("tengu_bridge_repl_ws_closed",{code:h}),WA){let GQ=WA.getLastSequenceNum();if(GQ>jB)jB=GQ;VB?.(),WA=null}g0();let JA=VI.drop();if(JA>0)z(`[bridge:repl] Dropping ${JA} pending message(s) on transport close (code=${h})`,{level:"warn"});if(h===1000){gA?.("failed","session ended"),qB.abort(),q2();return}gA?.("reconnecting",`Remote Control connection lost (code ${h})`),z(`[bridge:repl] Transport reconnect budget exhausted (code=${h}), attempting env reconnect`),BG().then((GQ)=>{if(GQ)return;if(qB.signal.aborted)return;z("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),tA("tengu_bridge_repl_reconnect_failed",{close_code:h}),gA?.("failed","reconnection failed"),q2()})}let uR,zCA=null,HCA={api:JQ,getCredentials:()=>({environmentId:AA,environmentSecret:SE}),signal:qB.signal,getPollIntervalConfig:M,onStateChange:gA,getWsState:()=>WA?.getStateLabel()??"null",isAtCapacity:()=>WA!==null,capacitySignal:H2,onFatalError:q2,getHeartbeatInfo:()=>{if(!RB||!kC)return null;return{environmentId:AA,workId:RB,sessionToken:kC}},onHeartbeatFatal:(h)=>{if(z(`[bridge:repl] heartbeatWork fatal (status=${h.status}) — tearing down work item for fast re-dispatch`),WA){let JA=WA.getLastSequenceNum();if(JA>jB)jB=JA;VB?.(),WA.close(),WA=null}if(VI.drop(),RB)JQ.stopWork(AA,RB,!1).catch((JA)=>{z(`[bridge:repl] stopWork after heartbeat fatal: ${FA(JA)}`)});RB=null,kC=null,g0(),gA?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await BG())return null;return{environmentId:AA,environmentSecret:SE}},onWorkReceived:(h,JA,GQ,iA)=>{if(WA?.isConnectedStatus())z(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${GQ})`);if(z(`[bridge:repl] Work received: workId=${GQ} workSessionId=${h} currentSessionId=${DA} match=${TR(h,DA)}`),_B(Q,{sessionId:DA,environmentId:AA,source:"repl"}),!TR(h,DA)){z(`[bridge:repl] Rejecting foreign session: expected=${DA} got=${h}`);return}RB=GQ,kC=JA;let TA=iA||AQ(process.env.CLAUDE_BRIDGE_USE_CCR_V2),dQ;if(!TA){if(dQ=Z2(),!dQ){z("[bridge:repl] No OAuth token available for session ingress, skipping work");return}VW(dQ)}if(tA("tengu_bridge_repl_work_received",{}),WA){VB?.();let rQ=WA;WA=null;let EB=rQ.getLastSequenceNum();if(EB>jB)jB=EB;rQ.close()}VI.deactivate();let j9=(rQ)=>nEA(rQ,{transport:WA,sessionId:DA,onInterrupt:S,onSetModel:n,onSetMaxThinkingTokens:e,onSetPermissionMode:RA,onRenameSession:bA,onSetColor:NA,onFileSuggestions:EA,onReadFile:_A,onMcpAuthenticate:UQ,onMcpOauthCallbackUrl:k,onMcpReconnect:PA,onMcpStatus:BA}),O2=!1,lR=(rQ)=>{if(WA=rQ,rQ.setOnConnect(()=>{if(WA!==rQ)return;if(z("[bridge:repl] Ingress transport connected"),tA("tengu_bridge_repl_ws_connected",{}),!TA){let EB=Z2();if(EB)VW(EB)}if(x2=!1,!O2&&H&&H.length>0){O2=!0;let EB=q,wI=H.filter((R9)=>OR(R9)&&!j?.has(R9.uuid)),bC=EB>0&&wI.length>EB?wI.slice(-EB):wI;if(bC.length<wI.length)z(`[bridge:repl] Capped initial flush: ${wI.length} -> ${bC.length} (cap=${EB})`),tA("tengu_bridge_repl_history_capped",{eligible_count:wI.length,capped_count:bC.length});let v0=X(bC);if(v0.length>0){z(`[bridge:repl] Flushing ${v0.length} initial message(s) via transport`);let R9=v0.map((IG)=>({...IG,session_id:DA,historical:!0})),iR=rQ.droppedBatchCount;rQ.writeBatch(R9).then(()=>{if(rQ.droppedBatchCount>iR){z(`[bridge:repl] Initial flush dropped ${rQ.droppedBatchCount-iR} batch(es) — not marking ${v0.length} UUID(s) as flushed`);return}if(j){for(let IG of v0)if(IG.uuid)j.add(IG.uuid)}}).catch((IG)=>z(`[bridge:repl] Initial flush failed: ${IG}`)).finally(()=>{if(WA!==rQ)return;mR(),gA?.("connected")})}else mR(),gA?.("connected")}else if(!VI.active)gA?.("connected")}),rQ.setOnData((EB)=>{dEA(EB,UE,QG,v,_,j9)}),zCA=cR,rQ.setOnClose((EB)=>{if(WA!==rQ)return;cR(EB)}),!O2&&H&&H.length>0)VI.start();rQ.connect()};if(wB++,TA){let rQ=ACA(J,h),EB=wB;z(`[bridge:repl] CCR v2: sessionUrl=${rQ} session=${h} gen=${EB}`),ICA({sessionUrl:rQ,ingressToken:JA,sessionId:h,initialSequenceNum:jB}).then((wI)=>{if(qB.signal.aborted){wI.close();return}if(EB!==wB){z(`[bridge:repl] CCR v2: discarding stale handshake gen=${EB} current=${wB}`),wI.close();return}if(lR(wI),nA){let bC=wI.getInternalEventWriter?.(),v0=wI.getInternalEventReaders?.();if(bC&&v0)nA(bC,v0)}},(wI)=>{if(z(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${FA(wI)}`,{level:"error"}),tA("tengu_bridge_repl_ccr_v2_init_failed",{}),EB!==wB)return;if(RB)JQ.stopWork(AA,RB,!1).catch((bC)=>{z(`[bridge:repl] stopWork after v2 init failure: ${FA(bC)}`)}),RB=null,kC=null;g0()})}else{let rQ=eEA(G,h);z(`[bridge:repl] Ingress URL: ${rQ}`),z(`[bridge:repl] Creating HybridTransport: session=${h}`);let EB=dQ??"";lR(BCA(new MR(new URL(rQ),{Authorization:`Bearer ${EB}`,"anthropic-version":"2023-06-01"},h,()=>({Authorization:`Bearer ${Z2()??EB}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{gA?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),g0()}})))}}};PcA(HCA);let j2=yA?setInterval(()=>{if(hI)return;_B(Q,{sessionId:DA,environmentId:AA,source:"repl"})},3600000):null;j2?.unref?.();let pR=M().session_keepalive_interval_v2_ms,R2=pR>0?setInterval(()=>{if(!WA)return;z("[bridge:repl] keep_alive sent"),WA.write({type:"keep_alive"}).catch((h)=>{z(`[bridge:repl] keep_alive write failed: ${FA(h)}`)})},pR):null;R2?.unref?.();let x2=!1;L2=async()=>{if(x2){z(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${AA} session=${DA}`);return}x2=!0,VB?.();let h=Date.now();if(z(`[bridge:repl] Teardown starting: env=${AA} session=${DA} workId=${RB??"none"} transportState=${WA?.getStateLabel()??"null"}`),j2!==null)clearInterval(j2);if(R2!==null)clearInterval(R2);if(uR)process.off("SIGUSR2",uR);if(qB.abort(),z("[bridge:repl] Teardown: poll loop aborted"),WA){let iA=WA.getLastSequenceNum();if(iA>jB)jB=iA}if(yA){WA=null,VI.drop(),await _B(Q,{sessionId:DA,environmentId:AA,source:"repl"}),z(`[bridge:repl] Teardown (perpetual): leaving env=${AA} session=${DA} alive on server, duration=${Date.now()-h}ms`);return}let JA=WA;if(WA=null,VI.drop(),JA)JA.write(gR(DA));let GQ=RB?JQ.stopWork(AA,RB,!0).then(()=>{z("[bridge:repl] Teardown: stopWork completed")}).catch((iA)=>{z(`[bridge:repl] Teardown stopWork failed: ${FA(iA)}`)}):Promise.resolve();await Promise.all([GQ,N(DA)]),JA?.close(),z("[bridge:repl] Teardown: transport closed"),await JQ.deregisterEnvironment(AA).catch((iA)=>{z(`[bridge:repl] Teardown deregister failed: ${FA(iA)}`)}),await PB(Q),z(`[bridge:repl] Teardown complete: env=${AA} duration=${Date.now()-h}ms`)},z(`[bridge:repl] Ready: env=${AA} session=${DA}`),gA?.("ready");let q9={get bridgeSessionId(){return DA},get environmentId(){return AA},getLastSequenceNum(){return q9.getSSESequenceNum()},flush(){return WA?.flush()??Promise.resolve()},getSSESequenceNum(){let h=WA?.getLastSequenceNum()??0;return Math.max(jB,h)},sessionIngressUrl:G,writeMessages(h){let JA=h.filter((TA)=>OR(TA)&&!x0.has(TA.uuid)&&!UE.has(TA.uuid));if(JA.length===0)return;if(!hB)for(let TA of JA){let dQ=iEA(TA);if(dQ!==void 0&&QA?.(dQ,DA)){hB=!0;break}}if(VI.enqueue(...JA)){z(`[bridge:repl] Queued ${JA.length} message(s) during initial flush`);return}if(!WA){let TA=JA.map((dQ)=>dQ.type).join(",");z(`[bridge:repl] Transport not configured, dropping ${JA.length} message(s) [${TA}] for session=${DA}`,{level:"warn"});return}for(let TA of JA)UE.add(TA.uuid);z(`[bridge:repl] Sending ${JA.length} message(s) via transport`);let iA=X(JA).map((TA)=>({...TA,session_id:DA}));WA.writeBatch(iA)},writeSdkMessages(h){let JA=h.filter((iA)=>!iA.uuid||!UE.has(iA.uuid));if(JA.length===0)return;if(!WA){z(`[bridge:repl] Transport not configured, dropping ${JA.length} SDK message(s) for session=${DA}`,{level:"warn"});return}for(let iA of JA)if(iA.uuid)UE.add(iA.uuid);let GQ=JA.map((iA)=>({...iA,session_id:DA}));WA.writeBatch(GQ)},sendControlRequest(h){if(!WA){z("[bridge:repl] Transport not configured, skipping control_request");return}let JA={...h,session_id:DA};WA.write(JA),z(`[bridge:repl] Sent control_request request_id=${h.request_id}`)},sendControlResponse(h){if(!WA){z("[bridge:repl] Transport not configured, skipping control_response");return}let JA={...h,session_id:DA};WA.write(JA),z("[bridge:repl] Sent control_response")},sendControlCancelRequest(h){if(!WA){z("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let JA={type:"control_cancel_request",request_id:h,session_id:DA};WA.write(JA),z(`[bridge:repl] Sent control_cancel_request request_id=${h}`)},reportMetadata(h){WA?.reportMetadata(h)},sendResult(){if(!WA){z(`[bridge:repl] sendResult: skipping, transport not configured session=${DA}`);return}WA.write(gR(DA)),z(`[bridge:repl] Sent result for session=${DA}`)},async subscribePR(h,JA,GQ){let iA=`${h}#${JA}`,TA=IB.get(iA);if(GQ)IB.set(iA,{agentId:GQ,repo:h,prNumber:JA});let dQ=await V2("subscribe",DA,h,JA,J,F);if(dQ)fI.add(iA);else if(GQ)if(TA)IB.set(iA,TA);else IB.delete(iA);return dQ},async unsubscribePR(h,JA){let GQ=await V2("unsubscribe",DA,h,JA,J,F);if(GQ){let iA=`${h}#${JA}`;fI.delete(iA),IB.delete(iA)}return GQ},async subscribeSlackThread(h,JA){let GQ=await w2("subscribe",DA,h,JA,J,F);if(GQ)JC.add(`${h}/${JA}`);return GQ},async unsubscribeSlackThread(h,JA){let GQ=await w2("unsubscribe",DA,h,JA,J,F);if(GQ)JC.delete(`${h}/${JA}`);return GQ},getPRWebhookTargets(){return[...IB.values()]},async teardown(){ZCA(),await L2?.(),z("[bridge:repl] Torn down"),tA("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return q9.teardown()}},ZCA=m0(q9);return q9}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=()=>n$,getHeartbeatInfo:W,onHeartbeatFatal:N}){z(`[bridge:repl] Starting work poll loop for env=${Q().environmentId}`);let X=0,w=null,V=null,M=0,q=0,H=!1;while(!B.aborted){let{environmentId:j,environmentSecret:v}=Q(),_=F();try{let S=await A.pollForWork(j,v,B,_.reclaim_older_than_ms);if(q=0,X>0)z(`[bridge:repl] Poll recovered after ${X} consecutive error(s)`),X=0,w=null,V=null,M=0,I?.("ready");if(!S){let e=H;if(H=!1,J?.()&&G&&!e){let RA=_.poll_interval_ms_at_capacity;if(_.non_exclusive_heartbeat_interval_ms>0&&W){tA("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:_.non_exclusive_heartbeat_interval_ms});let NA=RA>0?Date.now()+RA:null,EA=!1,_A=0;while(!B.aborted&&J()&&(NA===null||Date.now()<NA)){let k=F();if(k.non_exclusive_heartbeat_interval_ms<=0)break;let PA=W();if(!PA)break;let BA=G();try{await A.heartbeatWork(PA.environmentId,PA.workId,PA.sessionToken)}catch(gA){if(z(`[bridge:repl:heartbeat] Failed: ${FA(gA)}`),gA instanceof GE){if(BA.cleanup(),tA("tengu_bridge_heartbeat_error",{status:gA.status,error_type:gA.status===401||gA.status===403?"auth_failed":"fatal"}),N)N(gA),z(`[bridge:repl:heartbeat] Fatal (status=${gA.status}), work state cleared — fast-polling for re-dispatch`);else EA=!0;break}}_A++,await TB(k.non_exclusive_heartbeat_interval_ms,BA.signal),BA.cleanup()}let UQ=EA?"error":B.aborted?"shutdown":!J()?"capacity_changed":NA!==null&&Date.now()>=NA?"poll_due":"config_disabled";if(tA("tengu_bridge_heartbeat_mode_exited",{reason:UQ,heartbeat_cycles:_A}),!EA){if(UQ==="poll_due")z(`[bridge:repl] Heartbeat poll_due after ${_A} cycles — falling through to pollForWork`);continue}}let bA=RA>0?RA:_.non_exclusive_heartbeat_interval_ms;if(bA>0){let NA=G(),EA=Date.now();await TB(bA,NA.signal),NA.cleanup();let _A=Date.now()-EA-bA;if(_A>60000)z(`[bridge:repl] At-capacity sleep overran by ${Math.round(_A/1000)}s — process suspension detected, forcing one fast-poll cycle`),tA("tengu_bridge_repl_suspension_detected",{overrun_ms:_A}),H=!0}}else await TB(_.poll_interval_ms_not_at_capacity,B);continue}let n;try{n=sEA(S.secret)}catch(e){z(`[bridge:repl] Failed to decode work secret: ${FA(e)}`),tA("tengu_bridge_repl_work_secret_failed",{}),await A.stopWork(j,S.id,!1).catch(()=>{});continue}z(`[bridge:repl] Acknowledging workId=${S.id}`);try{await A.acknowledgeWork(j,S.id,n.session_ingress_token)}catch(e){z(`[bridge:repl] Acknowledge failed workId=${S.id}: ${FA(e)}`)}if(S.data.type==="healthcheck"){z("[bridge:repl] Healthcheck received");continue}if(S.data.type==="session"){let e=S.data.id;try{yI(e,"session_id")}catch{z(`[bridge:repl] Invalid session_id in work: ${e}`);continue}E(e,n.session_ingress_token,S.id,n.use_code_sessions===!0),z("[bridge:repl] Work accepted, continuing poll loop")}}catch(S){if(B.aborted)break;if(S instanceof GE&&S.status===404&&C){let k=Q().environmentId;if(j!==k){z(`[bridge:repl] Stale poll error for old env=${j}, current env=${k} — skipping onEnvironmentLost`),X=0,w=null;continue}if(q++,z(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${q}/3)`),tA("tengu_bridge_repl_env_lost",{attempt:q}),q>3){z("[bridge:repl] Environment re-registration limit reached (3), giving up"),I?.("failed","Environment deleted and re-registration limit reached"),U?.();break}I?.("reconnecting","environment lost, recreating session");let PA=await C();if(B.aborted)break;if(PA){X=0,w=null,I?.("ready"),z(`[bridge:repl] Re-registered environment: ${PA.environmentId}`);continue}I?.("failed","Environment deleted and re-registration failed"),U?.();break}if(S instanceof GE){let k=W2(S.errorType),PA=uEA(S);if(z(`[bridge:repl] Fatal poll error: ${S.message} (status=${S.status}, type=${S.errorType??"unknown"})${PA?" (suppressed)":""}`),tA("tengu_bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),o(k?"info":"error","bridge_repl_fatal_error",{status:S.status,error_type:S.errorType}),!PA)I?.("failed",k?"session expired · /remote-control to reconnect":S.message);U?.();break}let n=Date.now();if(V!==null&&n-V>Math.max(WCA,M)*2)z(`[bridge:repl] Detected system sleep (${Math.round((n-V)/1000)}s gap), resetting poll error budget`),o("info","bridge_repl_poll_sleep_detected",{gapMs:n-V}),X=0,w=null;if(V=n,X++,w===null)w=n;let e=n-w,RA=yEA(S),bA=bEA(S),NA=Y?.()??"unknown";if(z(`[bridge:repl] Poll error (attempt ${X}, elapsed ${Math.round(e/1000)}s, ws=${NA}): ${bA}`),tA("tengu_bridge_repl_poll_error",{status:RA,consecutiveErrors:X,elapsedMs:e}),X===1)I?.("reconnecting",bA);if(e>=NCA){z(`[bridge:repl] Poll failures exceeded ${NCA/1000}s (${X} errors), giving up`),o("info","bridge_repl_poll_give_up"),tA("tengu_bridge_repl_poll_give_up",{consecutiveErrors:X,elapsedMs:e,lastStatus:RA}),I?.("failed","connection to server lost");break}let EA=fEA(S),_A=Math.min(DCA*2**(X-1),WCA),UQ=VCA(EA!==void 0?Math.max(_A,Math.min(EA,ScA)):_A);if(M=UQ,F().non_exclusive_heartbeat_interval_ms>0){let k=W?.();if(k)try{await A.heartbeatWork(k.environmentId,k.workId,k.sessionToken)}catch{}}await TB(UQ,B)}}z(`[bridge:repl] Work poll loop ended (aborted=${B.aborted}) env=${Q().environmentId}`)}function TcA(A,Q){return A?.includes("_staging_")===!0||Q?.includes("staging")===!0}function kcA(A,Q){return A?.includes("_local_")===!0||Q?.includes("localhost")===!0}function bcA(A,Q){if(kcA(A,Q))return"http://localhost:4000";if(TcA(A,Q))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function MCA(A,Q,B){let{toCompatSessionId:I}=OCA(ECA),E=I(A),Y=`${bcA(E,Q)}/code/${E}`;return B?`${Y}?${new URLSearchParams(B)}`:Y}DQ();async function KCA(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:W,perpetual:N=!1,initialSSESequenceNum:D,onConflict:X}=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:W},q=[],H=null,j=[],v=null,_=[],S=null,n=!1,e=null,RA={detail:null},bA=ycA(),NA=()=>wCA({dir:Q,registrationDir:B,machineName:bA,branch:C,gitRepoUrl:Y,title:I,baseUrl:U,sessionIngressUrl:V,workerType:E,getAccessToken:J,getTrustedDeviceToken:G,onAuth401:w,onInitError:console.error,createSession:({environmentId:BA,title:gA,signal:QA})=>CCA({environmentId:BA,title:gA,tags:["claude-code-assistant"],signal:QA},M),archiveSession:(BA)=>YCA(BA,M),perpetual:N,initialSSESequenceNum:D,getCurrentTitle:()=>I,getPollIntervalConfig:()=>({...n$,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(BA){let gA=Vl(BA);if(!gA)return;q.push({content:gA.content,uuid:gA.uuid}),H?.(),H=null},onInterrupt(){j.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),v?.(),v=null},onSetModel(BA){j.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:BA}}),v?.(),v=null},onSetMaxThinkingTokens(BA){j.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:BA}}),v?.(),v=null},onPermissionResponse(BA){_.push(BA),S?.(),S=null},onStateChange(BA,gA){if(e?.(BA,gA),BA==="failed")RA.detail=gA??"unknown failure",n=!0,H?.(),v?.(),S?.()}}),EA=await NA();if(!EA&&X&&RA.detail?.includes("409")){if(await X({machineName:bA,message:RA.detail})==="takeover")n=!1,RA.detail=null,EA=await NA()}if(!EA){let BA=RA.detail??"initBridgeCore returned null (env registration or session creation failed)";return z(`[bridge:daemon] connectRemoteControl failed: ${BA}`),{ok:!1,error:{kind:RA.detail?.includes("409")?"conflict":RA.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:BA}}}async function*_A(){while(!n){while(q.length>0)if(yield q.shift(),n)return;await new Promise((BA)=>{H=BA})}}async function*UQ(){while(!n){while(j.length>0)if(yield j.shift(),n)return;await new Promise((BA)=>{v=BA})}}async function*k(){while(!n){while(_.length>0)if(yield _.shift(),n)return;await new Promise((BA)=>{S=BA})}}return{ok:!0,handle:{get sessionUrl(){return MCA(EA.bridgeSessionId,V)},get environmentId(){return EA.environmentId},get bridgeSessionId(){return EA.bridgeSessionId},getSSESequenceNum(){return EA.getSSESequenceNum()},hasPendingPrompts(){return q.length>0},write(BA){EA.writeSdkMessages([BA])},sendResult(){EA.sendResult()},sendControlRequest(BA){EA.sendControlRequest(BA)},sendControlResponse(BA){EA.sendControlResponse(BA)},sendControlCancelRequest(BA){EA.sendControlCancelRequest(BA)},inboundPrompts:_A,controlRequests:UQ,permissionResponses:k,onStateChange(BA){e=BA},async teardown(){n=!0,H?.(),v?.(),S?.(),await EA.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var hcA=1000,mcA=1e4,ccA=5000,ucA=60000,hR=3;function pcA(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 lcA(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"&&rR(C.response))E(C.response);else E({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}function z2(A){if(!A){XE("assistant_worker_start");return}if(A.kind==="auth"||A.kind==="conflict")CF("assistant_worker_start",A.kind);else GI("assistant_worker_start",A.kind)}async function icA(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:W,log:N=()=>{}}=A;N("─── worker start ───");let D=await G?.load(),X={...Q,initialSSESequenceNum:Q.initialSSESequenceNum??D?.lastSSESequenceNum};if(!X.getAccessToken()){let YA={kind:"auth",detail:"getAccessToken returned empty"};return z2(YA),{ok:!1,error:YA}}let w=await KCA(X);if(!w.ok)return N(`bridge connection failed: ${w.error.kind} — ${w.error.detail}`),z2(w.error),{ok:!1,error:w.error};let V=w.handle;N(`bridge connected url=${V.sessionUrl} env=${V.environmentId}`);let M=D?.claudeSessionId,q=V.bridgeSessionId,H=[],j=null,v=!1,_=null,S=0,n=!0,e=0,RA=Promise.resolve();function bA(){if(!G)return;let YA={claudeSessionId:M,lastSSESequenceNum:V.getSSESequenceNum(),bridgeSessionId:V.bridgeSessionId};RA=RA.then(()=>G.save(YA).catch((JQ)=>{N(`stateAdapter.save threw: ${JQ}`)}))}function NA(){if(H.length>0||V.hasPendingPrompts()){N("persist skipped: prompt queued");return}bA()}bA();let EA=new AbortController,_A=new Map,UQ=null;function k(){return UQ??=(async()=>{NA();for(let YA of _A.keys())V.sendControlCancelRequest(YA);_A.clear(),await V.teardown(),await RA})()}if(W.addEventListener("abort",()=>{EA.abort(),k().catch((YA)=>N(`teardown threw: ${YA}`))}),W.aborted){await k();let YA={kind:"unknown",detail:"aborted before start"};return z2(YA),{ok:!1,error:YA}}let PA="connected";V.onStateChange((YA,JQ)=>{if(N(`bridge state=${YA} detail=${JQ??""}`),PA=YA,YA==="ready"&&V.bridgeSessionId!==q)q=V.bridgeSessionId,bA();else if(YA==="connected")NA();if(YA==="failed")N(`bridge failed: ${JQ??"unknown"}`),EA.abort(),k().catch((NQ)=>N(`teardown threw: ${NQ}`))});let BA=I?.horizonMs??600000,gA=I?.leadMs??ccA,QA=null,s=!1,mA=!1,yA="";async function lA(){if(!I)return;let YA=await Nl(I.dir).catch((NQ)=>{return N(`computeCronHorizon threw: ${NQ}`),{nextFire:null,hasOverdue:!1}});QA=YA.nextFire,mA=YA.hasOverdue;let JQ=YA.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(YA.nextFire).toISOString()} hasOverdue=${YA.hasOverdue}`;if(JQ!==yA)yA=JQ,N(JQ)}let nA;if(I)await lA(),nA=setInterval(lA,mcA),nA.unref?.();function VB(YA){H.push({type:"user",message:{role:"user",content:YA},parent_tool_use_id:null,session_id:""}),j?.(),j=null}async function iQ(YA,JQ,NQ){if(C){let IB=await C(YA,JQ,NQ);if(IB)return Y?.(YA,IB),IB}if(PA!=="connected"){N(`permission denied — bridge state=${PA}, request would drop`);let IB={behavior:"deny",message:`Cannot request permission: remote control is ${PA}. Try again in a moment.`};return Y?.(YA,IB),IB}let AA=fcA();N(`permission request tool=${YA} req=${AA}`);let{signal:SE,suggestions:gY,blockedPath:R0,toolUseID:DA}=NQ;V.sendControlRequest({type:"control_request",request_id:AA,request:{subtype:"can_use_tool",tool_name:YA,display_name:tR(YA),input:JQ,tool_use_id:DA,...gY&&{permission_suggestions:gY},...R0&&{blocked_path:R0},..."decisionReason"in NQ&&NQ.decisionReason&&{decision_reason:NQ.decisionReason},..."agentID"in NQ&&NQ.agentID&&{agent_id:NQ.agentID}}});let fI;try{let IB=await new Promise((x0,UE)=>{_A.set(AA,x0),fI=setTimeout((QG,qB,WA,wB,jB)=>{if(QG.delete(qB))WA(`permission timeout req=${qB}`),wB.sendControlCancelRequest(qB),jB({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},ucA,_A,AA,N,V,x0),fI.unref?.(),SE.addEventListener("abort",()=>{if(_A.delete(AA))V.sendControlCancelRequest(AA);UE(Error("aborted"))},{once:!0})});N(`permission response req=${AA} behavior=${IB.behavior}`);let JC=IB.behavior==="allow"?{behavior:"allow",updatedInput:IB.updatedInput,updatedPermissions:IB.updatedPermissions}:{behavior:"deny",message:IB.message??"Denied via remote control"};return Y?.(YA,JC),JC}finally{if(fI)clearTimeout(fI);_A.delete(AA)}}let _B=!1;async function PB(){if(_!==null||_B||EA.signal.aborted)return;if(_B=!0,v=!1,H.length>0)n=!1;async function*YA(){while(!v){while(H.length>0)if(n=!1,yield H.shift(),v)return;await new Promise((AA)=>{j=AA})}}N(`spawning query resume=${M??"<fresh>"}`);let JQ={assistant:!0,cwd:Q.dir,resume:M,stderr:(AA)=>N(`[child] ${AA.trimEnd()}`),canUseTool:iQ},NQ;try{if(NQ=await E(JQ),B)NQ={...NQ,env:{...NQ.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(AA){if(N(`buildQueryOptions threw: ${AA}`),_B=!1,e++,e>=hR)N(`${e} consecutive buildQueryOptions failures — dropping ${H.length} queued input(s)`),H.length=0;else if(H.length>0&&!EA.signal.aborted)PB();return}if(EA.signal.aborted){_B=!1;return}try{_=Iu({prompt:YA(),options:NQ})}finally{_B=!1}(async()=>{try{N("output pump started");for await(let AA of _){if(AA.type==="system"&&AA.subtype==="init"){if(AA.session_id!==M)M=AA.session_id,NA()}if(AA.type==="result")n=!0,e=0,s=!0,NA();if(!pcA(AA))continue;let SE=J?J(AA):AA;if(SE===null)continue;V.write(SE)}}catch(AA){N(`query threw: ${AA}`),e++}finally{N("output pump ended"),_=null;for(let AA of _A.keys())V.sendControlCancelRequest(AA);if(_A.clear(),H.length>0&&!EA.signal.aborted)if(e>=hR)N(`${e} consecutive crashes — dropping ${H.length} queued input(s)`),H.length=0;else PB()}})()}let BB=setInterval(()=>{let YA=Date.now(),JQ=QA!==null&&QA-YA<BA;if(_===null){let NQ=QA!==null&&QA-YA<gA;if((NQ||mA&&!s)&&e<hR&&!EA.signal.aborted)N(NQ?`cron due in ${QA-YA}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),PB();return}if(v)return;if(!n||H.length>0)return;if(YA-S<F)return;if(JQ)return;if(mA&&!s)return;N("idle conditions met → closing input gen"),NA(),v=!0,j?.(),j=null},hcA);if(BB.unref?.(),U)N("initialPrompt → injecting"),S=Date.now(),VB(U),PB();let AG=(async()=>{if(await Promise.all([(async()=>{for await(let YA of V.inboundPrompts()){if(EA.signal.aborted)return;if(N("bridge prompt received"),S=Date.now(),YA.uuid)V.write({type:"user",uuid:YA.uuid,session_id:"",message:{role:"user",content:YA.content},parent_tool_use_id:null});VB(YA.content),PB()}})(),(async()=>{for await(let YA of V.controlRequests()){if(EA.signal.aborted)return;switch(YA.request.subtype){case"interrupt":N("bridge interrupt"),_?.interrupt();break;case"set_model":N(`bridge setModel=${YA.request.model??"<default>"}`),_?.setModel(YA.request.model);break;case"set_max_thinking_tokens":N(`bridge setMaxThinkingTokens=${YA.request.max_thinking_tokens}`),_?.setMaxThinkingTokens(YA.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let YA of V.permissionResponses()){if(EA.signal.aborted)return;let JQ=lcA(YA,_A,V.sendControlCancelRequest);if(JQ)N(`permission response for unknown req=${JQ} (stale)`)}})()]),clearInterval(BB),nA)clearInterval(nA);_?.close(),await k(),N("─── worker stop ───")})(),DI={get sessionUrl(){return V.sessionUrl},get bridgeSessionId(){return V.bridgeSessionId},get claudeSessionId(){return M},pushPrompt(YA){S=Date.now(),VB(YA),PB()},async interrupt(){await _?.interrupt()},done:AG,teardown:k,[Symbol.asyncDispose]:k};return z2(null),{ok:!0,handle:DI}}export{icA as runAssistantWorker};
|