@halcyonlabs/app 0.47.0-halcyon.352 → 0.47.0-halcyon.353

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/dist/index.d.ts CHANGED
@@ -83,8 +83,8 @@ declare const appSettingsSchema: z$1.ZodObject<{
83
83
  providerOrder: z$1.ZodArray<z$1.ZodString>;
84
84
  defaultProviderId: z$1.ZodNullable<z$1.ZodString>;
85
85
  providerCompletedTurnDisplay: z$1.ZodRecord<z$1.ZodString, z$1.ZodEnum<{
86
- collapse: "collapse";
87
86
  flat: "flat";
87
+ collapse: "collapse";
88
88
  }>>;
89
89
  streamerMode: z$1.ZodBoolean;
90
90
  allowFastServiceTier: z$1.ZodBoolean;
@@ -105,8 +105,8 @@ declare const appSettingsUpdateSchema: z$1.ZodUnion<readonly [z$1.ZodObject<{
105
105
  providerOrder: z$1.ZodArray<z$1.ZodString>;
106
106
  defaultProviderId: z$1.ZodNullable<z$1.ZodString>;
107
107
  providerCompletedTurnDisplay: z$1.ZodRecord<z$1.ZodString, z$1.ZodEnum<{
108
- collapse: "collapse";
109
108
  flat: "flat";
109
+ collapse: "collapse";
110
110
  }>>;
111
111
  streamerMode: z$1.ZodBoolean;
112
112
  managedBranchPrefix: z$1.ZodString;
@@ -143,8 +143,8 @@ declare const appSettingsUpdateSchema: z$1.ZodUnion<readonly [z$1.ZodObject<{
143
143
  providerOrder: z$1.ZodArray<z$1.ZodString>;
144
144
  defaultProviderId: z$1.ZodNullable<z$1.ZodString>;
145
145
  providerCompletedTurnDisplay: z$1.ZodRecord<z$1.ZodString, z$1.ZodEnum<{
146
- collapse: "collapse";
147
146
  flat: "flat";
147
+ collapse: "collapse";
148
148
  }>>;
149
149
  streamerMode: z$1.ZodBoolean;
150
150
  machineServerUrl: z$1.ZodNullable<z$1.ZodString>;
@@ -628,8 +628,8 @@ declare const hostSchema: z$1.ZodObject<{
628
628
  }, z$1.core.$strip>>;
629
629
  }, z$1.core.$strip>;
630
630
  maxPermissionMode: z$1.ZodEnum<{
631
- auto: "auto";
632
631
  full: "full";
632
+ auto: "auto";
633
633
  "accept-edits": "accept-edits";
634
634
  }>;
635
635
  delivery: z$1.ZodOptional<z$1.ZodNullable<z$1.ZodObject<{
@@ -3012,8 +3012,8 @@ declare const threadEventSchema: z$1.ZodUnion<readonly [z$1.ZodIntersection<z$1.
3012
3012
  command: "command";
3013
3013
  }>;
3014
3014
  origin: z$1.ZodEnum<{
3015
- project: "project";
3016
3015
  user: "user";
3016
+ project: "project";
3017
3017
  builtin: "builtin";
3018
3018
  }>;
3019
3019
  label: z$1.ZodString;
@@ -3102,8 +3102,8 @@ declare const threadEventSchema: z$1.ZodUnion<readonly [z$1.ZodIntersection<z$1.
3102
3102
  command: "command";
3103
3103
  }>;
3104
3104
  origin: z$1.ZodEnum<{
3105
- project: "project";
3106
3105
  user: "user";
3106
+ project: "project";
3107
3107
  builtin: "builtin";
3108
3108
  }>;
3109
3109
  label: z$1.ZodString;
@@ -3176,8 +3176,8 @@ declare const threadEventSchema: z$1.ZodUnion<readonly [z$1.ZodIntersection<z$1.
3176
3176
  }>;
3177
3177
  permissionMode: z$1.ZodEnum<{
3178
3178
  readonly: "readonly";
3179
- auto: "auto";
3180
3179
  full: "full";
3180
+ auto: "auto";
3181
3181
  "accept-edits": "accept-edits";
3182
3182
  "workspace-write": "workspace-write";
3183
3183
  }>;
@@ -3975,8 +3975,8 @@ type ReasoningLevel = z$1.infer<typeof reasoningLevelSchema>;
3975
3975
  declare const serviceTierSchema: z$1.ZodString;
3976
3976
  type ServiceTier = z$1.infer<typeof serviceTierSchema>;
3977
3977
  declare const permissionModeSchema: z$1.ZodEnum<{
3978
- auto: "auto";
3979
3978
  full: "full";
3979
+ auto: "auto";
3980
3980
  "accept-edits": "accept-edits";
3981
3981
  }>;
3982
3982
  type PermissionMode = z$1.infer<typeof permissionModeSchema>;
@@ -4020,8 +4020,8 @@ declare const promptTextMentionSchema: z$1.ZodObject<{
4020
4020
  command: "command";
4021
4021
  }>;
4022
4022
  origin: z$1.ZodEnum<{
4023
- project: "project";
4024
4023
  user: "user";
4024
+ project: "project";
4025
4025
  builtin: "builtin";
4026
4026
  }>;
4027
4027
  label: z$1.ZodString;
@@ -4085,8 +4085,8 @@ declare const promptInputSchema: z$1.ZodDiscriminatedUnion<[z$1.ZodObject<{
4085
4085
  command: "command";
4086
4086
  }>;
4087
4087
  origin: z$1.ZodEnum<{
4088
- project: "project";
4089
4088
  user: "user";
4089
+ project: "project";
4090
4090
  builtin: "builtin";
4091
4091
  }>;
4092
4092
  label: z$1.ZodString;
@@ -4145,8 +4145,8 @@ declare const resolvedThreadExecutionOptionsSchema: z$1.ZodObject<{
4145
4145
  serviceTier: z$1.ZodString;
4146
4146
  reasoningLevel: z$1.ZodString;
4147
4147
  permissionMode: z$1.ZodEnum<{
4148
- auto: "auto";
4149
4148
  full: "full";
4149
+ auto: "auto";
4150
4150
  "accept-edits": "accept-edits";
4151
4151
  }>;
4152
4152
  source: z$1.ZodEnum<{
@@ -4162,8 +4162,8 @@ declare const projectExecutionDefaultsSchema: z$1.ZodObject<{
4162
4162
  serviceTier: z$1.ZodString;
4163
4163
  reasoningLevel: z$1.ZodString;
4164
4164
  permissionMode: z$1.ZodEnum<{
4165
- auto: "auto";
4166
4165
  full: "full";
4166
+ auto: "auto";
4167
4167
  "accept-edits": "accept-edits";
4168
4168
  }>;
4169
4169
  }, z$1.core.$strip>;
@@ -4203,8 +4203,8 @@ declare const providerInfoSchema: z$1.ZodObject<{
4203
4203
  supportsFork: z$1.ZodBoolean;
4204
4204
  supportsSessionRewind: z$1.ZodBoolean;
4205
4205
  permissionModes: z$1.ZodArray<z$1.ZodEnum<{
4206
- auto: "auto";
4207
4206
  full: "full";
4207
+ auto: "auto";
4208
4208
  "accept-edits": "accept-edits";
4209
4209
  }>>;
4210
4210
  modelCatalogScope: z$1.ZodEnum<{
@@ -4240,8 +4240,8 @@ declare const providerInfoSchema: z$1.ZodObject<{
4240
4240
  }, z$1.core.$strip>;
4241
4241
  }, z$1.core.$strip>], "kind">>;
4242
4242
  completedTurnDisplay: z$1.ZodEnum<{
4243
- collapse: "collapse";
4244
4243
  flat: "flat";
4244
+ collapse: "collapse";
4245
4245
  }>;
4246
4246
  available: z$1.ZodBoolean;
4247
4247
  strings: z$1.ZodOptional<z$1.ZodObject<{
@@ -4397,8 +4397,8 @@ declare const threadQueuedMessageSchema: z$1.ZodObject<{
4397
4397
  command: "command";
4398
4398
  }>;
4399
4399
  origin: z$1.ZodEnum<{
4400
- project: "project";
4401
4400
  user: "user";
4401
+ project: "project";
4402
4402
  builtin: "builtin";
4403
4403
  }>;
4404
4404
  label: z$1.ZodString;
@@ -4444,8 +4444,8 @@ declare const threadQueuedMessageSchema: z$1.ZodObject<{
4444
4444
  model: z$1.ZodString;
4445
4445
  reasoningLevel: z$1.ZodString;
4446
4446
  permissionMode: z$1.ZodEnum<{
4447
- auto: "auto";
4448
4447
  full: "full";
4448
+ auto: "auto";
4449
4449
  "accept-edits": "accept-edits";
4450
4450
  }>;
4451
4451
  serviceTier: z$1.ZodString;
@@ -5766,9 +5766,9 @@ declare const hostDaemonCommandRegistry: {
5766
5766
  }, z$1.core.$strict>, z$1.ZodDiscriminatedUnion<[z$1.ZodObject<{
5767
5767
  kind: z$1.ZodLiteral<"wording">;
5768
5768
  status: z$1.ZodEnum<{
5769
+ unavailable: "unavailable";
5769
5770
  pass: "pass";
5770
5771
  revise: "revise";
5771
- unavailable: "unavailable";
5772
5772
  }>;
5773
5773
  }, z$1.core.$strict>, z$1.ZodObject<{
5774
5774
  kind: z$1.ZodLiteral<"review">;
@@ -7860,13 +7860,13 @@ declare const hostDaemonCommandRegistry: {
7860
7860
  modifiedAtMs: z$1.ZodOptional<z$1.ZodNumber>;
7861
7861
  sha256: z$1.ZodString;
7862
7862
  }, z$1.core.$strip>, z$1.ZodObject<{
7863
- path: z$1.ZodString;
7864
7863
  contentEncoding: z$1.ZodEnum<{
7865
7864
  base64: "base64";
7866
7865
  utf8: "utf8";
7867
7866
  }>;
7868
7867
  sha256: z$1.ZodString;
7869
7868
  sizeBytes: z$1.ZodNumber;
7869
+ path: z$1.ZodString;
7870
7870
  mimeType: z$1.ZodOptional<z$1.ZodString>;
7871
7871
  modifiedAtMs: z$1.ZodOptional<z$1.ZodNumber>;
7872
7872
  notModified: z$1.ZodLiteral<true>;
@@ -256,7 +256,7 @@ function run(argv) {
256
256
  return JSON.stringify(output);
257
257
  }
258
258
  `,M5e=i.array(i.object({appPath:i.string().min(1),bundleId:i.string().min(1).nullable()}).strict());V5e=new Set(["FileManager","TerminalEmulator","TextEditor"]);Y5e=1024*1024});var oB,kae=g(()=>{oB=(e,t,n)=>(r,o)=>{let s=-1;return a(0);async function a(c){if(c<=s)throw new Error("next() called multiple times");s=c;let l,u=!1,d;if(e[c]?(d=e[c][0][0],r.req.routeIndex=c):d=c===e.length&&o||void 0,d)try{l=await d(r,()=>a(c+1))}catch(p){if(p instanceof Error&&t)r.error=p,l=await t(p,r),u=!0;else throw p}else r.finalized===!1&&n&&(l=await n(r));return l&&(r.finalized===!1||u)&&(r.res=l),r}}});var iB,sB=g(()=>{iB=class extends Error{res;status;constructor(e=500,t){super(t?.message,{cause:t?.cause}),this.res=t?.res,this.status=e}getResponse(){return this.res?new Response(this.res.body,{status:this.status,headers:this.res.headers}):new Response(this.message,{status:this.status})}}});var Aae,Cae=g(()=>{Aae=Symbol()});async function L8e(e,t){let n=await e.formData();return n?B8e(n,t):{}}function B8e(e,t){let n=Object.create(null);return e.forEach((r,o)=>{t.all||o.endsWith("[]")?F8e(n,o,r):n[o]=r}),t.dot&&Object.entries(n).forEach(([r,o])=>{r.includes(".")&&($8e(n,r,o),delete n[r])}),n}var Dae,F8e,$8e,Oae=g(()=>{aB();Dae=async(e,t=Object.create(null))=>{let{all:n=!1,dot:r=!1}=t,s=(e instanceof aw?e.raw.headers:e.headers).get("Content-Type");return s?.startsWith("multipart/form-data")||s?.startsWith("application/x-www-form-urlencoded")?L8e(e,{all:n,dot:r}):{}};F8e=(e,t,n)=>{e[t]!==void 0?Array.isArray(e[t])?e[t].push(n):e[t]=[e[t],n]:t.endsWith("[]")?e[t]=[n]:e[t]=n},$8e=(e,t,n)=>{let r=e,o=t.split(".");o.forEach((s,a)=>{a===o.length-1?r[s]=n:((!r[s]||typeof r[s]!="object"||Array.isArray(r[s])||r[s]instanceof File)&&(r[s]=Object.create(null)),r=r[s])})}});var Mae,aw,aB=g(()=>{sB();Cae();Oae();zs();Mae=e=>Up(e,qb),aw=class{raw;#t;#e;routeIndex=0;path;bodyCache={};constructor(e,t="/",n=[[]]){this.raw=e,this.path=t,this.#e=n,this.#t={}}param(e){return e?this.#n(e):this.#o()}#n(e){let t=this.#e[0][this.routeIndex][1][e],n=this.#i(t);return n&&/\%/.test(n)?Mae(n):n}#o(){let e={},t=Object.keys(this.#e[0][this.routeIndex][1]);for(let n of t){let r=this.#i(this.#e[0][this.routeIndex][1][n]);r!==void 0&&(e[n]=/\%/.test(r)?Mae(r):r)}return e}#i(e){return this.#e[1]?this.#e[1][e]:e}query(e){return F5(this.url,e)}queries(e){return $5(this.url,e)}header(e){if(e)return this.raw.headers.get(e)??void 0;let t={};return this.raw.headers.forEach((n,r)=>{t[r]=n}),t}async parseBody(e){return this.bodyCache.parsedBody??=await Dae(this,e)}#r=e=>{let{bodyCache:t,raw:n}=this,r=t[e];if(r)return r;let o=Object.keys(t)[0];return o?t[o].then(s=>(o==="json"&&(s=JSON.stringify(s)),new Response(s)[e]())):t[e]=n[e]()};json(){return this.#r("text").then(e=>JSON.parse(e))}text(){return this.#r("text")}arrayBuffer(){return this.#r("arrayBuffer")}blob(){return this.#r("blob")}formData(){return this.#r("formData")}addValidatedData(e,t){this.#t[e]=t}valid(e){return this.#t[e]}get url(){return this.raw.url}get method(){return this.raw.method}get[Aae](){return this.#e}get matchedRoutes(){return this.#e[0].map(([[,e]])=>e)}get routePath(){return this.#e[0].map(([[,e]])=>e)[this.routeIndex].path}}});var Nae,j8e,cB,Lae=g(()=>{Nae={Stringify:1,BeforeStream:2,Stream:3},j8e=(e,t)=>{let n=new String(e);return n.isEscaped=!0,n.callbacks=t,n},cB=async(e,t,n,r,o)=>{typeof e=="object"&&!(e instanceof String)&&(e instanceof Promise||(e=e.toString()),e instanceof Promise&&(e=await e));let s=e.callbacks;if(!s?.length)return Promise.resolve(e);o?o[0]+=e:o=[e];let a=Promise.all(s.map(c=>c({phase:t,buffer:o,context:r}))).then(c=>Promise.all(c.filter(Boolean).map(l=>cB(l,t,!1,r,o))).then(()=>o[0]));return n?j8e(await a,s):a}});var H8e,lB,Bae,Fae=g(()=>{aB();Lae();H8e="text/plain; charset=UTF-8",lB=(e,t)=>({"Content-Type":e,...t}),Bae=class{#t;#e;env={};#n;finalized=!1;error;#o;#i;#r;#s;#a;#c;#u;#d;#p;constructor(e,t){this.#t=e,t&&(this.#i=t.executionCtx,this.env=t.env,this.#c=t.notFoundHandler,this.#p=t.path,this.#d=t.matchResult)}get req(){return this.#e??=new aw(this.#t,this.#p,this.#d),this.#e}get event(){if(this.#i&&"respondWith"in this.#i)return this.#i;throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#i)return this.#i;throw Error("This context has no ExecutionContext")}get res(){return this.#r||=new Response(null,{headers:this.#u??=new Headers})}set res(e){if(this.#r&&e){e=new Response(e.body,e);for(let[t,n]of this.#r.headers.entries())if(t!=="content-type")if(t==="set-cookie"){let r=this.#r.headers.getSetCookie();e.headers.delete("set-cookie");for(let o of r)e.headers.append("set-cookie",o)}else e.headers.set(t,n)}this.#r=e,this.finalized=!0}render=(...e)=>(this.#a??=t=>this.html(t),this.#a(...e));setLayout=e=>this.#s=e;getLayout=()=>this.#s;setRenderer=e=>{this.#a=e};header=(e,t,n)=>{this.finalized&&(this.#r=new Response(this.#r.body,this.#r));let r=this.#r?this.#r.headers:this.#u??=new Headers;t===void 0?r.delete(e):n?.append?r.append(e,t):r.set(e,t)};status=e=>{this.#o=e};set=(e,t)=>{this.#n??=new Map,this.#n.set(e,t)};get=e=>this.#n?this.#n.get(e):void 0;get var(){return this.#n?Object.fromEntries(this.#n):{}}#l(e,t,n){let r=this.#r?new Headers(this.#r.headers):this.#u??new Headers;if(typeof t=="object"&&"headers"in t){let s=t.headers instanceof Headers?t.headers:new Headers(t.headers);for(let[a,c]of s)a.toLowerCase()==="set-cookie"?r.append(a,c):r.set(a,c)}if(n)for(let[s,a]of Object.entries(n))if(typeof a=="string")r.set(s,a);else{r.delete(s);for(let c of a)r.append(s,c)}let o=typeof t=="number"?t:t?.status??this.#o;return new Response(e,{status:o,headers:r})}newResponse=(...e)=>this.#l(...e);body=(e,t,n)=>this.#l(e,t,n);text=(e,t,n)=>!this.#u&&!this.#o&&!t&&!n&&!this.finalized?new Response(e):this.#l(e,t,lB(H8e,n));json=(e,t,n)=>this.#l(JSON.stringify(e),t,lB("application/json",n));html=(e,t,n)=>{let r=o=>this.#l(o,t,lB("text/html; charset=UTF-8",n));return typeof e=="object"?cB(e,Nae.Stringify,!1,{}).then(r):r(e)};redirect=(e,t)=>{let n=String(e);return this.header("Location",/[^\x00-\xFF]/.test(n)?encodeURI(n):n),this.newResponse(null,t??302)};notFound=()=>(this.#c??=()=>new Response,this.#c(this))}});var at,$ae,jae,cw,lw,Ea=g(()=>{at="ALL",$ae="all",jae=["get","post","put","delete","options","patch"],cw="Can not add a route since the matcher is already built.",lw=class extends Error{}});var Hae,Uae=g(()=>{Hae="__COMPOSED_HANDLER"});var U8e,zae,Wae,Gae=g(()=>{kae();Fae();Ea();Uae();zs();U8e=e=>e.text("404 Not Found",404),zae=(e,t)=>{if("getResponse"in e){let n=e.getResponse();return t.newResponse(n.body,n)}return console.error(e),t.text("Internal Server Error",500)},Wae=class qae{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#t="/";routes=[];constructor(t={}){[...jae,$ae].forEach(s=>{this[s]=(a,...c)=>(typeof a=="string"?this.#t=a:this.#o(s,this.#t,a),c.forEach(l=>{this.#o(s,this.#t,l)}),this)}),this.on=(s,a,...c)=>{for(let l of[a].flat()){this.#t=l;for(let u of[s].flat())c.map(d=>{this.#o(u.toUpperCase(),this.#t,d)})}return this},this.use=(s,...a)=>(typeof s=="string"?this.#t=s:(this.#t="*",a.unshift(s)),a.forEach(c=>{this.#o(at,this.#t,c)}),this);let{strict:r,...o}=t;Object.assign(this,o),this.getPath=r??!0?t.getPath??i0:L5}#e(){let t=new qae({router:this.router,getPath:this.getPath});return t.errorHandler=this.errorHandler,t.#n=this.#n,t.routes=this.routes,t}#n=U8e;errorHandler=zae;route(t,n){let r=this.basePath(t);return n.routes.map(o=>{let s;n.errorHandler===zae?s=o.handler:(s=async(a,c)=>(await oB([],n.errorHandler)(a,()=>o.handler(a,c))).res,s[Hae]=o.handler),r.#o(o.method,o.path,s)}),this}basePath(t){let n=this.#e();return n._basePath=Us(this._basePath,t),n}onError=t=>(this.errorHandler=t,this);notFound=t=>(this.#n=t,this);mount(t,n,r){let o,s;r&&(typeof r=="function"?s=r:(s=r.optionHandler,r.replaceRequest===!1?o=l=>l:o=r.replaceRequest));let a=s?l=>{let u=s(l);return Array.isArray(u)?u:[u]}:l=>{let u;try{u=l.executionCtx}catch{}return[l.env,u]};o||=(()=>{let l=Us(this._basePath,t),u=l==="/"?0:l.length;return d=>{let p=new URL(d.url);return p.pathname=p.pathname.slice(u)||"/",new Request(p,d)}})();let c=async(l,u)=>{let d=await n(o(l.req.raw),...a(l));if(d)return d;await u()};return this.#o(at,Us(t,"*"),c),this}#o(t,n,r){t=t.toUpperCase(),n=Us(this._basePath,n);let o={basePath:this._basePath,path:n,method:t,handler:r};this.router.add(t,n,[r,o]),this.routes.push(o)}#i(t,n){if(t instanceof Error)return this.errorHandler(t,n);throw t}#r(t,n,r,o){if(o==="HEAD")return(async()=>new Response(null,await this.#r(t,n,r,"GET")))();let s=this.getPath(t,{env:r}),a=this.router.match(o,s),c=new Bae(t,{path:s,matchResult:a,env:r,executionCtx:n,notFoundHandler:this.#n});if(a[0].length===1){let u;try{u=a[0][0][0][0](c,async()=>{c.res=await this.#n(c)})}catch(d){return this.#i(d,c)}return u instanceof Promise?u.then(d=>d||(c.finalized?c.res:this.#n(c))).catch(d=>this.#i(d,c)):u??this.#n(c)}let l=oB(a[0],this.errorHandler,this.#n);return(async()=>{try{let u=await l(c);if(!u.finalized)throw new Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return u.res}catch(u){return this.#i(u,c)}})()}fetch=(t,...n)=>this.#r(t,n[1],n[0],t.method);request=(t,n,r,o)=>t instanceof Request?this.fetch(n?new Request(t,n):t,r,o):(t=t.toString(),this.fetch(new Request(/^https?:\/\//.test(t)?t:`http://localhost${Us("/",t)}`,n),r,o));fire=()=>{addEventListener("fetch",t=>{t.respondWith(this.#r(t.request,t,void 0,t.request.method))})}}});function uB(e,t){let n=this.buildAllMatchers(),r=((o,s)=>{let a=n[o]||n[at],c=a[2][s];if(c)return c;let l=s.match(a[0]);if(!l)return[[],uw];let u=l.indexOf("",1);return[a[1][u],l]});return this.match=r,r(e,t)}var uw,dB=g(()=>{Ea();uw=[]});function W8e(e,t){return e.length===1?t.length===1?e<t?-1:1:-1:t.length===1||e===ef||e===tf?1:t===ef||t===tf?-1:e===dw?1:t===dw?-1:e.length===t.length?e<t?-1:1:t.length-e.length}var dw,ef,tf,Pa,z8e,Vae,mB=g(()=>{dw="[^/]+",ef=".*",tf="(?:|/.*)",Pa=Symbol(),z8e=new Set(".\\+*[^]$()");Vae=class pB{#t;#e;#n=Object.create(null);insert(t,n,r,o,s){if(t.length===0){if(this.#t!==void 0)throw Pa;if(s)return;this.#t=n;return}let[a,...c]=t,l=a==="*"?c.length===0?["","",ef]:["","",dw]:a==="/*"?["","",tf]:a.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),u;if(l){let d=l[1],p=l[2]||dw;if(d&&l[2]&&(p===".*"||(p=p.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(p))))throw Pa;if(u=this.#n[p],!u){if(Object.keys(this.#n).some(m=>m!==ef&&m!==tf))throw Pa;if(s)return;u=this.#n[p]=new pB,d!==""&&(u.#e=o.varIndex++)}!s&&d!==""&&r.push([d,u.#e])}else if(u=this.#n[a],!u){if(Object.keys(this.#n).some(d=>d.length>1&&d!==ef&&d!==tf))throw Pa;if(s)return;u=this.#n[a]=new pB}u.insert(c,n,r,o,s)}buildRegExpStr(){let n=Object.keys(this.#n).sort(W8e).map(r=>{let o=this.#n[r];return(typeof o.#e=="number"?`(${r})@${o.#e}`:z8e.has(r)?`\\${r}`:r)+o.buildRegExpStr()});return typeof this.#t=="number"&&n.unshift(`#${this.#t}`),n.length===0?"":n.length===1?n[0]:"(?:"+n.join("|")+")"}}});var Kae,Zae=g(()=>{mB();Kae=class{#t={varIndex:0};#e=new Vae;insert(e,t,n){let r=[],o=[];for(let a=0;;){let c=!1;if(e=e.replace(/\{[^}]+\}/g,l=>{let u=`@\\${a}`;return o[a]=[u,l],a++,c=!0,u}),!c)break}let s=e.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let a=o.length-1;a>=0;a--){let[c]=o[a];for(let l=s.length-1;l>=0;l--)if(s[l].indexOf(c)!==-1){s[l]=s[l].replace(c,o[a][1]);break}}return this.#e.insert(s,t,r,this.#t,n),r}buildRegExp(){let e=this.#e.buildRegExpStr();if(e==="")return[/^$/,[],[]];let t=0,n=[],r=[];return e=e.replace(/#(\d+)|@(\d+)|\.\*\$/g,(o,s,a)=>s!==void 0?(n[++t]=Number(s),"$()"):(a!==void 0&&(r[Number(a)]=++t),"")),[new RegExp(`^${e}`),n,r]}}});function Yae(e){return Jae[e]??=new RegExp(e==="*"?"":`^${e.replace(/\/\*$|([.\\+*[^\]$()])/g,(t,n)=>n?`\\${n}`:"(?:|/.*)")}$`)}function G8e(){Jae=Object.create(null)}function V8e(e){let t=new Kae,n=[];if(e.length===0)return q8e;let r=e.map(u=>[!/\*|\/:/.test(u[0]),...u]).sort(([u,d],[p,m])=>u?1:p?-1:d.length-m.length),o=Object.create(null);for(let u=0,d=-1,p=r.length;u<p;u++){let[m,f,v]=r[u];m?o[f]=[v.map(([S])=>[S,Object.create(null)]),uw]:d++;let b;try{b=t.insert(f,d,m)}catch(S){throw S===Pa?new lw(f):S}m||(n[d]=v.map(([S,E])=>{let w=Object.create(null);for(E-=1;E>=0;E--){let[T,A]=b[E];w[T]=A}return[S,w]}))}let[s,a,c]=t.buildRegExp();for(let u=0,d=n.length;u<d;u++)for(let p=0,m=n[u].length;p<m;p++){let f=n[u][p]?.[1];if(!f)continue;let v=Object.keys(f);for(let b=0,S=v.length;b<S;b++)f[v[b]]=c[f[v[b]]]}let l=[];for(let u in a)l[u]=n[a[u]];return[s,l,o]}function pu(e,t){if(e){for(let n of Object.keys(e).sort((r,o)=>o.length-r.length))if(Yae(n).test(t))return[...e[n]]}}var q8e,Jae,pw,fB=g(()=>{Ea();zs();dB();mB();Zae();q8e=[/^$/,[],Object.create(null)],Jae=Object.create(null);pw=class{name="RegExpRouter";#t;#e;constructor(){this.#t={[at]:Object.create(null)},this.#e={[at]:Object.create(null)}}add(e,t,n){let r=this.#t,o=this.#e;if(!r||!o)throw new Error(cw);r[e]||[r,o].forEach(c=>{c[e]=Object.create(null),Object.keys(c[at]).forEach(l=>{c[e][l]=[...c[at][l]]})}),t==="/*"&&(t="*");let s=(t.match(/\/:/g)||[]).length;if(/\*$/.test(t)){let c=Yae(t);e===at?Object.keys(r).forEach(l=>{r[l][t]||=pu(r[l],t)||pu(r[at],t)||[]}):r[e][t]||=pu(r[e],t)||pu(r[at],t)||[],Object.keys(r).forEach(l=>{(e===at||e===l)&&Object.keys(r[l]).forEach(u=>{c.test(u)&&r[l][u].push([n,s])})}),Object.keys(o).forEach(l=>{(e===at||e===l)&&Object.keys(o[l]).forEach(u=>c.test(u)&&o[l][u].push([n,s]))});return}let a=Wb(t)||[t];for(let c=0,l=a.length;c<l;c++){let u=a[c];Object.keys(o).forEach(d=>{(e===at||e===d)&&(o[d][u]||=[...pu(r[d],u)||pu(r[at],u)||[]],o[d][u].push([n,s-l+c+1]))})}}match=uB;buildAllMatchers(){let e=Object.create(null);return Object.keys(this.#e).concat(Object.keys(this.#t)).forEach(t=>{e[t]||=this.#n(t)}),this.#t=this.#e=void 0,G8e(),e}#n(e){let t=[],n=e===at;return[this.#t,this.#e].forEach(r=>{let o=r[e]?Object.keys(r[e]).map(s=>[s,r[e][s]]):[];o.length!==0?(n||=!0,t.push(...o)):e!==at&&t.push(...Object.keys(r[at]).map(s=>[s,r[at][s]]))}),n?V8e(t):null}}});var Xae=g(()=>{Ea();dB();fB()});var Qae=g(()=>{fB();Xae()});var hB,ece=g(()=>{Ea();hB=class{name="SmartRouter";#t=[];#e=[];constructor(e){this.#t=e.routers}add(e,t,n){if(!this.#e)throw new Error(cw);this.#e.push([e,t,n])}match(e,t){if(!this.#e)throw new Error("Fatal error");let n=this.#t,r=this.#e,o=n.length,s=0,a;for(;s<o;s++){let c=n[s];try{for(let l=0,u=r.length;l<u;l++)c.add(...r[l]);a=c.match(e,t)}catch(l){if(l instanceof lw)continue;throw l}this.match=c.match.bind(c),this.#t=[c],this.#e=void 0;break}if(s===o)throw new Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,a}get activeRouter(){if(this.#e||this.#t.length!==1)throw new Error("No active router has been determined yet.");return this.#t[0]}}});var tce=g(()=>{ece()});var nf,nce,oce=g(()=>{Ea();zs();nf=Object.create(null),nce=class rce{#t;#e;#n;#o=0;#i=nf;constructor(t,n,r){if(this.#e=r||Object.create(null),this.#t=[],t&&n){let o=Object.create(null);o[t]={handler:n,possibleKeys:[],score:0},this.#t=[o]}this.#n=[]}insert(t,n,r){this.#o=++this.#o;let o=this,s=M5(n),a=[];for(let c=0,l=s.length;c<l;c++){let u=s[c],d=s[c+1],p=N5(u,d),m=Array.isArray(p)?p[0]:u;if(m in o.#e){o=o.#e[m],p&&a.push(p[1]);continue}o.#e[m]=new rce,p&&(o.#n.push(p),a.push(p[1])),o=o.#e[m]}return o.#t.push({[t]:{handler:r,possibleKeys:a.filter((c,l,u)=>u.indexOf(c)===l),score:this.#o}}),o}#r(t,n,r,o){let s=[];for(let a=0,c=t.#t.length;a<c;a++){let l=t.#t[a],u=l[n]||l[at],d={};if(u!==void 0&&(u.params=Object.create(null),s.push(u),r!==nf||o&&o!==nf))for(let p=0,m=u.possibleKeys.length;p<m;p++){let f=u.possibleKeys[p],v=d[u.score];u.params[f]=o?.[f]&&!v?o[f]:r[f]??o?.[f],d[u.score]=!0}}return s}search(t,n){let r=[];this.#i=nf;let s=[this],a=o0(n),c=[];for(let l=0,u=a.length;l<u;l++){let d=a[l],p=l===u-1,m=[];for(let f=0,v=s.length;f<v;f++){let b=s[f],S=b.#e[d];S&&(S.#i=b.#i,p?(S.#e["*"]&&r.push(...this.#r(S.#e["*"],t,b.#i)),r.push(...this.#r(S,t,b.#i))):m.push(S));for(let E=0,w=b.#n.length;E<w;E++){let T=b.#n[E],A=b.#i===nf?{}:{...b.#i};if(T==="*"){let U=b.#e["*"];U&&(r.push(...this.#r(U,t,b.#i)),U.#i=A,m.push(U));continue}let[F,$,B]=T;if(!d&&!(B instanceof RegExp))continue;let H=b.#e[F],D=a.slice(l).join("/");if(B instanceof RegExp){let U=B.exec(D);if(U){if(A[$]=U[0],r.push(...this.#r(H,t,b.#i,A)),Object.keys(H.#e).length){H.#i=A;let N=U[0].match(/\//)?.length??0;(c[N]||=[]).push(H)}continue}}(B===!0||B.test(d))&&(A[$]=d,p?(r.push(...this.#r(H,t,A,b.#i)),H.#e["*"]&&r.push(...this.#r(H.#e["*"],t,A,b.#i))):(H.#i=A,m.push(H)))}}s=m.concat(c.shift()??[])}return r.length>1&&r.sort((l,u)=>l.score-u.score),[r.map(({handler:l,params:u})=>[l,u])]}}});var gB,ice=g(()=>{zs();oce();gB=class{name="TrieRouter";#t;constructor(){this.#t=new nce}add(e,t,n){let r=Wb(t);if(r){for(let o=0,s=r.length;o<s;o++)this.#t.insert(e,r[o],n);return}this.#t.insert(e,t,n)}match(e,t){return this.#t.search(e,t)}}});var sce=g(()=>{ice()});var vB,ace=g(()=>{Gae();Qae();tce();sce();vB=class extends Wae{constructor(e={}){super(e),this.router=e.router??new hB({routers:[new pw,new gB]})}}});var cce=g(()=>{ace()});var lce,uce=g(()=>{lce=e=>{let n={...{origin:"*",allowMethods:["GET","HEAD","PUT","POST","DELETE","PATCH"],allowHeaders:[],exposeHeaders:[]},...e},r=(s=>typeof s=="string"?s==="*"?()=>s:a=>s===a?a:null:typeof s=="function"?s:a=>s.includes(a)?a:null)(n.origin),o=(s=>typeof s=="function"?s:Array.isArray(s)?()=>s:()=>[])(n.allowMethods);return async function(a,c){function l(d,p){a.res.headers.set(d,p)}let u=await r(a.req.header("origin")||"",a);if(u&&l("Access-Control-Allow-Origin",u),n.credentials&&l("Access-Control-Allow-Credentials","true"),n.exposeHeaders?.length&&l("Access-Control-Expose-Headers",n.exposeHeaders.join(",")),a.req.method==="OPTIONS"){n.origin!=="*"&&l("Vary","Origin"),n.maxAge!=null&&l("Access-Control-Max-Age",n.maxAge.toString());let d=await o(a.req.header("origin")||"",a);d.length&&l("Access-Control-Allow-Methods",d.join(","));let p=n.allowHeaders;if(!p?.length){let m=a.req.header("Access-Control-Request-Headers");m&&(p=m.split(/\s*,\s*/))}return p?.length&&(l("Access-Control-Allow-Headers",p.join(",")),a.res.headers.append("Vary","Access-Control-Request-Headers")),a.res.headers.delete("Content-Length"),a.res.headers.delete("Content-Type"),new Response(null,{headers:a.res.headers,status:204,statusText:"No Content"})}await c(),n.origin!=="*"&&a.header("Vary","Origin",{append:!0})}}});import K8e from"node:fs/promises";function J8e(e){return e==="localhost"||e.endsWith(".localhost")||e.startsWith("[")&&e.endsWith("]")?!0:/^\d{1,3}(?:\.\d{1,3}){3}$/u.test(e)}function Y8e(e,t=Date.now){let n=null;return{async load(){if(e===void 0)return pce;let r=t();return n!==null&&n.expiresAtMs>r||(n={expiresAtMs:r+Z8e,promise:X8e(e)}),n.promise}}}async function X8e(e){try{return zse(JSON.parse(await K8e.readFile(Use(e),"utf8")))}catch(t){if(!Ne(t,"ENOENT"))throw t;return pce}}async function Q8e(e,t){try{let n=Jm(e);return(await t.load()).servers[n]!==void 0}catch{return!1}}async function eJe({configLoader:e,request:t}){if(t.context.kind==="local")return{columnNumber:t.columnNumber,context:{kind:"local"},lineNumber:t.lineNumber,path:t.path,targetId:t.targetId};let n=Jm(t.context.serverOrigin),r=await e.load(),o=Wse(r,{serverOrigin:n,hostId:t.context.hostId});if(o===null)throw new Ze({code:"remote_mapping_missing",message:`No SSH target configured for host ${t.context.hostId} on ${n}. Run: bb-app client ssh-target set ${n} <ssh-target> --host-id ${t.context.hostId}`});return{columnNumber:t.columnNumber,context:{kind:"remote-ssh",sshAuthority:o},lineNumber:t.lineNumber,path:t.path,targetId:t.targetId}}function dce(e){return vae({...On(e.shellEnv?.()??{})})}async function mce(e){let t=new vB,n=Y8e(e.dataDir),r={serverPort:e.serverPort};gn({key:"appUrl",target:r,value:e.appUrl}),gn({key:"devAppPort",target:r,value:e.devAppPort});let o=new Set(jse(r));try{o.add(new URL(e.serverUrl).origin)}catch{}let s=async(m,f)=>{if(o.has(m)||await Q8e(m,n))return!0;let v;try{v=new URL(m)}catch{return!1}return J8e(v.hostname)&&m===new URL(f).origin};t.use("*",lce({origin:async(m,f)=>await s(m,f.req.url)?m:null})),t.get(e.localApiConfig.healthPath,m=>m.text(e8.parse(e.localApiConfig.healthValue))),t.use("*",async(m,f)=>{let v=m.req.header("origin");if(v!==void 0&&!await s(v,m.req.url))return m.json({error:`origin "${v}" is not a local BB app origin`},403);await f()});let{get:a,post:c}=uS(t),l=iu();a("/status",m=>m.json({hostId:e.hostId,connected:e.getConnected(),protocolVersion:258,serverUrl:e.serverUrl,supportsNativeFolderPicker:l==="darwin",platform:l})),a("/workspace-open-targets",Z5,async(m,f)=>m.json({targets:await(e.listWorkspaceOpenTargets??(v=>Sae(dce(e),v)))(f)})),c("/open-in-target",J5,async(m,f)=>{try{await(e.openInTarget??(v=>Iae(v,dce(e))))(await eJe({configLoader:n,request:f}))}catch(v){throw v instanceof Ze?new iB(400,{message:v.message}):v}return m.json({})});let u;try{u=await new Promise((m,f)=>{let v=Fse({fetch:t.fetch,port:e.localApiConfig.port,hostname:e.localApiConfig.bindHost},b=>m({server:v,port:b.port}));v.on("error",f)})}catch(m){throw Ne(m,"EADDRINUSE")?new Error(`Host daemon local API port ${e.localApiConfig.port} is already in use on ${e.localApiConfig.bindHost}. Choose another port with --host-daemon-port <port>.`,{cause:m}):m}let{server:d,port:p}=u;return{bindHost:e.localApiConfig.bindHost,port:p,async close(){await new Promise((m,f)=>{d.close(v=>{if(v){f(v);return}m()})})}}}var Z8e,pce,fce=g(()=>{"use strict";$se();Hse();qse();op();wt();_ae();cce();uce();sB();Uo();Zx();ta();Z8e=1e3,pce={servers:{}}});import{mkdir as tJe}from"node:fs/promises";import nJe from"node:path";function sJe(e){return e.signal?`signal ${e.signal}`:e.code!==null?`code ${e.code}`:"unknown status"}function aJe(e){return`Provider "${e.providerId}" exited unexpectedly with ${sJe(e)}`}function cJe(e){if(e.stderr)return`stderr:
259
- ${mY(e.stderr,iJe)}`}function lJe(e,t){let n=Object.entries(e),r=Object.entries(t);return n.length!==r.length?!1:n.every(([o,s])=>t[o]===s)}function hce(e){let t={};e.PATH&&(t.PATH=e.PATH);let n=process.env.BB_PROVIDER_BRIDGE_RECORD_DIR;return n&&(t.BB_PROVIDER_BRIDGE_RECORD_DIR=n),Object.keys(t).length>0?t:null}var yB,rJe,oJe,iJe,bB,mw,gce=g(()=>{"use strict";HS();RS();Me();$o();_x();SL();ta();jM();la();yB=()=>{},rJe="provider-maintenance-workspace",oJe=6e4,iJe=4e3,bB=class extends Error{constructor(t){super(`Daemon bug: a command targeting no thread carried injected skill sources into busy environment ${t.environmentId} (active catalog ${t.activeCatalogHash??"none"}, requested ${t.requestedCatalogHash})`),this.name="SkillCatalogConflictError"}};mw=class{constructor(t={}){this.options=t;this.createRuntime=t.createRuntime??AM,this.hostWatcher=t.hostWatcher,this.provisionWorkspace=t.provisionWorkspace??sm,this.baseShellEnv={...t.shellEnv??{}},this.providerInstallationGate=gie({ttlMs:fie}),this.ensureDataDirSkillsWatcher()}options;createRuntime;hostWatcher;provisionWorkspace;baseShellEnv;shellEnvGeneration=0;entries=new Map;pendingEntries=new Map;pendingEnvironmentEnsures=new Map;pendingCatalogHashes=new Map;pendingEnvironmentProvisions=new Map;pendingWorkspaceRefreshes=new Map;inFlightThreadCommandsByEnvironmentId=new Map;inFlightThreadCommandCompletionsByEnvironmentId=new Map;threadControlTails=new Map;providerMaintenanceRuntime=null;pendingProviderMaintenanceRuntime=null;providerMaintenanceRuntimeGeneration=0;providerMaintenanceActiveRequests=0;providerMaintenanceIdleTimer=null;providerInstallationGate;stopWatchingDataDirSkillsRoot=yB;runtimeWorkspaceWriteRoots(t){let n=[...t.workspaceRoots];return t.threadStorageRootPath&&n.push(t.threadStorageRootPath),[...new Set(n)]}get(t){return this.entries.get(t)}hasPendingEnvironmentProvision(t){return this.pendingEnvironmentProvisions.has(t)}async getOrAwait(t){let n=this.entries.get(t);if(n)return n;let r=this.pendingEntries.get(t);if(r)return r}enqueueThreadControl(t,n){return Nn(this.threadControlTails,t,n)}async releaseThreadFromOtherEnvironments(t){return await this.waitForThreadCommandsInOtherEnvironments(t),this.enqueueThreadControl(t.threadId,()=>this.releaseThreadFromOtherEnvironmentsOnce(t))}async waitForThreadCommandsInOtherEnvironments(t){for(;;){let n=[...this.inFlightThreadCommandCompletionsByEnvironmentId.entries()].flatMap(([r,o])=>r===t.environmentId?[]:[...o.get(t.threadId)??[]]);if(n.length===0)return;await Promise.all(n)}}async releaseThreadFromOtherEnvironmentsOnce(t){let n=[...this.entries.values()].filter(c=>c.environmentId!==t.environmentId&&c.runtime.hasThread(t.threadId)),r=t.activeTurn==="interrupt"?[]:n.filter(c=>c.runtime.getActiveTurnId(t.threadId)!==null),o=n.filter(c=>!r.includes(c)),s=await Promise.all(o.map(c=>c.runtime.stopThread({threadId:t.threadId}))),a=new Set(s.flatMap(c=>c.providerCheckpointId===null?[]:[c.providerCheckpointId]));return{activeTurnEnvironmentIds:r.map(c=>c.environmentId),providerCheckpointId:a.size===1?a.values().next().value??null:null,releasedEnvironmentIds:o.map(c=>c.environmentId)}}listThreadOwnerEntries(t){return[...this.entries.values()].filter(n=>n.runtime.hasThread(t))}markTerminalActive(t,n){this.entries.get(t)?.terminals.add(n)}markTerminalInactive(t,n){this.entries.get(t)?.terminals.delete(n)}async retainEnvironmentForThreadCommand(t,n){return this.enqueueThreadControl(n,()=>{let r=this.inFlightThreadCommandsByEnvironmentId.get(t)??new Map;r.set(n,(r.get(n)??0)+1),this.inFlightThreadCommandsByEnvironmentId.set(t,r);let o,s=new Promise(u=>{o=u}),a=this.inFlightThreadCommandCompletionsByEnvironmentId.get(t)??new Map,c=a.get(n)??new Set;c.add(s),a.set(n,c),this.inFlightThreadCommandCompletionsByEnvironmentId.set(t,a);let l=!1;return()=>{if(l)return;l=!0;let u=this.inFlightThreadCommandsByEnvironmentId.get(t);if(u){let m=u.get(n)??0;m<=1?u.delete(n):u.set(n,m-1),u.size===0&&this.inFlightThreadCommandsByEnvironmentId.delete(t)}let d=this.inFlightThreadCommandCompletionsByEnvironmentId.get(t),p=d?.get(n);p?.delete(s),p?.size===0&&d?.delete(n),d?.size===0&&this.inFlightThreadCommandCompletionsByEnvironmentId.delete(t),o()}})}canInstallUpdate(){return this.inFlightThreadCommandsByEnvironmentId.size===0&&[...this.entries.values()].every(t=>!this.entryHasActiveRuntimeWork(t))}listActiveThreads(){let t=[];for(let n of this.entries.values())for(let r of n.runtime.getLiveThreadIds())t.push({threadId:r});return t}listLoadedEnvironments(){return[...this.entries.keys()].map(t=>({environmentId:t}))}async reapIdleProviderSessions(t){let n=[];for(let r of this.entries.values()){let o=await r.runtime.reapIdleProviderSessions({...t,runThreadExclusive:(s,a)=>this.enqueueThreadControl(s,()=>this.entryHasInFlightThreadCommand(r,s)?null:a())});for(let s of o.reapedSessions)n.push({...s,environmentId:r.environmentId})}return{reapedSessions:n}}getShellEnv(){return this.options.applyMachineEnvironment?.(this.baseShellEnv)??{...this.baseShellEnv}}async replaceBaseShellEnv(t){lJe(this.baseShellEnv,t)||(this.baseShellEnv={...t},this.shellEnvGeneration+=1,this.providerInstallationGate.clear(),await this.shutdownProviderMaintenanceRuntime(),await this.evictIdleRuntimeEntries())}getInjectedSkillsLogger(){return this.options.logger}async resolveRuntimeSkillConfig(t){if(t.injectedSkillSources===void 0)return null;if(t.injectedSkillSources.length===0)return{catalogHash:Tx,skillRoots:[]};if(!this.options.dataDir)throw new Error("Runtime skill staging requires a host dataDir");return ure({workspacePath:t.workspacePath??this.entries.get(t.environmentId)?.path??null,dataDir:this.options.dataDir,injectedSkillSources:t.injectedSkillSources,...this.options.fetchSkillTree!==void 0?{fetchSkillTree:this.options.fetchSkillTree}:{},logger:this.getInjectedSkillsLogger()})}entryHasActiveRuntimeWork(t){return t.terminals.size>0||t.runtime.getLiveThreadIds().length>0||t.runtime.hasOpenBackgroundWork()}hasInFlightThreadCommand(t,n){let r=this.inFlightThreadCommandsByEnvironmentId.get(t.environmentId);return r?[...r.keys()].some(o=>o!==n):!1}entryHasInFlightThreadCommand(t,n){return this.inFlightThreadCommandsByEnvironmentId.get(t.environmentId)?.has(n)??!1}entryHasActiveEnvironmentWork(t){return this.entryHasActiveRuntimeWork(t)||this.hasInFlightThreadCommand(t)}async cleanupUnusedInjectedSkillStagingDirs(t){if(this.options.dataDir)try{await Ix({dataDir:this.options.dataDir,keepCatalogHashes:[...t,...this.pendingCatalogHashes.values(),...[...this.entries.values()].flatMap(n=>[...n.retainedSkillCatalogHashes])],logger:this.getInjectedSkillsLogger()})}catch(n){this.options.logger?.warn({reason:n instanceof Error&&n.message.trim().length>0?n.message:"Unable to clean injected skill staging directories"},"Failed to clean injected skill staging directories")}}async replaceEntryForSkillCatalog(t){if(this.entryHasActiveRuntimeWork(t.entry)||this.hasInFlightThreadCommand(t.entry,t.targetThreadId))throw new bB({environmentId:t.entry.environmentId,activeCatalogHash:t.entry.skillCatalogHash,requestedCatalogHash:t.skillConfig.catalogHash});this.entries.delete(t.entry.environmentId),await t.entry.runtime.shutdown(),await this.cleanupUnusedInjectedSkillStagingDirs([t.skillConfig.catalogHash])}async ensureCompatibleEntry(t){return t.entry.shellEnvGeneration!==this.shellEnvGeneration&&!this.entryHasActiveRuntimeWork(t.entry)&&!this.hasInFlightThreadCommand(t.entry,t.targetThreadId)?(this.entries.delete(t.entry.environmentId),await t.entry.runtime.shutdown(),await this.cleanupUnusedInjectedSkillStagingDirs(t.skillConfig?[t.skillConfig.catalogHash]:[]),null):t.skillConfig===null||t.entry.skillCatalogHash===t.skillConfig.catalogHash||t.entry.skillCatalogHash===null&&t.skillConfig.skillRoots.length===0?t.entry:t.targetThreadId!==void 0&&(this.entryHasActiveRuntimeWork(t.entry)||this.hasInFlightThreadCommand(t.entry,t.targetThreadId))?(t.entry.retainedSkillCatalogHashes.add(t.skillConfig.catalogHash),{...t.entry,skillCatalogHash:t.skillConfig.catalogHash,skillRoots:t.skillConfig.skillRoots}):(await this.replaceEntryForSkillCatalog({entry:t.entry,skillConfig:t.skillConfig,...t.targetThreadId!==void 0?{targetThreadId:t.targetThreadId}:{}}),null)}async invalidateProviderMaintenanceRuntime(){this.providerInstallationGate.clear();try{await this.shutdownProviderMaintenanceRuntime()}catch(t){this.options.logger?.warn({err:t},"Failed to shut down provider maintenance runtime during invalidation")}}async shutdownProviderMaintenanceRuntime(){this.clearProviderMaintenanceIdleTimer();let t=this.providerMaintenanceRuntime,n=this.pendingProviderMaintenanceRuntime;this.providerMaintenanceRuntimeGeneration+=1,this.providerMaintenanceRuntime=null,this.pendingProviderMaintenanceRuntime===n&&(this.pendingProviderMaintenanceRuntime=null);let r=n?await n.promise.catch(()=>null):null;r&&this.providerMaintenanceRuntime===r&&(this.providerMaintenanceRuntime=null);let o=[...new Set([t,r])];await Promise.all(o.map(s=>s?.shutdown()??Promise.resolve()))}clearProviderMaintenanceIdleTimer(){this.providerMaintenanceIdleTimer!==null&&(clearTimeout(this.providerMaintenanceIdleTimer),this.providerMaintenanceIdleTimer=null)}scheduleProviderMaintenanceIdleShutdown(){if(this.clearProviderMaintenanceIdleTimer(),this.providerMaintenanceActiveRequests>0||this.providerMaintenanceRuntime===null&&this.pendingProviderMaintenanceRuntime===null)return;let t=this.options.providerMaintenanceIdleTimeoutMs??oJe;this.providerMaintenanceIdleTimer=setTimeout(()=>{this.providerMaintenanceIdleTimer=null,!(this.providerMaintenanceActiveRequests>0)&&this.shutdownProviderMaintenanceRuntime().catch(n=>{this.options.logger?.warn({err:n},"Failed to shut down idle provider maintenance runtime")})},t),this.providerMaintenanceIdleTimer.unref()}async evictIdleRuntimeEntries(){let t=[...this.entries.values()].filter(n=>!this.entryHasActiveEnvironmentWork(n));for(let n of t)this.entries.delete(n.environmentId);await Promise.all(t.map(n=>n.runtime.shutdown())),await this.cleanupUnusedInjectedSkillStagingDirs([])}async ensureProviderMaintenanceRuntime(t){if(this.providerMaintenanceRuntime)return this.providerMaintenanceRuntime;if(this.pendingProviderMaintenanceRuntime)return this.pendingProviderMaintenanceRuntime.promise;let n=this.providerMaintenanceRuntimeGeneration,r,o=Promise.resolve().then(()=>this.createProviderMaintenanceRuntime(t)).then(s=>(this.pendingProviderMaintenanceRuntime===r&&this.providerMaintenanceRuntimeGeneration===n&&(this.providerMaintenanceRuntime=s),s)).finally(()=>{this.pendingProviderMaintenanceRuntime===r&&(this.pendingProviderMaintenanceRuntime=null)});return r={generation:n,promise:o},this.pendingProviderMaintenanceRuntime=r,o}async withProviderMaintenanceRuntime(t,n){this.clearProviderMaintenanceIdleTimer(),this.providerMaintenanceActiveRequests+=1;try{let r=await this.ensureProviderMaintenanceRuntime(t);return await n(r)}finally{this.providerMaintenanceActiveRequests-=1,this.providerMaintenanceActiveRequests===0&&this.scheduleProviderMaintenanceIdleShutdown()}}async ensureEnvironment(t){let n=this.pendingEnvironmentEnsures.get(t.environmentId);if(n)return await n,this.ensureEnvironment(t);let r=this.ensureEnvironmentOnce(t).finally(()=>{this.pendingEnvironmentEnsures.get(t.environmentId)===r&&this.pendingEnvironmentEnsures.delete(t.environmentId)});return this.pendingEnvironmentEnsures.set(t.environmentId,r),r}async ensureEnvironmentOnce(t){let n=await this.resolveRuntimeSkillConfig(t),r=this.entries.get(t.environmentId);if(r){let c=await this.ensureCompatibleEntry({entry:r,skillConfig:n,...t.targetThreadId!==void 0?{targetThreadId:t.targetThreadId}:{}});if(c)return c}let o=this.pendingEntries.get(t.environmentId);if(o){let c=await o,l=await this.ensureCompatibleEntry({entry:c,skillConfig:n,...t.targetThreadId!==void 0?{targetThreadId:t.targetThreadId}:{}});if(l)return l}let s=this.createPendingEnvironmentProvision(t.environmentId),a=Promise.resolve().then(()=>this.createEntry({...t,provisionSignal:s.abortController.signal,skillConfig:n})).then(c=>(this.entries.set(t.environmentId,c),c)).finally(()=>{this.pendingEntries.delete(t.environmentId),this.pendingCatalogHashes.delete(t.environmentId),this.clearPendingEnvironmentProvision(t.environmentId,s)});return s.done=a,this.pendingEntries.set(t.environmentId,a),n!==null&&this.pendingCatalogHashes.set(t.environmentId,n.catalogHash),a}async refreshEnvironmentWorkspace(t){let n=this.pendingWorkspaceRefreshes.get(t.environmentId);if(n)return n;let r=this.refreshEnvironmentWorkspaceOnce(t).finally(()=>{this.pendingWorkspaceRefreshes.get(t.environmentId)===r&&this.pendingWorkspaceRefreshes.delete(t.environmentId)});return this.pendingWorkspaceRefreshes.set(t.environmentId,r),r}async refreshEnvironmentWorkspaceOnce(t){let n=await this.getOrAwait(t.environmentId);if(n&&n.path!==t.workspacePath)throw new Error(`Cannot refresh environment ${t.environmentId} at ${t.workspacePath}; it is bound to ${n.path}`);let r=await this.provisionHostWorkspace(t.provision);if(r.path!==t.workspacePath)throw new Error(`Workspace refresh for ${t.environmentId} returned ${r.path}, not ${t.workspacePath}`);return n&&(n.workspace=r),r}async cancelEnvironmentProvision(t){let n=this.pendingEnvironmentProvisions.get(t.environmentId);return n?(n.abortController.abort(new Te("provision_cancelled","Environment provisioning was cancelled")),{aborted:!0}):{aborted:!1}}createPendingEnvironmentProvision(t){let n={abortController:new AbortController,done:Promise.resolve()};return this.pendingEnvironmentProvisions.set(t,n),n}clearPendingEnvironmentProvision(t,n){this.pendingEnvironmentProvisions.get(t)===n&&this.pendingEnvironmentProvisions.delete(t)}async shutDownEntry(t){let n=this.entries.get(t),r=this.pendingEntries.get(t),o=n;if(!o&&r)try{o=await r}catch{o=void 0}if(o)return this.entries.delete(t),await o.runtime.shutdown(),o}async forgetEnvironment(t){await this.shutDownEntry(t)&&await this.cleanupUnusedInjectedSkillStagingDirs([])}async shutdownAll(){let t=[...this.entries.values()];for(let n of this.pendingEntries.values())try{t.push(await n)}catch{}this.entries.clear(),this.pendingEntries.clear();for(let n of t)await n.runtime.shutdown();await this.shutdownProviderMaintenanceRuntime(),await this.stopWatchingDataDirSkillsRoot(),this.stopWatchingDataDirSkillsRoot=yB,await this.cleanupUnusedInjectedSkillStagingDirs([])}buildUnexpectedProviderExitEvents(t){let n=aJe(t),r=cJe(t),o=[];for(let s of t.threads){if(s.activeTurnId===null){s.pendingTurnStart&&o.push({type:"system/error",threadId:s.threadId,scope:Tt(),code:"provider_process_exited",message:n,...r?{detail:r}:{}});continue}s.providerThreadId!==null&&(o.push({type:"turn/completed",threadId:s.threadId,providerThreadId:s.providerThreadId,scope:je(s.activeTurnId),status:"failed",error:{message:n}}),o.push({type:"system/error",threadId:s.threadId,scope:je(s.activeTurnId),code:"provider_process_exited",message:n,...r?{detail:r}:{}}))}return o}async createProviderMaintenanceRuntime(t){let n=nJe.join(t.dataDir,rJe);await tJe(n,{recursive:!0});let r=null,o=this.getShellEnv(),s=hce(o);return r=this.createRuntime({workspacePath:n,additionalWorkspaceWriteRoots:[],...s?{env:s}:{},shellEnv:o,threadStorageRootPath:this.options.threadStorageRootPath??void 0,bridgeBundleDir:this.options.bridgeBundleDir,onEvent:a=>{this.options.onStderr?.(`Dropping provider maintenance event ${a.type}; no environment owns provider-only maintenance commands.`,a.threadId)},onToolCall:this.options.onToolCall??(async()=>({contentItems:[],success:!0})),onInteractiveRequest:this.options.onInteractiveRequest,onStderr:this.options.onStderr,onProcessExit:a=>{r&&this.providerMaintenanceRuntime===r&&r.listRunningProviders().length===0&&(this.providerMaintenanceRuntime=null),this.options.onProcessExit?.(a)}}),r}async createEntry(t){let n=t.provision??(t.workspacePath?{path:t.workspacePath}:null);if(!n)throw new Error(`Missing workspace path for environment ${t.environmentId}`);t.setupScriptTimeoutMs!=null&&await KS({workspacePath:n.path,timeoutMs:t.setupScriptTimeoutMs,contributedEnv:t.setupContributedEnv,shellPath:this.getShellEnv().PATH,signal:t.provisionSignal,onProgress:n.onProgress});let r=await this.provisionHostWorkspace({...n,signal:t.provisionSignal}),o=await r.getAdditionalWorkspaceWriteRoots(),s=this.runtimeWorkspaceWriteRoots({threadStorageRootPath:this.options.threadStorageRootPath,workspaceRoots:o}),a=null,c=this.getShellEnv(),l=this.shellEnvGeneration,u=hce(c);return a=this.createRuntime({workspacePath:r.path,additionalWorkspaceWriteRoots:s,...t.skillConfig?{skillRoots:t.skillConfig.skillRoots}:{},...u?{env:u}:{},shellEnv:c,threadStorageRootPath:this.options.threadStorageRootPath??void 0,bridgeBundleDir:this.options.bridgeBundleDir,onEvent:d=>{this.options.onEvent?.({environmentId:t.environmentId,event:d})},onToolCall:this.options.onToolCall??(async()=>({contentItems:[],success:!0})),onInteractiveRequest:this.options.onInteractiveRequest,onStderr:this.options.onStderr,onProviderRecovery:d=>{this.options.logger?.debug({environmentId:t.environmentId,providerId:d.providerId,threadId:d.threadId,kind:d.kind,retryable:d.retryable,message:d.message},"Provider bridge raised a recovery hint")},onProcessExit:d=>{if(!d.expected)for(let m of this.buildUnexpectedProviderExitEvents(d))this.options.onEvent?.({environmentId:t.environmentId,event:m});let p=this.entries.get(t.environmentId);!d.expected&&p?.runtime===a&&a.listRunningProviders().length===0&&this.entries.delete(t.environmentId),this.options.onProcessExit?.(d)}}),{environmentId:t.environmentId,runtime:a,shellEnvGeneration:l,skillCatalogHash:t.skillConfig?.catalogHash??null,skillRoots:t.skillConfig?.skillRoots??[],retainedSkillCatalogHashes:new Set(t.skillConfig?[t.skillConfig.catalogHash]:[]),terminals:new Set,workspace:r,path:r.path}}provisionHostWorkspace(t){return this.provisionWorkspace({...t,...On(this.getShellEnv())})}ensureDataDirSkillsWatcher(){if(!this.hostWatcher?.watchDataDirSkillsRoot||this.stopWatchingDataDirSkillsRoot!==yB)return;let t=this.options.dataDirSkillsRootPath;t&&(this.stopWatchingDataDirSkillsRoot=this.hostWatcher.watchDataDirSkillsRoot({dataDirSkillsRootPath:t,onChange:n=>{this.options.onInjectedSkillsChanged?.({changedPaths:n.changedPaths,sourceType:n.sourceType})},onWatchError:n=>{this.options.onDataDirSkillsWatchError?.({error:n})}}))}}});import SB from"node:path";function vce(e){return e.message.trim().length>0?e.message:"Unknown workspace watch error"}function dJe(e){return e.some(t=>uJe.includes(t))}function pJe(e,t){return e.environmentId===t.environmentId&&e.workspaceContext.workspacePath===t.workspaceContext.workspacePath}var xB,uJe,fw,yce=g(()=>{"use strict";$o();ta();xB=()=>{},uJe=["workspace-content-changed","workspace-git-changed","workspace-git-repository-created"];fw=class{constructor(t={}){this.options=t;this.hostWatcher=t.hostWatcher;let n=t.provisionWorkspace??sm;this.provisionWorkspace=r=>n({...r,...On(t.shellEnv?.()??{})}),this.refreshWorkspace=t.refreshWorkspace??(r=>this.provisionWorkspace(r.provision))}options;hostWatcher;provisionWorkspace;refreshWorkspace;threadStorageEntries=new Map;workspaceEntries=new Map;latestAppliedWatchSetGeneration=-1;watchSetMutationTail=Promise.resolve();async replaceWatchSet(t){await this.enqueueWatchSetMutation(async()=>{t.generation<=this.latestAppliedWatchSetGeneration||await this.applyWatchSet(t)})}async replaceAuthoritativeWatchSet(t){await this.enqueueWatchSetMutation(async()=>{await this.applyWatchSet(t)})}async shutdown(){await this.enqueueWatchSetMutation(async()=>{let t=[...this.workspaceEntries.values()],n=[...this.threadStorageEntries.values()];this.workspaceEntries.clear(),this.threadStorageEntries.clear(),await Promise.all([...t.map(r=>this.stopWorkspaceWatch(r)),...n.map(r=>r.stopWatching())])})}workspaceWatchCount(){return this.workspaceEntries.size}threadStorageWatchTargetCount(){return this.threadStorageEntries.size}async replaceWorkspaceTargets(t){let n=new Map;for(let o of t)n.set(o.environmentId,o);let r=[];for(let[o,s]of this.workspaceEntries){let a=n.get(o);if(a&&pJe(s.target,a)){n.delete(o);continue}this.workspaceEntries.delete(o),r.push(this.stopWorkspaceWatch(s))}await Promise.all(r);for(let o of n.values())await this.startWorkspaceWatch(o)}async replaceThreadStorageTargets(t){let n=new Map;for(let o of t)n.set(o.threadId,o);let r=[];for(let[o,s]of this.threadStorageEntries){let a=n.get(o);if(a){s.target=a,n.delete(o);continue}this.threadStorageEntries.delete(o),r.push(s.stopWatching())}await Promise.all(r);for(let o of n.values())this.startThreadStorageWatch(o)}enqueueWatchSetMutation(t){let n=this.watchSetMutationTail.then(t,t);return this.watchSetMutationTail=n.catch(()=>{}),n}async applyWatchSet(t){await this.replaceWorkspaceTargets(t.workspaceTargets),await this.replaceThreadStorageTargets(t.threadStorageTargets),this.latestAppliedWatchSetGeneration=t.generation}async startWorkspaceWatch(t){if(this.hostWatcher)try{let n=await this.provisionWorkspace({path:t.workspaceContext.workspacePath}),r={stopWatchingStatus:xB,target:t,watchState:{lastBranchName:void 0,lastDefaultBranch:void 0,lastLocalFingerprint:null,lastSharedRefsFingerprint:null,pendingKinds:new Set,processing:null},workspace:n};this.workspaceEntries.set(t.environmentId,r),r.stopWatchingStatus=this.hostWatcher.watchWorkspace({environmentId:t.environmentId,workspacePath:n.path,onChange:o=>{this.queueWorkspaceWatchChange({changeKinds:o.changeKinds,entry:r})},onReady:()=>{this.queueWorkspaceWatchChange({changeKinds:["workspace-content-changed"],entry:r})},onWatchError:o=>{this.options.onWorkspaceStatusWatchError?.({error:o})}})}catch(n){this.workspaceEntries.delete(t.environmentId),this.options.onWorkspaceStatusWatchError?.({error:{environmentId:t.environmentId,kind:"workspace-watch-error",message:n instanceof Error?vce(n):"Unknown workspace watch error",rootPath:t.workspaceContext.workspacePath}})}}queueWorkspaceWatchChange(t){if(this.workspaceEntries.get(t.entry.target.environmentId)===t.entry){t.changeKinds.includes("workspace-content-changed")&&this.options.onWorkspaceStatusChanged?.({changeKinds:["work-status-changed"],environmentId:t.entry.target.environmentId});for(let n of t.changeKinds)t.entry.watchState.pendingKinds.add(n);t.entry.watchState.processing||this.flushWorkspaceWatchChanges(t)}}flushWorkspaceWatchChanges(t){let n=this.processWorkspaceWatchChanges(t).finally(()=>{t.entry.watchState.processing===n&&(t.entry.watchState.processing=null),t.entry.watchState.pendingKinds.size>0&&this.flushWorkspaceWatchChanges(t)});t.entry.watchState.processing=n}async processWorkspaceWatchChanges(t){let n=Array.from(t.entry.watchState.pendingKinds);t.entry.watchState.pendingKinds.clear();try{let r=[],o,s;if(t.entry.workspace.isGitRepo&&t.entry.watchState.lastBranchName===void 0){if([o,s]=await Promise.all([t.entry.workspace.getLocalStateSnapshot(),t.entry.workspace.getSharedGitRefsSnapshot()]),this.workspaceEntries.get(t.entry.target.environmentId)!==t.entry)return;t.entry.watchState.lastLocalFingerprint=o.fingerprint,t.entry.watchState.lastSharedRefsFingerprint=s.fingerprint}if(dJe(n)){n.includes("workspace-git-repository-created")&&!t.entry.workspace.isGitRepo&&await this.refreshGitWorkspaceMetadata(t.entry);let a=n.includes("workspace-content-changed");if(t.entry.workspace.isGitRepo&&!a){o??=await t.entry.workspace.getLocalStateSnapshot();let c=o.fingerprint;t.entry.watchState.lastLocalFingerprint!==c&&(t.entry.watchState.lastLocalFingerprint=c,r.push("work-status-changed"))}}if(t.entry.workspace.isGitRepo&&n.includes("shared-git-refs-changed")){s??=await t.entry.workspace.getSharedGitRefsSnapshot();let a=s.fingerprint;t.entry.watchState.lastSharedRefsFingerprint!==a&&(t.entry.watchState.lastSharedRefsFingerprint=a,r.push("git-refs-changed"))}if(this.workspaceEntries.get(t.entry.target.environmentId)!==t.entry)return;r.length>0&&this.options.onWorkspaceStatusChanged?.({changeKinds:r,environmentId:t.entry.target.environmentId}),t.entry.workspace.isGitRepo&&(t.entry.watchState.lastBranchName===void 0||n.includes("workspace-git-changed")||n.includes("shared-git-refs-changed"))&&await this.reportCurrentBranch(t.entry,n.includes("workspace-git-changed"),s,o)}catch(r){this.reportWorkspaceWatchError(t.entry,r)}}async reportCurrentBranch(t,n,r,o){let[s,a]=await Promise.all([o!==void 0?o.branchName:n||t.watchState.lastBranchName===void 0?t.workspace.getCurrentBranch():t.watchState.lastBranchName,r===void 0?t.workspace.getDefaultBranch():r.defaultBranch]),c=a??s;this.workspaceEntries.get(t.target.environmentId)!==t||t.watchState.lastBranchName===s&&t.watchState.lastDefaultBranch===c||(t.watchState.lastBranchName=s,t.watchState.lastDefaultBranch=c,this.options.onWorkspaceMetadataChanged?.({environmentId:t.target.environmentId,workspace:{path:t.workspace.path,isGitRepo:!0,isWorktree:t.workspace.isWorktree,branchName:s,defaultBranch:c}}))}reportWorkspaceWatchError(t,n){this.options.onWorkspaceStatusWatchError?.({error:{environmentId:t.target.environmentId,kind:"workspace-watch-error",message:n instanceof Error?vce(n):"Unknown workspace watch error",rootPath:t.target.workspaceContext.workspacePath}})}async refreshGitWorkspaceMetadata(t){if(t.workspace.isGitRepo)return;let n={path:t.target.workspaceContext.workspacePath},r=await this.refreshWorkspace({environmentId:t.target.environmentId,provision:n,workspacePath:t.target.workspaceContext.workspacePath});if(!r.isGitRepo)return;let[o,s,a]=await Promise.all([r.getCurrentBranch(),r.getDefaultBranch(),r.getSharedGitRefsSnapshot()]);this.workspaceEntries.get(t.target.environmentId)===t&&(t.workspace=r,t.watchState.lastBranchName=o,t.watchState.lastDefaultBranch=s??o,t.watchState.lastSharedRefsFingerprint=a.fingerprint,this.options.onWorkspaceMetadataChanged?.({environmentId:t.target.environmentId,workspace:{path:r.path,isGitRepo:!0,isWorktree:r.isWorktree,branchName:o,defaultBranch:s??o}}))}async stopWorkspaceWatch(t){let n=t.stopWatchingStatus;t.stopWatchingStatus=xB,await n()}startThreadStorageWatch(t){let n={stopWatching:xB,target:t};this.threadStorageEntries.set(t.threadId,n);let r=this.options.threadStorageRootPath;if(!this.hostWatcher||!r)return;let o=SB.resolve(r,t.threadId);SB.dirname(o)===SB.resolve(r)&&(n.stopWatching=this.hostWatcher.watchThreadStorage({threadStoragePath:o,onChange:()=>{this.threadStorageEntries.get(n.target.threadId)===n&&this.options.onThreadStorageChanged?.({environmentId:n.target.environmentId,threadId:n.target.threadId})},onWatchError:s=>{this.options.onThreadStorageWatchError?.({error:s})}}))}}});function Wi(e,t,n){if(!Number.isInteger(t)||t<0||t>4294967295)throw new Error(`tunnel-contract: stream id out of range: ${t}`);let r=new Uint8Array(5+n.length);return r[0]=e,new DataView(r.buffer).setUint32(1,t),r.set(n,5),r}function rf(e){return mJe.encode(JSON.stringify(e))}function Sce(e){switch(e.type){case"open-http":return Wi(ct.openHttp,e.streamId,rf({method:e.method,path:e.path,headers:e.headers,hasBody:e.hasBody,...e.target!==void 0?{target:e.target}:{}}));case"body-chunk":{if(e.data.length>1048576)throw new Error(`tunnel-contract: body chunk of ${e.data.length} bytes exceeds MAX_CHUNK_BYTES`);return Wi(ct.bodyChunk,e.streamId,e.data)}case"body-end":return Wi(ct.bodyEnd,e.streamId,new Uint8Array(0));case"resp-head":return Wi(ct.respHead,e.streamId,rf({status:e.status,headers:e.headers}));case"open-ws":return Wi(ct.openWs,e.streamId,rf({path:e.path,headers:e.headers,protocols:e.protocols,...e.target!==void 0?{target:e.target}:{}}));case"ws-open-ack":return Wi(ct.wsOpenAck,e.streamId,rf({protocol:e.protocol}));case"ws-data":{let t=new Uint8Array(1+e.data.length);return t[0]=e.isBinary?1:0,t.set(e.data,1),Wi(ct.wsData,e.streamId,t)}case"close-stream":return Wi(ct.closeStream,e.streamId,rf({code:e.code,reason:e.reason}))}}function of(e,t){try{return JSON.parse(fJe.decode(e))}catch{throw new Error(`tunnel-contract: malformed ${t} frame payload`)}}function xce(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<5)throw new Error(`tunnel-contract: frame too short (${t.length} bytes)`);let n=t[0],r=new DataView(t.buffer,t.byteOffset).getUint32(1),o=t.subarray(5);switch(n){case ct.openHttp:{let s=of(o,"open-http");return{type:"open-http",streamId:r,method:s.method,path:s.path,headers:s.headers,hasBody:s.hasBody,...typeof s.target=="string"?{target:s.target}:{}}}case ct.bodyChunk:return{type:"body-chunk",streamId:r,data:o};case ct.bodyEnd:return{type:"body-end",streamId:r};case ct.respHead:{let s=of(o,"resp-head");return{type:"resp-head",streamId:r,...s}}case ct.openWs:{let s=of(o,"open-ws");return{type:"open-ws",streamId:r,path:s.path,headers:s.headers,protocols:s.protocols,...typeof s.target=="string"?{target:s.target}:{}}}case ct.wsOpenAck:{let s=of(o,"ws-open-ack");return{type:"ws-open-ack",streamId:r,protocol:s.protocol}}case ct.wsData:{if(o.length<1)throw new Error("tunnel-contract: ws-data frame missing binary flag");return{type:"ws-data",streamId:r,isBinary:o[0]===1,data:o.subarray(1)}}case ct.closeStream:{let s=of(o,"close-stream");return{type:"close-stream",streamId:r,...s}}default:throw new Error(`tunnel-contract: unknown frame type ${n}`)}}function*EB(e,t){for(let n=0;n<t.length;n+=1048576)yield{type:"body-chunk",streamId:e,data:t.subarray(n,Math.min(n+1048576,t.length))}}var wB,bce,ct,VUt,mJe,fJe,PB=g(()=>{"use strict";wB="bbt:hb",bce="bbt:hb-ack",ct={openHttp:1,bodyChunk:2,bodyEnd:3,respHead:4,openWs:5,wsOpenAck:6,wsData:7,closeStream:8},VUt=new Map([[ct.openHttp,"open-http"],[ct.bodyChunk,"body-chunk"],[ct.bodyEnd,"body-end"],[ct.respHead,"resp-head"],[ct.openWs,"open-ws"],[ct.wsOpenAck,"ws-open-ack"],[ct.wsData,"ws-data"],[ct.closeStream,"close-stream"]]),mJe=new TextEncoder,fJe=new TextDecoder});function hw(e,t){let n={};for(let[r,o]of e){let s=r.toLowerCase();hJe.has(s)||(n[r]=s==="origin"&&o===t.publicOrigin?t.loopbackOrigin:o)}return t.host!==void 0&&(n.Host=t.host),n}var hJe,TB=g(()=>{"use strict";hJe=new Set(["host","content-length","connection"])});function RB(e,t){let n=e.code,r;return n==="ECONNREFUSED"?r="connection refused":n==="ENOTFOUND"||n==="EAI_AGAIN"?r="host not found":n==="ETIMEDOUT"||/timed out|timeout|ETIMEDOUT/i.test(e.message)?r="timed out":n==="ECONNRESET"?r="connection reset":r=e.message,`can't reach ${t} \u2014 ${r}`}var wce=g(()=>{"use strict"});var sf,Ece=g(()=>{"use strict";sf=class{attempt=0;baseDelayMs;maxDelayMs;stableConnectionMs;random;constructor(t={}){this.baseDelayMs=t.baseDelayMs??1e3,this.maxDelayMs=t.maxDelayMs??3e4,this.stableConnectionMs=t.stableConnectionMs??1e4,this.random=t.random??Math.random}reset(){this.attempt=0}nextDelayAfterClose(t){this.attempt=t>this.stableConnectionMs?0:this.attempt+1;let n=Math.min(this.baseDelayMs*2**this.attempt,this.maxDelayMs);return Math.round(n*(.5+this.random()/2))}}});import{request as gJe}from"node:http";import{request as vJe}from"node:https";function TJe(e,t){return t===void 0?e:{...e,"Content-Length":String(t.byteLength)}}function RJe(e){let t=e.url.protocol==="https:"?vJe:gJe,n={headers:TJe(e.headers,e.body),method:e.method,signal:e.signal};return new Promise((r,o)=>{let s=t(e.url,n,r);s.once("error",o),s.end(e.body)})}function IJe(e){let t=[];for(let n=0;n<e.rawHeaders.length;n+=2){let r=e.rawHeaders[n],o=e.rawHeaders[n+1];r!==void 0&&o!==void 0&&t.push([r,o])}return t}function _Je(e){return PJe.test(e)?!new URL(e,"http://bb.local").searchParams.has("afterSequence"):!1}function gw(e){return Math.round(e*10)/10}function Ice(e,t){return t!==void 0?!1:e==="/ws"||e.startsWith("/ws?")||e.startsWith("/ws/")}var Rce,yJe,bJe,SJe,xJe,Pce,wJe,Tce,EJe,PJe,af,_ce=g(()=>{"use strict";Hp();PB();TB();Rce=2e4,yJe=6e4,bJe=Rce+5e3,SJe=1024*1024,xJe=10,Pce=1e3,wJe=1024,Tce="this port is not shared",EJe=new TextEncoder,PJe=/^\/api\/v1\/threads\/[^/]+\/(?:timeline|conversation-outline)(?:\?|$)/u;af=class{constructor(t){this.options=t}options;refusedOrigins=new Map;httpStreams=new Map;wsStreams=new Map;lastAck=Date.now();lastReceivedAckAt=null;lastHeartbeatTickAt=0;stallGraceSinceAck=!1;heartbeat;remoteClientCount=0;bytesReceived=0;bytesSent=0;lastReceivedAt=null;lastSentAt=null;lastRemoteActivityAt=null;get remoteClients(){return this.remoteClientCount}get lastHeartbeatAckAt(){return this.lastReceivedAckAt}snapshot(t){return{openHttpStreams:this.httpStreams.size,openWsStreams:this.wsStreams.size,bytesReceived:this.bytesReceived,bytesSent:this.bytesSent,lastReceivedAgeMs:this.lastReceivedAt===null?null:t-this.lastReceivedAt,lastSentAgeMs:this.lastSentAt===null?null:t-this.lastSentAt,bufferedBytes:this.options.tunnel.bufferedAmount}}start(){let{tunnel:t}=this.options,n=this.options.monotonicNow??(()=>performance.now());this.lastAck=Date.now(),this.lastReceivedAckAt=null,this.lastHeartbeatTickAt=n(),this.heartbeat=setInterval(()=>{let r=n(),o=r-this.lastHeartbeatTickAt;this.lastHeartbeatTickAt=r;let s=Date.now();if(o>bJe&&!this.stallGraceSinceAck)this.options.log.warn(`event loop stalled for ${Math.round(o/1e3)}s; restarting the tunnel heartbeat deadline`),this.lastAck=s,this.stallGraceSinceAck=!0;else if(s-this.lastAck>yJe){this.options.log.warn("tunnel heartbeat missed; reconnecting"),t.terminate();return}this.sendRaw(wB,Buffer.byteLength(wB))},Rce),t.on("message",(r,o)=>{if(this.bytesReceived+=r.byteLength,this.lastReceivedAt=Date.now(),!o){r.toString()===bce&&(this.lastAck=Date.now(),this.lastReceivedAckAt=this.lastAck,this.stallGraceSinceAck=!1);return}try{this.onFrame(xce(r))}catch(s){this.options.log.warn(`tunnel bad frame: ${String(s)}`)}}),t.on("close",()=>this.dispose())}dispose(){this.heartbeat&&clearInterval(this.heartbeat);for(let t of this.httpStreams.values())t.abort.abort();for(let t of this.wsStreams.values())t.socket.close(1001,"tunnel closed");this.refusedOrigins.clear(),this.httpStreams.clear(),this.wsStreams.clear(),this.setRemoteClients(0)}noteActivity(){let t=Date.now();this.lastRemoteActivityAt=t,this.options.onActivity?.(t)}setRemoteClients(t){let n=this.remoteClientCount;this.remoteClientCount=t,n===0!=(t===0)&&this.options.onRemoteClientsChange?.(t)}adjustRemoteClients(t){this.setRemoteClients(Math.max(0,this.remoteClientCount+t))}send(t){if(this.options.tunnel.readyState===eo.default.OPEN){let n=Sce(t);this.sendRaw(n,n.byteLength)}}async waitForSendBuffer(t){let{tunnel:n}=this.options;for(;!t.aborted&&n.readyState===eo.default.OPEN&&n.bufferedAmount>SJe;)await new Promise(r=>setTimeout(r,xJe))}sendRaw(t,n){this.options.tunnel.send(t),this.bytesSent+=n,this.lastSentAt=Date.now()}onFrame(t){switch(this.noteActivity(),t.type){case"open-http":{if(this.rejectRefusedOrigin(t.streamId,t.target))return;let n={meta:t,chunks:[],abort:new AbortController};this.httpStreams.set(t.streamId,n),t.hasBody||this.executeHttp(t.streamId,n);return}case"body-chunk":this.httpStreams.get(t.streamId)?.chunks.push(Buffer.from(t.data));return;case"body-end":{let n=this.httpStreams.get(t.streamId);n&&this.executeHttp(t.streamId,n);return}case"open-ws":this.openOriginWs(t);return;case"ws-data":{let n=this.wsStreams.get(t.streamId);if(!n)return;if(!n.open){n.buffered.push(t);return}n.socket.send(t.isBinary?t.data:Buffer.from(t.data).toString());return}case"close-stream":{let n=this.httpStreams.get(t.streamId);if(n){n.abort.abort(),this.httpStreams.delete(t.streamId);return}let r=this.wsStreams.get(t.streamId);r&&(r.socket.close(t.code,t.reason),this.forgetWsStream(t.streamId,r));return}case"resp-head":case"ws-open-ack":return}}forgetWsStream(t,n){this.wsStreams.delete(t)&&n.countsAsRemoteClient&&this.adjustRemoteClients(-1)}rejectUnregisteredHttp(t){let n=EJe.encode(Tce);this.send({type:"resp-head",streamId:t,status:404,headers:[["content-type","text/plain; charset=utf-8"]]});for(let r of EB(t,n))this.send(r);this.send({type:"body-end",streamId:t})}rejectRefusedOrigin(t,n){if(n===void 0)return!1;let r=this.options.resolveOrigin(n);if(r.kind!=="ok")return!1;let o=this.refusedOrigins.get(r.resolved.origin);if(!o)return!1;let s=this.options.monotonicNow?.()??performance.now();return s>=o.retryAt?(o.retryAt=s+Pce,!1):(this.send({type:"close-stream",streamId:t,code:1011,reason:o.reason}),!0)}recordOriginFailure(t,n,r){if(t===void 0||!(r instanceof Error)||!("code"in r)||r.code!=="ECONNREFUSED")return!1;if(!this.refusedOrigins.has(n)&&this.refusedOrigins.size>=wJe){let o=this.refusedOrigins.keys().next().value;o!==void 0&&this.refusedOrigins.delete(o)}return this.refusedOrigins.has(n)||this.options.log.warn(`exposed origin ${n} entered cooldown: ${String(r)}`),this.refusedOrigins.set(n,{retryAt:(this.options.monotonicNow?.()??performance.now())+Pce,reason:String(r)}),!0}async executeHttp(t,n){let{meta:r}=n,o=this.options.resolveOrigin(r.target);if(o.kind==="unregistered"){this.rejectUnregisteredHttp(t),this.httpStreams.delete(t);return}let{resolved:s}=o,a=hw(r.headers,{publicOrigin:s.publicOrigin,loopbackOrigin:new URL(s.origin).origin,...s.host!==void 0?{host:s.host}:{}});try{let c=performance.now(),l=r.hasBody?Buffer.concat(n.chunks):void 0,u=await RJe({url:new URL(`${s.origin.replace(/\/$/u,"")}${r.path}`),method:r.method,headers:a,body:l,signal:n.abort.signal});this.refusedOrigins.delete(s.origin);let d=performance.now()-c,p=IJe(u),m=_Je(r.path);m&&p.push(["server-timing",`bb_connect_origin;dur=${gw(d)}`]),this.send({type:"resp-head",streamId:t,status:u.statusCode??502,headers:p});let f=0;for await(let v of u){let b=v instanceof Uint8Array?v:Buffer.from(String(v));f+=b.byteLength;for(let S of EB(t,b))this.send(S);await this.waitForSendBuffer(n.abort.signal)}if(this.send({type:"body-end",streamId:t}),m){let v=performance.now()-c;this.options.log.info?.(["bb connect thread load",`path=${r.path}`,`status=${u.statusCode??502}`,`originTtfbMs=${gw(d)}`,`originBodyMs=${gw(v-d)}`,`totalMs=${gw(v)}`,`responseBytes=${f}`,`contentEncoding=${u.headers["content-encoding"]??"identity"}`].join(" "))}}catch(c){n.abort.signal.aborted||(this.recordOriginFailure(r.target,s.origin,c)||this.options.log.warn(`origin http error on ${r.method} ${new URL(r.path,"http://bb.local").pathname}: ${String(c)}`),this.send({type:"close-stream",streamId:t,code:1011,reason:String(c)}))}finally{this.httpStreams.delete(t)}}openOriginWs(t){if(this.rejectRefusedOrigin(t.streamId,t.target))return;let n=this.options.resolveOrigin(t.target);if(n.kind==="unregistered"){this.send({type:"close-stream",streamId:t.streamId,code:1008,reason:Tce});return}let{resolved:r}=n,o=r.origin.replace(/^http/,"ws"),s=hw(t.headers,{publicOrigin:r.publicOrigin,loopbackOrigin:new URL(r.origin).origin,...r.host!==void 0?{host:r.host}:{}}),a=Ice(t.path,t.target),c;try{c=new eo.default(`${o}${t.path}`,t.protocols,{headers:s})}catch(u){this.send({type:"close-stream",streamId:t.streamId,code:1011,reason:String(u)});return}let l={socket:c,buffered:[],open:!1,countsAsRemoteClient:a};this.wsStreams.set(t.streamId,l),a&&this.adjustRemoteClients(1),c.on("open",()=>{this.refusedOrigins.delete(r.origin),l.open=!0,this.send({type:"ws-open-ack",streamId:t.streamId,protocol:c.protocol||null});for(let u of l.buffered)this.onFrame(u);l.buffered=[]}),c.on("message",(u,d)=>{this.send({type:"ws-data",streamId:t.streamId,isBinary:d,data:d?new Uint8Array(u):new Uint8Array(Buffer.from(u.toString()))})}),c.on("close",(u,d)=>{this.wsStreams.has(t.streamId)&&(this.forgetWsStream(t.streamId,l),this.send({type:"close-stream",streamId:t.streamId,code:u===1e3||u>=3e3&&u<=4999?u:1e3,reason:d.toString()}))}),c.on("error",u=>{this.recordOriginFailure(t.target,r.origin,u)||this.options.log.warn(`origin ws error on ${t.path}: ${u.message}`)})}}});var kce=g(()=>{"use strict";TB();wce();Ece();_ce()});function Ta(e){return new URL(`https://${e}`).hostname.endsWith(".localhost")?"http:":"https:"}var Ace=g(()=>{"use strict"});var IB=g(()=>{"use strict";Ace()});function yw(e){let t=new URL(e),n=t.hostname.indexOf(".");if(n<=0||n===t.hostname.length-1)throw new Error(`cannot derive the bb connect gate base domain from enrollment server ${t.origin}`);let o=`${t.hostname.slice(n+1)}${t.port?`:${t.port}`:""}`;if(t.protocol!==Ta(o))throw new Error(`bb connect machine credentials require HTTPS, or HTTP for a local *.localhost enrollment server, got ${t.origin}`);return{apiOrigin:t.origin,baseDomain:o}}function DJe(e){return new URL(`https://${e}`).hostname.startsWith("next.")}function OJe(e){try{return DJe(yw(e).baseDomain)}catch{return!1}}function NJe(e){let t=Ta(e.baseDomain)==="https:"?"wss:":"ws:",n=new URL(`${t}//${e.label}.${e.baseDomain}/__tunnel`);return n.searchParams.set("v",String(1)),n.toString()}function LJe(e,t){return`${Ta(e.baseDomain)}//${e.label}--${t}.${e.baseDomain}`}var CJe,cf,MJe,vw,Cce=g(()=>{"use strict";Hp();PB();kce();wt();IB();CJe=1e4,cf=class extends Error{code="credential_rejected";constructor(t){super(t),this.name="ConnectTunnelCredentialRejectedError"}};MJe="this machine joined through a connect next address, which has no bb connect machine tunnel; its shared ports answer through connect next";vw=class{constructor(t){this.options=t;this.createWebSocket=t.createWebSocket??((n,r)=>new eo.default(n,{headers:r.headers})),this.fetchFn=t.fetchFn??fetch,this.backoff=new sf(t.reconnectBackoff),this.handshakeTimeoutMs=t.handshakeTimeoutMs??CJe,this.machineCredential=t.machineCredential?.trim().length===0?void 0:t.machineCredential,this.servedByNext=OJe(t.serverUrl)}options;createWebSocket;fetchFn;backoff;handshakeTimeoutMs;machineCredential;servedByNext;generation=-1;ports=new Set;identity;identityPromise;connectAttempt;connectionEpoch=0;socket;session;reconnectTimer;state="offline";lastError=null;credentialRejected=!1;stopped=!1;status(){return{state:this.state,lastError:this.servedByNext&&this.ports.size>0?MJe:this.lastError,credentialRejected:this.credentialRejected,generation:Math.max(this.generation,0),ports:[...this.ports].sort((t,n)=>t-n)}}replaceShareSet(t){return t.generation<=this.generation?!1:(this.applyShareSet(t),!0)}replaceAuthoritativeShareSet(t){this.applyShareSet(t),this.reportCurrentIdentity()}ensureTunnelIdentity(){if(this.identity)return Promise.resolve(this.identity);if(this.identityPromise)return this.identityPromise;let t=this.machineCredential;if(!t)return Promise.reject(new Error("this host has no trusted bb connect machine enrollment; remove and re-add it from Settings > Machines"));let n;try{n=yw(this.options.serverUrl)}catch(s){return Promise.reject(s)}if(this.credentialRejected)return Promise.reject(new cf("the bb connect gate rejected this machine credential; re-add the machine from Settings > Machines"));let r=new URL("/api/connect/machine-label",n.apiOrigin),o;return o=this.fetchFn(r,{method:"POST",headers:{"content-type":"application/json","x-bb-connect-machine":t},body:JSON.stringify({desiredName:this.options.hostName})}).then(async s=>{if(s.status===401||s.status===403){let l=new cf(`machine label assignment rejected: HTTP ${s.status}`);throw this.markCredentialRejected(l.message),l}if(!s.ok)throw new Error(`machine label assignment failed: HTTP ${s.status}`);let a=await s.json();if(typeof a!="object"||a===null||!("label"in a)||typeof a.label!="string")throw new Error("machine label assignment returned an invalid body");let c=Jp.parse({label:a.label,baseDomain:n.baseDomain});return this.identity=c,this.options.onIdentity?.(c),c}).finally(()=>{this.identityPromise===o&&(this.identityPromise=void 0)}),this.identityPromise=o,o}shutdown(){this.stopped=!0,this.goOffline()}applyShareSet(t){let n=this.ports;if(this.generation=t.generation,this.ports=new Set(t.ports),!this.hasConnectIntent()){this.goOffline();return}[...n].some(o=>!this.ports.has(o))&&this.stopCurrentConnection(),this.state="reconnecting",this.ensureConnected(),this.publish()}hasConnectIntent(){return!this.stopped&&!this.servedByNext&&this.ports.size>0&&this.machineCredential!==void 0&&!this.credentialRejected}ensureConnected(){if(!this.hasConnectIntent()||this.socket||this.reconnectTimer||this.connectAttempt)return;let t=this.connectionEpoch,n;n=this.ensureTunnelIdentity().then(r=>{t!==this.connectionEpoch||!this.hasConnectIntent()||this.openTunnel(r)}).catch(r=>{t!==this.connectionEpoch||!this.hasConnectIntent()||r instanceof cf||(this.lastError=r instanceof Error?r.message:String(r),this.state="reconnecting",this.options.logger.warn({err:r},this.lastError),this.scheduleReconnect(0),this.publish())}).finally(()=>{this.connectAttempt===n&&(this.connectAttempt=void 0),this.hasConnectIntent()&&!this.socket&&!this.reconnectTimer&&this.ensureConnected()}),this.connectAttempt=n}openTunnel(t){let n=this.machineCredential;if(!this.hasConnectIntent()||!n)return;let r=NJe(t);this.state="reconnecting",this.options.logger.info({label:t.label,ports:[...this.ports],tunnelUrl:r},"Machine tunnel connecting");let o;try{o=this.createWebSocket(r,{headers:{authorization:`Bearer ${n}`}})}catch(d){this.lastError=`cannot dial ${r}: ${d instanceof Error?d.message:String(d)}`,this.options.logger.warn({err:d,tunnelUrl:r},this.lastError),this.scheduleReconnect(0),this.publish();return}this.socket=o;let s=0,a,c,l=!1,u=setTimeout(()=>{this.socket!==o||s!==0||(l=!0,this.lastError=`machine tunnel handshake timed out after ${this.handshakeTimeoutMs}ms`,this.options.logger.warn({label:t.label,tunnelUrl:r},this.lastError),o.terminate())},this.handshakeTimeoutMs);u.unref?.(),o.on("open",()=>{if(clearTimeout(u),this.socket!==o||!this.hasConnectIntent()){o.terminate();return}s=Date.now(),this.state="connected",this.lastError=null,a=new af({tunnel:o,log:{warn:d=>this.options.logger.warn({label:t.label},d)},resolveOrigin:d=>this.resolveOrigin(d)}),this.session=a,a.start(),this.options.logger.info({label:t.label,ports:[...this.ports]},"Machine tunnel connected"),this.publish()}),o.on("unexpected-response",(d,p)=>{this.socket===o&&(c=p.statusCode??0,this.lastError=`machine tunnel rejected: HTTP ${c}`,this.options.logger.warn({label:t.label,statusCode:c},this.lastError),(c===401||c===403)&&(this.credentialRejected=!0),p.resume(),o.terminate(),this.publish())}),o.on("error",d=>{this.socket!==o||c!==void 0||l||(this.lastError=RB(d,`${t.label}.${t.baseDomain}`),this.publish())}),o.on("close",(d,p)=>{if(clearTimeout(u),a?.dispose(),this.session===a&&(this.session=void 0),this.socket===o){if(this.socket=void 0,!this.hasConnectIntent()){this.state="offline",this.backoff.reset(),this.publish();return}this.lastError===null&&(this.lastError=`machine tunnel closed (code ${d}${p.length>0?`, ${p.toString()}`:""})`),this.state="reconnecting",this.scheduleReconnect(s===0?0:Date.now()-s),this.publish()}}),this.publish()}scheduleReconnect(t){if(!this.hasConnectIntent()||this.reconnectTimer)return;let n=this.backoff.nextDelayAfterClose(t);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.ensureConnected()},n),this.reconnectTimer.unref?.()}resolveOrigin(t){if(t===void 0)return{kind:"unregistered"};let n=Number(t),r=this.identity;return!Number.isInteger(n)||!this.ports.has(n)||!r?{kind:"unregistered"}:{kind:"ok",resolved:{origin:`http://127.0.0.1:${n}`,publicOrigin:LJe(r,n),host:`127.0.0.1:${n}`}}}markCredentialRejected(t){this.credentialRejected=!0,this.lastError=t,this.state="offline",this.stopCurrentConnection(),this.backoff.reset(),this.publish()}reportCurrentIdentity(){this.identity&&this.options.onIdentity?.(this.identity)}goOffline(){this.stopCurrentConnection(),this.state="offline",this.lastError=null,this.backoff.reset(),this.publish()}stopCurrentConnection(){this.connectionEpoch+=1,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.session?.dispose(),this.session=void 0;let t=this.socket;this.socket=void 0,t?.terminate()}publish(){this.options.onStatusChange?.(this.status())}}});import{gunzipSync as BJe,inflateRawSync as FJe}from"node:zlib";function bw(e,t,n){let r=e.subarray(t,t+n),o=r.indexOf(0);return r.subarray(0,o===-1?r.length:o).toString("utf8")}function $Je(e){let t=bw(e,124,12).trim(),n=Number.parseInt(t===""?"0":t,8);if(!Number.isFinite(n)||n<0)throw new po("the tar archive has a corrupt entry size");return n}function jJe(e,t){let n=0,r=null;for(;n+lf<=e.length;){let o=e.subarray(n,n+lf);if(o.every(m=>m===0))return null;let s=$Je(o),a=String.fromCharCode(o[156]??0),c=n+lf,l=c+s;if(l>e.length)throw new po("the tar archive is truncated");if(n=c+Math.ceil(s/lf)*lf,a==="L"){r=bw(e,c,s);continue}let u=bw(o,345,155),d=bw(o,0,100),p=r??(u===""?d:`${u}/${d}`);if(r=null,(a==="0"||a==="\0")&&p===t)return Buffer.from(e.subarray(c,l))}return null}function WJe(e){let t=Math.max(0,e.length-22-65535);for(let n=e.length-22;n>=t;n-=1)if(e.readUInt32LE(n)===HJe)return n;throw new po("the zip archive has no central directory")}function qJe(e,t){let n=WJe(e),r=e.readUInt16LE(n+10),o=e.readUInt32LE(n+16);for(let s=0;s<r;s+=1){if(e.readUInt32LE(o)!==UJe)throw new po("the zip archive has a corrupt central directory");let a=e.readUInt16LE(o+10),c=e.readUInt32LE(o+20),l=e.readUInt32LE(o+24),u=e.readUInt16LE(o+28),d=e.readUInt16LE(o+30),p=e.readUInt16LE(o+32),m=e.readUInt32LE(o+42),f=e.subarray(o+46,o+46+u).toString("utf8");if(o+=46+u+d+p,f!==t)continue;if(e.readUInt32LE(m)!==zJe)throw new po("the zip archive has a corrupt local header");let v=m+30+e.readUInt16LE(m+26)+e.readUInt16LE(m+28),b=e.subarray(v,v+c),S=a===0?Buffer.from(b):a===8?FJe(b):null;if(S===null)throw new po(`the zip archive uses compression ${a}`);if(S.length!==l)throw new po("the zip archive member has the wrong size");return S}return null}function Dce(e,t,n){let r=Buffer.from(e),o=t==="tar.gz"?jJe(BJe(r),n):qJe(r,n);if(o===null)throw new po(`the archive has no ${n}`);return o}var po,lf,HJe,UJe,zJe,_B=g(()=>{"use strict";po=class extends Error{constructor(t){super(t),this.name="ArchiveError"}},lf=512;HJe=101010256,UJe=33639248,zJe=67324752});var Oce,mo,Mce,wzt,Ezt,Sw=g(()=>{"use strict";Oce="credential",mo="0.71.0",Mce="bb connect refused this server credential",wzt=new TextEncoder,Ezt=new TextDecoder});import{createHash as GJe,randomUUID as VJe}from"node:crypto";import*as vr from"node:fs/promises";import kB from"node:path";function XJe(e,t,n="frpc"){let r=JJe[e],o=YJe[t];if(r===void 0||o===void 0)throw new Ra(`frp has no client for ${e}/${t}`);let s=r==="windows"?"zip":"tar.gz",a=`frp_${mo}_${r}_${o}`,c=`${a}.${s}`,l=ZJe[c];if(l===void 0)throw new Ra(`no pinned checksum for ${c}`);let u=r==="windows"?`${n}.exe`:n;return{fileName:c,url:`${KJe}/v${mo}/${c}`,sha256:l,format:s,member:`${a}/${u}`,binaryName:u}}function QJe(e){return GJe("sha256").update(e).digest("hex")}function e9e(e,t){let n=QJe(t);if(n!==e.sha256)throw new Ra(`${e.fileName} does not match its pinned sha256 (got ${n}), so bb will not run it`)}async function Lce(e){try{return await vr.access(e),!0}catch{return!1}}async function n9e(e){let t=XJe(e.platform,e.arch,e.tool),n=kB.join(e.dir,t.binaryName);if(await Lce(n))return n;let r=await(e.download??t9e)(t.url);e9e(t,r);let o=Dce(r,t.format,t.member);await vr.mkdir(e.dir,{recursive:!0,mode:448});let s=kB.join(e.dir,`.${t.binaryName}.${VJe()}`);try{await vr.writeFile(s,o,{mode:493}),await vr.chmod(s,493),await vr.rename(s,n)}finally{await vr.rm(s,{force:!0})}return n}function r9e(e){return kB.join(e,"frp",mo)}async function Bce(e){let t=e.env[Nce];if(t!==void 0&&t!==""){if(!await Lce(t))throw new Ra(`${Nce} names ${t}, which does not exist`);return t}return n9e({dir:r9e(e.dataDir),platform:e.platform??process.platform,arch:e.arch??process.arch,tool:"frpc",...e.download===void 0?{}:{download:e.download}})}var KJe,ZJe,JJe,YJe,Ra,t9e,Nce,Fce=g(()=>{"use strict";Sw();_B();KJe="https://github.com/fatedier/frp/releases/download",ZJe={[`frp_${mo}_linux_amd64.tar.gz`]:"84f27e39f11169f7adcef8e8b70c9329de17747b1f14dad9fb95eef5682ea716",[`frp_${mo}_linux_arm64.tar.gz`]:"f33c293c275d8fc68c654b6fba8f10b2551d6463d09a9fc9cffb7227eae82266",[`frp_${mo}_darwin_amd64.tar.gz`]:"1b1b4e2f1836e21e8733f1dddaacd4ed9ae67d7dbee39046b9d7b7eda6253637",[`frp_${mo}_darwin_arm64.tar.gz`]:"45be02b186860d375ed49a8941ae9569628a54bf14e67fc36b29c98c99dabcc6",[`frp_${mo}_windows_amd64.zip`]:"9e5062e3e5cf07e67144a3a4acf175ef6a2486f3605dd6cf288bae34ab39819f",[`frp_${mo}_windows_arm64.zip`]:"b56a5c2a1a2a55d11bc27aeef6edabd39f3d194360ea66660cc27281b502cb1c"},JJe={linux:"linux",darwin:"darwin",win32:"windows"},YJe={x64:"amd64",arm64:"arm64"},Ra=class extends Error{constructor(t){super(t),this.name="FrpBinaryError"}};t9e=async e=>{let t=await fetch(e,{signal:AbortSignal.timeout(12e4)});if(!t.ok)throw new Ra(`downloading ${e} answered HTTP ${t.status}`);return new Uint8Array(await t.arrayBuffer())};Nce="BB_CONNECT_FRPC"});import{randomBytes as $ce}from"node:crypto";import*as qi from"node:fs/promises";import o9e from"node:net";import i9e from"node:path";import{rootCertificates as s9e}from"node:tls";async function a9e(){return new Promise((e,t)=>{let n=o9e.createServer();n.once("error",t),n.listen(0,"127.0.0.1",()=>{let r=n.address();if(r===null||typeof r=="string"){n.close(),t(new Error("could not pick a loopback port"));return}n.close(()=>e(r.port))})})}async function jce(){return{port:await a9e(),user:`bb-${$ce(6).toString("hex")}`,password:$ce(24).toString("base64url")}}function Hce(e){return{serverAddr:e.server.host,serverPort:e.server.port,user:e.user,loginFailExit:!1,metadatas:{[Oce]:e.credential},log:{to:"console",level:"info",disablePrintColor:!0},...e.admin===null?{}:{webServer:{addr:"127.0.0.1",port:e.admin.port,user:e.admin.user,password:e.admin.password}},transport:{protocol:e.server.protocol,poolCount:c9e,...e.server.protocol==="wss"?{tls:{enable:!0,serverName:e.server.host,...e.trustedCaFile===null?{}:{trustedCaFile:e.trustedCaFile}}}:{}},proxies:e.proxies.map(t=>({name:t.name,type:"http",localIP:t.localIP,localPort:t.localPort,subdomain:t.subdomain,...t.hostHeaderRewrite===null?{}:{hostHeaderRewrite:t.hostHeaderRewrite}}))}}async function Uce(e,t){await qi.mkdir(i9e.dirname(e),{recursive:!0,mode:448}),await qi.writeFile(e,t,{mode:384}),await qi.chmod(e,384)}async function zce(e,t){await Uce(e,`${JSON.stringify(t,null,2)}
259
+ ${mY(e.stderr,iJe)}`}function lJe(e,t){let n=Object.entries(e),r=Object.entries(t);return n.length!==r.length?!1:n.every(([o,s])=>t[o]===s)}function hce(e){let t={};e.PATH&&(t.PATH=e.PATH);let n=process.env.BB_PROVIDER_BRIDGE_RECORD_DIR;return n&&(t.BB_PROVIDER_BRIDGE_RECORD_DIR=n),Object.keys(t).length>0?t:null}var yB,rJe,oJe,iJe,bB,mw,gce=g(()=>{"use strict";HS();RS();Me();$o();_x();SL();ta();jM();la();yB=()=>{},rJe="provider-maintenance-workspace",oJe=6e4,iJe=4e3,bB=class extends Error{constructor(t){super(`Daemon bug: a command targeting no thread carried injected skill sources into busy environment ${t.environmentId} (active catalog ${t.activeCatalogHash??"none"}, requested ${t.requestedCatalogHash})`),this.name="SkillCatalogConflictError"}};mw=class{constructor(t={}){this.options=t;this.createRuntime=t.createRuntime??AM,this.hostWatcher=t.hostWatcher,this.provisionWorkspace=t.provisionWorkspace??sm,this.baseShellEnv={...t.shellEnv??{}},this.providerInstallationGate=gie({ttlMs:fie}),this.ensureDataDirSkillsWatcher()}options;createRuntime;hostWatcher;provisionWorkspace;baseShellEnv;shellEnvGeneration=0;entries=new Map;pendingEntries=new Map;pendingEnvironmentEnsures=new Map;pendingCatalogHashes=new Map;pendingEnvironmentProvisions=new Map;pendingWorkspaceRefreshes=new Map;inFlightThreadCommandsByEnvironmentId=new Map;inFlightThreadCommandCompletionsByEnvironmentId=new Map;threadControlTails=new Map;providerMaintenanceRuntime=null;pendingProviderMaintenanceRuntime=null;providerMaintenanceRuntimeGeneration=0;providerMaintenanceActiveRequests=0;providerMaintenanceIdleTimer=null;providerInstallationGate;stopWatchingDataDirSkillsRoot=yB;runtimeWorkspaceWriteRoots(t){let n=[...t.workspaceRoots];return t.threadStorageRootPath&&n.push(t.threadStorageRootPath),[...new Set(n)]}get(t){return this.entries.get(t)}hasPendingEnvironmentProvision(t){return this.pendingEnvironmentProvisions.has(t)}async getOrAwait(t){let n=this.entries.get(t);if(n)return n;let r=this.pendingEntries.get(t);if(r)return r}enqueueThreadControl(t,n){return Nn(this.threadControlTails,t,n)}async releaseThreadFromOtherEnvironments(t){return await this.waitForThreadCommandsInOtherEnvironments(t),this.enqueueThreadControl(t.threadId,()=>this.releaseThreadFromOtherEnvironmentsOnce(t))}async waitForThreadCommandsInOtherEnvironments(t){for(;;){let n=[...this.inFlightThreadCommandCompletionsByEnvironmentId.entries()].flatMap(([r,o])=>r===t.environmentId?[]:[...o.get(t.threadId)??[]]);if(n.length===0)return;await Promise.all(n)}}async releaseThreadFromOtherEnvironmentsOnce(t){let n=[...this.entries.values()].filter(c=>c.environmentId!==t.environmentId&&c.runtime.hasThread(t.threadId)),r=t.activeTurn==="interrupt"?[]:n.filter(c=>c.runtime.getActiveTurnId(t.threadId)!==null),o=n.filter(c=>!r.includes(c)),s=await Promise.all(o.map(c=>c.runtime.stopThread({threadId:t.threadId}))),a=new Set(s.flatMap(c=>c.providerCheckpointId===null?[]:[c.providerCheckpointId]));return{activeTurnEnvironmentIds:r.map(c=>c.environmentId),providerCheckpointId:a.size===1?a.values().next().value??null:null,releasedEnvironmentIds:o.map(c=>c.environmentId)}}listThreadOwnerEntries(t){return[...this.entries.values()].filter(n=>n.runtime.hasThread(t))}markTerminalActive(t,n){this.entries.get(t)?.terminals.add(n)}markTerminalInactive(t,n){this.entries.get(t)?.terminals.delete(n)}async retainEnvironmentForThreadCommand(t,n){return this.enqueueThreadControl(n,()=>{let r=this.inFlightThreadCommandsByEnvironmentId.get(t)??new Map;r.set(n,(r.get(n)??0)+1),this.inFlightThreadCommandsByEnvironmentId.set(t,r);let o,s=new Promise(u=>{o=u}),a=this.inFlightThreadCommandCompletionsByEnvironmentId.get(t)??new Map,c=a.get(n)??new Set;c.add(s),a.set(n,c),this.inFlightThreadCommandCompletionsByEnvironmentId.set(t,a);let l=!1;return()=>{if(l)return;l=!0;let u=this.inFlightThreadCommandsByEnvironmentId.get(t);if(u){let m=u.get(n)??0;m<=1?u.delete(n):u.set(n,m-1),u.size===0&&this.inFlightThreadCommandsByEnvironmentId.delete(t)}let d=this.inFlightThreadCommandCompletionsByEnvironmentId.get(t),p=d?.get(n);p?.delete(s),p?.size===0&&d?.delete(n),d?.size===0&&this.inFlightThreadCommandCompletionsByEnvironmentId.delete(t),o()}})}canInstallUpdate(){return this.inFlightThreadCommandsByEnvironmentId.size===0&&[...this.entries.values()].every(t=>!this.entryHasActiveRuntimeWork(t))}listActiveThreads(){let t=[];for(let n of this.entries.values())for(let r of n.runtime.getLiveThreadIds())t.push({threadId:r});return t}listLoadedEnvironments(){return[...this.entries.keys()].map(t=>({environmentId:t}))}async reapIdleProviderSessions(t){let n=[];for(let r of this.entries.values()){let o=await r.runtime.reapIdleProviderSessions({...t,runThreadExclusive:(s,a)=>this.enqueueThreadControl(s,()=>this.entryHasInFlightThreadCommand(r,s)?null:a())});for(let s of o.reapedSessions)n.push({...s,environmentId:r.environmentId})}return{reapedSessions:n}}getShellEnv(){return this.options.applyMachineEnvironment?.(this.baseShellEnv)??{...this.baseShellEnv}}async replaceBaseShellEnv(t){lJe(this.baseShellEnv,t)||(this.baseShellEnv={...t},this.shellEnvGeneration+=1,this.providerInstallationGate.clear(),await this.shutdownProviderMaintenanceRuntime(),await this.evictIdleRuntimeEntries())}getInjectedSkillsLogger(){return this.options.logger}async resolveRuntimeSkillConfig(t){if(t.injectedSkillSources===void 0)return null;if(t.injectedSkillSources.length===0)return{catalogHash:Tx,skillRoots:[]};if(!this.options.dataDir)throw new Error("Runtime skill staging requires a host dataDir");return ure({workspacePath:t.workspacePath??this.entries.get(t.environmentId)?.path??null,dataDir:this.options.dataDir,injectedSkillSources:t.injectedSkillSources,...this.options.fetchSkillTree!==void 0?{fetchSkillTree:this.options.fetchSkillTree}:{},logger:this.getInjectedSkillsLogger()})}entryHasActiveRuntimeWork(t){return t.terminals.size>0||t.runtime.getLiveThreadIds().length>0||t.runtime.hasOpenBackgroundWork()}hasInFlightThreadCommand(t,n){let r=this.inFlightThreadCommandsByEnvironmentId.get(t.environmentId);return r?[...r.keys()].some(o=>o!==n):!1}entryHasInFlightThreadCommand(t,n){return this.inFlightThreadCommandsByEnvironmentId.get(t.environmentId)?.has(n)??!1}entryHasActiveEnvironmentWork(t){return this.entryHasActiveRuntimeWork(t)||this.hasInFlightThreadCommand(t)}async cleanupUnusedInjectedSkillStagingDirs(t){if(this.options.dataDir)try{await Ix({dataDir:this.options.dataDir,keepCatalogHashes:[...t,...this.pendingCatalogHashes.values(),...[...this.entries.values()].flatMap(n=>[...n.retainedSkillCatalogHashes])],logger:this.getInjectedSkillsLogger()})}catch(n){this.options.logger?.warn({reason:n instanceof Error&&n.message.trim().length>0?n.message:"Unable to clean injected skill staging directories"},"Failed to clean injected skill staging directories")}}async replaceEntryForSkillCatalog(t){if(this.entryHasActiveRuntimeWork(t.entry)||this.hasInFlightThreadCommand(t.entry,t.targetThreadId))throw new bB({environmentId:t.entry.environmentId,activeCatalogHash:t.entry.skillCatalogHash,requestedCatalogHash:t.skillConfig.catalogHash});this.entries.delete(t.entry.environmentId),await t.entry.runtime.shutdown(),await this.cleanupUnusedInjectedSkillStagingDirs([t.skillConfig.catalogHash])}async ensureCompatibleEntry(t){return t.entry.shellEnvGeneration!==this.shellEnvGeneration&&!this.entryHasActiveRuntimeWork(t.entry)&&!this.hasInFlightThreadCommand(t.entry,t.targetThreadId)?(this.entries.delete(t.entry.environmentId),await t.entry.runtime.shutdown(),await this.cleanupUnusedInjectedSkillStagingDirs(t.skillConfig?[t.skillConfig.catalogHash]:[]),null):t.skillConfig===null||t.entry.skillCatalogHash===t.skillConfig.catalogHash||t.entry.skillCatalogHash===null&&t.skillConfig.skillRoots.length===0?t.entry:t.targetThreadId!==void 0&&(this.entryHasActiveRuntimeWork(t.entry)||this.hasInFlightThreadCommand(t.entry,t.targetThreadId))?(t.entry.retainedSkillCatalogHashes.add(t.skillConfig.catalogHash),{...t.entry,skillCatalogHash:t.skillConfig.catalogHash,skillRoots:t.skillConfig.skillRoots}):(await this.replaceEntryForSkillCatalog({entry:t.entry,skillConfig:t.skillConfig,...t.targetThreadId!==void 0?{targetThreadId:t.targetThreadId}:{}}),null)}async invalidateProviderMaintenanceRuntime(){this.providerInstallationGate.clear();try{await this.shutdownProviderMaintenanceRuntime()}catch(t){this.options.logger?.warn({err:t},"Failed to shut down provider maintenance runtime during invalidation")}}async shutdownProviderMaintenanceRuntime(){this.clearProviderMaintenanceIdleTimer();let t=this.providerMaintenanceRuntime,n=this.pendingProviderMaintenanceRuntime;this.providerMaintenanceRuntimeGeneration+=1,this.providerMaintenanceRuntime=null,this.pendingProviderMaintenanceRuntime===n&&(this.pendingProviderMaintenanceRuntime=null);let r=n?await n.promise.catch(()=>null):null;r&&this.providerMaintenanceRuntime===r&&(this.providerMaintenanceRuntime=null);let o=[...new Set([t,r])];await Promise.all(o.map(s=>s?.shutdown()??Promise.resolve()))}clearProviderMaintenanceIdleTimer(){this.providerMaintenanceIdleTimer!==null&&(clearTimeout(this.providerMaintenanceIdleTimer),this.providerMaintenanceIdleTimer=null)}scheduleProviderMaintenanceIdleShutdown(){if(this.clearProviderMaintenanceIdleTimer(),this.providerMaintenanceActiveRequests>0||this.providerMaintenanceRuntime===null&&this.pendingProviderMaintenanceRuntime===null)return;let t=this.options.providerMaintenanceIdleTimeoutMs??oJe;this.providerMaintenanceIdleTimer=setTimeout(()=>{this.providerMaintenanceIdleTimer=null,!(this.providerMaintenanceActiveRequests>0)&&this.shutdownProviderMaintenanceRuntime().catch(n=>{this.options.logger?.warn({err:n},"Failed to shut down idle provider maintenance runtime")})},t),this.providerMaintenanceIdleTimer.unref()}async evictIdleRuntimeEntries(){let t=[...this.entries.values()].filter(n=>!this.entryHasActiveEnvironmentWork(n));for(let n of t)this.entries.delete(n.environmentId);await Promise.all(t.map(n=>n.runtime.shutdown())),await this.cleanupUnusedInjectedSkillStagingDirs([])}async ensureProviderMaintenanceRuntime(t){if(this.providerMaintenanceRuntime)return this.providerMaintenanceRuntime;if(this.pendingProviderMaintenanceRuntime)return this.pendingProviderMaintenanceRuntime.promise;let n=this.providerMaintenanceRuntimeGeneration,r,o=Promise.resolve().then(()=>this.createProviderMaintenanceRuntime(t)).then(s=>(this.pendingProviderMaintenanceRuntime===r&&this.providerMaintenanceRuntimeGeneration===n&&(this.providerMaintenanceRuntime=s),s)).finally(()=>{this.pendingProviderMaintenanceRuntime===r&&(this.pendingProviderMaintenanceRuntime=null)});return r={generation:n,promise:o},this.pendingProviderMaintenanceRuntime=r,o}async withProviderMaintenanceRuntime(t,n){this.clearProviderMaintenanceIdleTimer(),this.providerMaintenanceActiveRequests+=1;try{let r=await this.ensureProviderMaintenanceRuntime(t);return await n(r)}finally{this.providerMaintenanceActiveRequests-=1,this.providerMaintenanceActiveRequests===0&&this.scheduleProviderMaintenanceIdleShutdown()}}async ensureEnvironment(t){let n=this.pendingEnvironmentEnsures.get(t.environmentId);if(n)return await n,this.ensureEnvironment(t);let r=this.ensureEnvironmentOnce(t).finally(()=>{this.pendingEnvironmentEnsures.get(t.environmentId)===r&&this.pendingEnvironmentEnsures.delete(t.environmentId)});return this.pendingEnvironmentEnsures.set(t.environmentId,r),r}async ensureEnvironmentOnce(t){let n=await this.resolveRuntimeSkillConfig(t),r=this.entries.get(t.environmentId);if(r){let c=await this.ensureCompatibleEntry({entry:r,skillConfig:n,...t.targetThreadId!==void 0?{targetThreadId:t.targetThreadId}:{}});if(c)return c}let o=this.pendingEntries.get(t.environmentId);if(o){let c=await o,l=await this.ensureCompatibleEntry({entry:c,skillConfig:n,...t.targetThreadId!==void 0?{targetThreadId:t.targetThreadId}:{}});if(l)return l}let s=this.createPendingEnvironmentProvision(t.environmentId),a=Promise.resolve().then(()=>this.createEntry({...t,provisionSignal:s.abortController.signal,skillConfig:n})).then(c=>(this.entries.set(t.environmentId,c),c)).finally(()=>{this.pendingEntries.delete(t.environmentId),this.pendingCatalogHashes.delete(t.environmentId),this.clearPendingEnvironmentProvision(t.environmentId,s)});return s.done=a,this.pendingEntries.set(t.environmentId,a),n!==null&&this.pendingCatalogHashes.set(t.environmentId,n.catalogHash),a}async refreshEnvironmentWorkspace(t){let n=this.pendingWorkspaceRefreshes.get(t.environmentId);if(n)return n;let r=this.refreshEnvironmentWorkspaceOnce(t).finally(()=>{this.pendingWorkspaceRefreshes.get(t.environmentId)===r&&this.pendingWorkspaceRefreshes.delete(t.environmentId)});return this.pendingWorkspaceRefreshes.set(t.environmentId,r),r}async refreshEnvironmentWorkspaceOnce(t){let n=await this.getOrAwait(t.environmentId);if(n&&n.path!==t.workspacePath)throw new Error(`Cannot refresh environment ${t.environmentId} at ${t.workspacePath}; it is bound to ${n.path}`);let r=await this.provisionHostWorkspace(t.provision);if(r.path!==t.workspacePath)throw new Error(`Workspace refresh for ${t.environmentId} returned ${r.path}, not ${t.workspacePath}`);return n&&(n.workspace=r),r}async cancelEnvironmentProvision(t){let n=this.pendingEnvironmentProvisions.get(t.environmentId);return n?(n.abortController.abort(new Te("provision_cancelled","Environment provisioning was cancelled")),{aborted:!0}):{aborted:!1}}createPendingEnvironmentProvision(t){let n={abortController:new AbortController,done:Promise.resolve()};return this.pendingEnvironmentProvisions.set(t,n),n}clearPendingEnvironmentProvision(t,n){this.pendingEnvironmentProvisions.get(t)===n&&this.pendingEnvironmentProvisions.delete(t)}async shutDownEntry(t){let n=this.entries.get(t),r=this.pendingEntries.get(t),o=n;if(!o&&r)try{o=await r}catch{o=void 0}if(o)return this.entries.delete(t),await o.runtime.shutdown(),o}async forgetEnvironment(t){await this.shutDownEntry(t)&&await this.cleanupUnusedInjectedSkillStagingDirs([])}async shutdownAll(){let t=[...this.entries.values()];for(let n of this.pendingEntries.values())try{t.push(await n)}catch{}this.entries.clear(),this.pendingEntries.clear();for(let n of t)await n.runtime.shutdown();await this.shutdownProviderMaintenanceRuntime(),await this.stopWatchingDataDirSkillsRoot(),this.stopWatchingDataDirSkillsRoot=yB,await this.cleanupUnusedInjectedSkillStagingDirs([])}buildUnexpectedProviderExitEvents(t){let n=aJe(t),r=cJe(t),o=[];for(let s of t.threads){if(s.activeTurnId===null){s.pendingTurnStart&&o.push({type:"system/error",threadId:s.threadId,scope:Tt(),code:"provider_process_exited",message:n,...r?{detail:r}:{}});continue}s.providerThreadId!==null&&(o.push({type:"turn/completed",threadId:s.threadId,providerThreadId:s.providerThreadId,scope:je(s.activeTurnId),status:"failed",error:{message:n}}),o.push({type:"system/error",threadId:s.threadId,scope:je(s.activeTurnId),code:"provider_process_exited",message:n,...r?{detail:r}:{}}))}return o}async createProviderMaintenanceRuntime(t){let n=nJe.join(t.dataDir,rJe);await tJe(n,{recursive:!0});let r=null,o=this.getShellEnv(),s=hce(o);return r=this.createRuntime({workspacePath:n,additionalWorkspaceWriteRoots:[],...s?{env:s}:{},shellEnv:o,threadStorageRootPath:this.options.threadStorageRootPath??void 0,bridgeBundleDir:this.options.bridgeBundleDir,onEvent:a=>{this.options.onStderr?.(`Dropping provider maintenance event ${a.type}; no environment owns provider-only maintenance commands.`,a.threadId)},onToolCall:this.options.onToolCall??(async()=>({contentItems:[],success:!0})),onInteractiveRequest:this.options.onInteractiveRequest,onStderr:this.options.onStderr,onProcessExit:a=>{r&&this.providerMaintenanceRuntime===r&&r.listRunningProviders().length===0&&(this.providerMaintenanceRuntime=null),this.options.onProcessExit?.(a)}}),r}async createEntry(t){let n=t.provision??(t.workspacePath?{path:t.workspacePath}:null);if(!n)throw new Error(`Missing workspace path for environment ${t.environmentId}`);t.setupScriptTimeoutMs!=null&&await KS({workspacePath:n.path,timeoutMs:t.setupScriptTimeoutMs,contributedEnv:t.setupContributedEnv,shellPath:this.getShellEnv().PATH,signal:t.provisionSignal,onProgress:n.onProgress});let r=await this.provisionHostWorkspace({...n,signal:t.provisionSignal}),o=await r.getAdditionalWorkspaceWriteRoots(),s=this.runtimeWorkspaceWriteRoots({threadStorageRootPath:this.options.threadStorageRootPath,workspaceRoots:o}),a=null,c=this.getShellEnv(),l=this.shellEnvGeneration,u=hce(c);return a=this.createRuntime({workspacePath:r.path,additionalWorkspaceWriteRoots:s,...t.skillConfig?{skillRoots:t.skillConfig.skillRoots}:{},...u?{env:u}:{},shellEnv:c,threadStorageRootPath:this.options.threadStorageRootPath??void 0,bridgeBundleDir:this.options.bridgeBundleDir,onEvent:d=>{this.options.onEvent?.({environmentId:t.environmentId,event:d})},onToolCall:this.options.onToolCall??(async()=>({contentItems:[],success:!0})),onInteractiveRequest:this.options.onInteractiveRequest,onStderr:this.options.onStderr,onProviderRecovery:d=>{this.options.logger?.debug({environmentId:t.environmentId,providerId:d.providerId,threadId:d.threadId,kind:d.kind,retryable:d.retryable,message:d.message},"Provider bridge raised a recovery hint")},onProcessExit:d=>{if(!d.expected)for(let m of this.buildUnexpectedProviderExitEvents(d))this.options.onEvent?.({environmentId:t.environmentId,event:m});let p=this.entries.get(t.environmentId);!d.expected&&p?.runtime===a&&a.listRunningProviders().length===0&&this.entries.delete(t.environmentId),this.options.onProcessExit?.(d)}}),{environmentId:t.environmentId,runtime:a,shellEnvGeneration:l,skillCatalogHash:t.skillConfig?.catalogHash??null,skillRoots:t.skillConfig?.skillRoots??[],retainedSkillCatalogHashes:new Set(t.skillConfig?[t.skillConfig.catalogHash]:[]),terminals:new Set,workspace:r,path:r.path}}provisionHostWorkspace(t){return this.provisionWorkspace({...t,...On(this.getShellEnv())})}ensureDataDirSkillsWatcher(){if(!this.hostWatcher?.watchDataDirSkillsRoot||this.stopWatchingDataDirSkillsRoot!==yB)return;let t=this.options.dataDirSkillsRootPath;t&&(this.stopWatchingDataDirSkillsRoot=this.hostWatcher.watchDataDirSkillsRoot({dataDirSkillsRootPath:t,onChange:n=>{this.options.onInjectedSkillsChanged?.({changedPaths:n.changedPaths,sourceType:n.sourceType})},onWatchError:n=>{this.options.onDataDirSkillsWatchError?.({error:n})}}))}}});import SB from"node:path";function vce(e){return e.message.trim().length>0?e.message:"Unknown workspace watch error"}function dJe(e){return e.some(t=>uJe.includes(t))}function pJe(e,t){return e.environmentId===t.environmentId&&e.workspaceContext.workspacePath===t.workspaceContext.workspacePath}var xB,uJe,fw,yce=g(()=>{"use strict";$o();ta();xB=()=>{},uJe=["workspace-content-changed","workspace-git-changed","workspace-git-repository-created"];fw=class{constructor(t={}){this.options=t;this.hostWatcher=t.hostWatcher;let n=t.provisionWorkspace??sm;this.provisionWorkspace=r=>n({...r,...On(t.shellEnv?.()??{})}),this.refreshWorkspace=t.refreshWorkspace??(r=>this.provisionWorkspace(r.provision))}options;hostWatcher;provisionWorkspace;refreshWorkspace;threadStorageEntries=new Map;workspaceEntries=new Map;latestAppliedWatchSetGeneration=-1;watchSetMutationTail=Promise.resolve();async replaceWatchSet(t){await this.enqueueWatchSetMutation(async()=>{t.generation<=this.latestAppliedWatchSetGeneration||await this.applyWatchSet(t)})}async replaceAuthoritativeWatchSet(t){await this.enqueueWatchSetMutation(async()=>{await this.applyWatchSet(t)})}async shutdown(){await this.enqueueWatchSetMutation(async()=>{let t=[...this.workspaceEntries.values()],n=[...this.threadStorageEntries.values()];this.workspaceEntries.clear(),this.threadStorageEntries.clear(),await Promise.all([...t.map(r=>this.stopWorkspaceWatch(r)),...n.map(r=>r.stopWatching())])})}workspaceWatchCount(){return this.workspaceEntries.size}threadStorageWatchTargetCount(){return this.threadStorageEntries.size}async replaceWorkspaceTargets(t){let n=new Map;for(let o of t)n.set(o.environmentId,o);let r=[];for(let[o,s]of this.workspaceEntries){let a=n.get(o);if(a&&pJe(s.target,a)){n.delete(o);continue}this.workspaceEntries.delete(o),r.push(this.stopWorkspaceWatch(s))}await Promise.all(r);for(let o of n.values())await this.startWorkspaceWatch(o)}async replaceThreadStorageTargets(t){let n=new Map;for(let o of t)n.set(o.threadId,o);let r=[];for(let[o,s]of this.threadStorageEntries){let a=n.get(o);if(a){s.target=a,n.delete(o);continue}this.threadStorageEntries.delete(o),r.push(s.stopWatching())}await Promise.all(r);for(let o of n.values())this.startThreadStorageWatch(o)}enqueueWatchSetMutation(t){let n=this.watchSetMutationTail.then(t,t);return this.watchSetMutationTail=n.catch(()=>{}),n}async applyWatchSet(t){await this.replaceWorkspaceTargets(t.workspaceTargets),await this.replaceThreadStorageTargets(t.threadStorageTargets),this.latestAppliedWatchSetGeneration=t.generation}async startWorkspaceWatch(t){if(this.hostWatcher)try{let n=await this.provisionWorkspace({path:t.workspaceContext.workspacePath}),r={stopWatchingStatus:xB,target:t,watchState:{lastBranchName:void 0,lastDefaultBranch:void 0,lastLocalFingerprint:null,lastSharedRefsFingerprint:null,pendingKinds:new Set,processing:null},workspace:n};this.workspaceEntries.set(t.environmentId,r),r.stopWatchingStatus=this.hostWatcher.watchWorkspace({environmentId:t.environmentId,workspacePath:n.path,onChange:o=>{this.queueWorkspaceWatchChange({changeKinds:o.changeKinds,entry:r})},onReady:()=>{this.queueWorkspaceWatchChange({changeKinds:["workspace-content-changed"],entry:r})},onWatchError:o=>{this.options.onWorkspaceStatusWatchError?.({error:o})}})}catch(n){this.workspaceEntries.delete(t.environmentId),this.options.onWorkspaceStatusWatchError?.({error:{environmentId:t.environmentId,kind:"workspace-watch-error",message:n instanceof Error?vce(n):"Unknown workspace watch error",rootPath:t.workspaceContext.workspacePath}})}}queueWorkspaceWatchChange(t){if(this.workspaceEntries.get(t.entry.target.environmentId)===t.entry){t.changeKinds.includes("workspace-content-changed")&&this.options.onWorkspaceStatusChanged?.({changeKinds:["work-status-changed"],environmentId:t.entry.target.environmentId});for(let n of t.changeKinds)t.entry.watchState.pendingKinds.add(n);t.entry.watchState.processing||this.flushWorkspaceWatchChanges(t)}}flushWorkspaceWatchChanges(t){let n=this.processWorkspaceWatchChanges(t).finally(()=>{t.entry.watchState.processing===n&&(t.entry.watchState.processing=null),t.entry.watchState.pendingKinds.size>0&&this.flushWorkspaceWatchChanges(t)});t.entry.watchState.processing=n}async processWorkspaceWatchChanges(t){let n=Array.from(t.entry.watchState.pendingKinds);t.entry.watchState.pendingKinds.clear();try{let r=[],o,s;if(t.entry.workspace.isGitRepo&&t.entry.watchState.lastBranchName===void 0){if([o,s]=await Promise.all([t.entry.workspace.getLocalStateSnapshot(),t.entry.workspace.getSharedGitRefsSnapshot()]),this.workspaceEntries.get(t.entry.target.environmentId)!==t.entry)return;t.entry.watchState.lastLocalFingerprint=o.fingerprint,t.entry.watchState.lastSharedRefsFingerprint=s.fingerprint}if(dJe(n)){n.includes("workspace-git-repository-created")&&!t.entry.workspace.isGitRepo&&await this.refreshGitWorkspaceMetadata(t.entry);let a=n.includes("workspace-content-changed");if(t.entry.workspace.isGitRepo&&!a){o??=await t.entry.workspace.getLocalStateSnapshot();let c=o.fingerprint;t.entry.watchState.lastLocalFingerprint!==c&&(t.entry.watchState.lastLocalFingerprint=c,r.push("work-status-changed"))}}if(t.entry.workspace.isGitRepo&&n.includes("shared-git-refs-changed")){s??=await t.entry.workspace.getSharedGitRefsSnapshot();let a=s.fingerprint;t.entry.watchState.lastSharedRefsFingerprint!==a&&(t.entry.watchState.lastSharedRefsFingerprint=a,r.push("git-refs-changed"))}if(this.workspaceEntries.get(t.entry.target.environmentId)!==t.entry)return;r.length>0&&this.options.onWorkspaceStatusChanged?.({changeKinds:r,environmentId:t.entry.target.environmentId}),t.entry.workspace.isGitRepo&&(t.entry.watchState.lastBranchName===void 0||n.includes("workspace-git-changed")||n.includes("shared-git-refs-changed"))&&await this.reportCurrentBranch(t.entry,n.includes("workspace-git-changed"),s,o)}catch(r){this.reportWorkspaceWatchError(t.entry,r)}}async reportCurrentBranch(t,n,r,o){let[s,a]=await Promise.all([o!==void 0?o.branchName:n||t.watchState.lastBranchName===void 0?t.workspace.getCurrentBranch():t.watchState.lastBranchName,r===void 0?t.workspace.getDefaultBranch():r.defaultBranch]),c=a??s;this.workspaceEntries.get(t.target.environmentId)!==t||t.watchState.lastBranchName===s&&t.watchState.lastDefaultBranch===c||(t.watchState.lastBranchName=s,t.watchState.lastDefaultBranch=c,this.options.onWorkspaceMetadataChanged?.({environmentId:t.target.environmentId,workspace:{path:t.workspace.path,isGitRepo:!0,isWorktree:t.workspace.isWorktree,branchName:s,defaultBranch:c}}))}reportWorkspaceWatchError(t,n){this.options.onWorkspaceStatusWatchError?.({error:{environmentId:t.target.environmentId,kind:"workspace-watch-error",message:n instanceof Error?vce(n):"Unknown workspace watch error",rootPath:t.target.workspaceContext.workspacePath}})}async refreshGitWorkspaceMetadata(t){if(t.workspace.isGitRepo)return;let n={path:t.target.workspaceContext.workspacePath},r=await this.refreshWorkspace({environmentId:t.target.environmentId,provision:n,workspacePath:t.target.workspaceContext.workspacePath});if(!r.isGitRepo)return;let[o,s,a]=await Promise.all([r.getCurrentBranch(),r.getDefaultBranch(),r.getSharedGitRefsSnapshot()]);this.workspaceEntries.get(t.target.environmentId)===t&&(t.workspace=r,t.watchState.lastBranchName=o,t.watchState.lastDefaultBranch=s??o,t.watchState.lastSharedRefsFingerprint=a.fingerprint,this.options.onWorkspaceMetadataChanged?.({environmentId:t.target.environmentId,workspace:{path:r.path,isGitRepo:!0,isWorktree:r.isWorktree,branchName:o,defaultBranch:s??o}}))}async stopWorkspaceWatch(t){let n=t.stopWatchingStatus;t.stopWatchingStatus=xB,await n()}startThreadStorageWatch(t){let n={stopWatching:xB,target:t};this.threadStorageEntries.set(t.threadId,n);let r=this.options.threadStorageRootPath;if(!this.hostWatcher||!r)return;let o=SB.resolve(r,t.threadId);SB.dirname(o)===SB.resolve(r)&&(n.stopWatching=this.hostWatcher.watchThreadStorage({threadStoragePath:o,onChange:()=>{this.threadStorageEntries.get(n.target.threadId)===n&&this.options.onThreadStorageChanged?.({environmentId:n.target.environmentId,threadId:n.target.threadId})},onWatchError:s=>{this.options.onThreadStorageWatchError?.({error:s})}}))}}});function Wi(e,t,n){if(!Number.isInteger(t)||t<0||t>4294967295)throw new Error(`tunnel-contract: stream id out of range: ${t}`);let r=new Uint8Array(5+n.length);return r[0]=e,new DataView(r.buffer).setUint32(1,t),r.set(n,5),r}function rf(e){return mJe.encode(JSON.stringify(e))}function Sce(e){switch(e.type){case"open-http":return Wi(ct.openHttp,e.streamId,rf({method:e.method,path:e.path,headers:e.headers,hasBody:e.hasBody,...e.target!==void 0?{target:e.target}:{}}));case"body-chunk":{if(e.data.length>1048576)throw new Error(`tunnel-contract: body chunk of ${e.data.length} bytes exceeds MAX_CHUNK_BYTES`);return Wi(ct.bodyChunk,e.streamId,e.data)}case"body-end":return Wi(ct.bodyEnd,e.streamId,new Uint8Array(0));case"resp-head":return Wi(ct.respHead,e.streamId,rf({status:e.status,headers:e.headers}));case"open-ws":return Wi(ct.openWs,e.streamId,rf({path:e.path,headers:e.headers,protocols:e.protocols,...e.target!==void 0?{target:e.target}:{}}));case"ws-open-ack":return Wi(ct.wsOpenAck,e.streamId,rf({protocol:e.protocol}));case"ws-data":{let t=new Uint8Array(1+e.data.length);return t[0]=e.isBinary?1:0,t.set(e.data,1),Wi(ct.wsData,e.streamId,t)}case"close-stream":return Wi(ct.closeStream,e.streamId,rf({code:e.code,reason:e.reason}))}}function of(e,t){try{return JSON.parse(fJe.decode(e))}catch{throw new Error(`tunnel-contract: malformed ${t} frame payload`)}}function xce(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<5)throw new Error(`tunnel-contract: frame too short (${t.length} bytes)`);let n=t[0],r=new DataView(t.buffer,t.byteOffset).getUint32(1),o=t.subarray(5);switch(n){case ct.openHttp:{let s=of(o,"open-http");return{type:"open-http",streamId:r,method:s.method,path:s.path,headers:s.headers,hasBody:s.hasBody,...typeof s.target=="string"?{target:s.target}:{}}}case ct.bodyChunk:return{type:"body-chunk",streamId:r,data:o};case ct.bodyEnd:return{type:"body-end",streamId:r};case ct.respHead:{let s=of(o,"resp-head");return{type:"resp-head",streamId:r,...s}}case ct.openWs:{let s=of(o,"open-ws");return{type:"open-ws",streamId:r,path:s.path,headers:s.headers,protocols:s.protocols,...typeof s.target=="string"?{target:s.target}:{}}}case ct.wsOpenAck:{let s=of(o,"ws-open-ack");return{type:"ws-open-ack",streamId:r,protocol:s.protocol}}case ct.wsData:{if(o.length<1)throw new Error("tunnel-contract: ws-data frame missing binary flag");return{type:"ws-data",streamId:r,isBinary:o[0]===1,data:o.subarray(1)}}case ct.closeStream:{let s=of(o,"close-stream");return{type:"close-stream",streamId:r,...s}}default:throw new Error(`tunnel-contract: unknown frame type ${n}`)}}function*EB(e,t){for(let n=0;n<t.length;n+=1048576)yield{type:"body-chunk",streamId:e,data:t.subarray(n,Math.min(n+1048576,t.length))}}var wB,bce,ct,VUt,mJe,fJe,PB=g(()=>{"use strict";wB="bbt:hb",bce="bbt:hb-ack",ct={openHttp:1,bodyChunk:2,bodyEnd:3,respHead:4,openWs:5,wsOpenAck:6,wsData:7,closeStream:8},VUt=new Map([[ct.openHttp,"open-http"],[ct.bodyChunk,"body-chunk"],[ct.bodyEnd,"body-end"],[ct.respHead,"resp-head"],[ct.openWs,"open-ws"],[ct.wsOpenAck,"ws-open-ack"],[ct.wsData,"ws-data"],[ct.closeStream,"close-stream"]]),mJe=new TextEncoder,fJe=new TextDecoder});function hw(e,t){let n={};for(let[r,o]of e){let s=r.toLowerCase();hJe.has(s)||(n[r]=s==="origin"&&o===t.publicOrigin?t.loopbackOrigin:o)}return t.host!==void 0&&(n.Host=t.host),n}var hJe,TB=g(()=>{"use strict";hJe=new Set(["host","content-length","connection"])});function RB(e,t){let n=e.code,r;return n==="ECONNREFUSED"?r="connection refused":n==="ENOTFOUND"||n==="EAI_AGAIN"?r="host not found":n==="ETIMEDOUT"||/timed out|timeout|ETIMEDOUT/i.test(e.message)?r="timed out":n==="ECONNRESET"?r="connection reset":r=e.message,`can't reach ${t} \u2014 ${r}`}var wce=g(()=>{"use strict"});var sf,Ece=g(()=>{"use strict";sf=class{attempt=0;baseDelayMs;maxDelayMs;stableConnectionMs;random;constructor(t={}){this.baseDelayMs=t.baseDelayMs??1e3,this.maxDelayMs=t.maxDelayMs??3e4,this.stableConnectionMs=t.stableConnectionMs??1e4,this.random=t.random??Math.random}reset(){this.attempt=0}nextDelayAfterClose(t){this.attempt=t>this.stableConnectionMs?0:this.attempt+1;let n=Math.min(this.baseDelayMs*2**this.attempt,this.maxDelayMs);return Math.round(n*(.5+this.random()/2))}}});import{request as gJe}from"node:http";import{request as vJe}from"node:https";function TJe(e,t){return t===void 0?e:{...e,"Content-Length":String(t.byteLength)}}function RJe(e){let t=e.url.protocol==="https:"?vJe:gJe,n={headers:TJe(e.headers,e.body),method:e.method,signal:e.signal};return new Promise((r,o)=>{let s=t(e.url,n,r);s.once("error",o),s.end(e.body)})}function IJe(e){let t=[];for(let n=0;n<e.rawHeaders.length;n+=2){let r=e.rawHeaders[n],o=e.rawHeaders[n+1];r!==void 0&&o!==void 0&&t.push([r,o])}return t}function _Je(e){return PJe.test(e)?!new URL(e,"http://bb.local").searchParams.has("afterSequence"):!1}function gw(e){return Math.round(e*10)/10}function Ice(e,t){return t!==void 0?!1:e==="/ws"||e.startsWith("/ws?")||e.startsWith("/ws/")}var Rce,yJe,bJe,SJe,xJe,Pce,wJe,Tce,EJe,PJe,af,_ce=g(()=>{"use strict";Hp();PB();TB();Rce=2e4,yJe=6e4,bJe=Rce+5e3,SJe=1024*1024,xJe=10,Pce=1e3,wJe=1024,Tce="this port is not shared",EJe=new TextEncoder,PJe=/^\/api\/v1\/threads\/[^/]+\/(?:timeline|conversation-outline)(?:\?|$)/u;af=class{constructor(t){this.options=t}options;refusedOrigins=new Map;httpStreams=new Map;wsStreams=new Map;lastAck=Date.now();lastReceivedAckAt=null;lastHeartbeatTickAt=0;stallGraceSinceAck=!1;heartbeat;remoteClientCount=0;bytesReceived=0;bytesSent=0;lastReceivedAt=null;lastSentAt=null;lastRemoteActivityAt=null;get remoteClients(){return this.remoteClientCount}get lastHeartbeatAckAt(){return this.lastReceivedAckAt}snapshot(t){return{openHttpStreams:this.httpStreams.size,openWsStreams:this.wsStreams.size,bytesReceived:this.bytesReceived,bytesSent:this.bytesSent,lastReceivedAgeMs:this.lastReceivedAt===null?null:t-this.lastReceivedAt,lastSentAgeMs:this.lastSentAt===null?null:t-this.lastSentAt,bufferedBytes:this.options.tunnel.bufferedAmount}}start(){let{tunnel:t}=this.options,n=this.options.monotonicNow??(()=>performance.now());this.lastAck=Date.now(),this.lastReceivedAckAt=null,this.lastHeartbeatTickAt=n(),this.heartbeat=setInterval(()=>{let r=n(),o=r-this.lastHeartbeatTickAt;this.lastHeartbeatTickAt=r;let s=Date.now();if(o>bJe&&!this.stallGraceSinceAck)this.options.log.warn(`event loop stalled for ${Math.round(o/1e3)}s; restarting the tunnel heartbeat deadline`),this.lastAck=s,this.stallGraceSinceAck=!0;else if(s-this.lastAck>yJe){this.options.log.warn("tunnel heartbeat missed; reconnecting"),t.terminate();return}this.sendRaw(wB,Buffer.byteLength(wB))},Rce),t.on("message",(r,o)=>{if(this.bytesReceived+=r.byteLength,this.lastReceivedAt=Date.now(),!o){r.toString()===bce&&(this.lastAck=Date.now(),this.lastReceivedAckAt=this.lastAck,this.stallGraceSinceAck=!1);return}try{this.onFrame(xce(r))}catch(s){this.options.log.warn(`tunnel bad frame: ${String(s)}`)}}),t.on("close",()=>this.dispose())}dispose(){this.heartbeat&&clearInterval(this.heartbeat);for(let t of this.httpStreams.values())t.abort.abort();for(let t of this.wsStreams.values())t.socket.close(1001,"tunnel closed");this.refusedOrigins.clear(),this.httpStreams.clear(),this.wsStreams.clear(),this.setRemoteClients(0)}noteActivity(){let t=Date.now();this.lastRemoteActivityAt=t,this.options.onActivity?.(t)}setRemoteClients(t){let n=this.remoteClientCount;this.remoteClientCount=t,n===0!=(t===0)&&this.options.onRemoteClientsChange?.(t)}adjustRemoteClients(t){this.setRemoteClients(Math.max(0,this.remoteClientCount+t))}send(t){if(this.options.tunnel.readyState===eo.default.OPEN){let n=Sce(t);this.sendRaw(n,n.byteLength)}}async waitForSendBuffer(t){let{tunnel:n}=this.options;for(;!t.aborted&&n.readyState===eo.default.OPEN&&n.bufferedAmount>SJe;)await new Promise(r=>setTimeout(r,xJe))}sendRaw(t,n){this.options.tunnel.send(t),this.bytesSent+=n,this.lastSentAt=Date.now()}onFrame(t){switch(this.noteActivity(),t.type){case"open-http":{if(this.rejectRefusedOrigin(t.streamId,t.target))return;let n={meta:t,chunks:[],abort:new AbortController};this.httpStreams.set(t.streamId,n),t.hasBody||this.executeHttp(t.streamId,n);return}case"body-chunk":this.httpStreams.get(t.streamId)?.chunks.push(Buffer.from(t.data));return;case"body-end":{let n=this.httpStreams.get(t.streamId);n&&this.executeHttp(t.streamId,n);return}case"open-ws":this.openOriginWs(t);return;case"ws-data":{let n=this.wsStreams.get(t.streamId);if(!n)return;if(!n.open){n.buffered.push(t);return}n.socket.send(t.isBinary?t.data:Buffer.from(t.data).toString());return}case"close-stream":{let n=this.httpStreams.get(t.streamId);if(n){n.abort.abort(),this.httpStreams.delete(t.streamId);return}let r=this.wsStreams.get(t.streamId);r&&(r.socket.close(t.code,t.reason),this.forgetWsStream(t.streamId,r));return}case"resp-head":case"ws-open-ack":return}}forgetWsStream(t,n){this.wsStreams.delete(t)&&n.countsAsRemoteClient&&this.adjustRemoteClients(-1)}rejectUnregisteredHttp(t){let n=EJe.encode(Tce);this.send({type:"resp-head",streamId:t,status:404,headers:[["content-type","text/plain; charset=utf-8"]]});for(let r of EB(t,n))this.send(r);this.send({type:"body-end",streamId:t})}rejectRefusedOrigin(t,n){if(n===void 0)return!1;let r=this.options.resolveOrigin(n);if(r.kind!=="ok")return!1;let o=this.refusedOrigins.get(r.resolved.origin);if(!o)return!1;let s=this.options.monotonicNow?.()??performance.now();return s>=o.retryAt?(o.retryAt=s+Pce,!1):(this.send({type:"close-stream",streamId:t,code:1011,reason:o.reason}),!0)}recordOriginFailure(t,n,r){if(t===void 0||!(r instanceof Error)||!("code"in r)||r.code!=="ECONNREFUSED")return!1;if(!this.refusedOrigins.has(n)&&this.refusedOrigins.size>=wJe){let o=this.refusedOrigins.keys().next().value;o!==void 0&&this.refusedOrigins.delete(o)}return this.refusedOrigins.has(n)||this.options.log.warn(`exposed origin ${n} entered cooldown: ${String(r)}`),this.refusedOrigins.set(n,{retryAt:(this.options.monotonicNow?.()??performance.now())+Pce,reason:String(r)}),!0}async executeHttp(t,n){let{meta:r}=n,o=this.options.resolveOrigin(r.target);if(o.kind==="unregistered"){this.rejectUnregisteredHttp(t),this.httpStreams.delete(t);return}let{resolved:s}=o,a=hw(r.headers,{publicOrigin:s.publicOrigin,loopbackOrigin:new URL(s.origin).origin,...s.host!==void 0?{host:s.host}:{}});try{let c=performance.now(),l=r.hasBody?Buffer.concat(n.chunks):void 0,u=await RJe({url:new URL(`${s.origin.replace(/\/$/u,"")}${r.path}`),method:r.method,headers:a,body:l,signal:n.abort.signal});this.refusedOrigins.delete(s.origin);let d=performance.now()-c,p=IJe(u),m=_Je(r.path);m&&p.push(["server-timing",`bb_connect_origin;dur=${gw(d)}`]),this.send({type:"resp-head",streamId:t,status:u.statusCode??502,headers:p});let f=0;for await(let v of u){let b=v instanceof Uint8Array?v:Buffer.from(String(v));f+=b.byteLength;for(let S of EB(t,b))this.send(S);await this.waitForSendBuffer(n.abort.signal)}if(this.send({type:"body-end",streamId:t}),m){let v=performance.now()-c;this.options.log.info?.(["bb connect thread load",`path=${r.path}`,`status=${u.statusCode??502}`,`originTtfbMs=${gw(d)}`,`originBodyMs=${gw(v-d)}`,`totalMs=${gw(v)}`,`responseBytes=${f}`,`contentEncoding=${u.headers["content-encoding"]??"identity"}`].join(" "))}}catch(c){n.abort.signal.aborted||(this.recordOriginFailure(r.target,s.origin,c)||this.options.log.warn(`origin http error on ${r.method} ${new URL(r.path,"http://bb.local").pathname}: ${String(c)}`),this.send({type:"close-stream",streamId:t,code:1011,reason:String(c)}))}finally{this.httpStreams.delete(t)}}openOriginWs(t){if(this.rejectRefusedOrigin(t.streamId,t.target))return;let n=this.options.resolveOrigin(t.target);if(n.kind==="unregistered"){this.send({type:"close-stream",streamId:t.streamId,code:1008,reason:Tce});return}let{resolved:r}=n,o=r.origin.replace(/^http/,"ws"),s=hw(t.headers,{publicOrigin:r.publicOrigin,loopbackOrigin:new URL(r.origin).origin,...r.host!==void 0?{host:r.host}:{}}),a=Ice(t.path,t.target),c;try{c=new eo.default(`${o}${t.path}`,t.protocols,{headers:s})}catch(u){this.send({type:"close-stream",streamId:t.streamId,code:1011,reason:String(u)});return}let l={socket:c,buffered:[],open:!1,countsAsRemoteClient:a};this.wsStreams.set(t.streamId,l),a&&this.adjustRemoteClients(1),c.on("open",()=>{this.refusedOrigins.delete(r.origin),l.open=!0,this.send({type:"ws-open-ack",streamId:t.streamId,protocol:c.protocol||null});for(let u of l.buffered)this.onFrame(u);l.buffered=[]}),c.on("message",(u,d)=>{this.send({type:"ws-data",streamId:t.streamId,isBinary:d,data:d?new Uint8Array(u):new Uint8Array(Buffer.from(u.toString()))})}),c.on("close",(u,d)=>{this.wsStreams.has(t.streamId)&&(this.forgetWsStream(t.streamId,l),this.send({type:"close-stream",streamId:t.streamId,code:u===1e3||u>=3e3&&u<=4999?u:1e3,reason:d.toString()}))}),c.on("error",u=>{this.recordOriginFailure(t.target,r.origin,u)||this.options.log.warn(`origin ws error on ${t.path}: ${u.message}`)})}}});var kce=g(()=>{"use strict";TB();wce();Ece();_ce()});function Ta(e){return new URL(`https://${e}`).hostname.endsWith(".localhost")?"http:":"https:"}var Ace=g(()=>{"use strict"});var IB=g(()=>{"use strict";Ace()});function yw(e){let t=new URL(e),n=t.hostname.indexOf(".");if(n<=0||n===t.hostname.length-1)throw new Error(`cannot derive the bb connect gate base domain from enrollment server ${t.origin}`);let o=`${t.hostname.slice(n+1)}${t.port?`:${t.port}`:""}`;if(t.protocol!==Ta(o))throw new Error(`bb connect machine credentials require HTTPS, or HTTP for a local *.localhost enrollment server, got ${t.origin}`);return{apiOrigin:t.origin,baseDomain:o}}function DJe(e){return new URL(`https://${e}`).hostname.startsWith("next.")}function OJe(e){try{return DJe(yw(e).baseDomain)}catch{return!1}}function NJe(e){let t=Ta(e.baseDomain)==="https:"?"wss:":"ws:",n=new URL(`${t}//${e.label}.${e.baseDomain}/__tunnel`);return n.searchParams.set("v",String(1)),n.toString()}function LJe(e,t){return`${Ta(e.baseDomain)}//${e.label}--${t}.${e.baseDomain}`}var CJe,cf,MJe,vw,Cce=g(()=>{"use strict";Hp();PB();kce();wt();IB();CJe=1e4,cf=class extends Error{code="credential_rejected";constructor(t){super(t),this.name="ConnectTunnelCredentialRejectedError"}};MJe="this machine joined through a connect next address, which has no bb connect machine tunnel; its shared ports answer through connect next";vw=class{constructor(t){this.options=t;this.createWebSocket=t.createWebSocket??((n,r)=>new eo.default(n,{headers:r.headers})),this.fetchFn=t.fetchFn??fetch,this.backoff=new sf(t.reconnectBackoff),this.handshakeTimeoutMs=t.handshakeTimeoutMs??CJe,this.machineCredential=t.machineCredential?.trim().length===0?void 0:t.machineCredential,this.servedByNext=OJe(t.serverUrl)}options;createWebSocket;fetchFn;backoff;handshakeTimeoutMs;machineCredential;servedByNext;generation=-1;ports=new Set;identity;identityPromise;connectAttempt;connectionEpoch=0;socket;session;reconnectTimer;state="offline";lastError=null;credentialRejected=!1;stopped=!1;status(){return{state:this.state,lastError:this.servedByNext&&this.ports.size>0?MJe:this.lastError,credentialRejected:this.credentialRejected,generation:Math.max(this.generation,0),ports:[...this.ports].sort((t,n)=>t-n)}}replaceShareSet(t){return t.generation<=this.generation?!1:(this.applyShareSet(t),!0)}replaceAuthoritativeShareSet(t){this.applyShareSet(t),this.reportCurrentIdentity()}ensureTunnelIdentity(){if(this.identity)return Promise.resolve(this.identity);if(this.identityPromise)return this.identityPromise;let t=this.machineCredential;if(!t)return Promise.reject(new Error("this host has no trusted bb connect machine enrollment; remove and re-add it from Settings > Machines"));let n;try{n=yw(this.options.serverUrl)}catch(s){return Promise.reject(s)}if(this.credentialRejected)return Promise.reject(new cf("the bb connect gate rejected this machine credential; re-add the machine from Settings > Machines"));let r=new URL("/api/connect/machine-label",n.apiOrigin),o;return o=this.fetchFn(r,{method:"POST",headers:{"content-type":"application/json","x-bb-connect-machine":t},body:JSON.stringify({desiredName:this.options.hostName})}).then(async s=>{if(s.status===401||s.status===403){let l=new cf(`machine label assignment rejected: HTTP ${s.status}`);throw this.markCredentialRejected(l.message),l}if(!s.ok)throw new Error(`machine label assignment failed: HTTP ${s.status}`);let a=await s.json();if(typeof a!="object"||a===null||!("label"in a)||typeof a.label!="string")throw new Error("machine label assignment returned an invalid body");let c=Jp.parse({label:a.label,baseDomain:n.baseDomain});return this.identity=c,this.options.onIdentity?.(c),c}).finally(()=>{this.identityPromise===o&&(this.identityPromise=void 0)}),this.identityPromise=o,o}shutdown(){this.stopped=!0,this.goOffline()}applyShareSet(t){let n=this.ports;if(this.generation=t.generation,this.ports=new Set(t.ports),!this.hasConnectIntent()){this.goOffline();return}[...n].some(o=>!this.ports.has(o))&&this.stopCurrentConnection(),this.state="reconnecting",this.ensureConnected(),this.publish()}hasConnectIntent(){return!this.stopped&&!this.servedByNext&&this.ports.size>0&&this.machineCredential!==void 0&&!this.credentialRejected}ensureConnected(){if(!this.hasConnectIntent()||this.socket||this.reconnectTimer||this.connectAttempt)return;let t=this.connectionEpoch,n;n=this.ensureTunnelIdentity().then(r=>{t!==this.connectionEpoch||!this.hasConnectIntent()||this.openTunnel(r)}).catch(r=>{t!==this.connectionEpoch||!this.hasConnectIntent()||r instanceof cf||(this.lastError=r instanceof Error?r.message:String(r),this.state="reconnecting",this.options.logger.warn({err:r},this.lastError),this.scheduleReconnect(0),this.publish())}).finally(()=>{this.connectAttempt===n&&(this.connectAttempt=void 0),this.hasConnectIntent()&&!this.socket&&!this.reconnectTimer&&this.ensureConnected()}),this.connectAttempt=n}openTunnel(t){let n=this.machineCredential;if(!this.hasConnectIntent()||!n)return;let r=NJe(t);this.state="reconnecting",this.options.logger.info({label:t.label,ports:[...this.ports],tunnelUrl:r},"Machine tunnel connecting");let o;try{o=this.createWebSocket(r,{headers:{authorization:`Bearer ${n}`}})}catch(d){this.lastError=`cannot dial ${r}: ${d instanceof Error?d.message:String(d)}`,this.options.logger.warn({err:d,tunnelUrl:r},this.lastError),this.scheduleReconnect(0),this.publish();return}this.socket=o;let s=0,a,c,l=!1,u=setTimeout(()=>{this.socket!==o||s!==0||(l=!0,this.lastError=`machine tunnel handshake timed out after ${this.handshakeTimeoutMs}ms`,this.options.logger.warn({label:t.label,tunnelUrl:r},this.lastError),o.terminate())},this.handshakeTimeoutMs);u.unref?.(),o.on("open",()=>{if(clearTimeout(u),this.socket!==o||!this.hasConnectIntent()){o.terminate();return}s=Date.now(),this.state="connected",this.lastError=null,a=new af({tunnel:o,log:{warn:d=>this.options.logger.warn({label:t.label},d)},resolveOrigin:d=>this.resolveOrigin(d)}),this.session=a,a.start(),this.options.logger.info({label:t.label,ports:[...this.ports]},"Machine tunnel connected"),this.publish()}),o.on("unexpected-response",(d,p)=>{this.socket===o&&(c=p.statusCode??0,this.lastError=`machine tunnel rejected: HTTP ${c}`,this.options.logger.warn({label:t.label,statusCode:c},this.lastError),(c===401||c===403)&&(this.credentialRejected=!0),p.resume(),o.terminate(),this.publish())}),o.on("error",d=>{this.socket!==o||c!==void 0||l||(this.lastError=RB(d,`${t.label}.${t.baseDomain}`),this.publish())}),o.on("close",(d,p)=>{if(clearTimeout(u),a?.dispose(),this.session===a&&(this.session=void 0),this.socket===o){if(this.socket=void 0,!this.hasConnectIntent()){this.state="offline",this.backoff.reset(),this.publish();return}this.lastError===null&&(this.lastError=`machine tunnel closed (code ${d}${p.length>0?`, ${p.toString()}`:""})`),this.state="reconnecting",this.scheduleReconnect(s===0?0:Date.now()-s),this.publish()}}),this.publish()}scheduleReconnect(t){if(!this.hasConnectIntent()||this.reconnectTimer)return;let n=this.backoff.nextDelayAfterClose(t);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.ensureConnected()},n),this.reconnectTimer.unref?.()}resolveOrigin(t){if(t===void 0)return{kind:"unregistered"};let n=Number(t),r=this.identity;return!Number.isInteger(n)||!this.ports.has(n)||!r?{kind:"unregistered"}:{kind:"ok",resolved:{origin:`http://127.0.0.1:${n}`,publicOrigin:LJe(r,n),host:`127.0.0.1:${n}`}}}markCredentialRejected(t){this.credentialRejected=!0,this.lastError=t,this.state="offline",this.stopCurrentConnection(),this.backoff.reset(),this.publish()}reportCurrentIdentity(){this.identity&&this.options.onIdentity?.(this.identity)}goOffline(){this.stopCurrentConnection(),this.state="offline",this.lastError=null,this.backoff.reset(),this.publish()}stopCurrentConnection(){this.connectionEpoch+=1,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.session?.dispose(),this.session=void 0;let t=this.socket;this.socket=void 0,t?.terminate()}publish(){this.options.onStatusChange?.(this.status())}}});import{gunzipSync as BJe,inflateRawSync as FJe}from"node:zlib";function bw(e,t,n){let r=e.subarray(t,t+n),o=r.indexOf(0);return r.subarray(0,o===-1?r.length:o).toString("utf8")}function $Je(e){let t=bw(e,124,12).trim(),n=Number.parseInt(t===""?"0":t,8);if(!Number.isFinite(n)||n<0)throw new po("the tar archive has a corrupt entry size");return n}function jJe(e,t){let n=0,r=null;for(;n+lf<=e.length;){let o=e.subarray(n,n+lf);if(o.every(m=>m===0))return null;let s=$Je(o),a=String.fromCharCode(o[156]??0),c=n+lf,l=c+s;if(l>e.length)throw new po("the tar archive is truncated");if(n=c+Math.ceil(s/lf)*lf,a==="L"){r=bw(e,c,s);continue}let u=bw(o,345,155),d=bw(o,0,100),p=r??(u===""?d:`${u}/${d}`);if(r=null,(a==="0"||a==="\0")&&p===t)return Buffer.from(e.subarray(c,l))}return null}function WJe(e){let t=Math.max(0,e.length-22-65535);for(let n=e.length-22;n>=t;n-=1)if(e.readUInt32LE(n)===HJe)return n;throw new po("the zip archive has no central directory")}function qJe(e,t){let n=WJe(e),r=e.readUInt16LE(n+10),o=e.readUInt32LE(n+16);for(let s=0;s<r;s+=1){if(e.readUInt32LE(o)!==UJe)throw new po("the zip archive has a corrupt central directory");let a=e.readUInt16LE(o+10),c=e.readUInt32LE(o+20),l=e.readUInt32LE(o+24),u=e.readUInt16LE(o+28),d=e.readUInt16LE(o+30),p=e.readUInt16LE(o+32),m=e.readUInt32LE(o+42),f=e.subarray(o+46,o+46+u).toString("utf8");if(o+=46+u+d+p,f!==t)continue;if(e.readUInt32LE(m)!==zJe)throw new po("the zip archive has a corrupt local header");let v=m+30+e.readUInt16LE(m+26)+e.readUInt16LE(m+28),b=e.subarray(v,v+c),S=a===0?Buffer.from(b):a===8?FJe(b):null;if(S===null)throw new po(`the zip archive uses compression ${a}`);if(S.length!==l)throw new po("the zip archive member has the wrong size");return S}return null}function Dce(e,t,n){let r=Buffer.from(e),o=t==="tar.gz"?jJe(BJe(r),n):qJe(r,n);if(o===null)throw new po(`the archive has no ${n}`);return o}var po,lf,HJe,UJe,zJe,_B=g(()=>{"use strict";po=class extends Error{constructor(t){super(t),this.name="ArchiveError"}},lf=512;HJe=101010256,UJe=33639248,zJe=67324752});var Oce,mo,Mce,wzt,Ezt,Sw=g(()=>{"use strict";Oce="credential",mo="0.71.0",Mce="bb connect refused this server credential",wzt=new TextEncoder,Ezt=new TextDecoder});import{createHash as GJe,randomUUID as VJe}from"node:crypto";import*as vr from"node:fs/promises";import kB from"node:path";function XJe(e,t,n="frpc"){let r=JJe[e],o=YJe[t];if(r===void 0||o===void 0)throw new Ra(`frp has no client for ${e}/${t}`);let s=r==="windows"?"zip":"tar.gz",a=`frp_${mo}_${r}_${o}`,c=`${a}.${s}`,l=ZJe[c];if(l===void 0)throw new Ra(`no pinned checksum for ${c}`);let u=r==="windows"?`${n}.exe`:n;return{fileName:c,url:`${KJe}/v${mo}/${c}`,sha256:l,format:s,member:`${a}/${u}`,binaryName:u}}function QJe(e){return GJe("sha256").update(e).digest("hex")}function e9e(e,t){let n=QJe(t);if(n!==e.sha256)throw new Ra(`${e.fileName} does not match its pinned sha256 (got ${n}), so bb will not run it`)}async function Lce(e){try{return await vr.access(e),!0}catch{return!1}}async function n9e(e){let t=XJe(e.platform,e.arch,e.tool),n=kB.join(e.dir,t.binaryName);if(await Lce(n))return n;let r=await(e.download??t9e)(t.url);e9e(t,r);let o=Dce(r,t.format,t.member);await vr.mkdir(e.dir,{recursive:!0,mode:448});let s=kB.join(e.dir,`.${t.binaryName}.${VJe()}`);try{await vr.writeFile(s,o,{mode:493}),await vr.chmod(s,493),await vr.rename(s,n)}finally{await vr.rm(s,{force:!0})}return n}function r9e(e){return kB.join(e,"frp",mo)}async function Bce(e){let t=e.env[Nce];if(t!==void 0&&t!==""){if(!await Lce(t))throw new Ra(`${Nce} names ${t}, which does not exist`);return t}return n9e({dir:r9e(e.dataDir),platform:e.platform??process.platform,arch:e.arch??process.arch,tool:"frpc",...e.download===void 0?{}:{download:e.download}})}var KJe,ZJe,JJe,YJe,Ra,t9e,Nce,Fce=g(()=>{"use strict";Sw();_B();KJe="https://github.com/fatedier/frp/releases/download",ZJe={[`frp_${mo}_linux_amd64.tar.gz`]:"84f27e39f11169f7adcef8e8b70c9329de17747b1f14dad9fb95eef5682ea716",[`frp_${mo}_linux_arm64.tar.gz`]:"f33c293c275d8fc68c654b6fba8f10b2551d6463d09a9fc9cffb7227eae82266",[`frp_${mo}_darwin_amd64.tar.gz`]:"1b1b4e2f1836e21e8733f1dddaacd4ed9ae67d7dbee39046b9d7b7eda6253637",[`frp_${mo}_darwin_arm64.tar.gz`]:"45be02b186860d375ed49a8941ae9569628a54bf14e67fc36b29c98c99dabcc6",[`frp_${mo}_windows_amd64.zip`]:"9e5062e3e5cf07e67144a3a4acf175ef6a2486f3605dd6cf288bae34ab39819f",[`frp_${mo}_windows_arm64.zip`]:"b56a5c2a1a2a55d11bc27aeef6edabd39f3d194360ea66660cc27281b502cb1c"},JJe={linux:"linux",darwin:"darwin",win32:"windows"},YJe={x64:"amd64",arm64:"arm64"},Ra=class extends Error{httpStatus;constructor(t,n){super(t),this.name="FrpBinaryError",this.httpStatus=n}};t9e=async e=>{let t=await fetch(e,{signal:AbortSignal.timeout(12e4)});if(!t.ok)throw new Ra(`downloading ${e} answered HTTP ${t.status}`,t.status);return new Uint8Array(await t.arrayBuffer())};Nce="BB_CONNECT_FRPC"});import{randomBytes as $ce}from"node:crypto";import*as qi from"node:fs/promises";import o9e from"node:net";import i9e from"node:path";import{rootCertificates as s9e}from"node:tls";async function a9e(){return new Promise((e,t)=>{let n=o9e.createServer();n.once("error",t),n.listen(0,"127.0.0.1",()=>{let r=n.address();if(r===null||typeof r=="string"){n.close(),t(new Error("could not pick a loopback port"));return}n.close(()=>e(r.port))})})}async function jce(){return{port:await a9e(),user:`bb-${$ce(6).toString("hex")}`,password:$ce(24).toString("base64url")}}function Hce(e){return{serverAddr:e.server.host,serverPort:e.server.port,user:e.user,loginFailExit:!1,metadatas:{[Oce]:e.credential},log:{to:"console",level:"info",disablePrintColor:!0},...e.admin===null?{}:{webServer:{addr:"127.0.0.1",port:e.admin.port,user:e.admin.user,password:e.admin.password}},transport:{protocol:e.server.protocol,poolCount:c9e,...e.server.protocol==="wss"?{tls:{enable:!0,serverName:e.server.host,...e.trustedCaFile===null?{}:{trustedCaFile:e.trustedCaFile}}}:{}},proxies:e.proxies.map(t=>({name:t.name,type:"http",localIP:t.localIP,localPort:t.localPort,subdomain:t.subdomain,...t.hostHeaderRewrite===null?{}:{hostHeaderRewrite:t.hostHeaderRewrite}}))}}async function Uce(e,t){await qi.mkdir(i9e.dirname(e),{recursive:!0,mode:448}),await qi.writeFile(e,t,{mode:384}),await qi.chmod(e,384)}async function zce(e,t){await Uce(e,`${JSON.stringify(t,null,2)}
260
260
  `)}async function Wce(e){let t=e.NODE_EXTRA_CA_CERTS,n=[...s9e];return t!==void 0&&t!==""&&n.push(await qi.readFile(t,"utf8")),n}async function qce(e,t){await Uce(e,`${t.join(`
261
261
  `)}
262
262
  `)}var c9e,AB=g(()=>{"use strict";Sw();c9e=10});function Gce(e,t){let n=e.replace(l9e,"").trimEnd();for(let r of t)r.length>0&&(n=n.split(r).join("[redacted]"));return n}function Vce(e){let t=e.replace(u9e,"");if(/^try to (?:re)?connect to server/u.test(t))return{kind:"connecting"};if(/^login to server success/u.test(t))return{kind:"logged-in"};let n=d9e.exec(t);if(n!==null)return{kind:"proxy-started",proxy:n[1]??""};let r=p9e.exec(t);if(r!==null)return{kind:"proxy-refused",proxy:r[1]??"",reason:r[2]??""};let o=m9e.exec(t);if(o!==null)return{kind:"proxy-removed",proxy:o[1]??""};let s=f9e.exec(t);if(s!==null){let a=s[1]??"";return a===Mce?{kind:"refused",reason:a}:{kind:"offline",reason:a}}return null}var l9e,u9e,d9e,p9e,m9e,f9e,CB=g(()=>{"use strict";Sw();l9e=/\u001b\[[0-9;]*m/gu,u9e=/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(?:\.\d+)? \[[A-Z]\] \[[^\]]+\] (?:\[[0-9a-f]+\] )?/u,d9e=/^\[([^\]]+)\] start proxy success/u,p9e=/^\[([^\]]+)\] start error: (.*)$/u,m9e=/^proxy removed: \[([^\]]+)\]/u,f9e=/^(?:connect to server error|login to the server failed|reconnect to server error): (.*)$/u});import{spawn as h9e}from"node:child_process";import DB from"node:path";import{createInterface as g9e}from"node:readline";function Kce(e){return e instanceof Error?e.message:String(e)}function Zce(e,t){return e.exitCode!==null||e.signalCode!==null?Promise.resolve(!0):new Promise(n=>{let r=setTimeout(()=>{e.off("exit",o),n(!1)},t),o=()=>{clearTimeout(r),n(!0)};e.once("exit",o)})}function b9e(e,t){return e.name===t.name&&e.subdomain===t.subdomain&&e.localIP===t.localIP&&e.localPort===t.localPort&&e.hostHeaderRewrite===t.hostHeaderRewrite}function Jce(e,t){let n=new Map(e.map(c=>[c.name,c])),r=new Map(t.map(c=>[c.name,c])),o=[],s=[];for(let c of t){let l=n.get(c.name);l===void 0?o.push(c):b9e(l,c)||s.push(c)}let a=e.filter(c=>!r.has(c.name));return{added:o,removed:a,changed:s}}var v9e,y9e,xw,Yce=g(()=>{"use strict";AB();CB();v9e={restartMinMs:1e3,restartMaxMs:3e4,stableMs:1e4,refusedRetryMs:5*6e4,stopGraceMs:3e3,reloadTimeoutMs:5e3},y9e=async(e,t)=>{let n=Buffer.from(`${e.user}:${e.password}`).toString("base64"),r=await fetch(`http://127.0.0.1:${e.port}/api/reload`,{headers:{authorization:`Basic ${n}`},signal:AbortSignal.timeout(t)});if(!r.ok){let o=(await r.text()).slice(0,500);throw new Error(`frpc reload answered HTTP ${r.status} ${o}`)}};xw=class{constructor(t){this.options=t;this.timing={...v9e,...t.timing},this.requestReload=t.requestReload??y9e}options;timing;requestReload;active=!1;running=null;timer;attempts=0;state="idle";lastError=null;nextRetryAt=null;since=Date.now();proxies=[];proxyStates=new Map;lastPublished="";reloads=Promise.resolve();launches=0;start(){this.active||(this.active=!0,this.attempts=0,this.setState("connecting",null),this.launch(this.launches))}async stop(){this.active=!1,this.launches+=1,clearTimeout(this.timer),this.timer=void 0,this.nextRetryAt=null;let t=this.running;this.running=null,t!==null&&await this.killChild(t.child),await this.reloads;for(let n of this.proxyStates.values())n.state="pending",n.error=null;this.setState("idle",null)}childPid(){return this.running?.child.pid??null}status(){return{state:this.state,lastError:this.lastError,nextRetryAt:this.nextRetryAt,since:this.since,proxies:this.proxies.map(t=>{let n=this.proxyStates.get(t.name);return{name:t.name,subdomain:t.subdomain,localPort:t.localPort,state:n?.state??"pending",error:n?.error??null}})}}proxiesChanged(){let t=[...this.options.proxies()],n=Jce(this.proxies,t);return n.added.length===0&&n.removed.length===0&&n.changed.length===0?this.reloads:(this.adoptProxies(t),this.publish(),this.reloads=this.reloads.then(()=>this.reload()),this.reloads)}idle(){return this.reloads}adoptProxies(t){let n=Jce(this.proxies,t);for(let r of n.removed)this.proxyStates.delete(r.name);for(let r of[...n.added,...n.changed])this.proxyStates.set(r.name,{state:"pending",error:null});this.proxies=t}async reload(){let t=this.running;if(!(t===null||t.restartNow))try{if(t.written=this.proxies,await this.writeConfig(t),this.running!==t)return;await this.requestReload(t.admin,this.timing.reloadTimeoutMs)}catch(n){if(this.running!==t)return;this.options.log.warn(`frpc did not reload its proxies (${Kce(n)}); restarting it`),t.restartNow=!0,await this.killChild(t.child)}}configFor(t,n){return Hce({server:t.launch.server,user:t.launch.user,credential:t.launch.credential,proxies:n,trustedCaFile:t.launch.server.protocol==="wss"?DB.join(this.options.frpDir,"roots.pem"):null,admin:t.admin})}async writeConfig(t){await zce(t.configFile,this.configFor(t,t.written))}current(t){return this.active&&t===this.launches}async launch(t){try{let n=await this.options.prepare();if(!this.current(t))return;if(n.kind==="halt"){this.setState("halted",n.reason);return}this.adoptProxies([...this.options.proxies()]);let r=await this.options.resolveBinary();if(!this.current(t))return;let o=n.server.protocol==="wss"?DB.join(this.options.frpDir,"roots.pem"):null;o!==null&&await qce(o,await this.options.trustedCertificates());let s=await jce(),a=DB.join(this.options.frpDir,"frpc.json"),c={launch:n,admin:s,configFile:a,written:this.proxies};if(await this.writeConfig(c),!this.current(t))return;this.spawnChild(t,r,c)}catch(n){if(!this.current(t))return;let r=Kce(n);this.options.log.warn(`frpc could not start: ${r}`),this.setState("error",r),this.scheduleRelaunch(this.backoff())}}spawnChild(t,n,r){let o=h9e(n,["-c",r.configFile],{stdio:["ignore","pipe","pipe"],windowsHide:!0}),s={...r,child:o,startedAt:Date.now(),restartNow:!1};this.running=s;for(let c of this.proxyStates.values())c.state="pending",c.error=null;this.setState("connecting",this.lastError);let a=[r.launch.credential,r.admin.password];for(let c of[o.stdout,o.stderr])c!==null&&g9e({input:c}).on("line",l=>{this.onLine(t,s,Gce(l,a))});o.once("error",c=>{this.onChildEnd(t,s,`frpc failed: ${c.message}`)}),o.once("exit",(c,l)=>{this.onChildEnd(t,s,`frpc exited (${l===null?`code ${c}`:l})`)}),s.written!==this.proxies&&(this.reloads=this.reloads.then(()=>this.reload()))}onLine(t,n,r){if(r===""||(this.options.log.info(`frpc: ${r}`),!this.current(t)||this.running!==n))return;let o=Vce(r);if(o===null)return;let s=this.options.primaryProxy;switch(o.kind){case"connecting":for(let a of this.proxyStates.values())a.state==="active"&&(a.state="pending");this.state==="connected"?this.setState("connecting",null):this.publish();return;case"logged-in":s===null&&(this.attempts=0,this.setState("connected",null));return;case"proxy-started":{let a=this.proxyStates.get(o.proxy);a!==void 0&&(a.state="active",a.error=null),o.proxy===s?(this.attempts=0,this.setState("connected",null)):this.publish();return}case"proxy-refused":{if(o.proxy===s){this.onRefused(n,o.reason);return}let a=this.proxyStates.get(o.proxy);a!==void 0&&(a.state="refused",a.error=o.reason),this.publish();return}case"proxy-removed":return;case"offline":for(let a of this.proxyStates.values())a.state==="active"&&(a.state="pending");this.setState("offline",o.reason);return;case"refused":this.onRefused(n,o.reason);return}}onRefused(t,n){this.running=null,this.setState("refused",n),this.killChild(t.child),this.scheduleRelaunch(this.timing.refusedRetryMs)}onChildEnd(t,n,r){if(!(!this.current(t)||this.running!==n)){if(this.running=null,n.restartNow){this.setState("connecting",null),this.launch(t);return}Date.now()-n.startedAt>this.timing.stableMs&&(this.attempts=0),this.options.log.warn(r),this.setState("connecting",r),this.scheduleRelaunch(this.backoff())}}scheduleRelaunch(t){let n=this.launches;clearTimeout(this.timer),this.nextRetryAt=Date.now()+t,this.publish(),this.timer=setTimeout(()=>{this.current(n)&&(this.nextRetryAt=null,this.launch(n))},t),this.timer.unref?.()}backoff(){let t=Math.min(this.timing.restartMinMs*2**this.attempts,this.timing.restartMaxMs);return this.attempts+=1,t}async killChild(t){t.exitCode!==null||t.signalCode!==null||(t.kill("SIGTERM"),!await Zce(t,this.timing.stopGraceMs)&&(t.kill("SIGKILL"),await Zce(t,this.timing.stopGraceMs)))}setState(t,n){t!==this.state&&(this.since=Date.now()),this.state=t,this.lastError=n,this.publish()}publish(){let t=this.status(),n=JSON.stringify({...t,since:0});n!==this.lastPublished&&(this.lastPublished=n,this.options.onStatusChange?.(t))}}});var OB=g(()=>{"use strict";_B();Fce();AB();CB();Yce()});import S9e from"node:path";function Xce(e){return new URL(`https://${e}`).hostname}function T9e(e,t){return t.map(n=>({name:`${x9e}${n}`,subdomain:`${e}--${n}`,localIP:"127.0.0.1",localPort:n,hostHeaderRewrite:`127.0.0.1:${n}`}))}function R9e(e,t){if(e===null)return"this machine has no trusted bb connect enrollment, so it cannot use connect next";let n,r;try{n=Xce(e),r=Xce(t.domain)}catch{return`the connect next domain ${t.domain} is not a host name`}return r!==n&&r!==`next.${n}`?`the connect next domain ${t.domain} is not next.${n}, the domain this machine enrolled with`:t.server.host!==`tunnel.${r}`?`the connect next tunnel server ${t.server.host} is not tunnel.${r}`:t.server.protocol!=="wss"&&Ta(e)==="https:"?"connect next must dial its tunnel server over wss":null}function MB(e){return S9e.join(e,"connect-next","frp")}var x9e,w9e,E9e,P9e,ww,Qce=g(()=>{"use strict";OB();IB();x9e="share-",w9e=1e3,E9e=3e4,P9e={idle:"connecting",connecting:"connecting",connected:"connected",refused:"refused",offline:"offline",error:"error",halted:"error"};ww=class{constructor(t){this.options=t;this.machineCredential=t.machineCredential?.trim().length===0?void 0:t.machineCredential}options;generation=-1;config=null;ports=[];label=null;session=null;stopped=!1;work=Promise.resolve();idleSince=Date.now();lastPublished="";sessionLossTimer;machineCredential;replace(t){return t.generation<=this.generation?!1:(this.apply(t),!0)}replaceAuthoritative(t){this.apply(t)}sessionLost(){this.sessionLossTimer!==void 0||this.config===null||(this.sessionLossTimer=setTimeout(()=>{this.sessionLossTimer=void 0,this.options.logger.info({},"Machine next tunnel stopping: no server session to confirm it"),this.config=null,this.reconcile()},this.options.sessionLossGraceMs??E9e),this.sessionLossTimer.unref?.())}sessionRestored(){clearTimeout(this.sessionLossTimer),this.sessionLossTimer=void 0}setPorts(t){let n=[...new Set(t)].sort((s,a)=>s-a);if(n.length===this.ports.length&&n.every((s,a)=>s===this.ports[a]))return this.work;let r=this.ports.length===0;this.ports=n;let o=this.session;if(o!==null&&!r&&n.length>0){let s=o.supervisor.proxiesChanged();return this.publish(),s}return this.reconcile()}status(){let t=this.session?.supervisor.status()??null;return{state:t===null?"idle":P9e[t.state],label:this.label,lastError:this.idleReason()??t?.lastError??null,nextRetryAt:t?.nextRetryAt??null,since:t?.since??this.idleSince,shares:t?.proxies.map(n=>({port:n.localPort,state:n.state,error:n.error}))??[]}}childPid(){return this.session?.supervisor.childPid()??null}idle(){return this.work}shutdown(){return this.sessionRestored(),this.stopped=!0,this.reconcile()}idleReason(){return this.session!==null||this.config===null?null:this.machineCredential===void 0?"this machine has no bb connect machine credential":null}apply(t){this.generation=t.generation;let n=JSON.stringify(t.config)!==JSON.stringify(this.config);this.config=t.config,n&&this.reconcile()}wanted(){return this.stopped||this.config===null||this.ports.length===0||this.machineCredential===void 0?null:this.config}reconcile(){return this.work=this.work.then(async()=>{let t=this.wanted(),n=this.session;if(n!==null&&t!==null&&JSON.stringify(n.config)===JSON.stringify(t)){await n.supervisor.proxiesChanged(),this.publish();return}n!==null&&(t===null&&!this.stopped&&this.ports.length===0&&JSON.stringify(n.config)===JSON.stringify(this.config)&&await this.closeLastShare(n),this.session=null,this.idleSince=Date.now(),await n.supervisor.stop(),this.options.logger.info({label:this.label},"Machine next tunnel stopped")),t!==null&&this.startSession(t),this.publish()}),this.work}async closeLastShare(t){await t.supervisor.proxiesChanged();let n=this.options.lastShareLingerMs??w9e;n>0&&await new Promise(r=>setTimeout(r,n))}startSession(t){let n={frpDir:this.options.frpDir,primaryProxy:null,resolveBinary:()=>this.options.resolveBinary(),trustedCertificates:()=>this.options.trustedCertificates(),prepare:()=>this.prepare(t),proxies:()=>this.label===null?[]:T9e(this.label,this.ports),log:{info:s=>this.options.logger.debug({},s),warn:s=>this.options.logger.warn({},`connect next: ${s}`)},onStatusChange:()=>{this.session===o&&this.publish()},...this.options.timing===void 0?{}:{timing:this.options.timing}},r=this.options.createSupervisor?.(n)??new xw(n),o={config:t,supervisor:r};this.session=o,this.options.logger.info({domain:t.domain,ports:this.ports},"Machine next tunnel starting"),r.start()}async prepare(t){let n=this.machineCredential;if(n===void 0)return{kind:"halt",reason:"this machine has no bb connect machine credential"};let r=R9e(this.options.trustedBaseDomain(),t);if(r!==null)return{kind:"halt",reason:r};let o=await this.options.ensureIdentity();return this.label!==o.label&&(this.label=o.label,this.publish()),{kind:"launch",server:t.server,user:o.label,credential:n}}publish(){let t=this.status(),n=JSON.stringify({...t,since:0});n!==this.lastPublished&&(this.lastPublished=n,this.options.onStatusChange?.(t))}}});function I9e(e,t){if(!e)throw new Error(t)}function _9e(e){return new e.constructor(e.type,e)}function k9e(e){return"data"in e?new MessageEvent(e.type,e):"code"in e||"reason"in e?new nle(e.code||1999,e.reason||"unknown reason",e):"error"in e?new tle(e.error,e):new Event(e.type,e)}function D9e(){}var tle,nle,NB,A9e,C9e,Ew,Ia,ele,rle,ole=g(()=>{(!globalThis.EventTarget||!globalThis.Event)&&console.error(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@halcyonlabs/app",
3
- "version": "0.47.0-halcyon.352",
3
+ "version": "0.47.0-halcyon.353",
4
4
  "description": "bb app launcher for npx",
5
5
  "keywords": [
6
6
  "bb",
@@ -105,7 +105,7 @@
105
105
  "node": "^22.19.0 || ^24.0.0 || ^26.0.0"
106
106
  },
107
107
  "moonletRelease": {
108
- "summary": "Detect silent schedule failures (#361)"
108
+ "summary": "Allow owner-approved GitHub repository reads with writes refused (#360)"
109
109
  },
110
110
  "license": "SEE LICENSE IN LICENSE"
111
111
  }