@anthropic-ai/claude-agent-sdk 0.3.166 → 0.3.168
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 +17 -17
- package/manifest.zst.json +23 -23
- package/package.json +10 -10
- package/sdk.mjs +2 -2
package/assistant.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// (c) Anthropic PBC. All rights reserved. Use is subject to the Legal Agreements outlined here: https://code.claude.com/docs/en/legal-and-compliance.
|
|
2
2
|
|
|
3
|
-
// Version: 0.3.
|
|
3
|
+
// Version: 0.3.168
|
|
4
4
|
import{createRequire as Fie}from"node:module";var Rie=Object.create;var{getPrototypeOf:Tie,defineProperty:dp,getOwnPropertyNames:yN,getOwnPropertyDescriptor:Die}=Object,bN=Object.prototype.hasOwnProperty;function EN(e){return this[e]}var Pie,Mie,za=(e,t,r)=>{var n=e!=null&&typeof e==="object";if(n){var s=t?Pie??=new WeakMap:Mie??=new WeakMap,o=s.get(e);if(o)return o}r=e!=null?Rie(Tie(e)):{};let i=t||!e||!e.__esModule?dp(r,"default",{value:e,enumerable:!0}):r;for(let a of yN(e))if(!bN.call(i,a))dp(i,a,{get:EN.bind(e,a),enumerable:!0});if(n)s.set(e,i);return i},Nie=(e)=>{var t=(hN??=new WeakMap).get(e),r;if(t)return t;if(t=dp({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function"){for(var n of yN(e))if(!bN.call(t,n))dp(t,n,{get:EN.bind(e,n),enumerable:!(r=Die(e,n))||r.enumerable})}return hN.set(e,t),t},hN,E=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Oie=(e)=>e;function Uie(e,t){this[e]=Oie.bind(null,t)}var Ds=(e,t)=>{for(var r in t)dp(e,r,{get:t[r],enumerable:!0,configurable:!0,set:Uie.bind(t,r)})};var I=(e,t)=>()=>(e&&(t=e(e=0)),t);var k=Fie(import.meta.url),Lie=Symbol.dispose||Symbol.for("Symbol.dispose"),$ie=Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose"),Dt=(e,t,r)=>{if(t!=null){if(typeof t!=="object"&&typeof t!=="function")throw TypeError('Object expected to be assigned to "using" declaration');var n;if(r)n=t[$ie];if(n===void 0)n=t[Lie];if(typeof n!=="function")throw TypeError("Object not disposable");e.push([r,n,t])}else if(r)e.push([r]);return t},Pt=(e,t,r)=>{var n=typeof SuppressedError==="function"?SuppressedError:function(i,a,c,l){return l=Error(c),l.name="SuppressedError",l.error=i,l.suppressed=a,l},s=(i)=>t=r?new n(i,t,"An error was suppressed during disposal"):(r=!0,i),o=(i)=>{while(i=e.pop())try{var a=i[1]&&i[1].call(i[2]);if(i[0])return Promise.resolve(a).then(o,(c)=>(s(c),o()))}catch(c){s(c)}if(r)throw t};return o()};import{realpathSync as Hie}from"fs";import{dirname as CN,resolve as Vv,sep as SN}from"path";function $n(e){return process.platform==="darwin"?e.normalize("NFC"):e}function qie(e){if(e.startsWith("\\\\?\\UNC\\"))return"\\\\"+e.slice(8);if(e.startsWith("\\\\?\\")&&e.length>=7&&e[5]===":")return e.slice(4);return e}function wN(e){try{return qie(Hie.native(e))}catch{return null}}function zm(e,t){let r=Vv(t).toLowerCase(),n=Vv(e).toLowerCase();if(CN(n)===r||n.startsWith(r+SN))return!0;let s=wN(t)?.toLowerCase();if(s==null)return!1;let o=wN(CN(Vv(e)))?.toLowerCase();if(o==null)return!0;return o===s||o.startsWith(s+SN)}var jo=()=>{};var Wv=()=>{};function Ge(e){if(!e)return!1;if(typeof e==="boolean")return e;let t=String(e).toLowerCase().trim();return["1","true","yes","on"].includes(t)}function Ap(e){if(!e||e.startsWith("-")||e.startsWith("/"))return!1;if(e.includes(".."))return!1;if(e.split("/").some((t)=>t==="."||t===""))return!1;return/^[a-zA-Z0-9/._+@-]+$/.test(e)}function Ui(){let e=new Set;return{subscribe(t){return e.add(t),()=>{e.delete(t)}},emit(...t){let r;for(let n of e)try{n(...t)}catch(s){(r??=[]).push(s)}if(r)throw r.length===1?r[0]:AggregateError(r,"Signal listener(s) threw")},clear(){e.clear()}}}var _N=()=>{};var gp=I(()=>{_N()});var Yie,kN;var BN=I(()=>{Yie=typeof global=="object"&&global&&global.Object===Object&&global,kN=Yie});var Kie,Zie,hl;var qm=I(()=>{BN();Kie=typeof self=="object"&&self&&self.Object===Object&&self,Zie=kN||Kie||Function("return this")(),hl=Zie});var Xie,yl;var Jv=I(()=>{qm();Xie=hl.Symbol,yl=Xie});function rae(e){var t=eae.call(e,mp),r=e[mp];try{e[mp]=void 0;var n=!0}catch(o){}var s=tae.call(e);if(n)if(t)e[mp]=r;else delete e[mp];return s}var QN,eae,tae,mp,RN;var TN=I(()=>{Jv();QN=Object.prototype,eae=QN.hasOwnProperty,tae=QN.toString,mp=yl?yl.toStringTag:void 0;RN=rae});function oae(e){return sae.call(e)}var nae,sae,DN;var PN=I(()=>{nae=Object.prototype,sae=nae.toString;DN=oae});function cae(e){if(e==null)return e===void 0?aae:iae;return MN&&MN in Object(e)?RN(e):DN(e)}var iae="[object Null]",aae="[object Undefined]",MN,NN;var ON=I(()=>{Jv();TN();PN();MN=yl?yl.toStringTag:void 0;NN=cae});function lae(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}var Gm;var Yv=I(()=>{Gm=lae});function Aae(e){if(!Gm(e))return!1;var t=NN(e);return t==dae||t==pae||t==uae||t==fae}var uae="[object AsyncFunction]",dae="[object Function]",pae="[object GeneratorFunction]",fae="[object Proxy]",UN;var FN=I(()=>{ON();Yv();UN=Aae});var gae,Vm;var LN=I(()=>{qm();gae=hl["__core-js_shared__"],Vm=gae});function mae(e){return!!$N&&$N in e}var $N,jN;var zN=I(()=>{LN();$N=function(){var e=/[^.]+$/.exec(Vm&&Vm.keys&&Vm.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();jN=mae});function bae(e){if(e!=null){try{return yae.call(e)}catch(t){}try{return e+""}catch(t){}}return""}var hae,yae,HN;var qN=I(()=>{hae=Function.prototype,yae=hae.toString;HN=bae});function _ae(e){if(!Gm(e)||jN(e))return!1;var t=UN(e)?xae:Iae;return t.test(HN(e))}var Eae,Iae,vae,Cae,Sae,wae,xae,GN;var VN=I(()=>{FN();zN();Yv();qN();Eae=/[\\^$.*+?()[\]{}|]/g,Iae=/^\[object .+?Constructor\]$/,vae=Function.prototype,Cae=Object.prototype,Sae=vae.toString,wae=Cae.hasOwnProperty,xae=RegExp("^"+Sae.call(wae).replace(Eae,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");GN=_ae});function kae(e,t){return e==null?void 0:e[t]}var WN;var JN=I(()=>{WN=kae});function Bae(e,t){var r=WN(e,t);return GN(r)?r:void 0}var Wm;var Kv=I(()=>{VN();JN();Wm=Bae});var Qae,zo;var hp=I(()=>{Kv();Qae=Wm(Object,"create"),zo=Qae});function Rae(){this.__data__=zo?zo(null):{},this.size=0}var YN;var KN=I(()=>{hp();YN=Rae});function Tae(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var ZN;var XN=I(()=>{ZN=Tae});function Nae(e){var t=this.__data__;if(zo){var r=t[e];return r===Dae?void 0:r}return Mae.call(t,e)?t[e]:void 0}var Dae="__lodash_hash_undefined__",Pae,Mae,eO;var tO=I(()=>{hp();Pae=Object.prototype,Mae=Pae.hasOwnProperty;eO=Nae});function Fae(e){var t=this.__data__;return zo?t[e]!==void 0:Uae.call(t,e)}var Oae,Uae,rO;var nO=I(()=>{hp();Oae=Object.prototype,Uae=Oae.hasOwnProperty;rO=Fae});function $ae(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=zo&&t===void 0?Lae:t,this}var Lae="__lodash_hash_undefined__",sO;var oO=I(()=>{hp();sO=$ae});function bl(e){var t=-1,r=e==null?0:e.length;this.clear();while(++t<r){var n=e[t];this.set(n[0],n[1])}}var Zv;var iO=I(()=>{KN();XN();tO();nO();oO();bl.prototype.clear=YN;bl.prototype.delete=ZN;bl.prototype.get=eO;bl.prototype.has=rO;bl.prototype.set=sO;Zv=bl});function jae(){this.__data__=[],this.size=0}var aO;var cO=I(()=>{aO=jae});function zae(e,t){return e===t||e!==e&&t!==t}var lO;var uO=I(()=>{lO=zae});function Hae(e,t){var r=e.length;while(r--)if(lO(e[r][0],t))return r;return-1}var Fi;var yp=I(()=>{uO();Fi=Hae});function Vae(e){var t=this.__data__,r=Fi(t,e);if(r<0)return!1;var n=t.length-1;if(r==n)t.pop();else Gae.call(t,r,1);return--this.size,!0}var qae,Gae,dO;var pO=I(()=>{yp();qae=Array.prototype,Gae=qae.splice;dO=Vae});function Wae(e){var t=this.__data__,r=Fi(t,e);return r<0?void 0:t[r][1]}var fO;var AO=I(()=>{yp();fO=Wae});function Jae(e){return Fi(this.__data__,e)>-1}var gO;var mO=I(()=>{yp();gO=Jae});function Yae(e,t){var r=this.__data__,n=Fi(r,e);if(n<0)++this.size,r.push([e,t]);else r[n][1]=t;return this}var hO;var yO=I(()=>{yp();hO=Yae});function El(e){var t=-1,r=e==null?0:e.length;this.clear();while(++t<r){var n=e[t];this.set(n[0],n[1])}}var bO;var EO=I(()=>{cO();pO();AO();mO();yO();El.prototype.clear=aO;El.prototype.delete=dO;El.prototype.get=fO;El.prototype.has=gO;El.prototype.set=hO;bO=El});var Kae,IO;var vO=I(()=>{Kv();qm();Kae=Wm(hl,"Map"),IO=Kae});function Zae(){this.size=0,this.__data__={hash:new Zv,map:new(IO||bO),string:new Zv}}var CO;var SO=I(()=>{iO();EO();vO();CO=Zae});function Xae(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}var wO;var xO=I(()=>{wO=Xae});function ece(e,t){var r=e.__data__;return wO(t)?r[typeof t=="string"?"string":"hash"]:r.map}var Li;var bp=I(()=>{xO();Li=ece});function tce(e){var t=Li(this,e).delete(e);return this.size-=t?1:0,t}var _O;var kO=I(()=>{bp();_O=tce});function rce(e){return Li(this,e).get(e)}var BO;var QO=I(()=>{bp();BO=rce});function nce(e){return Li(this,e).has(e)}var RO;var TO=I(()=>{bp();RO=nce});function sce(e,t){var r=Li(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this}var DO;var PO=I(()=>{bp();DO=sce});function Il(e){var t=-1,r=e==null?0:e.length;this.clear();while(++t<r){var n=e[t];this.set(n[0],n[1])}}var Xv;var MO=I(()=>{SO();kO();QO();TO();PO();Il.prototype.clear=CO;Il.prototype.delete=_O;Il.prototype.get=BO;Il.prototype.has=RO;Il.prototype.set=DO;Xv=Il});function eC(e,t){if(typeof e!="function"||t!=null&&typeof t!="function")throw TypeError(oce);var r=function(){var n=arguments,s=t?t.apply(this,n):n[0],o=r.cache;if(o.has(s))return o.get(s);var i=e.apply(this,n);return r.cache=o.set(s,i)||o,i};return r.cache=new(eC.Cache||Xv),r}var oce="Expected a function",dt;var Ps=I(()=>{MO();eC.Cache=Xv;dt=eC});import{homedir as ice}from"os";import{join as ace}from"path";function tC(e){let t=process.env.NODE_OPTIONS;if(!t)return!1;return t.split(/\s+/).includes(e)}function NO(){return!1}function OO(){return{namespace:void 0,cluster:void 0}}var ds,I9e;var nr=I(()=>{gp();Ps();gp();ds=dt(()=>{return(process.env.CLAUDE_CONFIG_DIR??ace(ice(),".claude")).normalize("NFC")},()=>process.env.CLAUDE_CONFIG_DIR);I9e=dt(()=>Ge(process.env.CLAUDE_CODE_SUPERVISED))});function J(e,t,r,n,s){if(n==="m")throw TypeError("Private method is not writable");if(n==="a"&&!s)throw TypeError("Private accessor was defined without a setter");if(typeof t==="function"?e!==t||!s:!t.has(e))throw TypeError("Cannot write private member to an object whose class did not declare it");return n==="a"?s.call(e,r):s?s.value=r:t.set(e,r),r}function _(e,t,r,n){if(r==="a"&&!n)throw TypeError("Private accessor was defined without a getter");if(typeof t==="function"?e!==t||!n:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return r==="m"?n:r==="a"?n.call(e):n?n.value:t.get(e)}var Ho=()=>{};var rC=function(){let{crypto:e}=globalThis;if(e?.randomUUID)return rC=e.randomUUID.bind(e),e.randomUUID();let t=new Uint8Array(1),r=e?()=>e.getRandomValues(t)[0]:()=>Math.random()*255&255;return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,(n)=>(+n^r()&15>>+n/4).toString(16))};function qo(e){return typeof e==="object"&&e!==null&&(("name"in e)&&e.name==="AbortError"||("message"in e)&&String(e.message).includes("FetchRequestCanceledException"))}var Ep=(e)=>{if(e instanceof Error)return e;if(typeof e==="object"&&e!==null){try{if(Object.prototype.toString.call(e)==="[object Error]"){let t=Error(e.message,e.cause?{cause:e.cause}:{});if(e.stack)t.stack=e.stack;if(e.cause&&!t.cause)t.cause=e.cause;if(e.name)t.name=e.name;return t}}catch{}try{return Error(JSON.stringify(e))}catch{}}return Error(e)};var Z,kr,$r,qa,Ip,vp,Cp,Sp,wp,xp,_p,kp,Bp;var jr=I(()=>{Z=class Z extends Error{};kr=class kr extends Z{constructor(e,t,r,n,s){super(`${kr.makeMessage(e,t,r)}`);this.status=e,this.headers=n,this.requestID=n?.get("request-id"),this.error=t,this.type=s??null}static makeMessage(e,t,r){let n=t?.message?typeof t.message==="string"?t.message:JSON.stringify(t.message):t?JSON.stringify(t):r;if(e&&n)return`${e} ${n}`;if(e)return`${e} status code (no body)`;if(n)return n;return"(no status code or body)"}static generate(e,t,r,n){if(!e||!n)return new qa({message:r,cause:Ep(t)});let s=t,o=s?.error?.type;if(e===400)return new vp(e,s,r,n,o);if(e===401)return new Cp(e,s,r,n,o);if(e===403)return new Sp(e,s,r,n,o);if(e===404)return new wp(e,s,r,n,o);if(e===409)return new xp(e,s,r,n,o);if(e===422)return new _p(e,s,r,n,o);if(e===429)return new kp(e,s,r,n,o);if(e>=500)return new Bp(e,s,r,n,o);return new kr(e,s,r,n,o)}};$r=class $r extends kr{constructor({message:e}={}){super(void 0,void 0,e||"Request was aborted.",void 0)}};qa=class qa extends kr{constructor({message:e,cause:t}){super(void 0,void 0,e||"Connection error.",void 0);if(t)this.cause=t}};Ip=class Ip extends qa{constructor({message:e}={}){super({message:e??"Request timed out."})}};vp=class vp extends kr{};Cp=class Cp extends kr{};Sp=class Sp extends kr{};wp=class wp extends kr{};xp=class xp extends kr{};_p=class _p extends kr{};kp=class kp extends kr{};Bp=class Bp extends kr{}});function Jm(e){if(typeof e!=="object")return{};return e??{}}function oC(e){if(!e)return!0;for(let t in e)return!1;return!0}function FO(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var lce,UO=(e)=>{return lce.test(e)},nC=(e)=>(nC=Array.isArray,nC(e)),sC,LO=(e,t)=>{if(typeof t!=="number"||!Number.isInteger(t))throw new Z(`${e} must be an integer`);if(t<0)throw new Z(`${e} must be a positive integer`);return t},Ym=(e)=>{try{return JSON.parse(e)}catch(t){return}};var $i=I(()=>{jr();lce=/^[a-z][a-z0-9+.-]*:/i,sC=nC});var $O=(e)=>new Promise((t)=>setTimeout(t,e));var ps="0.94.0";function uce(){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 pce(){if(typeof navigator>"u"||!navigator)return null;let e=[{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:t,pattern:r}of e){let n=r.exec(navigator.userAgent);if(n){let s=n[1]||0,o=n[2]||0,i=n[3]||0;return{browser:t,version:`${s}.${o}.${i}`}}}return null}var qO=()=>{return typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u"},dce=()=>{let e=uce();if(e==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":ps,"X-Stainless-OS":zO(Deno.build.os),"X-Stainless-Arch":jO(Deno.build.arch),"X-Stainless-Runtime":"deno","X-Stainless-Runtime-Version":typeof Deno.version==="string"?Deno.version:Deno.version?.deno??"unknown"};if(typeof EdgeRuntime<"u")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":ps,"X-Stainless-OS":"Unknown","X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":"edge","X-Stainless-Runtime-Version":globalThis.process.version};if(e==="node")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":ps,"X-Stainless-OS":zO(globalThis.process.platform??"unknown"),"X-Stainless-Arch":jO(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let t=pce();if(t)return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":ps,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":`browser:${t.browser}`,"X-Stainless-Runtime-Version":t.version};return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":ps,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}},jO=(e)=>{if(e==="x32")return"x32";if(e==="x86_64"||e==="x64")return"x64";if(e==="arm")return"arm";if(e==="aarch64"||e==="arm64")return"arm64";if(e)return`other:${e}`;return"unknown"},zO=(e)=>{if(e=e.toLowerCase(),e.includes("ios"))return"iOS";if(e==="android")return"Android";if(e==="darwin")return"MacOS";if(e==="win32")return"Windows";if(e==="freebsd")return"FreeBSD";if(e==="openbsd")return"OpenBSD";if(e==="linux")return"Linux";if(e)return`Other:${e}`;return"Unknown"},HO,Qp=()=>{return HO??(HO=dce())};var Km=()=>{};function GO(){if(typeof fetch<"u")return fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function iC(...e){let t=globalThis.ReadableStream;if(typeof t>"u")throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new t(...e)}function Zm(e){let t=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator]();return iC({start(){},async pull(r){let{done:n,value:s}=await t.next();if(n)r.close();else r.enqueue(s)},async cancel(){await t.return?.()}})}function Rp(e){if(e[Symbol.asyncIterator])return e;let t=e.getReader();return{async next(){try{let r=await t.read();if(r?.done)t.releaseLock();return r}catch(r){throw t.releaseLock(),r}},async return(){let r=t.cancel();return t.releaseLock(),await r,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function VO(e){if(e===null||typeof e!=="object")return;if(e[Symbol.asyncIterator]){await e[Symbol.asyncIterator]().return?.();return}let t=e.getReader(),r=t.cancel();t.releaseLock(),await r}var WO=({headers:e,body:t})=>{return{bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(t)}};function JO(e){return Object.entries(e).filter(([t,r])=>typeof r<"u").map(([t,r])=>{if(typeof r==="string"||typeof r==="number"||typeof r==="boolean")return`${encodeURIComponent(t)}=${encodeURIComponent(r)}`;if(r===null)return`${encodeURIComponent(t)}=`;throw new Z(`Cannot stringify type ${typeof r}; 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 aC=I(()=>{jr()});function eh(e){if(!e)return;let t;try{t=new URL(e)}catch(n){throw new St(`Invalid token endpoint base URL "${e}": ${n}`)}if(t.protocol==="https:")return;let r=t.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(t.protocol==="http:"&&(r==="localhost"||r==="127.0.0.1"||r==="::1"))return;throw new St(`Refusing to send credential over non-https token endpoint "${e}"`)}async function th(e,t){let r=await mce(e),n;try{n=JSON.parse(r)}catch{throw new St(`Token endpoint returned non-JSON response (status ${e.status})`,e.status,mn(r),t)}if(!n.access_token)throw new St(`Token endpoint response missing access_token: ${JSON.stringify(mn(n))}`,e.status,mn(n),t);if(n.token_type&&n.token_type.toLowerCase()!=="bearer")throw new St(`Token endpoint response: unsupported token_type "${n.token_type}" (want Bearer)`,e.status,mn(n),t);return n}function mn(e){if(e==null)return e;if(typeof e==="string"){let t;try{t=JSON.parse(e)}catch{if(e.length<=cC)return e;return e.slice(0,cC)+`... <${e.length-cC} more chars>`}return JSON.stringify(mn(t))}if(typeof e==="object"&&!Array.isArray(e)){let t={};for(let[r,n]of Object.entries(e))if(gce.has(r))t[r]=n;return t}return null}async function rh(e,t=(r)=>console.warn(`anthropic-sdk: ${r}`)){if(typeof process>"u"||process.platform==="win32")return;let r=await import("node:fs"),n=e,s;try{n=await r.promises.realpath(e),s=await r.promises.stat(n)}catch{return}let o=s.mode&511;if(o&18)throw new St(`Credentials file at ${n} is group/world-writable (mode 0o${o.toString(8)}); this allows other local users to plant tokens. Run \`chmod 600 ${n}\`.`);if(o&36)throw new St(`Credentials file at ${n} is group/world-readable (mode 0o${o.toString(8)}); run \`chmod 600 ${n}\` before retrying.`);if(typeof process.getuid==="function"&&s.uid!==process.getuid())t(`credentials file at ${n} is owned by uid ${s.uid} (current process uid ${process.getuid()}); verify this is intentional.`)}async function nh(e,t){let r=await import("node:fs"),s=(await import("node:path")).dirname(e);await r.promises.mkdir(s,{recursive:!0,mode:448});let o=`${e}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;try{let i=await r.promises.open(o,"w",384);try{await i.writeFile(JSON.stringify(t,null,2)),await i.sync()}finally{await i.close()}await r.promises.rename(o,e)}catch(i){throw await r.promises.unlink(o).catch(()=>{}),i}try{let i=await r.promises.open(s,"r");try{await i.sync()}finally{await i.close()}}catch{}}async function mce(e){if(!e.body)return"";let t=e.body.getReader(),r=[],n=0;for(;;){let{done:o,value:i}=await t.read();if(o)break;if(n+i.length>YO){let a=YO-n;if(a>0)r.push(i.subarray(0,a));await t.cancel();break}r.push(i),n+=i.length}let s;if(r.length===1)s=r[0];else{s=new Uint8Array(r.reduce((i,a)=>i+a.length,0));let o=0;for(let i of r)s.set(i,o),o+=i.length}return new TextDecoder("utf-8").decode(s)}var KO="urn:ietf:params:oauth:grant-type:jwt-bearer",ZO="refresh_token",Xm="/v1/oauth/token",Ga="oauth-2025-04-20",XO="oidc-federation-2026-04-01",eU=120,vl=30,tU=5,YO=1048576,cC=2000,gce,St;var Cl=I(()=>{jr();gce=new Set(["error","error_description","error_uri"]);St=class St extends Z{constructor(e,t=null,r=null,n=null){super(e);this.statusCode=t,this.body=r,this.requestId=n}}});function Ms(){return Math.floor(Date.now()/1000)}class lC{constructor(e,t){this.cached=null,this.pendingRefresh=null,this.nextForce=!1,this.lastAdvisoryError=0,this.provider=e,this.onAdvisoryRefreshError=t}async getToken(){let e=this.nextForce;this.nextForce=!1;let t=this.cached;if(e||t==null)return(await this.refresh(e)).token;if(t.expiresAt==null)return t.token;let r=t.expiresAt-Ms();if(r>eU)return t.token;if(r>vl)return this.backgroundRefresh(),t.token;return(await this.refresh()).token}invalidate(){this.cached=null,this.nextForce=!0}refresh(e=!1){if(this.pendingRefresh&&!e)return this.pendingRefresh;return this.doRefresh(e)}backgroundRefresh(){if(this.pendingRefresh)return;if(Ms()-this.lastAdvisoryError<tU)return;this.doRefresh().catch((e)=>{this.lastAdvisoryError=Ms(),this.onAdvisoryRefreshError?.(e)})}doRefresh(e=!1){return this.pendingRefresh=this.provider(e?{forceRefresh:!0}:void 0).then((t)=>{return this.cached=t,this.pendingRefresh=null,t},(t)=>{throw this.pendingRefresh=null,t}),this.pendingRefresh}}var rU=I(()=>{Cl()});var bt=(e)=>{if(typeof globalThis.process<"u")return globalThis.process.env?.[e]?.trim()||void 0;if(typeof globalThis.Deno<"u")return globalThis.Deno.env?.get?.(e)?.trim()||void 0;return};function oU(e){let t=0;for(let s of e)t+=s.length;let r=new Uint8Array(t),n=0;for(let s of e)r.set(s,n),n+=s.length;return r}function Sl(e){let t;return(nU??(t=new globalThis.TextEncoder,nU=t.encode.bind(t)))(e)}function uC(e){let t;return(sU??(t=new globalThis.TextDecoder,sU=t.decode.bind(t)))(e)}var nU,sU;var iU=I(()=>{jr()});function Tp(){}function sh(e,t,r){if(!t||oh[e]>oh[r])return Tp;else return t[e].bind(t)}function hr(e){let t=e.logger,r=e.logLevel??"off";if(!t)return hce;let n=aU.get(t);if(n&&n[0]===r)return n[1];let s={error:sh("error",t,r),warn:sh("warn",t,r),info:sh("info",t,r),debug:sh("debug",t,r)};return aU.set(t,[r,s]),s}var oh,dC=(e,t,r)=>{if(!e)return;if(FO(oh,e))return e;hr(r).warn(`${t} was set to ${JSON.stringify(e)}, expected one of ${JSON.stringify(Object.keys(oh))}`);return},hce,aU,Go=(e)=>{if(e.options)e.options={...e.options},delete e.options.headers;if(e.headers)e.headers=Object.fromEntries((e.headers instanceof Headers?[...e.headers]:Object.entries(e.headers)).map(([t,r])=>[t,t.toLowerCase()==="x-api-key"||t.toLowerCase()==="authorization"||t.toLowerCase()==="cookie"||t.toLowerCase()==="set-cookie"?"***":r]));if("retryOfRequestLogID"in e){if(e.retryOfRequestLogID)e.retryOf=e.retryOfRequestLogID;delete e.retryOfRequestLogID}return e};var Dp=I(()=>{$i();oh={off:0,error:200,warn:300,info:400,debug:500};hce={error:Tp,warn:Tp,info:Tp,debug:Tp},aU=new WeakMap});var cU=I(()=>{$i();iU();Dp();aC()});function lU(e){if(!e)throw Error("profile name is empty");if(e==="."||e==="..")throw Error(`profile name "${e}" is not allowed`);if(e.includes("/")||e.includes("\\"))throw Error(`profile name "${e}" must not contain path separators`);if(!yce.test(e))throw Error(`profile name "${e}" contains disallowed characters (allowed: letters, digits, '_', '.', '-')`)}var ih="1.0",yce,uU=async(e)=>{var t,r;let n=await pC();if(n===null)return null;let s=e??await pU();if(s===null)return null;lU(s);let o=await import("node:fs"),a=(await import("node:path")).join(n,"configs",`${s}.json`),c;try{c=await o.promises.readFile(a,"utf-8")}catch(p){if(p?.code!=="ENOENT")throw Error(`failed to read config file ${a}: ${p}`);c=null}if(c===null){let p=bt("ANTHROPIC_ORGANIZATION_ID"),f=bt("ANTHROPIC_IDENTITY_TOKEN_FILE"),A=bt("ANTHROPIC_FEDERATION_RULE_ID");if(A&&p)return{fromFile:!1,config:{organization_id:p,workspace_id:bt("ANTHROPIC_WORKSPACE_ID"),base_url:bt("ANTHROPIC_BASE_URL"),authentication:{type:"oidc_federation",federation_rule_id:A,service_account_id:bt("ANTHROPIC_SERVICE_ACCOUNT_ID"),identity_token:f?{source:"file",path:f}:void 0,scope:bt("ANTHROPIC_SCOPE")}}};return null}let l;try{l=JSON.parse(c)}catch(p){throw Error(`failed to parse config file ${a}: ${p}`)}if(!l.authentication)throw Error(`config file ${a} is missing "authentication"`);let u=l.authentication.type;if(u!=="oidc_federation"&&u!=="user_oauth")throw Error(`authentication.type "${u}" is not a known authentication type`);if(l.organization_id??(l.organization_id=bt("ANTHROPIC_ORGANIZATION_ID")),l.workspace_id??(l.workspace_id=bt("ANTHROPIC_WORKSPACE_ID")),l.base_url??(l.base_url=bt("ANTHROPIC_BASE_URL")),(t=l.authentication).scope??(t.scope=bt("ANTHROPIC_SCOPE")),l.authentication.type==="oidc_federation"){if(!l.authentication.identity_token){let p=bt("ANTHROPIC_IDENTITY_TOKEN_FILE");if(p)l.authentication.identity_token={source:"file",path:p}}if(!l.authentication.federation_rule_id)l.authentication.federation_rule_id=bt("ANTHROPIC_FEDERATION_RULE_ID")??"";(r=l.authentication).service_account_id??(r.service_account_id=bt("ANTHROPIC_SERVICE_ACCOUNT_ID"))}return{config:l,fromFile:!0}},dU=async(e,t)=>{if(e?.authentication.credentials_path)return e.authentication.credentials_path;let r=await pC();if(!r)return null;let n=t??await pU();if(!n)return null;return lU(n),(await import("node:path")).join(r,"credentials",`${n}.json`)},pC=async()=>{if(!bce())return null;let e=await import("node:path"),t=bt("ANTHROPIC_CONFIG_DIR");if(t)return t;if(Qp()["X-Stainless-OS"]==="Windows"){let o=bt("APPDATA");if(o)return e.join(o,"Anthropic");let i=bt("USERPROFILE");if(i)return e.join(i,"AppData","Roaming","Anthropic");return null}let n=bt("XDG_CONFIG_HOME");if(n)return e.join(n,"anthropic");let s=bt("HOME");if(s)return e.join(s,".config","anthropic");return null},bce=()=>{let e=Qp()["X-Stainless-Runtime"];return e==="node"||e==="deno"},pU=async()=>{let e=await pC();if(!e)return null;let t=bt("ANTHROPIC_PROFILE");if(t)return t;let r=await import("node:fs"),s=(await import("node:path")).join(e,"active_config");try{return(await r.promises.readFile(s,"utf-8")).trim()||"default"}catch(o){if(o?.code!=="ENOENT")throw Error(`failed to read ${s}: ${o}`);return"default"}};var fC=I(()=>{Km();cU();yce=/^[A-Za-z0-9_.-]+$/});function AC(e){if(!e)throw new Z("Identity token file path is empty");return async()=>{let t=await import("node:fs"),r;try{r=await t.promises.readFile(e,"utf-8")}catch(s){throw new Z(`Failed to read identity token file at ${e}: ${s}`)}let n=r.trim();if(!n)throw new Z(`Identity token file at ${e} is empty`);return n}}function fU(e){if(!e)throw new Z("Identity token value is empty");return()=>e}var AU=I(()=>{jr()});function gU(e){return async()=>{eh(e.baseURL);let t=await e.identityTokenProvider();if(t.length>16384)throw new St(`Identity token is ${Math.ceil(t.length/1024)} KiB, exceeds the 16 KiB assertion limit`);let r={grant_type:KO,assertion:t,federation_rule_id:e.federationRuleId,organization_id:e.organizationId};if(e.serviceAccountId)r.service_account_id=e.serviceAccountId;if(e.workspaceId)r.workspace_id=e.workspaceId;let n=`${e.baseURL}${Xm}`,s;try{s=await e.fetch(n,{method:"POST",headers:{"Content-Type":"application/json","anthropic-beta":`${Ga},${XO}`,"User-Agent":e.userAgent||`anthropic-sdk-typescript/${ps} oidcFederationProvider`},body:JSON.stringify(r)})}catch(c){throw new St(`Failed to reach token endpoint ${n}: ${c}`)}let o=s.headers.get("Request-Id");if(!s.ok){let c=await s.text().catch(()=>""),l=mn(c),u="";if(s.status===401)u=` Ensure your federation rule matches your identity token. ${e.workspaceId?"":"If your federation rule is scoped to multiple workspaces, set the ANTHROPIC_WORKSPACE_ID environment variable, the 'workspace_id' config key, or the `workspaceId` option. "}View your authentication events in the Workload identity page of Claude Console for more details.`;throw new St(`Token exchange failed with status ${s.status}${o?` (request-id ${o})`:""}: ${l}${u}`,s.status,l,o)}let i=await th(s,o),a=Number(i.expires_in);if(!Number.isFinite(a))throw new St(`Token endpoint response missing required fields: ${JSON.stringify(mn(i))}`,s.status,mn(i),o);return{token:i.access_token,expiresAt:Ms()+a}}}var mU=I(()=>{Cl()});function hU(e){return async(t)=>{let r=await import("node:fs");await rh(e.credentialsPath,e.onSafetyWarning);let n;try{n=await r.promises.readFile(e.credentialsPath,"utf-8")}catch(m){throw new St(`Credentials file not found at ${e.credentialsPath}: ${m}`)}let s;try{s=JSON.parse(n)}catch(m){throw new St(`Credentials file at ${e.credentialsPath} is not valid JSON: ${m}`)}let o=s.access_token;if(!o)throw new St(`Credentials file at ${e.credentialsPath} must include 'access_token'`);let i=s.expires_at;if(!t?.forceRefresh&&(i==null||Ms()<i-vl))return{token:o,expiresAt:i??null};let a=s.refresh_token;if(!e.clientId||!a)throw new St(`Access token at ${e.credentialsPath} has expired and no refresh is available (client_id ${e.clientId?"set":"empty"}, refresh_token ${a?"set":"empty"})`);eh(e.baseURL);let c={grant_type:ZO,refresh_token:a,client_id:e.clientId},l=`${e.baseURL}${Xm}`,u;try{u=await e.fetch(l,{method:"POST",headers:{"Content-Type":"application/json","anthropic-beta":Ga,"User-Agent":e.userAgent||`anthropic-sdk-typescript/${ps} userOAuthProvider`},body:JSON.stringify(c)})}catch(m){throw new St(`User OAuth refresh failed to reach token endpoint: ${m}`)}let p=u.headers.get("Request-Id");if(!u.ok){let m=await u.text().catch(()=>"");throw new St(`User OAuth refresh failed (HTTP ${u.status}): ${mn(m)}`,u.status,mn(m),p)}let f=await th(u,p),A=Number(f.expires_in);if(!Number.isFinite(A))throw new St(`User OAuth refresh response missing or invalid expires_in: ${JSON.stringify(mn(f))}`,u.status,mn(f),p);let g=Ms()+A,h=f.refresh_token||a;return await nh(e.credentialsPath,{...s,version:ih,type:"oauth_token",access_token:f.access_token,expires_at:g,refresh_token:h}),{token:f.access_token,expiresAt:g}}}var yU=I(()=>{fC();Cl()});function gC(e,t){let r=e.authentication.credentials_path??null,n=(e.base_url||t.baseURL).replace(/\/+$/,""),s=Ece(e,r,n,t),o={};if(e.workspace_id&&e.authentication.type==="user_oauth")o["anthropic-workspace-id"]=e.workspace_id;return{provider:s,extraHeaders:o,baseURL:e.base_url||void 0}}async function bU(e,t){let r=await uU(t);if(!r)return null;let{config:n,fromFile:s}=r,o=n.authentication.credentials_path||!s?n:{...n,authentication:{...n.authentication,credentials_path:await dU(n,t)??void 0}};return gC(o,e)}function Ece(e,t,r,n){switch(e.authentication.type){case"oidc_federation":{let s=e.authentication,o=Ice(s);if(!o)throw new St("oidc_federation config requires an identity token (set authentication.identity_token, ANTHROPIC_IDENTITY_TOKEN_FILE, or ANTHROPIC_IDENTITY_TOKEN)");if(!s.federation_rule_id)throw new St("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(!e.organization_id)throw new St("oidc_federation config requires organization_id (set ANTHROPIC_ORGANIZATION_ID or config.organization_id)");let i=gU({identityTokenProvider:o,federationRuleId:s.federation_rule_id,organizationId:e.organization_id,serviceAccountId:s.service_account_id,workspaceId:e.workspace_id,baseURL:r,fetch:n.fetch,userAgent:n.userAgent});if(t)return vce(i,t,n.onCacheWriteError,n.onSafetyWarning);return i}case"user_oauth":{if(!t)throw new St("user_oauth config requires authentication.credentials_path (or load via a profile so it defaults to <config_dir>/credentials/<profile>.json)");return hU({credentialsPath:t,clientId:e.authentication.client_id,baseURL:r,fetch:n.fetch,userAgent:n.userAgent,onSafetyWarning:n.onSafetyWarning})}default:{let s=e.authentication.type;throw new St(`authentication.type "${s}" is not a known authentication type`)}}}function Ice(e){if(e.identity_token){let n=e.identity_token.source;if(n!=="file")throw new St(`identity_token.source "${n}" is not supported by this SDK version (only "file")`);if(!e.identity_token.path)throw new St('identity_token.source "file" requires a non-empty path');return AC(e.identity_token.path)}let t=bt("ANTHROPIC_IDENTITY_TOKEN_FILE");if(t)return AC(t);let r=bt("ANTHROPIC_IDENTITY_TOKEN");if(r)return fU(r);return null}function vce(e,t,r,n){return async(s)=>{let o=await import("node:fs");await rh(t,n);let i;try{let c=await o.promises.readFile(t,"utf-8");i=JSON.parse(c);let l=i?.access_token;if(l&&!s?.forceRefresh){let u=i?.expires_at;if(u==null||Ms()<u-vl)return{token:l,expiresAt:u??null}}}catch(c){if(c?.code!=="ENOENT"&&!(c instanceof SyntaxError))r?.(c)}let a=await e(s);try{await nh(t,{...i??{},version:ih,type:"oauth_token",access_token:a.token,expires_at:a.expiresAt})}catch(c){r?.(c)}return a}}var EU=I(()=>{fC();Cl();AU();mU();yU()});class ji{constructor(){jn.set(this,void 0),zn.set(this,void 0),J(this,jn,new Uint8Array,"f"),J(this,zn,null,"f")}decode(e){if(e==null)return[];let t=e instanceof ArrayBuffer?new Uint8Array(e):typeof e==="string"?Sl(e):e;J(this,jn,oU([_(this,jn,"f"),t]),"f");let r=[],n;while((n=Cce(_(this,jn,"f"),_(this,zn,"f")))!=null){if(n.carriage&&_(this,zn,"f")==null){J(this,zn,n.index,"f");continue}if(_(this,zn,"f")!=null&&(n.index!==_(this,zn,"f")+1||n.carriage)){r.push(uC(_(this,jn,"f").subarray(0,_(this,zn,"f")-1))),J(this,jn,_(this,jn,"f").subarray(_(this,zn,"f")),"f"),J(this,zn,null,"f");continue}let s=_(this,zn,"f")!==null?n.preceding-1:n.preceding,o=uC(_(this,jn,"f").subarray(0,s));r.push(o),J(this,jn,_(this,jn,"f").subarray(n.index),"f"),J(this,zn,null,"f")}return r}flush(){if(!_(this,jn,"f").length)return[];return this.decode(`
|
|
5
5
|
`)}}function Cce(e,t){for(let s=t??0;s<e.length;s++){if(e[s]===10)return{preceding:s,index:s+1,carriage:!1};if(e[s]===13)return{preceding:s,index:s+1,carriage:!0}}return null}function IU(e){for(let n=0;n<e.length-1;n++){if(e[n]===10&&e[n+1]===10)return n+2;if(e[n]===13&&e[n+1]===13)return n+2;if(e[n]===13&&e[n+1]===10&&n+3<e.length&&e[n+2]===13&&e[n+3]===10)return n+4}return-1}var jn,zn;var mC=I(()=>{Ho();jn=new WeakMap,zn=new WeakMap;ji.NEWLINE_CHARS=new Set([`
|
|
6
6
|
`,"\r"]);ji.NEWLINE_REGEXP=/\r\n|[\n\r]/g});async function*Sce(e,t){if(!e.body){if(t.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative")throw new Z("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 Z("Attempted to iterate over a response with no body")}let r=new vU,n=new ji,s=Rp(e.body);for await(let o of wce(s))for(let i of n.decode(o)){let a=r.decode(i);if(a)yield a}for(let o of n.flush()){let i=r.decode(o);if(i)yield i}}async function*wce(e){let t=new Uint8Array;for await(let r of e){if(r==null)continue;let n=r instanceof ArrayBuffer?new Uint8Array(r):typeof r==="string"?Sl(r):r,s=new Uint8Array(t.length+n.length);s.set(t),s.set(n,t.length),t=s;let o;while((o=IU(t))!==-1)yield t.slice(0,o),t=t.slice(o)}if(t.length>0)yield t}class vU{constructor(){this.event=null,this.data=[],this.chunks=[]}decode(e){if(e.endsWith("\r"))e=e.substring(0,e.length-1);if(!e){if(!this.event&&!this.data.length)return null;let s={event:this.event,data:this.data.join(`
|
|
@@ -177,7 +177,7 @@ ${s}`;break;case"retry":if(Tse(s))t[n]=s;break;case"id":if(Dse(s))t[n]=s;break;c
|
|
|
177
177
|
`+s}}catch(o){}}throw r}}_request(e,t){if(typeof e==="string")t=t||{},t.url=e;else t=e||{};t=ro(this.defaults,t);let{transitional:r,paramsSerializer:n,headers:s}=t;if(r!==void 0)Bg.assertOptions(r,{silentJSONParsing:Is.transitional(Is.boolean),forcedJSONParsing:Is.transitional(Is.boolean),clarifyTimeoutError:Is.transitional(Is.boolean),legacyInterceptorReqResOrdering:Is.transitional(Is.boolean)},!1);if(n!=null)if(S.isFunction(n))t.paramsSerializer={serialize:n};else Bg.assertOptions(n,{encode:Is.function,serialize:Is.function},!0);if(t.allowAbsoluteUrls!==void 0);else if(this.defaults.allowAbsoluteUrls!==void 0)t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls;else t.allowAbsoluteUrls=!0;Bg.assertOptions(t,{baseUrl:Is.spelling("baseURL"),withXsrfToken:Is.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let o=s&&S.merge(s.common,s[t.method]);s&&S.forEach(["delete","get","head","post","put","patch","common"],(A)=>{delete s[A]}),t.headers=ar.concat(o,s);let i=[],a=!0;this.interceptors.request.forEach(function(g){if(typeof g.runWhen==="function"&&g.runWhen(t)===!1)return;a=a&&g.synchronous;let h=t.transitional||ma;if(h&&h.legacyInterceptorReqResOrdering)i.unshift(g.fulfilled,g.rejected);else i.push(g.fulfilled,g.rejected)});let c=[];this.interceptors.response.forEach(function(g){c.push(g.fulfilled,g.rejected)});let l,u=0,p;if(!a){let A=[LE.bind(this),void 0];A.unshift(...i),A.push(...c),p=A.length,l=Promise.resolve(t);while(u<p)l=l.then(A[u++],A[u++]);return l}p=i.length;let f=t;while(u<p){let A=i[u++],g=i[u++];try{f=A(f)}catch(h){g.call(this,h);break}}try{l=LE.call(this,f)}catch(A){return Promise.reject(A)}u=0,p=c.length;while(u<p)l=l.then(c[u++],c[u++]);return l}getUri(e){e=ro(this.defaults,e);let t=Oc(e.baseURL,e.url,e.allowAbsoluteUrls);return Nc(t,e.params,e.paramsSerializer)}}S.forEach(["delete","get","head","options"],function(t){Qg.prototype[t]=function(r,n){return this.request(ro(n||{},{method:t,url:r,data:(n||{}).data}))}});S.forEach(["post","put","patch"],function(t){function r(n){return function(o,i,a){return this.request(ro(a||{},{method:t,headers:n?{"Content-Type":"multipart/form-data"}:{},url:o,data:i}))}}Qg.prototype[t]=r(),Qg.prototype[t+"Form"]=r(!0)});var Rg=Qg;class uD{constructor(e){if(typeof e!=="function")throw TypeError("executor must be a function.");let t;this.promise=new Promise(function(s){t=s});let r=this;this.promise.then((n)=>{if(!r._listeners)return;let s=r._listeners.length;while(s-- >0)r._listeners[s](n);r._listeners=null}),this.promise.then=(n)=>{let s,o=new Promise((i)=>{r.subscribe(i),s=i}).then(n);return o.cancel=function(){r.unsubscribe(s)},o},e(function(s,o,i){if(r.reason)return;r.reason=new Kn(s,o,i),t(r.reason)})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}if(this._listeners)this._listeners.push(e);else this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let t=this._listeners.indexOf(e);if(t!==-1)this._listeners.splice(t,1)}toAbortSignal(){let e=new AbortController,t=(r)=>{e.abort(r)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new uD(function(n){e=n}),cancel:e}}}var DZ=uD;function dD(e){return function(r){return e.apply(null,r)}}function pD(e){return S.isObject(e)&&e.isAxiosError===!0}var fD={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(fD).forEach(([e,t])=>{fD[t]=e});var PZ=fD;function MZ(e){let t=new Rg(e),r=dg(Rg.prototype.request,t);return S.extend(r,Rg.prototype,t,{allOwnKeys:!0}),S.extend(r,t,null,{allOwnKeys:!0}),r.create=function(s){return MZ(ro(e,s))},r}var Sr=MZ(rd);Sr.Axios=Rg;Sr.CanceledError=Kn;Sr.CancelToken=DZ;Sr.isCancel=vg;Sr.VERSION=jc;Sr.toFormData=ga;Sr.AxiosError=j;Sr.Cancel=Sr.CanceledError;Sr.all=function(t){return Promise.all(t)};Sr.spread=dD;Sr.isAxiosError=pD;Sr.mergeConfig=ro;Sr.AxiosHeaders=ar;Sr.formToJSON=(e)=>xE(S.isHTMLForm(e)?new FormData(e):e);Sr.getAdapter=FE.getAdapter;Sr.HttpStatusCode=PZ;Sr.default=Sr;var Ar=Sr;et();Ys();xt();bn();import{mkdirSync as kMe,writeFileSync as BMe}from"fs";bn();et();nr();xt();Kr();var jE="/home/claude/.claude/remote",uxt=`${jE}/.oauth_token`,dxt=`${jE}/.api_key`,zE=`${jE}/.session_ingress_token`;function NZ(e,t,r){if(!Ge(process.env.CLAUDE_CODE_REMOTE))return;try{kMe(jE,{recursive:!0,mode:448}),BMe(e,t,{encoding:"utf8",mode:384}),b(`Persisted ${r} to ${e} for subprocess access`)}catch(n){b(`Failed to persist ${r} to disk (non-fatal): ${ae(n)}`,{level:"error"})}}function AD(e,t){try{let n=Mt().readFileSync(e,{encoding:"utf8"}).trim();if(!n)return null;return b(`Read ${t} from well-known file ${e}`),n}catch(r){if(!Os(r))b(`Failed to read ${t} from ${e}: ${ae(r)}`,{level:"debug"});return null}}et();xt();Kr();function QMe(){let e=hF();if(e!==void 0)return e;let t=process.env.CLAUDE_CODE_WEBSOCKET_AUTH_FILE_DESCRIPTOR;if(!t){let n=process.env.CLAUDE_SESSION_INGRESS_TOKEN_FILE??zE,s=AD(n,"session ingress token");return Ll(s),s}let r=parseInt(t,10);if(Number.isNaN(r))return b(`CLAUDE_CODE_WEBSOCKET_AUTH_FILE_DESCRIPTOR must be a valid file descriptor number, got: ${t}`,{level:"error"}),Ll(null),null;try{let n=Mt(),s=process.platform==="darwin"||process.platform==="freebsd"?`/dev/fd/${r}`:`/proc/self/fd/${r}`,o=n.readFileSync(s,{encoding:"utf8"}).trim();if(!o)return b("File descriptor contained empty token",{level:"error"}),Ll(null),null;return b(`Successfully read token from file descriptor ${r}`),Ll(o),NZ(zE,o,"session ingress token"),o}catch(n){b(`Failed to read token from file descriptor ${r}: ${ae(n)}`,{level:"error"});let s=process.env.CLAUDE_SESSION_INGRESS_TOKEN_FILE??zE,o=AD(s,"session ingress token");return Ll(o),o}}function Tg(){let e=process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN;if(e)return e;return QMe()}function HE(){let e=Tg();if(!e)return{};if(e.startsWith("sk-ant-sid")){let t={Cookie:`sessionKey=${e}`},r=process.env.CLAUDE_CODE_ORGANIZATION_UUID;if(r)t["X-Organization-Uuid"]=r;return t}return{Authorization:`Bearer ${e}`}}function Dg(e){process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN=e}rt();class Hc extends Error{retryAfterMs;constructor(e,t){super(e);this.retryAfterMs=t}}class qc{pending=[];pendingAtClose=0;draining=!1;closed=!1;backpressureResolvers=[];sleepResolve=null;flushResolvers=[];droppedBatches=0;config;constructor(e){this.config=e}get droppedBatchCount(){return this.droppedBatches}get pendingCount(){return this.closed?this.pendingAtClose:this.pending.length}async enqueue(e){if(this.closed)return;let t=Array.isArray(e)?e:[e];if(t.length===0)return;while(this.pending.length+t.length>this.config.maxQueueSize&&!this.closed)await new Promise((r)=>{this.backpressureResolvers.push(r)});if(this.closed)return;this.pending.push(...t),this.drain()}flush(){if(this.pending.length===0&&!this.draining)return Promise.resolve();return this.drain(),new Promise((e)=>{this.flushResolvers.push(e)})}close(){if(this.closed)return;this.closed=!0,this.pendingAtClose=this.pending.length,this.pending=[],this.sleepResolve?.(),this.sleepResolve=null;for(let e of this.backpressureResolvers)e();this.backpressureResolvers=[];for(let e of this.flushResolvers)e();this.flushResolvers=[]}async drain(){if(this.draining||this.closed)return;this.draining=!0;let e=0;try{while(this.pending.length>0&&!this.closed){let t=this.takeBatch();if(t.length===0)continue;try{await this.config.send(t),e=0}catch(r){if(e++,this.config.maxConsecutiveFailures!==void 0&&e>=this.config.maxConsecutiveFailures){this.droppedBatches++,this.config.onBatchDropped?.(t.length,e),e=0,this.releaseBackpressure();continue}this.pending=t.concat(this.pending);let n=r instanceof Hc?r.retryAfterMs:void 0;await this.sleep(this.retryDelay(e,n));continue}this.releaseBackpressure()}}finally{if(this.draining=!1,this.pending.length===0){for(let t of this.flushResolvers)t();this.flushResolvers=[]}}}takeBatch(){let{maxBatchSize:e,maxBatchBytes:t}=this.config;if(t===void 0)return this.pending.splice(0,e);let r=0,n=0;while(n<this.pending.length&&n<e){let s;try{s=Buffer.byteLength(Ee(this.pending[n]))}catch{this.pending.splice(n,1);continue}if(n>0&&r+s>t)break;r+=s,n++}return this.pending.splice(0,n)}retryDelay(e,t){let r=Math.random()*this.config.jitterMs;if(t!==void 0)return Math.max(this.config.baseDelayMs,Math.min(t,this.config.maxDelayMs))+r;return Math.min(this.config.baseDelayMs*2**(e-1),this.config.maxDelayMs)+r}releaseBackpressure(){let e=this.backpressureResolvers;this.backpressureResolvers=[];for(let t of e)t()}sleep(e){return new Promise((t)=>{this.sleepResolve=t,setTimeout((r,n)=>{r.sleepResolve=null,n()},e,this,t)})}}Ji();class gD{capacity;buffer;head=0;size=0;constructor(e){this.capacity=e;this.buffer=Array(e)}add(e){if(this.buffer[this.head]=e,this.head=(this.head+1)%this.capacity,this.size<this.capacity)this.size++}addAll(e){for(let t of e)this.add(t)}getRecent(e){let t=[],r=this.size<this.capacity?0:this.head,n=Math.min(e,this.size);for(let s=0;s<n;s++){let o=(r+this.size-n+s)%this.capacity;t.push(this.buffer[o])}return t}toArray(){if(this.size===0)return[];let e=[],t=this.size<this.capacity?0:this.head;for(let r=0;r<this.size;r++){let n=(t+r)%this.capacity;e.push(this.buffer[n])}return e}clear(){this.buffer.length=0,this.head=0,this.size=0}length(){return this.size}}et();Ys();nr();Ps();import{Agent as TMe}from"https";Ps();et();nr();Kr();var OZ=["bundled","system"];function RMe(){let e=process.env.CLAUDE_CODE_CERT_STORE;if(e){let t=[];for(let r of e.split(",")){let n=r.trim().toLowerCase();if(n==="bundled"||n==="system"){if(!t.includes(n))t.push(n)}else if(n)b(`CA certs: unrecognized CLAUDE_CODE_CERT_STORE source '${n}', ignoring`,{level:"warn"})}return t.length>0?t:OZ}if(tC("--use-system-ca")||tC("--use-openssl-ca"))return["system"];return OZ}var cd=dt(()=>{let e=RMe(),t=process.env.NODE_EXTRA_CA_CERTS,r=e.includes("bundled"),n=e.includes("system");b(`CA certs: stores=${e.join(",")}, extraCertsPath=${t}`);let s=k("tls"),o=s.getCACertificates;if(!r&&n&&!o){b("CA certs: stores=system but system CA API unavailable, deferring to runtime");return}let i=[];if(r)i.push(...s.rootCertificates),b(`CA certs: Loaded ${s.rootCertificates.length} bundled root certificates`);if(n)try{let a=o?.("system");if(a&&a.length>0)i.push(...a),b(`CA certs: Loaded ${a.length} system CA certificates`);else if(b(`CA certs: system store ${o?"returned empty":"unavailable"}`),!r)i.push(...s.rootCertificates)}catch(a){if(b(`CA certs: Failed to load system CA certificates: ${a}`,{level:"error"}),!r)i.push(...s.rootCertificates)}if(t)try{let a=Mt().readFileSync(t,{encoding:"utf8"});i.push(a),b(`CA certs: Appended extra certificates from NODE_EXTRA_CA_CERTS (${t})`)}catch(a){b(`CA certs: Failed to read NODE_EXTRA_CA_CERTS file (${t}): ${a}`,{level:"error"})}return i.length>0?kf(i):void 0});et();Kr();var Pg=dt(()=>{let e={};if(process.env.CLAUDE_CODE_CLIENT_CERT)try{e.cert=Mt().readFileSync(process.env.CLAUDE_CODE_CLIENT_CERT,{encoding:"utf8"}),b("mTLS: Loaded client certificate from CLAUDE_CODE_CLIENT_CERT")}catch(t){b(`mTLS: Failed to load client certificate: ${t}`,{level:"error"})}if(process.env.CLAUDE_CODE_CLIENT_KEY)try{e.key=Mt().readFileSync(process.env.CLAUDE_CODE_CLIENT_KEY,{encoding:"utf8"}),b("mTLS: Loaded client key from CLAUDE_CODE_CLIENT_KEY")}catch(t){b(`mTLS: Failed to load client key: ${t}`,{level:"error"})}if(process.env.CLAUDE_CODE_CLIENT_KEY_PASSPHRASE)e.passphrase=process.env.CLAUDE_CODE_CLIENT_KEY_PASSPHRASE,b("mTLS: Using client key passphrase");if(Object.keys(e).length===0)return;return e}),DMe=dt(()=>{let e=Pg(),t=cd();if(!e&&!t)return;let r={...e,...t&&{ca:t},keepAlive:!0};return b("mTLS: Creating HTTPS agent with custom certificates"),new TMe(r)});function UZ(){let e=Pg(),t=cd();if(!e&&!t)return;return{...e,...t&&{ca:t}}}function ld(){let e=Pg(),t=cd();if(!e&&!t)return{};return{tls:{...e,...t&&{ca:t}}}}Ps();bn();var IWe=za(XZ(),1);import{isIP as Jse}from"net";function hD(e,t){let r=t.lastIndexOf("/");if(r<0)return!1;let n=t.slice(0,r),s=t.slice(r+1);if(!/^\d+$/.test(s))return!1;let o=parseInt(s,10),i=e3(n);if(!i)return!1;if(i.zone)return!1;let a=e3(e);if(!a)return!1;let c=rNe(a.bytes),l=i.bytes;if(c.length!==l.length)return!1;let u=l.length*8;if(o<0||o>u)return!1;return tNe(c,l,o)}function tNe(e,t,r){let n=r>>3;for(let i=0;i<n;i++)if(e[i]!==t[i])return!1;let s=r&7;if(s===0)return!0;let o=255<<8-s&255;return((e[n]??0)&o)===((t[n]??0)&o)}function rNe(e){if(e.length!==16)return e;for(let t=0;t<10;t++)if(e[t]!==0)return e;if(e[10]!==255||e[11]!==255)return e;return e.slice(12)}function e3(e){if(e==="")return null;let t="",r=e,n=e.indexOf("%");if(n>=0)t=e.slice(n+1),r=e.slice(0,n);if(r.includes(":")){let o=nNe(r);return o?{bytes:o,zone:t}:null}if(t)return null;let s=t3(r);return s?{bytes:s,zone:""}:null}function t3(e){let t=e.split(".");if(t.length!==4)return null;let r=new Uint8Array(4);for(let n=0;n<4;n++){let s=t[n];if(s===void 0||s===""||!/^\d{1,3}$/.test(s))return null;if(s.length>1&&s.startsWith("0"))return null;let o=parseInt(s,10);if(o>255)return null;r[n]=o}return r}function nNe(e){let t=null,r=e,n=e.lastIndexOf(":");if(n>=0&&e.slice(n+1).includes(".")){if(t=t3(e.slice(n+1)),!t)return null;r=e.slice(0,n+1)}let s=r.split("::");if(s.length>2)return null;let o=[],i=(c,l)=>{if(c==="")return[];let u=c.split(":"),p=[];for(let f=0;f<u.length;f++){let A=u[f];if(A===""&&l&&f===u.length-1)continue;if(A===void 0||A===""||!/^[0-9a-fA-F]{1,4}$/.test(A))return null;p.push(parseInt(A,16))}return p};if(s.length===1){let c=s[0]??"",l=i(c,t!==null);if(!l)return null;o.push(...l);let u=t?6:8;if(o.length!==u)return null}else{let c=s[0]??"",l=s[1]??"",u=i(c,!1),p=i(l,t!==null);if(!u||!p)return null;let f=t?2:0,A=8-u.length-p.length-f;if(A<1)return null;o.push(...u);for(let g=0;g<A;g++)o.push(0);if(o.push(...p),o.length+f!==8)return null}let a=new Uint8Array(16);for(let c=0;c<o.length;c++){let l=o[c];if(l===void 0)return null;a[c*2]=l>>8&255,a[c*2+1]=l&255}if(t)a[12]=t[0]??0,a[13]=t[1]??0,a[14]=t[2]??0,a[15]=t[3]??0;return a}et();nr();tT();var vWe=!1;function Kse(e=process.env){return e.https_proxy||e.HTTPS_PROXY||e.http_proxy||e.HTTP_PROXY}function Zse(e=process.env){return e.no_proxy||e.NO_PROXY}function LM(e,t=Zse()){if(!t)return!1;if(t==="*")return!0;try{let r=new URL(e),n=r.hostname.toLowerCase(),s=r.port||(r.protocol==="https:"?"443":"80"),o=`${n}:${s}`;return t.split(/[,\s]+/).filter(Boolean).some((a)=>{if(a=a.toLowerCase().trim(),a.includes(":"))return o===a;if(a.startsWith(".")){let c=a;return n===a.substring(1)||n.endsWith(c)}return n===a})}catch{return!1}}function Yse(e,t){if(LM(e,t))return!0;if(!t)return!1;let r;try{r=new URL(e).hostname.replace(/^\[|\]$/g,"")}catch{return!1}if(Jse(r)===0)return!1;return t.split(/[,\s]+/).filter(Boolean).some((n)=>{if(n.includes("/"))return hD(r,n);let s=Jse(n);if(s===0)return!1;return hD(r,`${n}/${s===4?32:128}`)})}var Mkt=dt((e)=>{let t=Wse(),r=Pg(),n=cd(),s={httpProxy:e,httpsProxy:e,noProxy:process.env.NO_PROXY||process.env.no_proxy};if(r||n){let o={...r&&{cert:r.cert,key:r.key,passphrase:r.passphrase},...n&&{ca:n}};s.connect=o,s.requestTls=o}return new t.EnvHttpProxyAgent(s)});function Xse(e){let t=Kse();if(!t)return;if(LM(e))return;return t}var CWe=null;function SWe(){return CWe?.value??null}function $M(e){let t={...vWe&&{keepalive:!1},...e.forAnthropicAPI&&!Ge(process.env.API_FORCE_IDLE_TIMEOUT)&&{timeout:!1}};if(e.forAnthropicAPI){let n=process.env.ANTHROPIC_UNIX_SOCKET;if(n)return{...t,unix:n}}let r=Kse();if(r){if(e.url&&LM(e.url))return{...t,...ld()};let n=SWe();return{...t,proxy:n?{url:r,headers:{"Proxy-Authorization":n}}:r,...ld()}}if(e.fallbackProxy){if(e.url&&(Yse(e.url,e.fallbackProxy.noProxy)||Yse(e.url,Zse())))return{...t,...ld()};let n=ld();return{...t,proxy:e.fallbackProxy.url,...e.fallbackProxy.ca?{tls:{...n.tls,ca:e.fallbackProxy.ca}}:n}}return{...t,...ld()}}$l();Ys();nr();var wWe=30000;function xWe(){return{activityCallback:null,refcount:0,activeReasons:new Map,oldestActivityStartedAt:null,heartbeatTimer:null,idleTimer:null,cleanupHandle:null}}var _We="cli",eoe=()=>_We;var jM=new Map;function kWe(){let e=eoe(),t=jM.get(e);if(!t)t=xWe(),jM.set(e,t);return t}function BWe(){return jM.get(eoe())??null}function QWe(e){toe(e),e.heartbeatTimer=setInterval((t)=>{if(H("debug","session_keepalive_heartbeat",{refcount:t.refcount}),Ge(process.env.CLAUDE_CODE_REMOTE_SEND_KEEPALIVES))t.activityCallback?.()},wWe,e)}function toe(e){if(e.idleTimer!==null)clearTimeout(e.idleTimer),e.idleTimer=null}function xv(e){let t=kWe();if(t.activityCallback=e,t.refcount>0&&t.heartbeatTimer===null)QWe(t)}function Nm(){let e=BWe();if(!e)return;if(e.activityCallback=null,e.heartbeatTimer!==null)clearInterval(e.heartbeatTimer),e.heartbeatTimer=null;toe(e)}rt();var RWe=`{"type":"keep_alive"}
|
|
178
178
|
`,TWe=1000,DWe=1000,noe=30000,PWe=600000,MWe=1e4,NWe=300000,roe=noe*2,OWe=new Set([1002,4001,4003]);class zM{ws=null;lastSentId=null;url;state="idle";onData;onCloseCallback;onConnectCallback;onDiagnostic;headers;sessionId;autoReconnect;isBridge;reconnectAttempts=0;reconnectStartTime=null;reconnectTimer=null;lastReconnectAttemptTime=null;connectErrorsSeen=new Set;lastActivityTime=0;pingInterval=null;pongReceived=!0;keepAliveInterval=null;messageBuffer;connectStartTime=0;refreshHeaders;constructor(e,t={},r,n,s){this.url=e,this.headers=t,this.sessionId=r,this.refreshHeaders=n,this.autoReconnect=s?.autoReconnect??!0,this.isBridge=s?.isBridge??!1,this.messageBuffer=new gD(TWe)}async connect(){if(this.state!=="idle"&&this.state!=="reconnecting"){b(`WebSocketTransport: Cannot connect, current state is ${this.state}`,{level:"error"}),H("error","cli_websocket_connect_failed");return}this.state="reconnecting",this.connectStartTime=Date.now(),b(`WebSocketTransport: Opening ${this.url.href}`),H("info","cli_websocket_connect_opening");let e={...this.headers};if(this.lastSentId)e["X-Last-Request-Id"]=this.lastSentId,b(`WebSocketTransport: Adding X-Last-Request-Id header: ${this.lastSentId}`);let t=new globalThis.WebSocket(this.url.href,{headers:e,proxy:Xse(this.url.href),tls:UZ()||void 0});this.ws=t,t.addEventListener("open",this.onBunOpen),t.addEventListener("message",this.onBunMessage),t.addEventListener("error",this.onBunError),t.addEventListener("close",this.onBunClose),t.addEventListener("pong",this.onPong)}onBunOpen=()=>{if(this.handleOpenEvent(),this.lastSentId)this.replayBufferedMessages("")};onBunMessage=(e)=>{let t=typeof e.data==="string"?e.data:String(e.data);if(this.lastActivityTime=Date.now(),H("info","cli_websocket_message_received",{length:t.length}),this.onData)this.onData(t)};onBunError=()=>{b("WebSocketTransport: Error",{level:"error"}),H("error","cli_websocket_connect_error")};onBunClose=(e)=>{let t=e.code===1000||e.code===1001;b(`WebSocketTransport: Closed: ${e.code}`,t?void 0:{level:"error"}),H("error","cli_websocket_connect_closed"),this.handleConnectionError(e.code)};onPong=()=>{this.pongReceived=!0};handleOpenEvent(){let e=Date.now()-this.connectStartTime;if(b("WebSocketTransport: Connected"),H("info","cli_websocket_connect_connected",{duration_ms:e}),this.isBridge&&this.reconnectStartTime!==null)Ye("tengu_ws_transport_reconnected",{attempts:this.reconnectAttempts,downtimeMs:Date.now()-this.reconnectStartTime});if(this.reconnectAttempts>0){let t=this.reconnectStartTime?Math.round((Date.now()-this.reconnectStartTime)/1000):0;this.onDiagnostic?.(`WS reconnected after ${this.reconnectAttempts} attempt(s), ${t}s downtime`+(this.connectErrorsSeen.size>0?`, errors=[${[...this.connectErrorsSeen].join(",")}]`:""))}else this.onDiagnostic?.(`WS connected in ${e}ms`);this.connectErrorsSeen.clear(),this.reconnectAttempts=0,this.reconnectStartTime=null,this.lastReconnectAttemptTime=null,this.lastActivityTime=Date.now(),this.state="connected",this.onConnectCallback?.(),this.startPingInterval(),this.startKeepaliveInterval(),xv(()=>{this.write({type:"keep_alive"})})}sendLine(e){if(!this.ws||this.state!=="connected")return b("WebSocketTransport: Not connected"),H("info","cli_websocket_send_not_connected"),!1;try{return this.ws.send(e),this.lastActivityTime=Date.now(),!0}catch(t){return b(`WebSocketTransport: Failed to send: ${t}`,{level:"error"}),H("error","cli_websocket_send_error"),this.handleConnectionError(),!1}}removeWsListeners(e){let t=e;t.removeEventListener("open",this.onBunOpen),t.removeEventListener("message",this.onBunMessage),t.removeEventListener("error",this.onBunError),t.removeEventListener("close",this.onBunClose),t.removeEventListener("pong",this.onPong)}doDisconnect(){if(this.stopPingInterval(),this.stopKeepaliveInterval(),Nm(),this.ws)this.removeWsListeners(this.ws),this.ws.close(),this.ws=null}handleConnectionError(e){if(b(`WebSocketTransport: Disconnected from ${this.url.href}`+(e!=null?` (code ${e})`:"")),H("info","cli_websocket_disconnected"),e!=null)this.connectErrorsSeen.add(`ws_${e}`);if(this.isBridge)Ye("tengu_ws_transport_closed",{closeCode:e,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 t=!1;if(e===4003&&this.refreshHeaders){let s=this.refreshHeaders();if(s.Authorization!==this.headers.Authorization)Object.assign(this.headers,s),t=!0,b("WebSocketTransport: 4003 received but headers refreshed, scheduling reconnect"),H("info","cli_websocket_4003_token_refreshed")}if(e!=null&&OWe.has(e)&&!t){b(`WebSocketTransport: Permanent close code ${e}, not reconnecting`,{level:"error"}),H("error","cli_websocket_permanent_close",{closeCode:e}),this.onDiagnostic?.(`WS permanent close (code ${e}), not reconnecting`),this.state="closed",this.onCloseCallback?.(e);return}if(!this.autoReconnect){this.state="closed",this.onCloseCallback?.(e);return}let r=Date.now();if(!this.reconnectStartTime)this.reconnectStartTime=r;if(this.lastReconnectAttemptTime!==null&&r-this.lastReconnectAttemptTime>roe)b(`WebSocketTransport: Detected system sleep (${Math.round((r-this.lastReconnectAttemptTime)/1000)}s gap), resetting reconnection budget`),H("info","cli_websocket_sleep_detected",{gapMs:r-this.lastReconnectAttemptTime}),this.reconnectStartTime=r,this.reconnectAttempts=0;this.lastReconnectAttemptTime=r;let n=r-this.reconnectStartTime;if(n<PWe){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;if(!t&&this.refreshHeaders){let i=this.refreshHeaders();Object.assign(this.headers,i),b("WebSocketTransport: Refreshed headers for reconnect")}this.state="reconnecting",this.reconnectAttempts++;let s=Math.min(DWe*Math.pow(2,this.reconnectAttempts-1),noe),o=Math.max(0,s+s*0.25*(2*Math.random()-1));if(b(`WebSocketTransport: Reconnecting in ${Math.round(o)}ms (attempt ${this.reconnectAttempts}, ${Math.round(n/1000)}s elapsed)`),H("error","cli_websocket_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.onDiagnostic?.(`WS reconnect (${e!=null?`code ${e}`:"no code"}) attempt=${this.reconnectAttempts} ${Math.round(n/1000)}s elapsed, retry in ${Math.round(o)}ms`+(this.connectErrorsSeen.size>1?`, errors=[${[...this.connectErrorsSeen].join(",")}]`:"")),this.isBridge)Ye("tengu_ws_transport_reconnecting",{attempt:this.reconnectAttempts,elapsedMs:n,delayMs:Math.round(o)});this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},o)}else if(b(`WebSocketTransport: Reconnection time budget exhausted after ${Math.round(n/1000)}s for ${this.url.href}`,{level:"error"}),H("error","cli_websocket_reconnect_exhausted",{reconnectAttempts:this.reconnectAttempts,elapsedMs:n}),this.onDiagnostic?.(`WS reconnection budget exhausted: ${this.reconnectAttempts} attempts over ${Math.round(n/1000)}s, errors=[${[...this.connectErrorsSeen].join(",")||"none"}], last code=${e??"none"}`),this.state="closed",this.onCloseCallback)this.onCloseCallback(e)}close(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;this.stopPingInterval(),this.stopKeepaliveInterval(),Nm(),this.state="closing",this.doDisconnect()}[Symbol.dispose](){this.close()}replayBufferedMessages(e){let t=this.messageBuffer.toArray();if(t.length===0)return;let r=0;if(e){let s=t.findIndex((o)=>("uuid"in o)&&o.uuid===e);if(s>=0){r=s+1;let o=t.slice(r);if(this.messageBuffer.clear(),this.messageBuffer.addAll(o),o.length===0)this.lastSentId=null;b(`WebSocketTransport: Evicted ${r} confirmed messages, ${o.length} remaining`),H("info","cli_websocket_evicted_confirmed_messages",{evicted:r,remaining:o.length})}}let n=t.slice(r);if(n.length===0){b("WebSocketTransport: No new messages to replay"),H("info","cli_websocket_no_messages_to_replay");return}b(`WebSocketTransport: Replaying ${n.length} buffered messages`),H("info","cli_websocket_messages_to_replay",{count:n.length});for(let s of n){let o=Ee(s)+`
|
|
179
179
|
`;if(!this.sendLine(o)){this.handleConnectionError();break}}}isConnectedStatus(){return this.state==="connected"}isClosedStatus(){return this.state==="closed"}setOnData(e){this.onData=e}setOnConnect(e){this.onConnectCallback=e}setOnClose(e){this.onCloseCallback=e}setOnDiagnostic(e){this.onDiagnostic=e}getStateLabel(){return this.state}async write(e){if("uuid"in e&&typeof e.uuid==="string")this.messageBuffer.add(e),this.lastSentId=e.uuid;let t=Ee(e)+`
|
|
180
|
-
`;if(this.state!=="connected")return;let r=this.sessionId?` session=${this.sessionId}`:"",n=this.getControlMessageDetailLabel(e);b(`WebSocketTransport: Sending message type=${e.type}${r}${n}`),this.sendLine(t)}getControlMessageDetailLabel(e){if(e.type==="control_request"){let{request_id:t,request:r}=e,n=r.subtype==="can_use_tool"?r.tool_name:"";return` subtype=${r.subtype} request_id=${t}${n?` tool=${n}`:""}`}if(e.type==="control_response"){let{subtype:t,request_id:r}=e.response;return` subtype=${t} request_id=${r}`}return""}startPingInterval(){this.stopPingInterval(),this.pongReceived=!0;let e=Date.now();this.pingInterval=setInterval(()=>{if(this.state==="connected"&&this.ws){let t=Date.now(),r=t-e;if(e=t,r>roe){b(`WebSocketTransport: ${Math.round(r/1000)}s tick gap detected — process was suspended, forcing reconnect`),H("info","cli_websocket_sleep_detected_on_ping",{gapMs:r}),this.handleConnectionError();return}if(!this.pongReceived){b("WebSocketTransport: No pong received, connection appears dead",{level:"error"}),H("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(n){b(`WebSocketTransport: Ping failed: ${n}`,{level:"error"}),H("error","cli_websocket_ping_failed")}}},MWe)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),Ge(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(RWe),this.lastActivityTime=Date.now(),b("WebSocketTransport: Sent periodic keep_alive data frame")}catch(e){b(`WebSocketTransport: Periodic keep_alive failed: ${e}`,{level:"error"}),H("error","cli_websocket_keepalive_failed")}},NWe)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var UWe=100,FWe=15000,LWe=3000;class HM extends zM{postUrl;uploader;streamEventBuffer=[];streamEventTimer=null;constructor(e,t={},r,n,s){super(e,t,r,n,s);let{maxConsecutiveFailures:o,onBatchDropped:i}=s??{};this.postUrl=$We(e),this.uploader=new qc({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:o,onBatchDropped:(a,c)=>{H("error","cli_hybrid_batch_dropped_max_failures",{batchSize:a,failures:c}),i?.(a,c)},send:(a)=>this.postOnce(a)}),b(`HybridTransport: POST URL = ${this.postUrl}`),H("info","cli_hybrid_transport_initialized")}async write(e){if(e.type==="stream_event"){if(this.streamEventBuffer.push(e),!this.streamEventTimer)this.streamEventTimer=setTimeout(()=>this.flushStreamEvents(),UWe);return}return await this.uploader.enqueue([...this.takeStreamEvents(),e]),this.uploader.flush()}async writeBatch(e){return await this.uploader.enqueue([...this.takeStreamEvents(),...e]),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 e=this.streamEventBuffer;return this.streamEventBuffer=[],e}flushStreamEvents(){this.streamEventTimer=null,this.uploader.enqueue(this.takeStreamEvents())}close(){if(this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[];let e=this.uploader,t;Promise.race([e.flush(),new Promise((r)=>{t=setTimeout(r,LWe)})]).finally(()=>{clearTimeout(t),e.close()}),super.close()}async postOnce(e){let t=Tg();if(!t){b("HybridTransport: No session token available for POST"),H("warn","cli_hybrid_post_no_token");return}let r={Authorization:`Bearer ${t}`,"Content-Type":"application/json"},n;try{n=await Ar.post(this.postUrl,{events:e},{headers:r,validateStatus:()=>!0,timeout:FWe})}catch(s){throw b(`HybridTransport: POST error: ${ae(s)}`),H("warn","cli_hybrid_post_network_error"),s}if(n.status>=200&&n.status<300){b(`HybridTransport: POST success count=${e.length}`);return}if(n.status>=400&&n.status<500&&n.status!==429){b(`HybridTransport: POST returned ${n.status} (permanent), dropping`),H("warn","cli_hybrid_post_client_error",{status:n.status});return}throw b(`HybridTransport: POST returned ${n.status} (retryable)`),H("warn","cli_hybrid_post_retryable_error",{status:n.status}),Error(`POST failed with ${n.status}`)}}function $We(e){let t=e.protocol==="wss:"?"https:":"http:",r=e.pathname;if(r=r.replace("/ws/","/session/"),!r.endsWith("/events"))r=r.endsWith("/")?r+"events":r+"/events";return`${t}//${e.host}${r}${e.search}`}Ji();nr();function soe(){let{namespace:e,cluster:t}=OO();return{...e&&{cooNamespace:e},...t&&{cooCluster:t}}}$l();import{chmod as CBt,mkdir as SBt,readdir as wBt,readFile as qWe,unlink as xBt,writeFile as GWe}from"fs/promises";import{join as ioe}from"path";bn();Ji();$l();et();nr();xt();lE();rt();import{AsyncLocalStorage as jWe}from"async_hooks";var cBt=new jWe;nr();var zBt=M(()=>bo.object({pid:bo.number(),sessionId:bo.string(),cwd:bo.string().optional(),startedAt:bo.number(),version:bo.string().optional(),kind:bo.enum(["interactive","bg","daemon","daemon-worker"])}));function VWe(){return ioe(ds(),"sessions")}var ooe=Promise.resolve();async function WWe(e){let t=ioe(VWe(),`${process.pid}.json`),r=ooe.then(async()=>{try{let n=Gt(await qWe(t,"utf8"));await GWe(t,Ee({...n,...e}))}catch(n){b(`[concurrentSessions] updatePidFile failed: ${ae(n)}`)}});ooe=r,await r}async function aoe(e){await WWe({bridgeSessionId:e})}et();Ys();nr();xt();function Yt(e,t){return Object.freeze({name:e,header:t})}var JWe=Yt("claude_code","claude-code-20250219"),YWe=Yt("oauth_auth",K1),KWe=Yt("interleaved_thinking","interleaved-thinking-2025-05-14"),ZWe=Yt("long_context","context-1m-2025-08-07"),XWe=Yt("context_management","context-management-2025-06-27"),eJe=Yt("structured_outputs","structured-outputs-2025-12-15"),tJe=Yt("web_search","web-search-2025-03-05"),rJe=Yt("tool_search","advanced-tool-use-2025-11-20"),nJe=Yt("tool_search","tool-search-tool-2025-10-19"),sJe=Yt("effort","effort-2025-11-24"),oJe=Yt("task_budgets","task-budgets-2026-03-13"),iJe=Yt("prompt_caching_scope","prompt-caching-scope-2026-01-05"),aJe=Yt("extended_cache_ttl","extended-cache-ttl-2025-04-11"),cJe=Yt("speed","fast-mode-2026-02-01"),lJe=Yt("redact_thinking","redact-thinking-2026-02-12"),uJe=null,dJe=Yt("narration_summaries","summarize-connector-text-2026-03-13"),pJe=Yt("afk_mode","afk-mode-2026-01-31"),fJe=Yt("advisor_tool","advisor-tool-2026-03-01"),AJe=Yt("cache_diagnosis","cache-diagnosis-2026-04-07"),gJe=Yt("context_hint","context-hint-2026-04-09"),mJe=Yt("mcp_servers","mcp-servers-2025-12-04"),hJe=Yt("files_api","files-api-2025-04-14"),qM=Yt("environments","environments-2025-11-01"),yJe=Yt("ccr_byoc","ccr-byoc-2025-07-29"),bJe=Yt("mid_conversation_system","mid-conversation-system-2026-04-07"),EJe=Object.freeze([JWe,YWe,KWe,ZWe,XWe,eJe,tJe,rJe,nJe,sJe,oJe,iJe,aJe,cJe,lJe,uJe,dJe,pJe,fJe,AJe,gJe,mJe,hJe,qM,yJe,bJe].filter((e)=>e!==null)),VBt=new Map(EJe.map((e)=>[e.header,e]));go();ZM();function Lo(){return"claude-code/0.3.166"}function Ua(){switch(process.env.CLAUDE_CODE_ENTRYPOINT){case"claude-vscode":return"claude_code_vscode";case"remote":case"remote_baku":case"remote_cowork":case"remote_desktop":case"remote_mobile":return"claude_code_remote";case"sdk-cli":case"sdk-ts":case"sdk-py":return"claude_code_sdk";case"mcp":return"claude_code_mcp";case"claude-code-github-action":return"claude_code_github_action";case"local-agent":return"claude_code_local_agent";case"claude_in_slack":return"claude_in_slack";case"cli":default:return"claude_code_cli"}}import{randomUUID as HJe}from"crypto";function Moe(e,t,r,n){if(!n)return{url:`${e}/v1/sessions/${t}/events`,body:{events:r}};let s=Um(t);return{url:`${e}/v1/code/sessions/${encodeURIComponent(s)}/events`,body:{events:r.map((o)=>({payload:typeof o.uuid==="string"&&o.uuid?o:{...o,uuid:HJe()}}))}}}Ji();et();xt();rt();var Noe=2000,qJe=["session_ingress_token","environment_secret","access_token","secret","token"],GJe=new RegExp(`"(${qJe.join("|")})"\\s*:\\s*"([^"]*)"`,"g"),VJe=16;function WJe(e){return e.replace(GJe,(t,r,n)=>{if(n.length<VJe)return`"${r}":"[REDACTED]"`;let s=`${n.slice(0,8)}...${n.slice(-4)}`;return`"${r}":"${s}"`})}function ap(e){let t=typeof e==="string"?e:Ee(e),r=WJe(t);if(r.length<=Noe)return r;return r.slice(0,Noe)+`... (${r.length} chars)`}function Ooe(e){let t=ae(e);if(e&&typeof e==="object"&&"response"in e){let r=e.response;if(r?.data&&typeof r.data==="object"){let n=r.data,s=typeof n.message==="string"?n.message:typeof n.error==="object"&&n.error&&("message"in n.error)&&typeof n.error.message==="string"?n.error.message:void 0;if(s)return`${t}: ${s}`}}return t}function Uoe(e){if(e&&typeof e==="object"&&"response"in e&&e.response&&typeof e.response.status==="number")return e.response.status;return}function tN(e,t=Date.now()){if(!e)return;let r=Number(e);if(Number.isFinite(r)&&r>=0)return r*1000;let n=Date.parse(e);if(Number.isFinite(n)){let s=n-t;return s>0?s:void 0}return}function Foe(e){if(!e||typeof e!=="object")return;if("retryAfterMs"in e&&typeof e.retryAfterMs==="number")return e.retryAfterMs;if("response"in e){let r=e.response?.headers?.["retry-after"];if(typeof r==="string")return tN(r)}return}function gl(e){if(!e||typeof e!=="object")return;if("message"in e&&typeof e.message==="string")return e.message;if("error"in e&&e.error!==null&&typeof e.error==="object"&&"message"in e.error&&typeof e.error.message==="string")return e.error.message;return}function Loe(e,t,r){if(t)b(t);Ye("tengu_bridge_repl_skipped",{reason:e,...r!==void 0&&{v2:r}})}var Tv="Remote Control is only available with claude.ai subscriptions. Please use `/login` to sign in with your claude.ai account.";var JJe=/^[a-zA-Z0-9_-]+$/;function On(e,t){if(!e||!JJe.test(e))throw Error(`Invalid ${t}: contains unsafe characters`);return e}class cs extends Error{status;errorType;constructor(e,t,r){super(e);this.name="BridgeFatalError",this.status=t,this.errorType=r}}function joe(e){function t(a){e.onDebug?.(a)}let r=0,n=100;async function s(a){let c={Authorization:`Bearer ${a}`,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-beta":qM.header,"x-environment-runner-version":e.runnerVersion,"User-Agent":Lo()},l=await e.getTrustedDeviceToken?.();if(l)c["X-Trusted-Device-Token"]=l;return c}function o(){let a=e.getAccessToken();if(!a)throw Error(Tv);return a}async function i(a,c){let l=o(),u=await a(l);if(u.status!==401)return u;if(!e.onAuth401)return t(`[bridge:api] ${c}: 401 received, no refresh handler`),u;if(t(`[bridge:api] ${c}: 401 received, attempting token refresh`),await e.onAuth401(l)){t(`[bridge:api] ${c}: Token refreshed, retrying request`);let f=o(),A=await a(f);if(A.status!==401)return A;t(`[bridge:api] ${c}: Retry after refresh also got 401`)}else t(`[bridge:api] ${c}: Token refresh failed`);return u}return{async registerBridgeEnvironment(a){return En("bridge_environment_register",async()=>{t(`[bridge:api] POST /v1/environments/bridge bridgeId=${a.bridgeId}`);let c=await i(async(l)=>Ar.post(`${e.baseUrl}/v1/environments/bridge`,{machine_name:a.machineName,directory:a.dir,branch:a.branch,git_repo_url:a.gitRepoUrl,max_sessions:a.maxSessions,metadata:{worker_type:a.workerType},...a.reuseEnvironmentId&&{environment_id:a.reuseEnvironmentId}},{headers:await s(l),timeout:15000,validateStatus:(u)=>u<500}),"Registration");return Qi(c.status,c.data,"Registration"),t(`[bridge:api] POST /v1/environments/bridge -> ${c.status} environment_id=${c.data.environment_id}`),t(`[bridge:api] >>> ${ap({machine_name:a.machineName,directory:a.dir,branch:a.branch,git_repo_url:Doe(a.gitRepoUrl),max_sessions:a.maxSessions,metadata:{worker_type:a.workerType}})}`),t(`[bridge:api] <<< ${ap(c.data)}`),c.data},$oe)},async pollForWork(a,c,l,u){On(a,"environmentId");let p=r;r=0;let f=await Ar.get(`${e.baseUrl}/v1/environments/${a}/work/poll`,{headers:await s(c),params:u!==void 0?{reclaim_older_than_ms:u}:void 0,timeout:1e4,signal:l,validateStatus:(A)=>A<500});if(Qi(f.status,f.data,"Poll",f.headers),!f.data){if(r=p+1,r===1||r%n===0)t(`[bridge:api] GET .../work/poll -> ${f.status} (no work, ${r} consecutive empty polls)`);return null}return t(`[bridge:api] GET .../work/poll -> ${f.status} workId=${f.data.id} type=${f.data.data?.type}${f.data.data?.id?` sessionId=${f.data.data.id}`:""}`),t(`[bridge:api] <<< ${ap(f.data)}`),f.data},async acknowledgeWork(a,c,l){On(a,"environmentId"),On(c,"workId"),t(`[bridge:api] POST .../work/${c}/ack`);let u=await Ar.post(`${e.baseUrl}/v1/environments/${a}/work/${c}/ack`,{},{headers:await s(l),timeout:1e4,validateStatus:(p)=>p<500});Qi(u.status,u.data,"Acknowledge"),t(`[bridge:api] POST .../work/${c}/ack -> ${u.status}`)},async stopWork(a,c,l){On(a,"environmentId"),On(c,"workId"),t(`[bridge:api] POST .../work/${c}/stop force=${l}`);let u=await i(async(p)=>Ar.post(`${e.baseUrl}/v1/environments/${a}/work/${c}/stop`,{force:l},{headers:await s(p),timeout:1e4,validateStatus:(f)=>f<500}),"StopWork");Qi(u.status,u.data,"StopWork"),t(`[bridge:api] POST .../work/${c}/stop -> ${u.status}`)},async deregisterEnvironment(a){On(a,"environmentId"),t(`[bridge:api] DELETE /v1/environments/bridge/${a}`);let c=await i(async(l)=>Ar.delete(`${e.baseUrl}/v1/environments/bridge/${a}`,{headers:await s(l),timeout:1e4,validateStatus:(u)=>u<500}),"Deregister");Qi(c.status,c.data,"Deregister"),t(`[bridge:api] DELETE /v1/environments/bridge/${a} -> ${c.status}`)},async archiveSession(a){On(a,"sessionId"),t(`[bridge:api] POST /v1/sessions/${a}/archive`);let c=await i(async(l)=>Ar.post(`${e.baseUrl}/v1/sessions/${a}/archive`,{},{headers:await s(l),timeout:1e4,validateStatus:(u)=>u<500}),"ArchiveSession");if(c.status===409){t(`[bridge:api] POST /v1/sessions/${a}/archive -> 409 (already archived)`);return}Qi(c.status,c.data,"ArchiveSession"),t(`[bridge:api] POST /v1/sessions/${a}/archive -> ${c.status}`)},async reconnectSession(a,c){return En("bridge_session_reconnect",async()=>{On(a,"environmentId"),On(c,"sessionId"),t(`[bridge:api] POST /v1/environments/${a}/bridge/reconnect session_id=${c}`);let l=await i(async(u)=>Ar.post(`${e.baseUrl}/v1/environments/${a}/bridge/reconnect`,{session_id:c},{headers:await s(u),timeout:1e4,validateStatus:(p)=>p<500}),"ReconnectSession");Qi(l.status,l.data,"ReconnectSession"),t(`[bridge:api] POST .../bridge/reconnect -> ${l.status}`)},$oe)},async heartbeatWork(a,c,l){On(a,"environmentId"),On(c,"workId"),t(`[bridge:api] POST .../work/${c}/heartbeat`);let u=await Ar.post(`${e.baseUrl}/v1/environments/${a}/work/${c}/heartbeat`,{},{headers:await s(l),timeout:1e4,validateStatus:(p)=>p<500});return Qi(u.status,u.data,"Heartbeat"),t(`[bridge:api] POST .../work/${c}/heartbeat -> ${u.status} lease_extended=${u.data.lease_extended} state=${u.data.state}`),u.data},async sendPermissionResponseEvent(a,c,l){On(a,"sessionId");let{url:u,body:p}=Moe(e.baseUrl,a,[c],e.useCcrV2Routing?.()??!1);t(`[bridge:api] POST ${u} type=${c.type}`);let f=await Ar.post(u,p,{headers:await s(l),timeout:1e4,validateStatus:(A)=>A<500});Qi(f.status,f.data,"SendPermissionResponseEvent"),t(`[bridge:api] POST ${u} -> ${f.status}`),t(`[bridge:api] >>> ${ap(p)}`),t(`[bridge:api] <<< ${ap(f.data)}`)}}}function Qi(e,t,r,n){if(e===200||e===204)return;let s=gl(t),o=YJe(t);switch(e){case 401:throw new cs(`${r}: Authentication failed (401)${s?`: ${s}`:""}. ${Tv}`,401,o);case 403:throw new cs(Dv(o)?"Remote Control session expired.":`${r}: Access denied (403)${s?`: ${s}`:""}. Check your organization permissions.`,403,o);case 404:throw new cs(s??`${r}: Not found (404). Remote Control may not be available for this organization.`,404,o);case 410:throw new cs(s??"Remote Control session expired.",410,o??"environment_expired");case 429:{let i=tN(typeof n?.["retry-after"]==="string"?n["retry-after"]:void 0);throw Object.assign(Error(`${r}: Rate limited (429). Polling too frequently.`),i!==void 0?{status:e,retryAfterMs:i}:{status:e})}default:throw Object.assign(Error(`${r}: Failed with status ${e}${s?`: ${s}`:""}`),{status:e})}}function Dv(e){if(!e)return!1;return e.includes("expired")||e.includes("lifetime")}function zoe(e){if(e.status!==403)return!1;return e.message.includes("external_poll_sessions")||e.message.includes("environments:manage")}function $oe(e){if(e instanceof cs)return e.status===401?"auth_failed":"http_error";if(e instanceof Error){if(e.message===Tv)return"no_token";if("status"in e&&typeof e.status==="number")return"http_error"}return"request_failed"}function YJe(e){if(e&&typeof e==="object"){if("error"in e&&e.error&&typeof e.error==="object"&&"type"in e.error&&typeof e.error.type==="string")return e.error.type}return}et();import{randomUUID as KJe}from"crypto";go();Ji();var Hoe={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 qoe(e){if(e===null||typeof e!=="object")return e;let t=e;if("requestId"in t&&!("request_id"in t))t.request_id=t.requestId,delete t.requestId;if("response"in t&&t.response!==null&&typeof t.response==="object"){let r=t.response;if("requestId"in r&&!("request_id"in r))r.request_id=r.requestId,delete r.requestId}return e}et();rR();xt();rt();function ZJe(e){return e!==null&&typeof e==="object"&&"type"in e&&typeof e.type==="string"}function XJe(e){return e!==null&&typeof e==="object"&&"type"in e&&e.type==="control_response"&&"response"in e}function eYe(e){return e!==null&&typeof e==="object"&&"type"in e&&e.type==="control_request"&&"request_id"in e&&"request"in e}function rN(e){if((e.type==="user"||e.type==="assistant")&&e.isVirtual)return!1;return e.type==="user"||e.type==="assistant"||e.type==="system"&&e.subtype==="local_command"}function Goe(e){if(e.type!=="user"||e.isMeta||e.toolUseResult||e.isCompactSummary)return;if(e.origin&&e.origin.kind!=="human")return;let t=e.message.content,r;if(typeof t==="string")r=t;else for(let s of t)if(s.type==="text"){r=s.text;break}if(!r)return;return tR(r)||void 0}function Voe(e,t,r,n,s,o){try{let i=qoe(Gt(e));if(XJe(i)){b("[bridge:repl] Ingress message type=control_response"),s?.(i);return}if(eYe(i)){b(`[bridge:repl] Inbound control_request subtype=${i.request.subtype}`),o?.(i);return}if(!ZJe(i))return;let a="uuid"in i&&typeof i.uuid==="string"?i.uuid:void 0;if(a&&t.has(a)){b(`[bridge:repl] Ignoring echo: type=${i.type} uuid=${a}`);return}if(a&&r.has(a)){b(`[bridge:repl] Ignoring re-delivered inbound: type=${i.type} uuid=${a}`);return}if(b(`[bridge:repl] Ingress message type=${i.type}${a?` uuid=${a}`:""}`),i.type==="user"){if(a)r.add(a);Ye("tengu_bridge_message_received",{is_repl:!0}),ln("bridge_message_receive"),n?.(i)}else b(`[bridge:repl] Ignoring non-user inbound message: type=${i.type}`)}catch(i){b(`[bridge:repl] Failed to parse ingress message: ${ae(i)}`),Zr("bridge_message_receive","bridge_message_receive_parse_failed")}}var tYe="This session is outbound-only. Enable Remote Control locally to allow inbound control.";function Woe(e,t){let{transport:r,sessionId:n,outboundOnly:s,onInterrupt:o,onSetModel:i,onSetMaxThinkingTokens:a,onSetPermissionMode:c,onRenameSession:l,onSetColor:u,onFileSuggestions:p,onReadFile:f,onGetContextUsage:A,onMcpAuthenticate:g,onMcpOauthCallbackUrl:h,onMcpReconnect:m,onMcpStatus:y}=t;if(!r){b("[bridge:repl] Cannot respond to control_request: transport not configured");return}let w;if(s&&e.request.subtype!=="initialize"){w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:tYe}};let v={...w,session_id:n};r.write(v),b(`[bridge:repl] Rejected ${e.request.subtype} (outbound-only) request_id=${e.request_id}`);return}switch(e.request.subtype){case"initialize":w={type:"control_response",response:{subtype:"success",request_id:e.request_id,response:{commands:[],output_style:"normal",available_output_styles:["normal"],models:[],account:{},pid:process.pid}}};break;case"set_model":i?.(e.request.model),w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};break;case"set_max_thinking_tokens":a?.(e.request.max_thinking_tokens),w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};break;case"set_permission_mode":{let v=c?.(e.request.mode)??{ok:!1,error:"set_permission_mode is not supported in this context (onSetPermissionMode callback not registered)"};if(v.ok)w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};else w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:v.error}};break}case"rename_session":{let v=l?.(e.request.title)??{ok:!1,error:"rename_session is not supported in this context (onRenameSession callback not registered)"};if(v.ok)w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};else w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:v.error}};break}case"set_color":{let v=u?.(e.request.color)??{ok:!1,error:"set_color is not supported in this context (onSetColor callback not registered)"};if(v.ok)w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};else w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:v.error}};break}case"file_suggestions":{if(!p){w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:"file_suggestions is not supported in this context (onFileSuggestions callback not registered)"}};break}p(e.request.query).then((v)=>({type:"control_response",response:{subtype:"success",request_id:e.request_id,response:{suggestions:v}}})).catch((v)=>({type:"control_response",response:{subtype:"error",request_id:e.request_id,error:ae(v)}})).then((v)=>{let B={...v,session_id:n};r.write(B),b(`[bridge:repl] Sent control_response for file_suggestions request_id=${e.request_id} result=${v.response.subtype}`)});return}case"read_file":{if(!f){w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:"read_file is not supported in this context (onReadFile callback not registered)"}};break}f(e.request.path,e.request.max_bytes,e.request.encoding).then((v)=>({type:"control_response",response:{subtype:"success",request_id:e.request_id,response:v}})).catch((v)=>({type:"control_response",response:{subtype:"error",request_id:e.request_id,error:ae(v)}})).then((v)=>{let B={...v,session_id:n};r.write(B),b(`[bridge:repl] Sent control_response for read_file request_id=${e.request_id} result=${v.response.subtype}`)});return}case"get_context_usage":{if(!A){w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:"get_context_usage is not supported in this context (onGetContextUsage callback not registered)"}};break}A().then((v)=>({type:"control_response",response:{subtype:"success",request_id:e.request_id,response:{...v}}})).catch((v)=>({type:"control_response",response:{subtype:"error",request_id:e.request_id,error:ae(v)}})).then((v)=>{let B={...v,session_id:n};r.write(B),b(`[bridge:repl] Sent control_response for get_context_usage request_id=${e.request_id} result=${v.response.subtype}`)});return}case"mcp_status":w={type:"control_response",response:{subtype:"success",request_id:e.request_id,response:{mcpServers:y?.()??[]}}};break;case"mcp_authenticate":case"mcp_oauth_callback_url":case"mcp_reconnect":{let v=e.request,{subtype:B,serverName:P}=v,R=v.subtype==="mcp_authenticate"?g&&((V)=>g(V,v.redirectUri)):v.subtype==="mcp_oauth_callback_url"?h&&((V)=>h(V,v.callbackUrl)):m;if(!R){w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:`${B} is not supported in this context (callback not registered)`}};break}R(P).then((V)=>({type:"control_response",response:{subtype:"success",request_id:e.request_id,response:V??{}}})).catch((V)=>({type:"control_response",response:{subtype:"error",request_id:e.request_id,error:ae(V)}})).then((V)=>{let Y={...V,session_id:n};r.write(Y),b(`[bridge:repl] Sent control_response for ${B} request_id=${e.request_id} result=${V.response.subtype}`)});return}case"interrupt":o?.(),w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};break;default:w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:`REPL bridge does not handle control_request subtype: ${e.request.subtype}`}}}let C={...w,session_id:n};r.write(C),b(`[bridge:repl] Sent control_response for ${e.request.subtype} request_id=${e.request_id} result=${w.response.subtype}`)}function nN(e){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:{...Hoe},modelUsage:{},permission_denials:[],session_id:e,uuid:KJe()}}class Pv{capacity;ring;set=new Set;writeIdx=0;constructor(e){this.capacity=e,this.ring=Array(e)}add(e){if(this.set.has(e))return;let t=this.ring[this.writeIdx];if(t!==void 0)this.set.delete(t);this.ring[this.writeIdx]=e,this.set.add(e),this.writeIdx=(this.writeIdx+1)%this.capacity}has(e){return this.set.has(e)}clear(){this.set.clear(),this.ring.fill(void 0),this.writeIdx=0}}function Joe(e){let t=new AbortController;function r(){t.abort(),t=new AbortController}function n(){let s=new AbortController,o=()=>s.abort();if(e.aborted||t.signal.aborted)return s.abort(),{signal:s.signal,cleanup:()=>{}};e.addEventListener("abort",o,{once:!0});let i=t.signal;return i.addEventListener("abort",o,{once:!0}),{signal:s.signal,cleanup:()=>{e.removeEventListener("abort",o),i.removeEventListener("abort",o)}}}return{signal:n,wake:r}}class sN{_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(...e){if(!this._active)return!1;return this._pending.push(...e),!0}drop(){this._active=!1;let e=this._pending.length;return this._pending.length=0,e}deactivate(){this._active=!1}}import{randomUUID as Zoe}from"crypto";Ji();et();Ys();xt();rt();function rYe(e){let r=(e.startsWith("sk-ant-si-")?e.slice(10):e).split(".");if(r.length!==3||!r[1])return null;try{return Gt(Buffer.from(r[1],"base64url").toString("utf8"))}catch{return null}}function Yoe(e){let t=rYe(e);if(t!==null&&typeof t==="object"&&"exp"in t&&typeof t.exp==="number")return t.exp;return null}go();et();Ys();xt();rt();class oN{inflight=null;pending=null;closed=!1;config;constructor(e){this.config=e}enqueue(e){if(this.closed)return;this.pending=this.pending?Koe(this.pending,e):e,this.drain()}close(){this.closed=!0,this.pending=null}async flush(){while(!this.closed)if(this.inflight)await this.inflight;else if(this.pending)await this.drain();else return}async drain(){if(this.inflight||this.closed)return;if(!this.pending)return;let e=this.pending;this.pending=null,this.inflight=this.sendWithRetry(e).then(()=>{if(this.inflight=null,this.pending&&!this.closed)this.drain()})}async sendWithRetry(e){let t=e,r=0;while(!this.closed){if(await this.config.send(t))return;if(r++,await Nr(this.retryDelay(r)),this.pending&&!this.closed)t=Koe(t,this.pending),this.pending=null}}retryDelay(e){let t=Math.min(this.config.baseDelayMs*2**(e-1),this.config.maxDelayMs),r=Math.random()*this.config.jitterMs;return t+r}}function Koe(e,t){let r={...e};for(let[n,s]of Object.entries(t))if((n==="external_metadata"||n==="internal_metadata")&&r[n]&&typeof r[n]==="object"&&typeof s==="object"&&s!==null)r[n]={...r[n],...s};else r[n]=s;return r}var nYe=20000,sYe=100,Xoe=61440;function cp(e){return e===400||e===413||e===422}function eie(e){let t=Qr(e);if(t)return t;if(e&&typeof e==="object"&&"name"in e&&typeof e.name==="string")return e.name;return}class Mv extends Error{reason;httpStatus;constructor(e,t){super(`CCRClient init failed: ${e}`);this.reason=e;this.httpStatus=t}}var oYe=10,iYe=3;class iN{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;consecutiveNotFound=0;currentState=null;sessionBaseUrl;sessionId;streamEventBuffer=[];streamEventTimer=null;streamedEphemeralSinceLastAssistant=!1;workerState;eventUploader;internalEventUploader;deliveryUploader;pendingProcessingAcks=[];onEpochMismatch;getAuthHeaders;onDiagnostic;constructor(e,t,r){if(this.onEpochMismatch=r?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=r?.heartbeatIntervalMs??nYe,this.heartbeatJitterFraction=r?.heartbeatJitterFraction??0,this.getAuthHeaders=r?.getAuthHeaders??HE,this.onDiagnostic=r?.onDiagnostic,t.protocol!=="http:"&&t.protocol!=="https:")throw Error(`CCRClient: Expected http(s) URL, got ${t.protocol}`);let n=t.pathname.replace(/\/$/,"");this.sessionBaseUrl=`${t.protocol}//${t.host}${n}`,this.sessionId=n.split("/").pop()||"",this.workerState=new oN({send:async(s)=>{let o=await this.request("put","/worker",{worker_epoch:this.workerEpoch,...s},"PUT worker");if(o.ok)return!0;if(cp(o.status))return H("warn","cli_worker_state_4xx_dropped",{status:o.status}),!0;return!1},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.eventUploader=new qc({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:1e5,send:async(s)=>{let o=await this.request("post","/worker/events",{worker_epoch:this.workerEpoch,events:s},"client events");if(o.ok)return;if(cp(o.status)){let i=s.filter((c)=>!c.ephemeral),a=s.length-i.length;if(a>0){if(b(`CCRClient: client event POST rejected (${o.status}) — dropping ${a} ephemeral event(s), retrying ${i.length} durable event(s)`,{level:"warn"}),Us("ccr_partial_messages","ephemeral_dropped_on_4xx"),s.splice(0,s.length,...i),i.length===0)return;let c=await this.request("post","/worker/events",{worker_epoch:this.workerEpoch,events:i},"client events (durable retry)");if(c.ok)return;if(!cp(c.status))throw new Hc("client event POST failed",c.retryAfterMs)}H("warn","cli_worker_events_4xx_dropped",{status:o.status,count:i.length});return}throw new Hc("client event POST failed",o.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new qc({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:200,send:async(s)=>{let o=await this.request("post","/worker/internal-events",{worker_epoch:this.workerEpoch,events:s},"internal events");if(o.ok)return;if(cp(o.status)){H("warn","cli_worker_internal_events_4xx_dropped",{status:o.status,count:s.length});return}throw new Hc("internal event POST failed",o.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new qc({maxBatchSize:64,maxQueueSize:64,send:async(s)=>{let o=await this.request("post","/worker/events/delivery",{worker_epoch:this.workerEpoch,updates:s.map((i)=>({event_id:i.eventId,status:i.status}))},"delivery batch");if(o.ok)return;if(cp(o.status)){H("warn","cli_worker_delivery_4xx_dropped",{status:o.status,count:s.length});return}throw new Hc("delivery POST failed",o.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),e.setOnEvent((s)=>{this.reportDelivery(s.event_id,"received")})}async initialize(e){let t=Date.now();if(Object.keys(this.getAuthHeaders()).length===0)throw new Mv("no_auth_headers");if(e===void 0){let l=process.env.CLAUDE_CODE_WORKER_EPOCH;e=l?parseInt(l,10):NaN}if(isNaN(e))throw new Mv("missing_epoch");this.workerEpoch=e;let r=this.getWorkerState(),n={ok:!1},s=new Set,o=10,i=0;for(let l=1;l<=o;l++){if(i=l,n=await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)"),n.ok||this.closed)break;if(n.reason)s.add(n.reason);if(this.onDiagnostic?.(`PUT /worker failed (${n.reason??"unknown"}) attempt=${l}/${o}, ${Math.round((Date.now()-t)/1000)}s elapsed`),cp(n.status))break;if(l<o){let u=Math.min(500*2**(l-1),30000)+Math.random()*500;await Nr(u)}}if(!n.ok){if(!this.closed)H("error","cli_worker_init_put_retries_exhausted"),this.onDiagnostic?.(`PUT /worker retries exhausted: ${i} attempts over ${Math.round((Date.now()-t)/1000)}s, errors=[${[...s].join(",")||"unknown"}]`);throw new Mv("worker_register_failed",n.status)}this.currentState="idle",this.startHeartbeat(),xv(()=>{this.writeEvent({type:"keep_alive"})}),b(`CCRClient: initialized, epoch=${this.workerEpoch}`),H("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-t});let{metadata:a,durationMs:c}=await r;if(!this.closed)H("info","cli_worker_state_restored",{duration_ms:c,had_state:a.external!==null||a.internal!==null});return a}async getWorkerState(){let e=Date.now(),t=this.getAuthHeaders();if(Object.keys(t).length===0)return{metadata:{external:null,internal:null},durationMs:0};let r=await this.getWithRetry(`${this.sessionBaseUrl}/worker`,t,"worker_state");return{metadata:{external:r?.worker?.external_metadata??null,internal:r?.worker?.internal_metadata??null},durationMs:Date.now()-e}}async request(e,t,r,n,{timeout:s=1e4}={}){let o=this.getAuthHeaders();if(Object.keys(o).length===0)return{ok:!1,reason:"no_auth_headers"};let i=`${this.sessionBaseUrl}${t}`;try{let a=await fetch(i,{method:e.toUpperCase(),headers:{...o,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-client-platform":Ua(),"User-Agent":Lo()},body:Ee(r),signal:AbortSignal.timeout(s),...$M({url:i})});if(a.body?.cancel(),a.ok)return this.consecutiveAuthFailures=0,this.consecutiveNotFound=0,{ok:!0};if(a.status===409)this.handleEpochMismatch();if(a.status===404){if(this.consecutiveNotFound++,this.consecutiveNotFound>=iYe)b(`CCRClient: ${this.consecutiveNotFound} consecutive 404s — session gone, exiting`,{level:"error"}),H("error","cli_worker_session_not_found"),this.onDiagnostic?.(`${this.consecutiveNotFound} consecutive 404s on ${t} — session gone, exiting`),this.onEpochMismatch()}if(a.status===401||a.status===403){let c=Tg(),l=c?Yoe(c):null;if(l!==null&&l*1000<Date.now())b(`CCRClient: session_token expired (exp=${new Date(l*1000).toISOString()}) — no refresh was delivered, exiting`,{level:"error"}),H("error","cli_worker_token_expired_no_refresh"),this.onDiagnostic?.(`session_token expired (exp=${new Date(l*1000).toISOString()}) — no refresh delivered, exiting`),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=oYe)b(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),H("error","cli_worker_auth_failures_exhausted"),this.onDiagnostic?.(`${this.consecutiveAuthFailures} consecutive auth failures (HTTP ${a.status}) with valid-looking token — exiting`),this.onEpochMismatch()}if(b(`CCRClient: ${n} returned ${a.status}`,{level:"warn"}),H("warn","cli_worker_request_failed",{method:e,path:t,status:a.status}),a.status===429){let c=a.headers.get("retry-after"),l=c?parseInt(c,10):NaN;if(!isNaN(l)&&l>=0)return{ok:!1,retryAfterMs:l*1000,status:a.status,reason:`http_${a.status}`}}return{ok:!1,status:a.status,reason:`http_${a.status}`}}catch(a){return b(`CCRClient: ${n} failed: ${ae(a)}`,{level:"warn"}),H("warn","cli_worker_request_error",{method:e,path:t,error_code:eie(a)}),{ok:!1,reason:`fetch_failed:${eie(a)}`}}}reportState(e,t){if(e===this.currentState&&!t)return;this.currentState=e,this.workerState.enqueue({worker_status:e,requires_action_details:t?{tool_name:t.tool_name,display_tool_name:t.display_tool_name,action_description:t.action_description,raw_command:t.raw_command,request_id:t.request_id,tool_use_id:t.tool_use_id}:null})}reportMetadata(e){this.workerState.enqueue({external_metadata:aYe(e)})}reportInternalMetadata(e){this.workerState.enqueue({internal_metadata:e})}handleEpochMismatch(){b("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),H("error","cli_worker_epoch_mismatch"),this.onDiagnostic?.(`worker epoch mismatch (409), epoch=${this.workerEpoch} — superseded by a newer worker, exiting`),this.onEpochMismatch()}startHeartbeat(){this.stopHeartbeat();let e=()=>{let r=this.heartbeatIntervalMs*this.heartbeatJitterFraction*(2*Math.random()-1);this.heartbeatTimer=setTimeout(t,this.heartbeatIntervalMs+r)},t=()=>{if(this.sendHeartbeat(),this.heartbeatTimer===null)return;e()};e()}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)b("CCRClient: Heartbeat sent")}finally{this.heartbeatInFlight=!1}}async writeEvent(e){if(e.type==="stream_event"){if(this.streamEventBuffer.push(e),this.streamedEphemeralSinceLastAssistant=!0,!this.streamEventTimer)this.streamEventTimer=setTimeout(()=>void this.flushStreamEventBuffer(),sYe);return}if(await this.flushStreamEventBuffer(),e.type==="assistant"&&this.streamedEphemeralSinceLastAssistant)ln("ccr_partial_messages"),this.streamedEphemeralSinceLastAssistant=!1;await this.eventUploader.enqueue(this.toClientEvent(e))}toClientEvent(e){let t=e,r=t.historical===!0;return{payload:{...t,uuid:typeof t.uuid==="string"?t.uuid:Zoe()},...r&&{historical:!0}}}async flushStreamEventBuffer(){if(this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;if(this.streamEventBuffer.length===0)return;let e=this.streamEventBuffer;this.streamEventBuffer=[];let t=e.filter((r)=>{if(Buffer.byteLength(Ee(r))<=Xoe)return!0;return b(`CCRClient: dropping oversize ephemeral stream_event (>${Xoe} bytes)`,{level:"warn"}),Us("ccr_partial_messages","oversize_ephemeral_skipped"),!1});await this.eventUploader.enqueue(t.map((r)=>({payload:r,ephemeral:!0})))}async writeInternalEvent(e,t,{isCompaction:r=!1,agentId:n,preservedEventIds:s}={}){let o={payload:{type:e,...t,uuid:typeof t.uuid==="string"?t.uuid:Zoe()},...r&&{is_compaction:!0},...n&&{session_agent_id:n},...s?.length&&{preserved_event_ids:s}};await this.internalEventUploader.enqueue(o)}flushInternalEvents(){return this.internalEventUploader.flush()}flushDeliveryAcks(){return this.deliveryUploader.flush()}async flush(){return await this.flushStreamEventBuffer(),this.eventUploader.flush()}async flushWorkerState(){return this.workerState.flush()}async readInternalEvents(){return this.paginatedGet("/worker/internal-events",{limit:"1000"},"internal_events")}async readSubagentInternalEvents(){return this.paginatedGet("/worker/internal-events",{subagents:"true",limit:"1000"},"subagent_events")}async paginatedGet(e,t,r){let n=this.getAuthHeaders();if(Object.keys(n).length===0)return null;let s=[],o,i=0,a=0,c=null;do{let l=new URL(`${this.sessionBaseUrl}${e}`);for(let[p,f]of Object.entries(t))l.searchParams.set(p,f);if(o)l.searchParams.set("cursor",o);let u=await this.getWithRetry(l.toString(),n,r,(p)=>{i++,c??=p.headers.get("content-encoding");let f=p.headers.get("content-length");if(f!==null&&a!==null)a+=Number(f);else a=null});if(!u)return null;s.push(...u.data??[]),o=u.next_cursor}while(o);return b(`CCRClient: Read ${s.length} internal events from ${e}${t.subagents?" (subagents)":""}`),{events:s,stats:{pageCount:i,bytesReceived:a,contentEncoding:c??"none"}}}async getWithRetry(e,t,r,n){for(let s=1;s<=10;s++){let o;try{if(o=await fetch(e,{headers:{...t,"anthropic-version":"2023-06-01","anthropic-client-platform":Ua(),"User-Agent":Lo()},signal:AbortSignal.timeout(30000),...$M({url:e})}),o.ok){let i=await o.json();return n?.(o),i}}catch(i){if(b(`CCRClient: GET ${e} failed (attempt ${s}/10): ${ae(i)}`,{level:"warn"}),s<10){let a=Math.min(500*2**(s-1),30000)+Math.random()*500;await Nr(a)}continue}if(o.body?.cancel(),o.status===409)this.handleEpochMismatch();if(b(`CCRClient: GET ${e} returned ${o.status} (attempt ${s}/10)`,{level:"warn"}),s<10){let i=Math.min(500*2**(s-1),30000)+Math.random()*500;await Nr(i)}}return b("CCRClient: GET retries exhausted",{level:"error"}),H("error","cli_worker_get_retries_exhausted",{context:r}),null}reportDelivery(e,t){if(t==="processing"){if(this.closed)return;if(this.pendingProcessingAcks.push(e)===1)queueMicrotask(()=>{let r=this.pendingProcessingAcks;if(this.pendingProcessingAcks=[],this.closed||r.length===0)return;this.request("post","/worker/events/delivery",{worker_epoch:this.workerEpoch,updates:r.map((n)=>({event_id:n,status:"processing"}))},"processing ack")});return}this.deliveryUploader.enqueue({eventId:e,status:t})}getWorkerEpoch(){return this.workerEpoch}get internalEventsPending(){return this.internalEventUploader.pendingCount}close(){if(this.closed=!0,this.stopHeartbeat(),Nm(),this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[],this.pendingProcessingAcks=[],this.workerState.close(),this.eventUploader.close(),this.internalEventUploader.close(),this.deliveryUploader.close()}}function aYe(e){let t=e.post_turn_summary;if(!cYe(t)||t.status_category!=="blocked")return e;return{...e,post_turn_summary:{...t,status_category:"need_input"}}}function cYe(e){return e!==null&&typeof e==="object"&&"status_category"in e&&typeof e.status_category==="string"}et();Ys();xt();rt();nr();var tie={},lYe={};var uYe=!1;function rie(e,t,r){if(uYe)return;if(e==="skills_load_ms"&&tie[e]!==void 0)return;if(tie[e]=Math.round(t),r!==void 0)lYe[e]=Math.round(r)}var dYe=1000,pYe=30000,nie=45000,fYe=new Set([401,403,404]),Fm=10,AYe=500,gYe=8000,mYe={stream:!0};function hYe(){return!0}function yYe(e){let t=[],r=0,n;while((n=e.indexOf(`
|
|
180
|
+
`;if(this.state!=="connected")return;let r=this.sessionId?` session=${this.sessionId}`:"",n=this.getControlMessageDetailLabel(e);b(`WebSocketTransport: Sending message type=${e.type}${r}${n}`),this.sendLine(t)}getControlMessageDetailLabel(e){if(e.type==="control_request"){let{request_id:t,request:r}=e,n=r.subtype==="can_use_tool"?r.tool_name:"";return` subtype=${r.subtype} request_id=${t}${n?` tool=${n}`:""}`}if(e.type==="control_response"){let{subtype:t,request_id:r}=e.response;return` subtype=${t} request_id=${r}`}return""}startPingInterval(){this.stopPingInterval(),this.pongReceived=!0;let e=Date.now();this.pingInterval=setInterval(()=>{if(this.state==="connected"&&this.ws){let t=Date.now(),r=t-e;if(e=t,r>roe){b(`WebSocketTransport: ${Math.round(r/1000)}s tick gap detected — process was suspended, forcing reconnect`),H("info","cli_websocket_sleep_detected_on_ping",{gapMs:r}),this.handleConnectionError();return}if(!this.pongReceived){b("WebSocketTransport: No pong received, connection appears dead",{level:"error"}),H("error","cli_websocket_pong_timeout"),this.handleConnectionError();return}this.pongReceived=!1;try{this.ws.ping?.()}catch(n){b(`WebSocketTransport: Ping failed: ${n}`,{level:"error"}),H("error","cli_websocket_ping_failed")}}},MWe)}stopPingInterval(){if(this.pingInterval)clearInterval(this.pingInterval),this.pingInterval=null}startKeepaliveInterval(){if(this.stopKeepaliveInterval(),Ge(process.env.CLAUDE_CODE_REMOTE))return;this.keepAliveInterval=setInterval(()=>{if(this.state==="connected"&&this.ws)try{this.ws.send(RWe),this.lastActivityTime=Date.now(),b("WebSocketTransport: Sent periodic keep_alive data frame")}catch(e){b(`WebSocketTransport: Periodic keep_alive failed: ${e}`,{level:"error"}),H("error","cli_websocket_keepalive_failed")}},NWe)}stopKeepaliveInterval(){if(this.keepAliveInterval)clearInterval(this.keepAliveInterval),this.keepAliveInterval=null}}var UWe=100,FWe=15000,LWe=3000;class HM extends zM{postUrl;uploader;streamEventBuffer=[];streamEventTimer=null;constructor(e,t={},r,n,s){super(e,t,r,n,s);let{maxConsecutiveFailures:o,onBatchDropped:i}=s??{};this.postUrl=$We(e),this.uploader=new qc({maxBatchSize:500,maxQueueSize:1e5,baseDelayMs:500,maxDelayMs:8000,jitterMs:1000,maxConsecutiveFailures:o,onBatchDropped:(a,c)=>{H("error","cli_hybrid_batch_dropped_max_failures",{batchSize:a,failures:c}),i?.(a,c)},send:(a)=>this.postOnce(a)}),b(`HybridTransport: POST URL = ${this.postUrl}`),H("info","cli_hybrid_transport_initialized")}async write(e){if(e.type==="stream_event"){if(this.streamEventBuffer.push(e),!this.streamEventTimer)this.streamEventTimer=setTimeout(()=>this.flushStreamEvents(),UWe);return}return await this.uploader.enqueue([...this.takeStreamEvents(),e]),this.uploader.flush()}async writeBatch(e){return await this.uploader.enqueue([...this.takeStreamEvents(),...e]),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 e=this.streamEventBuffer;return this.streamEventBuffer=[],e}flushStreamEvents(){this.streamEventTimer=null,this.uploader.enqueue(this.takeStreamEvents())}close(){if(this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[];let e=this.uploader,t;Promise.race([e.flush(),new Promise((r)=>{t=setTimeout(r,LWe)})]).finally(()=>{clearTimeout(t),e.close()}),super.close()}async postOnce(e){let t=Tg();if(!t){b("HybridTransport: No session token available for POST"),H("warn","cli_hybrid_post_no_token");return}let r={Authorization:`Bearer ${t}`,"Content-Type":"application/json"},n;try{n=await Ar.post(this.postUrl,{events:e},{headers:r,validateStatus:()=>!0,timeout:FWe})}catch(s){throw b(`HybridTransport: POST error: ${ae(s)}`),H("warn","cli_hybrid_post_network_error"),s}if(n.status>=200&&n.status<300){b(`HybridTransport: POST success count=${e.length}`);return}if(n.status>=400&&n.status<500&&n.status!==429){b(`HybridTransport: POST returned ${n.status} (permanent), dropping`),H("warn","cli_hybrid_post_client_error",{status:n.status});return}throw b(`HybridTransport: POST returned ${n.status} (retryable)`),H("warn","cli_hybrid_post_retryable_error",{status:n.status}),Error(`POST failed with ${n.status}`)}}function $We(e){let t=e.protocol==="wss:"?"https:":"http:",r=e.pathname;if(r=r.replace("/ws/","/session/"),!r.endsWith("/events"))r=r.endsWith("/")?r+"events":r+"/events";return`${t}//${e.host}${r}${e.search}`}Ji();nr();function soe(){let{namespace:e,cluster:t}=OO();return{...e&&{cooNamespace:e},...t&&{cooCluster:t}}}$l();import{chmod as CBt,mkdir as SBt,readdir as wBt,readFile as qWe,unlink as xBt,writeFile as GWe}from"fs/promises";import{join as ioe}from"path";bn();Ji();$l();et();nr();xt();lE();rt();import{AsyncLocalStorage as jWe}from"async_hooks";var cBt=new jWe;nr();var zBt=M(()=>bo.object({pid:bo.number(),sessionId:bo.string(),cwd:bo.string().optional(),startedAt:bo.number(),version:bo.string().optional(),kind:bo.enum(["interactive","bg","daemon","daemon-worker"])}));function VWe(){return ioe(ds(),"sessions")}var ooe=Promise.resolve();async function WWe(e){let t=ioe(VWe(),`${process.pid}.json`),r=ooe.then(async()=>{try{let n=Gt(await qWe(t,"utf8"));await GWe(t,Ee({...n,...e}))}catch(n){b(`[concurrentSessions] updatePidFile failed: ${ae(n)}`)}});ooe=r,await r}async function aoe(e){await WWe({bridgeSessionId:e})}et();Ys();nr();xt();function Yt(e,t){return Object.freeze({name:e,header:t})}var JWe=Yt("claude_code","claude-code-20250219"),YWe=Yt("oauth_auth",K1),KWe=Yt("interleaved_thinking","interleaved-thinking-2025-05-14"),ZWe=Yt("long_context","context-1m-2025-08-07"),XWe=Yt("context_management","context-management-2025-06-27"),eJe=Yt("structured_outputs","structured-outputs-2025-12-15"),tJe=Yt("web_search","web-search-2025-03-05"),rJe=Yt("tool_search","advanced-tool-use-2025-11-20"),nJe=Yt("tool_search","tool-search-tool-2025-10-19"),sJe=Yt("effort","effort-2025-11-24"),oJe=Yt("task_budgets","task-budgets-2026-03-13"),iJe=Yt("prompt_caching_scope","prompt-caching-scope-2026-01-05"),aJe=Yt("extended_cache_ttl","extended-cache-ttl-2025-04-11"),cJe=Yt("speed","fast-mode-2026-02-01"),lJe=Yt("redact_thinking","redact-thinking-2026-02-12"),uJe=null,dJe=Yt("narration_summaries","summarize-connector-text-2026-03-13"),pJe=Yt("afk_mode","afk-mode-2026-01-31"),fJe=Yt("advisor_tool","advisor-tool-2026-03-01"),AJe=Yt("cache_diagnosis","cache-diagnosis-2026-04-07"),gJe=Yt("context_hint","context-hint-2026-04-09"),mJe=Yt("mcp_servers","mcp-servers-2025-12-04"),hJe=Yt("files_api","files-api-2025-04-14"),qM=Yt("environments","environments-2025-11-01"),yJe=Yt("ccr_byoc","ccr-byoc-2025-07-29"),bJe=Yt("mid_conversation_system","mid-conversation-system-2026-04-07"),EJe=Object.freeze([JWe,YWe,KWe,ZWe,XWe,eJe,tJe,rJe,nJe,sJe,oJe,iJe,aJe,cJe,lJe,uJe,dJe,pJe,fJe,AJe,gJe,mJe,hJe,qM,yJe,bJe].filter((e)=>e!==null)),VBt=new Map(EJe.map((e)=>[e.header,e]));go();ZM();function Lo(){return"claude-code/0.3.168"}function Ua(){switch(process.env.CLAUDE_CODE_ENTRYPOINT){case"claude-vscode":return"claude_code_vscode";case"remote":case"remote_baku":case"remote_cowork":case"remote_desktop":case"remote_mobile":return"claude_code_remote";case"sdk-cli":case"sdk-ts":case"sdk-py":return"claude_code_sdk";case"mcp":return"claude_code_mcp";case"claude-code-github-action":return"claude_code_github_action";case"local-agent":return"claude_code_local_agent";case"claude_in_slack":return"claude_in_slack";case"cli":default:return"claude_code_cli"}}import{randomUUID as HJe}from"crypto";function Moe(e,t,r,n){if(!n)return{url:`${e}/v1/sessions/${t}/events`,body:{events:r}};let s=Um(t);return{url:`${e}/v1/code/sessions/${encodeURIComponent(s)}/events`,body:{events:r.map((o)=>({payload:typeof o.uuid==="string"&&o.uuid?o:{...o,uuid:HJe()}}))}}}Ji();et();xt();rt();var Noe=2000,qJe=["session_ingress_token","environment_secret","access_token","secret","token"],GJe=new RegExp(`"(${qJe.join("|")})"\\s*:\\s*"([^"]*)"`,"g"),VJe=16;function WJe(e){return e.replace(GJe,(t,r,n)=>{if(n.length<VJe)return`"${r}":"[REDACTED]"`;let s=`${n.slice(0,8)}...${n.slice(-4)}`;return`"${r}":"${s}"`})}function ap(e){let t=typeof e==="string"?e:Ee(e),r=WJe(t);if(r.length<=Noe)return r;return r.slice(0,Noe)+`... (${r.length} chars)`}function Ooe(e){let t=ae(e);if(e&&typeof e==="object"&&"response"in e){let r=e.response;if(r?.data&&typeof r.data==="object"){let n=r.data,s=typeof n.message==="string"?n.message:typeof n.error==="object"&&n.error&&("message"in n.error)&&typeof n.error.message==="string"?n.error.message:void 0;if(s)return`${t}: ${s}`}}return t}function Uoe(e){if(e&&typeof e==="object"&&"response"in e&&e.response&&typeof e.response.status==="number")return e.response.status;return}function tN(e,t=Date.now()){if(!e)return;let r=Number(e);if(Number.isFinite(r)&&r>=0)return r*1000;let n=Date.parse(e);if(Number.isFinite(n)){let s=n-t;return s>0?s:void 0}return}function Foe(e){if(!e||typeof e!=="object")return;if("retryAfterMs"in e&&typeof e.retryAfterMs==="number")return e.retryAfterMs;if("response"in e){let r=e.response?.headers?.["retry-after"];if(typeof r==="string")return tN(r)}return}function gl(e){if(!e||typeof e!=="object")return;if("message"in e&&typeof e.message==="string")return e.message;if("error"in e&&e.error!==null&&typeof e.error==="object"&&"message"in e.error&&typeof e.error.message==="string")return e.error.message;return}function Loe(e,t,r){if(t)b(t);Ye("tengu_bridge_repl_skipped",{reason:e,...r!==void 0&&{v2:r}})}var Tv="Remote Control is only available with claude.ai subscriptions. Please use `/login` to sign in with your claude.ai account.";var JJe=/^[a-zA-Z0-9_-]+$/;function On(e,t){if(!e||!JJe.test(e))throw Error(`Invalid ${t}: contains unsafe characters`);return e}class cs extends Error{status;errorType;constructor(e,t,r){super(e);this.name="BridgeFatalError",this.status=t,this.errorType=r}}function joe(e){function t(a){e.onDebug?.(a)}let r=0,n=100;async function s(a){let c={Authorization:`Bearer ${a}`,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-beta":qM.header,"x-environment-runner-version":e.runnerVersion,"User-Agent":Lo()},l=await e.getTrustedDeviceToken?.();if(l)c["X-Trusted-Device-Token"]=l;return c}function o(){let a=e.getAccessToken();if(!a)throw Error(Tv);return a}async function i(a,c){let l=o(),u=await a(l);if(u.status!==401)return u;if(!e.onAuth401)return t(`[bridge:api] ${c}: 401 received, no refresh handler`),u;if(t(`[bridge:api] ${c}: 401 received, attempting token refresh`),await e.onAuth401(l)){t(`[bridge:api] ${c}: Token refreshed, retrying request`);let f=o(),A=await a(f);if(A.status!==401)return A;t(`[bridge:api] ${c}: Retry after refresh also got 401`)}else t(`[bridge:api] ${c}: Token refresh failed`);return u}return{async registerBridgeEnvironment(a){return En("bridge_environment_register",async()=>{t(`[bridge:api] POST /v1/environments/bridge bridgeId=${a.bridgeId}`);let c=await i(async(l)=>Ar.post(`${e.baseUrl}/v1/environments/bridge`,{machine_name:a.machineName,directory:a.dir,branch:a.branch,git_repo_url:a.gitRepoUrl,max_sessions:a.maxSessions,metadata:{worker_type:a.workerType},...a.reuseEnvironmentId&&{environment_id:a.reuseEnvironmentId}},{headers:await s(l),timeout:15000,validateStatus:(u)=>u<500}),"Registration");return Qi(c.status,c.data,"Registration"),t(`[bridge:api] POST /v1/environments/bridge -> ${c.status} environment_id=${c.data.environment_id}`),t(`[bridge:api] >>> ${ap({machine_name:a.machineName,directory:a.dir,branch:a.branch,git_repo_url:Doe(a.gitRepoUrl),max_sessions:a.maxSessions,metadata:{worker_type:a.workerType}})}`),t(`[bridge:api] <<< ${ap(c.data)}`),c.data},$oe)},async pollForWork(a,c,l,u){On(a,"environmentId");let p=r;r=0;let f=await Ar.get(`${e.baseUrl}/v1/environments/${a}/work/poll`,{headers:await s(c),params:u!==void 0?{reclaim_older_than_ms:u}:void 0,timeout:1e4,signal:l,validateStatus:(A)=>A<500});if(Qi(f.status,f.data,"Poll",f.headers),!f.data){if(r=p+1,r===1||r%n===0)t(`[bridge:api] GET .../work/poll -> ${f.status} (no work, ${r} consecutive empty polls)`);return null}return t(`[bridge:api] GET .../work/poll -> ${f.status} workId=${f.data.id} type=${f.data.data?.type}${f.data.data?.id?` sessionId=${f.data.data.id}`:""}`),t(`[bridge:api] <<< ${ap(f.data)}`),f.data},async acknowledgeWork(a,c,l){On(a,"environmentId"),On(c,"workId"),t(`[bridge:api] POST .../work/${c}/ack`);let u=await Ar.post(`${e.baseUrl}/v1/environments/${a}/work/${c}/ack`,{},{headers:await s(l),timeout:1e4,validateStatus:(p)=>p<500});Qi(u.status,u.data,"Acknowledge"),t(`[bridge:api] POST .../work/${c}/ack -> ${u.status}`)},async stopWork(a,c,l){On(a,"environmentId"),On(c,"workId"),t(`[bridge:api] POST .../work/${c}/stop force=${l}`);let u=await i(async(p)=>Ar.post(`${e.baseUrl}/v1/environments/${a}/work/${c}/stop`,{force:l},{headers:await s(p),timeout:1e4,validateStatus:(f)=>f<500}),"StopWork");Qi(u.status,u.data,"StopWork"),t(`[bridge:api] POST .../work/${c}/stop -> ${u.status}`)},async deregisterEnvironment(a){On(a,"environmentId"),t(`[bridge:api] DELETE /v1/environments/bridge/${a}`);let c=await i(async(l)=>Ar.delete(`${e.baseUrl}/v1/environments/bridge/${a}`,{headers:await s(l),timeout:1e4,validateStatus:(u)=>u<500}),"Deregister");Qi(c.status,c.data,"Deregister"),t(`[bridge:api] DELETE /v1/environments/bridge/${a} -> ${c.status}`)},async archiveSession(a){On(a,"sessionId"),t(`[bridge:api] POST /v1/sessions/${a}/archive`);let c=await i(async(l)=>Ar.post(`${e.baseUrl}/v1/sessions/${a}/archive`,{},{headers:await s(l),timeout:1e4,validateStatus:(u)=>u<500}),"ArchiveSession");if(c.status===409){t(`[bridge:api] POST /v1/sessions/${a}/archive -> 409 (already archived)`);return}Qi(c.status,c.data,"ArchiveSession"),t(`[bridge:api] POST /v1/sessions/${a}/archive -> ${c.status}`)},async reconnectSession(a,c){return En("bridge_session_reconnect",async()=>{On(a,"environmentId"),On(c,"sessionId"),t(`[bridge:api] POST /v1/environments/${a}/bridge/reconnect session_id=${c}`);let l=await i(async(u)=>Ar.post(`${e.baseUrl}/v1/environments/${a}/bridge/reconnect`,{session_id:c},{headers:await s(u),timeout:1e4,validateStatus:(p)=>p<500}),"ReconnectSession");Qi(l.status,l.data,"ReconnectSession"),t(`[bridge:api] POST .../bridge/reconnect -> ${l.status}`)},$oe)},async heartbeatWork(a,c,l){On(a,"environmentId"),On(c,"workId"),t(`[bridge:api] POST .../work/${c}/heartbeat`);let u=await Ar.post(`${e.baseUrl}/v1/environments/${a}/work/${c}/heartbeat`,{},{headers:await s(l),timeout:1e4,validateStatus:(p)=>p<500});return Qi(u.status,u.data,"Heartbeat"),t(`[bridge:api] POST .../work/${c}/heartbeat -> ${u.status} lease_extended=${u.data.lease_extended} state=${u.data.state}`),u.data},async sendPermissionResponseEvent(a,c,l){On(a,"sessionId");let{url:u,body:p}=Moe(e.baseUrl,a,[c],e.useCcrV2Routing?.()??!1);t(`[bridge:api] POST ${u} type=${c.type}`);let f=await Ar.post(u,p,{headers:await s(l),timeout:1e4,validateStatus:(A)=>A<500});Qi(f.status,f.data,"SendPermissionResponseEvent"),t(`[bridge:api] POST ${u} -> ${f.status}`),t(`[bridge:api] >>> ${ap(p)}`),t(`[bridge:api] <<< ${ap(f.data)}`)}}}function Qi(e,t,r,n){if(e===200||e===204)return;let s=gl(t),o=YJe(t);switch(e){case 401:throw new cs(`${r}: Authentication failed (401)${s?`: ${s}`:""}. ${Tv}`,401,o);case 403:throw new cs(Dv(o)?"Remote Control session expired.":`${r}: Access denied (403)${s?`: ${s}`:""}. Check your organization permissions.`,403,o);case 404:throw new cs(s??`${r}: Not found (404). Remote Control may not be available for this organization.`,404,o);case 410:throw new cs(s??"Remote Control session expired.",410,o??"environment_expired");case 429:{let i=tN(typeof n?.["retry-after"]==="string"?n["retry-after"]:void 0);throw Object.assign(Error(`${r}: Rate limited (429). Polling too frequently.`),i!==void 0?{status:e,retryAfterMs:i}:{status:e})}default:throw Object.assign(Error(`${r}: Failed with status ${e}${s?`: ${s}`:""}`),{status:e})}}function Dv(e){if(!e)return!1;return e.includes("expired")||e.includes("lifetime")}function zoe(e){if(e.status!==403)return!1;return e.message.includes("external_poll_sessions")||e.message.includes("environments:manage")}function $oe(e){if(e instanceof cs)return e.status===401?"auth_failed":"http_error";if(e instanceof Error){if(e.message===Tv)return"no_token";if("status"in e&&typeof e.status==="number")return"http_error"}return"request_failed"}function YJe(e){if(e&&typeof e==="object"){if("error"in e&&e.error&&typeof e.error==="object"&&"type"in e.error&&typeof e.error.type==="string")return e.error.type}return}et();import{randomUUID as KJe}from"crypto";go();Ji();var Hoe={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 qoe(e){if(e===null||typeof e!=="object")return e;let t=e;if("requestId"in t&&!("request_id"in t))t.request_id=t.requestId,delete t.requestId;if("response"in t&&t.response!==null&&typeof t.response==="object"){let r=t.response;if("requestId"in r&&!("request_id"in r))r.request_id=r.requestId,delete r.requestId}return e}et();rR();xt();rt();function ZJe(e){return e!==null&&typeof e==="object"&&"type"in e&&typeof e.type==="string"}function XJe(e){return e!==null&&typeof e==="object"&&"type"in e&&e.type==="control_response"&&"response"in e}function eYe(e){return e!==null&&typeof e==="object"&&"type"in e&&e.type==="control_request"&&"request_id"in e&&"request"in e}function rN(e){if((e.type==="user"||e.type==="assistant")&&e.isVirtual)return!1;return e.type==="user"||e.type==="assistant"||e.type==="system"&&e.subtype==="local_command"}function Goe(e){if(e.type!=="user"||e.isMeta||e.toolUseResult||e.isCompactSummary)return;if(e.origin&&e.origin.kind!=="human")return;let t=e.message.content,r;if(typeof t==="string")r=t;else for(let s of t)if(s.type==="text"){r=s.text;break}if(!r)return;return tR(r)||void 0}function Voe(e,t,r,n,s,o){try{let i=qoe(Gt(e));if(XJe(i)){b("[bridge:repl] Ingress message type=control_response"),s?.(i);return}if(eYe(i)){b(`[bridge:repl] Inbound control_request subtype=${i.request.subtype}`),o?.(i);return}if(!ZJe(i))return;let a="uuid"in i&&typeof i.uuid==="string"?i.uuid:void 0;if(a&&t.has(a)){b(`[bridge:repl] Ignoring echo: type=${i.type} uuid=${a}`);return}if(a&&r.has(a)){b(`[bridge:repl] Ignoring re-delivered inbound: type=${i.type} uuid=${a}`);return}if(b(`[bridge:repl] Ingress message type=${i.type}${a?` uuid=${a}`:""}`),i.type==="user"){if(a)r.add(a);Ye("tengu_bridge_message_received",{is_repl:!0}),ln("bridge_message_receive"),n?.(i)}else b(`[bridge:repl] Ignoring non-user inbound message: type=${i.type}`)}catch(i){b(`[bridge:repl] Failed to parse ingress message: ${ae(i)}`),Zr("bridge_message_receive","bridge_message_receive_parse_failed")}}var tYe="This session is outbound-only. Enable Remote Control locally to allow inbound control.";function Woe(e,t){let{transport:r,sessionId:n,outboundOnly:s,onInterrupt:o,onSetModel:i,onSetMaxThinkingTokens:a,onSetPermissionMode:c,onRenameSession:l,onSetColor:u,onFileSuggestions:p,onReadFile:f,onGetContextUsage:A,onMcpAuthenticate:g,onMcpOauthCallbackUrl:h,onMcpReconnect:m,onMcpStatus:y}=t;if(!r){b("[bridge:repl] Cannot respond to control_request: transport not configured");return}let w;if(s&&e.request.subtype!=="initialize"){w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:tYe}};let v={...w,session_id:n};r.write(v),b(`[bridge:repl] Rejected ${e.request.subtype} (outbound-only) request_id=${e.request_id}`);return}switch(e.request.subtype){case"initialize":w={type:"control_response",response:{subtype:"success",request_id:e.request_id,response:{commands:[],output_style:"normal",available_output_styles:["normal"],models:[],account:{},pid:process.pid}}};break;case"set_model":i?.(e.request.model),w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};break;case"set_max_thinking_tokens":a?.(e.request.max_thinking_tokens),w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};break;case"set_permission_mode":{let v=c?.(e.request.mode)??{ok:!1,error:"set_permission_mode is not supported in this context (onSetPermissionMode callback not registered)"};if(v.ok)w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};else w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:v.error}};break}case"rename_session":{let v=l?.(e.request.title)??{ok:!1,error:"rename_session is not supported in this context (onRenameSession callback not registered)"};if(v.ok)w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};else w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:v.error}};break}case"set_color":{let v=u?.(e.request.color)??{ok:!1,error:"set_color is not supported in this context (onSetColor callback not registered)"};if(v.ok)w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};else w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:v.error}};break}case"file_suggestions":{if(!p){w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:"file_suggestions is not supported in this context (onFileSuggestions callback not registered)"}};break}p(e.request.query).then((v)=>({type:"control_response",response:{subtype:"success",request_id:e.request_id,response:{suggestions:v}}})).catch((v)=>({type:"control_response",response:{subtype:"error",request_id:e.request_id,error:ae(v)}})).then((v)=>{let B={...v,session_id:n};r.write(B),b(`[bridge:repl] Sent control_response for file_suggestions request_id=${e.request_id} result=${v.response.subtype}`)});return}case"read_file":{if(!f){w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:"read_file is not supported in this context (onReadFile callback not registered)"}};break}f(e.request.path,e.request.max_bytes,e.request.encoding).then((v)=>({type:"control_response",response:{subtype:"success",request_id:e.request_id,response:v}})).catch((v)=>({type:"control_response",response:{subtype:"error",request_id:e.request_id,error:ae(v)}})).then((v)=>{let B={...v,session_id:n};r.write(B),b(`[bridge:repl] Sent control_response for read_file request_id=${e.request_id} result=${v.response.subtype}`)});return}case"get_context_usage":{if(!A){w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:"get_context_usage is not supported in this context (onGetContextUsage callback not registered)"}};break}A().then((v)=>({type:"control_response",response:{subtype:"success",request_id:e.request_id,response:{...v}}})).catch((v)=>({type:"control_response",response:{subtype:"error",request_id:e.request_id,error:ae(v)}})).then((v)=>{let B={...v,session_id:n};r.write(B),b(`[bridge:repl] Sent control_response for get_context_usage request_id=${e.request_id} result=${v.response.subtype}`)});return}case"mcp_status":w={type:"control_response",response:{subtype:"success",request_id:e.request_id,response:{mcpServers:y?.()??[]}}};break;case"mcp_authenticate":case"mcp_oauth_callback_url":case"mcp_reconnect":{let v=e.request,{subtype:B,serverName:P}=v,R=v.subtype==="mcp_authenticate"?g&&((V)=>g(V,v.redirectUri)):v.subtype==="mcp_oauth_callback_url"?h&&((V)=>h(V,v.callbackUrl)):m;if(!R){w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:`${B} is not supported in this context (callback not registered)`}};break}R(P).then((V)=>({type:"control_response",response:{subtype:"success",request_id:e.request_id,response:V??{}}})).catch((V)=>({type:"control_response",response:{subtype:"error",request_id:e.request_id,error:ae(V)}})).then((V)=>{let Y={...V,session_id:n};r.write(Y),b(`[bridge:repl] Sent control_response for ${B} request_id=${e.request_id} result=${V.response.subtype}`)});return}case"interrupt":o?.(),w={type:"control_response",response:{subtype:"success",request_id:e.request_id}};break;default:w={type:"control_response",response:{subtype:"error",request_id:e.request_id,error:`REPL bridge does not handle control_request subtype: ${e.request.subtype}`}}}let C={...w,session_id:n};r.write(C),b(`[bridge:repl] Sent control_response for ${e.request.subtype} request_id=${e.request_id} result=${w.response.subtype}`)}function nN(e){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:{...Hoe},modelUsage:{},permission_denials:[],session_id:e,uuid:KJe()}}class Pv{capacity;ring;set=new Set;writeIdx=0;constructor(e){this.capacity=e,this.ring=Array(e)}add(e){if(this.set.has(e))return;let t=this.ring[this.writeIdx];if(t!==void 0)this.set.delete(t);this.ring[this.writeIdx]=e,this.set.add(e),this.writeIdx=(this.writeIdx+1)%this.capacity}has(e){return this.set.has(e)}clear(){this.set.clear(),this.ring.fill(void 0),this.writeIdx=0}}function Joe(e){let t=new AbortController;function r(){t.abort(),t=new AbortController}function n(){let s=new AbortController,o=()=>s.abort();if(e.aborted||t.signal.aborted)return s.abort(),{signal:s.signal,cleanup:()=>{}};e.addEventListener("abort",o,{once:!0});let i=t.signal;return i.addEventListener("abort",o,{once:!0}),{signal:s.signal,cleanup:()=>{e.removeEventListener("abort",o),i.removeEventListener("abort",o)}}}return{signal:n,wake:r}}class sN{_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(...e){if(!this._active)return!1;return this._pending.push(...e),!0}drop(){this._active=!1;let e=this._pending.length;return this._pending.length=0,e}deactivate(){this._active=!1}}import{randomUUID as Zoe}from"crypto";Ji();et();Ys();xt();rt();function rYe(e){let r=(e.startsWith("sk-ant-si-")?e.slice(10):e).split(".");if(r.length!==3||!r[1])return null;try{return Gt(Buffer.from(r[1],"base64url").toString("utf8"))}catch{return null}}function Yoe(e){let t=rYe(e);if(t!==null&&typeof t==="object"&&"exp"in t&&typeof t.exp==="number")return t.exp;return null}go();et();Ys();xt();rt();class oN{inflight=null;pending=null;closed=!1;config;constructor(e){this.config=e}enqueue(e){if(this.closed)return;this.pending=this.pending?Koe(this.pending,e):e,this.drain()}close(){this.closed=!0,this.pending=null}async flush(){while(!this.closed)if(this.inflight)await this.inflight;else if(this.pending)await this.drain();else return}async drain(){if(this.inflight||this.closed)return;if(!this.pending)return;let e=this.pending;this.pending=null,this.inflight=this.sendWithRetry(e).then(()=>{if(this.inflight=null,this.pending&&!this.closed)this.drain()})}async sendWithRetry(e){let t=e,r=0;while(!this.closed){if(await this.config.send(t))return;if(r++,await Nr(this.retryDelay(r)),this.pending&&!this.closed)t=Koe(t,this.pending),this.pending=null}}retryDelay(e){let t=Math.min(this.config.baseDelayMs*2**(e-1),this.config.maxDelayMs),r=Math.random()*this.config.jitterMs;return t+r}}function Koe(e,t){let r={...e};for(let[n,s]of Object.entries(t))if((n==="external_metadata"||n==="internal_metadata")&&r[n]&&typeof r[n]==="object"&&typeof s==="object"&&s!==null)r[n]={...r[n],...s};else r[n]=s;return r}var nYe=20000,sYe=100,Xoe=61440;function cp(e){return e===400||e===413||e===422}function eie(e){let t=Qr(e);if(t)return t;if(e&&typeof e==="object"&&"name"in e&&typeof e.name==="string")return e.name;return}class Mv extends Error{reason;httpStatus;constructor(e,t){super(`CCRClient init failed: ${e}`);this.reason=e;this.httpStatus=t}}var oYe=10,iYe=3;class iN{workerEpoch=0;heartbeatIntervalMs;heartbeatJitterFraction;heartbeatTimer=null;heartbeatInFlight=!1;closed=!1;consecutiveAuthFailures=0;consecutiveNotFound=0;currentState=null;sessionBaseUrl;sessionId;streamEventBuffer=[];streamEventTimer=null;streamedEphemeralSinceLastAssistant=!1;workerState;eventUploader;internalEventUploader;deliveryUploader;pendingProcessingAcks=[];onEpochMismatch;getAuthHeaders;onDiagnostic;constructor(e,t,r){if(this.onEpochMismatch=r?.onEpochMismatch??(()=>{process.exit(1)}),this.heartbeatIntervalMs=r?.heartbeatIntervalMs??nYe,this.heartbeatJitterFraction=r?.heartbeatJitterFraction??0,this.getAuthHeaders=r?.getAuthHeaders??HE,this.onDiagnostic=r?.onDiagnostic,t.protocol!=="http:"&&t.protocol!=="https:")throw Error(`CCRClient: Expected http(s) URL, got ${t.protocol}`);let n=t.pathname.replace(/\/$/,"");this.sessionBaseUrl=`${t.protocol}//${t.host}${n}`,this.sessionId=n.split("/").pop()||"",this.workerState=new oN({send:async(s)=>{let o=await this.request("put","/worker",{worker_epoch:this.workerEpoch,...s},"PUT worker");if(o.ok)return!0;if(cp(o.status))return H("warn","cli_worker_state_4xx_dropped",{status:o.status}),!0;return!1},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.eventUploader=new qc({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:1e5,send:async(s)=>{let o=await this.request("post","/worker/events",{worker_epoch:this.workerEpoch,events:s},"client events");if(o.ok)return;if(cp(o.status)){let i=s.filter((c)=>!c.ephemeral),a=s.length-i.length;if(a>0){if(b(`CCRClient: client event POST rejected (${o.status}) — dropping ${a} ephemeral event(s), retrying ${i.length} durable event(s)`,{level:"warn"}),Us("ccr_partial_messages","ephemeral_dropped_on_4xx"),s.splice(0,s.length,...i),i.length===0)return;let c=await this.request("post","/worker/events",{worker_epoch:this.workerEpoch,events:i},"client events (durable retry)");if(c.ok)return;if(!cp(c.status))throw new Hc("client event POST failed",c.retryAfterMs)}H("warn","cli_worker_events_4xx_dropped",{status:o.status,count:i.length});return}throw new Hc("client event POST failed",o.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.internalEventUploader=new qc({maxBatchSize:100,maxBatchBytes:10485760,maxQueueSize:200,send:async(s)=>{let o=await this.request("post","/worker/internal-events",{worker_epoch:this.workerEpoch,events:s},"internal events");if(o.ok)return;if(cp(o.status)){H("warn","cli_worker_internal_events_4xx_dropped",{status:o.status,count:s.length});return}throw new Hc("internal event POST failed",o.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),this.deliveryUploader=new qc({maxBatchSize:64,maxQueueSize:64,send:async(s)=>{let o=await this.request("post","/worker/events/delivery",{worker_epoch:this.workerEpoch,updates:s.map((i)=>({event_id:i.eventId,status:i.status}))},"delivery batch");if(o.ok)return;if(cp(o.status)){H("warn","cli_worker_delivery_4xx_dropped",{status:o.status,count:s.length});return}throw new Hc("delivery POST failed",o.retryAfterMs)},baseDelayMs:500,maxDelayMs:30000,jitterMs:500}),e.setOnEvent((s)=>{this.reportDelivery(s.event_id,"received")})}async initialize(e){let t=Date.now();if(Object.keys(this.getAuthHeaders()).length===0)throw new Mv("no_auth_headers");if(e===void 0){let l=process.env.CLAUDE_CODE_WORKER_EPOCH;e=l?parseInt(l,10):NaN}if(isNaN(e))throw new Mv("missing_epoch");this.workerEpoch=e;let r=this.getWorkerState(),n={ok:!1},s=new Set,o=10,i=0;for(let l=1;l<=o;l++){if(i=l,n=await this.request("put","/worker",{worker_status:"idle",worker_epoch:this.workerEpoch,external_metadata:{pending_action:null,task_summary:null}},"PUT worker (init)"),n.ok||this.closed)break;if(n.reason)s.add(n.reason);if(this.onDiagnostic?.(`PUT /worker failed (${n.reason??"unknown"}) attempt=${l}/${o}, ${Math.round((Date.now()-t)/1000)}s elapsed`),cp(n.status))break;if(l<o){let u=Math.min(500*2**(l-1),30000)+Math.random()*500;await Nr(u)}}if(!n.ok){if(!this.closed)H("error","cli_worker_init_put_retries_exhausted"),this.onDiagnostic?.(`PUT /worker retries exhausted: ${i} attempts over ${Math.round((Date.now()-t)/1000)}s, errors=[${[...s].join(",")||"unknown"}]`);throw new Mv("worker_register_failed",n.status)}this.currentState="idle",this.startHeartbeat(),xv(()=>{this.writeEvent({type:"keep_alive"})}),b(`CCRClient: initialized, epoch=${this.workerEpoch}`),H("info","cli_worker_lifecycle_initialized",{epoch:this.workerEpoch,duration_ms:Date.now()-t});let{metadata:a,durationMs:c}=await r;if(!this.closed)H("info","cli_worker_state_restored",{duration_ms:c,had_state:a.external!==null||a.internal!==null});return a}async getWorkerState(){let e=Date.now(),t=this.getAuthHeaders();if(Object.keys(t).length===0)return{metadata:{external:null,internal:null},durationMs:0};let r=await this.getWithRetry(`${this.sessionBaseUrl}/worker`,t,"worker_state");return{metadata:{external:r?.worker?.external_metadata??null,internal:r?.worker?.internal_metadata??null},durationMs:Date.now()-e}}async request(e,t,r,n,{timeout:s=1e4}={}){let o=this.getAuthHeaders();if(Object.keys(o).length===0)return{ok:!1,reason:"no_auth_headers"};let i=`${this.sessionBaseUrl}${t}`;try{let a=await fetch(i,{method:e.toUpperCase(),headers:{...o,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-client-platform":Ua(),"User-Agent":Lo()},body:Ee(r),signal:AbortSignal.timeout(s),...$M({url:i})});if(a.body?.cancel(),a.ok)return this.consecutiveAuthFailures=0,this.consecutiveNotFound=0,{ok:!0};if(a.status===409)this.handleEpochMismatch();if(a.status===404){if(this.consecutiveNotFound++,this.consecutiveNotFound>=iYe)b(`CCRClient: ${this.consecutiveNotFound} consecutive 404s — session gone, exiting`,{level:"error"}),H("error","cli_worker_session_not_found"),this.onDiagnostic?.(`${this.consecutiveNotFound} consecutive 404s on ${t} — session gone, exiting`),this.onEpochMismatch()}if(a.status===401||a.status===403){let c=Tg(),l=c?Yoe(c):null;if(l!==null&&l*1000<Date.now())b(`CCRClient: session_token expired (exp=${new Date(l*1000).toISOString()}) — no refresh was delivered, exiting`,{level:"error"}),H("error","cli_worker_token_expired_no_refresh"),this.onDiagnostic?.(`session_token expired (exp=${new Date(l*1000).toISOString()}) — no refresh delivered, exiting`),this.onEpochMismatch();if(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=oYe)b(`CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,{level:"error"}),H("error","cli_worker_auth_failures_exhausted"),this.onDiagnostic?.(`${this.consecutiveAuthFailures} consecutive auth failures (HTTP ${a.status}) with valid-looking token — exiting`),this.onEpochMismatch()}if(b(`CCRClient: ${n} returned ${a.status}`,{level:"warn"}),H("warn","cli_worker_request_failed",{method:e,path:t,status:a.status}),a.status===429){let c=a.headers.get("retry-after"),l=c?parseInt(c,10):NaN;if(!isNaN(l)&&l>=0)return{ok:!1,retryAfterMs:l*1000,status:a.status,reason:`http_${a.status}`}}return{ok:!1,status:a.status,reason:`http_${a.status}`}}catch(a){return b(`CCRClient: ${n} failed: ${ae(a)}`,{level:"warn"}),H("warn","cli_worker_request_error",{method:e,path:t,error_code:eie(a)}),{ok:!1,reason:`fetch_failed:${eie(a)}`}}}reportState(e,t){if(e===this.currentState&&!t)return;this.currentState=e,this.workerState.enqueue({worker_status:e,requires_action_details:t?{tool_name:t.tool_name,display_tool_name:t.display_tool_name,action_description:t.action_description,raw_command:t.raw_command,request_id:t.request_id,tool_use_id:t.tool_use_id}:null})}reportMetadata(e){this.workerState.enqueue({external_metadata:aYe(e)})}reportInternalMetadata(e){this.workerState.enqueue({internal_metadata:e})}handleEpochMismatch(){b("CCRClient: Epoch mismatch (409), shutting down",{level:"error"}),H("error","cli_worker_epoch_mismatch"),this.onDiagnostic?.(`worker epoch mismatch (409), epoch=${this.workerEpoch} — superseded by a newer worker, exiting`),this.onEpochMismatch()}startHeartbeat(){this.stopHeartbeat();let e=()=>{let r=this.heartbeatIntervalMs*this.heartbeatJitterFraction*(2*Math.random()-1);this.heartbeatTimer=setTimeout(t,this.heartbeatIntervalMs+r)},t=()=>{if(this.sendHeartbeat(),this.heartbeatTimer===null)return;e()};e()}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)b("CCRClient: Heartbeat sent")}finally{this.heartbeatInFlight=!1}}async writeEvent(e){if(e.type==="stream_event"){if(this.streamEventBuffer.push(e),this.streamedEphemeralSinceLastAssistant=!0,!this.streamEventTimer)this.streamEventTimer=setTimeout(()=>void this.flushStreamEventBuffer(),sYe);return}if(await this.flushStreamEventBuffer(),e.type==="assistant"&&this.streamedEphemeralSinceLastAssistant)ln("ccr_partial_messages"),this.streamedEphemeralSinceLastAssistant=!1;await this.eventUploader.enqueue(this.toClientEvent(e))}toClientEvent(e){let t=e,r=t.historical===!0;return{payload:{...t,uuid:typeof t.uuid==="string"?t.uuid:Zoe()},...r&&{historical:!0}}}async flushStreamEventBuffer(){if(this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;if(this.streamEventBuffer.length===0)return;let e=this.streamEventBuffer;this.streamEventBuffer=[];let t=e.filter((r)=>{if(Buffer.byteLength(Ee(r))<=Xoe)return!0;return b(`CCRClient: dropping oversize ephemeral stream_event (>${Xoe} bytes)`,{level:"warn"}),Us("ccr_partial_messages","oversize_ephemeral_skipped"),!1});await this.eventUploader.enqueue(t.map((r)=>({payload:r,ephemeral:!0})))}async writeInternalEvent(e,t,{isCompaction:r=!1,agentId:n,preservedEventIds:s}={}){let o={payload:{type:e,...t,uuid:typeof t.uuid==="string"?t.uuid:Zoe()},...r&&{is_compaction:!0},...n&&{session_agent_id:n},...s?.length&&{preserved_event_ids:s}};await this.internalEventUploader.enqueue(o)}flushInternalEvents(){return this.internalEventUploader.flush()}flushDeliveryAcks(){return this.deliveryUploader.flush()}async flush(){return await this.flushStreamEventBuffer(),this.eventUploader.flush()}async flushWorkerState(){return this.workerState.flush()}async readInternalEvents(){return this.paginatedGet("/worker/internal-events",{limit:"1000"},"internal_events")}async readSubagentInternalEvents(){return this.paginatedGet("/worker/internal-events",{subagents:"true",limit:"1000"},"subagent_events")}async paginatedGet(e,t,r){let n=this.getAuthHeaders();if(Object.keys(n).length===0)return null;let s=[],o,i=0,a=0,c=null;do{let l=new URL(`${this.sessionBaseUrl}${e}`);for(let[p,f]of Object.entries(t))l.searchParams.set(p,f);if(o)l.searchParams.set("cursor",o);let u=await this.getWithRetry(l.toString(),n,r,(p)=>{i++,c??=p.headers.get("content-encoding");let f=p.headers.get("content-length");if(f!==null&&a!==null)a+=Number(f);else a=null});if(!u)return null;s.push(...u.data??[]),o=u.next_cursor}while(o);return b(`CCRClient: Read ${s.length} internal events from ${e}${t.subagents?" (subagents)":""}`),{events:s,stats:{pageCount:i,bytesReceived:a,contentEncoding:c??"none"}}}async getWithRetry(e,t,r,n){for(let s=1;s<=10;s++){let o;try{if(o=await fetch(e,{headers:{...t,"anthropic-version":"2023-06-01","anthropic-client-platform":Ua(),"User-Agent":Lo()},signal:AbortSignal.timeout(30000),...$M({url:e})}),o.ok){let i=await o.json();return n?.(o),i}}catch(i){if(b(`CCRClient: GET ${e} failed (attempt ${s}/10): ${ae(i)}`,{level:"warn"}),s<10){let a=Math.min(500*2**(s-1),30000)+Math.random()*500;await Nr(a)}continue}if(o.body?.cancel(),o.status===409)this.handleEpochMismatch();if(b(`CCRClient: GET ${e} returned ${o.status} (attempt ${s}/10)`,{level:"warn"}),s<10){let i=Math.min(500*2**(s-1),30000)+Math.random()*500;await Nr(i)}}return b("CCRClient: GET retries exhausted",{level:"error"}),H("error","cli_worker_get_retries_exhausted",{context:r}),null}reportDelivery(e,t){if(t==="processing"){if(this.closed)return;if(this.pendingProcessingAcks.push(e)===1)queueMicrotask(()=>{let r=this.pendingProcessingAcks;if(this.pendingProcessingAcks=[],this.closed||r.length===0)return;this.request("post","/worker/events/delivery",{worker_epoch:this.workerEpoch,updates:r.map((n)=>({event_id:n,status:"processing"}))},"processing ack")});return}this.deliveryUploader.enqueue({eventId:e,status:t})}getWorkerEpoch(){return this.workerEpoch}get internalEventsPending(){return this.internalEventUploader.pendingCount}close(){if(this.closed=!0,this.stopHeartbeat(),Nm(),this.streamEventTimer)clearTimeout(this.streamEventTimer),this.streamEventTimer=null;this.streamEventBuffer=[],this.pendingProcessingAcks=[],this.workerState.close(),this.eventUploader.close(),this.internalEventUploader.close(),this.deliveryUploader.close()}}function aYe(e){let t=e.post_turn_summary;if(!cYe(t)||t.status_category!=="blocked")return e;return{...e,post_turn_summary:{...t,status_category:"need_input"}}}function cYe(e){return e!==null&&typeof e==="object"&&"status_category"in e&&typeof e.status_category==="string"}et();Ys();xt();rt();nr();var tie={},lYe={};var uYe=!1;function rie(e,t,r){if(uYe)return;if(e==="skills_load_ms"&&tie[e]!==void 0)return;if(tie[e]=Math.round(t),r!==void 0)lYe[e]=Math.round(r)}var dYe=1000,pYe=30000,nie=45000,fYe=new Set([401,403,404]),Fm=10,AYe=500,gYe=8000,mYe={stream:!0};function hYe(){return!0}function yYe(e){let t=[],r=0,n;while((n=e.indexOf(`
|
|
181
181
|
|
|
182
182
|
`,r))!==-1){let s=e.slice(r,n);if(r=n+2,!s.trim())continue;let o={},i=!1;for(let a of s.split(`
|
|
183
183
|
`)){if(a.startsWith(":")){i=!0;continue}let c=a.indexOf(":");if(c===-1)continue;let l=a.slice(0,c),u=a[c+1]===" "?a.slice(c+2):a.slice(c+1);switch(l){case"event":o.event=u;break;case"id":o.id=u;break;case"data":o.data=o.data?o.data+`
|
|
@@ -187,4 +187,4 @@ ${s}`;break;case"retry":if(Tse(s))t[n]=s;break;case"id":if(Dse(s))t[n]=s;break;c
|
|
|
187
187
|
`);if(n.push(a),!c){s=a.endsWith(`
|
|
188
188
|
`);continue}let{frames:l,remaining:u}=yYe(n.join(""));n=u?[u]:[],s=u.endsWith(`
|
|
189
189
|
`);for(let p of l){if(this.resetLivenessTimer(),p.id){let f=parseInt(p.id,10);if(!isNaN(f)){if(this.seenSequenceNums.has(f))b(`SSETransport: DUPLICATE frame seq=${f} (lastSequenceNum=${this.lastSequenceNum}, seenCount=${this.seenSequenceNums.size})`,{level:"warn"}),H("warn","cli_sse_duplicate_sequence");else if(this.seenSequenceNums.add(f),this.seenSequenceNums.size>1000){let A=this.lastSequenceNum-200;for(let g of this.seenSequenceNums)if(g<A)this.seenSequenceNums.delete(g)}if(f>this.lastSequenceNum)this.lastSequenceNum=f}}if(p.event&&p.data)this.handleSSEFrame(p.event,p.data);else if(p.data)b("SSETransport: Frame has data: but no event: field — dropped",{level:"warn"}),H("warn","cli_sse_frame_missing_event_field")}}}catch(o){if(this.abortController?.signal.aborted)return;b(`SSETransport: Stream read error: ${ae(o)}`,{level:"error"}),H("error","cli_sse_stream_read_error")}finally{t.releaseLock()}if(this.state!=="closing"&&this.state!=="closed"){if(b("SSETransport: Stream ended, reconnecting"),this.state==="connected")this.connectErrorsSeen.add("stream_ended"),this.onDiagnostic?.("SSE stream ended by server, reconnecting");this.handleConnectionError()}}handleSSEFrame(e,t){if(e!=="client_event"){b(`SSETransport: Unexpected SSE event type '${e}' on worker stream`,{level:"warn"}),H("warn","cli_sse_unexpected_event_type",{event_type:e});return}let r;try{r=Gt(t)}catch(s){b(`SSETransport: Failed to parse client_event data: ${ae(s)}`,{level:"error"});return}let n=r.payload;if(n&&typeof n==="object"&&"type"in n){let s=this.sessionId?` session=${this.sessionId}`:"",o=r.device_attestation_status?` attestation=${r.device_attestation_status}`:"";if(b(`SSETransport: Event seq=${r.sequence_num} event_id=${r.event_id} event_type=${r.event_type} payload_type=${String(n.type)}${o}${s}`),H("info","cli_sse_message_received"),this.eventFilter?.(r))H("warn","cli_sse_event_filtered");else this.onData?.(Ee(n)+`
|
|
190
|
-
`)}else b(`SSETransport: Ignoring client_event with no type in payload: event_id=${r.event_id}`);this.onEventCallback?.(r)}handleConnectionError(){if(this.clearLivenessTimer(),this.state==="closing"||this.state==="closed")return;this.abortController?.abort(),this.abortController=null;let e=Date.now();if(!this.reconnectStartTime)this.reconnectStartTime=e;let t=e-this.reconnectStartTime;if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;if(this.refreshHeaders){let s=this.refreshHeaders();Object.assign(this.headers,s),b("SSETransport: Refreshed headers for reconnect")}this.state="reconnecting",this.reconnectAttempts++;let r=Math.min(dYe*Math.pow(2,this.reconnectAttempts-1),pYe),n=Math.max(0,r+r*0.25*(2*Math.random()-1));b(`SSETransport: Reconnecting in ${Math.round(n)}ms (attempt ${this.reconnectAttempts}, ${Math.round(t/1000)}s elapsed)`),H("error","cli_sse_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},n)}onLivenessTimeout=()=>{this.livenessTimer=null,b("SSETransport: Liveness timeout, reconnecting",{level:"error"}),H("error","cli_sse_liveness_timeout"),this.connectErrorsSeen.add("liveness_timeout"),this.onDiagnostic?.(`SSE liveness timeout — no frame in ${nie/1000}s, reconnecting`),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,nie)}clearLivenessTimer(){if(this.livenessTimer)clearTimeout(this.livenessTimer),this.livenessTimer=null}async write(e){let t=this.getAuthHeaders();if(Object.keys(t).length===0){b("SSETransport: No session token available for POST"),H("warn","cli_sse_post_no_token");return}let r={...t,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-client-platform":Ua(),"User-Agent":Lo()};b(`SSETransport: POST body keys=${Object.keys(e).join(",")}`);for(let n=1;n<=Fm;n++){try{let o=await Ar.post(this.postUrl,e,{headers:r,validateStatus:hYe});if(o.status===200||o.status===201){b(`SSETransport: POST success type=${e.type}`);return}if(b(`SSETransport: POST ${o.status} body=${Ee(o.data).slice(0,200)}`),o.status>=400&&o.status<500&&o.status!==429){b(`SSETransport: POST returned ${o.status} (client error), not retrying`),H("warn","cli_sse_post_client_error",{status:o.status});return}b(`SSETransport: POST returned ${o.status}, attempt ${n}/${Fm}`),H("warn","cli_sse_post_retryable_error",{status:o.status,attempt:n})}catch(o){b(`SSETransport: POST error: ${ae(o)}, attempt ${n}/${Fm}`),H("warn","cli_sse_post_network_error",{attempt:n})}if(n===Fm){b(`SSETransport: POST failed after ${Fm} attempts, continuing`),H("warn","cli_sse_post_retries_exhausted");return}let s=Math.min(AYe*Math.pow(2,n-1),gYe);await Nr(s)}}isConnectedStatus(){return this.state==="connected"}isClosedStatus(){return this.state==="closed"}setOnData(e){this.onData=e}setOnClose(e){this.onCloseCallback=e}setOnEvent(e){this.onEventCallback=e}setOnDiagnostic(e){this.onDiagnostic=e}setEventFilter(e){this.eventFilter=e}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 bYe(e){let t=e.pathname;if(t.endsWith("/stream"))t=t.slice(0,-7);return`${e.protocol}//${e.host}${t}`}et();xt();Jn();go();et();xt();var sie="DEVICE_ATTESTATION_STATUS_",oie=["UNSPECIFIED","ABSENT","VERIFIED","VERIFIED_BY_GATE","INVALID","UNCHECKED"];function EYe(e){if(e===void 0||e===null)return"UNSPECIFIED";if(typeof e==="number")return oie[e]??"UNSPECIFIED";if(typeof e!=="string")return"UNSPECIFIED";let t=e.startsWith(sie)?e.slice(sie.length):e;if(oie.includes(t))return t;return"UNSPECIFIED"}function IYe(e,t){if(e==="VERIFIED")return!0;if(e==="VERIFIED_BY_GATE")return t==="VERIFIED_BY_GATE";return!1}var vYe={enforce:!1,acceptLevel:"VERIFIED",acceptStatuses:new Set},CYe=["UNSPECIFIED","ABSENT","INVALID","UNCHECKED"],kRt=M(()=>d.object({accept_level:d.enum(["VERIFIED","VERIFIED_BY_GATE"]).default("VERIFIED"),accept_statuses:d.array(d.enum(CYe)).default([])}));var SYe;var wYe;function iie(e){let t=typeof e.payload?.type==="string"?e.payload.type:e.event_type,r=t==="user"||t==="control_response",n=EYe(e.device_attestation_status),s=SYe?.()??vYe;if(IYe(n,s.acceptLevel)){if(r)ln("bridge_event_attestation");return!1}if(!s.enforce){if(n==="UNSPECIFIED")return!1;if(r)b(`[bridge:attestation] accepting unverified ${t} event_id=${e.event_id} status=${n}`,{level:"info"}),Us("bridge_event_attestation",`${n.toLowerCase()}_${t}`);return!1}let o=s.acceptStatuses.has(n);if(r){let i=`${n.toLowerCase()}_${t}`;if(b(`[bridge:attestation] ${o?"accepting (config exception)":"DROPPING"} unverified ${t} event_id=${e.event_id} status=${n}`,{level:o?"info":"warn"}),o)Us("bridge_event_attestation",i);else{Zr("bridge_event_attestation",i);try{wYe?.({status:n,payloadType:t})}catch(a){b(`[bridge:attestation] drop notifier threw: ${ae(a)}`,{level:"error"})}}}return!o}rt();function aie(e){let t=Buffer.from(e,"base64url").toString("utf-8"),r=Gt(t);if(!r||typeof r!=="object"||!("version"in r)||r.version!==1)throw Error(`Unsupported work secret version: ${r&&typeof r==="object"&&"version"in r?r.version:"unknown"}`);let n=r;if(typeof n.session_ingress_token!=="string"||n.session_ingress_token.length===0)throw Error("Invalid work secret: missing or empty session_ingress_token");if(typeof n.api_base_url!=="string")throw Error("Invalid work secret: missing api_base_url");return r}function cie(e,t){let r=e.includes("localhost")||e.includes("127.0.0.1"),n=r?"ws":"wss",s=r?"v2":"v1",o=e.replace(/^https?:\/\//,"").replace(/\/+$/,"");return`${n}://${o}/${s}/session_ingress/ws/${t}`}function cN(e,t){if(e===t)return!0;let r=e.slice(e.lastIndexOf("_")+1),n=t.slice(t.lastIndexOf("_")+1);return r.length>=4&&r===n}function lie(e,t){return`${e.replace(/\/+$/,"")}/v1/code/sessions/${t}`}async function uie(e,t){let r=await Ar.post(`${e}/worker/register`,{},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json","anthropic-version":"2023-06-01"},timeout:1e4}),n=r.data?.worker_epoch,s=typeof n==="string"?Number(n):n;if(typeof s!=="number"||!Number.isFinite(s)||!Number.isSafeInteger(s))throw Error(`registerWorker: invalid worker_epoch in response: ${Ee(r.data)}`);return s}function die(e){return{write:(t)=>e.write(t),writeBatch:(t)=>e.writeBatch(t),close:()=>e.close(),isConnectedStatus:()=>e.isConnectedStatus(),getStateLabel:()=>e.getStateLabel(),setOnData:(t)=>e.setOnData(t),setOnClose:(t)=>e.setOnClose(t),setOnConnect:(t)=>e.setOnConnect(t),connect:()=>void e.connect(),getLastSequenceNum:()=>0,get droppedBatchCount(){return e.droppedBatchCount},reportState:()=>{},reportMetadata:()=>{},reportDelivery:()=>{},flush:()=>Promise.resolve()}}async function pie(e){let{sessionUrl:t,ingressToken:r,sessionId:n,initialSequenceNum:s,getAuthToken:o}=e,i;if(o)i=()=>{let h=o();if(!h)return{};return{Authorization:`Bearer ${h}`}};else Dg(r);let a=e.epoch??await uie(t,r);b(`[bridge:repl] CCR v2: worker sessionId=${n} epoch=${a}${e.epoch!==void 0?" (from /bridge)":" (via registerWorker)"}`);let c=new URL(t);c.pathname=c.pathname.replace(/\/$/,"")+"/worker/events/stream";let l=new aN(c,{},n,void 0,s,i),u,p=new iN(l,new URL(t),{getAuthHeaders:i,heartbeatIntervalMs:e.heartbeatIntervalMs,heartbeatJitterFraction:e.heartbeatJitterFraction,onEpochMismatch:()=>{b("[bridge:repl] CCR v2: epoch superseded (409) — closing for poll-loop recovery");try{p.close(),l.close(),u?.(4090)}catch(h){b(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${ae(h)}`,{level:"error"})}throw Error("epoch superseded")}});l.setOnEvent((h)=>{p.reportDelivery(h.event_id,"received"),p.reportDelivery(h.event_id,"processed")}),l.setEventFilter(iie);let f,A=!1,g=!1;return{write(h){return p.writeEvent(h)},async writeBatch(h){for(let m of h){if(g)break;await p.writeEvent(m)}},close(){g=!0,p.close(),l.close()},isConnectedStatus(){return A},getStateLabel(){if(l.isClosedStatus())return"closed";if(l.isConnectedStatus())return A?"connected":"init";return"connecting"},setOnData(h){l.setOnData(h)},setOnClose(h){u=h,l.setOnClose((m)=>{p.close(),h(m??4092)})},setOnConnect(h){f=h},getLastSequenceNum(){return l.getLastSequenceNum()},droppedBatchCount:0,reportState(h,m){p.reportState(h,m)},reportMetadata(h){p.reportMetadata(h)},reportDelivery(h,m){p.reportDelivery(h,m)},flush(){return p.flush()},getInternalEventWriter(){return(h,m,y)=>p.writeInternalEvent(h,m,y)},getInternalEventReaders(){return{readMain:()=>p.readInternalEvents(),readSubagents:()=>p.readSubagentInternalEvents()}},connect(){if(!e.outboundOnly)l.connect();p.initialize(a).then(()=>{A=!0,b(`[bridge:repl] v2 transport ready for writes (epoch=${a}, sse=${l.isConnectedStatus()?"open":"opening"})`),f?.()},(h)=>{b(`[bridge:repl] CCR v2 initialize failed: ${ae(h)}`,{level:"error"}),p.close(),l.close(),u?.(4091)})}}}go();et();xt();var xYe="2023-06-01",_Ye="ccr-byoc-2025-07-29";async function fie({environmentId:e,title:t,tags:r,signal:n},s){let{baseUrl:o,getAccessToken:i,orgUUID:a,model:c}=s,l=i();if(!l)return b("[bridge] No access token for session creation"),null;let u=`${o}/v1/sessions`,p;try{p=await Ar.post(u,{title:t,events:[],session_context:{sources:[],outcomes:[],model:c},...{environment_id:e},source:"remote-control",...r!==void 0&&{tags:r}},{headers:Uv(l,{orgUUID:a}),signal:n,validateStatus:(A)=>A<500})}catch(A){return b(`[bridge] Session creation request failed: ${ae(A)}`),null}if(p.status!==200&&p.status!==201){let A=gl(p.data);return b(`[bridge] Session creation failed with status ${p.status}${A?`: ${A}`:""}`),null}let f=p.data;if(!f||typeof f!=="object"||!("id"in f)||typeof f.id!=="string")return b("[bridge] No session ID in response"),null;return f.id}async function Aie(e,t){let{baseUrl:r,getAccessToken:n,orgUUID:s}=t,o=n();if(!o){b("[bridge] No access token for session archive");return}let i=`${r}/v1/sessions/${e}/archive`;b(`[bridge] Archiving session ${e}`);try{let a=await Ar.post(i,{},{headers:Uv(o,{orgUUID:s}),timeout:1e4,validateStatus:(c)=>c<500});if(a.status===200||a.status===409)b(`[bridge] Session ${e} archived successfully`);else{let c=gl(a.data);b(`[bridge] Session archive failed with status ${a.status}${c?`: ${c}`:""}`)}}catch(a){b(`[bridge] Session archive request failed: ${ae(a)}`)}}async function Nv(e,t,r,n,s,o,i){let a=e==="subscribe"?"bridge_pr_subscribe":"bridge_pr_unsubscribe",c=o();if(!c)return b(`[bridge] No access token for ${e}-pr`),Zr(a,"no_token"),!1;let l=`${s}/v1/code/github/${e}-pr`,u={session_id:ip(t),repo:r,pr_number:n},p;try{p=await Ar.post(l,u,{headers:Uv(c,{trustedDeviceToken:await i?.()}),timeout:1e4,validateStatus:(A)=>A<500})}catch(A){return b(`[bridge] ${e}-pr request failed: ${ae(A)}`),Zr(a,"request_failed"),!1}if(!(p.status>=200&&p.status<300||p.status===409)){let A=gl(p.data);return b(`[bridge] ${e}-pr failed ${p.status}${A?`: ${A}`:""}`),Zr(a,"http_error"),!1}return b(`[bridge] ${e}-pr ${r}#${n} ok`),ln(a),!0}async function Ov(e,t,r,n,s,o,i){let a=e==="subscribe"?"bridge_slack_subscribe":"bridge_slack_unsubscribe",c=o();if(!c)return b(`[bridge] No access token for ${e}-thread`),Zr(a,"no_token"),!1;let l=`${s}/v1/code/slack/${e}-thread`,u={session_id:ip(t),channel:r,thread_ts:n},p;try{p=await Ar.post(l,u,{headers:Uv(c,{trustedDeviceToken:await i?.()}),timeout:1e4,validateStatus:(A)=>A<500})}catch(A){return b(`[bridge] ${e}-thread request failed: ${ae(A)}`),Zr(a,"request_failed"),!1}if(!(p.status>=200&&p.status<300||p.status===409)){let A=gl(p.data);return b(`[bridge] ${e}-thread failed ${p.status}${A?`: ${A}`:""}`),Zr(a,"http_error"),!1}return b(`[bridge] ${e}-thread ${r}/${n} ok`),ln(a),!0}function Uv(e,{orgUUID:t,trustedDeviceToken:r}={}){let n={Authorization:`Bearer ${e}`,"Content-Type":"application/json","anthropic-version":xYe,"anthropic-beta":_Ye,"anthropic-client-platform":Ua(),"User-Agent":Lo()};if(t!==void 0)n["x-organization-uuid"]=t;if(r!==void 0)n["X-Trusted-Device-Token"]=r;return n}var Cie=2000,Eie=60000,Iie=900000,FYe=300000,vie=3;function Sie(e){return e*(0.8+Math.random()*0.4)}var LYe=0;async function wie(e){let{dir:t,registrationDir:r,machineName:n,branch:s,gitRepoUrl:o,title:i,baseUrl:a,sessionIngressUrl:c,workerType:l,getAccessToken:u,createSession:p,archiveSession:f,getCurrentTitle:A=()=>i,toSDKMessages:g=()=>{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:h,getTrustedDeviceToken:m,getPollIntervalConfig:y=()=>ug,initialHistoryCap:w=200,initialMessages:C,previouslyFlushedUUIDs:v,onInboundMessage:B,onPermissionResponse:P,onInterrupt:R,onSetModel:V,onSetMaxThinkingTokens:Y,onSetPermissionMode:he,onRenameSession:He,onSetColor:Ae,onFileSuggestions:ne,onReadFile:Pe,onMcpAuthenticate:vt,onMcpOauthCallbackUrl:N,onMcpReconnect:yt,onMcpStatus:ie,onStateChange:de,onUserMessage:Ft,onSessionEstablished:Ct,onInitError:ee,perpetual:U,initialSSESequenceNum:we=0,onTransportPersistenceReady:_e,onTransportPersistenceTeardown:qe}=e,Kt=++LYe,{writeBridgePointer:tr,clearBridgePointer:Xe,readBridgePointer:Un}=await Promise.resolve().then(() => (yie(),hie)),ls=U?await Un(t):null,at=ls?.source==="repl"?ls:null;b(`[bridge:repl] initBridgeCore #${Kt} starting (initialMessages=${C?.length??0}${at?` perpetual prior=env:${at.environmentId}`:""})`);let ct=joe({baseUrl:a,getAccessToken:u,runnerVersion:"0.3.166",onDebug:b,onAuth401:h,getTrustedDeviceToken:m}),gt={dir:r??t,machineName:n,branch:s,gitRepoUrl:o,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:bie(),workerType:l,environmentId:bie(),reuseEnvironmentId:at?.environmentId,apiBaseUrl:a,sessionIngressUrl:c},te,Qs;try{let L=await ct.registerBridgeEnvironment(gt);te=L.environment_id,Qs=L.environment_secret}catch(L){if(Loe("registration_failed",`[bridge:repl] Environment registration failed: ${ae(L)}`),ee?.(`[bridge:repl] Environment registration failed: ${ae(L)}`),at&&L instanceof cs&&(L.status===410||L.status!==401&&Dv(L.errorType)))await Xe(t);return de?.("failed",ae(L)),null}b(`[bridge:repl] Environment registered: ${te}`),H("info","bridge_repl_env_registered"),Ye("tengu_bridge_repl_env_registered",{});async function Fa(L,ce){if(te!==L)return b(`[bridge:repl] Env mismatch (requested ${L}, got ${te}) — cannot reconnect in place`),!1;let lt=Um(ce),je=lt===ce?[ce]:[ce,lt];for(let Me of je)try{return await ct.reconnectSession(te,Me),b(`[bridge:repl] Reconnected session ${Me} in place on env ${te}`),!0}catch(Zt){b(`[bridge:repl] reconnectSession(${Me}) failed: ${ae(Zt)}`)}return b("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let Ri=at?await Fa(at.environmentId,at.sessionId):!1;if(at&&!Ri)await Xe(t);let ye,Fn=new Set,lr=new Map,Rs=new Set;if(Ri&&at){if(ye=at.sessionId,b(`[bridge:repl] Perpetual session reused: ${ye}`),C&&v)for(let L of C)v.add(L.uuid)}else{let L=await p({environmentId:te,title:i,gitRepoUrl:o,branch:s,signal:AbortSignal.timeout(15000)});if(!L)return b("[bridge:repl] Session creation failed, deregistering environment"),ee?.("[bridge:repl] Session creation failed, deregistering environment"),Ye("tengu_bridge_repl_session_failed",{}),await ct.deregisterEnvironment(te).catch(()=>{}),de?.("failed","Session creation failed"),null;ye=L,b(`[bridge:repl] Session created: ${ye}`)}Ct?.(ye),await tr(t,{sessionId:ye,environmentId:te,source:"repl"}),H("info","bridge_repl_session_created"),Ye("tengu_bridge_repl_started",{has_initial_messages:!!(C&&C.length>0),inProtectedNamespace:NO(),...soe()});let Ti=new Set;if(C)for(let L of C)Ti.add(L.uuid);let Ts=new Pv(2000);for(let L of Ti)Ts.add(L);let Di=new Pv(2000),_r=new AbortController,ge=null,us=0,Pr=Ri?we:0,ut=null,po=null,lp=Joe(_r.signal),Pi=lp.wake,La=lp.signal,Ln=new sN,up=!Ft,$a=3,mr=0,Mr=null;async function fo(){if(Mr)return Mr;Mr=Mi();try{return await Mr}finally{Mr=null}}async function Mi(){if(mr++,us++,b(`[bridge:repl] Reconnecting after env lost (attempt ${mr}/${$a})`),mr>$a)return b(`[bridge:repl] Environment reconnect limit reached (${$a}), giving up`),!1;if(ge){let Me=ge.getLastSequenceNum();if(Me>Pr)Pr=Me;qe?.(),ge.close(),ge=null}if(Pi(),Ln.drop(),ut){let Me=ut;if(await ct.stopWork(te,Me,!1).catch(()=>{}),ut!==Me)return b("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),mr=0,!0;ut=null,po=null}if(_r.signal.aborted)return b("[bridge:repl] Reconnect aborted by teardown"),!1;let L=te;gt.reuseEnvironmentId=L;let ce;for(let Me=1;;Me++)try{ce=await ct.registerBridgeEnvironment(gt);break}catch(Zt){if(Zt instanceof cs||Me>=vie||_r.signal.aborted)return gt.reuseEnvironmentId=void 0,b(`[bridge:repl] Environment re-registration failed (attempt ${Me}): ${ae(Zt)}`),!1;let $m=Sie(Cie*2**(Me-1));if(b(`[bridge:repl] Environment re-registration transient failure (attempt ${Me}/${vie}), retrying in ${Math.round($m)}ms: ${ae(Zt)}`),await Nr($m,_r.signal),_r.signal.aborted)return gt.reuseEnvironmentId=void 0,!1}if(te=ce.environment_id,Qs=ce.environment_secret,gt.reuseEnvironmentId=void 0,b(`[bridge:repl] Re-registered: requested=${L} got=${te}`),_r.signal.aborted)return b("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await ct.deregisterEnvironment(te).catch(()=>{}),!1;if(ge!==null)return b("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),mr=0,!0;if(await Fa(L,ye))return Ye("tengu_bridge_repl_reconnected_in_place",{}),mr=0,!0;if(te!==L)Ye("tengu_bridge_repl_env_expired_fresh_session",{});if(await f(ye),_r.signal.aborted)return b("[bridge:repl] Reconnect aborted after archive, cleaning up"),await ct.deregisterEnvironment(te).catch(()=>{}),!1;let lt=A(),je=await p({environmentId:te,title:lt,gitRepoUrl:o,branch:s,signal:AbortSignal.timeout(15000)});if(!je)return b("[bridge:repl] Session creation failed during reconnection"),!1;if(_r.signal.aborted)return b("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await f(je),!1;if(ye=je,aoe(ip(je)).catch(()=>{}),Ct?.(ye),Pr=0,Di.clear(),up=!Ft,b(`[bridge:repl] Re-created session: ${ye}`),await tr(t,{sessionId:ye,environmentId:te,source:"repl"}),v?.clear(),Fn.size>0){b(`[bridge:repl] Replaying ${Fn.size} PR subscription(s) against new session`);for(let Me of Fn){let Zt=Me.lastIndexOf("#");Nv("subscribe",ye,Me.slice(0,Zt),Number(Me.slice(Zt+1)),a,u,m)}}if(Rs.size>0){b(`[bridge:repl] Replaying ${Rs.size} Slack thread subscription(s) against new session`);for(let Me of Rs){let Zt=Me.indexOf("/");Ov("subscribe",ye,Me.slice(0,Zt),Me.slice(Zt+1),a,u,m)}}return mr=0,!0}function ja(){return u()}function Ni(){let L=Ln.end();if(L.length===0)return;if(!ge){b(`[bridge:repl] Cannot drain ${L.length} pending message(s): no transport`);return}for(let je of L)Ts.add(je.uuid);let lt=g(L).map((je)=>({...je,session_id:ye}));b(`[bridge:repl] Drained ${L.length} pending message(s) after flush`),ge.writeBatch(lt)}let $v=null;function jv(){$v?.()}function pN(L){if(b(`[bridge:repl] Transport permanently closed: code=${L}`),Ye("tengu_bridge_repl_ws_closed",{code:L}),ge){let lt=ge.getLastSequenceNum();if(lt>Pr)Pr=lt;qe?.(),ge=null}Pi();let ce=Ln.drop();if(ce>0)b(`[bridge:repl] Dropping ${ce} pending message(s) on transport close (code=${L})`,{level:"warn"});if(L===1000){de?.("failed","session ended"),_r.abort(),jv();return}de?.("reconnecting",`Remote Control connection lost (code ${L})`),b(`[bridge:repl] Transport reconnect budget exhausted (code=${L}), attempting env reconnect`),fo().then((lt)=>{if(lt)return;if(_r.signal.aborted)return;b("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),Ye("tengu_bridge_repl_reconnect_failed",{close_code:L}),de?.("failed","reconnection failed"),jv()})}let fN,kie=null,Bie={api:ct,getCredentials:()=>({environmentId:te,environmentSecret:Qs}),signal:_r.signal,getPollIntervalConfig:y,onStateChange:de,getWsState:()=>ge?.getStateLabel()??"null",isAtCapacity:()=>ge!==null,capacitySignal:La,onFatalError:jv,getHeartbeatInfo:()=>{if(!ut||!po)return null;return{environmentId:te,workId:ut,sessionToken:po}},onHeartbeatFatal:(L)=>{if(b(`[bridge:repl] heartbeatWork fatal (status=${L.status}) — tearing down work item for fast re-dispatch`),ge){let ce=ge.getLastSequenceNum();if(ce>Pr)Pr=ce;qe?.(),ge.close(),ge=null}if(Ln.drop(),ut)ct.stopWork(te,ut,!1).catch((ce)=>{b(`[bridge:repl] stopWork after heartbeat fatal: ${ae(ce)}`)});ut=null,po=null,Pi(),de?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await fo())return null;return{environmentId:te,environmentSecret:Qs}},onWorkReceived:(L,ce,lt,je)=>{if(ge?.isConnectedStatus())b(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${lt})`);if(b(`[bridge:repl] Work received: workId=${lt} workSessionId=${L} currentSessionId=${ye} match=${cN(L,ye)}`),tr(t,{sessionId:ye,environmentId:te,source:"repl"}),!cN(L,ye)){b(`[bridge:repl] Rejecting foreign session: expected=${ye} got=${L}`);return}ut=lt,po=ce;let Me=je||Ge(process.env.CLAUDE_BRIDGE_USE_CCR_V2),Zt;if(!Me){if(Zt=ja(),!Zt){b("[bridge:repl] No OAuth token available for session ingress, skipping work");return}Dg(Zt)}if(Ye("tengu_bridge_repl_work_received",{}),ge){qe?.();let rr=ge;ge=null;let ur=rr.getLastSequenceNum();if(ur>Pr)Pr=ur;rr.close()}Ln.deactivate();let $m=(rr)=>Woe(rr,{transport:ge,sessionId:ye,onInterrupt:R,onSetModel:V,onSetMaxThinkingTokens:Y,onSetPermissionMode:he,onRenameSession:He,onSetColor:Ae,onFileSuggestions:ne,onReadFile:Pe,onMcpAuthenticate:vt,onMcpOauthCallbackUrl:N,onMcpReconnect:yt,onMcpStatus:ie}),Gv=!1,gN=(rr)=>{if(ge=rr,rr.setOnConnect(()=>{if(ge!==rr)return;if(b("[bridge:repl] Ingress transport connected"),Ye("tengu_bridge_repl_ws_connected",{}),!Me){let ur=ja();if(ur)Dg(ur)}if(qv=!1,!Gv&&C&&C.length>0){Gv=!0;let ur=w,gn=C.filter((jm)=>rN(jm)&&!v?.has(jm.uuid)),$o=ur>0&&gn.length>ur?gn.slice(-ur):gn;if($o.length<gn.length)b(`[bridge:repl] Capped initial flush: ${gn.length} -> ${$o.length} (cap=${ur})`),Ye("tengu_bridge_repl_history_capped",{eligible_count:gn.length,capped_count:$o.length});let Oi=g($o);if(Oi.length>0){b(`[bridge:repl] Flushing ${Oi.length} initial message(s) via transport`);let jm=Oi.map((ml)=>({...ml,session_id:ye,historical:!0})),mN=rr.droppedBatchCount;rr.writeBatch(jm).then(()=>{if(rr.droppedBatchCount>mN){b(`[bridge:repl] Initial flush dropped ${rr.droppedBatchCount-mN} batch(es) — not marking ${Oi.length} UUID(s) as flushed`);return}if(v){for(let ml of Oi)if(ml.uuid)v.add(ml.uuid)}}).catch((ml)=>b(`[bridge:repl] Initial flush failed: ${ml}`)).finally(()=>{if(ge!==rr)return;Ni(),de?.("connected")})}else Ni(),de?.("connected")}else if(!Ln.active)de?.("connected")}),rr.setOnData((ur)=>{Voe(ur,Ts,Di,B,P,$m)}),kie=pN,rr.setOnClose((ur)=>{if(ge!==rr)return;pN(ur)}),!Gv&&C&&C.length>0)Ln.start();rr.connect()};if(us++,Me){let rr=lie(a,L),ur=us;b(`[bridge:repl] CCR v2: sessionUrl=${rr} session=${L} gen=${ur}`),pie({sessionUrl:rr,ingressToken:ce,sessionId:L,initialSequenceNum:Pr}).then((gn)=>{if(_r.signal.aborted){gn.close();return}if(ur!==us){b(`[bridge:repl] CCR v2: discarding stale handshake gen=${ur} current=${us}`),gn.close();return}if(gN(gn),_e){let $o=gn.getInternalEventWriter?.(),Oi=gn.getInternalEventReaders?.();if($o&&Oi)_e($o,Oi)}},(gn)=>{if(b(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${ae(gn)}`,{level:"error"}),Ye("tengu_bridge_repl_ccr_v2_init_failed",{}),ur!==us)return;if(ut)ct.stopWork(te,ut,!1).catch(($o)=>{b(`[bridge:repl] stopWork after v2 init failure: ${ae($o)}`)}),ut=null,po=null;Pi()})}else{let rr=cie(c,L);b(`[bridge:repl] Ingress URL: ${rr}`),b(`[bridge:repl] Creating HybridTransport: session=${L}`);let ur=Zt??"";gN(die(new HM(new URL(rr),{Authorization:`Bearer ${ur}`,"anthropic-version":"2023-06-01"},L,()=>({Authorization:`Bearer ${ja()??ur}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{de?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),Pi()}})))}}};$Ye(Bie);let zv=U?setInterval(()=>{if(Mr)return;tr(t,{sessionId:ye,environmentId:te,source:"repl"})},3600000):null;zv?.unref?.();let AN=y().session_keepalive_interval_v2_ms,Hv=AN>0?setInterval(()=>{if(!ge)return;b("[bridge:repl] keep_alive sent"),ge.write({type:"keep_alive"}).catch((L)=>{b(`[bridge:repl] keep_alive write failed: ${ae(L)}`)})},AN):null;Hv?.unref?.();let qv=!1;$v=async()=>{if(qv){b(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${te} session=${ye}`);return}qv=!0,qe?.();let L=Date.now();if(b(`[bridge:repl] Teardown starting: env=${te} session=${ye} workId=${ut??"none"} transportState=${ge?.getStateLabel()??"null"}`),zv!==null)clearInterval(zv);if(Hv!==null)clearInterval(Hv);if(fN)process.off("SIGUSR2",fN);if(_r.abort(),b("[bridge:repl] Teardown: poll loop aborted"),ge){let je=ge.getLastSequenceNum();if(je>Pr)Pr=je}if(U){ge=null,Ln.drop(),await tr(t,{sessionId:ye,environmentId:te,source:"repl"}),b(`[bridge:repl] Teardown (perpetual): leaving env=${te} session=${ye} alive on server, duration=${Date.now()-L}ms`);return}let ce=ge;if(ge=null,Ln.drop(),ce)ce.write(nN(ye));let lt=ut?ct.stopWork(te,ut,!0).then(()=>{b("[bridge:repl] Teardown: stopWork completed")}).catch((je)=>{b(`[bridge:repl] Teardown stopWork failed: ${ae(je)}`)}):Promise.resolve();await Promise.all([lt,f(ye)]),ce?.close(),b("[bridge:repl] Teardown: transport closed"),await ct.deregisterEnvironment(te).catch((je)=>{b(`[bridge:repl] Teardown deregister failed: ${ae(je)}`)}),await Xe(t),b(`[bridge:repl] Teardown complete: env=${te} duration=${Date.now()-L}ms`)},b(`[bridge:repl] Ready: env=${te} session=${ye}`),de?.("ready");let Lm={get bridgeSessionId(){return ye},outboundOnly:!1,get environmentId(){return te},getLastSequenceNum(){return Lm.getSSESequenceNum()},flush(){return ge?.flush()??Promise.resolve()},getSSESequenceNum(){let L=ge?.getLastSequenceNum()??0;return Math.max(Pr,L)},sessionIngressUrl:c,writeMessages(L){let ce=L.filter((Me)=>rN(Me)&&!Ti.has(Me.uuid)&&!Ts.has(Me.uuid)&&!Di.has(Me.uuid));if(ce.length===0)return;if(!up)for(let Me of ce){let Zt=Goe(Me);if(Zt!==void 0&&Ft?.(Zt,ye)){up=!0;break}}if(Ln.enqueue(...ce)){b(`[bridge:repl] Queued ${ce.length} message(s) during initial flush`);return}if(!ge){let Me=ce.map((Zt)=>Zt.type).join(",");b(`[bridge:repl] Transport not configured, dropping ${ce.length} message(s) [${Me}] for session=${ye}`,{level:"warn"});return}for(let Me of ce)Ts.add(Me.uuid);b(`[bridge:repl] Sending ${ce.length} message(s) via transport`);let je=g(ce).map((Me)=>({...Me,session_id:ye}));ge.writeBatch(je)},writeSdkMessages(L){let ce=L.filter((je)=>!je.uuid||!Ts.has(je.uuid));if(ce.length===0)return;if(!ge){b(`[bridge:repl] Transport not configured, dropping ${ce.length} SDK message(s) for session=${ye}`,{level:"warn"});return}for(let je of ce)if(je.uuid)Ts.add(je.uuid);let lt=ce.map((je)=>({...je,session_id:ye}));ge.writeBatch(lt)},sendControlRequest(L){if(!ge){b("[bridge:repl] Transport not configured, skipping control_request");return}let ce={...L,session_id:ye};ge.write(ce),b(`[bridge:repl] Sent control_request request_id=${L.request_id}`)},sendControlResponse(L){if(!ge){b("[bridge:repl] Transport not configured, skipping control_response");return}let ce={...L,session_id:ye};ge.write(ce),b("[bridge:repl] Sent control_response")},sendControlCancelRequest(L){if(!ge){b("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let ce={type:"control_cancel_request",request_id:L,session_id:ye};ge.write(ce),b(`[bridge:repl] Sent control_cancel_request request_id=${L}`)},reportMetadata(L){ge?.reportMetadata(L)},sendResult(){if(!ge){b(`[bridge:repl] sendResult: skipping, transport not configured session=${ye}`);return}ge.write(nN(ye)),b(`[bridge:repl] Sent result for session=${ye}`)},async subscribePR(L,ce,lt){let je=`${L}#${ce}`,Me=lr.get(je);if(lt)lr.set(je,{agentId:lt,repo:L,prNumber:ce});let Zt=await Nv("subscribe",ye,L,ce,a,u,m);if(Zt)Fn.add(je);else if(lt)if(Me)lr.set(je,Me);else lr.delete(je);return Zt},async unsubscribePR(L,ce){let lt=await Nv("unsubscribe",ye,L,ce,a,u,m);if(lt){let je=`${L}#${ce}`;Fn.delete(je),lr.delete(je)}return lt},async subscribeSlackThread(L,ce){let lt=await Ov("subscribe",ye,L,ce,a,u,m);if(lt)Rs.add(`${L}/${ce}`);return lt},async unsubscribeSlackThread(L,ce){let lt=await Ov("unsubscribe",ye,L,ce,a,u,m);if(lt)Rs.delete(`${L}/${ce}`);return lt},getPRWebhookTargets(){return[...lr.values()]},async teardown(){Qie(),await $v?.(),b("[bridge:repl] Torn down"),Ye("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return Lm.teardown()}},Qie=Wi(Lm);return Lm}async function $Ye({api:e,getCredentials:t,signal:r,onStateChange:n,onWorkReceived:s,onEnvironmentLost:o,getWsState:i,isAtCapacity:a,capacitySignal:c,onFatalError:l,getPollIntervalConfig:u=()=>ug,getHeartbeatInfo:p,onHeartbeatFatal:f}){b(`[bridge:repl] Starting work poll loop for env=${t().environmentId}`);let g=0,h=null,m=null,y=0,w=0,C=!1;while(!r.aborted){let{environmentId:v,environmentSecret:B}=t(),P=u();try{let R=await e.pollForWork(v,B,r,P.reclaim_older_than_ms);if(w=0,g>0)b(`[bridge:repl] Poll recovered after ${g} consecutive error(s)`),g=0,h=null,m=null,y=0,n?.("ready");if(!R){let Y=C;if(C=!1,a?.()&&c&&!Y){let he=P.poll_interval_ms_at_capacity;if(P.non_exclusive_heartbeat_interval_ms>0&&p){Ye("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:P.non_exclusive_heartbeat_interval_ms});let Ae=he>0?Date.now()+he:null,ne=!1,Pe=0;while(!r.aborted&&a()&&(Ae===null||Date.now()<Ae)){let N=u();if(N.non_exclusive_heartbeat_interval_ms<=0)break;let yt=p();if(!yt)break;let ie=c();try{await e.heartbeatWork(yt.environmentId,yt.workId,yt.sessionToken)}catch(de){if(b(`[bridge:repl:heartbeat] Failed: ${ae(de)}`),de instanceof cs){if(ie.cleanup(),Ye("tengu_bridge_heartbeat_error",{status:de.status,error_type:JF(de.status===401||de.status===403?"auth_failed":"fatal")}),f)f(de),b(`[bridge:repl:heartbeat] Fatal (status=${de.status}), work state cleared — fast-polling for re-dispatch`);else ne=!0;break}}Pe++,await Nr(N.non_exclusive_heartbeat_interval_ms,ie.signal),ie.cleanup()}let vt=ne?"error":r.aborted?"shutdown":!a()?"capacity_changed":Ae!==null&&Date.now()>=Ae?"poll_due":"config_disabled";if(Ye("tengu_bridge_heartbeat_mode_exited",{reason:zl(vt),heartbeat_cycles:Pe}),!ne){if(vt==="poll_due")b(`[bridge:repl] Heartbeat poll_due after ${Pe} cycles — falling through to pollForWork`);continue}}let He=he>0?he:P.non_exclusive_heartbeat_interval_ms;if(He>0){let Ae=c(),ne=Date.now();await Nr(He,Ae.signal),Ae.cleanup();let Pe=Date.now()-ne-He;if(Pe>60000)b(`[bridge:repl] At-capacity sleep overran by ${Math.round(Pe/1000)}s — process suspension detected, forcing one fast-poll cycle`),Ye("tengu_bridge_repl_suspension_detected",{overrun_ms:Pe}),C=!0}}else await Nr(P.poll_interval_ms_not_at_capacity,r);continue}let V;try{V=aie(R.secret)}catch(Y){b(`[bridge:repl] Failed to decode work secret: ${ae(Y)}`),Ye("tengu_bridge_repl_work_secret_failed",{}),await e.stopWork(v,R.id,!1).catch(()=>{});continue}b(`[bridge:repl] Acknowledging workId=${R.id}`);try{await e.acknowledgeWork(v,R.id,V.session_ingress_token)}catch(Y){b(`[bridge:repl] Acknowledge failed workId=${R.id}: ${ae(Y)}`)}if(R.data.type==="healthcheck"){b("[bridge:repl] Healthcheck received");continue}if(R.data.type==="session"){let Y=R.data.id;try{On(Y,"session_id")}catch{b(`[bridge:repl] Invalid session_id in work: ${Y}`);continue}s(Y,V.session_ingress_token,R.id,V.use_code_sessions===!0),b("[bridge:repl] Work accepted, continuing poll loop")}}catch(R){if(r.aborted)break;if(R instanceof cs&&R.status===404&&o){let N=t().environmentId;if(v!==N){b(`[bridge:repl] Stale poll error for old env=${v}, current env=${N} — skipping onEnvironmentLost`),g=0,h=null;continue}if(w++,b(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${w}/3)`),Ye("tengu_bridge_repl_env_lost",{attempt:w}),w>3){b("[bridge:repl] Environment re-registration limit reached (3), giving up"),n?.("failed","Environment deleted and re-registration limit reached"),l?.();break}n?.("reconnecting","environment lost, recreating session");let yt=await o();if(r.aborted)break;if(yt){g=0,h=null,n?.("ready"),b(`[bridge:repl] Re-registered environment: ${yt.environmentId}`);continue}n?.("failed","Environment deleted and re-registration failed"),l?.();break}if(R instanceof cs){let N=Dv(R.errorType),yt=zoe(R);if(b(`[bridge:repl] Fatal poll error: ${R.message} (status=${R.status}, type=${R.errorType??"unknown"})${yt?" (suppressed)":""}`),Ye("tengu_bridge_repl_fatal_error",{status:R.status,error_type:R.errorType}),H(N?"info":"error","bridge_repl_fatal_error",{status:R.status,error_type:R.errorType}),!yt)n?.("failed",N?"Remote Control session expired.":R.message);l?.();break}let V=Date.now();if(m!==null&&V-m>Math.max(Eie,y)*2)b(`[bridge:repl] Detected system sleep (${Math.round((V-m)/1000)}s gap), resetting poll error budget`),H("info","bridge_repl_poll_sleep_detected",{gapMs:V-m}),g=0,h=null;if(m=V,g++,h===null)h=V;let Y=V-h,he=Uoe(R),He=Ooe(R),Ae=i?.()??"unknown";if(b(`[bridge:repl] Poll error (attempt ${g}, elapsed ${Math.round(Y/1000)}s, ws=${Ae}): ${He}`),Ye("tengu_bridge_repl_poll_error",{status:he,consecutiveErrors:g,elapsedMs:Y}),g===1)n?.("reconnecting",He);if(Y>=Iie){b(`[bridge:repl] Poll failures exceeded ${Iie/1000}s (${g} errors), giving up`),H("info","bridge_repl_poll_give_up"),Ye("tengu_bridge_repl_poll_give_up",{consecutiveErrors:g,elapsedMs:Y,lastStatus:he}),n?.("failed","connection to server lost");break}let ne=Foe(R),Pe=Math.min(Cie*2**(g-1),Eie),vt=Sie(ne!==void 0?Math.max(Pe,Math.min(ne,FYe)):Pe);if(y=vt,u().non_exclusive_heartbeat_interval_ms>0){let N=p?.();if(N)try{await e.heartbeatWork(N.environmentId,N.workId,N.sessionToken)}catch{}}await Nr(vt,r)}}b(`[bridge:repl] Work poll loop ended (aborted=${r.aborted}) env=${t().environmentId}`)}function jYe(e,t){return e?.includes("_staging_")===!0||t?.includes("staging")===!0}function zYe(e,t){return e?.includes("_local_")===!0||t?.includes("localhost")===!0}function HYe(e,t){if(zYe(e,t))return"http://localhost:4000";if(jYe(e,t))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function xie(e,t,r){let{toCompatSessionId:n}=Nie(Poe),s=n(e),i=`${HYe(s,t)}/code/${s}`;return r?`${i}?${new URLSearchParams(r)}`:i}et();async function _ie(e){let{dir:t,registrationDir:r,name:n="Assistant",workerType:s="claude_code_assistant",branch:o="",gitRepoUrl:i=null,getAccessToken:a,getTrustedDeviceToken:c,baseUrl:l,orgUUID:u,model:p,perpetual:f=!1,initialSSESequenceNum:A,onConflict:g}=e,h=e.onAuth401;if(!a())return b("[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 m=l,y={baseUrl:l,getAccessToken:a,orgUUID:u,model:p},w=[],C=null,v=[],B=null,P=[],R=null,V=!1,Y=null,he={detail:null},He=qYe(),Ae=()=>wie({dir:t,registrationDir:r,machineName:He,branch:o,gitRepoUrl:i,title:n,baseUrl:l,sessionIngressUrl:m,workerType:s,getAccessToken:a,getTrustedDeviceToken:c,onAuth401:h,onInitError:console.error,createSession:({environmentId:ie,title:de,signal:Ft})=>fie({environmentId:ie,title:de,tags:["claude-code-assistant"],signal:Ft},y),archiveSession:(ie)=>Aie(ie,y),perpetual:f,initialSSESequenceNum:A,getCurrentTitle:()=>n,getPollIntervalConfig:()=>({...ug,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(ie){let de=rK(ie);if(!de)return;w.push({content:de.content,uuid:de.uuid}),C?.(),C=null},onInterrupt(){v.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),B?.(),B=null},onSetModel(ie){v.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:ie}}),B?.(),B=null},onSetMaxThinkingTokens(ie){v.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:ie}}),B?.(),B=null},onPermissionResponse(ie){P.push(ie),R?.(),R=null},onStateChange(ie,de){if(Y?.(ie,de),ie==="failed")he.detail=de??"unknown failure",V=!0,C?.(),B?.(),R?.()}}),ne=await Ae();if(!ne&&g&&he.detail?.includes("409")){if(await g({machineName:He,message:he.detail})==="takeover")V=!1,he.detail=null,ne=await Ae()}if(!ne){let ie=he.detail??"initBridgeCore returned null (env registration or session creation failed)";return b(`[bridge:daemon] connectRemoteControl failed: ${ie}`),{ok:!1,error:{kind:he.detail?.includes("409")?"conflict":he.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:ie}}}async function*Pe(){while(!V){while(w.length>0)if(yield w.shift(),V)return;await new Promise((ie)=>{C=ie})}}async function*vt(){while(!V){while(v.length>0)if(yield v.shift(),V)return;await new Promise((ie)=>{B=ie})}}async function*N(){while(!V){while(P.length>0)if(yield P.shift(),V)return;await new Promise((ie)=>{R=ie})}}return{ok:!0,handle:{get sessionUrl(){return xie(ne.bridgeSessionId,m)},get environmentId(){return ne.environmentId},get bridgeSessionId(){return ne.bridgeSessionId},getSSESequenceNum(){return ne.getSSESequenceNum()},hasPendingPrompts(){return w.length>0},write(ie){ne.writeSdkMessages([ie])},sendResult(){ne.sendResult()},sendControlRequest(ie){ne.sendControlRequest(ie)},sendControlResponse(ie){ne.sendControlResponse(ie)},sendControlCancelRequest(ie){ne.sendControlCancelRequest(ie)},inboundPrompts:Pe,controlRequests:vt,permissionResponses:N,onStateChange(ie){Y=ie},async teardown(){V=!0,C?.(),B?.(),R?.(),await ne.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var VYe=1000,WYe=1e4,JYe=5000,YYe=60000,dN=3;function KYe(e){if((e.type==="user"||e.type==="assistant")&&e.parent_tool_use_id!==null)return!1;if(e.type==="user"){let t=e.message.content;if(!(Array.isArray(t)&&t.some((n)=>n.type==="tool_result")))return!1}return!0}function ZYe(e,t,r){let n=e.response?.request_id;if(!n)return null;let s=t.get(n);if(!s)return n;t.delete(n),r(n);let o=e.response;if(o.subtype==="success"&&IN(o.response))s(o.response);else s({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}function Lv(e){if(!e){ln("assistant_worker_start");return}if(e.kind==="auth"||e.kind==="conflict")Us("assistant_worker_start",e.kind);else Zr("assistant_worker_start",e.kind)}async function XYe(e){let{bridge:t,sandboxed:r=!1,scheduling:n,buildQueryOptions:s,canUseToolPreFilter:o,onPermissionResolved:i,transformOutbound:a,stateAdapter:c,initialPrompt:l,userIdleMs:u=300000,signal:p,log:f=()=>{}}=e;f("─── worker start ───");let A=await c?.load(),g={...t,initialSSESequenceNum:t.initialSSESequenceNum??A?.lastSSESequenceNum};if(!g.getAccessToken()){let re={kind:"auth",detail:"getAccessToken returned empty"};return Lv(re),{ok:!1,error:re}}let h=await _ie(g);if(!h.ok)return f(`bridge connection failed: ${h.error.kind} — ${h.error.detail}`),Lv(h.error),{ok:!1,error:h.error};let m=h.handle;f(`bridge connected url=${m.sessionUrl} env=${m.environmentId}`);let y=A?.claudeSessionId,w=m.bridgeSessionId,C=[],v=null,B=!1,P=null,R=0,V=!0,Y=0,he=Promise.resolve();function He(){if(!c)return;let re={claudeSessionId:y,lastSSESequenceNum:m.getSSESequenceNum(),bridgeSessionId:m.bridgeSessionId};he=he.then(()=>c.save(re).catch((ct)=>{f(`stateAdapter.save threw: ${ct}`)}))}function Ae(){if(C.length>0||m.hasPendingPrompts()){f("persist skipped: prompt queued");return}He()}He();let ne=new AbortController,Pe=new Map,vt=null;function N(){return vt??=(async()=>{Ae();for(let re of Pe.keys())m.sendControlCancelRequest(re);Pe.clear(),await m.teardown(),await he})()}if(p.addEventListener("abort",()=>{ne.abort(),N().catch((re)=>f(`teardown threw: ${re}`))}),p.aborted){await N();let re={kind:"unknown",detail:"aborted before start"};return Lv(re),{ok:!1,error:re}}let yt="connected";m.onStateChange((re,ct)=>{if(f(`bridge state=${re} detail=${ct??""}`),yt=re,re==="ready"&&m.bridgeSessionId!==w)w=m.bridgeSessionId,He();else if(re==="connected")Ae();if(re==="failed")f(`bridge failed: ${ct??"unknown"}`),ne.abort(),N().catch((gt)=>f(`teardown threw: ${gt}`))});let ie=n?.horizonMs??600000,de=n?.leadMs??JYe,Ft=null,Ct=!1,ee=!1,U="";async function we(){if(!n)return;let re=await Z4(n.dir).catch((gt)=>{return f(`computeCronHorizon threw: ${gt}`),{nextFire:null,hasOverdue:!1}});Ft=re.nextFire,ee=re.hasOverdue;let ct=re.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(re.nextFire).toISOString()} hasOverdue=${re.hasOverdue}`;if(ct!==U)U=ct,f(ct)}let _e;if(n)await we(),_e=setInterval(we,WYe),_e.unref?.();function qe(re){C.push({type:"user",message:{role:"user",content:re},parent_tool_use_id:null,session_id:""}),v?.(),v=null}async function Kt(re,ct,gt){if(o){let lr=await o(re,ct,gt);if(lr)return i?.(re,lr),lr}if(yt!=="connected"){f(`permission denied — bridge state=${yt}, request would drop`);let lr={behavior:"deny",message:`Cannot request permission: remote control is ${yt}. Try again in a moment.`};return i?.(re,lr),lr}let te=GYe();f(`permission request tool=${re} req=${te}`);let{signal:Qs,suggestions:Fa,blockedPath:Ri,toolUseID:ye}=gt;m.sendControlRequest({type:"control_request",request_id:te,request:{subtype:"can_use_tool",tool_name:re,display_name:vN(re),input:ct,tool_use_id:ye,...Fa&&{permission_suggestions:Fa},...Ri&&{blocked_path:Ri},..."decisionReason"in gt&>.decisionReason&&{decision_reason:gt.decisionReason},..."agentID"in gt&>.agentID&&{agent_id:gt.agentID}}});let Fn;try{let lr=await new Promise((Ti,Ts)=>{Pe.set(te,Ti),Fn=setTimeout((Di,_r,ge,us,Pr)=>{if(Di.delete(_r))ge(`permission timeout req=${_r}`),us.sendControlCancelRequest(_r),Pr({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},YYe,Pe,te,f,m,Ti),Fn.unref?.(),Qs.addEventListener("abort",()=>{if(Pe.delete(te))m.sendControlCancelRequest(te);Ts(Error("aborted"))},{once:!0})});f(`permission response req=${te} behavior=${lr.behavior}`);let Rs=lr.behavior==="allow"?{behavior:"allow",updatedInput:lr.updatedInput,updatedPermissions:lr.updatedPermissions}:{behavior:"deny",message:lr.message??"Denied via remote control"};return i?.(re,Rs),Rs}finally{if(Fn)clearTimeout(Fn);Pe.delete(te)}}let tr=!1;async function Xe(){if(P!==null||tr||ne.signal.aborted)return;if(tr=!0,B=!1,C.length>0)V=!1;async function*re(){while(!B){while(C.length>0)if(V=!1,yield C.shift(),B)return;await new Promise((te)=>{v=te})}}f(`spawning query resume=${y??"<fresh>"}`);let ct={assistant:!0,cwd:t.dir,resume:y,stderr:(te)=>f(`[child] ${te.trimEnd()}`),canUseTool:Kt},gt;try{if(gt=await s(ct),r)gt={...gt,env:{...gt.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(te){if(f(`buildQueryOptions threw: ${te}`),tr=!1,Y++,Y>=dN)f(`${Y} consecutive buildQueryOptions failures — dropping ${C.length} queued input(s)`),C.length=0;else if(C.length>0&&!ne.signal.aborted)Xe();return}if(ne.signal.aborted){tr=!1;return}try{P=jJ({prompt:re(),options:gt})}finally{tr=!1}(async()=>{try{f("output pump started");for await(let te of P){if(te.type==="system"&&te.subtype==="init"){if(te.session_id!==y)y=te.session_id,Ae()}if(te.type==="result")V=!0,Y=0,Ct=!0,Ae();if(!KYe(te))continue;let Qs=a?a(te):te;if(Qs===null)continue;m.write(Qs)}}catch(te){f(`query threw: ${te}`),Y++}finally{f("output pump ended"),P=null;for(let te of Pe.keys())m.sendControlCancelRequest(te);if(Pe.clear(),C.length>0&&!ne.signal.aborted)if(Y>=dN)f(`${Y} consecutive crashes — dropping ${C.length} queued input(s)`),C.length=0;else Xe()}})()}let Un=setInterval(()=>{let re=Date.now(),ct=Ft!==null&&Ft-re<ie;if(P===null){let gt=Ft!==null&&Ft-re<de;if((gt||ee&&!Ct)&&Y<dN&&!ne.signal.aborted)f(gt?`cron due in ${Ft-re}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),Xe();return}if(B)return;if(!V||C.length>0)return;if(re-R<u)return;if(ct)return;if(ee&&!Ct)return;f("idle conditions met → closing input gen"),Ae(),B=!0,v?.(),v=null},VYe);if(Un.unref?.(),l)f("initialPrompt → injecting"),R=Date.now(),qe(l),Xe();let ls=(async()=>{if(await Promise.all([(async()=>{for await(let re of m.inboundPrompts()){if(ne.signal.aborted)return;if(f("bridge prompt received"),R=Date.now(),re.uuid)m.write({type:"user",uuid:re.uuid,session_id:"",message:{role:"user",content:re.content},parent_tool_use_id:null});qe(re.content),Xe()}})(),(async()=>{for await(let re of m.controlRequests()){if(ne.signal.aborted)return;switch(re.request.subtype){case"interrupt":f("bridge interrupt"),P?.interrupt();break;case"set_model":f(`bridge setModel=${re.request.model??"<default>"}`),P?.setModel(re.request.model);break;case"set_max_thinking_tokens":f(`bridge setMaxThinkingTokens=${re.request.max_thinking_tokens}`),P?.setMaxThinkingTokens(re.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let re of m.permissionResponses()){if(ne.signal.aborted)return;let ct=ZYe(re,Pe,m.sendControlCancelRequest);if(ct)f(`permission response for unknown req=${ct} (stale)`)}})()]),clearInterval(Un),_e)clearInterval(_e);P?.close(),await N(),f("─── worker stop ───")})(),at={get sessionUrl(){return m.sessionUrl},get bridgeSessionId(){return m.bridgeSessionId},get claudeSessionId(){return y},pushPrompt(re){R=Date.now(),qe(re),Xe()},async interrupt(){await P?.interrupt()},done:ls,teardown:N,[Symbol.asyncDispose]:N};return Lv(null),{ok:!0,handle:at}}process.env.NoDefaultCurrentDirectoryInExePath="1";export{XYe as runAssistantWorker};
|
|
190
|
+
`)}else b(`SSETransport: Ignoring client_event with no type in payload: event_id=${r.event_id}`);this.onEventCallback?.(r)}handleConnectionError(){if(this.clearLivenessTimer(),this.state==="closing"||this.state==="closed")return;this.abortController?.abort(),this.abortController=null;let e=Date.now();if(!this.reconnectStartTime)this.reconnectStartTime=e;let t=e-this.reconnectStartTime;if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;if(this.refreshHeaders){let s=this.refreshHeaders();Object.assign(this.headers,s),b("SSETransport: Refreshed headers for reconnect")}this.state="reconnecting",this.reconnectAttempts++;let r=Math.min(dYe*Math.pow(2,this.reconnectAttempts-1),pYe),n=Math.max(0,r+r*0.25*(2*Math.random()-1));b(`SSETransport: Reconnecting in ${Math.round(n)}ms (attempt ${this.reconnectAttempts}, ${Math.round(t/1000)}s elapsed)`),H("error","cli_sse_reconnect_attempt",{reconnectAttempts:this.reconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},n)}onLivenessTimeout=()=>{this.livenessTimer=null,b("SSETransport: Liveness timeout, reconnecting",{level:"error"}),H("error","cli_sse_liveness_timeout"),this.connectErrorsSeen.add("liveness_timeout"),this.onDiagnostic?.(`SSE liveness timeout — no frame in ${nie/1000}s, reconnecting`),this.abortController?.abort(),this.handleConnectionError()};resetLivenessTimer(){this.clearLivenessTimer(),this.livenessTimer=setTimeout(this.onLivenessTimeout,nie)}clearLivenessTimer(){if(this.livenessTimer)clearTimeout(this.livenessTimer),this.livenessTimer=null}async write(e){let t=this.getAuthHeaders();if(Object.keys(t).length===0){b("SSETransport: No session token available for POST"),H("warn","cli_sse_post_no_token");return}let r={...t,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-client-platform":Ua(),"User-Agent":Lo()};b(`SSETransport: POST body keys=${Object.keys(e).join(",")}`);for(let n=1;n<=Fm;n++){try{let o=await Ar.post(this.postUrl,e,{headers:r,validateStatus:hYe});if(o.status===200||o.status===201){b(`SSETransport: POST success type=${e.type}`);return}if(b(`SSETransport: POST ${o.status} body=${Ee(o.data).slice(0,200)}`),o.status>=400&&o.status<500&&o.status!==429){b(`SSETransport: POST returned ${o.status} (client error), not retrying`),H("warn","cli_sse_post_client_error",{status:o.status});return}b(`SSETransport: POST returned ${o.status}, attempt ${n}/${Fm}`),H("warn","cli_sse_post_retryable_error",{status:o.status,attempt:n})}catch(o){b(`SSETransport: POST error: ${ae(o)}, attempt ${n}/${Fm}`),H("warn","cli_sse_post_network_error",{attempt:n})}if(n===Fm){b(`SSETransport: POST failed after ${Fm} attempts, continuing`),H("warn","cli_sse_post_retries_exhausted");return}let s=Math.min(AYe*Math.pow(2,n-1),gYe);await Nr(s)}}isConnectedStatus(){return this.state==="connected"}isClosedStatus(){return this.state==="closed"}setOnData(e){this.onData=e}setOnClose(e){this.onCloseCallback=e}setOnEvent(e){this.onEventCallback=e}setOnDiagnostic(e){this.onDiagnostic=e}setEventFilter(e){this.eventFilter=e}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 bYe(e){let t=e.pathname;if(t.endsWith("/stream"))t=t.slice(0,-7);return`${e.protocol}//${e.host}${t}`}et();xt();Jn();go();et();xt();var sie="DEVICE_ATTESTATION_STATUS_",oie=["UNSPECIFIED","ABSENT","VERIFIED","VERIFIED_BY_GATE","INVALID","UNCHECKED"];function EYe(e){if(e===void 0||e===null)return"UNSPECIFIED";if(typeof e==="number")return oie[e]??"UNSPECIFIED";if(typeof e!=="string")return"UNSPECIFIED";let t=e.startsWith(sie)?e.slice(sie.length):e;if(oie.includes(t))return t;return"UNSPECIFIED"}function IYe(e,t){if(e==="VERIFIED")return!0;if(e==="VERIFIED_BY_GATE")return t==="VERIFIED_BY_GATE";return!1}var vYe={enforce:!1,acceptLevel:"VERIFIED",acceptStatuses:new Set},CYe=["UNSPECIFIED","ABSENT","INVALID","UNCHECKED"],kRt=M(()=>d.object({accept_level:d.enum(["VERIFIED","VERIFIED_BY_GATE"]).default("VERIFIED"),accept_statuses:d.array(d.enum(CYe)).default([])}));var SYe;var wYe;function iie(e){let t=typeof e.payload?.type==="string"?e.payload.type:e.event_type,r=t==="user"||t==="control_response",n=EYe(e.device_attestation_status),s=SYe?.()??vYe;if(IYe(n,s.acceptLevel)){if(r)ln("bridge_event_attestation");return!1}if(!s.enforce){if(n==="UNSPECIFIED")return!1;if(r)b(`[bridge:attestation] accepting unverified ${t} event_id=${e.event_id} status=${n}`,{level:"info"}),Us("bridge_event_attestation",`${n.toLowerCase()}_${t}`);return!1}let o=s.acceptStatuses.has(n);if(r){let i=`${n.toLowerCase()}_${t}`;if(b(`[bridge:attestation] ${o?"accepting (config exception)":"DROPPING"} unverified ${t} event_id=${e.event_id} status=${n}`,{level:o?"info":"warn"}),o)Us("bridge_event_attestation",i);else{Zr("bridge_event_attestation",i);try{wYe?.({status:n,payloadType:t})}catch(a){b(`[bridge:attestation] drop notifier threw: ${ae(a)}`,{level:"error"})}}}return!o}rt();function aie(e){let t=Buffer.from(e,"base64url").toString("utf-8"),r=Gt(t);if(!r||typeof r!=="object"||!("version"in r)||r.version!==1)throw Error(`Unsupported work secret version: ${r&&typeof r==="object"&&"version"in r?r.version:"unknown"}`);let n=r;if(typeof n.session_ingress_token!=="string"||n.session_ingress_token.length===0)throw Error("Invalid work secret: missing or empty session_ingress_token");if(typeof n.api_base_url!=="string")throw Error("Invalid work secret: missing api_base_url");return r}function cie(e,t){let r=e.includes("localhost")||e.includes("127.0.0.1"),n=r?"ws":"wss",s=r?"v2":"v1",o=e.replace(/^https?:\/\//,"").replace(/\/+$/,"");return`${n}://${o}/${s}/session_ingress/ws/${t}`}function cN(e,t){if(e===t)return!0;let r=e.slice(e.lastIndexOf("_")+1),n=t.slice(t.lastIndexOf("_")+1);return r.length>=4&&r===n}function lie(e,t){return`${e.replace(/\/+$/,"")}/v1/code/sessions/${t}`}async function uie(e,t){let r=await Ar.post(`${e}/worker/register`,{},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json","anthropic-version":"2023-06-01"},timeout:1e4}),n=r.data?.worker_epoch,s=typeof n==="string"?Number(n):n;if(typeof s!=="number"||!Number.isFinite(s)||!Number.isSafeInteger(s))throw Error(`registerWorker: invalid worker_epoch in response: ${Ee(r.data)}`);return s}function die(e){return{write:(t)=>e.write(t),writeBatch:(t)=>e.writeBatch(t),close:()=>e.close(),isConnectedStatus:()=>e.isConnectedStatus(),getStateLabel:()=>e.getStateLabel(),setOnData:(t)=>e.setOnData(t),setOnClose:(t)=>e.setOnClose(t),setOnConnect:(t)=>e.setOnConnect(t),connect:()=>void e.connect(),getLastSequenceNum:()=>0,get droppedBatchCount(){return e.droppedBatchCount},reportState:()=>{},reportMetadata:()=>{},reportDelivery:()=>{},flush:()=>Promise.resolve()}}async function pie(e){let{sessionUrl:t,ingressToken:r,sessionId:n,initialSequenceNum:s,getAuthToken:o}=e,i;if(o)i=()=>{let h=o();if(!h)return{};return{Authorization:`Bearer ${h}`}};else Dg(r);let a=e.epoch??await uie(t,r);b(`[bridge:repl] CCR v2: worker sessionId=${n} epoch=${a}${e.epoch!==void 0?" (from /bridge)":" (via registerWorker)"}`);let c=new URL(t);c.pathname=c.pathname.replace(/\/$/,"")+"/worker/events/stream";let l=new aN(c,{},n,void 0,s,i),u,p=new iN(l,new URL(t),{getAuthHeaders:i,heartbeatIntervalMs:e.heartbeatIntervalMs,heartbeatJitterFraction:e.heartbeatJitterFraction,onEpochMismatch:()=>{b("[bridge:repl] CCR v2: epoch superseded (409) — closing for poll-loop recovery");try{p.close(),l.close(),u?.(4090)}catch(h){b(`[bridge:repl] CCR v2: error during epoch-mismatch cleanup: ${ae(h)}`,{level:"error"})}throw Error("epoch superseded")}});l.setOnEvent((h)=>{p.reportDelivery(h.event_id,"received"),p.reportDelivery(h.event_id,"processed")}),l.setEventFilter(iie);let f,A=!1,g=!1;return{write(h){return p.writeEvent(h)},async writeBatch(h){for(let m of h){if(g)break;await p.writeEvent(m)}},close(){g=!0,p.close(),l.close()},isConnectedStatus(){return A},getStateLabel(){if(l.isClosedStatus())return"closed";if(l.isConnectedStatus())return A?"connected":"init";return"connecting"},setOnData(h){l.setOnData(h)},setOnClose(h){u=h,l.setOnClose((m)=>{p.close(),h(m??4092)})},setOnConnect(h){f=h},getLastSequenceNum(){return l.getLastSequenceNum()},droppedBatchCount:0,reportState(h,m){p.reportState(h,m)},reportMetadata(h){p.reportMetadata(h)},reportDelivery(h,m){p.reportDelivery(h,m)},flush(){return p.flush()},getInternalEventWriter(){return(h,m,y)=>p.writeInternalEvent(h,m,y)},getInternalEventReaders(){return{readMain:()=>p.readInternalEvents(),readSubagents:()=>p.readSubagentInternalEvents()}},connect(){if(!e.outboundOnly)l.connect();p.initialize(a).then(()=>{A=!0,b(`[bridge:repl] v2 transport ready for writes (epoch=${a}, sse=${l.isConnectedStatus()?"open":"opening"})`),f?.()},(h)=>{b(`[bridge:repl] CCR v2 initialize failed: ${ae(h)}`,{level:"error"}),p.close(),l.close(),u?.(4091)})}}}go();et();xt();var xYe="2023-06-01",_Ye="ccr-byoc-2025-07-29";async function fie({environmentId:e,title:t,tags:r,signal:n},s){let{baseUrl:o,getAccessToken:i,orgUUID:a,model:c}=s,l=i();if(!l)return b("[bridge] No access token for session creation"),null;let u=`${o}/v1/sessions`,p;try{p=await Ar.post(u,{title:t,events:[],session_context:{sources:[],outcomes:[],model:c},...{environment_id:e},source:"remote-control",...r!==void 0&&{tags:r}},{headers:Uv(l,{orgUUID:a}),signal:n,validateStatus:(A)=>A<500})}catch(A){return b(`[bridge] Session creation request failed: ${ae(A)}`),null}if(p.status!==200&&p.status!==201){let A=gl(p.data);return b(`[bridge] Session creation failed with status ${p.status}${A?`: ${A}`:""}`),null}let f=p.data;if(!f||typeof f!=="object"||!("id"in f)||typeof f.id!=="string")return b("[bridge] No session ID in response"),null;return f.id}async function Aie(e,t){let{baseUrl:r,getAccessToken:n,orgUUID:s}=t,o=n();if(!o){b("[bridge] No access token for session archive");return}let i=`${r}/v1/sessions/${e}/archive`;b(`[bridge] Archiving session ${e}`);try{let a=await Ar.post(i,{},{headers:Uv(o,{orgUUID:s}),timeout:1e4,validateStatus:(c)=>c<500});if(a.status===200||a.status===409)b(`[bridge] Session ${e} archived successfully`);else{let c=gl(a.data);b(`[bridge] Session archive failed with status ${a.status}${c?`: ${c}`:""}`)}}catch(a){b(`[bridge] Session archive request failed: ${ae(a)}`)}}async function Nv(e,t,r,n,s,o,i){let a=e==="subscribe"?"bridge_pr_subscribe":"bridge_pr_unsubscribe",c=o();if(!c)return b(`[bridge] No access token for ${e}-pr`),Zr(a,"no_token"),!1;let l=`${s}/v1/code/github/${e}-pr`,u={session_id:ip(t),repo:r,pr_number:n},p;try{p=await Ar.post(l,u,{headers:Uv(c,{trustedDeviceToken:await i?.()}),timeout:1e4,validateStatus:(A)=>A<500})}catch(A){return b(`[bridge] ${e}-pr request failed: ${ae(A)}`),Zr(a,"request_failed"),!1}if(!(p.status>=200&&p.status<300||p.status===409)){let A=gl(p.data);return b(`[bridge] ${e}-pr failed ${p.status}${A?`: ${A}`:""}`),Zr(a,"http_error"),!1}return b(`[bridge] ${e}-pr ${r}#${n} ok`),ln(a),!0}async function Ov(e,t,r,n,s,o,i){let a=e==="subscribe"?"bridge_slack_subscribe":"bridge_slack_unsubscribe",c=o();if(!c)return b(`[bridge] No access token for ${e}-thread`),Zr(a,"no_token"),!1;let l=`${s}/v1/code/slack/${e}-thread`,u={session_id:ip(t),channel:r,thread_ts:n},p;try{p=await Ar.post(l,u,{headers:Uv(c,{trustedDeviceToken:await i?.()}),timeout:1e4,validateStatus:(A)=>A<500})}catch(A){return b(`[bridge] ${e}-thread request failed: ${ae(A)}`),Zr(a,"request_failed"),!1}if(!(p.status>=200&&p.status<300||p.status===409)){let A=gl(p.data);return b(`[bridge] ${e}-thread failed ${p.status}${A?`: ${A}`:""}`),Zr(a,"http_error"),!1}return b(`[bridge] ${e}-thread ${r}/${n} ok`),ln(a),!0}function Uv(e,{orgUUID:t,trustedDeviceToken:r}={}){let n={Authorization:`Bearer ${e}`,"Content-Type":"application/json","anthropic-version":xYe,"anthropic-beta":_Ye,"anthropic-client-platform":Ua(),"User-Agent":Lo()};if(t!==void 0)n["x-organization-uuid"]=t;if(r!==void 0)n["X-Trusted-Device-Token"]=r;return n}var Cie=2000,Eie=60000,Iie=900000,FYe=300000,vie=3;function Sie(e){return e*(0.8+Math.random()*0.4)}var LYe=0;async function wie(e){let{dir:t,registrationDir:r,machineName:n,branch:s,gitRepoUrl:o,title:i,baseUrl:a,sessionIngressUrl:c,workerType:l,getAccessToken:u,createSession:p,archiveSession:f,getCurrentTitle:A=()=>i,toSDKMessages:g=()=>{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:h,getTrustedDeviceToken:m,getPollIntervalConfig:y=()=>ug,initialHistoryCap:w=200,initialMessages:C,previouslyFlushedUUIDs:v,onInboundMessage:B,onPermissionResponse:P,onInterrupt:R,onSetModel:V,onSetMaxThinkingTokens:Y,onSetPermissionMode:he,onRenameSession:He,onSetColor:Ae,onFileSuggestions:ne,onReadFile:Pe,onMcpAuthenticate:vt,onMcpOauthCallbackUrl:N,onMcpReconnect:yt,onMcpStatus:ie,onStateChange:de,onUserMessage:Ft,onSessionEstablished:Ct,onInitError:ee,perpetual:U,initialSSESequenceNum:we=0,onTransportPersistenceReady:_e,onTransportPersistenceTeardown:qe}=e,Kt=++LYe,{writeBridgePointer:tr,clearBridgePointer:Xe,readBridgePointer:Un}=await Promise.resolve().then(() => (yie(),hie)),ls=U?await Un(t):null,at=ls?.source==="repl"?ls:null;b(`[bridge:repl] initBridgeCore #${Kt} starting (initialMessages=${C?.length??0}${at?` perpetual prior=env:${at.environmentId}`:""})`);let ct=joe({baseUrl:a,getAccessToken:u,runnerVersion:"0.3.168",onDebug:b,onAuth401:h,getTrustedDeviceToken:m}),gt={dir:r??t,machineName:n,branch:s,gitRepoUrl:o,maxSessions:1,spawnMode:"single-session",verbose:!1,sandbox:!1,bridgeId:bie(),workerType:l,environmentId:bie(),reuseEnvironmentId:at?.environmentId,apiBaseUrl:a,sessionIngressUrl:c},te,Qs;try{let L=await ct.registerBridgeEnvironment(gt);te=L.environment_id,Qs=L.environment_secret}catch(L){if(Loe("registration_failed",`[bridge:repl] Environment registration failed: ${ae(L)}`),ee?.(`[bridge:repl] Environment registration failed: ${ae(L)}`),at&&L instanceof cs&&(L.status===410||L.status!==401&&Dv(L.errorType)))await Xe(t);return de?.("failed",ae(L)),null}b(`[bridge:repl] Environment registered: ${te}`),H("info","bridge_repl_env_registered"),Ye("tengu_bridge_repl_env_registered",{});async function Fa(L,ce){if(te!==L)return b(`[bridge:repl] Env mismatch (requested ${L}, got ${te}) — cannot reconnect in place`),!1;let lt=Um(ce),je=lt===ce?[ce]:[ce,lt];for(let Me of je)try{return await ct.reconnectSession(te,Me),b(`[bridge:repl] Reconnected session ${Me} in place on env ${te}`),!0}catch(Zt){b(`[bridge:repl] reconnectSession(${Me}) failed: ${ae(Zt)}`)}return b("[bridge:repl] reconnectSession exhausted — falling through to fresh session"),!1}let Ri=at?await Fa(at.environmentId,at.sessionId):!1;if(at&&!Ri)await Xe(t);let ye,Fn=new Set,lr=new Map,Rs=new Set;if(Ri&&at){if(ye=at.sessionId,b(`[bridge:repl] Perpetual session reused: ${ye}`),C&&v)for(let L of C)v.add(L.uuid)}else{let L=await p({environmentId:te,title:i,gitRepoUrl:o,branch:s,signal:AbortSignal.timeout(15000)});if(!L)return b("[bridge:repl] Session creation failed, deregistering environment"),ee?.("[bridge:repl] Session creation failed, deregistering environment"),Ye("tengu_bridge_repl_session_failed",{}),await ct.deregisterEnvironment(te).catch(()=>{}),de?.("failed","Session creation failed"),null;ye=L,b(`[bridge:repl] Session created: ${ye}`)}Ct?.(ye),await tr(t,{sessionId:ye,environmentId:te,source:"repl"}),H("info","bridge_repl_session_created"),Ye("tengu_bridge_repl_started",{has_initial_messages:!!(C&&C.length>0),inProtectedNamespace:NO(),...soe()});let Ti=new Set;if(C)for(let L of C)Ti.add(L.uuid);let Ts=new Pv(2000);for(let L of Ti)Ts.add(L);let Di=new Pv(2000),_r=new AbortController,ge=null,us=0,Pr=Ri?we:0,ut=null,po=null,lp=Joe(_r.signal),Pi=lp.wake,La=lp.signal,Ln=new sN,up=!Ft,$a=3,mr=0,Mr=null;async function fo(){if(Mr)return Mr;Mr=Mi();try{return await Mr}finally{Mr=null}}async function Mi(){if(mr++,us++,b(`[bridge:repl] Reconnecting after env lost (attempt ${mr}/${$a})`),mr>$a)return b(`[bridge:repl] Environment reconnect limit reached (${$a}), giving up`),!1;if(ge){let Me=ge.getLastSequenceNum();if(Me>Pr)Pr=Me;qe?.(),ge.close(),ge=null}if(Pi(),Ln.drop(),ut){let Me=ut;if(await ct.stopWork(te,Me,!1).catch(()=>{}),ut!==Me)return b("[bridge:repl] Poll loop recovered during stopWork await — deferring to it"),mr=0,!0;ut=null,po=null}if(_r.signal.aborted)return b("[bridge:repl] Reconnect aborted by teardown"),!1;let L=te;gt.reuseEnvironmentId=L;let ce;for(let Me=1;;Me++)try{ce=await ct.registerBridgeEnvironment(gt);break}catch(Zt){if(Zt instanceof cs||Me>=vie||_r.signal.aborted)return gt.reuseEnvironmentId=void 0,b(`[bridge:repl] Environment re-registration failed (attempt ${Me}): ${ae(Zt)}`),!1;let $m=Sie(Cie*2**(Me-1));if(b(`[bridge:repl] Environment re-registration transient failure (attempt ${Me}/${vie}), retrying in ${Math.round($m)}ms: ${ae(Zt)}`),await Nr($m,_r.signal),_r.signal.aborted)return gt.reuseEnvironmentId=void 0,!1}if(te=ce.environment_id,Qs=ce.environment_secret,gt.reuseEnvironmentId=void 0,b(`[bridge:repl] Re-registered: requested=${L} got=${te}`),_r.signal.aborted)return b("[bridge:repl] Reconnect aborted after env registration, cleaning up"),await ct.deregisterEnvironment(te).catch(()=>{}),!1;if(ge!==null)return b("[bridge:repl] Poll loop recovered during registerBridgeEnvironment await — deferring to it"),mr=0,!0;if(await Fa(L,ye))return Ye("tengu_bridge_repl_reconnected_in_place",{}),mr=0,!0;if(te!==L)Ye("tengu_bridge_repl_env_expired_fresh_session",{});if(await f(ye),_r.signal.aborted)return b("[bridge:repl] Reconnect aborted after archive, cleaning up"),await ct.deregisterEnvironment(te).catch(()=>{}),!1;let lt=A(),je=await p({environmentId:te,title:lt,gitRepoUrl:o,branch:s,signal:AbortSignal.timeout(15000)});if(!je)return b("[bridge:repl] Session creation failed during reconnection"),!1;if(_r.signal.aborted)return b("[bridge:repl] Reconnect aborted after session creation, cleaning up"),await f(je),!1;if(ye=je,aoe(ip(je)).catch(()=>{}),Ct?.(ye),Pr=0,Di.clear(),up=!Ft,b(`[bridge:repl] Re-created session: ${ye}`),await tr(t,{sessionId:ye,environmentId:te,source:"repl"}),v?.clear(),Fn.size>0){b(`[bridge:repl] Replaying ${Fn.size} PR subscription(s) against new session`);for(let Me of Fn){let Zt=Me.lastIndexOf("#");Nv("subscribe",ye,Me.slice(0,Zt),Number(Me.slice(Zt+1)),a,u,m)}}if(Rs.size>0){b(`[bridge:repl] Replaying ${Rs.size} Slack thread subscription(s) against new session`);for(let Me of Rs){let Zt=Me.indexOf("/");Ov("subscribe",ye,Me.slice(0,Zt),Me.slice(Zt+1),a,u,m)}}return mr=0,!0}function ja(){return u()}function Ni(){let L=Ln.end();if(L.length===0)return;if(!ge){b(`[bridge:repl] Cannot drain ${L.length} pending message(s): no transport`);return}for(let je of L)Ts.add(je.uuid);let lt=g(L).map((je)=>({...je,session_id:ye}));b(`[bridge:repl] Drained ${L.length} pending message(s) after flush`),ge.writeBatch(lt)}let $v=null;function jv(){$v?.()}function pN(L){if(b(`[bridge:repl] Transport permanently closed: code=${L}`),Ye("tengu_bridge_repl_ws_closed",{code:L}),ge){let lt=ge.getLastSequenceNum();if(lt>Pr)Pr=lt;qe?.(),ge=null}Pi();let ce=Ln.drop();if(ce>0)b(`[bridge:repl] Dropping ${ce} pending message(s) on transport close (code=${L})`,{level:"warn"});if(L===1000){de?.("failed","session ended"),_r.abort(),jv();return}de?.("reconnecting",`Remote Control connection lost (code ${L})`),b(`[bridge:repl] Transport reconnect budget exhausted (code=${L}), attempting env reconnect`),fo().then((lt)=>{if(lt)return;if(_r.signal.aborted)return;b("[bridge:repl] reconnectEnvironmentWithSession resolved false — tearing down"),Ye("tengu_bridge_repl_reconnect_failed",{close_code:L}),de?.("failed","reconnection failed"),jv()})}let fN,kie=null,Bie={api:ct,getCredentials:()=>({environmentId:te,environmentSecret:Qs}),signal:_r.signal,getPollIntervalConfig:y,onStateChange:de,getWsState:()=>ge?.getStateLabel()??"null",isAtCapacity:()=>ge!==null,capacitySignal:La,onFatalError:jv,getHeartbeatInfo:()=>{if(!ut||!po)return null;return{environmentId:te,workId:ut,sessionToken:po}},onHeartbeatFatal:(L)=>{if(b(`[bridge:repl] heartbeatWork fatal (status=${L.status}) — tearing down work item for fast re-dispatch`),ge){let ce=ge.getLastSequenceNum();if(ce>Pr)Pr=ce;qe?.(),ge.close(),ge=null}if(Ln.drop(),ut)ct.stopWork(te,ut,!1).catch((ce)=>{b(`[bridge:repl] stopWork after heartbeat fatal: ${ae(ce)}`)});ut=null,po=null,Pi(),de?.("reconnecting","Work item lease expired, fetching fresh token")},async onEnvironmentLost(){if(!await fo())return null;return{environmentId:te,environmentSecret:Qs}},onWorkReceived:(L,ce,lt,je)=>{if(ge?.isConnectedStatus())b(`[bridge:repl] Work received while transport connected, replacing with fresh token (workId=${lt})`);if(b(`[bridge:repl] Work received: workId=${lt} workSessionId=${L} currentSessionId=${ye} match=${cN(L,ye)}`),tr(t,{sessionId:ye,environmentId:te,source:"repl"}),!cN(L,ye)){b(`[bridge:repl] Rejecting foreign session: expected=${ye} got=${L}`);return}ut=lt,po=ce;let Me=je||Ge(process.env.CLAUDE_BRIDGE_USE_CCR_V2),Zt;if(!Me){if(Zt=ja(),!Zt){b("[bridge:repl] No OAuth token available for session ingress, skipping work");return}Dg(Zt)}if(Ye("tengu_bridge_repl_work_received",{}),ge){qe?.();let rr=ge;ge=null;let ur=rr.getLastSequenceNum();if(ur>Pr)Pr=ur;rr.close()}Ln.deactivate();let $m=(rr)=>Woe(rr,{transport:ge,sessionId:ye,onInterrupt:R,onSetModel:V,onSetMaxThinkingTokens:Y,onSetPermissionMode:he,onRenameSession:He,onSetColor:Ae,onFileSuggestions:ne,onReadFile:Pe,onMcpAuthenticate:vt,onMcpOauthCallbackUrl:N,onMcpReconnect:yt,onMcpStatus:ie}),Gv=!1,gN=(rr)=>{if(ge=rr,rr.setOnConnect(()=>{if(ge!==rr)return;if(b("[bridge:repl] Ingress transport connected"),Ye("tengu_bridge_repl_ws_connected",{}),!Me){let ur=ja();if(ur)Dg(ur)}if(qv=!1,!Gv&&C&&C.length>0){Gv=!0;let ur=w,gn=C.filter((jm)=>rN(jm)&&!v?.has(jm.uuid)),$o=ur>0&&gn.length>ur?gn.slice(-ur):gn;if($o.length<gn.length)b(`[bridge:repl] Capped initial flush: ${gn.length} -> ${$o.length} (cap=${ur})`),Ye("tengu_bridge_repl_history_capped",{eligible_count:gn.length,capped_count:$o.length});let Oi=g($o);if(Oi.length>0){b(`[bridge:repl] Flushing ${Oi.length} initial message(s) via transport`);let jm=Oi.map((ml)=>({...ml,session_id:ye,historical:!0})),mN=rr.droppedBatchCount;rr.writeBatch(jm).then(()=>{if(rr.droppedBatchCount>mN){b(`[bridge:repl] Initial flush dropped ${rr.droppedBatchCount-mN} batch(es) — not marking ${Oi.length} UUID(s) as flushed`);return}if(v){for(let ml of Oi)if(ml.uuid)v.add(ml.uuid)}}).catch((ml)=>b(`[bridge:repl] Initial flush failed: ${ml}`)).finally(()=>{if(ge!==rr)return;Ni(),de?.("connected")})}else Ni(),de?.("connected")}else if(!Ln.active)de?.("connected")}),rr.setOnData((ur)=>{Voe(ur,Ts,Di,B,P,$m)}),kie=pN,rr.setOnClose((ur)=>{if(ge!==rr)return;pN(ur)}),!Gv&&C&&C.length>0)Ln.start();rr.connect()};if(us++,Me){let rr=lie(a,L),ur=us;b(`[bridge:repl] CCR v2: sessionUrl=${rr} session=${L} gen=${ur}`),pie({sessionUrl:rr,ingressToken:ce,sessionId:L,initialSequenceNum:Pr}).then((gn)=>{if(_r.signal.aborted){gn.close();return}if(ur!==us){b(`[bridge:repl] CCR v2: discarding stale handshake gen=${ur} current=${us}`),gn.close();return}if(gN(gn),_e){let $o=gn.getInternalEventWriter?.(),Oi=gn.getInternalEventReaders?.();if($o&&Oi)_e($o,Oi)}},(gn)=>{if(b(`[bridge:repl] CCR v2: createV2ReplTransport failed: ${ae(gn)}`,{level:"error"}),Ye("tengu_bridge_repl_ccr_v2_init_failed",{}),ur!==us)return;if(ut)ct.stopWork(te,ut,!1).catch(($o)=>{b(`[bridge:repl] stopWork after v2 init failure: ${ae($o)}`)}),ut=null,po=null;Pi()})}else{let rr=cie(c,L);b(`[bridge:repl] Ingress URL: ${rr}`),b(`[bridge:repl] Creating HybridTransport: session=${L}`);let ur=Zt??"";gN(die(new HM(new URL(rr),{Authorization:`Bearer ${ur}`,"anthropic-version":"2023-06-01"},L,()=>({Authorization:`Bearer ${ja()??ur}`,"anthropic-version":"2023-06-01"}),{maxConsecutiveFailures:50,isBridge:!0,onBatchDropped:()=>{de?.("reconnecting","Lost sync with Remote Control — events could not be delivered"),Pi()}})))}}};$Ye(Bie);let zv=U?setInterval(()=>{if(Mr)return;tr(t,{sessionId:ye,environmentId:te,source:"repl"})},3600000):null;zv?.unref?.();let AN=y().session_keepalive_interval_v2_ms,Hv=AN>0?setInterval(()=>{if(!ge)return;b("[bridge:repl] keep_alive sent"),ge.write({type:"keep_alive"}).catch((L)=>{b(`[bridge:repl] keep_alive write failed: ${ae(L)}`)})},AN):null;Hv?.unref?.();let qv=!1;$v=async()=>{if(qv){b(`[bridge:repl] Teardown already in progress, skipping duplicate call env=${te} session=${ye}`);return}qv=!0,qe?.();let L=Date.now();if(b(`[bridge:repl] Teardown starting: env=${te} session=${ye} workId=${ut??"none"} transportState=${ge?.getStateLabel()??"null"}`),zv!==null)clearInterval(zv);if(Hv!==null)clearInterval(Hv);if(fN)process.off("SIGUSR2",fN);if(_r.abort(),b("[bridge:repl] Teardown: poll loop aborted"),ge){let je=ge.getLastSequenceNum();if(je>Pr)Pr=je}if(U){ge=null,Ln.drop(),await tr(t,{sessionId:ye,environmentId:te,source:"repl"}),b(`[bridge:repl] Teardown (perpetual): leaving env=${te} session=${ye} alive on server, duration=${Date.now()-L}ms`);return}let ce=ge;if(ge=null,Ln.drop(),ce)ce.write(nN(ye));let lt=ut?ct.stopWork(te,ut,!0).then(()=>{b("[bridge:repl] Teardown: stopWork completed")}).catch((je)=>{b(`[bridge:repl] Teardown stopWork failed: ${ae(je)}`)}):Promise.resolve();await Promise.all([lt,f(ye)]),ce?.close(),b("[bridge:repl] Teardown: transport closed"),await ct.deregisterEnvironment(te).catch((je)=>{b(`[bridge:repl] Teardown deregister failed: ${ae(je)}`)}),await Xe(t),b(`[bridge:repl] Teardown complete: env=${te} duration=${Date.now()-L}ms`)},b(`[bridge:repl] Ready: env=${te} session=${ye}`),de?.("ready");let Lm={get bridgeSessionId(){return ye},outboundOnly:!1,get environmentId(){return te},getLastSequenceNum(){return Lm.getSSESequenceNum()},flush(){return ge?.flush()??Promise.resolve()},getSSESequenceNum(){let L=ge?.getLastSequenceNum()??0;return Math.max(Pr,L)},sessionIngressUrl:c,writeMessages(L){let ce=L.filter((Me)=>rN(Me)&&!Ti.has(Me.uuid)&&!Ts.has(Me.uuid)&&!Di.has(Me.uuid));if(ce.length===0)return;if(!up)for(let Me of ce){let Zt=Goe(Me);if(Zt!==void 0&&Ft?.(Zt,ye)){up=!0;break}}if(Ln.enqueue(...ce)){b(`[bridge:repl] Queued ${ce.length} message(s) during initial flush`);return}if(!ge){let Me=ce.map((Zt)=>Zt.type).join(",");b(`[bridge:repl] Transport not configured, dropping ${ce.length} message(s) [${Me}] for session=${ye}`,{level:"warn"});return}for(let Me of ce)Ts.add(Me.uuid);b(`[bridge:repl] Sending ${ce.length} message(s) via transport`);let je=g(ce).map((Me)=>({...Me,session_id:ye}));ge.writeBatch(je)},writeSdkMessages(L){let ce=L.filter((je)=>!je.uuid||!Ts.has(je.uuid));if(ce.length===0)return;if(!ge){b(`[bridge:repl] Transport not configured, dropping ${ce.length} SDK message(s) for session=${ye}`,{level:"warn"});return}for(let je of ce)if(je.uuid)Ts.add(je.uuid);let lt=ce.map((je)=>({...je,session_id:ye}));ge.writeBatch(lt)},sendControlRequest(L){if(!ge){b("[bridge:repl] Transport not configured, skipping control_request");return}let ce={...L,session_id:ye};ge.write(ce),b(`[bridge:repl] Sent control_request request_id=${L.request_id}`)},sendControlResponse(L){if(!ge){b("[bridge:repl] Transport not configured, skipping control_response");return}let ce={...L,session_id:ye};ge.write(ce),b("[bridge:repl] Sent control_response")},sendControlCancelRequest(L){if(!ge){b("[bridge:repl] Transport not configured, skipping control_cancel_request");return}let ce={type:"control_cancel_request",request_id:L,session_id:ye};ge.write(ce),b(`[bridge:repl] Sent control_cancel_request request_id=${L}`)},reportMetadata(L){ge?.reportMetadata(L)},sendResult(){if(!ge){b(`[bridge:repl] sendResult: skipping, transport not configured session=${ye}`);return}ge.write(nN(ye)),b(`[bridge:repl] Sent result for session=${ye}`)},async subscribePR(L,ce,lt){let je=`${L}#${ce}`,Me=lr.get(je);if(lt)lr.set(je,{agentId:lt,repo:L,prNumber:ce});let Zt=await Nv("subscribe",ye,L,ce,a,u,m);if(Zt)Fn.add(je);else if(lt)if(Me)lr.set(je,Me);else lr.delete(je);return Zt},async unsubscribePR(L,ce){let lt=await Nv("unsubscribe",ye,L,ce,a,u,m);if(lt){let je=`${L}#${ce}`;Fn.delete(je),lr.delete(je)}return lt},async subscribeSlackThread(L,ce){let lt=await Ov("subscribe",ye,L,ce,a,u,m);if(lt)Rs.add(`${L}/${ce}`);return lt},async unsubscribeSlackThread(L,ce){let lt=await Ov("unsubscribe",ye,L,ce,a,u,m);if(lt)Rs.delete(`${L}/${ce}`);return lt},getPRWebhookTargets(){return[...lr.values()]},async teardown(){Qie(),await $v?.(),b("[bridge:repl] Torn down"),Ye("tengu_bridge_repl_teardown",{})},[Symbol.asyncDispose](){return Lm.teardown()}},Qie=Wi(Lm);return Lm}async function $Ye({api:e,getCredentials:t,signal:r,onStateChange:n,onWorkReceived:s,onEnvironmentLost:o,getWsState:i,isAtCapacity:a,capacitySignal:c,onFatalError:l,getPollIntervalConfig:u=()=>ug,getHeartbeatInfo:p,onHeartbeatFatal:f}){b(`[bridge:repl] Starting work poll loop for env=${t().environmentId}`);let g=0,h=null,m=null,y=0,w=0,C=!1;while(!r.aborted){let{environmentId:v,environmentSecret:B}=t(),P=u();try{let R=await e.pollForWork(v,B,r,P.reclaim_older_than_ms);if(w=0,g>0)b(`[bridge:repl] Poll recovered after ${g} consecutive error(s)`),g=0,h=null,m=null,y=0,n?.("ready");if(!R){let Y=C;if(C=!1,a?.()&&c&&!Y){let he=P.poll_interval_ms_at_capacity;if(P.non_exclusive_heartbeat_interval_ms>0&&p){Ye("tengu_bridge_heartbeat_mode_entered",{heartbeat_interval_ms:P.non_exclusive_heartbeat_interval_ms});let Ae=he>0?Date.now()+he:null,ne=!1,Pe=0;while(!r.aborted&&a()&&(Ae===null||Date.now()<Ae)){let N=u();if(N.non_exclusive_heartbeat_interval_ms<=0)break;let yt=p();if(!yt)break;let ie=c();try{await e.heartbeatWork(yt.environmentId,yt.workId,yt.sessionToken)}catch(de){if(b(`[bridge:repl:heartbeat] Failed: ${ae(de)}`),de instanceof cs){if(ie.cleanup(),Ye("tengu_bridge_heartbeat_error",{status:de.status,error_type:JF(de.status===401||de.status===403?"auth_failed":"fatal")}),f)f(de),b(`[bridge:repl:heartbeat] Fatal (status=${de.status}), work state cleared — fast-polling for re-dispatch`);else ne=!0;break}}Pe++,await Nr(N.non_exclusive_heartbeat_interval_ms,ie.signal),ie.cleanup()}let vt=ne?"error":r.aborted?"shutdown":!a()?"capacity_changed":Ae!==null&&Date.now()>=Ae?"poll_due":"config_disabled";if(Ye("tengu_bridge_heartbeat_mode_exited",{reason:zl(vt),heartbeat_cycles:Pe}),!ne){if(vt==="poll_due")b(`[bridge:repl] Heartbeat poll_due after ${Pe} cycles — falling through to pollForWork`);continue}}let He=he>0?he:P.non_exclusive_heartbeat_interval_ms;if(He>0){let Ae=c(),ne=Date.now();await Nr(He,Ae.signal),Ae.cleanup();let Pe=Date.now()-ne-He;if(Pe>60000)b(`[bridge:repl] At-capacity sleep overran by ${Math.round(Pe/1000)}s — process suspension detected, forcing one fast-poll cycle`),Ye("tengu_bridge_repl_suspension_detected",{overrun_ms:Pe}),C=!0}}else await Nr(P.poll_interval_ms_not_at_capacity,r);continue}let V;try{V=aie(R.secret)}catch(Y){b(`[bridge:repl] Failed to decode work secret: ${ae(Y)}`),Ye("tengu_bridge_repl_work_secret_failed",{}),await e.stopWork(v,R.id,!1).catch(()=>{});continue}b(`[bridge:repl] Acknowledging workId=${R.id}`);try{await e.acknowledgeWork(v,R.id,V.session_ingress_token)}catch(Y){b(`[bridge:repl] Acknowledge failed workId=${R.id}: ${ae(Y)}`)}if(R.data.type==="healthcheck"){b("[bridge:repl] Healthcheck received");continue}if(R.data.type==="session"){let Y=R.data.id;try{On(Y,"session_id")}catch{b(`[bridge:repl] Invalid session_id in work: ${Y}`);continue}s(Y,V.session_ingress_token,R.id,V.use_code_sessions===!0),b("[bridge:repl] Work accepted, continuing poll loop")}}catch(R){if(r.aborted)break;if(R instanceof cs&&R.status===404&&o){let N=t().environmentId;if(v!==N){b(`[bridge:repl] Stale poll error for old env=${v}, current env=${N} — skipping onEnvironmentLost`),g=0,h=null;continue}if(w++,b(`[bridge:repl] Environment deleted, attempting re-registration (attempt ${w}/3)`),Ye("tengu_bridge_repl_env_lost",{attempt:w}),w>3){b("[bridge:repl] Environment re-registration limit reached (3), giving up"),n?.("failed","Environment deleted and re-registration limit reached"),l?.();break}n?.("reconnecting","environment lost, recreating session");let yt=await o();if(r.aborted)break;if(yt){g=0,h=null,n?.("ready"),b(`[bridge:repl] Re-registered environment: ${yt.environmentId}`);continue}n?.("failed","Environment deleted and re-registration failed"),l?.();break}if(R instanceof cs){let N=Dv(R.errorType),yt=zoe(R);if(b(`[bridge:repl] Fatal poll error: ${R.message} (status=${R.status}, type=${R.errorType??"unknown"})${yt?" (suppressed)":""}`),Ye("tengu_bridge_repl_fatal_error",{status:R.status,error_type:R.errorType}),H(N?"info":"error","bridge_repl_fatal_error",{status:R.status,error_type:R.errorType}),!yt)n?.("failed",N?"Remote Control session expired.":R.message);l?.();break}let V=Date.now();if(m!==null&&V-m>Math.max(Eie,y)*2)b(`[bridge:repl] Detected system sleep (${Math.round((V-m)/1000)}s gap), resetting poll error budget`),H("info","bridge_repl_poll_sleep_detected",{gapMs:V-m}),g=0,h=null;if(m=V,g++,h===null)h=V;let Y=V-h,he=Uoe(R),He=Ooe(R),Ae=i?.()??"unknown";if(b(`[bridge:repl] Poll error (attempt ${g}, elapsed ${Math.round(Y/1000)}s, ws=${Ae}): ${He}`),Ye("tengu_bridge_repl_poll_error",{status:he,consecutiveErrors:g,elapsedMs:Y}),g===1)n?.("reconnecting",He);if(Y>=Iie){b(`[bridge:repl] Poll failures exceeded ${Iie/1000}s (${g} errors), giving up`),H("info","bridge_repl_poll_give_up"),Ye("tengu_bridge_repl_poll_give_up",{consecutiveErrors:g,elapsedMs:Y,lastStatus:he}),n?.("failed","connection to server lost");break}let ne=Foe(R),Pe=Math.min(Cie*2**(g-1),Eie),vt=Sie(ne!==void 0?Math.max(Pe,Math.min(ne,FYe)):Pe);if(y=vt,u().non_exclusive_heartbeat_interval_ms>0){let N=p?.();if(N)try{await e.heartbeatWork(N.environmentId,N.workId,N.sessionToken)}catch{}}await Nr(vt,r)}}b(`[bridge:repl] Work poll loop ended (aborted=${r.aborted}) env=${t().environmentId}`)}function jYe(e,t){return e?.includes("_staging_")===!0||t?.includes("staging")===!0}function zYe(e,t){return e?.includes("_local_")===!0||t?.includes("localhost")===!0}function HYe(e,t){if(zYe(e,t))return"http://localhost:4000";if(jYe(e,t))return"https://claude-ai.staging.ant.dev";return"https://claude.ai"}function xie(e,t,r){let{toCompatSessionId:n}=Nie(Poe),s=n(e),i=`${HYe(s,t)}/code/${s}`;return r?`${i}?${new URLSearchParams(r)}`:i}et();async function _ie(e){let{dir:t,registrationDir:r,name:n="Assistant",workerType:s="claude_code_assistant",branch:o="",gitRepoUrl:i=null,getAccessToken:a,getTrustedDeviceToken:c,baseUrl:l,orgUUID:u,model:p,perpetual:f=!1,initialSSESequenceNum:A,onConflict:g}=e,h=e.onAuth401;if(!a())return b("[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 m=l,y={baseUrl:l,getAccessToken:a,orgUUID:u,model:p},w=[],C=null,v=[],B=null,P=[],R=null,V=!1,Y=null,he={detail:null},He=qYe(),Ae=()=>wie({dir:t,registrationDir:r,machineName:He,branch:o,gitRepoUrl:i,title:n,baseUrl:l,sessionIngressUrl:m,workerType:s,getAccessToken:a,getTrustedDeviceToken:c,onAuth401:h,onInitError:console.error,createSession:({environmentId:ie,title:de,signal:Ft})=>fie({environmentId:ie,title:de,tags:["claude-code-assistant"],signal:Ft},y),archiveSession:(ie)=>Aie(ie,y),perpetual:f,initialSSESequenceNum:A,getCurrentTitle:()=>n,getPollIntervalConfig:()=>({...ug,non_exclusive_heartbeat_interval_ms:60000,poll_interval_ms_at_capacity:0}),onInboundMessage(ie){let de=rK(ie);if(!de)return;w.push({content:de.content,uuid:de.uuid}),C?.(),C=null},onInterrupt(){v.push({type:"control_request",request_id:"",request:{subtype:"interrupt"}}),B?.(),B=null},onSetModel(ie){v.push({type:"control_request",request_id:"",request:{subtype:"set_model",model:ie}}),B?.(),B=null},onSetMaxThinkingTokens(ie){v.push({type:"control_request",request_id:"",request:{subtype:"set_max_thinking_tokens",max_thinking_tokens:ie}}),B?.(),B=null},onPermissionResponse(ie){P.push(ie),R?.(),R=null},onStateChange(ie,de){if(Y?.(ie,de),ie==="failed")he.detail=de??"unknown failure",V=!0,C?.(),B?.(),R?.()}}),ne=await Ae();if(!ne&&g&&he.detail?.includes("409")){if(await g({machineName:He,message:he.detail})==="takeover")V=!1,he.detail=null,ne=await Ae()}if(!ne){let ie=he.detail??"initBridgeCore returned null (env registration or session creation failed)";return b(`[bridge:daemon] connectRemoteControl failed: ${ie}`),{ok:!1,error:{kind:he.detail?.includes("409")?"conflict":he.detail?.match(/ECONN|ETIMEDOUT|ENOTFOUND|network/i)?"network":"unknown",detail:ie}}}async function*Pe(){while(!V){while(w.length>0)if(yield w.shift(),V)return;await new Promise((ie)=>{C=ie})}}async function*vt(){while(!V){while(v.length>0)if(yield v.shift(),V)return;await new Promise((ie)=>{B=ie})}}async function*N(){while(!V){while(P.length>0)if(yield P.shift(),V)return;await new Promise((ie)=>{R=ie})}}return{ok:!0,handle:{get sessionUrl(){return xie(ne.bridgeSessionId,m)},get environmentId(){return ne.environmentId},get bridgeSessionId(){return ne.bridgeSessionId},getSSESequenceNum(){return ne.getSSESequenceNum()},hasPendingPrompts(){return w.length>0},write(ie){ne.writeSdkMessages([ie])},sendResult(){ne.sendResult()},sendControlRequest(ie){ne.sendControlRequest(ie)},sendControlResponse(ie){ne.sendControlResponse(ie)},sendControlCancelRequest(ie){ne.sendControlCancelRequest(ie)},inboundPrompts:Pe,controlRequests:vt,permissionResponses:N,onStateChange(ie){Y=ie},async teardown(){V=!0,C?.(),B?.(),R?.(),await ne.teardown()},[Symbol.asyncDispose](){return this.teardown()}}}}var VYe=1000,WYe=1e4,JYe=5000,YYe=60000,dN=3;function KYe(e){if((e.type==="user"||e.type==="assistant")&&e.parent_tool_use_id!==null)return!1;if(e.type==="user"){let t=e.message.content;if(!(Array.isArray(t)&&t.some((n)=>n.type==="tool_result")))return!1}return!0}function ZYe(e,t,r){let n=e.response?.request_id;if(!n)return null;let s=t.get(n);if(!s)return n;t.delete(n),r(n);let o=e.response;if(o.subtype==="success"&&IN(o.response))s(o.response);else s({behavior:"deny",message:"Bridge returned non-success or malformed permission response"});return null}function Lv(e){if(!e){ln("assistant_worker_start");return}if(e.kind==="auth"||e.kind==="conflict")Us("assistant_worker_start",e.kind);else Zr("assistant_worker_start",e.kind)}async function XYe(e){let{bridge:t,sandboxed:r=!1,scheduling:n,buildQueryOptions:s,canUseToolPreFilter:o,onPermissionResolved:i,transformOutbound:a,stateAdapter:c,initialPrompt:l,userIdleMs:u=300000,signal:p,log:f=()=>{}}=e;f("─── worker start ───");let A=await c?.load(),g={...t,initialSSESequenceNum:t.initialSSESequenceNum??A?.lastSSESequenceNum};if(!g.getAccessToken()){let re={kind:"auth",detail:"getAccessToken returned empty"};return Lv(re),{ok:!1,error:re}}let h=await _ie(g);if(!h.ok)return f(`bridge connection failed: ${h.error.kind} — ${h.error.detail}`),Lv(h.error),{ok:!1,error:h.error};let m=h.handle;f(`bridge connected url=${m.sessionUrl} env=${m.environmentId}`);let y=A?.claudeSessionId,w=m.bridgeSessionId,C=[],v=null,B=!1,P=null,R=0,V=!0,Y=0,he=Promise.resolve();function He(){if(!c)return;let re={claudeSessionId:y,lastSSESequenceNum:m.getSSESequenceNum(),bridgeSessionId:m.bridgeSessionId};he=he.then(()=>c.save(re).catch((ct)=>{f(`stateAdapter.save threw: ${ct}`)}))}function Ae(){if(C.length>0||m.hasPendingPrompts()){f("persist skipped: prompt queued");return}He()}He();let ne=new AbortController,Pe=new Map,vt=null;function N(){return vt??=(async()=>{Ae();for(let re of Pe.keys())m.sendControlCancelRequest(re);Pe.clear(),await m.teardown(),await he})()}if(p.addEventListener("abort",()=>{ne.abort(),N().catch((re)=>f(`teardown threw: ${re}`))}),p.aborted){await N();let re={kind:"unknown",detail:"aborted before start"};return Lv(re),{ok:!1,error:re}}let yt="connected";m.onStateChange((re,ct)=>{if(f(`bridge state=${re} detail=${ct??""}`),yt=re,re==="ready"&&m.bridgeSessionId!==w)w=m.bridgeSessionId,He();else if(re==="connected")Ae();if(re==="failed")f(`bridge failed: ${ct??"unknown"}`),ne.abort(),N().catch((gt)=>f(`teardown threw: ${gt}`))});let ie=n?.horizonMs??600000,de=n?.leadMs??JYe,Ft=null,Ct=!1,ee=!1,U="";async function we(){if(!n)return;let re=await Z4(n.dir).catch((gt)=>{return f(`computeCronHorizon threw: ${gt}`),{nextFire:null,hasOverdue:!1}});Ft=re.nextFire,ee=re.hasOverdue;let ct=re.nextFire===null?"cron horizon: no tasks":`cron horizon: nextFire=${new Date(re.nextFire).toISOString()} hasOverdue=${re.hasOverdue}`;if(ct!==U)U=ct,f(ct)}let _e;if(n)await we(),_e=setInterval(we,WYe),_e.unref?.();function qe(re){C.push({type:"user",message:{role:"user",content:re},parent_tool_use_id:null,session_id:""}),v?.(),v=null}async function Kt(re,ct,gt){if(o){let lr=await o(re,ct,gt);if(lr)return i?.(re,lr),lr}if(yt!=="connected"){f(`permission denied — bridge state=${yt}, request would drop`);let lr={behavior:"deny",message:`Cannot request permission: remote control is ${yt}. Try again in a moment.`};return i?.(re,lr),lr}let te=GYe();f(`permission request tool=${re} req=${te}`);let{signal:Qs,suggestions:Fa,blockedPath:Ri,toolUseID:ye}=gt;m.sendControlRequest({type:"control_request",request_id:te,request:{subtype:"can_use_tool",tool_name:re,display_name:vN(re),input:ct,tool_use_id:ye,...Fa&&{permission_suggestions:Fa},...Ri&&{blocked_path:Ri},..."decisionReason"in gt&>.decisionReason&&{decision_reason:gt.decisionReason},..."agentID"in gt&>.agentID&&{agent_id:gt.agentID}}});let Fn;try{let lr=await new Promise((Ti,Ts)=>{Pe.set(te,Ti),Fn=setTimeout((Di,_r,ge,us,Pr)=>{if(Di.delete(_r))ge(`permission timeout req=${_r}`),us.sendControlCancelRequest(_r),Pr({behavior:"deny",message:"Permission request timed out (no response in 60s)"})},YYe,Pe,te,f,m,Ti),Fn.unref?.(),Qs.addEventListener("abort",()=>{if(Pe.delete(te))m.sendControlCancelRequest(te);Ts(Error("aborted"))},{once:!0})});f(`permission response req=${te} behavior=${lr.behavior}`);let Rs=lr.behavior==="allow"?{behavior:"allow",updatedInput:lr.updatedInput,updatedPermissions:lr.updatedPermissions}:{behavior:"deny",message:lr.message??"Denied via remote control"};return i?.(re,Rs),Rs}finally{if(Fn)clearTimeout(Fn);Pe.delete(te)}}let tr=!1;async function Xe(){if(P!==null||tr||ne.signal.aborted)return;if(tr=!0,B=!1,C.length>0)V=!1;async function*re(){while(!B){while(C.length>0)if(V=!1,yield C.shift(),B)return;await new Promise((te)=>{v=te})}}f(`spawning query resume=${y??"<fresh>"}`);let ct={assistant:!0,cwd:t.dir,resume:y,stderr:(te)=>f(`[child] ${te.trimEnd()}`),canUseTool:Kt},gt;try{if(gt=await s(ct),r)gt={...gt,env:{...gt.env,CLAUDE_CODE_SANDBOXED:"1"}}}catch(te){if(f(`buildQueryOptions threw: ${te}`),tr=!1,Y++,Y>=dN)f(`${Y} consecutive buildQueryOptions failures — dropping ${C.length} queued input(s)`),C.length=0;else if(C.length>0&&!ne.signal.aborted)Xe();return}if(ne.signal.aborted){tr=!1;return}try{P=jJ({prompt:re(),options:gt})}finally{tr=!1}(async()=>{try{f("output pump started");for await(let te of P){if(te.type==="system"&&te.subtype==="init"){if(te.session_id!==y)y=te.session_id,Ae()}if(te.type==="result")V=!0,Y=0,Ct=!0,Ae();if(!KYe(te))continue;let Qs=a?a(te):te;if(Qs===null)continue;m.write(Qs)}}catch(te){f(`query threw: ${te}`),Y++}finally{f("output pump ended"),P=null;for(let te of Pe.keys())m.sendControlCancelRequest(te);if(Pe.clear(),C.length>0&&!ne.signal.aborted)if(Y>=dN)f(`${Y} consecutive crashes — dropping ${C.length} queued input(s)`),C.length=0;else Xe()}})()}let Un=setInterval(()=>{let re=Date.now(),ct=Ft!==null&&Ft-re<ie;if(P===null){let gt=Ft!==null&&Ft-re<de;if((gt||ee&&!Ct)&&Y<dN&&!ne.signal.aborted)f(gt?`cron due in ${Ft-re}ms, spawning child`:"overdue cron detected, spawning child for catch-up"),Xe();return}if(B)return;if(!V||C.length>0)return;if(re-R<u)return;if(ct)return;if(ee&&!Ct)return;f("idle conditions met → closing input gen"),Ae(),B=!0,v?.(),v=null},VYe);if(Un.unref?.(),l)f("initialPrompt → injecting"),R=Date.now(),qe(l),Xe();let ls=(async()=>{if(await Promise.all([(async()=>{for await(let re of m.inboundPrompts()){if(ne.signal.aborted)return;if(f("bridge prompt received"),R=Date.now(),re.uuid)m.write({type:"user",uuid:re.uuid,session_id:"",message:{role:"user",content:re.content},parent_tool_use_id:null});qe(re.content),Xe()}})(),(async()=>{for await(let re of m.controlRequests()){if(ne.signal.aborted)return;switch(re.request.subtype){case"interrupt":f("bridge interrupt"),P?.interrupt();break;case"set_model":f(`bridge setModel=${re.request.model??"<default>"}`),P?.setModel(re.request.model);break;case"set_max_thinking_tokens":f(`bridge setMaxThinkingTokens=${re.request.max_thinking_tokens}`),P?.setMaxThinkingTokens(re.request.max_thinking_tokens);break;default:}}})(),(async()=>{for await(let re of m.permissionResponses()){if(ne.signal.aborted)return;let ct=ZYe(re,Pe,m.sendControlCancelRequest);if(ct)f(`permission response for unknown req=${ct} (stale)`)}})()]),clearInterval(Un),_e)clearInterval(_e);P?.close(),await N(),f("─── worker stop ───")})(),at={get sessionUrl(){return m.sessionUrl},get bridgeSessionId(){return m.bridgeSessionId},get claudeSessionId(){return y},pushPrompt(re){R=Date.now(),qe(re),Xe()},async interrupt(){await P?.interrupt()},done:ls,teardown:N,[Symbol.asyncDispose]:N};return Lv(null),{ok:!0,handle:at}}process.env.NoDefaultCurrentDirectoryInExePath="1";export{XYe as runAssistantWorker};
|