@cerebriline/core 4.100.251 → 4.100.252

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.
@@ -1,21 +1,21 @@
1
- import{execFile as Z2}from"node:child_process";import{basename as C4,resolve as X2}from"node:path";import{promisify as Q2}from"node:util";import{processWorkspaceInfo as E4}from"@cerebriline/shared";import t0 from"simple-git";var j2=Q2(Z2);function V2($,J){return j2("git",$,{cwd:J.cwd,encoding:"utf8",windowsHide:!0,signal:J.signal,timeout:15000,maxBuffer:10485760,env:{...process.env,GIT_TERMINAL_PROMPT:"0",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||"ssh -o BatchMode=yes"}})}function t($){if(!$||typeof $!=="object"||!("stderr"in $))return"";return typeof $.stderr==="string"?$.stderr.trim():""}function r($){if(!$||typeof $!=="object"||!("code"in $))return;return typeof $.code==="number"?$.code:void 0}function r0($){let J=s0($.cwd),Z=$.git??V2,X=async(j)=>(await Z(j,{cwd:J,signal:$.signal})).stdout,Q=async(j)=>(await X(j)).trim();return{async isInsideWorkTree(){try{return await Q(["rev-parse","--is-inside-work-tree"])==="true"}catch(j){if(r(j)===128&&/not a git repository|Kein Git-Repository/i.test(t(j)))return!1;throw j}},remotes:()=>t0({baseDir:J}).getRemotes(!0),displayBranch:async()=>(await t0({baseDir:J}).branch()).current.trim(),symbolicBranch:()=>Q(["symbolic-ref","--quiet","--short","HEAD"]),headSha:()=>Q(["rev-parse","HEAD"]),workspacePrefix:async()=>(await X(["rev-parse","--show-prefix"])).replace(/[\r\n]+$/,""),worktreeStatus:()=>Q(["status","--porcelain=v1","--untracked-files=all","--ignore-submodules=none"]),branchRemote:(j)=>Q(["config","--get",`branch.${j}.remote`]),branchMergeRef:(j)=>Q(["config","--get",`branch.${j}.merge`]),remoteUrl:(j)=>Q(["remote","get-url",j]),remoteRefs:(j,V)=>Q(["ls-remote","--exit-code",j,V])}}function s0($){return X2($)}class C extends Error{code;constructor($,J,Z){super(J,Z);this.code=$;this.name="CloudHandoffGitPreflightError"}}function n0($){let J=0,Z=$.length;while(J<Z&&$[J]==="/")J+=1;while(Z>J&&$[Z-1]==="/")Z-=1;let X=$.slice(J,Z);return X.toLowerCase().endsWith(".git")?X.slice(0,-4):X}function o0($){let J=$.trim();if(!J)return null;let Z=J.match(/^(?:[^@/\s]+@)?github\.com:([^\s]+)$/i);if(Z?.[1]){let X=n0(Z[1]);return X.split("/").length===2?`https://github.com/${X}`:null}try{let X=new URL(J);if(X.hostname.toLowerCase()!=="github.com")return null;if(!new Set(["https:","http:","ssh:","git:"]).has(X.protocol))return null;let Q=n0(X.pathname);return Q.split("/").length===2?`https://github.com/${Q}`:null}catch{return null}}async function y($,J,Z){try{return await $()}catch(X){let Q=t(X);throw new C(J,Q?`${Z} (${Q})`:Z,{cause:X})}}function Y2($,J){let Z=`refs/heads/${J}`;for(let X of $.split(`
2
- `)){let[Q,j]=X.trim().split(/\s+/,2);if(j===Z&&/^[0-9a-f]{40,64}$/i.test(Q??""))return Q??null}return null}function W2($){let J=$.replace(/[\r\n]+$/,"").replace(/\/+$/,"");if(!J)return;let Z=J.split("/");if(J.startsWith("/")||Z.some((X)=>!X||X==="."||X===".."))throw new C("git_command_failed","Could not resolve the workspace path relative to the Git repository.");return J}async function b4($){let J=r0($);if(!await y(J.isInsideWorkTree,"not_git_repository","Cloud handoff requires a Git repository."))throw new C("not_git_repository","Cloud handoff requires a Git working tree.");let X=W2(await y(J.workspacePrefix,"git_command_failed","Could not resolve the workspace path relative to the Git repository.")),Q=await y(J.worktreeStatus,"git_command_failed","Could not inspect the Git worktree.");if(Q){let K=Q.split(`
3
- `).filter(Boolean),_=K.slice(0,5).join(`
4
- `),O=K.length>5?`
5
- ...and ${K.length-5} more`:"";throw new C("dirty_worktree",`Commit and push local changes before handing off to cloud. Uncommitted files are not transferred.
1
+ import{execFile as sn}from"node:child_process";import{basename as To,resolve as on}from"node:path";import{promisify as rn}from"node:util";import{processWorkspaceInfo as Ho}from"@cerebriline/shared";import Ke from"simple-git";var an=rn(sn);function dn(e,t){return an("git",e,{cwd:t.cwd,encoding:"utf8",windowsHide:!0,signal:t.signal,timeout:15000,maxBuffer:10485760,env:{...process.env,GIT_TERMINAL_PROMPT:"0",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||"ssh -o BatchMode=yes"}})}function K(e){if(!e||typeof e!=="object"||!("stderr"in e))return"";return typeof e.stderr==="string"?e.stderr.trim():""}function Q(e){if(!e||typeof e!=="object"||!("code"in e))return;return typeof e.code==="number"?e.code:void 0}function Qe(e){let t=Ye(e.cwd),n=e.git??dn,s=async(i)=>(await n(i,{cwd:t,signal:e.signal})).stdout,o=async(i)=>(await s(i)).trim();return{async isInsideWorkTree(){try{return await o(["rev-parse","--is-inside-work-tree"])==="true"}catch(i){if(Q(i)===128&&/not a git repository|Kein Git-Repository/i.test(K(i)))return!1;throw i}},remotes:()=>Ke({baseDir:t}).getRemotes(!0),displayBranch:async()=>(await Ke({baseDir:t}).branch()).current.trim(),symbolicBranch:()=>o(["symbolic-ref","--quiet","--short","HEAD"]),headSha:()=>o(["rev-parse","HEAD"]),workspacePrefix:async()=>(await s(["rev-parse","--show-prefix"])).replace(/[\r\n]+$/,""),worktreeStatus:()=>o(["status","--porcelain=v1","--untracked-files=all","--ignore-submodules=none"]),branchRemote:(i)=>o(["config","--get",`branch.${i}.remote`]),branchMergeRef:(i)=>o(["config","--get",`branch.${i}.merge`]),remoteUrl:(i)=>o(["remote","get-url",i]),remoteRefs:(i,r)=>o(["ls-remote","--exit-code",i,r])}}function Ye(e){return on(e)}class _ extends Error{code;constructor(e,t,n){super(t,n);this.code=e;this.name="CloudHandoffGitPreflightError"}}function Xe(e){let t=0,n=e.length;while(t<n&&e[t]==="/")t+=1;while(n>t&&e[n-1]==="/")n-=1;let s=e.slice(t,n);return s.toLowerCase().endsWith(".git")?s.slice(0,-4):s}function Ze(e){let t=e.trim();if(!t)return null;let n=t.match(/^(?:[^@/\s]+@)?github\.com:([^\s]+)$/i);if(n?.[1]){let s=Xe(n[1]);return s.split("/").length===2?`https://github.com/${s}`:null}try{let s=new URL(t);if(s.hostname.toLowerCase()!=="github.com")return null;if(!new Set(["https:","http:","ssh:","git:"]).has(s.protocol))return null;let o=Xe(s.pathname);return o.split("/").length===2?`https://github.com/${o}`:null}catch{return null}}async function O(e,t,n){try{return await e()}catch(s){let o=K(s);throw new _(t,o?`${n} (${o})`:n,{cause:s})}}function cn(e,t){let n=`refs/heads/${t}`;for(let s of e.split(`
2
+ `)){let[o,i]=s.trim().split(/\s+/,2);if(i===n&&/^[0-9a-f]{40,64}$/i.test(o??""))return o??null}return null}function un(e){let t=e.replace(/[\r\n]+$/,"").replace(/\/+$/,"");if(!t)return;let n=t.split("/");if(t.startsWith("/")||n.some((s)=>!s||s==="."||s===".."))throw new _("git_command_failed","Could not resolve the workspace path relative to the Git repository.");return t}async function Uo(e){let t=Qe(e);if(!await O(t.isInsideWorkTree,"not_git_repository","Cloud handoff requires a Git repository."))throw new _("not_git_repository","Cloud handoff requires a Git working tree.");let s=un(await O(t.workspacePrefix,"git_command_failed","Could not resolve the workspace path relative to the Git repository.")),o=await O(t.worktreeStatus,"git_command_failed","Could not inspect the Git worktree.");if(o){let l=o.split(`
3
+ `).filter(Boolean),m=l.slice(0,5).join(`
4
+ `),y=l.length>5?`
5
+ ...and ${l.length-5} more`:"";throw new _("dirty_worktree",`Commit and push local changes before handing off to cloud. Uncommitted files are not transferred.
6
6
 
7
- ${_}${O}`)}let j;try{j=await J.symbolicBranch()}catch(K){let _=r(K)===1,O=t(K),B=_?"Cloud handoff requires a checked-out branch; detached HEAD is not supported.":"Could not inspect the current Git branch.";throw new C(_?"detached_head":"git_command_failed",O?`${B} (${O})`:B,{cause:K})}if(!j)throw new C("detached_head","Cloud handoff requires a checked-out branch; detached HEAD is not supported.");let[V,Y,W]=await Promise.all([y(()=>J.branchRemote(j),"missing_upstream",`Branch ${j} has no upstream. Push it with -u before handing off.`),y(()=>J.branchMergeRef(j),"missing_upstream",`Branch ${j} has no upstream. Push it with -u before handing off.`),y(J.headSha,"git_command_failed","Could not resolve the current commit.")]);if(!V||V==="."||!Y.startsWith("refs/heads/"))throw new C("missing_upstream",`Branch ${j} has no remote branch upstream. Push it with -u before handing off.`);let F=Y.slice(11),G=V;if(!o0(V))try{G=await J.remoteUrl(V)}catch{throw new C("missing_upstream","Could not resolve the upstream remote.")}let N=o0(G);if(!N)throw new C("unsupported_remote","Cloud handoff currently requires a github.com upstream remote.");let z;try{z=await J.remoteRefs(V,Y)}catch(K){let _=r(K)===2,O=_?`The upstream branch ${F} was not found. Push it before handing off.`:"Could not verify the remote branch. Check your network and GitHub authentication, then try again.";throw new C(_?"remote_branch_missing":"git_command_failed",O)}let L=Y2(z,F);if(!L)throw new C("remote_branch_missing",`The upstream branch ${F} was not found. Push it before handing off.`);if(L.toLowerCase()!==W.toLowerCase())throw new C("unpushed_commits",`Local HEAD does not match the upstream branch ${F}. Push the current commit before handing off.`);return{repoUrl:N,branch:F,headSha:W,...X?{workspaceRelativePath:X}:{}}}function L0($){return $&&typeof $==="object"&&!Array.isArray($)?$:void 0}function T($){if(typeof $!=="string")return;return $.trim()||void 0}function N2($){return typeof $==="string"&&$.length>0?$:void 0}function F2($){let J=T($.repoUrl),Z=T($.branch),X=T($.headSha),Q=T($.modelId);if(!J||!Z||!X||!Q)throw Error("Cloud handoff fingerprint fields cannot be empty.");let j=T($.organizationId),V=N2($.workspaceRelativePath),Y=$.mode;return{repoUrl:J,branch:Z,headSha:X,modelId:Q,...j?{organizationId:j}:{},...V?{workspaceRelativePath:V}:{},...Y?{mode:Y}:{}}}function y4($,J){return $!==void 0&&J!==void 0&&$.repoUrl===J.repoUrl&&$.branch===J.branch&&$.headSha.toLowerCase()===J.headSha.toLowerCase()&&$.modelId===J.modelId&&$.organizationId===J.organizationId&&$.workspaceRelativePath===J.workspaceRelativePath&&$.mode===J.mode}function K2($){let J=L0($);if(!J||typeof J.repoUrl!=="string"||typeof J.branch!=="string"||typeof J.headSha!=="string"||typeof J.modelId!=="string")return;try{return F2({repoUrl:J.repoUrl,branch:J.branch,headSha:J.headSha,modelId:J.modelId,...typeof J.organizationId==="string"?{organizationId:J.organizationId}:{},...typeof J.workspaceRelativePath==="string"?{workspaceRelativePath:J.workspaceRelativePath}:{},...J.mode==="plan"||J.mode==="yolo"||J.mode==="zen"?{mode:J.mode}:{}})}catch{return}}function g4($){let J=L0(L0($)?.handoff);if(!J)return;let Z=T(J.toCloudSessionId),X=T(J.handedOffAt),Q=J.status;if(!Z||!X||Q!=="pending"&&Q!=="complete")return;let j=T(J.innerSessionId),V=T(J.dashboardUrl),Y=K2(J.fingerprint);return{toCloudSessionId:Z,handedOffAt:X,status:Q,...j?{innerSessionId:j}:{},...V?{dashboardUrl:V}:{},...Y?{fingerprint:Y}:{}}}function h4($,J){return{...$??{},handoff:J}}function v4($){let{handoff:J,cloudHandoffIntent:Z,cloudHandoffSeedDispatched:X,...Q}=$??{};return Q}function S4($,J){let Z=J.trim();if(!Z)throw Error("Cloud session id cannot be empty.");let X=new URL("/agents",$);return X.searchParams.set("sessionId",Z),X.toString()}function e0($){return $.map((J)=>{let Z=J&&typeof J==="object"?J:{};return{role:Z.role,content:Z.content}})}function G0($,J){return $.length===J.length&&JSON.stringify(e0($))===JSON.stringify(e0(J))}class z0 extends Error{constructor($,J){super(`Cloud transcript verification failed (local ${$} messages, cloud ${J}).`);this.name="CloudHandoffTranscriptMismatchError"}}import{randomUUID as L2}from"node:crypto";import{decodeJwtPayload as G2}from"@cerebriline/shared";var z2=610000,_2=3000,m=15000,q2="CLOUD_SESSION_ERROR:",Z1="__cline_create_request__:";function X1($){return($.trim().split(`
8
- `)[0]??"").trim().slice(0,72)}class q extends Error{code;detail;connectUrl;status;constructor($,J,Z,X){super(`${q2}${JSON.stringify({code:$,message:J,connectUrl:Z})}`);this.code=$;this.detail=J;this.connectUrl=Z;this.status=X;this.name="CloudSessionError"}}class Q1 extends Error{constructor($){super($ instanceof Error?$.message:"Cloud handoff creation was rejected.",{cause:$});this.name="CloudHandoffCreationRejectedError"}}function O0($){let J=$.length;while(J>0&&$[J-1]==="/")J--;return $.slice(0,J)}function O2($){return`${Z1}${$}`.slice(0,255)}function $1($){return $?.startsWith(Z1)===!0}function A0($){switch($){case"provisioning":case"cloning_repo":case"agent_starting":case"ready":case"failed":return $;default:return}}function _0($){let J=G2($.replace(/^workos:/,""));return typeof J?.sub==="string"&&J.sub.trim()?J.sub.trim():void 0}function J1($){return new Promise((J,Z)=>{if($.aborted){Z($.reason);return}let X=()=>{clearTimeout(Q),Z($.reason)},Q=setTimeout(()=>{$.removeEventListener("abort",X),J()},_2);$.addEventListener("abort",X,{once:!0})})}function A2($,J){if($&&typeof $==="object"){let Z=$.error;if(typeof Z==="string"&&Z.trim())return Z.trim()}return J}function q0($,J,Z,X){let Q=A2(J,`Cloud session request failed (${$})`);if($===401)return new q("authentication_required",Q);if($===404)return new q("session_not_found",Q);if($===410)return new q("session_expired",Q);if($===412)return new q("github_not_connected",Q,X??`${O0(Z)}/dashboard/integrations`);if($===403&&Q.trim().toLowerCase()==="forbidden")return new q("request_failed","Your active account or organization cannot create cloud sessions. Switch to Personal or another organization in Settings → Account, then try again.",void 0,$);return new q("request_failed",Q,void 0,$)}class B2{options;apiBaseUrl;appBaseUrl;fetchImpl;createTimeoutMs;unconfirmedHandoffCreates=new Set;completedHandoffCreates=new Map;constructor($){this.options=$;this.apiBaseUrl=O0($.apiBaseUrl),this.appBaseUrl=O0($.appBaseUrl),this.fetchImpl=$.fetch??fetch,this.createTimeoutMs=$.createTimeoutMs??z2}async request($,J={},Z,X,Q){let j=!1,V;while(!0){let Y;try{Y=typeof X==="string"?X:await this.options.getAuthToken()}catch(G){if(V)throw q0(401,void 0,this.appBaseUrl,Z);throw G}if(!Y?.trim())throw new q("authentication_required","Sign in to Cline before starting a cloud session.");if(Y.trim()===V)throw new q("authentication_required","The cloud session credential was rejected. Sign in again.");if(typeof X==="object"){if(X.subject?_0(Y.trim())!==X.subject:Y.trim()!==X.token)throw new q("authentication_required","The signed-in account changed during cloud session creation.");X.token=Y.trim()}Q?.();let W=await this.fetchImpl(`${this.apiBaseUrl}${$}`,{...J,signal:J.signal??AbortSignal.timeout(m),headers:{Accept:"application/json",Authorization:`Bearer ${Y.trim()}`,...J.body?{"Content-Type":"application/json"}:{},...J.headers}}),F=W.status===204?void 0:await W.json().catch(()=>{return});if(!W.ok){if(W.status===401&&typeof X==="object"&&!j&&X.subject){j=!0,V=Y.trim();continue}throw q0(W.status,F,this.appBaseUrl,Z)}return F?.data}}async list($){return await this.listWithToken($)}async listWithToken($,J,Z=!1){let X=$?.trim()?`?organizationId=${encodeURIComponent($.trim())}`:"";return(await this.request(`/api/v1/session${X}`,{},void 0,J)??[]).flatMap((j)=>{if(!j||typeof j!=="object"||typeof j.id!=="string")return[];return[{...j,title:!Z&&$1(j.title)?void 0:j.title,repoContext:j.repoContext&&typeof j.repoContext==="object"?j.repoContext:{},metadata:{...j.metadata&&typeof j.metadata==="object"?j.metadata:{},...!Z&&$1(j.title)?{createRequestTitle:j.title}:{}}}]})}async listRepositories($){let J=$?.trim(),Z=J?`${this.appBaseUrl}/dashboard/organization/integrations`:`${this.appBaseUrl}/dashboard/integrations`,X=J?`/api/v1/organizations/${encodeURIComponent(J)}/integrations/github/repositories`:"/api/v1/integrations/github/repositories";try{let Q=await this.request(X)??[];return{connected:!0,connectUrl:Z,repositories:Q.flatMap((j)=>{let V=Number(j.id),Y=String(j.html_url??j.clone_url??"").trim();if(!Number.isSafeInteger(V)||V<=0||!Y)return[];let W=String(j.name??"").trim();return[{id:V,name:W,fullName:String(j.full_name??(W||Y)).trim(),url:Y,defaultBranch:String(j.default_branch??"").trim()}]})}}catch(Q){if(Q instanceof q&&Q.code==="session_not_found")return{connected:!1,connectUrl:Z,repositories:[]};throw Q}}async listBranches($,J,Z={}){if(!Number.isSafeInteger($)||$<=0)throw new q("request_failed","Select a GitHub repository before loading branches.");let X=J?.trim(),Q=X?`/api/v1/organizations/${encodeURIComponent(X)}/integrations/github/repositories/${$}/branches`:`/api/v1/integrations/github/repositories/${$}/branches`,j=new URLSearchParams,V=Z.query?.trim(),Y=Z.cursor?.trim();if(V)j.set("query",V);if(Y)j.set("cursor",Y);let W=j.size>0?`${Q}?${j}`:Q;try{let F=await this.request(W),G=Array.isArray(F)?F:Array.isArray(F?.items)?F.items:[],N=V?.toLowerCase();return{available:!0,branches:G.flatMap((z)=>{let L=String(z.name??"").trim();return L&&(!Array.isArray(F)||!N||L.toLowerCase().includes(N))?[L]:[]}),nextToken:Array.isArray(F)?"":String(F?.nextToken??"").trim()}}catch(F){if(F instanceof q&&F.code==="session_not_found")return{available:!1,branches:[]};throw F}}async status($,J={}){return await this.request(`/api/v1/session/${encodeURIComponent($)}/status`,{signal:J.signal?AbortSignal.any([J.signal,AbortSignal.timeout(m)]):void 0},void 0,J.authToken)}async create($){if($.handoff&&typeof $.handoff.onCreating!=="function")throw new q("request_failed","Cloud handoff requires an onCreating callback to persist creation intent before dispatch.");let J=(await this.options.getAuthToken())?.trim();if(!J)throw new q("authentication_required","Sign in to Cline before starting a cloud session.");let Z={token:J,subject:_0(J)},X=O2($.requestId?.trim()||L2()),Q=$.handoff?`${Z.subject??J}/${$.organizationId??""}/${$.requestId?.trim()??""}`:void 0;if($.handoff&&!$.requestId?.trim())throw new q("request_failed","A stable request id is required for cloud handoff creation.");let j=async()=>(await this.listWithToken($.organizationId??void 0,Z,!0)).filter((N)=>N.title===X&&N.repoContext.repoUrl===$.repoUrl&&N.metadata.modelId===$.modelId&&(!$.branch?.trim()||N.repoContext.branch===$.branch.trim())),V=async(N)=>{if(N.status==="failed"||N.expiredAt&&Date.parse(N.expiredAt)<=Date.now()){let L=new q(N.status==="failed"?"session_failed":"session_expired","The recovered cloud handoff workspace is no longer usable.");try{await this.deleteWithAuth(N.id,Z)}catch(K){if(!(K instanceof q&&(K.code==="session_not_found"||K.code==="session_expired")))throw AggregateError([L,K],"The unusable recovered cloud handoff workspace could not be removed.")}if(Q)this.unconfirmedHandoffCreates.delete(Q),this.completedHandoffCreates.delete(Q);throw await $.handoff?.onOuterSessionRemoved?.(N.id),L}await $.handoff?.onOuterSessionCreated(N.id,{created:!1});let z={sessionId:N.id,status:N.status,sandboxUrl:N.sandboxUrl,cleanupAuthToken:Z.token};if(Q)this.unconfirmedHandoffCreates.delete(Q),this.completedHandoffCreates.set(Q,z);return z};if(Q){let N=await j();if(N.length>1)throw new q("request_failed","Cloud handoff creation is ambiguous; inspect your cloud session list before continuing.");if(N[0])return await V(N[0]);let z=this.completedHandoffCreates.get(Q);if(z){try{await this.request(`/api/v1/session/${encodeURIComponent(z.sessionId)}/status`,{},void 0,Z)}catch(L){if(L instanceof q&&(L.code==="session_not_found"||L.code==="session_expired"))await $.handoff?.onOuterSessionRemoved?.(z.sessionId),this.completedHandoffCreates.delete(Q),this.unconfirmedHandoffCreates.delete(Q);throw L}return await $.handoff?.onOuterSessionCreated(z.sessionId,{created:!1}),{...z,cleanupAuthToken:Z.token}}if(this.unconfirmedHandoffCreates.has(Q))throw new q("request_failed","Cloud handoff creation is still unconfirmed. Recover the original request before creating another workspace.");this.unconfirmedHandoffCreates.add(Q)}try{await $.handoff?.onCreating()}catch(N){if(Q)this.unconfirmedHandoffCreates.delete(Q);throw N}let Y=new AbortController,W=setTimeout(()=>Y.abort(),this.createTimeoutMs),F,G=!1;try{let N=await this.request("/api/v1/session",{method:"POST",body:JSON.stringify({modelId:$.modelId,repoUrl:$.repoUrl,...$.sandboxType?{sandboxType:$.sandboxType}:{},title:X,...$.branch?.trim()?{branch:$.branch.trim()}:{},...$.organizationId?.trim()?{organizationId:$.organizationId.trim()}:{}}),signal:Y.signal},$.organizationId?.trim()?`${this.appBaseUrl}/dashboard/organization/integrations`:void 0,Z,()=>{G=!0}),z=N?.sessionId?.trim();if(!z)throw new q("request_failed","The cloud session service returned no session id.");F=z,await this.persistHandoffOuterSession($,z,Z,Q);let L={sessionId:z,status:N.status?.trim()||"provisioning",sandboxUrl:N.sandboxUrl?.trim()??"",cleanupAuthToken:Z.token};if(Q)this.unconfirmedHandoffCreates.delete(Q),this.completedHandoffCreates.set(Q,L);return L}catch(N){if(F)throw N;let z=!G||N instanceof q&&(N.status!==void 0&&N.status>=400&&N.status<500&&N.status!==408&&N.status!==409||["authentication_required","github_not_connected","session_not_found","session_expired"].includes(N.code));if(Q&&z)throw this.unconfirmedHandoffCreates.delete(Q),new Q1(N);if(Y.signal.aborted||!(N instanceof q)||N instanceof q&&N.code==="request_failed"&&(N.status===void 0||N.status>=500||N.status===408||N.status===409)){let K=[];try{K=await j()}catch(O){if($.handoff)throw AggregateError([N,O],"Cloud handoff creation is unconfirmed and its session list could not be checked.")}if(K.length>1)throw new q("request_failed","Cloud session creation had an ambiguous result. Check your cloud session list before trying again.");let _=K[0];if(_){if($.handoff)return await V(_);return{sessionId:_.id,status:_.status,sandboxUrl:_.sandboxUrl,cleanupAuthToken:Z.token}}}else if(Q)this.unconfirmedHandoffCreates.delete(Q);throw N}finally{clearTimeout(W)}}async persistHandoffOuterSession($,J,Z,X){if(!$.handoff)return;try{await $.handoff.onOuterSessionCreated(J,{created:!0})}catch(Q){try{await this.deleteWithAuth(J,Z.token)}catch(j){if(!(j instanceof q&&(j.code==="session_not_found"||j.code==="session_expired")))throw AggregateError([Q,j],`Cloud session ${J} was created but its recovery record could not be saved or its sandbox removed.`)}if(X)this.unconfirmedHandoffCreates.delete(X);throw await $.handoff.onOuterSessionRemoved?.(J),Q}}async waitUntilReady($,J,Z){J=AbortSignal.any([J,AbortSignal.timeout(this.createTimeoutMs)]);let X=await this.options.getAuthToken(),Q=X?{token:X,subject:_0(X)}:void 0;while(!J.aborted){let j;try{j=await this.request(`/api/v1/session/${encodeURIComponent($)}/status`,{signal:AbortSignal.any([J,AbortSignal.timeout(m)])},void 0,Q)}catch(Y){if(J.aborted)throw Y;if(Y instanceof q&&Y.code!=="request_failed")throw Y;await J1(J);continue}let V=j?.status?.trim().toLowerCase();if(Z?.({phase:A0(j?.phase)}),V==="ready"||V==="active")return;if(V==="failed")throw new q("session_failed",j?.statusReason?.trim()||"The cloud sandbox could not be prepared.");if(V!=="provisioning")throw new q("request_failed","The cloud session service returned an unexpected provisioning status.");await J1(J)}throw J.reason}async resume($,J){return await this.request(`/api/v1/session/${encodeURIComponent($)}/resume`,{method:"POST",signal:J?AbortSignal.any([J,AbortSignal.timeout(m)]):void 0})}async delete($,J){await this.deleteWithAuth($,J)}async deleteWithAuth($,J){let Z;try{await this.request(`/api/v1/session/${encodeURIComponent($)}`,{method:"DELETE"},void 0,J)}catch(X){if(!(X instanceof q)||X.code!=="session_not_found"&&X.code!=="session_expired")throw X;Z=X}for(let[X,Q]of this.completedHandoffCreates)if(Q.sessionId===$)this.completedHandoffCreates.delete(X),this.unconfirmedHandoffCreates.delete(X);if(Z)throw Z}async updateTitle($,J){return await this.request(`/api/v1/session/${encodeURIComponent($)}`,{method:"PATCH",body:JSON.stringify({title:J})})}async history($){let J=await this.options.getAuthToken();if(!J?.trim())throw new q("authentication_required","Sign in to Cline to load this session's history.");let Z=await this.fetchImpl(`${this.apiBaseUrl}/api/v1/session/${encodeURIComponent($)}/history`,{headers:{Accept:"application/json",Authorization:`Bearer ${J.trim()}`},signal:AbortSignal.timeout(m)});if(Z.status===404)return null;let X=await Z.json().catch(()=>{return});if(!Z.ok)throw q0(Z.status,X,this.appBaseUrl);if(!X||typeof X!=="object"||!("version"in X)||X.version!==1||!("messages"in X)||!Array.isArray(X.messages))throw new q("request_failed","Invalid archived session history");return X.messages}}import{randomUUID as z4}from"node:crypto";import{posix as F0}from"node:path";import{createSessionId as v6,ensureLoopbackProxyBypass as S1,isHubProtocolCompatible as S6,resolveClineBuildEnv as m6,resolveHubCommandTimeoutMs as I6}from"@cerebriline/shared";import p6 from"ws";var g={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.92",repository:{type:"git",url:"https://github.com/cline/cline",directory:"sdk/packages/core"},type:"module",types:"./dist/index.d.ts",main:"./dist/index.js",private:!1,publishConfig:{access:"public"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./hub":{types:"./dist/hub/index.d.ts",import:"./dist/hub/index.js"},"./hub/daemon-entry":{types:"./dist/hub/daemon/entry.d.ts",import:"./dist/hub/daemon/entry.js"},"./telemetry":{types:"./dist/services/telemetry/index.d.ts",import:"./dist/services/telemetry/index.js"},"./services/feature-flags/posthog":{types:"./dist/services/feature-flags/posthog.d.ts",import:"./dist/services/feature-flags/posthog.js"},"./remote/helper-entry":{types:"./dist/remote/remote-helper-entry.d.ts",import:"./dist/remote/remote-helper-entry.js"},"./cloud":{types:"./dist/cloud/index.d.ts",import:"./dist/cloud/index.js"},"./remote/helper":{types:"./dist/remote/remote-helper.d.ts",import:"./dist/remote/remote-helper.js"}},scripts:{build:"bun run ./bun.mts && bun tsc -p tsconfig.build.json && bun run ./scripts/verify-runtime-build-id.ts",typecheck:"bun tsc -p tsconfig.dev.json --noEmit && bun run typecheck:smoke","typecheck:smoke":"bun tsc -p tsconfig.smoke.json --noEmit",test:"bun run test:unit && bun run test:e2e","test:live":"vitest run --config vitest.config.ts src/extensions/context/compaction.live.test.ts","test:compaction":"bun --conditions=development run scripts/compact-session.ts","test:unit":"vitest run --config vitest.config.ts","test:e2e":"vitest run --config vitest.e2e.config.ts","verify:routines":"zsh -lc 'bunx vitest run src/cron/schedule-service.test.ts --config vitest.config.ts'","test:watch":"vitest --config vitest.config.ts"},dependencies:{"@cerebriline/agents":"workspace:*","@cerebriline/llms":"workspace:*","@cerebriline/shared":"workspace:*","@joplin/turndown-plugin-gfm":"1.0.68","@lingo-reader/epub-parser":"0.4.6","@lingo-reader/fb2-parser":"0.4.6","@lingo-reader/mobi-parser":"0.4.6","@modelcontextprotocol/sdk":"^1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.214.0","@opentelemetry/exporter-logs-otlp-http":"^0.214.0","@opentelemetry/exporter-metrics-otlp-http":"^0.214.0","@opentelemetry/exporter-trace-otlp-http":"^0.214.0","@opentelemetry/resources":"^2.6.1","@opentelemetry/sdk-logs":"^0.214.0","@opentelemetry/sdk-metrics":"^2.6.1","@opentelemetry/sdk-trace-base":"^2.6.1","@opentelemetry/sdk-trace-node":"^2.6.1","@opentelemetry/semantic-conventions":"^1.40.0","@tesseract.js-data/eng":"1.0.0",cfb:"1.2.2","fast-png":"8.0.0",jiti:"^2.7.0",nanoid:"^5.1.7","node-machine-id":"^1.1.12",officeparser:"8.0.0","pdfjs-dist":"6.2.108","simple-git":"3.36.0","tesseract.js":"7.0.0","tree-sitter-wasms":"^0.1.12",turndown:"7.2.0","web-tree-sitter":"^0.25.0",ws:"^8.20.0",yaml:"^2.8.2",zod:"^4.3.6"},peerDependencies:{"posthog-node":"^5.8.0"},peerDependenciesMeta:{"posthog-node":{optional:!0}},devDependencies:{"@types/turndown":"^5.0.6","@types/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["assets","dist","scripts/document-reader-assets.mjs","!dist/**/*.d.ts.map"]};var j1="session_not_found";class s extends Error{sessionId;code="session_not_found";constructor($,J){super(J??($?`session not found: ${$}`:"session not found"));this.sessionId=$;this.name="SessionNotFoundError"}}function B0($){return $ instanceof s||typeof $==="object"&&$!==null&&"code"in $&&$.code==="session_not_found"}import{spawn as Z6}from"node:child_process";import{closeSync as X6,mkdirSync as Q6,openSync as j6,readFileSync as V6,unlinkSync as Y6}from"node:fs";import{basename as W6,dirname as N6,join as F6}from"node:path";import{fileURLToPath as K6}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as L6,isBunEmbeddedModulePath as G6,isHubDaemonProcess as z6,resolveClineBuildEnv as T1,withResolvedClineBuildEnv as _6}from"@cerebriline/shared";import{createHash as U2,randomBytes as M2}from"node:crypto";import{mkdir as U0,open as V1,readFile as K1,rename as R2,rm as M0,writeFile as P2}from"node:fs/promises";import{dirname as L1,join as R0}from"node:path";import{ensureLoopbackProxyBypass as C2,isHubProtocolCompatible as H2}from"@cerebriline/shared";import{resolveClineDataDir as I,resolveClineDir as Z8}from"@cerebriline/shared/storage";var x2="CLINE_HUB_DISCOVERY_PATH",E2="CLINE_HUB_BUILD_ID",T2="CLINE_HUB_BUILD_EPOCH_MS",w2=30000,f2=15000,Y1=100;function b2($){return $.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function k2($){return U2("sha256").update($).digest("hex").slice(0,12)}function y2($){if(!Number.isInteger($)||!$||$<=0)return!1;try{return process.kill($,0),!0}catch(J){return J instanceof Error&&"code"in J?String(J.code)==="EPERM":!1}}function W1($){return new Promise((J)=>setTimeout(J,$))}function g2($){return`${$}.lock`}async function h2($){try{let J=JSON.parse(await K1(R0($,"owner.json"),"utf8"));if(typeof J.pid!=="number"||typeof J.acquiredAt!=="string")return;return{pid:J.pid,acquiredAt:J.acquiredAt}}catch{return}}async function D0($){await M0($,{recursive:!0,force:!0}).catch(()=>{return})}function h(){let $=process.env[E2]?.trim();if($)return $;return"sdk-v1-0cf8945e15c6cefeec157ab4fced4c8dbdf07c9c074819832f6c24ad304d77e2".trim()||`source-${String(g.version)}`}function v2(){let $=Number(process.env[T2]);if(Number.isFinite($)&&$>0)return $;return Number.isFinite(1791889679249)?1791889679249:void 0}function n($,J=h()){let Z=H2($);if(!Z.compatible)return Z;let X=$.buildId?.trim();if(!X)return{compatible:!1,reason:"missing_build"};if(X!==J)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function N1($){return typeof $==="number"&&Number.isFinite($)&&$>0?$:void 0}function F1($){let J=$?.trim().split(/[-+]/,1)[0];if(!J)return;let Z=J.split(".").map((X)=>Number(X));if(Z.length===0||Z.some((X)=>!Number.isInteger(X)||X<0))return;return Z}function S2($,J){for(let Z=0;Z<Math.max($.length,J.length);Z++){let X=$[Z]??0,Q=J[Z]??0;if(X!==Q)return X<Q?-1:1}return 0}function G1($,J){let Z=$.buildId?.trim(),X=J.buildId?.trim();if(Z&&X&&Z===X)return 0;let Q=N1($.buildEpochMs),j=N1(J.buildEpochMs);if(Q!==void 0&&j!==void 0&&Q!==j)return Q<j?-1:1;let V=F1($.coreVersion),Y=F1(J.coreVersion);if(V&&Y){let W=S2(V,Y);if(W!==0)return W}if(Z&&X&&Z!==X)return Z<X?-1:1;return 0}function z1(){return{buildId:h(),buildEpochMs:v2(),coreVersion:String(g.version)}}function o($,J){let Z=J?.self??z1(),X=n($,Z.buildId??"");if(X.compatible)return!0;if(X.reason!=="build_mismatch"&&X.reason!=="missing_build")return!1;return G1(Z,$)<=0}function _1($=process.argv[1]?.trim()||process.cwd()){let J=`hub-${k2($)}`,Z=process.env[x2]?.trim()||R0(I(),"locks","hub","owners",`${b2(J)}.json`);return{ownerId:J,discoveryPath:Z}}async function b($){try{let J=JSON.parse(await K1($,"utf8"));if(typeof J.hubId!=="string"||typeof J.protocolVersion!=="string"||typeof J.authToken!=="string"||typeof J.host!=="string"||typeof J.port!=="number"||typeof J.url!=="string"||typeof J.startedAt!=="string"||typeof J.updatedAt!=="string")return;return{hubId:J.hubId,protocolVersion:J.protocolVersion,minClientProtocolVersion:typeof J.minClientProtocolVersion==="string"?J.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof J.maxClientProtocolVersion==="string"?J.maxClientProtocolVersion:void 0,capabilities:Array.isArray(J.capabilities)?J.capabilities.filter((Z)=>typeof Z==="string"):void 0,coreVersion:typeof J.coreVersion==="string"?J.coreVersion:void 0,buildId:typeof J.buildId==="string"?J.buildId:void 0,buildEpochMs:typeof J.buildEpochMs==="number"?J.buildEpochMs:void 0,authToken:J.authToken,host:J.host,port:J.port,url:J.url,pid:typeof J.pid==="number"?J.pid:void 0,startedAt:J.startedAt,updatedAt:J.updatedAt}}catch{return}}async function q1($,J,Z){await A1($,async()=>{let X=L1($);await U0(X,{recursive:!0});let Q=`${$}.${process.pid}.${M2(6).toString("hex")}.tmp`,j;try{j=await V1(Q,"wx",384),await j.writeFile(`${JSON.stringify(J,null,2)}
9
- `,{encoding:"utf8"}),await j.sync(),await j.close(),j=void 0,Z?.beforePublish?.(),await R2(Q,$);let V;try{V=await V1(X,"r"),await V.sync()}catch{}finally{await V?.close().catch(()=>{return})}}catch(V){throw await j?.close().catch(()=>{return}),await M0(Q,{force:!0}).catch(()=>{return}),V}})}async function v($){await A1($,async()=>{await M0($,{force:!0}).catch(()=>{return})})}async function O1($,J,Z){let X=g2($);await U0(L1(X),{recursive:!0});let Q=Date.now()+f2;while(!0){try{await U0(X,{recursive:!1})}catch(j){if((j instanceof Error&&"code"in j?String(j.code):"")!=="EEXIST")throw j;let Y=await h2(X);if(!Y){if(Date.now()>=Q){await D0(X);continue}await W1(Y1);continue}let W=Date.now()-Date.parse(Y.acquiredAt);if(!y2(Y.pid)||W>w2){await D0(X);continue}if(Date.now()>=Q)throw Error(`Timed out waiting for hub ${J} lock ${X}`);await W1(Y1);continue}try{return await P2(R0(X,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
10
- `,"utf8"),await Z()}finally{await D0(X)}}}function A1($,J){return O1(`${$}.mutation`,"discovery mutation",J)}function B1($,J){return O1($,"startup",J)}async function e($,J){C2();try{let Z=await fetch(J?.authToken?m2($):U1($),{headers:J?.authToken?{authorization:`Bearer ${J.authToken}`}:void 0,signal:J?.signal});if(!Z.ok)return;let X=await Z.json();if(typeof X.protocolVersion!=="string"||typeof X.host!=="string"||typeof X.port!=="number"||typeof X.url!=="string")return;return{protocolVersion:X.protocolVersion,minClientProtocolVersion:typeof X.minClientProtocolVersion==="string"?X.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof X.maxClientProtocolVersion==="string"?X.maxClientProtocolVersion:void 0,capabilities:Array.isArray(X.capabilities)?X.capabilities.filter((Q)=>typeof Q==="string"):void 0,coreVersion:typeof X.coreVersion==="string"?X.coreVersion:void 0,buildId:typeof X.buildId==="string"?X.buildId:void 0,buildEpochMs:typeof X.buildEpochMs==="number"?X.buildEpochMs:void 0,host:X.host,port:X.port,url:X.url,hubId:typeof X.hubId==="string"?X.hubId:void 0,authToken:typeof X.authToken==="string"?X.authToken:void 0,pid:typeof X.pid==="number"?X.pid:void 0,startedAt:typeof X.startedAt==="string"?X.startedAt:void 0,updatedAt:typeof X.updatedAt==="string"?X.updatedAt:void 0}}catch{return}}function D1($,J,Z="/hub"){return new URL(`ws://${$}:${J}${Z}`).toString()}function U1($){let J=new URL($);return J.protocol=J.protocol==="wss:"?"https:":"http:",J.pathname="/health",J.search="",J.toString()}function m2($){let J=new URL(U1($));return J.pathname="/status",J.toString()}import{CLINE_HUB_DEV_PORT as I2,CLINE_HUB_PORT as p2,resolveClineBuildEnv as l2}from"@cerebriline/shared";var u2="CLINE_HUB_HOST",c2="CLINE_HUB_PORT",a2="CLINE_HUB_PATHNAME",d2="127.0.0.1",i2=p2,t2="/hub";function M1($){return l2($)==="development"?I2:i2}function r2($={}){return($.env??process.env)[u2]?.trim()||d2}function s2($={}){let Z=($.env??process.env)[c2]?.trim();if(!Z)return M1($);let X=Number.parseInt(Z,10);if(!Number.isInteger(X)||X<1||X>65535)return M1($);return X}function n2($={}){return($.env??process.env)[a2]?.trim()||t2}function R1($={},J={}){return{host:$.host??r2(J),port:$.port??s2(J),pathname:$.pathname??n2(J)}}import{join as o2}from"node:path";var e2="shared:cline",$6="CLINE_HUB_DISCOVERY_PATH",J6="hub-production";function p($=e2){return _1(`${$}@${h()}`)}function $0(){return{ownerId:J6,discoveryPath:process.env[$6]?.trim()||o2(I(),"locks","hub","production.json")}}var P1=15000,q6=200,C1=3000,O6=100,A6=[100,250,500,1000,2000],B6="--cline-hub-daemon",D6=3,U6=60000,H1=new Map;function M6($,J=Date.now()){let Z=H1.get($);if(!Z||J-Z.windowStartedAt>U6)return H1.set($,{count:1,windowStartedAt:J}),!0;return Z.count+=1,Z.count<=D6}function R6($){return[...$.host?["--host",$.host]:[],...typeof $.port==="number"?["--port",String($.port)]:[],...$.pathname?["--pathname",$.pathname]:[]]}function P6(){try{let $=F6(I(),"logs","hub-daemon.log");return Q6(N6($),{recursive:!0}),{fd:j6($,"a"),logPath:$}}catch{return}}function C6(){return T1()==="production"?$0():p()}function l($){return o($)}function H6($){try{let J=JSON.parse(V6(`${$}.superseded`,"utf8"));return{url:typeof J.url==="string"?J.url:void 0,authToken:typeof J.authToken==="string"?J.authToken:void 0,pid:typeof J.pid==="number"?J.pid:void 0}}catch{return}}function P0($){try{Y6(`${$}.superseded`)}catch{}}function x1($,J,Z){if(!J||J.url!==Z)return $;return{...$,authToken:$.authToken??J.authToken,pid:$.pid??J.pid}}async function u($,J){try{return await e($,{authToken:J})}catch{return}}async function E1($,J){let Z=Date.now()+J;while(Date.now()<Z){if(!(await u($))?.url)return!0;await new Promise((Q)=>setTimeout(Q,O6))}return!1}async function H0($,J){if(!M6($.url))return!1;await c($.url,$.authToken,"retired by newer install").catch(()=>!1),await b1($.url,$.authToken).catch(()=>!1);let Z=await E1($.url,C1);if(!Z&&$.pid&&x6($.pid)){try{process.kill($.pid,"SIGTERM")}catch{}Z=await E1($.url,C1)}if(Z)await v(J).catch(()=>{return});return Z}function x6($){try{return process.kill($,0),!0}catch(J){return J?.code==="EPERM"}}async function E6($){try{return(await x0($.url,$.authToken)).activeSessionCount>0}catch{return!1}}async function C0($,J){if(l($))return"reusable";let Z=await c($.url,$.authToken,"retired by newer install").catch(()=>!1);if(await E6($)){if(Z)await c($.url,$.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let X=await H0($,J);if(!X&&Z)await c($.url,$.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return X?"retired":"failed"}async function T6($){if(T1()!=="production")return;let J=p();if(J.discoveryPath===$.discoveryPath)return;let Z=await b(J.discoveryPath);if(Z?.url)await H0(Z,J.discoveryPath);else await v(J.discoveryPath).catch(()=>{return})}function w6(){let $=import.meta.url.endsWith(".ts")?"ts":"js";return K6(new URL(`./entry.${$}`,import.meta.url))}function f6($,J){if(G6($))return[B6];return[...J&&$.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],$]}function b6($,J){let Z=w6(),X=process.execPath?.trim();if(!X)throw Error("unable to resolve runtime executable for hub daemon");let Q=W6(X).toLowerCase().includes("bun"),j=f6(Z,Q);return{launcher:X,args:[...j,"--cwd",$,...R6(J),...J.manageConnectors===!1?["--no-connectors"]:[]],cwd:$,env:{..._6(process.env),CLINE_NO_INTERACTIVE:"1",[L6]:"1"}}}function k6($){if(!$||typeof $!=="object")return!1;if(("code"in $?$.code:void 0)==="ETXTBSY")return!0;let Z="message"in $?$.message:void 0;return typeof Z==="string"&&Z.includes("ETXTBSY")}function y6($,J={}){if(z6())return;let Z=b6($,J),X=P6();try{Z6(Z.launcher,Z.args,{detached:!0,stdio:X?["ignore",X.fd,X.fd]:"ignore",env:Z.env,cwd:Z.cwd,windowsHide:!0}).unref()}finally{if(X)X6(X.fd)}}async function g6($,J={}){for(let Z=0;;Z++)try{y6($,J);return}catch(X){let Q=A6[Z];if(!k6(X)||Q===void 0)throw X;await new Promise((j)=>setTimeout(j,Q))}}async function h6($,J,Z={}){let X=Z.host!==void 0||Z.port!==void 0||Z.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),Q=R1(Z),j=D1(Q.host,Q.port,Q.pathname),V=(K)=>{if(!X)J0(K.url,K.authToken);else f1(K.url,K.authToken);return K};await T6($).catch(()=>{return});let Y=await b($.discoveryPath),W=Y?.url?void 0:H6($.discoveryPath),F=!1;if(Y?.url){let K=Y.authToken;if(!K)F=!0,await H0(Y,$.discoveryPath);else{let _=await u(Y.url,K);if(_?.url&&l(_)&&await w(_.url,{authToken:K}))return P0($.discoveryPath),V({url:_.url,authToken:K});if(_?.url){if(await C0({..._,authToken:K},$.discoveryPath)==="deferred_busy"&&await w(_.url,{authToken:K}))return V({url:_.url,authToken:K})}else await v($.discoveryPath).catch(()=>{return})}}let G=await u(j);if(G?.url){let K=x1(G,Y??W,j);if(l(G)){let O=[G.authToken,Y?.authToken,W?.authToken].filter((D)=>typeof D==="string"&&D.trim().length>0);for(let D of O){if(!await w(G.url,{authToken:D}))continue;let H={hubId:G.hubId??`repaired-${G.port}`,protocolVersion:G.protocolVersion,minClientProtocolVersion:G.minClientProtocolVersion,maxClientProtocolVersion:G.maxClientProtocolVersion,capabilities:G.capabilities,coreVersion:G.coreVersion,buildId:G.buildId,authToken:D,host:G.host,port:G.port,url:G.url,pid:G.pid??Y?.pid??W?.pid,startedAt:G.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await q1($.discoveryPath,H)}catch{}return P0($.discoveryPath),V({url:G.url,authToken:D})}throw Error(`A compatible Cline Hub is already running at ${j}, but its discovery record is missing or unreadable and no usable auth token is available. Run 'cline doctor fix' to repair local hub discovery.${F?" This can happen immediately after upgrading from a build that wrote an empty hub auth token; run 'cline doctor fix' to stop the old daemon and repair local hub discovery.":""}`)}let _=await C0(K,$.discoveryPath);if(_==="deferred_busy"){for(let O of[K.authToken,Y?.authToken].filter((B)=>typeof B==="string"&&B.trim().length>0))if(await w(G.url,{authToken:O}))return V({url:G.url,authToken:O});if(Z.allowPortFallback!==!0&&Q.port!==0)throw Error(`An older Cline Hub is running at ${j} and is still serving active sessions, so it was not replaced, but no usable auth token is available to attach to it. Finish those sessions, or run 'cline doctor fix' to stop the hub.`)}if(_==="failed"&&Z.allowPortFallback!==!0&&Q.port!==0)throw Error(`An incompatible Cline Hub is already running at ${j} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}let z=Z.allowPortFallback===!0&&Q.port!==0?{...Q,port:0}:Q;await g6(J,{...z,manageConnectors:Z.manageConnectors});let L=Date.now()+P1;while(Date.now()<L){let K=await b($.discoveryPath);if(K?.url&&K.authToken){let O=await u(K.url,K.authToken);if(O?.url&&l(O)&&await w(O.url,{authToken:K.authToken}))return P0($.discoveryPath),V({url:O.url,authToken:K.authToken})}let _=await u(j);if(_?.url&&!l(_)){let O=x1(_,K??W,j),B=await C0(O,$.discoveryPath);if(B==="deferred_busy"&&K?.authToken&&await w(_.url,{authToken:K.authToken}))return V({url:_.url,authToken:K.authToken});if(B==="failed"&&Z.allowPortFallback!==!0&&Q.port!==0)throw Error(`An incompatible Cline Hub is still running at ${j} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}await new Promise((O)=>setTimeout(O,q6))}throw Error(`Timed out after ${P1}ms waiting for detached hub startup.`)}async function w1($,J={}){let Z=C6();return await B1(Z.discoveryPath,async()=>h6(Z,$,J))}function l6(){return m6()==="production"?$0():p()}function u6(){let $=globalThis.WebSocket;if(!$)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return $}function m1($){if(typeof $==="string")return $;if($ instanceof Uint8Array)return Buffer.from($).toString();if($ instanceof ArrayBuffer)return Buffer.from($).toString();if(Array.isArray($))return Buffer.concat($.map((J)=>Buffer.from(J))).toString();if($&&typeof $==="object"&&"data"in $&&typeof $.data<"u")return m1($.data);return String($)}function c6($){if(typeof $==="string")return $;if($ instanceof Uint8Array)return Buffer.from($).toString("utf8");if($ instanceof ArrayBuffer)return Buffer.from($).toString("utf8");return""}function k1($){let J=$,Z=c6(J.reason);return new R("hub_connection_closed",J.code||Z?`Hub connection closed (code=${J.code??0}${Z?`, reason=${Z}`:""})`:T0,{closeCode:J.code,closeReason:Z||void 0})}function y1($,J){if($ instanceof R)return $;if($ instanceof Error)return new R("hub_connect_failed",$.message);if($&&typeof $==="object"&&"error"in $&&$.error instanceof Error)return new R("hub_connect_failed",$.error.message);let Z=$&&typeof $==="object"&&"message"in $&&typeof $.message==="string"?$.message.trim():"";if(Z)return new R("hub_connect_failed",Z);let X=$&&typeof $==="object"&&"type"in $&&typeof $.type==="string"?$.type.trim():"";return new R("hub_connect_failed",X?`Failed to connect to hub at ${J.toString()} (${X} event before socket open).`:`Failed to connect to hub at ${J.toString()}.`)}var E0="*",Z0=8000,a6="cline-hub-auth.",b0=new Map,I1=new Set,d6=3000;var T0="Hub connection closed",i6=250,t6=5000,g1=0.5;class R extends Error{code;details;constructor($,J,Z){super(J);this.code=$;this.details=Z;this.name="HubTransportError"}}function r6($){return $ instanceof R}class w0 extends Error{command;code;constructor($,J,Z){super(Z);this.command=$;this.code=J;this.name="HubCommandError"}}function k0($,J={}){let Z=$.searchParams.get("authToken")?.trim();if($.searchParams.delete("authToken"),Z)return Z;if(J.skipRegistry)return;let X=X0($.toString());return X?b0.get(X):void 0}function s6($){try{let Z=new URL($).hostname.toLowerCase().replace(/^\[|\]$/g,"");return Z==="localhost"||Z==="127.0.0.1"||Z==="::1"}catch{return!1}}function X0($){if(!s6($))return;let J=new URL(p1($));return J.search="",J.hash="",J.toString()}function h1($){let J=X0($);return!!J&&I1.has(J)}function J0($,J){let Z=X0($);if(Z){if(I1.add(Z),J?.trim())b0.set(Z,J)}return $}function f1($,J){let Z=X0($);if(Z&&J?.trim())b0.set(Z,J)}class a{options;socket;connectPromise;clientId;currentUrl;recoveryPromise;pendingReplies=new Map;listeners=new Set;subscriptionCounts=new Map;lastEventSequenceByKey=new Map;reconnectTimer;reconnectAttempt=0;closedByClient=!1;connectGeneration=0;lastCloseError=new R("hub_connection_closed",T0);sawSocketClose=!1;registered=!1;capabilities;constructor($){this.options=$;if($.authToken?.trim()&&$.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");this.clientId=$.clientId??`core-${Math.random().toString(36).slice(2,10)}-${Date.now().toString(36)}`,this.currentUrl=$.url,this.capabilities=[...$.capabilities??[]]}getClientId(){return this.clientId}getUrl(){return this.currentUrl}isConnected(){return this.socket?.readyState===1&&this.registered}getConnectionError(){return this.isConnected()?null:this.lastCloseError}async updateCapabilities($){if(this.capabilities=$.map((J)=>({...J})),!this.registered)return;await this.command("client.update",{capabilities:this.capabilities})}async connect(){if(this.connectPromise)return this.connectPromise;if(this.socket&&(this.socket.readyState===1||this.socket.readyState===0))return this.connectPromise??Promise.resolve();this.closedByClient=!1,this.clearReconnectTimer();let $=new URL(this.currentUrl),J=this.options.authToken?.trim()||k0($,{skipRegistry:Boolean(this.options.resolveConnectionHeaders)});if($.hash="",J&&this.options.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");let Z=++this.connectGeneration,X=this.openSocket($,J,Z),Q;this.connectPromise=X.then(async(V)=>{if(Q=V,await this.commandOnce("client.register",{clientId:this.clientId,clientType:this.options.clientType??"core",displayName:this.options.displayName??"core",transport:"native",actorKind:"client",capabilities:this.capabilities,metadata:{...this.options.metadata,version:this.options.clientVersion??String(g.version),pid:process.pid},workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),Z!==this.connectGeneration||this.closedByClient){try{V.close()}catch{}throw this.lastCloseError}this.registered=!0;for(let Y of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(Y));this.reconnectAttempt=0});let j=this.connectPromise;try{await j}catch(V){if(this.connectPromise===j)this.connectPromise=void 0;if(Q&&this.socket===Q){this.lastCloseError=y1(V,$),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{Q.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw V}}async openSocket($,J,Z){let X=this.options.resolveConnectionHeaders,Q;if(X){let W;try{Q=await Promise.race([Promise.resolve().then(()=>X()),new Promise((F,G)=>{W=setTimeout(()=>{G(new R("hub_connect_timeout",`Timed out resolving hub connection headers after ${Z0}ms`))},Z0)})])}catch(F){let G=F instanceof R?F:new R("hub_connect_failed",F instanceof Error?F.message:String(F));if(Z===this.connectGeneration)this.lastCloseError=G;throw G}finally{clearTimeout(W)}}if(Z!==this.connectGeneration||this.closedByClient)throw this.lastCloseError;if(Q&&Object.keys(Q).some((W)=>W.toLowerCase()==="sec-websocket-protocol")){let W=new R("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(Z===this.connectGeneration)this.lastCloseError=W;throw W}let j=Q?new p6($.toString(),{headers:{...Q}}):new(u6())($.toString(),J?[`${a6}${J}`]:void 0);this.socket=j;let V=!1,Y=new Promise((W,F)=>{let G=!1,N=setTimeout(()=>{if(G)return;G=!0,V=!0;let z=new R("hub_connect_timeout",`Timed out connecting to hub after ${Z0}ms`);if(this.socket===j)this.lastCloseError=z,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{j.close()}catch{}F(z)},Z0);j.addEventListener("open",()=>{if(G)return;G=!0,clearTimeout(N),W()}),j.addEventListener("error",(z)=>{if(G)return;G=!0,clearTimeout(N);let L=y1(z,$);if(this.socket===j)this.lastCloseError=L,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;F(L)}),j.addEventListener("close",(z)=>{if(G)return;G=!0,clearTimeout(N);let L=V?this.lastCloseError:k1(z);if(this.socket===j){if(!V)this.lastCloseError=L,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}F(L)})});return j.addEventListener("message",(W)=>{this.handleFrame(JSON.parse(m1(W)))}),j.addEventListener("close",(W)=>{if(this.socket!==j)return;if(!V)this.lastCloseError=k1(W),this.sawSocketClose=!0;this.registered=!1;for(let F of this.pendingReplies.values())F.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await Y,j}subscribe($,J){let Z=J?.sessionId?.trim()||void 0,X={listener:$,sessionId:Z};return this.listeners.add(X),this.adjustSubscriptionCount(Z,1),()=>{if(!this.listeners.delete(X))return;this.adjustSubscriptionCount(Z,-1)}}async command($,J,Z,X){let Q=0,j=$!=="client.register"&&$!=="client.unregister";while(!0)try{return await this.commandOnce($,J,Z,X)}catch(V){if(!j||Q>=1||!await this.recoverLocalHubTransport(V))throw V;Q+=1}}async commandOnce($,J,Z,X,Q=!0){if(Q)await this.connect();X?.beforeDispatch?.();let j=v6("hubreq_");X?.onDispatch?.(j);let V=I6($,X?.timeoutMs),Y=new Promise((F,G)=>{let N=V===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(j))return;G(new w0($,"hub_command_timeout",`Hub command ${$} timed out after ${V}ms (hub=${this.currentUrl}, requestId=${j}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},V);this.pendingReplies.set(j,{resolve:(z)=>{if(N)clearTimeout(N);F(z)},reject:(z)=>{if(N)clearTimeout(N);G(z)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:$,requestId:j,clientId:this.clientId,sessionId:Z,timeoutMs:V,payload:J}})}catch(F){throw this.pendingReplies.delete(j),F}let W=await Y;if(!W.ok){if(W.error?.code===j1){let F=Z??(typeof J?.sessionId==="string"?J.sessionId:void 0);throw new s(F,W.error.message)}throw new w0($,W.error?.code,W.error?.message??`Hub command ${$} failed`)}return W}async recoverLocalHubTransport($){if(!h1(this.currentUrl)||!r6($))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let J=await v1({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!J)return!1;return this.currentUrl=J,this.close(),!0})().finally(()=>{this.recoveryPromise=void 0}),await this.recoveryPromise}hasActiveSubscriptions(){return this.subscriptionCounts.size>0}clearReconnectTimer(){if(!this.reconnectTimer)return;clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0}scheduleReconnect(){if(this.reconnectTimer||this.closedByClient||!this.hasActiveSubscriptions())return;let $=Math.min(i6*2**this.reconnectAttempt,t6),J=Math.round($*(1-g1)+Math.random()*$*g1);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},J)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!h1(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let $=await v1({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd});if($){this.currentUrl=$,await this.connect(),this.reconnectAttempt=0;return}}catch{}this.reconnectAttempt+=1,this.scheduleReconnect()}}close(){let $=this.socket;if(this.closedByClient=!0,this.connectGeneration+=1,this.clearReconnectTimer(),this.registered=!1,$)this.lastCloseError=new R("hub_connection_closed",T0);for(let J of this.pendingReplies.values())J.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,!$)return;this.sawSocketClose=!1,this.socket=void 0;try{$.close()}catch{}}async dispose(){if(this.socket?.readyState===1&&this.registered)try{await this.command("client.unregister",void 0,void 0,{timeoutMs:2000})}catch{}this.close()}sendFrame($){if(!this.socket||this.socket.readyState!==1){if(this.lastCloseError.code==="hub_connection_closed"&&!this.sawSocketClose)throw new R("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify($))}sendSubscriptionFrame($,J){let Z=$==="stream.subscribe"?this.lastEventSequenceByKey.get(this.subscriptionKeyForSessionId(J)):void 0;this.sendFrame({kind:$,clientId:this.clientId,...J?{sessionId:J}:{},...Z!==void 0?{sinceSequence:Z}:{}})}adjustSubscriptionCount($,J){let Z=this.subscriptionKeyForSessionId($),X=(this.subscriptionCounts.get(Z)??0)+J;if(X<=0){if(this.subscriptionCounts.delete(Z),!this.hasActiveSubscriptions())this.clearReconnectTimer();if(J<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",$);return}if(this.subscriptionCounts.set(Z,X),J>0&&X===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",$)}subscriptionKeyForSessionId($){return $??E0}subscriptionSessionIdFromKey($){return $===E0?void 0:$}handleFrame($){switch($.kind){case"reply":{let J=$.envelope.requestId;if(!J)return;let Z=this.pendingReplies.get(J);if(!Z)return;this.pendingReplies.delete(J),Z.resolve($.envelope);return}case"event":{let J=$.envelope.sequence;if(typeof J==="number"){let Z=$.envelope.sessionId?.trim();for(let X of[E0,Z]){if(!X||!this.subscriptionCounts.has(X))continue;let Q=this.lastEventSequenceByKey.get(X)??0;if(J>Q)this.lastEventSequenceByKey.set(X,J)}}for(let Z of this.listeners){if(Z.sessionId&&Z.sessionId!==$.envelope.sessionId?.trim())continue;Z.listener($.envelope)}return}case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function p1($){let J=new URL($);if(J.protocol==="http:")J.protocol="ws:";else if(J.protocol==="https:")J.protocol="wss:";return J.toString()}async function w($,J){let Z=new a({url:$,authToken:J?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:J?.workspaceRoot,cwd:J?.cwd});try{return await Z.connect(),!0}catch{return!1}finally{Z.close()}}async function f0($,J){let Z=p1($),X=await e(Z,{authToken:J?.authToken});if(!X)return{status:"unreachable",url:Z};if(J?.requireCurrentBuild){let Q=h(),j=n(X,Q);if(!j.compatible&&!o(X))return{status:j.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:Z}}else if(!S6(X).compatible)return{status:"protocol_mismatch",url:Z};if(J?.verifyConnection===!0&&!await w(Z,{workspaceRoot:J.workspaceRoot,cwd:J.cwd,authToken:J.authToken}))return{status:"unreachable",url:Z};return{status:"compatible",url:Z}}function n6($){let J=$&&typeof $==="object"&&Array.isArray($.sessions)?$.sessions:[],Z=0,X=new Set;for(let Q of J){if(!Q||typeof Q!=="object")continue;let j=Q.participants;if(!Array.isArray(j)||j.length===0)continue;Z+=1;for(let V of j){let Y=V&&typeof V==="object"?V.clientId:void 0;if(typeof Y==="string"&&Y.trim())X.add(Y)}}return{activeSessionCount:Z,participantClientCount:X.size}}async function x0($,J,Z){let X=new a({url:$,authToken:J,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:Z?.workspaceRoot,cwd:Z?.cwd});try{let Q=await X.command("session.list",{limit:500},void 0,{timeoutMs:d6});return n6(Q.payload)}finally{await X.dispose().catch(()=>{return})}}async function o6($,J,Z){try{return(await x0($,J,Z)).activeSessionCount===0}catch{return!1}}async function e6($,J){let Z=`${$.discoveryPath}.superseded`,X=await b(Z);if(!X?.url||!X.authToken)return;let Q=await f0(X.url,{authToken:X.authToken});if(Q.status!=="compatible")return;if(await o6(Q.url,X.authToken,J))return;return J0(Q.url,X.authToken)}async function $4($={}){if($.endpoint?.trim()){let Q=await f0($.endpoint);return Q.status==="compatible"?Q.url:void 0}let J=l6(),Z=await b(J.discoveryPath);if(!Z?.url)return await e6(J,$);let X=await f0(Z.url,{authToken:Z.authToken,requireCurrentBuild:!0});if(X.status==="compatible")return J0(X.url,Z.authToken);if(X.status==="protocol_mismatch")await v(J.discoveryPath).catch(()=>{return});return}async function v1($={}){let J=await $4($);if(J&&await w(J,{workspaceRoot:$.workspaceRoot,cwd:$.cwd}))return J;if($.endpoint?.trim())return;try{return(await w1($.workspaceRoot??process.cwd())).url}catch(Z){$.onStartupError?.(Z);return}}async function c($,J,Z,X){S1();let Q=new URL($),j=J?.trim()||k0(Q);if(Q.protocol==="ws:")Q.protocol="http:";else if(Q.protocol==="wss:")Q.protocol="https:";if(Q.pathname="/drain",Q.hash="",Z)Q.searchParams.set("reason",Z);if(X?.off)Q.searchParams.set("off","1");return(await fetch(Q,{method:"POST",headers:j?{authorization:`Bearer ${j}`}:void 0})).ok}async function b1($,J){S1();let Z=new URL($),X=J?.trim()||k0(Z);if(Z.protocol==="ws:")Z.protocol="http:";else if(Z.protocol==="wss:")Z.protocol="https:";return Z.pathname="/shutdown",Z.hash="",(await fetch(Z,{method:"POST",headers:X?{authorization:`Bearer ${X}`}:void 0})).ok}function J4($,J){if(!$||typeof $!=="object")return;let Z=$,X=typeof Z.id==="string"?Z.id.trim():"";if(!X)return;let Q=typeof Z.display_name==="string"?Z.display_name.trim():typeof Z.displayName==="string"?Z.displayName.trim():"",j=typeof Z.name==="string"?Z.name.trim():"";return{id:X,name:Q||j||X,catalogId:J}}function y0($,J){return Array.isArray($)?$.flatMap((Z)=>{let X=J4(Z,J);return X?[X]:[]}):[]}async function l1($,J={}){let Z=$.trim(),X=Z.length;while(X>0&&Z[X-1]==="/")X--;let Q=Z.slice(0,X),j=async(_)=>{let O=await(J.fetchImpl??fetch)(`${Q}${_}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(1e4)});if(!O.ok)throw Error(`HTTP ${O.status}`);return await O.json()},V,Y;try{[V,Y]=await Promise.all([j("/api/v1/ai/cline/models"),j("/api/v1/ai/cline/recommended-models")])}catch(_){throw Error("Could not load the cloud model catalog.",{cause:_})}let W=V&&typeof V==="object"?V:void 0,F=y0(Array.isArray(V)?V:W?.data,"cline"),G=Y&&typeof Y==="object"?Y:void 0,N=G?.data&&typeof G.data==="object"?G.data:G,z=y0(N?.clinePass,"cline-pass"),L=y0(N?.clineCloud,"cline-cloud"),K=new Set;return[...J.isOrganizationSession?[]:z,...L,...F].filter((_)=>{if(K.has(_.id))return!1;return K.add(_.id),!0})}import{formatDisplayUserInput as u1}from"@cerebriline/shared";var Z4=new Set(["auto_compaction","compaction_budget_emergency","completion_reminder","loop_detection_notice","manual_compaction","mistake_stop_notice","recovery_notice"]);function X4($){switch($){case"user":case"assistant":case"tool":case"system":case"status":case"error":return $;default:return"assistant"}}function Q4($){return $.metadata&&typeof $.metadata==="object"&&!Array.isArray($.metadata)?$.metadata:void 0}function j4($){let J=$?.userRunSpan;return typeof J==="number"&&Number.isInteger(J)&&J>=0?J:void 0}function V4($){if(typeof $.content==="string")return{hasAttachment:!1,text:$.content};if(!Array.isArray($.content))return{hasAttachment:!1,text:"unknown"};let J=!1,Z=!1,X=[];for(let Q of $.content){if(!Q||typeof Q!=="object"||Array.isArray(Q))continue;let j=Q;if(j.type==="text"&&typeof j.text==="string")X.push(j.text);else if(j.type==="tool_result"||j.type==="tool-result")Z=!0;else if(j.type==="file"||j.type==="image")J=!0}return{hasAttachment:J&&!Z,text:X.join(`
11
- `)}}function Y4($){let J=u1($);return J.startsWith("[TASK RESUMPTION]")||J==="The user approved switching to act mode. Continue with the approved plan now."}function W4($){if(X4($.role)!=="user")return 0;let J=Q4($),Z=typeof J?.kind==="string"?J.kind:void 0,X=j4(J);if(Z==="compaction"||Z==="compaction_summary")return X??1;if(X!==void 0)return X;if(Z&&Z4.has(Z))return 0;let Q=V4($);if(!Q.hasAttachment&&!u1(Q.text))return 0;if(!Q.hasAttachment&&Y4(Q.text))return 0;return 1}function c1($){return W4($)>0}function V0($){return Array.isArray($?.sessions)?$.sessions.filter((J)=>Boolean(J)&&typeof J==="object"&&!Array.isArray(J)):[]}function g0($){let J=$.updatedAt;return typeof J==="number"?J:Date.parse(String(J??""))||0}function h0($){let J=$?.metadata&&typeof $.metadata==="object"?$.metadata:void 0;return String(J?.model??$?.model??"").trim()}function Y0($){let J=$.metadata&&typeof $.metadata==="object"?$.metadata:void 0;return!String(J?.parentSessionId??$.parentSessionId??"").trim()}function t1($,J="text"){if(!$||typeof $!=="object"||Array.isArray($))return"";let Z=$.content;if(typeof Z==="string")return J==="text"?Z.trim():"";if(!Array.isArray(Z))return"";return Z.map((X)=>X&&typeof X==="object"&&!Array.isArray(X)?J==="thinking"&&X.type==="redacted_thinking"?"[redacted]":String(X[J]??""):"").join("").trim()}function Q0($){let J=$.trim(),Z=J.match(/^<user_input\b[^>]*>([\s\S]*)<\/user_input>$/);return(Z?Z[1]:J).trim()}function d($,J,Z){let X=Q0(Z);return $.filter((Q)=>Boolean(Q)&&typeof Q==="object"&&!Array.isArray(Q)&&String(Q.role??"").toLowerCase()==="user"&&(X!==""||c1(Q))&&Q0(t1(Q))===X).length+J.filter((Q)=>Q0(Q.prompt)===X).length}function v0($){return $.flatMap((J)=>{if(J.event!=="session.pending_prompt_submitted")return[];let Z=J.payload?.prompt&&typeof J.payload.prompt==="object"&&!Array.isArray(J.payload.prompt)?J.payload.prompt:void 0,X=String(Z?.id??"").trim();if(!X)return[];return[{id:X,prompt:String(Z?.prompt??""),steer:Z?.delivery==="steer",attachmentCount:typeof Z?.attachmentCount==="number"?Z.attachmentCount:0,userImages:Array.isArray(Z?.userImages)?Z.userImages.filter((Q)=>typeof Q==="string"):void 0}]})}var N4=new Set(["run.completed","run.aborted","run.failed"]),F4=new Set(["assistant.delta","assistant.finished","reasoning.delta","reasoning.finished"]);function a1($,J){return $.filter((Z)=>Boolean(Z)&&typeof Z==="object"&&!Array.isArray(Z)&&String(Z.role??"").toLowerCase()==="assistant").map((Z)=>t1(Z,J)).filter(Boolean)}function d1($,J,Z="text"){let X=new Map;for(let Q of a1(J,Z))X.set(Q,(X.get(Q)??0)+1);return a1($,Z).filter((Q)=>{let j=X.get(Q)??0;if(j===0)return!0;if(j===1)X.delete(Q);else X.set(Q,j-1);return!1})}function j0($,J,Z=new Set){if(!$||typeof $!=="object")return Z;if(Array.isArray($)){for(let j of $)j0(j,J,Z);return Z}let X=$,Q=J==="tool_use"?X.id:X.tool_use_id;if(X.type===J&&typeof Q==="string")Z.add(Q);for(let j of Object.values(X))j0(j,J,Z);return Z}function i1($,J="assistant"){let Z="",X="";for(let Q of $)if(Q.event===`${J}.delta`)X+=J==="reasoning"&&Q.payload?.redacted&&!Q.payload?.text?"[redacted]":typeof Q.payload?.text==="string"?Q.payload.text:"";else if(Q.event===`${J}.finished`){let j=Q.payload?.[J==="assistant"?"text":"reasoning"],V=typeof j==="string"&&j?j:X;if(V)Z=V;X=""}return(Z||X).trim()}function r1($,J,Z={}){let X=Z.queueSnapshotApplied!==!1,Q=d1(J,Z.baselineMessages??[]),j=d1(J,Z.baselineMessages??[],"thinking"),V=j0(J,"tool_use"),Y=j0(J,"tool_result"),W=new Set($.slice(0,Z.messagesSnapshotEventCutoff??$.length)),F=new Set,G=new Map;for(let O of $.slice(0,Z.messagesSnapshotEventCutoff??$.length)){let B=v0([O])[0];if(!B)continue;let D=Q0(B.prompt),H=G.get(D)??Math.max(0,d(J,[],D)-d(Z.baselineMessages??[],[],D));if(G.set(D,Math.max(0,H-1)),H>0)F.add(O)}let z=[...X?$.slice(Z.queueSnapshotEventCutoff??$.length):$].reverse().find((O)=>O.event==="session.pending_prompts"),L=[],K=[],_=(O)=>{if(K.length===0)return;let B=K.filter((x)=>W.has(x)),D=(x)=>{if(!O)return-1;let M=[...B].reverse().findIndex((J2)=>J2.event===`${x}.finished`),S=M<0?-1:B.length-1-M;return S>=0||K.at(-1)?.event==="run.aborted"?S:B.length-1},H=D("assistant"),f=D("reasoning"),A=i1(B.slice(0,H+1)),P=A?Q.findIndex((x)=>x.endsWith(A)):-1,k=P>=0;if(k)Q.splice(P,1);let i=i1(B.slice(0,f+1),"reasoning"),K0=i?j.findIndex((x)=>x.endsWith(i)):-1;if(K0>=0)j.splice(K0,1);for(let[x,M]of K.entries()){if(F.has(M)){L.push({...M,payload:{...M.payload,transcriptReflected:!0}});continue}if(W.has(M)&&F4.has(M.event)&&(M.event.startsWith("reasoning.")?K0>=0&&x<=f:k&&x<=H))continue;if(M.event==="session.pending_prompts"&&M!==z)continue;if(W.has(M)&&M.event.startsWith("tool.")){let S=String(M.payload?.toolCallId??"").trim();if(Y.has(S)||M.event==="tool.started"&&V.has(S))continue}L.push(M)}K=[]};for(let O of $)if(K.push(O),N4.has(O.event))_(!0);return _(!1),L}import{formatDisplayUserInput as K4}from"@cerebriline/shared";function W0($){let J=structuredClone($),Z=(X)=>{if(!X||typeof X!=="object"||Object.isFrozen(X))return;for(let Q of Object.values(X))Z(Q);Object.freeze(X)};return Z(J),J}function N0($){let J=$?.trim();return J?K4(J).slice(0,120):void 0}function S0($){if(typeof $==="string")return $;if(Array.isArray($)){let J=[];for(let Z of $){if(typeof Z==="string"){if(Z.trim())J.push(Z);continue}if(!Z||typeof Z!=="object")continue;let X=Z,Q=typeof X.type==="string"?X.type:"",j=Q==="text"?String(X.text??""):Q==="thinking"?String(X.thinking??""):Q==="tool_use"?`[tool] ${String(X.name??"tool_call")}`:Q==="tool_result"?`[tool_result]
12
- ${S0(X.content)}`:Q==="image"?"[image]":Q==="redacted_thinking"?"[redacted_thinking]":typeof X.text==="string"?X.text:"";if(j.trim())J.push(j)}return J.join(`
13
- `)}if($&&typeof $==="object"){let J=$;if(typeof J.text==="string")return J.text}return""}function L4($){let J=N0($??void 0);if(!J)return;return J.split(`
14
- `)[0]?.trim().slice(0,70)||void 0}function G4($){for(let J of["user","assistant"])for(let Z of $){if(!Z||typeof Z!=="object")continue;let X=Z;if(X.role!==J)continue;let Q=N0(S0(X.content));if(!Q)continue;return Q.split(`
15
- `)[0]?.trim().slice(0,70)||void 0}return}function m0($){let J=$.metadata&&typeof $.metadata==="object"?N0($.metadata.title):void 0;if(J)return J.slice(0,70);let Z=L4($.prompt);if(Z)return Z;let X=$.messages?G4($.messages):void 0;if(X)return X;return`Session ${$.sessionId.slice(-6)}`}function s1($,J,Z,X){let Q=J.payload??{},j=()=>{let Y=Z.get(X);if(Y===void 0||!$.messages[Y]||$.messages[Y]?.role!=="assistant")Y=$.messages.length,$.messages.push({role:"assistant",content:[]}),Z.set(X,Y);let W=$.messages[Y];if(!Array.isArray(W.content))W.content=[];return W.content},V=(Y,W,F)=>{let G=j(),N=G.at(-1);if(N?.type===Y)N[W]=`${N[W]??""}${F}`;else G.push({type:Y,[W]:F})};switch(J.event){case"assistant.delta":if(typeof Q.text==="string")V("text","text",Q.text);return;case"reasoning.delta":if(typeof Q.text==="string"&&Q.text)V("thinking","thinking",Q.text);else if(Q.redacted===!0)j().push({type:"redacted_thinking",data:""});return;case"assistant.finished":Z.delete(X);return;case"assistant.media":if(Q.media)j().push({type:"media",media:structuredClone(Q.media)});return;case"tool.started":{let Y=String(Q.toolCallId??"");if(Y&&!$.messages.some((W)=>Array.isArray(W.content)&&W.content.some((F)=>F.type==="tool_use"&&F.id===Y)))j().push({type:"tool_use",id:Y,name:String(Q.toolName??"tool"),input:structuredClone(Q.input??{})});return}case"tool.finished":{let Y=String(Q.toolCallId??"");if(Y&&!$.messages.some((W)=>Array.isArray(W.content)&&W.content.some((F)=>F.type==="tool_result"&&F.tool_use_id===Y)))$.messages.push({role:"user",content:[{type:"tool_result",tool_use_id:Y,content:typeof Q.output==="string"?Q.output:JSON.stringify(Q.output??""),is_error:Boolean(Q.error)}]}),Z.delete(X);return}case"usage.updated":$.usage=structuredClone(Q.totals??Q.delta??{});return;case"session.pending_prompts":{let Y=Array.isArray(Q.prompts)?Q.prompts:[];$.promptsInQueue=Y.map((W)=>({id:String(W.id??""),prompt:String(W.prompt??""),steer:W.delivery==="steer",attachmentCount:typeof W.attachmentCount==="number"?W.attachmentCount:0,userImages:Array.isArray(W.userImages)?W.userImages.filter((F)=>typeof F==="string"):void 0})).filter((W)=>W.id&&(W.prompt||W.attachmentCount));return}case"session.pending_prompt_submitted":{let Y=Q.prompt,W=String(Y?.id??"");if(!W||$.lastQueuedPromptStartId===W)return;if($.lastQueuedPromptStartId=W,$.promptsInQueue=$.promptsInQueue.filter((F)=>F.id!==W),Q.transcriptReflected!==!0)$.messages.push({role:"user",content:[{type:"text",text:String(Y?.prompt??"")}]});$.busy=!0,$.status="running",$.endedAt=void 0,Z.delete(X);return}case"run.started":case"session.attached":case"session.updated":{if(typeof J.sequence==="number"&&$.lastHubStatusSequence!==void 0&&J.sequence<$.lastHubStatusSequence)return;if(typeof J.sequence==="number")$.lastHubStatusSequence=J.sequence;let Y=Q.session,W=typeof Y?.status==="string"?Y.status:J.event==="run.started"?"running":$.status,F=W==="pending"?"running":W;if(J.event==="session.updated"&&F==="running"&&$.endedAt!==void 0&&!$.busy)return;let G=$.busy;if($.status=F,$.busy=F==="running",J.event==="run.started"){if(!G)Z.delete(X);$.endedAt=void 0}return}case"run.completed":case"run.failed":case"run.aborted":{if(typeof J.sequence==="number"&&$.lastHubStatusSequence!==void 0&&J.sequence<$.lastHubStatusSequence)return;if(typeof J.sequence==="number")$.lastHubStatusSequence=J.sequence;$.status=typeof Q.reason==="string"?Q.reason:J.event==="run.failed"?"error":J.event==="run.aborted"?"aborted":"completed",$.busy=!1,$.endedAt=Date.now(),Z.delete(X);return}}}function I0($){return $ instanceof Error&&$.name==="HubTransportError"&&["hub_connect_timeout","hub_connect_failed","hub_connection_closed","hub_connection_not_open"].includes(String($.code))}function p0($,J){return $ instanceof Error&&$.name==="HubCommandError"&&$.code==="hub_command_timeout"&&(!J||$.command===J)}var U="/workspace",_4=30000,q4=2000,O4=2000,n1="IMPORTANT: GitHub authentication is handled automatically by the infrastructure. An egress proxy transparently injects credentials into all GitHub traffic. You do NOT need to set up, configure, or manage any tokens, API keys, or credentials, and you must never run `gh auth login` or attempt to authenticate manually. "+"The GitHub CLI (`gh`) is installed and already authenticated — prefer it for GitHub work "+"(`gh pr create`, `gh pr diff`, `gh issue list`, `gh api`, ...). `git` push and pull are authenticated the same way. "+"Simply run the commands normally — credentials are injected transparently.";function l0($){if(!$)return U;if(F0.isAbsolute($)||$.includes("\\")||$.split("/").some((Z)=>!Z||Z==="."||Z===".."))throw new q("request_failed","The handoff workspace path must stay inside the repository.");let J=F0.join(U,$);if(!J.startsWith(`${U}/`))throw new q("request_failed","The handoff workspace path must stay inside the repository.");return J}function i0($){let J=$.metadata.cwd;return typeof J==="string"&&F0.normalize(J)===J&&(J===U||J.startsWith(`${U}/`))?J:U}function o1($){let J=$?.metadata&&typeof $.metadata==="object"?$.metadata:void 0,Z=J?.handoff&&typeof J.handoff==="object"?J.handoff:void 0;return String(Z?.sourceSessionId??"").trim()}class a0 extends Error{constructor($){super($ instanceof Error?$.message:"Cloud conversation creation was not dispatched.",{cause:$});this.name="CloudHandoffSeedRejectedError"}}class d0 extends q{constructor(){super("request_failed","The connection was interrupted and Cline could not confirm whether this message was queued. Check the cloud session before resending it.");this.name="CloudQueueUnconfirmedError"}}class $2 extends Error{constructor(){super("The cloud session was created, but its transcript was not persisted. This cloud runtime cannot durably seed handoff transcripts and must use @cline/core 0.0.72 or newer. Updating the cloud runtime or pod is required; retrying /cloud against this same pod will not help.");this.name="CloudHandoffSeedUnsupportedError"}}function E($){let J=$.expiredAt?Date.parse($.expiredAt):Number.NaN;return Number.isFinite(J)&&J<=Date.now()}function A4($){return $.trim().startsWith("ses-")}function B4($,J){let Z=new URL(`/api/v1/session/${encodeURIComponent(J)}`,$);return Z.protocol=Z.protocol==="https:"?"wss:":"ws:",Z.toString()}function u0($){return{config:{executionTarget:"cloud",provider:"cline",providerId:"cline",model:$.metadata.modelId??"",modelId:$.metadata.modelId??"",repoUrl:$.repoContext.repoUrl??"",branch:$.repoContext.branch??"",cwd:i0($),workspaceRoot:U},messages:[],promptsInQueue:[],busy:!1,startedAt:Date.parse($.createdAt)||Date.now(),endedAt:E($)&&$.expiredAt?Date.parse($.expiredAt):void 0,status:$.status,attachedViaHub:!0}}function c0($,J,Z){return{sessionId:$.id,origin:"cloud",executionTarget:"cloud",status:J,provider:"cline",model:$.metadata.modelId??"",repoUrl:$.repoContext.repoUrl??"",branch:$.repoContext.branch??"",cwd:i0($),workspaceRoot:U,...Z?.trim()?{prompt:Z.trim()}:{},metadata:{origin:"cloud",repoUrl:$.repoContext.repoUrl??"",git:{url:$.repoContext.repoUrl??"",branch:$.repoContext.branch??""}}}}function e1($){return{sessionId:$.id,origin:"cloud",executionTarget:"cloud",status:$.status,provider:"cline",model:$.metadata.modelId??"",cwd:i0($),workspaceRoot:U,repoUrl:$.repoContext.repoUrl??"",branch:$.repoContext.branch??"",startedAt:$.createdAt,...$.lastActivityAt?{lastActivityAt:$.lastActivityAt}:{},endedAt:E($)?$.expiredAt??void 0:$.status==="failed"?$.lastActivityAt??$.createdAt:void 0,updatedAt:$.updatedAt,...$.title?.trim()?{title:$.title.trim()}:{},metadata:{...$.title?.trim()?{title:$.title.trim()}:{},origin:"cloud",...$.metadata.provisioningPhase?{provisioningPhase:$.metadata.provisioningPhase}:{},repoUrl:$.repoContext.repoUrl??"",git:{url:$.repoContext.repoUrl??"",branch:$.repoContext.branch??""}}}}function D4($){if(typeof $!=="string")return $;try{return JSON.parse($)}catch{return $}}function U4($,J){let Z=[...$??[]],X=new Set(Z.map((Q)=>Q.id));for(let Q of J)if(!X.has(Q.id))Z.push(Q);return Z}class M4{options;sessionGenerations=new Map;sessions=new Map;approvals=new Map;listeners=new Set;detachedSessions=new Set;restoredOptions=new Map;authoritativeMessages=new Map;streamingMessages=new Map;disposed=!1;connections=new Map;connectionPromises=new Map;knownSessions=new Map;unlistedSessions=new Map;pendingInitialTasks;lastListedSessions=[];discoveryRefresh;unconfirmedInnerCreates=new Set;createRequests=new Map;provisioningControllers=new Map;sendAbortTokens=new Map;titleWrites=new Map;deletingSessions=new Set;createHubClient;constructor($){this.options=$;this.pendingInitialTasks=$.pendingInitialTasks??new Map,this.createHubClient=$.createHubClient??((J)=>new a(J))}restoreCreationOptions($,J){if(this.restoredOptions.set($,structuredClone(J)),this.pendingInitialTasks.has($))this.pendingInitialTasks.set($,{...this.pendingInitialTasks.get($),...structuredClone(J)});let Z=this.sessions.get($);if(Z)Object.assign(Z.config,structuredClone(J))}seedSessionState($,J){if(!this.sessions.has($))this.sessions.set($,structuredClone(J))}stateFromRecord($){let J=u0($);return Object.assign(J.config,this.pendingInitialTasks.get($.id),this.restoredOptions.get($.id)),J}getSnapshot($){let J=this.knownSessions.get($),Z=this.sessions.get($)??(J?this.stateFromRecord(J):void 0);if(!Z)return;let X=this.connections.get($);return W0({...Z,sessionId:$,record:J,approvals:Array.from(this.approvals.values()).filter((Q)=>Q.item.sessionId===$).map((Q)=>Q.item),connectionState:this.detachedSessions.has($)||this.disposed?"detached":X?.reconnectResolution||X?.rehydrationPromise?"reconnecting":X?X.connected?"connected":X.reconnecting?"reconnecting":"connecting":this.connectionPromises.has($)?"connecting":"detached",transcriptKnown:X?.transcriptKnown??Boolean(J&&E(J))})}subscribe($,J){let Z=(X)=>{if(!J||X.sessionId===J)$(X)};return this.listeners.add(Z),()=>{this.listeners.delete(Z)}}publish($){let J=$.type==="snapshot"?Object.freeze($):W0($);for(let Z of this.listeners)try{Z(J)}catch(X){this.options.logger?.error?.("Cloud session subscriber failed",{error:X})}}publishSnapshot($,J=!1,Z){this.cancelScheduledSnapshot($);let X=this.getSnapshot($);if(X)this.publish({type:"snapshot",sessionId:$,snapshot:X,replace:J,cause:Z});else this.publish({type:"removed",sessionId:$})}snapshotTimers=new Map;cancelScheduledSnapshot($){clearTimeout(this.snapshotTimers.get($)),this.snapshotTimers.delete($)}scheduleSnapshot($){if(this.disposed||this.detachedSessions.has($)||this.snapshotTimers.has($))return;let J=setTimeout(()=>this.publishSnapshot($),100);J.unref?.(),this.snapshotTimers.set($,J)}notify($,J){let Z=String(J.sessionId??"");if($==="cloud_session_sync_failed")this.publish({type:"sync_failed",sessionId:Z,message:String(J.message??"Cloud synchronization failed")});else this.publishSnapshot(Z,$==="cloud_session_rehydrated",$==="chat_session_status"?"status":$==="chat_session_ended"?"ended":$==="tool_approval_state"?"approvals":void 0)}applyLiveEvent($,J){let Z=this.sessions.get($);if(Z)s1(Z,J,this.streamingMessages,$)}async respondApproval($,J,Z){this.assertSessionActive($);let X=this.approvals.get(`${$}:${J}`);if(!X){if(!this.connections.has($))throw Error("This cloud session connection is closed; reopen the session to respond.");throw new q("request_failed","This approval was already resolved or is no longer available.")}await X.resolve(Z)}async detach($){this.detachedSessions.add($),this.sessionGenerations.set($,(this.sessionGenerations.get($)??0)+1),this.connectionPromises.delete($),this.sendAbortTokens.set($,Symbol()),this.abortProvisioningControllers($,Error("Cloud viewer detached")),await this.disposeConnection($),this.publishSnapshot($)}isCloudSession($){return A4($)||this.knownSessions.has($)||this.connections.has($)||this.sessions.get($)?.config.executionTarget==="cloud"}getCachedDiscoveryRecord($){let J=this.knownSessions.get($);return J?e1(J):void 0}async getCrossScopeDiscoveryRecord($){let J=this.getCachedDiscoveryRecord($);if(!J)return;try{let X=(await this.options.api.status($)).status?.trim();return X?{...J,status:X}:J}catch(Z){if(Z instanceof q&&(Z.code==="session_not_found"||Z.code==="session_expired")){this.knownSessions.delete($),this.unlistedSessions.delete($),this.pendingInitialTasks.delete($);return}return J}}async list(){if(this.disposed)throw Error("Cloud session controller was disposed");let $=(V)=>this.sessions.get(V)?.title??this.knownSessions.get(V)?.title,J=new Map([...this.knownSessions.keys(),...this.sessions.keys()].map((V)=>[V,$(V)])),Z=(V)=>{let Y=$(V.id);if(this.titleWrites.has(V.id)||Y!==J.get(V.id))V.title=Y??V.title},X=await this.resolveActiveOrganizationId(),Q=(await this.options.api.list(X)).map((V)=>this.preserveConnectedRuntimeModel(V));if(this.disposed)throw Error("Cloud session controller was disposed");this.lastListedSessions=Q;for(let V of Q)Z(V),this.knownSessions.set(V.id,V),this.unlistedSessions.delete(V.id);await Promise.all(Array.from(this.unlistedSessions.keys(),(V)=>this.getCrossScopeDiscoveryRecord(V)));let j=await Promise.all(Q.map(async(V)=>{if(V.status!=="provisioning")return V;let Y=await this.options.api.status(V.id).catch(()=>{return}),W=Y?.status?.trim();if(!W)return V;return{...V,status:W,metadata:{...V.metadata,...A0(Y?.phase)?{provisioningPhase:Y?.phase}:{},...Y?.statusReason?.trim()?{statusReason:Y.statusReason.trim()}:{}}}}));if(this.disposed)throw Error("Cloud session controller was disposed");for(let V of j){Z(V),this.knownSessions.set(V.id,V);let Y=this.sessions.get(V.id);if(Y)Y.title=V.title;if(Y?.status==="provisioning"&&V.status!=="provisioning")Y.status=V.status;let W=this.connections.get(V.id);if(W)W.remote=V;let F=E(V);if(F||V.status==="failed"||V.status==="suspended"){if(Y)Y.busy=!1,Y.status=F?"expired":V.status,Y.endedAt=F?Date.parse(V.expiredAt??"")||Date.now():Math.max(Y.endedAt??0,Date.parse(V.lastActivityAt??V.createdAt)||0)||void 0;if(W)this.disposeConnection(V.id).catch(()=>{return})}}this.lastListedSessions=j;for(let V of j)if(this.sessions.has(V.id))this.publishSnapshot(V.id);return W0(j)}async handoffTargetExists($){try{return await this.options.api.status($),!0}catch(J){if(J instanceof q&&(J.code==="session_not_found"||J.code==="session_expired"))return!1;throw J}}preserveConnectedRuntimeModel($){let J=this.connections.get($.id)?.remote.metadata,Z=J?.cwd??this.knownSessions.get($.id)?.metadata.cwd;return{...$,metadata:{...$.metadata,...J?.modelId?{modelId:J.modelId}:{},...Z?{cwd:Z}:{}}}}async resolveActiveOrganizationId($){return await this.options.getActiveOrganizationId?.($)}async listRepositories(){return await this.options.api.listRepositories(await this.resolveActiveOrganizationId())}async listModels(){if(this.disposed)throw Error("Cloud session manager was disposed");let $=await this.resolveActiveOrganizationId({fresh:!0}),J=await l1(this.options.apiBaseUrl,{isOrganizationSession:Boolean($)});if(this.disposed)throw Error("Cloud session manager was disposed");return J}async prepareHandoffRepository($){let J=await this.resolveActiveOrganizationId(),Z=await this.options.api.listRepositories(J);if(!Z.connected)throw new q("github_not_connected","Connect GitHub before handing this session off to cloud.",Z.connectUrl);let X=(Q)=>Q.trim().replace(/\.git$/i,"").replace(/\/+$/,"").toLowerCase();if(!Z.repositories.some((Q)=>X(Q.url)===X($)))throw new q("github_not_connected",`The GitHub integration cannot access ${$}. Grant repository access before handing off.`,Z.connectUrl);return J?{organizationId:J}:{}}async listBranches($,J={}){return await this.options.api.listBranches($,await this.resolveActiveOrganizationId(),J)}async listForDiscovery($={}){let J=this.discoveryRefresh??this.list().finally(()=>{if(this.discoveryRefresh===J)this.discoveryRefresh=void 0});this.discoveryRefresh=J;let Z=this.lastListedSessions;if($.timeoutMs===void 0)Z=await J;else{let j,V=await Promise.race([J.then((Y)=>({value:Y}),(Y)=>{if(!(Y instanceof q&&Y.code==="authentication_required"))this.options.logger?.error?.("Cloud session discovery failed",{error:Y});return{value:this.lastListedSessions}}),new Promise((Y)=>{j=setTimeout(()=>Y({value:this.lastListedSessions}),Math.max(0,$.timeoutMs??0))})]);if(j)clearTimeout(j);Z=V.value}return[...new Map([...this.unlistedSessions.values(),...Z].map((j)=>[j.id,j])).values()].map((j)=>{let V=e1(j),Y=this.sessions.get(j.id);if(!Y)return V;let W=Y.title?.trim()||j.title?.trim();return{...V,status:Y.status,prompt:Y.prompt,endedAt:Y.endedAt!==void 0?new Date(Y.endedAt).toISOString():V.endedAt,metadata:{...V.metadata??{},title:m0({sessionId:j.id,metadata:W?{title:W}:void 0,prompt:Y.prompt,messages:Y.messages})}}})}async create($){let J=$.requestId?.trim();if(!J)return await this.createOnce($);let Z=this.createRequests.get(J);if(Z)return await Z;let X=this.createOnce($).finally(()=>{if(this.createRequests.get(J)===X)this.createRequests.delete(J)});return this.createRequests.set(J,X),await X}trackProvisioningController($,J){let Z=this.provisioningControllers.get($);if(!Z)Z=new Set,this.provisioningControllers.set($,Z);return Z.add(J),()=>{if(Z.delete(J),Z.size===0)this.provisioningControllers.delete($)}}abortProvisioningControllers($,J){let Z=this.provisioningControllers.get($);if(!Z?.size)return!1;for(let X of Z)X.abort(J);return!0}async waitUntilReady($){this.detachedSessions.delete($),this.assertSessionActive($);let J=new AbortController,Z=this.trackProvisioningController($,J);try{await this.options.api.waitUntilReady($,AbortSignal.any([J.signal,AbortSignal.timeout(610000)])),J.signal.throwIfAborted(),this.assertSessionActive($),await this.refreshKnownSession($)}finally{Z()}}async seedHandoff($,J){l0(J.workspaceRelativePath),this.detachedSessions.delete($);let Z=await this.ensureConnection($,{createInner:!0,handoffSeed:J});if(!Z.innerSessionId)throw Error("Cloud Hub did not return an inner session id");return{innerSessionId:Z.innerSessionId}}async verifyHandoffTranscript($,J,Z={}){let X=await this.ensureConnection($),Q=X.innerSessionId;if(!Q)throw Error("Cloud Hub did not return an inner session id");let j=await X.client.command("session.messages",{sessionId:Q},Q);this.assertSessionActive($,X);let V=j.payload?.messages;if(!Array.isArray(V))throw Error("Cloud runtime returned no transcript after seeding.");if(J.length>0&&V.length===0)throw new $2;if(!(Z.allowAppendedMessages?V.length>=J.length&&G0(J,V.slice(0,J.length)):G0(J,V)))throw new z0(J.length,V.length);X.transcriptKnown=!0;let W=this.sessions.get($);if(W)W.messages=structuredClone(V),this.authoritativeMessages.set($,structuredClone(V)),this.streamingMessages.delete($),this.publishSnapshot($,!0)}async createOnce($){if(this.disposed)throw Error("Cloud session manager was disposed");let J=l0($.workspaceRelativePath),Z=$.organizationId===void 0?await this.resolveActiveOrganizationId({fresh:!0}):$.organizationId??void 0,X=$.handoff,Q=!X,j=await this.options.api.create({...$,organizationId:Z,...X&&{handoff:{...X,onOuterSessionCreated:async(z,L)=>{Q=L?.created===!0,await X.onOuterSessionCreated(z,L)}}}});if(!j?.sessionId?.trim())throw new q("request_failed","The cloud session service returned an unexpected response; please try again.");if(this.disposed){if(Q&&this.options.lateCreateDisposition==="delete")await this.deleteProvisionedSessionAfterDispose(j.sessionId,j.cleanupAuthToken,$.handoff?.onOuterSessionRemoved);throw Error("Cline account changed while the cloud session was starting")}let V={id:j.sessionId,sandboxType:$.sandboxType,status:j.status,sandboxUrl:j.sandboxUrl,repoContext:{repoUrl:$.repoUrl,...$.branch?.trim()?{branch:$.branch.trim()}:{}},metadata:{modelId:$.modelId,cwd:J},createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};this.knownSessions.set(V.id,V),this.unlistedSessions.set(V.id,V);let{autoApproveTools:Y,thinking:W,reasoningEffort:F}=$;this.pendingInitialTasks.set(V.id,{autoApproveTools:Y,thinking:W,reasoningEffort:F});let G=this.stateFromRecord(V);G.prompt=$.initialPrompt?.trim()||void 0,G.config.mode=$.mode??"act",this.sessions.set(V.id,G);let N;try{if($.handoff){let z=await $.handoff.resolveMessages();this.assertSessionActive(V.id),N=(await this.seedHandoff(V.id,{sourceSessionId:$.handoff.sourceSessionId,messages:z,mode:$.mode,workspaceRelativePath:$.workspaceRelativePath,config:{autoApproveTools:$.autoApproveTools,thinking:$.thinking,reasoningEffort:$.reasoningEffort},onSeeding:$.handoff.onSeeding})).innerSessionId}}catch(z){if(this.disposed&&Q&&this.options.lateCreateDisposition==="delete")await this.deleteProvisionedSessionAfterDispose(V.id,j.cleanupAuthToken,$.handoff?.onOuterSessionRemoved);throw z}return this.assertSessionActive(V.id),this.notify("chat_session_status",{sessionId:V.id,status:G.status}),{sessionId:V.id,origin:"cloud",executionTarget:"cloud",status:V.status,provider:"cline",model:$.modelId,repoUrl:$.repoUrl,branch:$.branch??"",cwd:J,workspaceRoot:U,...N?{innerSessionId:N}:{},...G.prompt?{prompt:G.prompt}:{}}}async deleteProvisionedSessionAfterDispose($,J,Z){this.knownSessions.delete($),this.unlistedSessions.delete($),this.pendingInitialTasks.delete($),this.sessions.delete($),await this.options.api.delete($,J).then(()=>Z?.($)).catch((X)=>{this.options.logger?.log("Failed to clean up a cloud session created during an account change",{sessionId:$,error:X})})}async attach($,J){let Z=this.sessionGenerations.get($)??0;if(this.detachedSessions.delete($),J)this.restoreCreationOptions($,J);let X=await this.ensureKnownSession($);if(this.assertSessionActive($),Z!==(this.sessionGenerations.get($)??0))throw Error("Cloud viewer detached during attachment");if(!this.sessions.has($))this.sessions.set($,this.stateFromRecord(X));if(X.status==="provisioning"||X.status==="failed")return c0(X,X.status,this.sessions.get($)?.prompt);if(E(X))return await this.disposeConnection($),await this.attachExpired(X);let Q;try{Q=await this.ensureConnection($)}catch(Y){let W=await this.refreshKnownSession($);if(W&&E(W))return await this.disposeConnection($),await this.attachExpired(W);throw Y}await this.ensureAttached(Q);let j=Q.remote,V=this.sessions.get($);return c0(j,V?.status??j.status,V?.prompt)}async send($,J,Z,X,Q){let j=this.sendAbortTokens.get($),V=this.knownSessions.get($);if(V&&E(V))throw new q("session_expired","This cloud session has expired; its sandbox is gone. Start a new cloud session to continue.");let Y=await this.ensureConnection($,{createInner:!0}),W=()=>this.disposed||Y.disposed||this.deletingSessions.has($)||this.sendAbortTokens.get($)!==j,F=()=>{if(W())throw Error("Cloud session prompt cancelled")};if(F(),await Y.reconnectResolution,F(),await this.ensureAttached(Y),await Y.reconnectResolution,F(),!Y.transcriptKnown)await this.rehydrateAfterTransportDrop($,Y);F(),await this.updateModel(Y,X),await Y.reconnectResolution,F();let G=Y.innerSessionId;if(!G)throw Error("Cloud Hub session was not initialized");let N=this.sessions.get($),z=Z??(N?.busy?"queue":void 0),L=d(N?.messages??[],N?.promptsInQueue??[],J),K=z!=="queue"&&z!=="steer",_=N&&z!=="queue"?{role:"user",content:[{type:"text",text:J}]}:void 0;if(N&&_)N.messages=[...N.messages,_];let O=()=>{if(N&&_)N.messages=N.messages.filter((A)=>A!==_),this.publishSnapshot($)};if(N&&K){let A=N.status!=="running";if(N.busy=!0,N.status="running",N.prompt||=J,A)this.publishSnapshot($,!1,"status")}let B=this.knownSessions.get($);if(B&&!B.title?.trim()&&!this.titleWrites.has($)){let A=X1(J);if(A){if(B.title=A,N)N.title=A;let P=this.options.api.updateTitle?.($,A).then(()=>{}).catch(()=>{}).finally(()=>{if(this.titleWrites.get($)===P)this.titleWrites.delete($)});if(P)this.titleWrites.set($,P)}}let D=new Set,H=!1,f=()=>{if(H||W())return;H=!0,this.publish({type:"prompt_accepted",sessionId:$,prompt:J,delivery:z})};try{let A=await Y.client.command("session.send_input",{prompt:J,delivery:z,...Q?.length?{attachments:{userImages:Q}}:{}},G,{timeoutMs:z==="queue"?_4:null,onDispatch:(k)=>{D.add(k),Y.pendingInputs??=new Map,Y.pendingInputs.set(k,{clientId:Y.client.getClientId(),ownsBusyState:K,accept:f})},beforeDispatch:()=>{if(F(),Y.innerSessionId!==G)throw Error("The cloud session reconnected before the prompt could be sent. Please try again.")}});f();let P=z==="queue"||z!=="steer"&&A.payload?.result===void 0;if(P)O();return{sessionId:$,ok:!0,...P?{queued:!0}:{},result:A.payload?.result}}catch(A){if(W())throw O(),A;if(I0(A)||p0(A,"session.send_input")){let P;try{P=await this.rehydrateAfterTransportDrop($,Y)}catch(i){if(F(),O(),N&&K)N.busy=!1,N.status="error";if(z==="queue")throw new d0;throw i}if(F(),z==="queue")throw new d0;if(z==="steer")throw new q("request_failed","Cline could not confirm whether this message was accepted. Check the cloud session before resending it.");if(d(P.messages,U4(P.prompts,P.submittedPrompts),J)<=L)throw new q("request_failed","Cline could not confirm whether this message was accepted. Check the cloud session before resending it.");return{sessionId:$,ok:!0,...z==="queue"?{queued:!0}:{},recoveredAfterDisconnect:!0,status:P.status}}if(O(),N&&K)N.busy=!1,N.status="error";throw this.publishSnapshot($),A}finally{for(let A of D)Y.pendingInputs?.delete(A)}}async updateModel($,J){let Z=J?.trim();if(!Z||$.remote.metadata.modelId===Z)return;let X=$.innerSessionId;if(!X)throw Error("Cloud Hub session was not initialized");await $.client.command("session.update_connection",{sessionId:X,updates:{modelId:Z}},X,{beforeDispatch:()=>{if(this.assertSessionActive($.remote.id,$),$.innerSessionId!==X)throw Error("The cloud session reconnected before the model could be changed. Please try again.")}}),this.assertSessionActive($.remote.id,$),this.applyModel($,Z)}applyModel($,J){$.remote.metadata.modelId=J;let Z=this.sessions.get($.remote.id);if(Z)Z.config.model=J,Z.config.modelId=J}async rehydrateAfterTransportDrop($,J){if(this.assertSessionActive($,J),J.rehydrationPromise)return J.rehydrationRerunRequested=!0,await J.rehydrationPromise;let Z=(async()=>{let X;do J.rehydrationRerunRequested=!1,X=await this.performTransportRehydration($,J),this.assertSessionActive($,J);while(J.rehydrationRerunRequested&&!this.disposed);return X})().finally(()=>{if(J.rehydrationPromise===Z)J.rehydrationPromise=void 0,this.publishSnapshot($)});return J.rehydrationPromise=Z,await Z}async performTransportRehydration($,J){this.assertSessionActive($,J);let Z=J.innerSessionId;if(!Z)throw Error("Cloud Hub session was not initialized");J.bufferingEvents=!0,J.bufferedEvents=[],J.bufferedEventsDropped=0;try{await this.ensureAttached(J),this.assertSessionActive($,J);let X=await J.client.command("session.get",{includeSnapshot:!0},Z);this.assertSessionActive($,J);let Q=X.payload?.session&&typeof X.payload.session==="object"&&!Array.isArray(X.payload.session)?X.payload.session:void 0;this.applySessionModel(J,Q);let j=this.sessions.get($),V=this.authoritativeMessages.get($)??[],Y=String(Q?.status??j?.status??"running").trim(),W=Y==="pending"?"running":Y;if(W==="running"&&!J.transcriptKnown&&!J.pendingInputs?.size)J.externalRun??={progressHydrated:!0};let F=()=>J.client.command("session.messages",{sessionId:Z},Z),G=await F().catch((A)=>{if(!p0(A,"session.messages"))throw A;return this.assertSessionActive($,J),F()});if(this.assertSessionActive($,J),!Array.isArray(G.payload?.messages))throw Error("Cloud Hub returned an invalid transcript snapshot");let N=G.payload.messages,z=J.bufferedEventsDropped+J.bufferedEvents.length,L=await J.client.command("session.pending_prompts",{sessionId:Z},Z).catch(()=>{return});this.assertSessionActive($,J);let K=J.bufferedEventsDropped+J.bufferedEvents.length;if(j){let A=j.status!==W;if(this.authoritativeMessages.set($,structuredClone(N)),j.messages=structuredClone(N),this.streamingMessages.delete($),j.status=W,j.busy=W==="running",A)if(W==="completed"||W==="failed"||W==="aborted")j.endedAt=Date.now(),this.notify("chat_session_ended",{sessionId:$,reason:W==="failed"?"error":W});else this.notify("chat_session_status",{sessionId:$,status:W})}let _=L!==void 0&&L.ok!==!1&&Array.isArray(L.payload?.prompts),O=_?this.applyQueueSnapshot($,L):void 0;J.transcriptKnown=!0;let B=N;this.assertSessionActive($,J),this.notify("cloud_session_rehydrated",{sessionId:$,status:W,transcriptKnown:!0,messages:B}),this.assertSessionActive($,J);let D=J.bufferedEvents,H=v0(D),f=r1(D,N,{queueSnapshotApplied:_,queueSnapshotEventCutoff:Math.max(0,K-J.bufferedEventsDropped),messagesSnapshotEventCutoff:Math.max(0,z-J.bufferedEventsDropped),baselineMessages:V});J.bufferedEvents=[],J.bufferingEvents=!1,J.syncFailureNotified=!1;for(let A of f)this.forwardEvent($,J,A);return{status:W,messages:N,prompts:O,submittedPrompts:H}}catch(X){let Q=J.bufferedEvents;J.bufferedEvents=[],J.bufferingEvents=!1,this.assertSessionActive($,J);for(let j of Q)this.forwardEvent($,J,j);if(!J.syncFailureNotified)J.syncFailureNotified=!0,this.notify("cloud_session_sync_failed",{sessionId:$,message:X instanceof Error?X.message:String(X)});throw X}}async abort($){if(this.sendAbortTokens.set($,Symbol()),this.abortProvisioningControllers($,Error("Cloud session prompt cancelled")))return{sessionId:$,ok:!0};let J=await this.ensureConnection($),Z=()=>{if(this.disposed||J.disposed)throw Error("Cloud session connection was disposed")};if(Z(),await J.client.connect(),await J.reconnectResolution,Z(),await this.resolveInnerSession($,J),J.innerSessionId){await this.ensureAttached(J),await J.reconnectResolution,Z();let Q=J.innerSessionId;if(!Q)throw Error("Cloud Hub session was not initialized");await J.client.command("run.abort",{sessionId:Q},Q,{beforeDispatch:()=>{if(Z(),J.innerSessionId!==Q)throw Error("The cloud session reconnected before Stop could be sent. Please try Stop again.")}})}Z();let X=this.sessions.get($);if(X)X.busy=!1,X.status="aborted";return this.publishSnapshot($),{sessionId:$,ok:!0}}async pendingPrompts($){if(this.knownSessions.get($)?.status==="provisioning")return{sessionId:$,promptsInQueue:[]};if(!(await this.ensureConnection($)).innerSessionId)return{sessionId:$,promptsInQueue:[]};let Z=await this.queueCommand($,"session.pending_prompts",{});return{sessionId:$,promptsInQueue:this.applyQueueSnapshot($,Z)}}async updatePendingPrompt($,J,Z){let X=await this.queueCommand($,"session.update_pending_prompt",{promptId:J,...Z});return{sessionId:$,updated:X.payload?.updated===!0,promptsInQueue:this.applyQueueSnapshot($,X)}}async removePendingPrompt($,J){let Z=await this.queueCommand($,"session.remove_pending_prompt",{promptId:J});return{sessionId:$,removed:Z.payload?.removed===!0,promptsInQueue:this.applyQueueSnapshot($,Z)}}async queueCommand($,J,Z){let X=await this.ensureConnection($),Q=X.innerSessionId;if(!Q)throw Error("Cloud Hub session was not initialized");await X.client.connect(),await X.reconnectResolution,await this.ensureAttached(X),await X.reconnectResolution;let j=await X.client.command(J,{sessionId:Q,...Z},Q,{beforeDispatch:()=>{if(this.assertSessionActive($,X),X.innerSessionId!==Q)throw Error("The cloud session reconnected before the queue request could be sent. Refresh the queue and try again.")}});return this.assertSessionActive($,X),j}applyQueueSnapshot($,J){if(!Array.isArray(J.payload?.prompts))throw Error("Cloud Hub returned an invalid pending-prompts snapshot");let X=J.payload.prompts.map((j)=>({id:typeof j.id==="string"?j.id:"",prompt:typeof j.prompt==="string"?j.prompt:"",steer:j.delivery==="steer",attachmentCount:typeof j.attachmentCount==="number"?j.attachmentCount:0,userImages:Array.isArray(j.userImages)?j.userImages.filter((V)=>typeof V==="string"):void 0})).filter((j)=>j.id),Q=this.sessions.get($);if(Q)Q.promptsInQueue=X;return this.publishSnapshot($,!1,"queue"),X}async readMessages($){let J=this.knownSessions.get($);if(J?.status==="provisioning"||J?.status==="failed")return[];if(J&&E(J))return await this.loadArchivedMessages(J)??[];try{let Z=await this.ensureConnection($);if(!Z.innerSessionId)return[];return(await this.rehydrateAfterTransportDrop($,Z)).messages}catch(Z){let X=await this.refreshKnownSession($)??J;if(X){let Q=await this.loadArchivedMessages(X).catch(()=>null);if(Q!==null)return Q}throw Z}}async updateTitle($,J){let Z=this.titleWrites.get($),X=(async()=>{await Z?.catch(()=>{}),this.assertSessionActive($),await this.options.api.updateTitle($,J);let Q=this.knownSessions.get($);if(Q)Q.title=J;let j=this.sessions.get($);if(j)j.title=J;this.publishSnapshot($)})();this.titleWrites.set($,X);try{await X}finally{if(this.titleWrites.get($)===X)this.titleWrites.delete($)}}async delete($){this.deletingSessions.add($),this.abortProvisioningControllers($);try{let J=this.connectionPromises.get($);if(J)await J.catch(()=>{return});await this.disposeConnection($);try{await this.options.api.delete($)}catch(Z){let X=Z instanceof q?Z.code:"";if(X!=="session_not_found"&&X!=="session_expired")throw Z}this.knownSessions.delete($),this.unlistedSessions.delete($),this.pendingInitialTasks.delete($),this.sessions.delete($),this.authoritativeMessages.delete($),this.restoredOptions.delete($),this.publish({type:"removed",sessionId:$}),this.sendAbortTokens.delete($);for(let[Z,X]of this.approvals)if(X.item.sessionId===$)this.approvals.delete(Z)}finally{this.deletingSessions.delete($)}}async dispose(){this.disposed=!0;for(let J of this.snapshotTimers.keys())this.cancelScheduledSnapshot(J);this.sendAbortTokens.clear();for(let J of this.provisioningControllers.values())for(let Z of J)Z.abort();this.provisioningControllers.clear();let $=new Set([...this.connections.keys(),...this.knownSessions.keys(),...this.sessions.keys()]);for(let[J,Z]of this.approvals)if($.has(Z.item.sessionId))this.approvals.delete(J);for(let J of $)this.sessions.delete(J),this.knownSessions.delete(J),this.publish({type:"removed",sessionId:J});if(this.knownSessions.clear(),this.unlistedSessions.clear(),!this.options.pendingInitialTasks)this.pendingInitialTasks.clear();this.listeners.clear(),await Promise.allSettled(Array.from(this.connections.keys()).map((J)=>this.disposeConnection(J)))}async attachExpired($){let J=this.sessions.get($.id)??u0($);return J.busy=!1,J.status="expired",this.sessions.set($.id,J),await this.loadArchivedMessages($).catch(()=>{return}),c0($,"expired")}async loadArchivedMessages($){let J=this.sessionGenerations.get($.id),Z=await this.options.api.history($.id);if(this.assertSessionActive($.id),this.sessionGenerations.get($.id)!==J)throw Error("Cloud session attachment changed while loading history");if(Z===null)return null;let X=this.sessions.get($.id)??u0($);return X.messages=structuredClone(Z),this.sessions.set($.id,X),this.authoritativeMessages.set($.id,structuredClone(X.messages)),this.publishSnapshot($.id,!0),Z}async refreshKnownSession($){let J=await this.resolveActiveOrganizationId(),Z=await this.options.api.list(J).catch(()=>{return});if(this.disposed)throw Error("Cloud session manager was disposed");if(!Z)return this.knownSessions.get($);for(let X of Z)this.knownSessions.set(X.id,X);return Z.find((X)=>X.id===$)}async ensureKnownSession($){let J=this.knownSessions.get($);if(J)return J;let Z=(await this.list()).find((X)=>X.id===$);if(!Z)throw new q("session_not_found",`Cloud session ${$} was not found.`);return this.knownSessions.get($)??structuredClone(Z)}assertSessionActive($,J){if(this.disposed||J?.disposed||this.detachedSessions.has($)||J?.generation!==void 0&&J.generation!==(this.sessionGenerations.get($)??0))throw Error("Cloud session connection was disposed");if(this.deletingSessions.has($))throw new q("session_not_found","This cloud session is being deleted.")}async ensureConnection($,J={}){let Z=this.sessionGenerations.get($)??0,X=()=>{if(this.assertSessionActive($),Z!==(this.sessionGenerations.get($)??0))throw Error("Cloud viewer detached during connection")};X();let Q=this.connectionPromises.get($),j=Q?await Q:this.connections.get($);if(j?.remote.status==="suspended")return await this.disposeConnection($),X(),await this.ensureConnection($,J);if(j){if(this.assertSessionActive($,j),await j.reconnectResolution,this.assertSessionActive($,j),!j.innerSessionId)await j.client.connect(),await j.reconnectResolution,this.assertSessionActive($,j),await this.resolveInnerSession($,j,Boolean(J.handoffSeed)),this.assertSessionActive($,j);if(J.handoffSeed&&j.innerSessionId)await this.assertHandoffConnectionReusable(j,J.handoffSeed);if(J.createInner&&!j.innerSessionId)await this.createInnerSession(j,J.handoffSeed);return this.assertSessionActive($,j),j}let V=(async()=>{let Y=await this.ensureKnownSession($);if(X(),!this.pendingInitialTasks.has($)&&(Y.sandboxType==="resumable"||Y.metadata.sandboxType==="resumable"||Y.status==="suspended")){let N=await this.options.api.status($).catch(async(L)=>{if(!(L instanceof q?L.code==="request_failed"&&(L.status===void 0||L.status===408||L.status===429||L.status>=500):L instanceof TypeError||L instanceof Error&&L.name==="TimeoutError"))throw L;return X(),await this.refreshKnownSession($).catch(()=>{return})});if(X(),N?.status)Y.status=N.status;let z=this.sessions.get($);if(z?.status==="suspended"&&["provisioning","ready","active"].includes(Y.status))z.status=Y.status,z.busy=!1,z.endedAt=void 0}if(Y.status==="suspended"){let N=new AbortController,z=this.trackProvisioningController($,N);try{try{Y=await this.options.api.resume($,N.signal)}catch(K){if(!(K instanceof q)||K.status!==409)throw K;X(),N.signal.throwIfAborted();let _=await this.options.api.status($,{signal:N.signal});if(_.status!=="provisioning"&&_.status!=="ready"&&_.status!=="active")throw K;Y={...Y,status:_.status}}X(),N.signal.throwIfAborted(),this.knownSessions.set($,Y);let L=this.sessions.get($);if(L)L.status=Y.status,L.busy=!1,L.endedAt=void 0;this.publishSnapshot($,!1,"status")}finally{z()}}if(Y.status==="provisioning"){let N=new AbortController,z=this.trackProvisioningController($,N);try{if(await this.options.api.waitUntilReady($,N.signal,({phase:K})=>{Y.metadata.provisioningPhase=K,this.notify("chat_session_status",{sessionId:$,status:"provisioning",phase:K})}),this.disposed)throw Error("Cloud session manager was disposed");if(Y=await this.refreshKnownSession($)??Y,N.signal.throwIfAborted(),Y.status==="provisioning")Y.status="ready";let L=this.sessions.get($);if(L?.status==="provisioning")L.status="idle",L.busy=!1,L.endedAt=void 0}catch(L){if(L instanceof q&&L.code==="session_failed"){if(Y.status="failed",Y.metadata.statusReason=L.detail,Y.metadata.provisioningPhase="failed",!this.disposed)this.knownSessions.set($,Y);let K=this.sessions.get($);if(K)K.status="error";this.notify("chat_session_status",{sessionId:$,status:"error"})}throw L}finally{z()}}if(X(),Y.status==="failed")throw new q("session_failed",Y.metadata.statusReason||"The cloud sandbox could not be prepared.");if(E(Y))throw new q("session_expired","This cloud session has expired; its sandbox is gone. Start a new cloud session to continue.");this.sessions.set($,this.sessions.get($)??this.stateFromRecord(Y));let W,F=0,G=this.createHubClient({url:B4(this.options.apiBaseUrl,$),clientId:`${this.options.clientIdentity?.prefix??"cloud"}-${$}-${z4()}`,clientType:this.options.clientIdentity?.type??"cloud-client",displayName:this.options.clientIdentity?.displayName??"Cline cloud session",workspaceRoot:U,cwd:U,resolveConnectionHeaders:async()=>{X();let N=F>0;if(F+=1,W)W.connected=!1,W.reconnecting=N,this.publishSnapshot($);if(N){let L=W;if(L&&!L.disposed){L.transcriptKnown=!1,L.innerSessionId=void 0;let K=(async()=>{if(await this.resolveInnerSession($,L),L.innerSessionId)await this.rehydrateAfterTransportDrop($,L)})().catch(()=>this.disposeConnectionIfSessionGone($,L)).finally(()=>{if(L.reconnectResolution===K)L.reconnectResolution=void 0,L.connected=L.transcriptKnown,this.publishSnapshot($)});L.reconnectResolution=K}}let z=await this.options.getAuthToken();if(!z?.trim())throw new q("authentication_required","Sign in to Cline to reconnect this cloud session.");return X(),{Authorization:`Bearer ${z.trim()}`}}});W={generation:Z,remote:Y,client:G,bufferedEvents:[],bufferedEventsDropped:0,transcriptKnown:!1,seenEventIds:new Set,unsubscribe:()=>{}},W.unsubscribe=G.subscribe(()=>{},{sessionId:Y.metadata.taskId?.trim()||$}),this.connections.set($,W);try{if(await G.connect(),W.connected=!0,this.publishSnapshot($),this.assertSessionActive($,W),await this.resolveInnerSession($,W,Boolean(J.handoffSeed)),this.assertSessionActive($,W),J.handoffSeed&&W.innerSessionId)await this.assertHandoffConnectionReusable(W,J.handoffSeed);if(J.createInner&&!W.innerSessionId)await this.createInnerSession(W,J.handoffSeed);return this.assertSessionActive($,W),W}catch(N){if(I0(N)&&!this.disposed&&!W.disposed&&!this.deletingSessions.has($))throw N;if(this.connections.get($)===W)this.connections.delete($);if(W.disposed=!0,W.unsubscribe(),!this.disposed&&Z===(this.sessionGenerations.get($)??0))this.clearPendingApprovals($);throw await G.dispose().catch(()=>{return}),N}})().finally(()=>{if(this.connectionPromises.get($)===V)this.connectionPromises.delete($)});return this.connectionPromises.set($,V),await V}async resolveInnerSession($,J,Z=!1){if(this.assertSessionActive($,J),J.innerSessionId)return;let X=J.remote.metadata.taskId?.trim(),Q;if(X)try{let Y=await J.client.command("session.get",{sessionId:X},X);this.assertSessionActive($,J),Q=Y.payload?.session&&typeof Y.payload.session==="object"&&!Array.isArray(Y.payload.session)?Y.payload.session:void 0}catch(Y){if(!B0(Y))throw Y}else{let Y=await J.client.command("session.list",{limit:100});this.assertSessionActive($,J),Q=V0(Y.payload).filter(Y0).sort((W,F)=>g0(F)-g0(W))[0]}let j=String(Q?.sessionId??"").trim();if(!j||!Q){if(!Z&&!this.pendingInitialTasks.has($))throw Error("This cloud session's task is unavailable. Start a new cloud session to continue.");return}if(J.remote.sandboxType==="resumable"||J.remote.metadata.sandboxType==="resumable")await this.restoreSavedInnerSession(J,j,Q),this.assertSessionActive($,J);this.pendingInitialTasks.delete($),J.innerSessionId=j,this.subscribeToInnerSession($,J);let V=h0(Q);if(V)this.applyModel(J,V);await this.ensureAttached(J)}async restoreSavedInnerSession($,J,Z){let X=()=>$.client.command("session.update_connection",{sessionId:J,updates:{}},J);try{await X();return}catch(K){if(!(B0(K)||K instanceof Error&&K.code==="command_failed"&&K.message===`session not found: ${J}`))throw K}this.assertSessionActive($.remote.id,$);let Q=await $.client.command("session.messages",{},J);this.assertSessionActive($.remote.id,$);let j=Q.payload?.messages;if(!Array.isArray(j)||j.length===0)throw Error("The saved conversation is empty or unavailable.");let V=Z.metadata??{},Y=Z.runtimeOptions??{},W=this.sessions.get($.remote.id)?.config,F=Object.hasOwn(V,"thinking")?V.thinking:W?.thinking,G=Object.hasOwn(V,"reasoningEffort")?V.reasoningEffort:W?.reasoningEffort,N=typeof V.autoApproveTools==="boolean"?V.autoApproveTools:W?.autoApproveTools,z=Z.cwd??Z.workspaceRoot??U,L=Z.workspaceRoot??U;try{let K=await $.client.command("session.create",{workspaceRoot:L,cwd:z,initialMessages:j,metadata:{...V,interactive:!0},sessionConfig:{sessionId:J,providerId:V.provider??"cline",modelId:V.model??V.modelId??$.remote.metadata.modelId,workspaceRoot:L,cwd:z,systemPrompt:Y.systemPrompt??V.systemPrompt??"",mode:Y.mode??V.mode??"act",...typeof F==="boolean"?{thinking:F}:{},...typeof G==="string"?{reasoningEffort:G}:{},...V.checkpointEnabled===!0?{checkpoint:{enabled:!0}}:{}},runtimeOptions:Y,...typeof N==="boolean"?{toolPolicies:{"*":{autoApprove:N}}}:{}});if(this.assertSessionActive($.remote.id,$),(K.payload?.session?.sessionId??K.payload?.sessionId)!==J)throw Error("Cloud Hub did not restore the requested session.")}catch(K){if(K?.code!=="session_already_exists")throw K;this.assertSessionActive($.remote.id,$),await X()}}async assertHandoffConnectionReusable($,J){let Z=await $.client.command("session.list",{limit:100});this.assertSessionActive($.remote.id,$);let X=V0(Z.payload).filter(Y0),[Q]=X;if(X.length!==1||String(Q?.sessionId??"").trim()!==$.innerSessionId||o1(Q)!==J.sourceSessionId)throw new q("request_failed","This cloud workspace already contains another conversation. Open it in Cline Cloud or delete it before retrying the handoff.")}async createInnerSession($,J){if(this.assertSessionActive($.remote.id,$),$.innerSessionCreation){if(await $.innerSessionCreation,J)await this.assertHandoffConnectionReusable($,J);return}let Z=(async()=>{if(J&&await this.adoptExistingHandoffSession($,J)){this.unconfirmedInnerCreates.delete($.remote.id);return}if(J?.recoverOnly||this.unconfirmedInnerCreates.has($.remote.id))throw new q("request_failed","Cloud conversation creation is still unconfirmed. Wait for it to appear before trying again.");await this.createInnerSessionOnce($,J)})().finally(()=>{$.innerSessionCreation=void 0});return $.innerSessionCreation=Z,await Z}async adoptExistingHandoffSession($,J){let Z=await $.client.command("session.list",{limit:100});this.assertSessionActive($.remote.id,$);let X=V0(Z.payload).filter(Y0);if(X.length===0)return!1;let[Q]=X,j=String(Q?.sessionId??"").trim();if(X.length!==1||!j||o1(Q)!==J.sourceSessionId)throw new q("request_failed","This cloud workspace already contains another conversation. Open it in Cline Cloud or delete it before retrying the handoff.");return $.innerSessionId=j,this.subscribeToInnerSession($.remote.id,$),this.applySessionModel($,Q),await this.ensureAttached($),!0}async createInnerSessionOnce($,J){let Z=$.remote.metadata.modelId?.trim();if(!Z)throw Error("Cloud session is missing its model id");let X=this.sessions.get($.remote.id),Q=l0(J?.workspaceRelativePath),j=J?.mode??"act";try{await J?.onSeeding?.(),this.assertSessionActive($.remote.id,$)}catch(O){if(J)throw new a0(O);throw O}let V=`cline/${($.remote.metadata.taskId?.trim()||$.remote.id).slice(-8).toLowerCase()}`,Y=$.remote.sandboxType==="resumable"||$.remote.metadata.sandboxType==="resumable",W=`${n1}
7
+ ${m}${y}`)}let i;try{i=await t.symbolicBranch()}catch(l){let m=Q(l)===1,y=K(l),w=m?"Cloud handoff requires a checked-out branch; detached HEAD is not supported.":"Could not inspect the current Git branch.";throw new _(m?"detached_head":"git_command_failed",y?`${w} (${y})`:w,{cause:l})}if(!i)throw new _("detached_head","Cloud handoff requires a checked-out branch; detached HEAD is not supported.");let[r,a,d]=await Promise.all([O(()=>t.branchRemote(i),"missing_upstream",`Branch ${i} has no upstream. Push it with -u before handing off.`),O(()=>t.branchMergeRef(i),"missing_upstream",`Branch ${i} has no upstream. Push it with -u before handing off.`),O(t.headSha,"git_command_failed","Could not resolve the current commit.")]);if(!r||r==="."||!a.startsWith("refs/heads/"))throw new _("missing_upstream",`Branch ${i} has no remote branch upstream. Push it with -u before handing off.`);let u=a.slice(11),f=r;if(!Ze(r))try{f=await t.remoteUrl(r)}catch{throw new _("missing_upstream","Could not resolve the upstream remote.")}let c=Ze(f);if(!c)throw new _("unsupported_remote","Cloud handoff currently requires a github.com upstream remote.");let h;try{h=await t.remoteRefs(r,a)}catch(l){let m=Q(l)===2,y=m?`The upstream branch ${u} was not found. Push it before handing off.`:"Could not verify the remote branch. Check your network and GitHub authentication, then try again.";throw new _(m?"remote_branch_missing":"git_command_failed",y)}let p=cn(h,u);if(!p)throw new _("remote_branch_missing",`The upstream branch ${u} was not found. Push it before handing off.`);if(p.toLowerCase()!==d.toLowerCase())throw new _("unpushed_commits",`Local HEAD does not match the upstream branch ${u}. Push the current commit before handing off.`);return{repoUrl:c,branch:u,headSha:d,...s?{workspaceRelativePath:s}:{}}}function fe(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:void 0}function x(e){if(typeof e!=="string")return;return e.trim()||void 0}function ln(e){return typeof e==="string"&&e.length>0?e:void 0}function pn(e){let t=x(e.repoUrl),n=x(e.branch),s=x(e.headSha),o=x(e.modelId);if(!t||!n||!s||!o)throw Error("Cloud handoff fingerprint fields cannot be empty.");let i=x(e.organizationId),r=ln(e.workspaceRelativePath),a=e.mode;return{repoUrl:t,branch:n,headSha:s,modelId:o,...i?{organizationId:i}:{},...r?{workspaceRelativePath:r}:{},...a?{mode:a}:{}}}function Lo(e,t){return e!==void 0&&t!==void 0&&e.repoUrl===t.repoUrl&&e.branch===t.branch&&e.headSha.toLowerCase()===t.headSha.toLowerCase()&&e.modelId===t.modelId&&e.organizationId===t.organizationId&&e.workspaceRelativePath===t.workspaceRelativePath&&e.mode===t.mode}function fn(e){let t=fe(e);if(!t||typeof t.repoUrl!=="string"||typeof t.branch!=="string"||typeof t.headSha!=="string"||typeof t.modelId!=="string")return;try{return pn({repoUrl:t.repoUrl,branch:t.branch,headSha:t.headSha,modelId:t.modelId,...typeof t.organizationId==="string"?{organizationId:t.organizationId}:{},...typeof t.workspaceRelativePath==="string"?{workspaceRelativePath:t.workspaceRelativePath}:{},...t.mode==="plan"||t.mode==="yolo"||t.mode==="zen"?{mode:t.mode}:{}})}catch{return}}function Bo(e){let t=fe(fe(e)?.handoff);if(!t)return;let n=x(t.toCloudSessionId),s=x(t.handedOffAt),o=t.status;if(!n||!s||o!=="pending"&&o!=="complete")return;let i=x(t.innerSessionId),r=x(t.dashboardUrl),a=fn(t.fingerprint);return{toCloudSessionId:n,handedOffAt:s,status:o,...i?{innerSessionId:i}:{},...r?{dashboardUrl:r}:{},...a?{fingerprint:a}:{}}}function qo(e,t){return{...e??{},handoff:t}}function No(e){let{handoff:t,cloudHandoffIntent:n,cloudHandoffSeedDispatched:s,...o}=e??{};return o}function $o(e,t){let n=t.trim();if(!n)throw Error("Cloud session id cannot be empty.");let s=new URL("/agents",e);return s.searchParams.set("sessionId",n),s.toString()}function et(e){return e.map((t)=>{let n=t&&typeof t==="object"?t:{};return{role:n.role,content:n.content}})}function he(e,t){return e.length===t.length&&JSON.stringify(et(e))===JSON.stringify(et(t))}class me extends Error{constructor(e,t){super(`Cloud transcript verification failed (local ${e} messages, cloud ${t}).`);this.name="CloudHandoffTranscriptMismatchError"}}import{randomUUID as hn}from"node:crypto";import{decodeJwtPayload as mn}from"@cerebriline/shared";var gn=610000,yn=3000,B=15000,bn="CLOUD_SESSION_ERROR:",st="__cline_create_request__:";function ot(e){return(e.trim().split(`
8
+ `)[0]??"").trim().slice(0,72)}class g extends Error{code;detail;connectUrl;status;constructor(e,t,n,s){super(`${bn}${JSON.stringify({code:e,message:t,connectUrl:n})}`);this.code=e;this.detail=t;this.connectUrl=n;this.status=s;this.name="CloudSessionError"}}class it extends Error{constructor(e){super(e instanceof Error?e.message:"Cloud handoff creation was rejected.",{cause:e});this.name="CloudHandoffCreationRejectedError"}}function be(e){let t=e.length;while(t>0&&e[t-1]==="/")t--;return e.slice(0,t)}function wn(e){return`${st}${e}`.slice(0,255)}function tt(e){return e?.startsWith(st)===!0}function we(e){switch(e){case"provisioning":case"cloning_repo":case"agent_starting":case"ready":case"failed":return e;default:return}}function ge(e){let t=mn(e.replace(/^workos:/,""));return typeof t?.sub==="string"&&t.sub.trim()?t.sub.trim():void 0}function nt(e){return new Promise((t,n)=>{if(e.aborted){n(e.reason);return}let s=()=>{clearTimeout(o),n(e.reason)},o=setTimeout(()=>{e.removeEventListener("abort",s),t()},yn);e.addEventListener("abort",s,{once:!0})})}function vn(e,t){if(e&&typeof e==="object"){let n=e.error;if(typeof n==="string"&&n.trim())return n.trim()}return t}function ye(e,t,n,s){let o=vn(t,`Cloud session request failed (${e})`);if(e===401)return new g("authentication_required",o);if(e===404)return new g("session_not_found",o);if(e===410)return new g("session_expired",o);if(e===412)return new g("github_not_connected",o,s??`${be(n)}/dashboard/integrations`);if(e===403&&o.trim().toLowerCase()==="forbidden")return new g("request_failed","Your active account or organization cannot create cloud sessions. Switch to Personal or another organization in Settings → Account, then try again.",void 0,e);return new g("request_failed",o,void 0,e)}class Cn{options;apiBaseUrl;appBaseUrl;fetchImpl;createTimeoutMs;unconfirmedHandoffCreates=new Set;completedHandoffCreates=new Map;constructor(e){this.options=e;this.apiBaseUrl=be(e.apiBaseUrl),this.appBaseUrl=be(e.appBaseUrl),this.fetchImpl=e.fetch??fetch,this.createTimeoutMs=e.createTimeoutMs??gn}async request(e,t={},n,s,o){let i=!1,r;while(!0){let a;try{a=typeof s==="string"?s:await this.options.getAuthToken()}catch(f){if(r)throw ye(401,void 0,this.appBaseUrl,n);throw f}if(!a?.trim())throw new g("authentication_required","Sign in to Cline before starting a cloud session.");if(a.trim()===r)throw new g("authentication_required","The cloud session credential was rejected. Sign in again.");if(typeof s==="object"){if(s.subject?ge(a.trim())!==s.subject:a.trim()!==s.token)throw new g("authentication_required","The signed-in account changed during cloud session creation.");s.token=a.trim()}o?.();let d=await this.fetchImpl(`${this.apiBaseUrl}${e}`,{...t,signal:t.signal??AbortSignal.timeout(B),headers:{Accept:"application/json",Authorization:`Bearer ${a.trim()}`,...t.body?{"Content-Type":"application/json"}:{},...t.headers}}),u=d.status===204?void 0:await d.json().catch(()=>{return});if(!d.ok){if(d.status===401&&typeof s==="object"&&!i&&s.subject){i=!0,r=a.trim();continue}throw ye(d.status,u,this.appBaseUrl,n)}return u?.data}}async list(e){return await this.listWithToken(e)}async listWithToken(e,t,n=!1){let s=e?.trim()?`?organizationId=${encodeURIComponent(e.trim())}`:"";return(await this.request(`/api/v1/session${s}`,{},void 0,t)??[]).flatMap((i)=>{if(!i||typeof i!=="object"||typeof i.id!=="string")return[];return[{...i,title:!n&&tt(i.title)?void 0:i.title,repoContext:i.repoContext&&typeof i.repoContext==="object"?i.repoContext:{},metadata:{...i.metadata&&typeof i.metadata==="object"?i.metadata:{},...!n&&tt(i.title)?{createRequestTitle:i.title}:{}}}]})}async listRepositories(e){let t=e?.trim(),n=t?`${this.appBaseUrl}/dashboard/organization/integrations`:`${this.appBaseUrl}/dashboard/integrations`,s=t?`/api/v1/organizations/${encodeURIComponent(t)}/integrations/github/repositories`:"/api/v1/integrations/github/repositories";try{let o=await this.request(s)??[];return{connected:!0,connectUrl:n,repositories:o.flatMap((i)=>{let r=Number(i.id),a=String(i.html_url??i.clone_url??"").trim();if(!Number.isSafeInteger(r)||r<=0||!a)return[];let d=String(i.name??"").trim();return[{id:r,name:d,fullName:String(i.full_name??(d||a)).trim(),url:a,defaultBranch:String(i.default_branch??"").trim()}]})}}catch(o){if(o instanceof g&&o.code==="session_not_found")return{connected:!1,connectUrl:n,repositories:[]};throw o}}async listBranches(e,t,n={}){if(!Number.isSafeInteger(e)||e<=0)throw new g("request_failed","Select a GitHub repository before loading branches.");let s=t?.trim(),o=s?`/api/v1/organizations/${encodeURIComponent(s)}/integrations/github/repositories/${e}/branches`:`/api/v1/integrations/github/repositories/${e}/branches`,i=new URLSearchParams,r=n.query?.trim(),a=n.cursor?.trim();if(r)i.set("query",r);if(a)i.set("cursor",a);let d=i.size>0?`${o}?${i}`:o;try{let u=await this.request(d),f=Array.isArray(u)?u:Array.isArray(u?.items)?u.items:[],c=r?.toLowerCase();return{available:!0,branches:f.flatMap((h)=>{let p=String(h.name??"").trim();return p&&(!Array.isArray(u)||!c||p.toLowerCase().includes(c))?[p]:[]}),nextToken:Array.isArray(u)?"":String(u?.nextToken??"").trim()}}catch(u){if(u instanceof g&&u.code==="session_not_found")return{available:!1,branches:[]};throw u}}async status(e,t={}){return await this.request(`/api/v1/session/${encodeURIComponent(e)}/status`,{signal:t.signal?AbortSignal.any([t.signal,AbortSignal.timeout(B)]):void 0},void 0,t.authToken)}async create(e){if(e.handoff&&typeof e.handoff.onCreating!=="function")throw new g("request_failed","Cloud handoff requires an onCreating callback to persist creation intent before dispatch.");let t=(await this.options.getAuthToken())?.trim();if(!t)throw new g("authentication_required","Sign in to Cline before starting a cloud session.");let n={token:t,subject:ge(t)},s=wn(e.requestId?.trim()||hn()),o=e.handoff?`${n.subject??t}/${e.organizationId??""}/${e.requestId?.trim()??""}`:void 0;if(e.handoff&&!e.requestId?.trim())throw new g("request_failed","A stable request id is required for cloud handoff creation.");let i=async()=>(await this.listWithToken(e.organizationId??void 0,n,!0)).filter((c)=>c.title===s&&c.repoContext.repoUrl===e.repoUrl&&c.metadata.modelId===e.modelId&&(!e.branch?.trim()||c.repoContext.branch===e.branch.trim())),r=async(c)=>{if(c.status==="failed"||c.expiredAt&&Date.parse(c.expiredAt)<=Date.now()){let p=new g(c.status==="failed"?"session_failed":"session_expired","The recovered cloud handoff workspace is no longer usable.");try{await this.deleteWithAuth(c.id,n)}catch(l){if(!(l instanceof g&&(l.code==="session_not_found"||l.code==="session_expired")))throw AggregateError([p,l],"The unusable recovered cloud handoff workspace could not be removed.")}if(o)this.unconfirmedHandoffCreates.delete(o),this.completedHandoffCreates.delete(o);throw await e.handoff?.onOuterSessionRemoved?.(c.id),p}await e.handoff?.onOuterSessionCreated(c.id,{created:!1});let h={sessionId:c.id,status:c.status,sandboxUrl:c.sandboxUrl,cleanupAuthToken:n.token};if(o)this.unconfirmedHandoffCreates.delete(o),this.completedHandoffCreates.set(o,h);return h};if(o){let c=await i();if(c.length>1)throw new g("request_failed","Cloud handoff creation is ambiguous; inspect your cloud session list before continuing.");if(c[0])return await r(c[0]);let h=this.completedHandoffCreates.get(o);if(h){try{await this.request(`/api/v1/session/${encodeURIComponent(h.sessionId)}/status`,{},void 0,n)}catch(p){if(p instanceof g&&(p.code==="session_not_found"||p.code==="session_expired"))await e.handoff?.onOuterSessionRemoved?.(h.sessionId),this.completedHandoffCreates.delete(o),this.unconfirmedHandoffCreates.delete(o);throw p}return await e.handoff?.onOuterSessionCreated(h.sessionId,{created:!1}),{...h,cleanupAuthToken:n.token}}if(this.unconfirmedHandoffCreates.has(o))throw new g("request_failed","Cloud handoff creation is still unconfirmed. Recover the original request before creating another workspace.");this.unconfirmedHandoffCreates.add(o)}try{await e.handoff?.onCreating()}catch(c){if(o)this.unconfirmedHandoffCreates.delete(o);throw c}let a=new AbortController,d=setTimeout(()=>a.abort(),this.createTimeoutMs),u,f=!1;try{let c=await this.request("/api/v1/session",{method:"POST",body:JSON.stringify({modelId:e.modelId,repoUrl:e.repoUrl,...e.sandboxType?{sandboxType:e.sandboxType}:{},title:s,...e.branch?.trim()?{branch:e.branch.trim()}:{},...e.organizationId?.trim()?{organizationId:e.organizationId.trim()}:{}}),signal:a.signal},e.organizationId?.trim()?`${this.appBaseUrl}/dashboard/organization/integrations`:void 0,n,()=>{f=!0}),h=c?.sessionId?.trim();if(!h)throw new g("request_failed","The cloud session service returned no session id.");u=h,await this.persistHandoffOuterSession(e,h,n,o);let p={sessionId:h,status:c.status?.trim()||"provisioning",sandboxUrl:c.sandboxUrl?.trim()??"",cleanupAuthToken:n.token};if(o)this.unconfirmedHandoffCreates.delete(o),this.completedHandoffCreates.set(o,p);return p}catch(c){if(u)throw c;let h=!f||c instanceof g&&(c.status!==void 0&&c.status>=400&&c.status<500&&c.status!==408&&c.status!==409||["authentication_required","github_not_connected","session_not_found","session_expired"].includes(c.code));if(o&&h)throw this.unconfirmedHandoffCreates.delete(o),new it(c);if(a.signal.aborted||!(c instanceof g)||c instanceof g&&c.code==="request_failed"&&(c.status===void 0||c.status>=500||c.status===408||c.status===409)){let l=[];try{l=await i()}catch(y){if(e.handoff)throw AggregateError([c,y],"Cloud handoff creation is unconfirmed and its session list could not be checked.")}if(l.length>1)throw new g("request_failed","Cloud session creation had an ambiguous result. Check your cloud session list before trying again.");let m=l[0];if(m){if(e.handoff)return await r(m);return{sessionId:m.id,status:m.status,sandboxUrl:m.sandboxUrl,cleanupAuthToken:n.token}}}else if(o)this.unconfirmedHandoffCreates.delete(o);throw c}finally{clearTimeout(d)}}async persistHandoffOuterSession(e,t,n,s){if(!e.handoff)return;try{await e.handoff.onOuterSessionCreated(t,{created:!0})}catch(o){try{await this.deleteWithAuth(t,n.token)}catch(i){if(!(i instanceof g&&(i.code==="session_not_found"||i.code==="session_expired")))throw AggregateError([o,i],`Cloud session ${t} was created but its recovery record could not be saved or its sandbox removed.`)}if(s)this.unconfirmedHandoffCreates.delete(s);throw await e.handoff.onOuterSessionRemoved?.(t),o}}async waitUntilReady(e,t,n){t=AbortSignal.any([t,AbortSignal.timeout(this.createTimeoutMs)]);let s=await this.options.getAuthToken(),o=s?{token:s,subject:ge(s)}:void 0;while(!t.aborted){let i;try{i=await this.request(`/api/v1/session/${encodeURIComponent(e)}/status`,{signal:AbortSignal.any([t,AbortSignal.timeout(B)])},void 0,o)}catch(a){if(t.aborted)throw a;if(a instanceof g&&a.code!=="request_failed")throw a;await nt(t);continue}let r=i?.status?.trim().toLowerCase();if(n?.({phase:we(i?.phase)}),r==="ready"||r==="active")return;if(r==="failed")throw new g("session_failed",i?.statusReason?.trim()||"The cloud sandbox could not be prepared.");if(r!=="provisioning")throw new g("request_failed","The cloud session service returned an unexpected provisioning status.");await nt(t)}throw t.reason}async resume(e,t){return await this.request(`/api/v1/session/${encodeURIComponent(e)}/resume`,{method:"POST",signal:t?AbortSignal.any([t,AbortSignal.timeout(B)]):void 0})}async delete(e,t){await this.deleteWithAuth(e,t)}async deleteWithAuth(e,t){let n;try{await this.request(`/api/v1/session/${encodeURIComponent(e)}`,{method:"DELETE"},void 0,t)}catch(s){if(!(s instanceof g)||s.code!=="session_not_found"&&s.code!=="session_expired")throw s;n=s}for(let[s,o]of this.completedHandoffCreates)if(o.sessionId===e)this.completedHandoffCreates.delete(s),this.unconfirmedHandoffCreates.delete(s);if(n)throw n}async updateTitle(e,t){return await this.request(`/api/v1/session/${encodeURIComponent(e)}`,{method:"PATCH",body:JSON.stringify({title:t})})}async history(e){let t=await this.options.getAuthToken();if(!t?.trim())throw new g("authentication_required","Sign in to Cline to load this session's history.");let n=await this.fetchImpl(`${this.apiBaseUrl}/api/v1/session/${encodeURIComponent(e)}/history`,{headers:{Accept:"application/json",Authorization:`Bearer ${t.trim()}`},signal:AbortSignal.timeout(B)});if(n.status===404)return null;let s=await n.json().catch(()=>{return});if(!n.ok)throw ye(n.status,s,this.appBaseUrl);if(!s||typeof s!=="object"||!("version"in s)||s.version!==1||!("messages"in s)||!Array.isArray(s.messages))throw new g("request_failed","Invalid archived session history");return s.messages}}import{randomUUID as yo}from"node:crypto";import{posix as le}from"node:path";import{createSessionId as qs,ensureLoopbackProxyBypass as qt,isHubProtocolCompatible as Ns,resolveClineBuildEnv as $s,resolveHubCommandTimeoutMs as Ws}from"@cerebriline/shared";import js from"ws";var q={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.92",repository:{type:"git",url:"https://github.com/cline/cline",directory:"sdk/packages/core"},type:"module",types:"./dist/index.d.ts",main:"./dist/index.js",private:!1,publishConfig:{access:"public"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./hub":{types:"./dist/hub/index.d.ts",import:"./dist/hub/index.js"},"./hub/daemon-entry":{types:"./dist/hub/daemon/entry.d.ts",import:"./dist/hub/daemon/entry.js"},"./telemetry":{types:"./dist/services/telemetry/index.d.ts",import:"./dist/services/telemetry/index.js"},"./services/feature-flags/posthog":{types:"./dist/services/feature-flags/posthog.d.ts",import:"./dist/services/feature-flags/posthog.js"},"./remote/helper-entry":{types:"./dist/remote/remote-helper-entry.d.ts",import:"./dist/remote/remote-helper-entry.js"},"./cloud":{types:"./dist/cloud/index.d.ts",import:"./dist/cloud/index.js"},"./remote/helper":{types:"./dist/remote/remote-helper.d.ts",import:"./dist/remote/remote-helper.js"}},scripts:{build:"bun run ./bun.mts && bun tsc -p tsconfig.build.json && bun run ./scripts/verify-runtime-build-id.ts",typecheck:"bun tsc -p tsconfig.dev.json --noEmit && bun run typecheck:smoke","typecheck:smoke":"bun tsc -p tsconfig.smoke.json --noEmit",test:"bun run test:unit && bun run test:e2e","test:live":"vitest run --config vitest.config.ts src/extensions/context/compaction.live.test.ts","test:compaction":"bun --conditions=development run scripts/compact-session.ts","test:unit":"vitest run --config vitest.config.ts","test:e2e":"vitest run --config vitest.e2e.config.ts","verify:routines":"zsh -lc 'bunx vitest run src/cron/schedule-service.test.ts --config vitest.config.ts'","test:watch":"vitest --config vitest.config.ts"},dependencies:{"@cerebriline/agents":"workspace:*","@cerebriline/llms":"workspace:*","@cerebriline/shared":"workspace:*","@joplin/turndown-plugin-gfm":"1.0.68","@lingo-reader/epub-parser":"0.4.6","@lingo-reader/fb2-parser":"0.4.6","@lingo-reader/mobi-parser":"0.4.6","@modelcontextprotocol/sdk":"^1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.214.0","@opentelemetry/exporter-logs-otlp-http":"^0.214.0","@opentelemetry/exporter-metrics-otlp-http":"^0.214.0","@opentelemetry/exporter-trace-otlp-http":"^0.214.0","@opentelemetry/resources":"^2.6.1","@opentelemetry/sdk-logs":"^0.214.0","@opentelemetry/sdk-metrics":"^2.6.1","@opentelemetry/sdk-trace-base":"^2.6.1","@opentelemetry/sdk-trace-node":"^2.6.1","@opentelemetry/semantic-conventions":"^1.40.0","@tesseract.js-data/eng":"1.0.0",cfb:"1.2.2","fast-png":"8.0.0",jiti:"^2.7.0",nanoid:"^5.1.7","node-machine-id":"^1.1.12",officeparser:"8.0.0","pdfjs-dist":"6.2.108","simple-git":"3.36.0","tesseract.js":"7.0.0","tree-sitter-wasms":"^0.1.12",turndown:"7.2.0","web-tree-sitter":"^0.25.0",ws:"^8.20.0",yaml:"^2.8.2",zod:"^4.3.6"},peerDependencies:{"posthog-node":"^5.8.0"},peerDependenciesMeta:{"posthog-node":{optional:!0}},devDependencies:{"@types/turndown":"^5.0.6","@types/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["assets","dist","scripts/document-reader-assets.mjs","!dist/**/*.d.ts.map"]};var rt="session_not_found";class Y extends Error{sessionId;code="session_not_found";constructor(e,t){super(t??(e?`session not found: ${e}`:"session not found"));this.sessionId=e;this.name="SessionNotFoundError"}}function ve(e){return e instanceof Y||typeof e==="object"&&e!==null&&"code"in e&&e.code==="session_not_found"}import{spawn as os}from"node:child_process";import{closeSync as is,mkdirSync as rs,openSync as as,readFileSync as ds,unlinkSync as cs}from"node:fs";import{basename as us,dirname as ls,join as ps}from"node:path";import{fileURLToPath as fs}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as hs,isBunEmbeddedModulePath as ms,isHubDaemonProcess as gs,resolveClineBuildEnv as Et,withResolvedClineBuildEnv as ys}from"@cerebriline/shared";import{createHash as kn,randomBytes as Rn}from"node:crypto";import{mkdir as Se,open as at,readFile as pt,rename as _n,rm as ke,writeFile as Pn}from"node:fs/promises";import{dirname as ft,join as Re}from"node:path";import{ensureLoopbackProxyBypass as An,isHubProtocolCompatible as Tn}from"@cerebriline/shared";import{resolveClineDataDir as N,resolveClineDir as ii}from"@cerebriline/shared/storage";var xn="CLINE_HUB_DISCOVERY_PATH",En="CLINE_HUB_BUILD_ID",Hn="CLINE_HUB_BUILD_EPOCH_MS",In=30000,Mn=15000,dt=100;function On(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function Un(e){return kn("sha256").update(e).digest("hex").slice(0,12)}function Dn(e){if(!Number.isInteger(e)||!e||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t instanceof Error&&"code"in t?String(t.code)==="EPERM":!1}}function ct(e){return new Promise((t)=>setTimeout(t,e))}function Ln(e){return`${e}.lock`}async function Bn(e){try{let t=JSON.parse(await pt(Re(e,"owner.json"),"utf8"));if(typeof t.pid!=="number"||typeof t.acquiredAt!=="string")return;return{pid:t.pid,acquiredAt:t.acquiredAt}}catch{return}}async function Ce(e){await ke(e,{recursive:!0,force:!0}).catch(()=>{return})}function U(){let e=process.env[En]?.trim();if(e)return e;return"sdk-v1-8c78914f755a47c295196668265818413b462a97b1a4cf92310a0d4a34dfad90".trim()||`source-${String(q.version)}`}function qn(){let e=Number(process.env[Hn]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1791961825128)?1791961825128:void 0}function X(e,t=U()){let n=Tn(e);if(!n.compatible)return n;let s=e.buildId?.trim();if(!s)return{compatible:!1,reason:"missing_build"};if(s!==t)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function ut(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function lt(e){let t=e?.trim().split(/[-+]/,1)[0];if(!t)return;let n=t.split(".").map((s)=>Number(s));if(n.length===0||n.some((s)=>!Number.isInteger(s)||s<0))return;return n}function Nn(e,t){for(let n=0;n<Math.max(e.length,t.length);n++){let s=e[n]??0,o=t[n]??0;if(s!==o)return s<o?-1:1}return 0}function ht(e,t){let n=e.buildId?.trim(),s=t.buildId?.trim();if(n&&s&&n===s)return 0;let o=ut(e.buildEpochMs),i=ut(t.buildEpochMs);if(o!==void 0&&i!==void 0&&o!==i)return o<i?-1:1;let r=lt(e.coreVersion),a=lt(t.coreVersion);if(r&&a){let d=Nn(r,a);if(d!==0)return d}if(n&&s&&n!==s)return n<s?-1:1;return 0}function mt(){return{buildId:U(),buildEpochMs:qn(),coreVersion:String(q.version)}}function Z(e,t){let n=t?.self??mt(),s=X(e,n.buildId??"");if(s.compatible)return!0;if(s.reason!=="build_mismatch"&&s.reason!=="missing_build")return!1;return ht(n,e)<=0}function gt(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${Un(e)}`,n=process.env[xn]?.trim()||Re(N(),"locks","hub","owners",`${On(t)}.json`);return{ownerId:t,discoveryPath:n}}async function I(e){try{let t=JSON.parse(await pt(e,"utf8"));if(typeof t.hubId!=="string"||typeof t.protocolVersion!=="string"||typeof t.authToken!=="string"||typeof t.host!=="string"||typeof t.port!=="number"||typeof t.url!=="string"||typeof t.startedAt!=="string"||typeof t.updatedAt!=="string")return;return{hubId:t.hubId,protocolVersion:t.protocolVersion,minClientProtocolVersion:typeof t.minClientProtocolVersion==="string"?t.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof t.maxClientProtocolVersion==="string"?t.maxClientProtocolVersion:void 0,capabilities:Array.isArray(t.capabilities)?t.capabilities.filter((n)=>typeof n==="string"):void 0,coreVersion:typeof t.coreVersion==="string"?t.coreVersion:void 0,buildId:typeof t.buildId==="string"?t.buildId:void 0,buildEpochMs:typeof t.buildEpochMs==="number"?t.buildEpochMs:void 0,authToken:t.authToken,host:t.host,port:t.port,url:t.url,pid:typeof t.pid==="number"?t.pid:void 0,startedAt:t.startedAt,updatedAt:t.updatedAt}}catch{return}}async function yt(e,t,n){await wt(e,async()=>{let s=ft(e);await Se(s,{recursive:!0});let o=`${e}.${process.pid}.${Rn(6).toString("hex")}.tmp`,i;try{i=await at(o,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
9
+ `,{encoding:"utf8"}),await i.sync(),await i.close(),i=void 0,n?.beforePublish?.(),await _n(o,e);let r;try{r=await at(s,"r"),await r.sync()}catch{}finally{await r?.close().catch(()=>{return})}}catch(r){throw await i?.close().catch(()=>{return}),await ke(o,{force:!0}).catch(()=>{return}),r}})}async function D(e){await wt(e,async()=>{await ke(e,{force:!0}).catch(()=>{return})})}async function bt(e,t,n){let s=Ln(e);await Se(ft(s),{recursive:!0});let o=Date.now()+Mn;while(!0){try{await Se(s,{recursive:!1})}catch(i){if((i instanceof Error&&"code"in i?String(i.code):"")!=="EEXIST")throw i;let a=await Bn(s);if(!a){if(Date.now()>=o){await Ce(s);continue}await ct(dt);continue}let d=Date.now()-Date.parse(a.acquiredAt);if(!Dn(a.pid)||d>In){await Ce(s);continue}if(Date.now()>=o)throw Error(`Timed out waiting for hub ${t} lock ${s}`);await ct(dt);continue}try{return await Pn(Re(s,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
10
+ `,"utf8"),await n()}finally{await Ce(s)}}}function wt(e,t){return bt(`${e}.mutation`,"discovery mutation",t)}function vt(e,t){return bt(e,"startup",t)}async function ee(e,t){An();try{let n=await fetch(t?.authToken?$n(e):St(e),{headers:t?.authToken?{authorization:`Bearer ${t.authToken}`}:void 0,signal:t?.signal});if(!n.ok)return;let s=await n.json();if(typeof s.protocolVersion!=="string"||typeof s.host!=="string"||typeof s.port!=="number"||typeof s.url!=="string")return;return{protocolVersion:s.protocolVersion,minClientProtocolVersion:typeof s.minClientProtocolVersion==="string"?s.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof s.maxClientProtocolVersion==="string"?s.maxClientProtocolVersion:void 0,capabilities:Array.isArray(s.capabilities)?s.capabilities.filter((o)=>typeof o==="string"):void 0,coreVersion:typeof s.coreVersion==="string"?s.coreVersion:void 0,buildId:typeof s.buildId==="string"?s.buildId:void 0,buildEpochMs:typeof s.buildEpochMs==="number"?s.buildEpochMs:void 0,host:s.host,port:s.port,url:s.url,hubId:typeof s.hubId==="string"?s.hubId:void 0,authToken:typeof s.authToken==="string"?s.authToken:void 0,pid:typeof s.pid==="number"?s.pid:void 0,startedAt:typeof s.startedAt==="string"?s.startedAt:void 0,updatedAt:typeof s.updatedAt==="string"?s.updatedAt:void 0}}catch{return}}function Ct(e,t,n="/hub"){return new URL(`ws://${e}:${t}${n}`).toString()}function St(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function $n(e){let t=new URL(St(e));return t.pathname="/status",t.toString()}import{CLINE_HUB_DEV_PORT as Wn,CLINE_HUB_PORT as jn,resolveClineBuildEnv as Fn}from"@cerebriline/shared";var zn="CLINE_HUB_HOST",Vn="CLINE_HUB_PORT",Gn="CLINE_HUB_PATHNAME",Jn="127.0.0.1",Kn=jn,Qn="/hub";function kt(e){return Fn(e)==="development"?Wn:Kn}function Yn(e={}){return(e.env??process.env)[zn]?.trim()||Jn}function Xn(e={}){let n=(e.env??process.env)[Vn]?.trim();if(!n)return kt(e);let s=Number.parseInt(n,10);if(!Number.isInteger(s)||s<1||s>65535)return kt(e);return s}function Zn(e={}){return(e.env??process.env)[Gn]?.trim()||Qn}function Rt(e={},t={}){return{host:e.host??Yn(t),port:e.port??Xn(t),pathname:e.pathname??Zn(t)}}import{join as es}from"node:path";var ts="shared:cline",ns="CLINE_HUB_DISCOVERY_PATH",ss="hub-production";function W(e=ts){return gt(`${e}@${U()}`)}function te(){return{ownerId:ss,discoveryPath:process.env[ns]?.trim()||es(N(),"locks","hub","production.json")}}var _t=15000,bs=200,Pt=3000,ws=100,vs=[100,250,500,1000,2000],Cs="--cline-hub-daemon",Ss=3,ks=60000,At=new Map;function Rs(e,t=Date.now()){let n=At.get(e);if(!n||t-n.windowStartedAt>ks)return At.set(e,{count:1,windowStartedAt:t}),!0;return n.count+=1,n.count<=Ss}function _s(e){return[...e.host?["--host",e.host]:[],...typeof e.port==="number"?["--port",String(e.port)]:[],...e.pathname?["--pathname",e.pathname]:[]]}function Ps(){try{let e=ps(N(),"logs","hub-daemon.log");return rs(ls(e),{recursive:!0}),{fd:as(e,"a"),logPath:e}}catch{return}}function As(){return Et()==="production"?te():W()}function j(e){return Z(e)}function Ts(e){try{let t=JSON.parse(ds(`${e}.superseded`,"utf8"));return{url:typeof t.url==="string"?t.url:void 0,authToken:typeof t.authToken==="string"?t.authToken:void 0,pid:typeof t.pid==="number"?t.pid:void 0}}catch{return}}function _e(e){try{cs(`${e}.superseded`)}catch{}}function Tt(e,t,n){if(!t||t.url!==n)return e;return{...e,authToken:e.authToken??t.authToken,pid:e.pid??t.pid}}async function F(e,t){try{return await ee(e,{authToken:t})}catch{return}}async function xt(e,t){let n=Date.now()+t;while(Date.now()<n){if(!(await F(e))?.url)return!0;await new Promise((o)=>setTimeout(o,ws))}return!1}async function Ae(e,t){if(!Rs(e.url))return!1;await z(e.url,e.authToken,"retired by newer install").catch(()=>!1),await Mt(e.url,e.authToken).catch(()=>!1);let n=await xt(e.url,Pt);if(!n&&e.pid&&xs(e.pid)){try{process.kill(e.pid,"SIGTERM")}catch{}n=await xt(e.url,Pt)}if(n)await D(t).catch(()=>{return});return n}function xs(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function Es(e){try{return(await Te(e.url,e.authToken)).activeSessionCount>0}catch{return!1}}async function Pe(e,t){if(j(e))return"reusable";let n=await z(e.url,e.authToken,"retired by newer install").catch(()=>!1);if(await Es(e)){if(n)await z(e.url,e.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let s=await Ae(e,t);if(!s&&n)await z(e.url,e.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return s?"retired":"failed"}async function Hs(e){if(Et()!=="production")return;let t=W();if(t.discoveryPath===e.discoveryPath)return;let n=await I(t.discoveryPath);if(n?.url)await Ae(n,t.discoveryPath);else await D(t.discoveryPath).catch(()=>{return})}function Is(){let e=import.meta.url.endsWith(".ts")?"ts":"js";return fs(new URL(`./entry.${e}`,import.meta.url))}function Ms(e,t){if(ms(e))return[Cs];return[...t&&e.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],e]}function Os(e,t){let n=Is(),s=process.execPath?.trim();if(!s)throw Error("unable to resolve runtime executable for hub daemon");let o=us(s).toLowerCase().includes("bun"),i=Ms(n,o);return{launcher:s,args:[...i,"--cwd",e,..._s(t),...t.manageConnectors===!1?["--no-connectors"]:[]],cwd:e,env:{...ys(process.env),CLINE_NO_INTERACTIVE:"1",[hs]:"1"}}}function Us(e){if(!e||typeof e!=="object")return!1;if(("code"in e?e.code:void 0)==="ETXTBSY")return!0;let n="message"in e?e.message:void 0;return typeof n==="string"&&n.includes("ETXTBSY")}function Ds(e,t={}){if(gs())return;let n=Os(e,t),s=Ps();try{os(n.launcher,n.args,{detached:!0,stdio:s?["ignore",s.fd,s.fd]:"ignore",env:n.env,cwd:n.cwd,windowsHide:!0}).unref()}finally{if(s)is(s.fd)}}async function Ls(e,t={}){for(let n=0;;n++)try{Ds(e,t);return}catch(s){let o=vs[n];if(!Us(s)||o===void 0)throw s;await new Promise((i)=>setTimeout(i,o))}}async function Bs(e,t,n={}){let s=n.host!==void 0||n.port!==void 0||n.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),o=Rt(n),i=Ct(o.host,o.port,o.pathname),r=(l)=>{if(!s)ne(l.url,l.authToken);else It(l.url,l.authToken);return l};await Hs(e).catch(()=>{return});let a=await I(e.discoveryPath),d=a?.url?void 0:Ts(e.discoveryPath),u=!1;if(a?.url){let l=a.authToken;if(!l)u=!0,await Ae(a,e.discoveryPath);else{let m=await F(a.url,l);if(m?.url&&j(m)&&await E(m.url,{authToken:l}))return _e(e.discoveryPath),r({url:m.url,authToken:l});if(m?.url){if(await Pe({...m,authToken:l},e.discoveryPath)==="deferred_busy"&&await E(m.url,{authToken:l}))return r({url:m.url,authToken:l})}else await D(e.discoveryPath).catch(()=>{return})}}let f=await F(i);if(f?.url){let l=Tt(f,a??d,i);if(j(f)){let y=[f.authToken,a?.authToken,d?.authToken].filter((v)=>typeof v==="string"&&v.trim().length>0);for(let v of y){if(!await E(f.url,{authToken:v}))continue;let P={hubId:f.hubId??`repaired-${f.port}`,protocolVersion:f.protocolVersion,minClientProtocolVersion:f.minClientProtocolVersion,maxClientProtocolVersion:f.maxClientProtocolVersion,capabilities:f.capabilities,coreVersion:f.coreVersion,buildId:f.buildId,authToken:v,host:f.host,port:f.port,url:f.url,pid:f.pid??a?.pid??d?.pid,startedAt:f.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await yt(e.discoveryPath,P)}catch{}return _e(e.discoveryPath),r({url:f.url,authToken:v})}throw Error(`A compatible Cline Hub is already running at ${i}, but its discovery record is missing or unreadable and no usable auth token is available. Run 'cline doctor fix' to repair local hub discovery.${u?" This can happen immediately after upgrading from a build that wrote an empty hub auth token; run 'cline doctor fix' to stop the old daemon and repair local hub discovery.":""}`)}let m=await Pe(l,e.discoveryPath);if(m==="deferred_busy"){for(let y of[l.authToken,a?.authToken].filter((w)=>typeof w==="string"&&w.trim().length>0))if(await E(f.url,{authToken:y}))return r({url:f.url,authToken:y});if(n.allowPortFallback!==!0&&o.port!==0)throw Error(`An older Cline Hub is running at ${i} and is still serving active sessions, so it was not replaced, but no usable auth token is available to attach to it. Finish those sessions, or run 'cline doctor fix' to stop the hub.`)}if(m==="failed"&&n.allowPortFallback!==!0&&o.port!==0)throw Error(`An incompatible Cline Hub is already running at ${i} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}let h=n.allowPortFallback===!0&&o.port!==0?{...o,port:0}:o;await Ls(t,{...h,manageConnectors:n.manageConnectors});let p=Date.now()+_t;while(Date.now()<p){let l=await I(e.discoveryPath);if(l?.url&&l.authToken){let y=await F(l.url,l.authToken);if(y?.url&&j(y)&&await E(y.url,{authToken:l.authToken}))return _e(e.discoveryPath),r({url:y.url,authToken:l.authToken})}let m=await F(i);if(m?.url&&!j(m)){let y=Tt(m,l??d,i),w=await Pe(y,e.discoveryPath);if(w==="deferred_busy"&&l?.authToken&&await E(m.url,{authToken:l.authToken}))return r({url:m.url,authToken:l.authToken});if(w==="failed"&&n.allowPortFallback!==!0&&o.port!==0)throw Error(`An incompatible Cline Hub is still running at ${i} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}await new Promise((y)=>setTimeout(y,bs))}throw Error(`Timed out after ${_t}ms waiting for detached hub startup.`)}async function Ht(e,t={}){let n=As();return await vt(n.discoveryPath,async()=>Bs(n,e,t))}function Fs(){return $s()==="production"?te():W()}function zs(){let e=globalThis.WebSocket;if(!e)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return e}function Nt(e){if(typeof e==="string")return e;if(e instanceof Uint8Array)return Buffer.from(e).toString();if(e instanceof ArrayBuffer)return Buffer.from(e).toString();if(Array.isArray(e))return Buffer.concat(e.map((t)=>Buffer.from(t))).toString();if(e&&typeof e==="object"&&"data"in e&&typeof e.data<"u")return Nt(e.data);return String(e)}function Vs(e){if(typeof e==="string")return e;if(e instanceof Uint8Array)return Buffer.from(e).toString("utf8");if(e instanceof ArrayBuffer)return Buffer.from(e).toString("utf8");return""}function Ot(e){let t=e,n=Vs(t.reason);return new k("hub_connection_closed",t.code||n?`Hub connection closed (code=${t.code??0}${n?`, reason=${n}`:""})`:Ee,{closeCode:t.code,closeReason:n||void 0})}function Ut(e,t){if(e instanceof k)return e;if(e instanceof Error)return new k("hub_connect_failed",e.message);if(e&&typeof e==="object"&&"error"in e&&e.error instanceof Error)return new k("hub_connect_failed",e.error.message);let n=e&&typeof e==="object"&&"message"in e&&typeof e.message==="string"?e.message.trim():"";if(n)return new k("hub_connect_failed",n);let s=e&&typeof e==="object"&&"type"in e&&typeof e.type==="string"?e.type.trim():"";return new k("hub_connect_failed",s?`Failed to connect to hub at ${t.toString()} (${s} event before socket open).`:`Failed to connect to hub at ${t.toString()}.`)}var xe="*",se=8000,Gs="cline-hub-auth.",Me=new Map,$t=new Set,Js=3000;var Ee="Hub connection closed",Ks=250,Qs=5000,Dt=0.5;class k extends Error{code;details;constructor(e,t,n){super(t);this.code=e;this.details=n;this.name="HubTransportError"}}function Ys(e){return e instanceof k}class He extends Error{command;code;constructor(e,t,n){super(n);this.command=e;this.code=t;this.name="HubCommandError"}}function Oe(e,t={}){let n=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),n)return n;if(t.skipRegistry)return;let s=oe(e.toString());return s?Me.get(s):void 0}function Xs(e){try{let n=new URL(e).hostname.toLowerCase().replace(/^\[|\]$/g,"");return n==="localhost"||n==="127.0.0.1"||n==="::1"}catch{return!1}}function oe(e){if(!Xs(e))return;let t=new URL(Wt(e));return t.search="",t.hash="",t.toString()}function Lt(e){let t=oe(e);return!!t&&$t.has(t)}function ne(e,t){let n=oe(e);if(n){if($t.add(n),t?.trim())Me.set(n,t)}return e}function It(e,t){let n=oe(e);if(n&&t?.trim())Me.set(n,t)}class V{options;socket;connectPromise;clientId;currentUrl;recoveryPromise;pendingReplies=new Map;listeners=new Set;subscriptionCounts=new Map;lastEventSequenceByKey=new Map;reconnectTimer;reconnectAttempt=0;closedByClient=!1;connectGeneration=0;lastCloseError=new k("hub_connection_closed",Ee);sawSocketClose=!1;registered=!1;capabilities;constructor(e){this.options=e;if(e.authToken?.trim()&&e.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");this.clientId=e.clientId??`core-${Math.random().toString(36).slice(2,10)}-${Date.now().toString(36)}`,this.currentUrl=e.url,this.capabilities=[...e.capabilities??[]]}getClientId(){return this.clientId}getUrl(){return this.currentUrl}isConnected(){return this.socket?.readyState===1&&this.registered}getConnectionError(){return this.isConnected()?null:this.lastCloseError}async updateCapabilities(e){if(this.capabilities=e.map((t)=>({...t})),!this.registered)return;await this.command("client.update",{capabilities:this.capabilities})}async connect(){if(this.connectPromise)return this.connectPromise;if(this.socket&&(this.socket.readyState===1||this.socket.readyState===0))return this.connectPromise??Promise.resolve();this.closedByClient=!1,this.clearReconnectTimer();let e=new URL(this.currentUrl),t=this.options.authToken?.trim()||Oe(e,{skipRegistry:Boolean(this.options.resolveConnectionHeaders)});if(e.hash="",t&&this.options.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");let n=++this.connectGeneration,s=this.openSocket(e,t,n),o;this.connectPromise=s.then(async(r)=>{if(o=r,await this.commandOnce("client.register",{clientId:this.clientId,clientType:this.options.clientType??"core",displayName:this.options.displayName??"core",transport:"native",actorKind:"client",capabilities:this.capabilities,metadata:{...this.options.metadata,version:this.options.clientVersion??String(q.version),pid:process.pid},workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),n!==this.connectGeneration||this.closedByClient){try{r.close()}catch{}throw this.lastCloseError}this.registered=!0;for(let a of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(a));this.reconnectAttempt=0});let i=this.connectPromise;try{await i}catch(r){if(this.connectPromise===i)this.connectPromise=void 0;if(o&&this.socket===o){this.lastCloseError=Ut(r,e),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{o.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw r}}async openSocket(e,t,n){let s=this.options.resolveConnectionHeaders,o;if(s){let d;try{o=await Promise.race([Promise.resolve().then(()=>s()),new Promise((u,f)=>{d=setTimeout(()=>{f(new k("hub_connect_timeout",`Timed out resolving hub connection headers after ${se}ms`))},se)})])}catch(u){let f=u instanceof k?u:new k("hub_connect_failed",u instanceof Error?u.message:String(u));if(n===this.connectGeneration)this.lastCloseError=f;throw f}finally{clearTimeout(d)}}if(n!==this.connectGeneration||this.closedByClient)throw this.lastCloseError;if(o&&Object.keys(o).some((d)=>d.toLowerCase()==="sec-websocket-protocol")){let d=new k("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(n===this.connectGeneration)this.lastCloseError=d;throw d}let i=o?new js(e.toString(),{headers:{...o}}):new(zs())(e.toString(),t?[`${Gs}${t}`]:void 0);this.socket=i;let r=!1,a=new Promise((d,u)=>{let f=!1,c=setTimeout(()=>{if(f)return;f=!0,r=!0;let h=new k("hub_connect_timeout",`Timed out connecting to hub after ${se}ms`);if(this.socket===i)this.lastCloseError=h,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{i.close()}catch{}u(h)},se);i.addEventListener("open",()=>{if(f)return;f=!0,clearTimeout(c),d()}),i.addEventListener("error",(h)=>{if(f)return;f=!0,clearTimeout(c);let p=Ut(h,e);if(this.socket===i)this.lastCloseError=p,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;u(p)}),i.addEventListener("close",(h)=>{if(f)return;f=!0,clearTimeout(c);let p=r?this.lastCloseError:Ot(h);if(this.socket===i){if(!r)this.lastCloseError=p,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}u(p)})});return i.addEventListener("message",(d)=>{this.handleFrame(JSON.parse(Nt(d)))}),i.addEventListener("close",(d)=>{if(this.socket!==i)return;if(!r)this.lastCloseError=Ot(d),this.sawSocketClose=!0;this.registered=!1;for(let u of this.pendingReplies.values())u.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await a,i}subscribe(e,t){let n=t?.sessionId?.trim()||void 0,s={listener:e,sessionId:n};return this.listeners.add(s),this.adjustSubscriptionCount(n,1),()=>{if(!this.listeners.delete(s))return;this.adjustSubscriptionCount(n,-1)}}async command(e,t,n,s){let o=0,i=e!=="client.register"&&e!=="client.unregister";while(!0)try{return await this.commandOnce(e,t,n,s)}catch(r){if(!i||o>=1||!await this.recoverLocalHubTransport(r))throw r;o+=1}}async commandOnce(e,t,n,s,o=!0){if(o)await this.connect();s?.beforeDispatch?.();let i=qs("hubreq_");s?.onDispatch?.(i);let r=Ws(e,s?.timeoutMs),a=new Promise((u,f)=>{let c=r===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(i))return;f(new He(e,"hub_command_timeout",`Hub command ${e} timed out after ${r}ms (hub=${this.currentUrl}, requestId=${i}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},r);this.pendingReplies.set(i,{resolve:(h)=>{if(c)clearTimeout(c);u(h)},reject:(h)=>{if(c)clearTimeout(c);f(h)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:e,requestId:i,clientId:this.clientId,sessionId:n,timeoutMs:r,payload:t}})}catch(u){throw this.pendingReplies.delete(i),u}let d=await a;if(!d.ok){if(d.error?.code===rt){let u=n??(typeof t?.sessionId==="string"?t.sessionId:void 0);throw new Y(u,d.error.message)}throw new He(e,d.error?.code,d.error?.message??`Hub command ${e} failed`)}return d}async recoverLocalHubTransport(e){if(!Lt(this.currentUrl)||!Ys(e))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let t=await Bt({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!t)return!1;return this.currentUrl=t,this.close(),!0})().finally(()=>{this.recoveryPromise=void 0}),await this.recoveryPromise}hasActiveSubscriptions(){return this.subscriptionCounts.size>0}clearReconnectTimer(){if(!this.reconnectTimer)return;clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0}scheduleReconnect(){if(this.reconnectTimer||this.closedByClient||!this.hasActiveSubscriptions())return;let e=Math.min(Ks*2**this.reconnectAttempt,Qs),t=Math.round(e*(1-Dt)+Math.random()*e*Dt);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},t)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!Lt(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let e=await Bt({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd});if(e){this.currentUrl=e,await this.connect(),this.reconnectAttempt=0;return}}catch{}this.reconnectAttempt+=1,this.scheduleReconnect()}}close(){let e=this.socket;if(this.closedByClient=!0,this.connectGeneration+=1,this.clearReconnectTimer(),this.registered=!1,e)this.lastCloseError=new k("hub_connection_closed",Ee);for(let t of this.pendingReplies.values())t.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,!e)return;this.sawSocketClose=!1,this.socket=void 0;try{e.close()}catch{}}async dispose(){if(this.socket?.readyState===1&&this.registered)try{await this.command("client.unregister",void 0,void 0,{timeoutMs:2000})}catch{}this.close()}sendFrame(e){if(!this.socket||this.socket.readyState!==1){if(this.lastCloseError.code==="hub_connection_closed"&&!this.sawSocketClose)throw new k("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify(e))}sendSubscriptionFrame(e,t){let n=e==="stream.subscribe"?this.lastEventSequenceByKey.get(this.subscriptionKeyForSessionId(t)):void 0;this.sendFrame({kind:e,clientId:this.clientId,...t?{sessionId:t}:{},...n!==void 0?{sinceSequence:n}:{}})}adjustSubscriptionCount(e,t){let n=this.subscriptionKeyForSessionId(e),s=(this.subscriptionCounts.get(n)??0)+t;if(s<=0){if(this.subscriptionCounts.delete(n),!this.hasActiveSubscriptions())this.clearReconnectTimer();if(t<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",e);return}if(this.subscriptionCounts.set(n,s),t>0&&s===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",e)}subscriptionKeyForSessionId(e){return e??xe}subscriptionSessionIdFromKey(e){return e===xe?void 0:e}handleFrame(e){switch(e.kind){case"reply":{let t=e.envelope.requestId;if(!t)return;let n=this.pendingReplies.get(t);if(!n)return;this.pendingReplies.delete(t),n.resolve(e.envelope);return}case"event":{let t=e.envelope.sequence;if(typeof t==="number"){let n=e.envelope.sessionId?.trim();for(let s of[xe,n]){if(!s||!this.subscriptionCounts.has(s))continue;let o=this.lastEventSequenceByKey.get(s)??0;if(t>o)this.lastEventSequenceByKey.set(s,t)}}for(let n of this.listeners){if(n.sessionId&&n.sessionId!==e.envelope.sessionId?.trim())continue;n.listener(e.envelope)}return}case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function Wt(e){let t=new URL(e);if(t.protocol==="http:")t.protocol="ws:";else if(t.protocol==="https:")t.protocol="wss:";return t.toString()}async function E(e,t){let n=new V({url:e,authToken:t?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:t?.workspaceRoot,cwd:t?.cwd});try{return await n.connect(),!0}catch{return!1}finally{n.close()}}async function Ie(e,t){let n=Wt(e),s=await ee(n,{authToken:t?.authToken});if(!s)return{status:"unreachable",url:n};if(t?.requireCurrentBuild){let o=U(),i=X(s,o);if(!i.compatible&&!Z(s))return{status:i.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:n}}else if(!Ns(s).compatible)return{status:"protocol_mismatch",url:n};if(t?.verifyConnection===!0&&!await E(n,{workspaceRoot:t.workspaceRoot,cwd:t.cwd,authToken:t.authToken}))return{status:"unreachable",url:n};return{status:"compatible",url:n}}function Zs(e){let t=e&&typeof e==="object"&&Array.isArray(e.sessions)?e.sessions:[],n=0,s=new Set;for(let o of t){if(!o||typeof o!=="object")continue;let i=o.participants;if(!Array.isArray(i)||i.length===0)continue;n+=1;for(let r of i){let a=r&&typeof r==="object"?r.clientId:void 0;if(typeof a==="string"&&a.trim())s.add(a)}}return{activeSessionCount:n,participantClientCount:s.size}}async function Te(e,t,n){let s=new V({url:e,authToken:t,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:n?.workspaceRoot,cwd:n?.cwd});try{let o=await s.command("session.list",{limit:500},void 0,{timeoutMs:Js});return Zs(o.payload)}finally{await s.dispose().catch(()=>{return})}}async function eo(e,t,n){try{return(await Te(e,t,n)).activeSessionCount===0}catch{return!1}}async function to(e,t){let n=`${e.discoveryPath}.superseded`,s=await I(n);if(!s?.url||!s.authToken)return;let o=await Ie(s.url,{authToken:s.authToken});if(o.status!=="compatible")return;if(await eo(o.url,s.authToken,t))return;return ne(o.url,s.authToken)}async function no(e={}){if(e.endpoint?.trim()){let o=await Ie(e.endpoint);return o.status==="compatible"?o.url:void 0}let t=Fs(),n=await I(t.discoveryPath);if(!n?.url)return await to(t,e);let s=await Ie(n.url,{authToken:n.authToken,requireCurrentBuild:!0});if(s.status==="compatible")return ne(s.url,n.authToken);if(s.status==="protocol_mismatch")await D(t.discoveryPath).catch(()=>{return});return}async function Bt(e={}){let t=await no(e);if(t&&await E(t,{workspaceRoot:e.workspaceRoot,cwd:e.cwd}))return t;if(e.endpoint?.trim())return;try{return(await Ht(e.workspaceRoot??process.cwd())).url}catch(n){e.onStartupError?.(n);return}}async function z(e,t,n,s){qt();let o=new URL(e),i=t?.trim()||Oe(o);if(o.protocol==="ws:")o.protocol="http:";else if(o.protocol==="wss:")o.protocol="https:";if(o.pathname="/drain",o.hash="",n)o.searchParams.set("reason",n);if(s?.off)o.searchParams.set("off","1");return(await fetch(o,{method:"POST",headers:i?{authorization:`Bearer ${i}`}:void 0})).ok}async function Mt(e,t){qt();let n=new URL(e),s=t?.trim()||Oe(n);if(n.protocol==="ws:")n.protocol="http:";else if(n.protocol==="wss:")n.protocol="https:";return n.pathname="/shutdown",n.hash="",(await fetch(n,{method:"POST",headers:s?{authorization:`Bearer ${s}`}:void 0})).ok}function so(e,t){if(!e||typeof e!=="object")return;let n=e,s=typeof n.id==="string"?n.id.trim():"";if(!s)return;let o=typeof n.display_name==="string"?n.display_name.trim():typeof n.displayName==="string"?n.displayName.trim():"",i=typeof n.name==="string"?n.name.trim():"";return{id:s,name:o||i||s,catalogId:t}}function Ue(e,t){return Array.isArray(e)?e.flatMap((n)=>{let s=so(n,t);return s?[s]:[]}):[]}async function jt(e,t={}){let n=e.trim(),s=n.length;while(s>0&&n[s-1]==="/")s--;let o=n.slice(0,s),i=async(m)=>{let y=await(t.fetchImpl??fetch)(`${o}${m}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(1e4)});if(!y.ok)throw Error(`HTTP ${y.status}`);return await y.json()},r,a;try{[r,a]=await Promise.all([i("/api/v1/ai/cline/models"),i("/api/v1/ai/cline/recommended-models")])}catch(m){throw Error("Could not load the cloud model catalog.",{cause:m})}let d=r&&typeof r==="object"?r:void 0,u=Ue(Array.isArray(r)?r:d?.data,"cline"),f=a&&typeof a==="object"?a:void 0,c=f?.data&&typeof f.data==="object"?f.data:f,h=Ue(c?.clinePass,"cline-pass"),p=Ue(c?.clineCloud,"cline-cloud"),l=new Set;return[...t.isOrganizationSession?[]:h,...p,...u].filter((m)=>{if(l.has(m.id))return!1;return l.add(m.id),!0})}import{formatDisplayUserInput as Ft}from"@cerebriline/shared";var oo=new Set(["auto_compaction","compaction_budget_emergency","completion_reminder","loop_detection_notice","manual_compaction","mistake_stop_notice","recovery_notice"]);function io(e){switch(e){case"user":case"assistant":case"tool":case"system":case"status":case"error":return e;default:return"assistant"}}function ro(e){return e.metadata&&typeof e.metadata==="object"&&!Array.isArray(e.metadata)?e.metadata:void 0}function ao(e){let t=e?.userRunSpan;return typeof t==="number"&&Number.isInteger(t)&&t>=0?t:void 0}function co(e){if(typeof e.content==="string")return{hasAttachment:!1,text:e.content};if(!Array.isArray(e.content))return{hasAttachment:!1,text:"unknown"};let t=!1,n=!1,s=[];for(let o of e.content){if(!o||typeof o!=="object"||Array.isArray(o))continue;let i=o;if(i.type==="text"&&typeof i.text==="string")s.push(i.text);else if(i.type==="tool_result"||i.type==="tool-result")n=!0;else if(i.type==="file"||i.type==="image")t=!0}return{hasAttachment:t&&!n,text:s.join(`
11
+ `)}}function uo(e){let t=Ft(e);return t.startsWith("[TASK RESUMPTION]")||t==="The user approved switching to act mode. Continue with the approved plan now."}function lo(e){if(io(e.role)!=="user")return 0;let t=ro(e),n=typeof t?.kind==="string"?t.kind:void 0,s=ao(t);if(n==="compaction"||n==="compaction_summary")return s??1;if(s!==void 0)return s;if(n&&oo.has(n))return 0;let o=co(e);if(!o.hasAttachment&&!Ft(o.text))return 0;if(!o.hasAttachment&&uo(o.text))return 0;return 1}function zt(e){return lo(e)>0}function ae(e){return Array.isArray(e?.sessions)?e.sessions.filter((t)=>Boolean(t)&&typeof t==="object"&&!Array.isArray(t)):[]}function De(e){let t=e.updatedAt;return typeof t==="number"?t:Date.parse(String(t??""))||0}function Le(e){let t=e?.metadata&&typeof e.metadata==="object"?e.metadata:void 0;return String(t?.model??e?.model??"").trim()}function de(e){let t=e.metadata&&typeof e.metadata==="object"?e.metadata:void 0;return!String(t?.parentSessionId??e.parentSessionId??"").trim()}function Kt(e,t="text"){if(!e||typeof e!=="object"||Array.isArray(e))return"";let n=e.content;if(typeof n==="string")return t==="text"?n.trim():"";if(!Array.isArray(n))return"";return n.map((s)=>s&&typeof s==="object"&&!Array.isArray(s)?t==="thinking"&&s.type==="redacted_thinking"?"[redacted]":String(s[t]??""):"").join("").trim()}function ie(e){let t=e.trim(),n=t.match(/^<user_input\b[^>]*>([\s\S]*)<\/user_input>$/);return(n?n[1]:t).trim()}function G(e,t,n){let s=ie(n);return e.filter((o)=>Boolean(o)&&typeof o==="object"&&!Array.isArray(o)&&String(o.role??"").toLowerCase()==="user"&&(s!==""||zt(o))&&ie(Kt(o))===s).length+t.filter((o)=>ie(o.prompt)===s).length}function Be(e){return e.flatMap((t)=>{if(t.event!=="session.pending_prompt_submitted")return[];let n=t.payload?.prompt&&typeof t.payload.prompt==="object"&&!Array.isArray(t.payload.prompt)?t.payload.prompt:void 0,s=String(n?.id??"").trim();if(!s)return[];return[{id:s,prompt:String(n?.prompt??""),steer:n?.delivery==="steer",attachmentCount:typeof n?.attachmentCount==="number"?n.attachmentCount:0,userImages:Array.isArray(n?.userImages)?n.userImages.filter((o)=>typeof o==="string"):void 0}]})}var po=new Set(["run.completed","run.aborted","run.failed"]),fo=new Set(["assistant.delta","assistant.finished","reasoning.delta","reasoning.finished"]);function Vt(e,t){return e.filter((n)=>Boolean(n)&&typeof n==="object"&&!Array.isArray(n)&&String(n.role??"").toLowerCase()==="assistant").map((n)=>Kt(n,t)).filter(Boolean)}function Gt(e,t,n="text"){let s=new Map;for(let o of Vt(t,n))s.set(o,(s.get(o)??0)+1);return Vt(e,n).filter((o)=>{let i=s.get(o)??0;if(i===0)return!0;if(i===1)s.delete(o);else s.set(o,i-1);return!1})}function re(e,t,n=new Set){if(!e||typeof e!=="object")return n;if(Array.isArray(e)){for(let i of e)re(i,t,n);return n}let s=e,o=t==="tool_use"?s.id:s.tool_use_id;if(s.type===t&&typeof o==="string")n.add(o);for(let i of Object.values(s))re(i,t,n);return n}function Jt(e,t="assistant"){let n="",s="";for(let o of e)if(o.event===`${t}.delta`)s+=t==="reasoning"&&o.payload?.redacted&&!o.payload?.text?"[redacted]":typeof o.payload?.text==="string"?o.payload.text:"";else if(o.event===`${t}.finished`){let i=o.payload?.[t==="assistant"?"text":"reasoning"],r=typeof i==="string"&&i?i:s;if(r)n=r;s=""}return(n||s).trim()}function Qt(e,t,n={}){let s=n.queueSnapshotApplied!==!1,o=Gt(t,n.baselineMessages??[]),i=Gt(t,n.baselineMessages??[],"thinking"),r=re(t,"tool_use"),a=re(t,"tool_result"),d=new Set(e.slice(0,n.messagesSnapshotEventCutoff??e.length)),u=new Set,f=new Map;for(let y of e.slice(0,n.messagesSnapshotEventCutoff??e.length)){let w=Be([y])[0];if(!w)continue;let v=ie(w.prompt),P=f.get(v)??Math.max(0,G(t,[],v)-G(n.baselineMessages??[],[],v));if(f.set(v,Math.max(0,P-1)),P>0)u.add(y)}let h=[...s?e.slice(n.queueSnapshotEventCutoff??e.length):e].reverse().find((y)=>y.event==="session.pending_prompts"),p=[],l=[],m=(y)=>{if(l.length===0)return;let w=l.filter((A)=>d.has(A)),v=(A)=>{if(!y)return-1;let S=[...w].reverse().findIndex((nn)=>nn.event===`${A}.finished`),L=S<0?-1:w.length-1-S;return L>=0||l.at(-1)?.event==="run.aborted"?L:w.length-1},P=v("assistant"),H=v("reasoning"),b=Jt(w.slice(0,P+1)),R=b?o.findIndex((A)=>A.endsWith(b)):-1,M=R>=0;if(M)o.splice(R,1);let J=Jt(w.slice(0,H+1),"reasoning"),pe=J?i.findIndex((A)=>A.endsWith(J)):-1;if(pe>=0)i.splice(pe,1);for(let[A,S]of l.entries()){if(u.has(S)){p.push({...S,payload:{...S.payload,transcriptReflected:!0}});continue}if(d.has(S)&&fo.has(S.event)&&(S.event.startsWith("reasoning.")?pe>=0&&A<=H:M&&A<=P))continue;if(S.event==="session.pending_prompts"&&S!==h)continue;if(d.has(S)&&S.event.startsWith("tool.")){let L=String(S.payload?.toolCallId??"").trim();if(a.has(L)||S.event==="tool.started"&&r.has(L))continue}p.push(S)}l=[]};for(let y of e)if(l.push(y),po.has(y.event))m(!0);return m(!1),p}import{formatDisplayUserInput as ho}from"@cerebriline/shared";function ce(e){let t=structuredClone(e),n=(s)=>{if(!s||typeof s!=="object"||Object.isFrozen(s))return;for(let o of Object.values(s))n(o);Object.freeze(s)};return n(t),t}function ue(e){let t=e?.trim();return t?ho(t).slice(0,120):void 0}function qe(e){if(typeof e==="string")return e;if(Array.isArray(e)){let t=[];for(let n of e){if(typeof n==="string"){if(n.trim())t.push(n);continue}if(!n||typeof n!=="object")continue;let s=n,o=typeof s.type==="string"?s.type:"",i=o==="text"?String(s.text??""):o==="thinking"?String(s.thinking??""):o==="tool_use"?`[tool] ${String(s.name??"tool_call")}`:o==="tool_result"?`[tool_result]
12
+ ${qe(s.content)}`:o==="image"?"[image]":o==="redacted_thinking"?"[redacted_thinking]":typeof s.text==="string"?s.text:"";if(i.trim())t.push(i)}return t.join(`
13
+ `)}if(e&&typeof e==="object"){let t=e;if(typeof t.text==="string")return t.text}return""}function mo(e){let t=ue(e??void 0);if(!t)return;return t.split(`
14
+ `)[0]?.trim().slice(0,70)||void 0}function go(e){for(let t of["user","assistant"])for(let n of e){if(!n||typeof n!=="object")continue;let s=n;if(s.role!==t)continue;let o=ue(qe(s.content));if(!o)continue;return o.split(`
15
+ `)[0]?.trim().slice(0,70)||void 0}return}function Ne(e){let t=e.metadata&&typeof e.metadata==="object"?ue(e.metadata.title):void 0;if(t)return t.slice(0,70);let n=mo(e.prompt);if(n)return n;let s=e.messages?go(e.messages):void 0;if(s)return s;return`Session ${e.sessionId.slice(-6)}`}function Yt(e,t,n,s){let o=t.payload??{},i=()=>{let a=n.get(s);if(a===void 0||!e.messages[a]||e.messages[a]?.role!=="assistant")a=e.messages.length,e.messages.push({role:"assistant",content:[]}),n.set(s,a);let d=e.messages[a];if(!Array.isArray(d.content))d.content=[];return d.content},r=(a,d,u)=>{let f=i(),c=f.at(-1);if(c?.type===a)c[d]=`${c[d]??""}${u}`;else f.push({type:a,[d]:u})};switch(t.event){case"assistant.delta":if(typeof o.text==="string")r("text","text",o.text);return;case"reasoning.delta":if(typeof o.text==="string"&&o.text)r("thinking","thinking",o.text);else if(o.redacted===!0)i().push({type:"redacted_thinking",data:""});return;case"assistant.finished":n.delete(s);return;case"assistant.media":if(o.media)i().push({type:"media",media:structuredClone(o.media)});return;case"tool.started":{let a=String(o.toolCallId??"");if(a&&!e.messages.some((d)=>Array.isArray(d.content)&&d.content.some((u)=>u.type==="tool_use"&&u.id===a)))i().push({type:"tool_use",id:a,name:String(o.toolName??"tool"),input:structuredClone(o.input??{})});return}case"tool.finished":{let a=String(o.toolCallId??"");if(a&&!e.messages.some((d)=>Array.isArray(d.content)&&d.content.some((u)=>u.type==="tool_result"&&u.tool_use_id===a)))e.messages.push({role:"user",content:[{type:"tool_result",tool_use_id:a,content:typeof o.output==="string"?o.output:JSON.stringify(o.output??""),is_error:Boolean(o.error)}]}),n.delete(s);return}case"usage.updated":e.usage=structuredClone(o.totals??o.delta??{});return;case"session.pending_prompts":{let a=Array.isArray(o.prompts)?o.prompts:[];e.promptsInQueue=a.map((d)=>({id:String(d.id??""),prompt:String(d.prompt??""),steer:d.delivery==="steer",attachmentCount:typeof d.attachmentCount==="number"?d.attachmentCount:0,userImages:Array.isArray(d.userImages)?d.userImages.filter((u)=>typeof u==="string"):void 0})).filter((d)=>d.id&&(d.prompt||d.attachmentCount));return}case"session.pending_prompt_submitted":{let a=o.prompt,d=String(a?.id??"");if(!d||e.lastQueuedPromptStartId===d)return;if(e.lastQueuedPromptStartId=d,e.promptsInQueue=e.promptsInQueue.filter((u)=>u.id!==d),o.transcriptReflected!==!0)e.messages.push({role:"user",content:[{type:"text",text:String(a?.prompt??"")}]});e.busy=!0,e.status="running",e.endedAt=void 0,n.delete(s);return}case"run.started":case"session.attached":case"session.updated":{if(typeof t.sequence==="number"&&e.lastHubStatusSequence!==void 0&&t.sequence<e.lastHubStatusSequence)return;if(typeof t.sequence==="number")e.lastHubStatusSequence=t.sequence;let a=o.session,d=typeof a?.status==="string"?a.status:t.event==="run.started"?"running":e.status,u=d==="pending"?"running":d;if(t.event==="session.updated"&&u==="running"&&e.endedAt!==void 0&&!e.busy)return;let f=e.busy;if(e.status=u,e.busy=u==="running",t.event==="run.started"){if(!f)n.delete(s);e.endedAt=void 0}return}case"run.completed":case"run.failed":case"run.aborted":{if(typeof t.sequence==="number"&&e.lastHubStatusSequence!==void 0&&t.sequence<e.lastHubStatusSequence)return;if(typeof t.sequence==="number")e.lastHubStatusSequence=t.sequence;e.status=typeof o.reason==="string"?o.reason:t.event==="run.failed"?"error":t.event==="run.aborted"?"aborted":"completed",e.busy=!1,e.endedAt=Date.now(),n.delete(s);return}}}function $e(e){return e instanceof Error&&e.name==="HubTransportError"&&["hub_connect_timeout","hub_connect_failed","hub_connection_closed","hub_connection_not_open"].includes(String(e.code))}function We(e,t){return e instanceof Error&&e.name==="HubCommandError"&&e.code==="hub_command_timeout"&&(!t||e.command===t)}var C="/workspace",bo=30000,wo=2000,vo=2000,Xt="IMPORTANT: GitHub authentication is handled automatically by the infrastructure. An egress proxy transparently injects credentials into all GitHub traffic. You do NOT need to set up, configure, or manage any tokens, API keys, or credentials, and you must never run `gh auth login` or attempt to authenticate manually. "+"The GitHub CLI (`gh`) is installed and already authenticated — prefer it for GitHub work "+"(`gh pr create`, `gh pr diff`, `gh issue list`, `gh api`, ...). `git` push and pull are authenticated the same way. "+"Simply run the commands normally — credentials are injected transparently.";function je(e){if(!e)return C;if(le.isAbsolute(e)||e.includes("\\")||e.split("/").some((n)=>!n||n==="."||n===".."))throw new g("request_failed","The handoff workspace path must stay inside the repository.");let t=le.join(C,e);if(!t.startsWith(`${C}/`))throw new g("request_failed","The handoff workspace path must stay inside the repository.");return t}function Je(e){let t=e.metadata.cwd;return typeof t==="string"&&le.normalize(t)===t&&(t===C||t.startsWith(`${C}/`))?t:C}function Zt(e){let t=e?.metadata&&typeof e.metadata==="object"?e.metadata:void 0,n=t?.handoff&&typeof t.handoff==="object"?t.handoff:void 0;return String(n?.sourceSessionId??"").trim()}class Ve extends Error{constructor(e){super(e instanceof Error?e.message:"Cloud conversation creation was not dispatched.",{cause:e});this.name="CloudHandoffSeedRejectedError"}}class Ge extends g{constructor(){super("request_failed","The connection was interrupted and Cline could not confirm whether this message was queued. Check the cloud session before resending it.");this.name="CloudQueueUnconfirmedError"}}class tn extends Error{constructor(){super("The cloud session was created, but its transcript was not persisted. This cloud runtime cannot durably seed handoff transcripts and must use @cline/core 0.0.72 or newer. Updating the cloud runtime or pod is required; retrying /cloud against this same pod will not help.");this.name="CloudHandoffSeedUnsupportedError"}}function T(e){let t=e.expiredAt?Date.parse(e.expiredAt):Number.NaN;return Number.isFinite(t)&&t<=Date.now()}function Co(e){return e.trim().startsWith("ses-")}function So(e,t){let n=new URL(`/api/v1/session/${encodeURIComponent(t)}`,e);return n.protocol=n.protocol==="https:"?"wss:":"ws:",n.toString()}function Fe(e){return{config:{executionTarget:"cloud",provider:"cline",providerId:"cline",model:e.metadata.modelId??"",modelId:e.metadata.modelId??"",repoUrl:e.repoContext.repoUrl??"",branch:e.repoContext.branch??"",cwd:Je(e),workspaceRoot:C},messages:[],promptsInQueue:[],busy:!1,startedAt:Date.parse(e.createdAt)||Date.now(),endedAt:T(e)&&e.expiredAt?Date.parse(e.expiredAt):void 0,status:e.status,attachedViaHub:!0}}function ze(e,t,n){return{sessionId:e.id,origin:"cloud",executionTarget:"cloud",status:t,provider:"cline",model:e.metadata.modelId??"",repoUrl:e.repoContext.repoUrl??"",branch:e.repoContext.branch??"",cwd:Je(e),workspaceRoot:C,...n?.trim()?{prompt:n.trim()}:{},metadata:{origin:"cloud",repoUrl:e.repoContext.repoUrl??"",git:{url:e.repoContext.repoUrl??"",branch:e.repoContext.branch??""}}}}function en(e){return{sessionId:e.id,origin:"cloud",executionTarget:"cloud",status:e.status,provider:"cline",model:e.metadata.modelId??"",cwd:Je(e),workspaceRoot:C,repoUrl:e.repoContext.repoUrl??"",branch:e.repoContext.branch??"",startedAt:e.createdAt,...e.lastActivityAt?{lastActivityAt:e.lastActivityAt}:{},endedAt:T(e)?e.expiredAt??void 0:e.status==="failed"?e.lastActivityAt??e.createdAt:void 0,updatedAt:e.updatedAt,...e.title?.trim()?{title:e.title.trim()}:{},metadata:{...e.title?.trim()?{title:e.title.trim()}:{},origin:"cloud",...e.metadata.provisioningPhase?{provisioningPhase:e.metadata.provisioningPhase}:{},repoUrl:e.repoContext.repoUrl??"",git:{url:e.repoContext.repoUrl??"",branch:e.repoContext.branch??""}}}}function ko(e){if(typeof e!=="string")return e;try{return JSON.parse(e)}catch{return e}}function Ro(e,t){let n=[...e??[]],s=new Set(n.map((o)=>o.id));for(let o of t)if(!s.has(o.id))n.push(o);return n}class _o{options;sessionGenerations=new Map;sessions=new Map;approvals=new Map;listeners=new Set;detachedSessions=new Set;restoredOptions=new Map;authoritativeMessages=new Map;streamingMessages=new Map;disposed=!1;connections=new Map;connectionPromises=new Map;knownSessions=new Map;unlistedSessions=new Map;pendingInitialTasks;lastListedSessions=[];discoveryRefresh;unconfirmedInnerCreates=new Set;createRequests=new Map;provisioningControllers=new Map;sendAbortTokens=new Map;titleWrites=new Map;deletingSessions=new Set;createHubClient;constructor(e){this.options=e;this.pendingInitialTasks=e.pendingInitialTasks??new Map,this.createHubClient=e.createHubClient??((t)=>new V(t))}restoreCreationOptions(e,t){if(this.restoredOptions.set(e,structuredClone(t)),this.pendingInitialTasks.has(e))this.pendingInitialTasks.set(e,{...this.pendingInitialTasks.get(e),...structuredClone(t)});let n=this.sessions.get(e);if(n)Object.assign(n.config,structuredClone(t))}seedSessionState(e,t){if(!this.sessions.has(e))this.sessions.set(e,structuredClone(t))}stateFromRecord(e){let t=Fe(e);return Object.assign(t.config,this.pendingInitialTasks.get(e.id),this.restoredOptions.get(e.id)),t}getSnapshot(e){let t=this.knownSessions.get(e),n=this.sessions.get(e)??(t?this.stateFromRecord(t):void 0);if(!n)return;let s=this.connections.get(e);return ce({...n,sessionId:e,record:t,approvals:Array.from(this.approvals.values()).filter((o)=>o.item.sessionId===e).map((o)=>o.item),connectionState:this.detachedSessions.has(e)||this.disposed?"detached":s?.reconnectResolution||s?.rehydrationPromise?"reconnecting":s?s.connected?"connected":s.reconnecting?"reconnecting":"connecting":this.connectionPromises.has(e)?"connecting":"detached",transcriptKnown:s?.transcriptKnown??Boolean(t&&T(t))})}subscribe(e,t){let n=(s)=>{if(!t||s.sessionId===t)e(s)};return this.listeners.add(n),()=>{this.listeners.delete(n)}}publish(e){let t=e.type==="snapshot"?Object.freeze(e):ce(e);for(let n of this.listeners)try{n(t)}catch(s){this.options.logger?.error?.("Cloud session subscriber failed",{error:s})}}publishSnapshot(e,t=!1,n){this.cancelScheduledSnapshot(e);let s=this.getSnapshot(e);if(s)this.publish({type:"snapshot",sessionId:e,snapshot:s,replace:t,cause:n});else this.publish({type:"removed",sessionId:e})}snapshotTimers=new Map;cancelScheduledSnapshot(e){clearTimeout(this.snapshotTimers.get(e)),this.snapshotTimers.delete(e)}scheduleSnapshot(e){if(this.disposed||this.detachedSessions.has(e)||this.snapshotTimers.has(e))return;let t=setTimeout(()=>this.publishSnapshot(e),100);t.unref?.(),this.snapshotTimers.set(e,t)}notify(e,t){let n=String(t.sessionId??"");if(e==="cloud_session_sync_failed")this.publish({type:"sync_failed",sessionId:n,message:String(t.message??"Cloud synchronization failed")});else this.publishSnapshot(n,e==="cloud_session_rehydrated",e==="chat_session_status"?"status":e==="chat_session_ended"?"ended":e==="tool_approval_state"?"approvals":void 0)}applyLiveEvent(e,t){let n=this.sessions.get(e);if(n)Yt(n,t,this.streamingMessages,e)}async respondApproval(e,t,n){this.assertSessionActive(e);let s=this.approvals.get(`${e}:${t}`);if(!s){if(!this.connections.has(e))throw Error("This cloud session connection is closed; reopen the session to respond.");throw new g("request_failed","This approval was already resolved or is no longer available.")}await s.resolve(n)}async detach(e){this.detachedSessions.add(e),this.sessionGenerations.set(e,(this.sessionGenerations.get(e)??0)+1),this.connectionPromises.delete(e),this.sendAbortTokens.set(e,Symbol()),this.abortProvisioningControllers(e,Error("Cloud viewer detached")),await this.disposeConnection(e),this.publishSnapshot(e)}isCloudSession(e){return Co(e)||this.knownSessions.has(e)||this.connections.has(e)||this.sessions.get(e)?.config.executionTarget==="cloud"}getCachedDiscoveryRecord(e){let t=this.knownSessions.get(e);return t?en(t):void 0}async getCrossScopeDiscoveryRecord(e){let t=this.getCachedDiscoveryRecord(e);if(!t)return;try{let s=(await this.options.api.status(e)).status?.trim();return s?{...t,status:s}:t}catch(n){if(n instanceof g&&(n.code==="session_not_found"||n.code==="session_expired")){this.knownSessions.delete(e),this.unlistedSessions.delete(e),this.pendingInitialTasks.delete(e);return}return t}}async list(){if(this.disposed)throw Error("Cloud session controller was disposed");let e=(r)=>this.sessions.get(r)?.title??this.knownSessions.get(r)?.title,t=new Map([...this.knownSessions.keys(),...this.sessions.keys()].map((r)=>[r,e(r)])),n=(r)=>{let a=e(r.id);if(this.titleWrites.has(r.id)||a!==t.get(r.id))r.title=a??r.title},s=await this.resolveActiveOrganizationId(),o=(await this.options.api.list(s)).map((r)=>this.preserveConnectedRuntimeModel(r));if(this.disposed)throw Error("Cloud session controller was disposed");this.lastListedSessions=o;for(let r of o)n(r),this.knownSessions.set(r.id,r),this.unlistedSessions.delete(r.id);await Promise.all(Array.from(this.unlistedSessions.keys(),(r)=>this.getCrossScopeDiscoveryRecord(r)));let i=await Promise.all(o.map(async(r)=>{if(r.status!=="provisioning")return r;let a=await this.options.api.status(r.id).catch(()=>{return}),d=a?.status?.trim();if(!d)return r;return{...r,status:d,metadata:{...r.metadata,...we(a?.phase)?{provisioningPhase:a?.phase}:{},...a?.statusReason?.trim()?{statusReason:a.statusReason.trim()}:{}}}}));if(this.disposed)throw Error("Cloud session controller was disposed");for(let r of i){n(r),this.knownSessions.set(r.id,r);let a=this.sessions.get(r.id);if(a)a.title=r.title;if(a?.status==="provisioning"&&r.status!=="provisioning")a.status=r.status;let d=this.connections.get(r.id);if(d)d.remote=r;let u=T(r);if(u||r.status==="failed"||r.status==="suspended"){if(a)a.busy=!1,a.status=u?"expired":r.status,a.endedAt=u?Date.parse(r.expiredAt??"")||Date.now():Math.max(a.endedAt??0,Date.parse(r.lastActivityAt??r.createdAt)||0)||void 0;if(d)this.disposeConnection(r.id).catch(()=>{return})}}this.lastListedSessions=i;for(let r of i)if(this.sessions.has(r.id))this.publishSnapshot(r.id);return ce(i)}async handoffTargetExists(e){try{return await this.options.api.status(e),!0}catch(t){if(t instanceof g&&(t.code==="session_not_found"||t.code==="session_expired"))return!1;throw t}}preserveConnectedRuntimeModel(e){let t=this.connections.get(e.id)?.remote.metadata,n=t?.cwd??this.knownSessions.get(e.id)?.metadata.cwd;return{...e,metadata:{...e.metadata,...t?.modelId?{modelId:t.modelId}:{},...n?{cwd:n}:{}}}}async resolveActiveOrganizationId(e){return await this.options.getActiveOrganizationId?.(e)}async listRepositories(){return await this.options.api.listRepositories(await this.resolveActiveOrganizationId())}async listModels(){if(this.disposed)throw Error("Cloud session manager was disposed");let e=await this.resolveActiveOrganizationId({fresh:!0}),t=await jt(this.options.apiBaseUrl,{isOrganizationSession:Boolean(e)});if(this.disposed)throw Error("Cloud session manager was disposed");return t}async prepareHandoffRepository(e){let t=await this.resolveActiveOrganizationId(),n=await this.options.api.listRepositories(t);if(!n.connected)throw new g("github_not_connected","Connect GitHub before handing this session off to cloud.",n.connectUrl);let s=(o)=>o.trim().replace(/\.git$/i,"").replace(/\/+$/,"").toLowerCase();if(!n.repositories.some((o)=>s(o.url)===s(e)))throw new g("github_not_connected",`The GitHub integration cannot access ${e}. Grant repository access before handing off.`,n.connectUrl);return t?{organizationId:t}:{}}async listBranches(e,t={}){return await this.options.api.listBranches(e,await this.resolveActiveOrganizationId(),t)}async listForDiscovery(e={}){let t=this.discoveryRefresh??this.list().finally(()=>{if(this.discoveryRefresh===t)this.discoveryRefresh=void 0});this.discoveryRefresh=t;let n=this.lastListedSessions;if(e.timeoutMs===void 0)n=await t;else{let i,r=await Promise.race([t.then((a)=>({value:a}),(a)=>{if(!(a instanceof g&&a.code==="authentication_required"))this.options.logger?.error?.("Cloud session discovery failed",{error:a});return{value:this.lastListedSessions}}),new Promise((a)=>{i=setTimeout(()=>a({value:this.lastListedSessions}),Math.max(0,e.timeoutMs??0))})]);if(i)clearTimeout(i);n=r.value}return[...new Map([...this.unlistedSessions.values(),...n].map((i)=>[i.id,i])).values()].map((i)=>{let r=en(i),a=this.sessions.get(i.id);if(!a)return r;let d=a.title?.trim()||i.title?.trim();return{...r,status:a.status,prompt:a.prompt,endedAt:a.endedAt!==void 0?new Date(a.endedAt).toISOString():r.endedAt,metadata:{...r.metadata??{},title:Ne({sessionId:i.id,metadata:d?{title:d}:void 0,prompt:a.prompt,messages:a.messages})}}})}async create(e){let t=e.requestId?.trim();if(!t)return await this.createOnce(e);let n=this.createRequests.get(t);if(n)return await n;let s=this.createOnce(e).finally(()=>{if(this.createRequests.get(t)===s)this.createRequests.delete(t)});return this.createRequests.set(t,s),await s}trackProvisioningController(e,t){let n=this.provisioningControllers.get(e);if(!n)n=new Set,this.provisioningControllers.set(e,n);return n.add(t),()=>{if(n.delete(t),n.size===0)this.provisioningControllers.delete(e)}}abortProvisioningControllers(e,t){let n=this.provisioningControllers.get(e);if(!n?.size)return!1;for(let s of n)s.abort(t);return!0}async waitUntilReady(e){this.detachedSessions.delete(e),this.assertSessionActive(e);let t=new AbortController,n=this.trackProvisioningController(e,t);try{await this.options.api.waitUntilReady(e,AbortSignal.any([t.signal,AbortSignal.timeout(610000)])),t.signal.throwIfAborted(),this.assertSessionActive(e),await this.refreshKnownSession(e)}finally{n()}}async seedHandoff(e,t){je(t.workspaceRelativePath),this.detachedSessions.delete(e);let n=await this.ensureConnection(e,{createInner:!0,handoffSeed:t});if(!n.innerSessionId)throw Error("Cloud Hub did not return an inner session id");return{innerSessionId:n.innerSessionId}}async verifyHandoffTranscript(e,t,n={}){let s=await this.ensureConnection(e),o=s.innerSessionId;if(!o)throw Error("Cloud Hub did not return an inner session id");let i=await s.client.command("session.messages",{sessionId:o},o);this.assertSessionActive(e,s);let r=i.payload?.messages;if(!Array.isArray(r))throw Error("Cloud runtime returned no transcript after seeding.");if(t.length>0&&r.length===0)throw new tn;if(!(n.allowAppendedMessages?r.length>=t.length&&he(t,r.slice(0,t.length)):he(t,r)))throw new me(t.length,r.length);s.transcriptKnown=!0;let d=this.sessions.get(e);if(d)d.messages=structuredClone(r),this.authoritativeMessages.set(e,structuredClone(r)),this.streamingMessages.delete(e),this.publishSnapshot(e,!0)}async createOnce(e){if(this.disposed)throw Error("Cloud session manager was disposed");let t=je(e.workspaceRelativePath),n=e.organizationId===void 0?await this.resolveActiveOrganizationId({fresh:!0}):e.organizationId??void 0,s=e.handoff,o=!s,i=await this.options.api.create({...e,organizationId:n,...s&&{handoff:{...s,onOuterSessionCreated:async(h,p)=>{o=p?.created===!0,await s.onOuterSessionCreated(h,p)}}}});if(!i?.sessionId?.trim())throw new g("request_failed","The cloud session service returned an unexpected response; please try again.");if(this.disposed){if(o&&this.options.lateCreateDisposition==="delete")await this.deleteProvisionedSessionAfterDispose(i.sessionId,i.cleanupAuthToken,e.handoff?.onOuterSessionRemoved);throw Error("Cline account changed while the cloud session was starting")}let r={id:i.sessionId,sandboxType:e.sandboxType,status:i.status,sandboxUrl:i.sandboxUrl,repoContext:{repoUrl:e.repoUrl,...e.branch?.trim()?{branch:e.branch.trim()}:{}},metadata:{modelId:e.modelId,cwd:t},createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};this.knownSessions.set(r.id,r),this.unlistedSessions.set(r.id,r);let{autoApproveTools:a,thinking:d,reasoningEffort:u}=e;this.pendingInitialTasks.set(r.id,{autoApproveTools:a,thinking:d,reasoningEffort:u});let f=this.stateFromRecord(r);f.prompt=e.initialPrompt?.trim()||void 0,f.config.mode=e.mode??"act",this.sessions.set(r.id,f);let c;try{if(e.handoff){let h=await e.handoff.resolveMessages();this.assertSessionActive(r.id),c=(await this.seedHandoff(r.id,{sourceSessionId:e.handoff.sourceSessionId,messages:h,mode:e.mode,workspaceRelativePath:e.workspaceRelativePath,config:{autoApproveTools:e.autoApproveTools,thinking:e.thinking,reasoningEffort:e.reasoningEffort},onSeeding:e.handoff.onSeeding})).innerSessionId}}catch(h){if(this.disposed&&o&&this.options.lateCreateDisposition==="delete")await this.deleteProvisionedSessionAfterDispose(r.id,i.cleanupAuthToken,e.handoff?.onOuterSessionRemoved);throw h}return this.assertSessionActive(r.id),this.notify("chat_session_status",{sessionId:r.id,status:f.status}),{sessionId:r.id,origin:"cloud",executionTarget:"cloud",status:r.status,provider:"cline",model:e.modelId,repoUrl:e.repoUrl,branch:e.branch??"",cwd:t,workspaceRoot:C,...c?{innerSessionId:c}:{},...f.prompt?{prompt:f.prompt}:{}}}async deleteProvisionedSessionAfterDispose(e,t,n){this.knownSessions.delete(e),this.unlistedSessions.delete(e),this.pendingInitialTasks.delete(e),this.sessions.delete(e),await this.options.api.delete(e,t).then(()=>n?.(e)).catch((s)=>{this.options.logger?.log("Failed to clean up a cloud session created during an account change",{sessionId:e,error:s})})}async attach(e,t){let n=this.sessionGenerations.get(e)??0;if(this.detachedSessions.delete(e),t)this.restoreCreationOptions(e,t);let s=await this.ensureKnownSession(e);if(this.assertSessionActive(e),n!==(this.sessionGenerations.get(e)??0))throw Error("Cloud viewer detached during attachment");if(!this.sessions.has(e))this.sessions.set(e,this.stateFromRecord(s));if(s.status==="provisioning"||s.status==="failed")return ze(s,s.status,this.sessions.get(e)?.prompt);if(T(s))return await this.disposeConnection(e),await this.attachExpired(s);let o;try{o=await this.ensureConnection(e)}catch(a){let d=await this.refreshKnownSession(e);if(d&&T(d))return await this.disposeConnection(e),await this.attachExpired(d);throw a}await this.ensureAttached(o);let i=o.remote,r=this.sessions.get(e);return ze(i,r?.status??i.status,r?.prompt)}async send(e,t,n,s,o){let i=this.sendAbortTokens.get(e),r=this.knownSessions.get(e);if(r&&T(r))throw new g("session_expired","This cloud session has expired; its sandbox is gone. Start a new cloud session to continue.");let a=await this.ensureConnection(e,{createInner:!0}),d=()=>this.disposed||a.disposed||this.deletingSessions.has(e)||this.sendAbortTokens.get(e)!==i,u=()=>{if(d())throw Error("Cloud session prompt cancelled")};if(u(),await a.reconnectResolution,u(),await this.ensureAttached(a),await a.reconnectResolution,u(),!a.transcriptKnown)await this.rehydrateAfterTransportDrop(e,a);u(),await this.updateModel(a,s),await a.reconnectResolution,u();let f=a.innerSessionId;if(!f)throw Error("Cloud Hub session was not initialized");let c=this.sessions.get(e),h=n??(c?.busy?"queue":void 0),p=G(c?.messages??[],c?.promptsInQueue??[],t),l=h!=="queue"&&h!=="steer",m=c&&h!=="queue"?{role:"user",content:[{type:"text",text:t}]}:void 0;if(c&&m)c.messages=[...c.messages,m];let y=()=>{if(c&&m)c.messages=c.messages.filter((b)=>b!==m),this.publishSnapshot(e)};if(c&&l){let b=c.status!=="running";if(c.busy=!0,c.status="running",c.prompt||=t,b)this.publishSnapshot(e,!1,"status")}let w=this.knownSessions.get(e);if(w&&!w.title?.trim()&&!this.titleWrites.has(e)){let b=ot(t);if(b){if(w.title=b,c)c.title=b;let R=this.options.api.updateTitle?.(e,b).then(()=>{}).catch(()=>{}).finally(()=>{if(this.titleWrites.get(e)===R)this.titleWrites.delete(e)});if(R)this.titleWrites.set(e,R)}}let v=new Set,P=!1,H=()=>{if(P||d())return;P=!0,this.publish({type:"prompt_accepted",sessionId:e,prompt:t,delivery:h})};try{let b=await a.client.command("session.send_input",{prompt:t,delivery:h,...o?.length?{attachments:{userImages:o}}:{}},f,{timeoutMs:h==="queue"?bo:null,onDispatch:(M)=>{v.add(M),a.pendingInputs??=new Map,a.pendingInputs.set(M,{clientId:a.client.getClientId(),ownsBusyState:l,accept:H})},beforeDispatch:()=>{if(u(),a.innerSessionId!==f)throw Error("The cloud session reconnected before the prompt could be sent. Please try again.")}});H();let R=h==="queue"||h!=="steer"&&b.payload?.result===void 0;if(R)y();return{sessionId:e,ok:!0,...R?{queued:!0}:{},result:b.payload?.result}}catch(b){if(d())throw y(),b;if($e(b)||We(b,"session.send_input")){let R;try{R=await this.rehydrateAfterTransportDrop(e,a)}catch(J){if(u(),y(),c&&l)c.busy=!1,c.status="error";if(h==="queue")throw new Ge;throw J}if(u(),h==="queue")throw new Ge;if(h==="steer")throw new g("request_failed","Cline could not confirm whether this message was accepted. Check the cloud session before resending it.");if(G(R.messages,Ro(R.prompts,R.submittedPrompts),t)<=p)throw new g("request_failed","Cline could not confirm whether this message was accepted. Check the cloud session before resending it.");return{sessionId:e,ok:!0,...h==="queue"?{queued:!0}:{},recoveredAfterDisconnect:!0,status:R.status}}if(y(),c&&l)c.busy=!1,c.status="error";throw this.publishSnapshot(e),b}finally{for(let b of v)a.pendingInputs?.delete(b)}}async updateModel(e,t){let n=t?.trim();if(!n||e.remote.metadata.modelId===n)return;let s=e.innerSessionId;if(!s)throw Error("Cloud Hub session was not initialized");await e.client.command("session.update_connection",{sessionId:s,updates:{modelId:n}},s,{beforeDispatch:()=>{if(this.assertSessionActive(e.remote.id,e),e.innerSessionId!==s)throw Error("The cloud session reconnected before the model could be changed. Please try again.")}}),this.assertSessionActive(e.remote.id,e),this.applyModel(e,n)}applyModel(e,t){e.remote.metadata.modelId=t;let n=this.sessions.get(e.remote.id);if(n)n.config.model=t,n.config.modelId=t}async rehydrateAfterTransportDrop(e,t){if(this.assertSessionActive(e,t),t.rehydrationPromise)return t.rehydrationRerunRequested=!0,await t.rehydrationPromise;let n=(async()=>{let s;do t.rehydrationRerunRequested=!1,s=await this.performTransportRehydration(e,t),this.assertSessionActive(e,t);while(t.rehydrationRerunRequested&&!this.disposed);return s})().finally(()=>{if(t.rehydrationPromise===n)t.rehydrationPromise=void 0,this.publishSnapshot(e)});return t.rehydrationPromise=n,await n}async performTransportRehydration(e,t){this.assertSessionActive(e,t);let n=t.innerSessionId;if(!n)throw Error("Cloud Hub session was not initialized");t.bufferingEvents=!0,t.bufferedEvents=[],t.bufferedEventsDropped=0;try{await this.ensureAttached(t),this.assertSessionActive(e,t);let s=await t.client.command("session.get",{includeSnapshot:!0},n);this.assertSessionActive(e,t);let o=s.payload?.session&&typeof s.payload.session==="object"&&!Array.isArray(s.payload.session)?s.payload.session:void 0;this.applySessionModel(t,o);let i=this.sessions.get(e),r=this.authoritativeMessages.get(e)??[],a=String(o?.status??i?.status??"running").trim(),d=a==="pending"?"running":a;if(d==="running"&&!t.transcriptKnown&&!t.pendingInputs?.size)t.externalRun??={progressHydrated:!0};let u=()=>t.client.command("session.messages",{sessionId:n},n),f=await u().catch((b)=>{if(!We(b,"session.messages"))throw b;return this.assertSessionActive(e,t),u()});if(this.assertSessionActive(e,t),!Array.isArray(f.payload?.messages))throw Error("Cloud Hub returned an invalid transcript snapshot");let c=f.payload.messages,h=t.bufferedEventsDropped+t.bufferedEvents.length,p=await t.client.command("session.pending_prompts",{sessionId:n},n).catch(()=>{return});this.assertSessionActive(e,t);let l=t.bufferedEventsDropped+t.bufferedEvents.length;if(i){let b=i.status!==d;if(this.authoritativeMessages.set(e,structuredClone(c)),i.messages=structuredClone(c),this.streamingMessages.delete(e),i.status=d,i.busy=d==="running",b)if(d==="completed"||d==="failed"||d==="aborted")i.endedAt=Date.now(),this.notify("chat_session_ended",{sessionId:e,reason:d==="failed"?"error":d});else this.notify("chat_session_status",{sessionId:e,status:d})}let m=p!==void 0&&p.ok!==!1&&Array.isArray(p.payload?.prompts),y=m?this.applyQueueSnapshot(e,p):void 0;t.transcriptKnown=!0;let w=c;this.assertSessionActive(e,t),this.notify("cloud_session_rehydrated",{sessionId:e,status:d,transcriptKnown:!0,messages:w}),this.assertSessionActive(e,t);let v=t.bufferedEvents,P=Be(v),H=Qt(v,c,{queueSnapshotApplied:m,queueSnapshotEventCutoff:Math.max(0,l-t.bufferedEventsDropped),messagesSnapshotEventCutoff:Math.max(0,h-t.bufferedEventsDropped),baselineMessages:r});t.bufferedEvents=[],t.bufferingEvents=!1,t.syncFailureNotified=!1;for(let b of H)this.forwardEvent(e,t,b);return{status:d,messages:c,prompts:y,submittedPrompts:P}}catch(s){let o=t.bufferedEvents;t.bufferedEvents=[],t.bufferingEvents=!1,this.assertSessionActive(e,t);for(let i of o)this.forwardEvent(e,t,i);if(!t.syncFailureNotified)t.syncFailureNotified=!0,this.notify("cloud_session_sync_failed",{sessionId:e,message:s instanceof Error?s.message:String(s)});throw s}}async abort(e){if(this.sendAbortTokens.set(e,Symbol()),this.abortProvisioningControllers(e,Error("Cloud session prompt cancelled")))return{sessionId:e,ok:!0};let t=await this.ensureConnection(e),n=()=>{if(this.disposed||t.disposed)throw Error("Cloud session connection was disposed")};if(n(),await t.client.connect(),await t.reconnectResolution,n(),await this.resolveInnerSession(e,t),t.innerSessionId){await this.ensureAttached(t),await t.reconnectResolution,n();let o=t.innerSessionId;if(!o)throw Error("Cloud Hub session was not initialized");await t.client.command("run.abort",{sessionId:o},o,{beforeDispatch:()=>{if(n(),t.innerSessionId!==o)throw Error("The cloud session reconnected before Stop could be sent. Please try Stop again.")}})}n();let s=this.sessions.get(e);if(s)s.busy=!1,s.status="aborted";return this.publishSnapshot(e),{sessionId:e,ok:!0}}async pendingPrompts(e){if(this.knownSessions.get(e)?.status==="provisioning")return{sessionId:e,promptsInQueue:[]};if(!(await this.ensureConnection(e)).innerSessionId)return{sessionId:e,promptsInQueue:[]};let n=await this.queueCommand(e,"session.pending_prompts",{});return{sessionId:e,promptsInQueue:this.applyQueueSnapshot(e,n)}}async updatePendingPrompt(e,t,n){let s=await this.queueCommand(e,"session.update_pending_prompt",{promptId:t,...n});return{sessionId:e,updated:s.payload?.updated===!0,promptsInQueue:this.applyQueueSnapshot(e,s)}}async removePendingPrompt(e,t){let n=await this.queueCommand(e,"session.remove_pending_prompt",{promptId:t});return{sessionId:e,removed:n.payload?.removed===!0,promptsInQueue:this.applyQueueSnapshot(e,n)}}async queueCommand(e,t,n){let s=await this.ensureConnection(e),o=s.innerSessionId;if(!o)throw Error("Cloud Hub session was not initialized");await s.client.connect(),await s.reconnectResolution,await this.ensureAttached(s),await s.reconnectResolution;let i=await s.client.command(t,{sessionId:o,...n},o,{beforeDispatch:()=>{if(this.assertSessionActive(e,s),s.innerSessionId!==o)throw Error("The cloud session reconnected before the queue request could be sent. Refresh the queue and try again.")}});return this.assertSessionActive(e,s),i}applyQueueSnapshot(e,t){if(!Array.isArray(t.payload?.prompts))throw Error("Cloud Hub returned an invalid pending-prompts snapshot");let s=t.payload.prompts.map((i)=>({id:typeof i.id==="string"?i.id:"",prompt:typeof i.prompt==="string"?i.prompt:"",steer:i.delivery==="steer",attachmentCount:typeof i.attachmentCount==="number"?i.attachmentCount:0,userImages:Array.isArray(i.userImages)?i.userImages.filter((r)=>typeof r==="string"):void 0})).filter((i)=>i.id),o=this.sessions.get(e);if(o)o.promptsInQueue=s;return this.publishSnapshot(e,!1,"queue"),s}async readMessages(e){let t=this.knownSessions.get(e);if(t?.status==="provisioning"||t?.status==="failed")return[];if(t&&T(t))return await this.loadArchivedMessages(t)??[];try{let n=await this.ensureConnection(e);if(!n.innerSessionId)return[];return(await this.rehydrateAfterTransportDrop(e,n)).messages}catch(n){let s=await this.refreshKnownSession(e)??t;if(s){let o=await this.loadArchivedMessages(s).catch(()=>null);if(o!==null)return o}throw n}}async updateTitle(e,t){let n=this.titleWrites.get(e),s=(async()=>{await n?.catch(()=>{}),this.assertSessionActive(e),await this.options.api.updateTitle(e,t);let o=this.knownSessions.get(e);if(o)o.title=t;let i=this.sessions.get(e);if(i)i.title=t;this.publishSnapshot(e)})();this.titleWrites.set(e,s);try{await s}finally{if(this.titleWrites.get(e)===s)this.titleWrites.delete(e)}}async delete(e){this.deletingSessions.add(e),this.abortProvisioningControllers(e);try{let t=this.connectionPromises.get(e);if(t)await t.catch(()=>{return});await this.disposeConnection(e);try{await this.options.api.delete(e)}catch(n){let s=n instanceof g?n.code:"";if(s!=="session_not_found"&&s!=="session_expired")throw n}this.knownSessions.delete(e),this.unlistedSessions.delete(e),this.pendingInitialTasks.delete(e),this.sessions.delete(e),this.authoritativeMessages.delete(e),this.restoredOptions.delete(e),this.publish({type:"removed",sessionId:e}),this.sendAbortTokens.delete(e);for(let[n,s]of this.approvals)if(s.item.sessionId===e)this.approvals.delete(n)}finally{this.deletingSessions.delete(e)}}async dispose(){this.disposed=!0;for(let t of this.snapshotTimers.keys())this.cancelScheduledSnapshot(t);this.sendAbortTokens.clear();for(let t of this.provisioningControllers.values())for(let n of t)n.abort();this.provisioningControllers.clear();let e=new Set([...this.connections.keys(),...this.knownSessions.keys(),...this.sessions.keys()]);for(let[t,n]of this.approvals)if(e.has(n.item.sessionId))this.approvals.delete(t);for(let t of e)this.sessions.delete(t),this.knownSessions.delete(t),this.publish({type:"removed",sessionId:t});if(this.knownSessions.clear(),this.unlistedSessions.clear(),!this.options.pendingInitialTasks)this.pendingInitialTasks.clear();this.listeners.clear(),await Promise.allSettled(Array.from(this.connections.keys()).map((t)=>this.disposeConnection(t)))}async attachExpired(e){let t=this.sessions.get(e.id)??Fe(e);return t.busy=!1,t.status="expired",this.sessions.set(e.id,t),await this.loadArchivedMessages(e).catch(()=>{return}),ze(e,"expired")}async loadArchivedMessages(e){let t=this.sessionGenerations.get(e.id),n=await this.options.api.history(e.id);if(this.assertSessionActive(e.id),this.sessionGenerations.get(e.id)!==t)throw Error("Cloud session attachment changed while loading history");if(n===null)return null;let s=this.sessions.get(e.id)??Fe(e);return s.messages=structuredClone(n),this.sessions.set(e.id,s),this.authoritativeMessages.set(e.id,structuredClone(s.messages)),this.publishSnapshot(e.id,!0),n}async refreshKnownSession(e){let t=await this.resolveActiveOrganizationId(),n=await this.options.api.list(t).catch(()=>{return});if(this.disposed)throw Error("Cloud session manager was disposed");if(!n)return this.knownSessions.get(e);for(let s of n)this.knownSessions.set(s.id,s);return n.find((s)=>s.id===e)}async ensureKnownSession(e){let t=this.knownSessions.get(e);if(t)return t;let n=(await this.list()).find((s)=>s.id===e);if(!n)throw new g("session_not_found",`Cloud session ${e} was not found.`);return this.knownSessions.get(e)??structuredClone(n)}assertSessionActive(e,t){if(this.disposed||t?.disposed||this.detachedSessions.has(e)||t?.generation!==void 0&&t.generation!==(this.sessionGenerations.get(e)??0))throw Error("Cloud session connection was disposed");if(this.deletingSessions.has(e))throw new g("session_not_found","This cloud session is being deleted.")}async ensureConnection(e,t={}){let n=this.sessionGenerations.get(e)??0,s=()=>{if(this.assertSessionActive(e),n!==(this.sessionGenerations.get(e)??0))throw Error("Cloud viewer detached during connection")};s();let o=this.connectionPromises.get(e),i=o?await o:this.connections.get(e);if(i?.remote.status==="suspended")return await this.disposeConnection(e),s(),await this.ensureConnection(e,t);if(i){if(this.assertSessionActive(e,i),await i.reconnectResolution,this.assertSessionActive(e,i),!i.innerSessionId)await i.client.connect(),await i.reconnectResolution,this.assertSessionActive(e,i),await this.resolveInnerSession(e,i,Boolean(t.handoffSeed)),this.assertSessionActive(e,i);if(t.handoffSeed&&i.innerSessionId)await this.assertHandoffConnectionReusable(i,t.handoffSeed);if(t.createInner&&!i.innerSessionId)await this.createInnerSession(i,t.handoffSeed);return this.assertSessionActive(e,i),i}let r=(async()=>{let a=await this.ensureKnownSession(e);if(s(),!this.pendingInitialTasks.has(e)&&(a.sandboxType==="resumable"||a.metadata.sandboxType==="resumable"||a.status==="suspended")){let c=await this.options.api.status(e).catch(async(p)=>{if(!(p instanceof g?p.code==="request_failed"&&(p.status===void 0||p.status===408||p.status===429||p.status>=500):p instanceof TypeError||p instanceof Error&&p.name==="TimeoutError"))throw p;return s(),await this.refreshKnownSession(e).catch(()=>{return})});if(s(),c?.status)a.status=c.status;let h=this.sessions.get(e);if(h?.status==="suspended"&&["provisioning","ready","active"].includes(a.status))h.status=a.status,h.busy=!1,h.endedAt=void 0}if(a.status==="suspended"){let c=new AbortController,h=this.trackProvisioningController(e,c);try{try{a=await this.options.api.resume(e,c.signal)}catch(l){if(!(l instanceof g)||l.status!==409)throw l;s(),c.signal.throwIfAborted();let m=await this.options.api.status(e,{signal:c.signal});if(m.status!=="provisioning"&&m.status!=="ready"&&m.status!=="active")throw l;a={...a,status:m.status}}s(),c.signal.throwIfAborted(),this.knownSessions.set(e,a);let p=this.sessions.get(e);if(p)p.status=a.status,p.busy=!1,p.endedAt=void 0;this.publishSnapshot(e,!1,"status")}finally{h()}}if(a.status==="provisioning"){let c=new AbortController,h=this.trackProvisioningController(e,c);try{if(await this.options.api.waitUntilReady(e,c.signal,({phase:l})=>{a.metadata.provisioningPhase=l,this.notify("chat_session_status",{sessionId:e,status:"provisioning",phase:l})}),this.disposed)throw Error("Cloud session manager was disposed");if(a=await this.refreshKnownSession(e)??a,c.signal.throwIfAborted(),a.status==="provisioning")a.status="ready";let p=this.sessions.get(e);if(p?.status==="provisioning")p.status="idle",p.busy=!1,p.endedAt=void 0}catch(p){if(p instanceof g&&p.code==="session_failed"){if(a.status="failed",a.metadata.statusReason=p.detail,a.metadata.provisioningPhase="failed",!this.disposed)this.knownSessions.set(e,a);let l=this.sessions.get(e);if(l)l.status="error";this.notify("chat_session_status",{sessionId:e,status:"error"})}throw p}finally{h()}}if(s(),a.status==="failed")throw new g("session_failed",a.metadata.statusReason||"The cloud sandbox could not be prepared.");if(T(a))throw new g("session_expired","This cloud session has expired; its sandbox is gone. Start a new cloud session to continue.");this.sessions.set(e,this.sessions.get(e)??this.stateFromRecord(a));let d,u=0,f=this.createHubClient({url:So(this.options.apiBaseUrl,e),clientId:`${this.options.clientIdentity?.prefix??"cloud"}-${e}-${yo()}`,clientType:this.options.clientIdentity?.type??"cloud-client",displayName:this.options.clientIdentity?.displayName??"Cline cloud session",workspaceRoot:C,cwd:C,resolveConnectionHeaders:async()=>{s();let c=u>0;if(u+=1,d)d.connected=!1,d.reconnecting=c,this.publishSnapshot(e);if(c){let p=d;if(p&&!p.disposed){p.transcriptKnown=!1,p.innerSessionId=void 0;let l=(async()=>{if(await this.resolveInnerSession(e,p),p.innerSessionId)await this.rehydrateAfterTransportDrop(e,p)})().catch(()=>this.disposeConnectionIfSessionGone(e,p)).finally(()=>{if(p.reconnectResolution===l)p.reconnectResolution=void 0,p.connected=p.transcriptKnown,this.publishSnapshot(e)});p.reconnectResolution=l}}let h=await this.options.getAuthToken();if(!h?.trim())throw new g("authentication_required","Sign in to Cline to reconnect this cloud session.");return s(),{Authorization:`Bearer ${h.trim()}`}}});d={generation:n,remote:a,client:f,bufferedEvents:[],bufferedEventsDropped:0,transcriptKnown:!1,seenEventIds:new Set,unsubscribe:()=>{}},d.unsubscribe=f.subscribe(()=>{},{sessionId:a.metadata.taskId?.trim()||e}),this.connections.set(e,d);try{if(await f.connect(),d.connected=!0,this.publishSnapshot(e),this.assertSessionActive(e,d),await this.resolveInnerSession(e,d,Boolean(t.handoffSeed)),this.assertSessionActive(e,d),t.handoffSeed&&d.innerSessionId)await this.assertHandoffConnectionReusable(d,t.handoffSeed);if(t.createInner&&!d.innerSessionId)await this.createInnerSession(d,t.handoffSeed);return this.assertSessionActive(e,d),d}catch(c){if($e(c)&&!this.disposed&&!d.disposed&&!this.deletingSessions.has(e))throw c;if(this.connections.get(e)===d)this.connections.delete(e);if(d.disposed=!0,d.unsubscribe(),!this.disposed&&n===(this.sessionGenerations.get(e)??0))this.clearPendingApprovals(e);throw await f.dispose().catch(()=>{return}),c}})().finally(()=>{if(this.connectionPromises.get(e)===r)this.connectionPromises.delete(e)});return this.connectionPromises.set(e,r),await r}async resolveInnerSession(e,t,n=!1){if(this.assertSessionActive(e,t),t.innerSessionId)return;let s=t.remote.metadata.taskId?.trim(),o;if(s)try{let a=await t.client.command("session.get",{sessionId:s},s);this.assertSessionActive(e,t),o=a.payload?.session&&typeof a.payload.session==="object"&&!Array.isArray(a.payload.session)?a.payload.session:void 0}catch(a){if(!ve(a))throw a}else{let a=await t.client.command("session.list",{limit:100});this.assertSessionActive(e,t),o=ae(a.payload).filter(de).sort((d,u)=>De(u)-De(d))[0]}let i=String(o?.sessionId??"").trim();if(!i||!o){if(!n&&!this.pendingInitialTasks.has(e))throw Error("This cloud session's task is unavailable. Start a new cloud session to continue.");return}if(t.remote.sandboxType==="resumable"||t.remote.metadata.sandboxType==="resumable")await this.restoreSavedInnerSession(t,i,o),this.assertSessionActive(e,t);this.pendingInitialTasks.delete(e),t.innerSessionId=i,this.subscribeToInnerSession(e,t);let r=Le(o);if(r)this.applyModel(t,r);await this.ensureAttached(t)}async restoreSavedInnerSession(e,t,n){let s=()=>e.client.command("session.update_connection",{sessionId:t,updates:{}},t);try{await s();return}catch(l){if(!(ve(l)||l instanceof Error&&l.code==="command_failed"&&l.message===`session not found: ${t}`))throw l}this.assertSessionActive(e.remote.id,e);let o=await e.client.command("session.messages",{},t);this.assertSessionActive(e.remote.id,e);let i=o.payload?.messages;if(!Array.isArray(i)||i.length===0)throw Error("The saved conversation is empty or unavailable.");let r=n.metadata??{},a=n.runtimeOptions??{},d=this.sessions.get(e.remote.id)?.config,u=Object.hasOwn(r,"thinking")?r.thinking:d?.thinking,f=Object.hasOwn(r,"reasoningEffort")?r.reasoningEffort:d?.reasoningEffort,c=typeof r.autoApproveTools==="boolean"?r.autoApproveTools:d?.autoApproveTools,h=n.cwd??n.workspaceRoot??C,p=n.workspaceRoot??C;try{let l=await e.client.command("session.create",{workspaceRoot:p,cwd:h,initialMessages:i,metadata:{...r,interactive:!0},sessionConfig:{sessionId:t,providerId:r.provider??"cline",modelId:r.model??r.modelId??e.remote.metadata.modelId,workspaceRoot:p,cwd:h,systemPrompt:a.systemPrompt??r.systemPrompt??"",mode:a.mode??r.mode??"act",...typeof u==="boolean"?{thinking:u}:{},...typeof f==="string"?{reasoningEffort:f}:{},...r.checkpointEnabled===!0?{checkpoint:{enabled:!0}}:{}},runtimeOptions:a,...typeof c==="boolean"?{toolPolicies:{"*":{autoApprove:c}}}:{}});if(this.assertSessionActive(e.remote.id,e),(l.payload?.session?.sessionId??l.payload?.sessionId)!==t)throw Error("Cloud Hub did not restore the requested session.")}catch(l){if(l?.code!=="session_already_exists")throw l;this.assertSessionActive(e.remote.id,e),await s()}}async assertHandoffConnectionReusable(e,t){let n=await e.client.command("session.list",{limit:100});this.assertSessionActive(e.remote.id,e);let s=ae(n.payload).filter(de),[o]=s;if(s.length!==1||String(o?.sessionId??"").trim()!==e.innerSessionId||Zt(o)!==t.sourceSessionId)throw new g("request_failed","This cloud workspace already contains another conversation. Open it in Cline Cloud or delete it before retrying the handoff.")}async createInnerSession(e,t){if(this.assertSessionActive(e.remote.id,e),e.innerSessionCreation){if(await e.innerSessionCreation,t)await this.assertHandoffConnectionReusable(e,t);return}let n=(async()=>{if(t&&await this.adoptExistingHandoffSession(e,t)){this.unconfirmedInnerCreates.delete(e.remote.id);return}if(t?.recoverOnly||this.unconfirmedInnerCreates.has(e.remote.id))throw new g("request_failed","Cloud conversation creation is still unconfirmed. Wait for it to appear before trying again.");await this.createInnerSessionOnce(e,t)})().finally(()=>{e.innerSessionCreation=void 0});return e.innerSessionCreation=n,await n}async adoptExistingHandoffSession(e,t){let n=await e.client.command("session.list",{limit:100});this.assertSessionActive(e.remote.id,e);let s=ae(n.payload).filter(de);if(s.length===0)return!1;let[o]=s,i=String(o?.sessionId??"").trim();if(s.length!==1||!i||Zt(o)!==t.sourceSessionId)throw new g("request_failed","This cloud workspace already contains another conversation. Open it in Cline Cloud or delete it before retrying the handoff.");return e.innerSessionId=i,this.subscribeToInnerSession(e.remote.id,e),this.applySessionModel(e,o),await this.ensureAttached(e),!0}async createInnerSessionOnce(e,t){let n=e.remote.metadata.modelId?.trim();if(!n)throw Error("Cloud session is missing its model id");let s=this.sessions.get(e.remote.id),o=je(t?.workspaceRelativePath),i=t?.mode??"act";try{await t?.onSeeding?.(),this.assertSessionActive(e.remote.id,e)}catch(y){if(t)throw new Ve(y);throw y}let r=`cline/${(e.remote.metadata.taskId?.trim()||e.remote.id).slice(-8).toLowerCase()}`,a=e.remote.sandboxType==="resumable"||e.remote.metadata.sandboxType==="resumable",d=`${Xt}
16
16
 
17
- Do all work for this task on the branch \`${V}\`: create it from the current checkout before your first change (or check it out if it already exists), and never commit directly to the default branch. `+(Y?"Commit and push only when the user asks. ":`SAVE YOUR WORK: This sandbox is temporary. Push your progress to origin so it remains available outside the sandbox. The branch \`${V}\` is a backup of your work-in-progress, not a finished deliverable, so commit to it freely even when the work is incomplete. Commit regularly as you complete meaningful steps, using clear, descriptive messages. The first time you commit, push the branch with \`git push -u origin ${V}\`, and push again after each later commit. `)+"Do not force-push or amend commits that are already pushed unless the user explicitly asks.",F=J?.config?.thinking??X?.config.thinking,G=J?.config?.reasoningEffort??X?.config.reasoningEffort,N=!1,z=$.client.command("session.create",{workspaceRoot:U,cwd:Q,...J?{initialMessages:J.messages}:{},sessionConfig:{...$.remote.metadata.taskId?.trim()?{sessionId:$.remote.metadata.taskId.trim()}:{},providerId:"cline",modelId:Z,workspaceRoot:U,cwd:Q,systemPrompt:J?`${n1}
17
+ Do all work for this task on the branch \`${r}\`: create it from the current checkout before your first change (or check it out if it already exists), and never commit directly to the default branch. `+(a?"Commit and push only when the user asks. ":`SAVE YOUR WORK: This sandbox is temporary. Push your progress to origin so it remains available outside the sandbox. The branch \`${r}\` is a backup of your work-in-progress, not a finished deliverable, so commit to it freely even when the work is incomplete. Commit regularly as you complete meaningful steps, using clear, descriptive messages. The first time you commit, push the branch with \`git push -u origin ${r}\`, and push again after each later commit. `)+"Do not force-push or amend commits that are already pushed unless the user explicitly asks.",u=t?.config?.thinking??s?.config.thinking,f=t?.config?.reasoningEffort??s?.config.reasoningEffort,c=!1,h=e.client.command("session.create",{workspaceRoot:C,cwd:o,...t?{initialMessages:t.messages}:{},sessionConfig:{...e.remote.metadata.taskId?.trim()?{sessionId:e.remote.metadata.taskId.trim()}:{},providerId:"cline",modelId:n,workspaceRoot:C,cwd:o,systemPrompt:t?`${Xt}
18
18
 
19
- This session was handed off from a local workspace to a fresh Linux clone of ${$.remote.repoContext.repoUrl??"the repository"}@${$.remote.repoContext.branch??"the selected branch"} at ${U}. Earlier transcript references to the local OS, absolute paths, environment, and tool availability are stale.`+(Q===U?"":`
19
+ This session was handed off from a local workspace to a fresh Linux clone of ${e.remote.repoContext.repoUrl??"the repository"}@${e.remote.repoContext.branch??"the selected branch"} at ${C}. Earlier transcript references to the local OS, absolute paths, environment, and tool availability are stale.`+(o===C?"":`
20
20
 
21
- Continue from the original repository subdirectory at ${Q}.`):W,mode:j,enableTools:!0,...typeof F==="boolean"?{thinking:F}:{},...typeof G==="string"?{reasoningEffort:G}:{}},metadata:{source:this.options.clientIdentity?.source??"sdk",provider:"cline",model:Z,interactive:!0,thinking:F??null,reasoningEffort:F===!1?null:G??null,...J?{handoff:{from:"local",sourceSessionId:J.sourceSessionId,outerSessionId:$.remote.id}}:{}},runtimeOptions:{mode:j},modelSelection:{provider:"cline",model:Z},toolPolicies:{"*":{autoApprove:(J?.config?.autoApproveTools??X?.config.autoApproveTools)!==!1}}},void 0,{beforeDispatch:()=>this.assertSessionActive($.remote.id,$),onDispatch:()=>{N=!0}}),L;try{L=await z}catch(O){if(J&&!N)throw new a0(O);if(J&&(p0(O,"session.create")||I0(O)))this.unconfirmedInnerCreates.add($.remote.id);throw O}this.assertSessionActive($.remote.id,$);let K=L.payload?.session&&typeof L.payload.session==="object"?L.payload.session:void 0,_=String(K?.sessionId??L.payload?.sessionId??"").trim();if(!_){if(J)this.unconfirmedInnerCreates.add($.remote.id);throw Error("Cloud Hub did not return an inner session id")}if(this.unconfirmedInnerCreates.delete($.remote.id),this.pendingInitialTasks.delete($.remote.id),$.innerSessionId=_,$.remote.metadata.cwd=Q,X)X.config.cwd=Q,X.config.mode=j;this.subscribeToInnerSession($.remote.id,$),this.applySessionModel($,K),$.transcriptKnown=!J}handleEvent($,J,Z){if(this.disposed||J.disposed)return;if(J.innerSessionId&&Z.sessionId&&Z.sessionId!==J.innerSessionId)return;let X=Z.eventId?.trim();if(X&&!(Z.event==="approval.requested"&&Z.sequence===void 0)){if(J.seenEventIds.has(X))return;J.seenEventIds.add(X);while(J.seenEventIds.size>O4){let Q=J.seenEventIds.values().next().value;if(Q)J.seenEventIds.delete(Q)}}if(J.bufferingEvents){if(J.bufferedEvents.push(Z),J.bufferedEvents.length>q4)J.bufferedEvents.shift(),J.bufferedEventsDropped+=1,this.options.logger?.log("Cloud sync event buffer reached its limit",{sessionId:$,severity:"warn"});return}this.forwardEvent($,J,Z)}forwardEvent($,J,Z){if(this.disposed||J.disposed)return;if(Z.event==="session.attached"||Z.event==="session.updated"||Z.event==="session.created")this.applySessionModel(J,Z.payload?.session);if(Z.event==="approval.requested"){this.handleApprovalRequested($,J,Z);return}if(Z.event==="approval.resolved"){let V=String(Z.payload?.approvalId??"").trim();if(V)this.removeApproval($,V);return}if(Z.event==="run.started"){let V=this.sessions.get($)?.busy,Y=Z.payload?.requestId,W=typeof Y==="string"?J.pendingInputs?.get(Y):void 0;if(W&&Z.payload?.clientId===W.clientId){if(W.accept(),W.ownsBusyState)J.externalRun=void 0}else if(typeof Z.payload?.clientId==="string")J.externalRun??={progressHydrated:Boolean(V)}}let X=J.externalRun,Q=Z.event==="run.completed"||Z.event==="run.failed"||Z.event==="run.aborted",j=X&&!X.progressHydrated&&(Z.event==="assistant.delta"||Z.event==="reasoning.delta"||Z.event==="tool.started");if(X&&(j||Q)){if(X.progressHydrated=!0,Q)J.externalRun=void 0;let V=Boolean(J.rehydrationPromise);if(this.rehydrateAfterTransportDrop($,J).catch((Y)=>{if(this.disposed||J.disposed)return;this.notify("cloud_session_sync_failed",{sessionId:$,message:Y instanceof Error?Y.message:"Cloud transcript refresh failed"})}),!V){J.bufferedEvents.push(Z);return}}if(this.applyLiveEvent($,Z),this.publish({type:"hub_event",sessionId:$,event:{...Z,sessionId:$}}),Z.event==="assistant.delta"||Z.event==="reasoning.delta"||Z.event==="tool.updated")this.scheduleSnapshot($);else this.publishSnapshot($)}handleApprovalRequested($,J,Z){this.storePendingApproval($,J,Z.payload),this.sendApprovalSnapshot($)}storePendingApproval($,J,Z){let X=String(Z?.approvalId??"").trim();if(!X)return;let Q=`${$}:${X}`,j={approvalId:X,requestId:Q,sessionId:$,createdAt:new Date(typeof Z?.createdAt==="number"?Z.createdAt:Date.now()).toISOString(),toolCallId:String(Z?.toolCallId??""),toolName:String(Z?.toolName??"tool"),input:D4(Z?.inputJson),iteration:typeof Z?.iteration==="number"?Z.iteration:void 0,agentId:typeof Z?.agentId==="string"?Z.agentId:void 0,conversationId:typeof Z?.conversationId==="string"?Z.conversationId:void 0};this.approvals.set(Q,{item:j,resolve:async(V)=>{if(this.disposed||J.disposed)throw Error("This cloud session connection is closed; reopen the session to respond.");if(await this.ensureAttached(J),this.disposed||J.disposed)throw Error("This cloud session connection is closed; reopen the session to respond.");await J.client.command("approval.respond",{approvalId:X,approved:V.approved,reason:V.reason},J.innerSessionId)}})}removeApproval($,J){this.approvals.delete(`${$}:${J}`),this.sendApprovalSnapshot($)}clearPendingApprovals($){for(let[J,Z]of this.approvals)if(Z.item.sessionId===$)this.approvals.delete(J);this.sendApprovalSnapshot($)}sendApprovalSnapshot($){this.notify("tool_approval_state",{sessionId:$,items:Array.from(this.approvals.values()).filter((J)=>J.item.sessionId===$).map((J)=>J.item)})}async ensureAttached($){if(this.assertSessionActive($.remote.id,$),!$.innerSessionId)return;let J=await $.client.command("session.attach",{sessionId:$.innerSessionId},$.innerSessionId);this.assertSessionActive($.remote.id,$),this.applySessionModel($,J.payload?.session)}subscribeToInnerSession($,J){let Z=J.innerSessionId;if(!Z)return;J.unsubscribe(),this.clearPendingApprovals($),J.unsubscribe=J.client.subscribe((X)=>this.handleEvent($,J,X),{sessionId:Z})}applySessionModel($,J){if(!J||typeof J!=="object"||Array.isArray(J))return;let Z=h0(J);if(Z)this.applyModel($,Z);let X=J,Q=typeof X.cwd==="string"&&F0.normalize(X.cwd)===X.cwd&&(X.cwd===U||X.cwd.startsWith(`${U}/`))?X.cwd:void 0;if(Q){$.remote.metadata.cwd=Q;let Y=this.sessions.get($.remote.id);if(Y)Y.config.cwd=Q}let j=this.sessions.get($.remote.id),V=X.runtimeOptions?.mode;if(j&&(V==="act"||V==="plan"||V==="yolo"||V==="zen"))j.config.mode=V}async disposeConnection($){this.cancelScheduledSnapshot($);let J=this.connections.get($);if(this.connections.delete($),!J)return;J.disposed=!0,J.pendingInputs?.clear(),J.unsubscribe(),this.clearPendingApprovals($),await J.client.dispose()}async disposeConnectionIfSessionGone($,J){if(J.disposed||this.disposed)return;let Z;try{Z=await this.resolveActiveOrganizationId()}catch{return}let X=await this.options.api.list(Z).catch(()=>{return});if(!X||J.disposed)return;let Q=X.find((V)=>V.id===$),j=Q?this.preserveConnectedRuntimeModel(Q):void 0;if(!j){await this.disposeConnection($).catch(()=>{return});return}if(this.knownSessions.set($,j),J.remote=j,j.status==="failed"||j.status==="suspended"){let V=this.sessions.get($);if(V)V.busy=!1,V.status=j.status,V.endedAt=Date.parse(j.updatedAt)||Date.now();await this.disposeConnection($).catch(()=>{return});return}if(E(j))await this.attachExpired(j).catch(()=>{return}),await this.disposeConnection($).catch(()=>{return})}}export{g0 as updatedAt,v0 as submittedPromptsFromEvents,S0 as stringifyMessageContent,h0 as sessionRowModelId,m0 as resolveSessionListTitle,r1 as reconcileBufferedCloudEvents,V0 as readSessionRows,g4 as readCloudHandoffMetadata,b4 as preflightCloudHandoffGit,A0 as parseCloudProvisioningPhase,N0 as normalizeSessionTitle,o0 as normalizeGitHubRemoteUrl,h4 as mergeCloudHandoffMetadata,l1 as loadCloudModels,Y0 as isRootSessionRow,A4 as isCloudOuterSessionId,X1 as deriveCloudSessionTitle,F2 as createCloudHandoffFingerprint,d as countPromptOccurrences,e1 as cloudSessionToDiscoveryRecord,G0 as cloudHandoffTranscriptsEqual,y4 as cloudHandoffFingerprintsEqual,v4 as clearCloudHandoffMetadata,S4 as buildCloudHandoffDashboardUrl,q as CloudSessionError,M4 as CloudSessionController,B2 as CloudSessionApi,d0 as CloudQueueUnconfirmedError,z0 as CloudHandoffTranscriptMismatchError,$2 as CloudHandoffSeedUnsupportedError,a0 as CloudHandoffSeedRejectedError,C as CloudHandoffGitPreflightError,Q1 as CloudHandoffCreationRejectedError};
21
+ Continue from the original repository subdirectory at ${o}.`):d,mode:i,enableTools:!0,...typeof u==="boolean"?{thinking:u}:{},...typeof f==="string"?{reasoningEffort:f}:{}},metadata:{source:this.options.clientIdentity?.source??"sdk",provider:"cline",model:n,interactive:!0,thinking:u??null,reasoningEffort:u===!1?null:f??null,...t?{handoff:{from:"local",sourceSessionId:t.sourceSessionId,outerSessionId:e.remote.id}}:{}},runtimeOptions:{mode:i},modelSelection:{provider:"cline",model:n},toolPolicies:{"*":{autoApprove:(t?.config?.autoApproveTools??s?.config.autoApproveTools)!==!1}}},void 0,{beforeDispatch:()=>this.assertSessionActive(e.remote.id,e),onDispatch:()=>{c=!0}}),p;try{p=await h}catch(y){if(t&&!c)throw new Ve(y);if(t&&(We(y,"session.create")||$e(y)))this.unconfirmedInnerCreates.add(e.remote.id);throw y}this.assertSessionActive(e.remote.id,e);let l=p.payload?.session&&typeof p.payload.session==="object"?p.payload.session:void 0,m=String(l?.sessionId??p.payload?.sessionId??"").trim();if(!m){if(t)this.unconfirmedInnerCreates.add(e.remote.id);throw Error("Cloud Hub did not return an inner session id")}if(this.unconfirmedInnerCreates.delete(e.remote.id),this.pendingInitialTasks.delete(e.remote.id),e.innerSessionId=m,e.remote.metadata.cwd=o,s)s.config.cwd=o,s.config.mode=i;this.subscribeToInnerSession(e.remote.id,e),this.applySessionModel(e,l),e.transcriptKnown=!t}handleEvent(e,t,n){if(this.disposed||t.disposed)return;if(t.innerSessionId&&n.sessionId&&n.sessionId!==t.innerSessionId)return;let s=n.eventId?.trim();if(s&&!(n.event==="approval.requested"&&n.sequence===void 0)){if(t.seenEventIds.has(s))return;t.seenEventIds.add(s);while(t.seenEventIds.size>vo){let o=t.seenEventIds.values().next().value;if(o)t.seenEventIds.delete(o)}}if(t.bufferingEvents){if(t.bufferedEvents.push(n),t.bufferedEvents.length>wo)t.bufferedEvents.shift(),t.bufferedEventsDropped+=1,this.options.logger?.log("Cloud sync event buffer reached its limit",{sessionId:e,severity:"warn"});return}this.forwardEvent(e,t,n)}forwardEvent(e,t,n){if(this.disposed||t.disposed)return;if(n.event==="session.attached"||n.event==="session.updated"||n.event==="session.created")this.applySessionModel(t,n.payload?.session);if(n.event==="approval.requested"){this.handleApprovalRequested(e,t,n);return}if(n.event==="approval.resolved"){let r=String(n.payload?.approvalId??"").trim();if(r)this.removeApproval(e,r);return}if(n.event==="run.started"){let r=this.sessions.get(e)?.busy,a=n.payload?.requestId,d=typeof a==="string"?t.pendingInputs?.get(a):void 0;if(d&&n.payload?.clientId===d.clientId){if(d.accept(),d.ownsBusyState)t.externalRun=void 0}else if(typeof n.payload?.clientId==="string")t.externalRun??={progressHydrated:Boolean(r)}}let s=t.externalRun,o=n.event==="run.completed"||n.event==="run.failed"||n.event==="run.aborted",i=s&&!s.progressHydrated&&(n.event==="assistant.delta"||n.event==="reasoning.delta"||n.event==="tool.started");if(s&&(i||o)){if(s.progressHydrated=!0,o)t.externalRun=void 0;let r=Boolean(t.rehydrationPromise);if(this.rehydrateAfterTransportDrop(e,t).catch((a)=>{if(this.disposed||t.disposed)return;this.notify("cloud_session_sync_failed",{sessionId:e,message:a instanceof Error?a.message:"Cloud transcript refresh failed"})}),!r){t.bufferedEvents.push(n);return}}if(this.applyLiveEvent(e,n),this.publish({type:"hub_event",sessionId:e,event:{...n,sessionId:e}}),n.event==="assistant.delta"||n.event==="reasoning.delta"||n.event==="tool.updated")this.scheduleSnapshot(e);else this.publishSnapshot(e)}handleApprovalRequested(e,t,n){this.storePendingApproval(e,t,n.payload),this.sendApprovalSnapshot(e)}storePendingApproval(e,t,n){let s=String(n?.approvalId??"").trim();if(!s)return;let o=`${e}:${s}`,i={approvalId:s,requestId:o,sessionId:e,createdAt:new Date(typeof n?.createdAt==="number"?n.createdAt:Date.now()).toISOString(),toolCallId:String(n?.toolCallId??""),toolName:String(n?.toolName??"tool"),input:ko(n?.inputJson),iteration:typeof n?.iteration==="number"?n.iteration:void 0,agentId:typeof n?.agentId==="string"?n.agentId:void 0,conversationId:typeof n?.conversationId==="string"?n.conversationId:void 0};this.approvals.set(o,{item:i,resolve:async(r)=>{if(this.disposed||t.disposed)throw Error("This cloud session connection is closed; reopen the session to respond.");if(await this.ensureAttached(t),this.disposed||t.disposed)throw Error("This cloud session connection is closed; reopen the session to respond.");await t.client.command("approval.respond",{approvalId:s,approved:r.approved,reason:r.reason},t.innerSessionId)}})}removeApproval(e,t){this.approvals.delete(`${e}:${t}`),this.sendApprovalSnapshot(e)}clearPendingApprovals(e){for(let[t,n]of this.approvals)if(n.item.sessionId===e)this.approvals.delete(t);this.sendApprovalSnapshot(e)}sendApprovalSnapshot(e){this.notify("tool_approval_state",{sessionId:e,items:Array.from(this.approvals.values()).filter((t)=>t.item.sessionId===e).map((t)=>t.item)})}async ensureAttached(e){if(this.assertSessionActive(e.remote.id,e),!e.innerSessionId)return;let t=await e.client.command("session.attach",{sessionId:e.innerSessionId},e.innerSessionId);this.assertSessionActive(e.remote.id,e),this.applySessionModel(e,t.payload?.session)}subscribeToInnerSession(e,t){let n=t.innerSessionId;if(!n)return;t.unsubscribe(),this.clearPendingApprovals(e),t.unsubscribe=t.client.subscribe((s)=>this.handleEvent(e,t,s),{sessionId:n})}applySessionModel(e,t){if(!t||typeof t!=="object"||Array.isArray(t))return;let n=Le(t);if(n)this.applyModel(e,n);let s=t,o=typeof s.cwd==="string"&&le.normalize(s.cwd)===s.cwd&&(s.cwd===C||s.cwd.startsWith(`${C}/`))?s.cwd:void 0;if(o){e.remote.metadata.cwd=o;let a=this.sessions.get(e.remote.id);if(a)a.config.cwd=o}let i=this.sessions.get(e.remote.id),r=s.runtimeOptions?.mode;if(i&&(r==="act"||r==="plan"||r==="yolo"||r==="zen"))i.config.mode=r}async disposeConnection(e){this.cancelScheduledSnapshot(e);let t=this.connections.get(e);if(this.connections.delete(e),!t)return;t.disposed=!0,t.pendingInputs?.clear(),t.unsubscribe(),this.clearPendingApprovals(e),await t.client.dispose()}async disposeConnectionIfSessionGone(e,t){if(t.disposed||this.disposed)return;let n;try{n=await this.resolveActiveOrganizationId()}catch{return}let s=await this.options.api.list(n).catch(()=>{return});if(!s||t.disposed)return;let o=s.find((r)=>r.id===e),i=o?this.preserveConnectedRuntimeModel(o):void 0;if(!i){await this.disposeConnection(e).catch(()=>{return});return}if(this.knownSessions.set(e,i),t.remote=i,i.status==="failed"||i.status==="suspended"){let r=this.sessions.get(e);if(r)r.busy=!1,r.status=i.status,r.endedAt=Date.parse(i.updatedAt)||Date.now();await this.disposeConnection(e).catch(()=>{return});return}if(T(i))await this.attachExpired(i).catch(()=>{return}),await this.disposeConnection(e).catch(()=>{return})}}export{it as CloudHandoffCreationRejectedError,_ as CloudHandoffGitPreflightError,Ve as CloudHandoffSeedRejectedError,tn as CloudHandoffSeedUnsupportedError,me as CloudHandoffTranscriptMismatchError,Ge as CloudQueueUnconfirmedError,Cn as CloudSessionApi,_o as CloudSessionController,g as CloudSessionError,$o as buildCloudHandoffDashboardUrl,No as clearCloudHandoffMetadata,Lo as cloudHandoffFingerprintsEqual,he as cloudHandoffTranscriptsEqual,en as cloudSessionToDiscoveryRecord,G as countPromptOccurrences,pn as createCloudHandoffFingerprint,ot as deriveCloudSessionTitle,Co as isCloudOuterSessionId,de as isRootSessionRow,jt as loadCloudModels,qo as mergeCloudHandoffMetadata,Ze as normalizeGitHubRemoteUrl,ue as normalizeSessionTitle,we as parseCloudProvisioningPhase,Uo as preflightCloudHandoffGit,Bo as readCloudHandoffMetadata,ae as readSessionRows,Qt as reconcileBufferedCloudEvents,Ne as resolveSessionListTitle,Le as sessionRowModelId,qe as stringifyMessageContent,Be as submittedPromptsFromEvents,De as updatedAt};