@cline/core 0.0.84 → 0.0.85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -199,7 +199,7 @@ Searched ${L} files.`;let _=[`Found ${F.length} result${F.length===1?"":"s"} for
|
|
|
199
199
|
|
|
200
200
|
...[assistant text truncated: omitted ${$} chars due to repeated tool-call markup]...
|
|
201
201
|
|
|
202
|
-
`;function UF($=process.env){return{maxToolResultChars:GF($[WW.maxToolResultChars]),maxTotalTextBytes:GF($[WW.maxTotalTextBytes]),minOutdatedRewriteBytes:cb($[WW.minOutdatedRewriteBytes])}}class jW{indexedMessageCount=0;indexedTailRef;toolNameByIdCache=new Map;readLocatorsByToolUseIdCache=new Map;latestReadToolUseByLocatorCache=new Map;latestFullContentOwnerByPathCache=new Map;readResultLocatorCache=new WeakMap;maxToolResultChars;maxFileContentChars;maxTotalTextBytes;mediaBudget;maxAssistantTextChars;maxAssistantToolMarkupChars;minOutdatedRewriteBytes;committedOutdatedRewrites=new Map;constructor($={}){this.maxToolResultChars=Z5($.maxToolResultChars,fb),this.maxFileContentChars=Z5($.maxFileContentChars,Sb),this.maxTotalTextBytes=Z5($.maxTotalTextBytes,bb),this.mediaBudget=$.mediaBudget??{},this.maxAssistantTextChars=Z5($.maxAssistantTextChars,kb),this.maxAssistantToolMarkupChars=Z5($.maxAssistantToolMarkupChars,xb),this.minOutdatedRewriteBytes=ub($.minOutdatedRewriteBytes,yb)}resetConversationState(){this.resetIndexes(),this.committedOutdatedRewrites.clear()}buildForApi($){this.reindex($),this.commitOutdatedRewrites($);let Q=this.addMissingToolResults($).map((X)=>{if(!Array.isArray(X.content)){if(X.role==="user"&&typeof X.content==="string"){let j=WF(X.content);if(j!==X.content)return{...X,content:j}}if(X.role==="assistant"&&typeof X.content==="string"){let j=this.truncateAssistantText(X.content);if(j!==X.content)return{...X,content:j}}return X}let W=!1,Y=X.content.map((j)=>{let V=this.transformBlock(j,X.role);if(V!==j)W=!0;return V});return W?{...X,content:Y}:X}),J=this.applyMediaBudget(Q);return this.truncateToTotalTextBudget(J)}transformBlock($,Z){if(Z==="user"&&$.type==="text"&&typeof $.text==="string"){let X=WF($.text);if(X!==$.text)return{...$,text:X};return $}if(Z==="assistant"&&$.type==="text"&&typeof $.text==="string"){let X=this.truncateAssistantText($.text);return X===$.text?$:{...$,text:X}}if($.type==="file"){let X=H8($.content,this.maxFileContentChars,VF);return X===$.content?$:{...$,content:X}}if($.type!=="tool_result")return $;let Q=this.resolveToolName($),J=$.content;if(this.isReadTool(Q)&&$.is_error!==!0){let X=this.committedOutdatedRewrites.get($.tool_use_id);if(X&&X.size>0){let Y=this.getReadLocators($).filter((j)=>X.has(this.toReadLocatorKey(j))&&this.isOutdatedReadLocator(j,$.tool_use_id));if(Y.length>0)J=this.replaceOutdatedReadContent(J,Y)}}return J=this.truncateToolResultContent(J),J===$.content?$:{...$,content:J}}reindex($){let Z=this.indexedMessageCount===0||$.length>=this.indexedMessageCount&&$[this.indexedMessageCount-1]===this.indexedTailRef;if($.length<this.indexedMessageCount||!Z)this.resetIndexes();for(let Q=this.indexedMessageCount;Q<$.length;Q++){let J=$[Q];if(!Array.isArray(J.content))continue;for(let X=0;X<J.content.length;X++){let W=J.content[X];if(W.type==="file")this.latestFullContentOwnerByPathCache.set(W.path,`file:${Q}:${X}`);else if(W.type==="tool_use"){let Y=W.name.toLowerCase();if(this.toolNameByIdCache.set(W.id,Y),this.isReadTool(Y)){let j=this.extractLocatorsFromReadToolInput(W.input);if(j.length>0)this.readLocatorsByToolUseIdCache.set(W.id,j)}}else if(W.type==="tool_result"){let Y=this.resolveToolName(W);if(!this.isReadTool(Y)||W.is_error===!0)continue;let j=this.getReadLocators(W);for(let V of j)if(this.latestReadToolUseByLocatorCache.set(this.toReadLocatorKey(V),W.tool_use_id),this.isFullFileRead(V))this.latestFullContentOwnerByPathCache.set(V.path,W.tool_use_id)}}}this.indexedMessageCount=$.length,this.indexedTailRef=$.length>0?$[$.length-1]:void 0}commitOutdatedRewrites($){let Z=new Map,Q=new Set,J=0;for(let X of $){if(!Array.isArray(X.content))continue;for(let W of X.content){if(W.type!=="tool_result"||W.is_error===!0)continue;let Y=this.resolveToolName(W);if(!this.isReadTool(Y))continue;Q.add(W.tool_use_id);let j=this.committedOutdatedRewrites.get(W.tool_use_id),V=new Set,K=new Set;for(let G of this.getReadLocators(W)){let U=this.toReadLocatorKey(G);if(!this.isOutdatedReadLocator(G,W.tool_use_id))continue;if(K.add(U),!j?.has(U))V.add(U)}if(j){for(let G of j)if(!K.has(G))j.delete(G);if(j.size===0)this.committedOutdatedRewrites.delete(W.tool_use_id)}if(V.size===0)continue;let B=Z.get(W.tool_use_id);if(!B)B=new Set,Z.set(W.tool_use_id,B);for(let G of V)B.add(G);J+=this.estimateOutdatedReclaimBytes(W.content,V)}}for(let X of this.committedOutdatedRewrites.keys())if(!Q.has(X))this.committedOutdatedRewrites.delete(X);if(Z.size===0||J<this.minOutdatedRewriteBytes)return;for(let[X,W]of Z){let Y=this.committedOutdatedRewrites.get(X);if(!Y)Y=new Set,this.committedOutdatedRewrites.set(X,Y);for(let j of W)Y.add(j)}}estimateOutdatedReclaimBytes($,Z){let Q=this.extractReadLocatorsFromToolResultContent($),J=Q.length>0&&Q.every((V)=>Z.has(this.toReadLocatorKey(V))),X=(V)=>{let K;try{K=JSON.parse(V)}catch{return J||Q.length===0?O0(this.truncateMiddle(V)):0}let B=Array.isArray(K)?K:[K],G=0;for(let U of B){let H=this.extractLocatorFromResultEntry(U);if(H&&Z.has(this.toReadLocatorKey(H)))G+=this.providerBoundEntryBytes(U)}return G};if(typeof $==="string")return X($);let W=new Set(Z),Y=0;for(let V of $)if(V.type==="text")Y+=this.countOutdatedImageEntries(V.text,W);let j=0;for(let V of $)if(V.type==="text")j+=X(V.text);else if(V.type==="image"){if(Y>0)Y-=1,j+=O0(V.data)}else if(X2(V)){let K=this.extractLocatorFromResultEntry(V);if(K&&Z.has(this.toReadLocatorKey(K)))j+=this.providerBoundEntryBytes(V)}else if(V.type==="file"){if(Z.has(this.toReadLocatorKey({path:V.path,startLine:null,endLine:null})))j+=O0(this.truncateMiddle(V.content))}return j}providerBoundEntryBytes($){let Z=this.truncateNestedStrings($);return O0(JSON.stringify(Z))}addMissingToolResults($){let Z=this.collectToolResultIds($),Q=[],J=new Map,X=!1,W=()=>{if(J.size===0)return;Y(this.createMissingToolResultMessage(J)),J.clear(),X=!0},Y=(j)=>{let V=Q.at(-1);if(this.shouldMergeUserAfterToolResults(V,j)){Q[Q.length-1]={...V,content:[...V.content,...this.contentBlocksForUserMerge(j.content)]},X=!0;return}Q.push(j)};for(let j of $){if(this.isToolResultOnlyMessage(j)){if(Y(this.appendMissingToolResults(j,J)),J.size>0)J.clear(),X=!0;continue}if(Array.isArray(j.content)){let V=j.content.filter((B)=>B.type==="tool_result"),K=j.content.filter((B)=>B.type!=="tool_result");if(V.length>0){let B=this.appendMissingToolResults({...j,role:"user",content:V},J);if(Y(B),J.size>0)J.clear();X=!0}if(K.length>0||V.length===0){if(V.length===0)W();let B=V.length>0?{...j,content:K}:j;if(Y(B),B.role==="assistant")this.trackMissingToolCalls(B,Z,J)}continue}W(),Y(j)}return W(),X?Q:$}appendMissingToolResults($,Z){if(Z.size===0||!Array.isArray($.content))return $;return{...$,role:"user",content:[...$.content,...this.createMissingToolResultBlocks(Z)]}}shouldMergeUserAfterToolResults($,Z){return $?.role==="user"&&Z.role==="user"&&this.isToolResultOnlyMessage($)&&this.contentBlocksForUserMerge(Z.content).length>0}contentBlocksForUserMerge($){return typeof $==="string"?$.length>0?[{type:"text",text:$}]:[]:$}collectToolResultIds($){let Z=new Set;for(let Q of $){if(!Array.isArray(Q.content))continue;for(let J of Q.content)if(J.type==="tool_result")Z.add(J.tool_use_id)}return Z}isToolResultOnlyMessage($){return $.role==="user"&&Array.isArray($.content)&&$.content.length>0&&$.content.every((Z)=>Z.type==="tool_result")}trackMissingToolCalls($,Z,Q){if(!Array.isArray($.content))return;for(let J of $.content){if(J.type!=="tool_use"||Z.has(J.id))continue;Q.set(J.id,J.name)}}createMissingToolResultMessage($){return{role:"user",content:this.createMissingToolResultBlocks($)}}createMissingToolResultBlocks($){return Array.from($,([Z,Q])=>({type:"tool_result",tool_use_id:Z,name:Q,content:[{type:"text",text:this.formatMissingToolResultText(Q)}],is_error:!0}))}formatMissingToolResultText($){return $?`${jF} Tool: ${$}.`:jF}resetIndexes(){this.indexedMessageCount=0,this.indexedTailRef=void 0,this.toolNameByIdCache.clear(),this.readLocatorsByToolUseIdCache.clear(),this.latestReadToolUseByLocatorCache.clear(),this.latestFullContentOwnerByPathCache.clear(),this.readResultLocatorCache=new WeakMap}getReadLocators($){let Z=$,Q=this.readResultLocatorCache.get(Z);if(Q===void 0)Q=this.extractReadLocatorsFromToolResultContent($.content),this.readResultLocatorCache.set(Z,Q);if(Q.length>0)return Q;return this.readLocatorsByToolUseIdCache.get($.tool_use_id)??[]}extractLocatorsFromReadToolInput($){if(!$||typeof $!=="object")return[];let Z=$,Q=[],J=this.extractLocatorFromReadRequest(Z);if(J)Q.push(J);if(Array.isArray(Z.files))for(let X of Z.files){let W=this.extractLocatorFromReadRequest(X);if(W)Q.push(W)}if(Array.isArray(Z.file_paths)){for(let X of Z.file_paths)if(typeof X==="string"&&X.length>0)Q.push({path:X,startLine:null,endLine:null})}return this.dedupeReadLocators(Q)}extractReadLocatorsFromToolResultContent($){if(typeof $==="string")return this.tryParseReadLocators($);let Z=[];for(let Q of $){if(Q.type==="text"){Z.push(...this.tryParseReadLocators(Q.text));continue}if(X2(Q)){let J=this.extractLocatorFromResultEntry(Q);if(J)Z.push(J)}}return this.dedupeReadLocators(Z)}tryParseReadLocators($){try{return this.extractLocatorsFromParsedReadResult(JSON.parse($))}catch{return[]}}extractLocatorsFromParsedReadResult($){if(Array.isArray($)){let Q=[];for(let J of $){let X=this.extractLocatorFromResultEntry(J);if(X)Q.push(X)}return this.dedupeReadLocators(Q)}let Z=this.extractLocatorFromResultEntry($);return Z?[Z]:[]}extractLocatorFromReadRequest($){if(!$||typeof $!=="object")return;let Z=$,Q=this.extractPath(Z);if(!Q)return;return{path:Q,startLine:this.extractLineNumber(Z.start_line),endLine:this.extractLineNumber(Z.end_line)}}extractLocatorFromResultEntry($){if(!$||typeof $!=="object")return;let Z=$,Q=this.extractPath(Z);if(Q)return{path:Q,startLine:this.extractLineNumber(Z.start_line),endLine:this.extractLineNumber(Z.end_line)};if(typeof Z.query==="string"&&Z.query.length>0)return this.parseReadQuery(Z.query);return}extractPath($){let Z=[$.path,$.file_path,$.filePath];for(let Q of Z)if(typeof Q==="string"&&Q.length>0)return Q;return}extractLineNumber($){return typeof $==="number"&&Number.isInteger($)?$:null}parseReadQuery($){let Z=/^(.*):(\d+)-(EOF|\d+)$/.exec($);if(!Z)return{path:$,startLine:null,endLine:null};return{path:Z[1],startLine:Number(Z[2]),endLine:Z[3]==="EOF"?null:Number(Z[3])}}dedupeReadLocators($){let Z=new Map;for(let Q of $)Z.set(this.toReadLocatorKey(Q),Q);return Array.from(Z.values())}toReadLocatorKey($){if(this.isFullFileRead($))return $.path;return`${$.path}:${$.startLine??1}-${$.endLine??"EOF"}`}isFullFileRead($){return $.startLine==null&&$.endLine==null}isOutdatedReadLocator($,Z){let Q=this.latestFullContentOwnerByPathCache.get($.path);if(Q&&Q!==Z)return!0;return this.latestReadToolUseByLocatorCache.get(this.toReadLocatorKey($))!==Z}replaceOutdatedReadContent($,Z){let Q=new Set(Z.map((W)=>this.toReadLocatorKey(W))),J=new Set(Z.map((W)=>W.path));if(typeof $==="string")return this.replaceOutdatedInString($,Q)??n2;let X=0;for(let W of $)if(W.type==="text")X+=this.countOutdatedImageEntries(W.text,Q);return $.map((W)=>{if(W.type==="file"){if(!J.has(W.path))return W;return{...W,content:n2}}if(W.type==="image"){if(X===0)return W;return X-=1,{type:"text",text:n2}}if(X2(W))return this.replaceOutdatedReadEntry(W,Q);if(W.type!=="text")return W;let Y=this.replaceOutdatedInString(W.text,Q);if(Y===null)return{...W,text:n2};return Y===W.text?W:{...W,text:Y}})}countOutdatedImageEntries($,Z){let Q;try{Q=JSON.parse($)}catch{return 0}let J=Array.isArray(Q)?Q:[Q],X=0;for(let W of J){if(!W||typeof W!=="object")continue;let Y=W,j=this.extractLocatorFromResultEntry(Y);if(!j)continue;if(!Z.has(this.toReadLocatorKey(j)))continue;if(Y.result==="Successfully read image"||Y.content==="Successfully read image")X+=1}return X}replaceOutdatedInString($,Z){let Q;try{Q=JSON.parse($)}catch{return null}let J=Array.isArray(Q)?Q.map((X)=>this.replaceOutdatedReadEntry(X,Z)):this.replaceOutdatedReadEntry(Q,Z);return JSON.stringify(J)}replaceOutdatedReadEntry($,Z){if(!$||typeof $!=="object")return $;let Q=this.extractLocatorFromResultEntry($);if(!Q||!Z.has(this.toReadLocatorKey(Q)))return $;let J={...$};if(typeof J.result==="string")J.result=n2;else if(typeof J.content==="string")J.content=n2;else J.result=n2;return J}isReadTool($){return!!$&&hb.has($)}resolveToolName($){let Z=this.toolNameByIdCache.get($.tool_use_id);if(Z!==void 0)return Z;return typeof $.name==="string"&&$.name.length>0?$.name.toLowerCase():void 0}truncateToolResultContent($){if(typeof $==="string")return this.truncateMiddle($);return $.map((Z)=>{if(Z.type==="file"){let Q=this.truncateMiddle(Z.content);return Q===Z.content?Z:{...Z,content:Q}}if(Z.type==="text"){let Q=this.truncateMiddle(Z.text);return Q===Z.text?Z:{...Z,text:Q}}if(X2(Z))return this.truncateNestedStrings(Z);return Z})}truncateNestedStrings($){if(typeof $==="string")return this.truncateMiddle($);if(Array.isArray($)){let Z=!1,Q=$.map((J)=>{let X=this.truncateNestedStrings(J);if(X!==J)Z=!0;return X});return Z?Q:$}if($!==null&&typeof $==="object"){if(VW($))return $;let Z=!1,Q={};for(let[J,X]of Object.entries($)){let W=this.truncateNestedStrings(X);if(W!==X)Z=!0;Q[J]=W}return Z?Q:$}return $}truncateMiddle($){return H8($,this.maxToolResultChars,VF)}truncateAssistantText($){if(this.hasRepeatedToolCallMarkup($))return H8($,this.maxAssistantToolMarkupChars,gb);return H8($,this.maxAssistantTextChars,vb)}hasRepeatedToolCallMarkup($){if($.length<=this.maxAssistantToolMarkupChars)return!1;let Z=0;for(let Q of $.matchAll(mb))if(Z+=1,Z>=Ib)return!0;return!1}truncateToTotalTextBudget($){let Z=this.countMessageTextBytes($);if(Z<=this.maxTotalTextBytes)return $;let Q=$.map((X)=>{if(!Array.isArray(X.content))return{...X};return{...X,content:X.content.map((W)=>pb(W))}}),J=this.collectTruncationCandidates(Q);for(let X of J){if(Z<=this.maxTotalTextBytes)break;let W=X.byteLength;if(W<=X.minBytes)continue;let Y=Z-this.maxTotalTextBytes,j=Math.max(X.minBytes,W-Y),V=db(X.get(),j,X.makeMarker);X.set(V),Z-=W-O0(V)}return Q}countMessageTextBytes($){let Z=0;for(let Q of $){if(typeof Q.content==="string"){Z+=O0(Q.content);continue}for(let J of Q.content)if(J.type==="text")Z+=O0(J.text);else if(J.type==="thinking")Z+=O0(J.thinking);else if(J.type==="file")Z+=O0(J.content);else if(J.type==="tool_use")Z+=G7(J.input);else if(J.type==="tool_result"){if(typeof J.content==="string")Z+=O0(J.content);else for(let X of J.content)if(X.type==="text")Z+=O0(X.text);else if(X.type==="file")Z+=O0(X.content);else if(X2(X))Z+=G7(X)}}return Z}collectTruncationCandidates($){let Z=[],Q=[];for(let J of $){if(J.role==="assistant"&&typeof J.content==="string"){Z.push({byteLength:O0(J.content),minBytes:YF,makeMarker:KF,get:()=>J.content,set:(X)=>{J.content=X}});continue}if(!Array.isArray(J.content))continue;for(let X of J.content){if(X.type==="tool_use"){U7(X.input,Q);continue}if(J.role==="assistant"&&X.type==="text"){Z.push({byteLength:O0(X.text),minBytes:YF,makeMarker:KF,get:()=>X.text,set:(W)=>{X.text=W}});continue}if(X.type!=="tool_result")continue;if(typeof X.content==="string"){Z.push({byteLength:O0(X.content),minBytes:Q5,makeMarker:J5,get:()=>X.content,set:(W)=>{X.content=W}});continue}for(let W of X.content)if(W.type==="text")Z.push({byteLength:O0(W.text),minBytes:Q5,makeMarker:J5,get:()=>W.text,set:(Y)=>{W.text=Y}});else if(W.type==="file")Z.push({byteLength:O0(W.content),minBytes:Q5,makeMarker:J5,get:()=>W.content,set:(Y)=>{W.content=Y}});else if(X2(W))U7(W,Z)}}return Z.sort((J,X)=>X.byteLength-J.byteLength),Q.sort((J,X)=>X.byteLength-J.byteLength),[...Z,...Q]}applyMediaBudget($){let Z=this.resolveMediaBudget();if(Z.maxImageEncodedBytes===Number.POSITIVE_INFINITY&&Z.maxImageDecodedBytes===Number.POSITIVE_INFINITY&&Z.maxTotalMediaBytes===Number.POSITIVE_INFINITY)return $;let Q=Cb(),J=!1,X=$.map((W)=>{if(!Array.isArray(W.content))return W;let Y=!1,j=W.content.map((V)=>{let K=this.applyMediaBudgetToBlock(V,Z,Q);if(K!==V)Y=!0;return K});if(!Y)return W;return J=!0,{...W,content:j}});return J?X:$}resolveMediaBudget(){return Pb(this.mediaBudget)}applyMediaBudgetToBlock($,Z,Q){if(YW($))return this.limitImageContent($,Z,Q);if($.type!=="tool_result"||typeof $.content==="string")return $;let J=!1,X=$.content.map((W)=>{let Y=this.applyMediaBudgetToToolResultEntry(W,Z,Q);if(Y!==W)J=!0;return Y});return J?{...$,content:X}:$}applyMediaBudgetToToolResultEntry($,Z,Q){if(YW($))return this.limitImageContent($,Z,Q);if(X2($))return this.limitNestedMedia($,Z,Q);return $}limitNestedMedia($,Z,Q){if(YW($)){let J=this.limitImageContent($,Z,Q);return J.type==="text"?J.text:J}if(Array.isArray($)){let J=!1,X=$.map((W)=>{let Y=this.limitNestedMedia(W,Z,Q);if(Y!==W)J=!0;return Y});return J?X:$}if($!==null&&typeof $==="object"){let J=!1,X={};for(let[W,Y]of Object.entries($)){let j=this.limitNestedMedia(Y,Z,Q);if(j!==Y)J=!0;X[W]=j}return J?X:$}return $}limitImageContent($,Z,Q){if(!HF($))return{type:"text",text:XF};let J=wb($.mediaType,$.data,{maxImageEncodedBytes:Z.maxImageEncodedBytes,maxImageDecodedBytes:Z.maxImageDecodedBytes,maxTotalMediaBytes:Z.maxTotalMediaBytes},Q);if(!J.ok)return{type:"text",text:XF};return{...$,data:J.base64,mediaType:J.mediaType}}}var BF=String.raw`[\|\uFF5C]`,mb=new RegExp(String.raw`<\s*(?:${BF}\s*)?DSML\s*(?:${BF}\s*)?(?:tool_calls|invoke)\b[^>]*>|<\s*/?\s*(?:tool_calls?|tool_call|function_calls?|function_call|invoke)\b[^>]*>`,"gi");function O0($){return Buffer.byteLength($,"utf8")}function GF($){if($===void 0)return;let Z=Number.parseInt($,10);return Number.isFinite(Z)&&Z>0?Z:void 0}function cb($){if($===void 0)return;let Z=$.trim().toLowerCase();if(Z==="infinity"||Z==="disable")return Number.POSITIVE_INFINITY;let Q=Number.parseInt($,10);return Number.isFinite(Q)&&Q>=0?Q:void 0}function Z5($,Z){return typeof $==="number"&&Number.isFinite($)&&$>0?Math.floor($):Z}function ub($,Z){if(typeof $!=="number"||Number.isNaN($)||$<0)return Z;return Number.isFinite($)?Math.floor($):$}function H8($,Z,Q){if($.length<=Z)return $;let J=Q($.length-Z),X=Math.max(0,Math.floor((Z-J.length)/2)),W=Math.max(0,$.length-X*2),Y=Q(W),j=Math.max(0,Math.floor((Z-Y.length)/2)),V=$.slice(0,j),K=j>0?$.slice(-j):"";return`${V}${Y}${K}`}function db($,Z,Q){if(O0($)<=Z)return $;let J=0,X=$.length,W=H8($,0,Q);while(J<=X){let Y=J+X>>>1,j=H8($,Y,Q);if(O0(j)<=Z)W=j,J=Y+1;else X=Y-1}return W}function pb($){if($.type==="tool_use")return{...$,input:H7($.input)};if($.type!=="tool_result"||typeof $.content==="string")return{...$};return{...$,content:$.content.map((Z)=>X2(Z)?H7(Z):{...Z})}}function X2($){if($===null||typeof $!=="object")return!1;let Z=$.type;return Z!=="text"&&Z!=="image"&&Z!=="file"}function YW($){return $!==null&&typeof $==="object"&&$.type==="image"}function HF($){return $!==null&&typeof $==="object"&&$.type==="image"&&typeof $.data==="string"&&typeof $.mediaType==="string"}function VW($){return HF($)}function G7($){if(typeof $==="string")return O0($);if(Array.isArray($)){let Z=0;for(let Q of $)Z+=G7(Q);return Z}if($!==null&&typeof $==="object"){if(VW($))return 0;let Z=0;for(let Q of Object.values($))Z+=G7(Q);return Z}return 0}function U7($,Z){if(Array.isArray($)){$.forEach((Q,J)=>{if(typeof Q==="string")Z.push({byteLength:O0(Q),minBytes:Q5,makeMarker:J5,get:()=>$[J],set:(X)=>{$[J]=X}});else U7(Q,Z)});return}if($!==null&&typeof $==="object"){if(VW($))return;let Q=$;for(let J of Object.keys(Q)){let X=Q[J];if(typeof X==="string")Z.push({byteLength:O0(X),minBytes:Q5,makeMarker:J5,get:()=>Q[J],set:(W)=>{Q[J]=W}});else U7(X,Z)}}}function H7($){if(Array.isArray($))return $.map(H7);if($!==null&&typeof $==="object"){let Z={};for(let[Q,J]of Object.entries($))Z[Q]=H7(J);return Z}return $}function KW(){return`conv_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}class BW{messages=[];conversationId=KW();sessionStarted=!1;constructor($){if(($?.length??0)>0)this.restore($??[])}getConversationId(){return this.conversationId}getMessages(){return[...this.messages]}appendMessage($){this.messages.push($)}appendMessages($){if($.length===0)return;this.messages.push(...$)}replaceMessages($){this.messages=[...$]}resetForRun(){this.messages=[],this.conversationId=KW(),this.sessionStarted=!1}clearHistory(){this.messages=[],this.conversationId=KW(),this.sessionStarted=!1}restore($){this.messages=[...$],this.sessionStarted=!1}isSessionStarted(){return this.sessionStarted}markSessionStarted(){this.sessionStarted=!0}}var W2="0.0.84";var o2={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:W2,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"},"./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:{"@cline/agents":"workspace:*","@cline/shared":"workspace:*","@cline/llms":"workspace:*","@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",jiti:"^2.7.0","node-machine-id":"^1.1.12",nanoid:"^5.1.7","simple-git":"3.36.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/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["dist","!dist/**/*.d.ts.map"]};function LF($){let{agentConfig:Z}=$,Q=lb(Z),J=ib(Z),X=$.hooks,W=ab(Z.maxParallelToolCalls);return{distinctId:Z.distinctId,clientName:Z.extensionContext?.client?.name,clientVersion:Z.extensionContext?.client?.version,clineCoreVersion:W2,sessionId:$.sessionId??Z.sessionId,agentId:$.agentId,conversationId:$.conversationId,parentAgentId:$.parentAgentId,agentRole:$.agentRole,systemPrompt:$.systemPrompt??Z.systemPrompt,messageModelInfo:J,model:$.model,modelOptions:Q,modelTools:Z.modelTools,tools:$.tools,hooks:X,prepareTurn:$.prepareTurn,consumePendingUserMessage:Z.consumePendingUserMessage,plugins:$.plugins,logger:$.logger??Z.logger,telemetry:$.telemetry??Z.telemetry,initialMessages:$.initialMessages,completionPolicy:$.completionPolicy===null?void 0:$.completionPolicy??Z.completionPolicy,maxIterations:Z.maxIterations,toolExecution:W,toolPolicies:Z.toolPolicies,toolContextMetadata:$.toolContextMetadata,requestToolApproval:Z.requestToolApproval}}function lb($){let Z={};if($.thinking!==void 0)Z.thinking=$.thinking;if($.reasoningEffort!==void 0)Z.reasoningEffort=$.reasoningEffort;if($.thinkingBudgetTokens!==void 0)Z.thinkingBudgetTokens=$.thinkingBudgetTokens;if($.maxTokensPerTurn!==void 0)Z.maxTokensPerTurn=$.maxTokensPerTurn;if($.temperature!==void 0)Z.temperature=$.temperature;if($.apiTimeoutMs!==void 0)Z.apiTimeoutMs=$.apiTimeoutMs;return Object.keys(Z).length>0?Z:void 0}function ib($){let Z=$.providerConfig?.family;return{id:$.modelId,provider:$.providerId,family:Z}}function ab($){if($===void 0)return;return $>=2?"parallel":"sequential"}function rb($){let Z={};if($.providerId!==void 0)Z.providerId=$.providerId;if($.modelId!==void 0)Z.modelId=$.modelId;if($.apiKey!==void 0)Z.apiKey=$.apiKey;if($.baseUrl!==void 0)Z.baseUrl=$.baseUrl;if($.headers!==void 0)Z.headers=$.headers;if($.providerConfig!==void 0)Z.providerConfig=$.providerConfig;if($.thinking===!1)return Z.thinking=!1,Z.reasoningEffort=null,Z.thinkingBudgetTokens=null,Z;if($.thinking===!0)Z.thinking=!0,Z.reasoningEffort=$.reasoningEffort??null,Z.thinkingBudgetTokens=null;else if($.reasoningEffort!==void 0)Z.thinking=!0,Z.reasoningEffort=$.reasoningEffort;if(typeof $.thinkingBudgetTokens==="number"&&Number.isFinite($.thinkingBudgetTokens)&&$.thinkingBudgetTokens>0)Z.thinking=!0,Z.thinkingBudgetTokens=Math.trunc($.thinkingBudgetTokens);return Z}function F8($){let Z={...$},Q=Object.hasOwn($,"thinking"),J=Object.hasOwn($,"thinkingBudgetTokens");if($.thinking===!1||$.thinking===null)return Z.reasoningEffort=void 0,Z.thinkingBudgetTokens=void 0,Z;if(!Q&&J&&typeof $.thinkingBudgetTokens==="number"&&Number.isFinite($.thinkingBudgetTokens)&&$.thinkingBudgetTokens>0)Z.thinking=!0;return Z}function nb(){return{lastToolName:"",lastToolSignature:"",consecutiveIdenticalCount:0}}function ob($){$.lastToolName="",$.lastToolSignature="",$.consecutiveIdenticalCount=0}function GW($){if($==null||typeof $!=="object")return $;if(Array.isArray($))return $.map(GW);let Z={};for(let Q of Object.keys($).sort())Z[Q]=GW($[Q]);return Z}function sb($){if($==null)return"null";if(typeof $==="string")return $;if(typeof $!=="object")return String($);try{return JSON.stringify(GW($))}catch{return String($)}}function tb($,Z,Q,J){if(Z===$.lastToolName&&Q===$.lastToolSignature)$.consecutiveIdenticalCount++;else $.consecutiveIdenticalCount=1;return $.lastToolName=Z,$.lastToolSignature=Q,{softWarning:$.consecutiveIdenticalCount===J.softThreshold,hardEscalation:$.consecutiveIdenticalCount>=J.hardThreshold}}var DF={softThreshold:3,hardThreshold:5};class UW{config;state=nb();constructor($){this.config={softThreshold:$?.softThreshold??DF.softThreshold,hardThreshold:$?.hardThreshold??DF.hardThreshold}}inspect($){let Z=sb($.input),Q=tb(this.state,$.name,Z,this.config);if(Q.hardEscalation)return{kind:"hard",message:`Detected ${this.state.consecutiveIdenticalCount} consecutive identical calls to \`${$.name}\`; stopping to avoid a loop.`};if(Q.softWarning)return{kind:"soft",message:`Detected ${this.state.consecutiveIdenticalCount} consecutive identical calls to \`${$.name}\`; consider trying a different approach.`};return{kind:"ok"}}reset(){ob(this.state)}}class HW{consecutiveMistakes=0;options;constructor($){this.options=$}async record($){let Z=this.options.maxConsecutiveMistakes,Q=$.forceAtLimit&&Z?Z:this.consecutiveMistakes+1;this.consecutiveMistakes=Q;let J=$.details?.trim()||`consecutive mistake (${$.reason})`;if(this.options.emit({type:"error",error:Error(J),recoverable:!0,iteration:$.iteration}),this.options.log("warn","Recorded consecutive mistake",{agentId:this.options.agentId,conversationId:this.options.getConversationId(),runId:this.options.getActiveRunId(),iteration:$.iteration,reason:$.reason,details:$.details,consecutiveMistakes:Q,maxConsecutiveMistakes:this.options.maxConsecutiveMistakes}),!Z||Q<Z)return{action:"continue"};let X={iteration:$.iteration,consecutiveMistakes:Q,maxConsecutiveMistakes:Z,reason:$.reason,details:$.details};this.options.onLimitTelemetry?.(X);let W=await $k(X,this.options.onLimitReached);if(W.action==="continue"){let Y=W.guidance?.trim();if(Y)this.options.appendRecoveryNotice(Y,$.reason);return this.consecutiveMistakes=0,{action:"continue",guidance:Y}}return{action:"stop",reason:W.reason?.trim()||void 0,message:eb({iteration:$.iteration,consecutiveMistakes:Q,maxConsecutiveMistakes:Z,reason:$.reason,details:$.details,stopReason:W.reason})}}reset(){this.consecutiveMistakes=0}get value(){return this.consecutiveMistakes}}function eb($){let Z=[`Stopped after ${$.consecutiveMistakes}/${$.maxConsecutiveMistakes} consecutive mistakes (${$.reason}) at iteration ${$.iteration}.`],Q=$.details?.trim();if(Q)Z.push(`Error: ${Q}`);let J=$.stopReason?.trim();if(J)Z.push(`Decision: ${J}`);return Z.push("Session state was preserved. Send a new prompt to resume from the latest state."),Z.join(" ")}async function $k($,Z){if(!Z)return{action:"stop",reason:`maximum consecutive mistakes reached (${$.maxConsecutiveMistakes})`};try{return await Z($)}catch(Q){return{action:"stop",reason:Q instanceof Error?Q.message:`maximum consecutive mistakes reached (${$.maxConsecutiveMistakes})`}}}function Zk($){switch($){case"auto_compaction":case"manual_compaction":case"compaction_budget_emergency":return $;default:return}}function Qk($){let Z=$.content.filter((Q)=>Q.type==="text");if(Z.length===0)return;return Z.map((Q)=>Q.text).join("")}function Jk($){let Z=$.content.filter((Q)=>Q.type==="reasoning");if(Z.length===0)return;return{reasoning:Z.map((Q)=>Q.text).join(""),redacted:Z.some((Q)=>Q.redacted===!0)}}function Xk($){return $.content.find((Z)=>Z.type==="tool-result")}function Wk($){switch($){case"completed":return"completed";case"aborted":return"aborted";case"failed":return"error"}}function Yk($){if(!$||$.isError!==!0)return;if(typeof $.output==="string")return $.output;if($.output instanceof Error)return $.output.message;try{return JSON.stringify($.output)}catch{return String($.output)}}class FW{lastUsage={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0};toolStartedAt=new Map;translate($){switch($.type){case"run-started":return[];case"message-added":return[];case"turn-started":return[{type:"iteration_start",iteration:$.iteration}];case"turn-finished":return[{type:"iteration_end",iteration:$.iteration,hadToolCalls:$.toolCallCount>0,toolCallCount:$.toolCallCount}];case"assistant-text-delta":return[{type:"content_start",contentType:"text",text:$.text,accumulated:$.accumulatedText}];case"assistant-reasoning-delta":return[{type:"content_start",contentType:"reasoning",reasoning:$.text,redacted:$.redacted===!0}];case"assistant-media":return[{type:"content_end",contentType:"media",media:$.media}];case"assistant-message":return this.translateAssistantMessage($.message);case"tool-started":return this.translateToolStarted($);case"tool-updated":return[{type:"content_update",contentType:"tool",toolName:$.toolCall.toolName,toolCallId:$.toolCall.toolCallId,update:$.update}];case"tool-finished":return this.translateToolFinished($);case"usage-updated":return this.translateUsage($.usage);case"status-notice":return[{type:"notice",noticeType:"status",displayRole:"status",message:$.message,reason:Zk($.metadata?.reason),metadata:$.metadata}];case"run-finished":return this.translateRunFinished($.result);case"run-failed":return[{type:"error",error:$.error,errorClass:$.errorClass,recoverable:!1,iteration:$.snapshot.iteration}];default:return $}}reset(){this.lastUsage={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0},this.toolStartedAt.clear()}translateAssistantMessage($){let Z=[],Q=Qk($);if(Q!==void 0)Z.push({type:"content_end",contentType:"text",text:Q});let J=Jk($);if(J!==void 0)Z.push({type:"content_end",contentType:"reasoning",reasoning:J.reasoning});return Z}translateToolStarted($){return this.toolStartedAt.set($.toolCall.toolCallId,Date.now()),[{type:"content_start",contentType:"tool",toolName:$.toolCall.toolName,toolCallId:$.toolCall.toolCallId,input:$.toolCall.input,execution:$.toolCall.execution}]}translateToolFinished($){let Z=this.toolStartedAt.get($.toolCall.toolCallId),Q=Z===void 0?void 0:Date.now()-Z;this.toolStartedAt.delete($.toolCall.toolCallId);let J=Xk($.message),X=J?.output,W=Yk(J);return[{type:"content_end",contentType:"tool",toolName:$.toolCall.toolName,toolCallId:$.toolCall.toolCallId,output:X,error:W,durationMs:Q,execution:$.toolCall.execution}]}translateUsage($){let Z=$.inputTokens-this.lastUsage.inputTokens,Q=$.outputTokens-this.lastUsage.outputTokens,J=$.cacheReadTokens-this.lastUsage.cacheReadTokens,X=$.cacheWriteTokens-this.lastUsage.cacheWriteTokens,W=this.lastUsage.totalCost??0,j=($.totalCost??0)-W;return this.lastUsage={inputTokens:$.inputTokens,outputTokens:$.outputTokens,cacheReadTokens:$.cacheReadTokens,cacheWriteTokens:$.cacheWriteTokens,totalCost:$.totalCost},[{type:"usage",inputTokens:Math.max(0,Z),outputTokens:Math.max(0,Q),cacheReadTokens:J===0?void 0:Math.max(0,J),cacheWriteTokens:X===0?void 0:Math.max(0,X),cost:j===0?void 0:j,totalInputTokens:$.inputTokens,totalOutputTokens:$.outputTokens,totalCacheReadTokens:$.cacheReadTokens===0?void 0:$.cacheReadTokens,totalCacheWriteTokens:$.cacheWriteTokens===0?void 0:$.cacheWriteTokens,totalCost:$.totalCost}]}translateRunFinished($){let Z={inputTokens:$.usage.inputTokens,outputTokens:$.usage.outputTokens,cacheReadTokens:$.usage.cacheReadTokens===0?void 0:$.usage.cacheReadTokens,cacheWriteTokens:$.usage.cacheWriteTokens===0?void 0:$.usage.cacheWriteTokens,totalCost:$.usage.totalCost};return[{type:"done",reason:Wk($.status),text:$.outputText,iterations:$.iterations,usage:Z}]}}var zk="session_run_in_progress";class NF extends Error{agentId;code=zk;constructor($){super(`SessionRuntime.shutdown called while a run is in progress${$?` (agentId=${$})`:""}`);this.agentId=$;this.name="SessionRunInProgressError"}}function Ok($){if(typeof $==="string")return $;if($ instanceof Error)return $.message;try{return JSON.stringify($)}catch{return String($)}}async function qk($){let Q=(typeof $.content==="function"?await $.content():$.content).trim();return Q.length>0?Q:void 0}function Nk($,Z){let Q=$.trim(),J=Z.map((X)=>X.trim()).filter(Boolean).join(`
|
|
202
|
+
`;function UF($=process.env){return{maxToolResultChars:GF($[WW.maxToolResultChars]),maxTotalTextBytes:GF($[WW.maxTotalTextBytes]),minOutdatedRewriteBytes:cb($[WW.minOutdatedRewriteBytes])}}class jW{indexedMessageCount=0;indexedTailRef;toolNameByIdCache=new Map;readLocatorsByToolUseIdCache=new Map;latestReadToolUseByLocatorCache=new Map;latestFullContentOwnerByPathCache=new Map;readResultLocatorCache=new WeakMap;maxToolResultChars;maxFileContentChars;maxTotalTextBytes;mediaBudget;maxAssistantTextChars;maxAssistantToolMarkupChars;minOutdatedRewriteBytes;committedOutdatedRewrites=new Map;constructor($={}){this.maxToolResultChars=Z5($.maxToolResultChars,fb),this.maxFileContentChars=Z5($.maxFileContentChars,Sb),this.maxTotalTextBytes=Z5($.maxTotalTextBytes,bb),this.mediaBudget=$.mediaBudget??{},this.maxAssistantTextChars=Z5($.maxAssistantTextChars,kb),this.maxAssistantToolMarkupChars=Z5($.maxAssistantToolMarkupChars,xb),this.minOutdatedRewriteBytes=ub($.minOutdatedRewriteBytes,yb)}resetConversationState(){this.resetIndexes(),this.committedOutdatedRewrites.clear()}buildForApi($){this.reindex($),this.commitOutdatedRewrites($);let Q=this.addMissingToolResults($).map((X)=>{if(!Array.isArray(X.content)){if(X.role==="user"&&typeof X.content==="string"){let j=WF(X.content);if(j!==X.content)return{...X,content:j}}if(X.role==="assistant"&&typeof X.content==="string"){let j=this.truncateAssistantText(X.content);if(j!==X.content)return{...X,content:j}}return X}let W=!1,Y=X.content.map((j)=>{let V=this.transformBlock(j,X.role);if(V!==j)W=!0;return V});return W?{...X,content:Y}:X}),J=this.applyMediaBudget(Q);return this.truncateToTotalTextBudget(J)}transformBlock($,Z){if(Z==="user"&&$.type==="text"&&typeof $.text==="string"){let X=WF($.text);if(X!==$.text)return{...$,text:X};return $}if(Z==="assistant"&&$.type==="text"&&typeof $.text==="string"){let X=this.truncateAssistantText($.text);return X===$.text?$:{...$,text:X}}if($.type==="file"){let X=H8($.content,this.maxFileContentChars,VF);return X===$.content?$:{...$,content:X}}if($.type!=="tool_result")return $;let Q=this.resolveToolName($),J=$.content;if(this.isReadTool(Q)&&$.is_error!==!0){let X=this.committedOutdatedRewrites.get($.tool_use_id);if(X&&X.size>0){let Y=this.getReadLocators($).filter((j)=>X.has(this.toReadLocatorKey(j))&&this.isOutdatedReadLocator(j,$.tool_use_id));if(Y.length>0)J=this.replaceOutdatedReadContent(J,Y)}}return J=this.truncateToolResultContent(J),J===$.content?$:{...$,content:J}}reindex($){let Z=this.indexedMessageCount===0||$.length>=this.indexedMessageCount&&$[this.indexedMessageCount-1]===this.indexedTailRef;if($.length<this.indexedMessageCount||!Z)this.resetIndexes();for(let Q=this.indexedMessageCount;Q<$.length;Q++){let J=$[Q];if(!Array.isArray(J.content))continue;for(let X=0;X<J.content.length;X++){let W=J.content[X];if(W.type==="file")this.latestFullContentOwnerByPathCache.set(W.path,`file:${Q}:${X}`);else if(W.type==="tool_use"){let Y=W.name.toLowerCase();if(this.toolNameByIdCache.set(W.id,Y),this.isReadTool(Y)){let j=this.extractLocatorsFromReadToolInput(W.input);if(j.length>0)this.readLocatorsByToolUseIdCache.set(W.id,j)}}else if(W.type==="tool_result"){let Y=this.resolveToolName(W);if(!this.isReadTool(Y)||W.is_error===!0)continue;let j=this.getReadLocators(W);for(let V of j)if(this.latestReadToolUseByLocatorCache.set(this.toReadLocatorKey(V),W.tool_use_id),this.isFullFileRead(V))this.latestFullContentOwnerByPathCache.set(V.path,W.tool_use_id)}}}this.indexedMessageCount=$.length,this.indexedTailRef=$.length>0?$[$.length-1]:void 0}commitOutdatedRewrites($){let Z=new Map,Q=new Set,J=0;for(let X of $){if(!Array.isArray(X.content))continue;for(let W of X.content){if(W.type!=="tool_result"||W.is_error===!0)continue;let Y=this.resolveToolName(W);if(!this.isReadTool(Y))continue;Q.add(W.tool_use_id);let j=this.committedOutdatedRewrites.get(W.tool_use_id),V=new Set,K=new Set;for(let G of this.getReadLocators(W)){let U=this.toReadLocatorKey(G);if(!this.isOutdatedReadLocator(G,W.tool_use_id))continue;if(K.add(U),!j?.has(U))V.add(U)}if(j){for(let G of j)if(!K.has(G))j.delete(G);if(j.size===0)this.committedOutdatedRewrites.delete(W.tool_use_id)}if(V.size===0)continue;let B=Z.get(W.tool_use_id);if(!B)B=new Set,Z.set(W.tool_use_id,B);for(let G of V)B.add(G);J+=this.estimateOutdatedReclaimBytes(W.content,V)}}for(let X of this.committedOutdatedRewrites.keys())if(!Q.has(X))this.committedOutdatedRewrites.delete(X);if(Z.size===0||J<this.minOutdatedRewriteBytes)return;for(let[X,W]of Z){let Y=this.committedOutdatedRewrites.get(X);if(!Y)Y=new Set,this.committedOutdatedRewrites.set(X,Y);for(let j of W)Y.add(j)}}estimateOutdatedReclaimBytes($,Z){let Q=this.extractReadLocatorsFromToolResultContent($),J=Q.length>0&&Q.every((V)=>Z.has(this.toReadLocatorKey(V))),X=(V)=>{let K;try{K=JSON.parse(V)}catch{return J||Q.length===0?O0(this.truncateMiddle(V)):0}let B=Array.isArray(K)?K:[K],G=0;for(let U of B){let H=this.extractLocatorFromResultEntry(U);if(H&&Z.has(this.toReadLocatorKey(H)))G+=this.providerBoundEntryBytes(U)}return G};if(typeof $==="string")return X($);let W=new Set(Z),Y=0;for(let V of $)if(V.type==="text")Y+=this.countOutdatedImageEntries(V.text,W);let j=0;for(let V of $)if(V.type==="text")j+=X(V.text);else if(V.type==="image"){if(Y>0)Y-=1,j+=O0(V.data)}else if(X2(V)){let K=this.extractLocatorFromResultEntry(V);if(K&&Z.has(this.toReadLocatorKey(K)))j+=this.providerBoundEntryBytes(V)}else if(V.type==="file"){if(Z.has(this.toReadLocatorKey({path:V.path,startLine:null,endLine:null})))j+=O0(this.truncateMiddle(V.content))}return j}providerBoundEntryBytes($){let Z=this.truncateNestedStrings($);return O0(JSON.stringify(Z))}addMissingToolResults($){let Z=this.collectToolResultIds($),Q=[],J=new Map,X=!1,W=()=>{if(J.size===0)return;Y(this.createMissingToolResultMessage(J)),J.clear(),X=!0},Y=(j)=>{let V=Q.at(-1);if(this.shouldMergeUserAfterToolResults(V,j)){Q[Q.length-1]={...V,content:[...V.content,...this.contentBlocksForUserMerge(j.content)]},X=!0;return}Q.push(j)};for(let j of $){if(this.isToolResultOnlyMessage(j)){if(Y(this.appendMissingToolResults(j,J)),J.size>0)J.clear(),X=!0;continue}if(Array.isArray(j.content)){let V=j.content.filter((B)=>B.type==="tool_result"),K=j.content.filter((B)=>B.type!=="tool_result");if(V.length>0){let B=this.appendMissingToolResults({...j,role:"user",content:V},J);if(Y(B),J.size>0)J.clear();X=!0}if(K.length>0||V.length===0){if(V.length===0)W();let B=V.length>0?{...j,content:K}:j;if(Y(B),B.role==="assistant")this.trackMissingToolCalls(B,Z,J)}continue}W(),Y(j)}return W(),X?Q:$}appendMissingToolResults($,Z){if(Z.size===0||!Array.isArray($.content))return $;return{...$,role:"user",content:[...$.content,...this.createMissingToolResultBlocks(Z)]}}shouldMergeUserAfterToolResults($,Z){return $?.role==="user"&&Z.role==="user"&&this.isToolResultOnlyMessage($)&&this.contentBlocksForUserMerge(Z.content).length>0}contentBlocksForUserMerge($){return typeof $==="string"?$.length>0?[{type:"text",text:$}]:[]:$}collectToolResultIds($){let Z=new Set;for(let Q of $){if(!Array.isArray(Q.content))continue;for(let J of Q.content)if(J.type==="tool_result")Z.add(J.tool_use_id)}return Z}isToolResultOnlyMessage($){return $.role==="user"&&Array.isArray($.content)&&$.content.length>0&&$.content.every((Z)=>Z.type==="tool_result")}trackMissingToolCalls($,Z,Q){if(!Array.isArray($.content))return;for(let J of $.content){if(J.type!=="tool_use"||Z.has(J.id))continue;Q.set(J.id,J.name)}}createMissingToolResultMessage($){return{role:"user",content:this.createMissingToolResultBlocks($)}}createMissingToolResultBlocks($){return Array.from($,([Z,Q])=>({type:"tool_result",tool_use_id:Z,name:Q,content:[{type:"text",text:this.formatMissingToolResultText(Q)}],is_error:!0}))}formatMissingToolResultText($){return $?`${jF} Tool: ${$}.`:jF}resetIndexes(){this.indexedMessageCount=0,this.indexedTailRef=void 0,this.toolNameByIdCache.clear(),this.readLocatorsByToolUseIdCache.clear(),this.latestReadToolUseByLocatorCache.clear(),this.latestFullContentOwnerByPathCache.clear(),this.readResultLocatorCache=new WeakMap}getReadLocators($){let Z=$,Q=this.readResultLocatorCache.get(Z);if(Q===void 0)Q=this.extractReadLocatorsFromToolResultContent($.content),this.readResultLocatorCache.set(Z,Q);if(Q.length>0)return Q;return this.readLocatorsByToolUseIdCache.get($.tool_use_id)??[]}extractLocatorsFromReadToolInput($){if(!$||typeof $!=="object")return[];let Z=$,Q=[],J=this.extractLocatorFromReadRequest(Z);if(J)Q.push(J);if(Array.isArray(Z.files))for(let X of Z.files){let W=this.extractLocatorFromReadRequest(X);if(W)Q.push(W)}if(Array.isArray(Z.file_paths)){for(let X of Z.file_paths)if(typeof X==="string"&&X.length>0)Q.push({path:X,startLine:null,endLine:null})}return this.dedupeReadLocators(Q)}extractReadLocatorsFromToolResultContent($){if(typeof $==="string")return this.tryParseReadLocators($);let Z=[];for(let Q of $){if(Q.type==="text"){Z.push(...this.tryParseReadLocators(Q.text));continue}if(X2(Q)){let J=this.extractLocatorFromResultEntry(Q);if(J)Z.push(J)}}return this.dedupeReadLocators(Z)}tryParseReadLocators($){try{return this.extractLocatorsFromParsedReadResult(JSON.parse($))}catch{return[]}}extractLocatorsFromParsedReadResult($){if(Array.isArray($)){let Q=[];for(let J of $){let X=this.extractLocatorFromResultEntry(J);if(X)Q.push(X)}return this.dedupeReadLocators(Q)}let Z=this.extractLocatorFromResultEntry($);return Z?[Z]:[]}extractLocatorFromReadRequest($){if(!$||typeof $!=="object")return;let Z=$,Q=this.extractPath(Z);if(!Q)return;return{path:Q,startLine:this.extractLineNumber(Z.start_line),endLine:this.extractLineNumber(Z.end_line)}}extractLocatorFromResultEntry($){if(!$||typeof $!=="object")return;let Z=$,Q=this.extractPath(Z);if(Q)return{path:Q,startLine:this.extractLineNumber(Z.start_line),endLine:this.extractLineNumber(Z.end_line)};if(typeof Z.query==="string"&&Z.query.length>0)return this.parseReadQuery(Z.query);return}extractPath($){let Z=[$.path,$.file_path,$.filePath];for(let Q of Z)if(typeof Q==="string"&&Q.length>0)return Q;return}extractLineNumber($){return typeof $==="number"&&Number.isInteger($)?$:null}parseReadQuery($){let Z=/^(.*):(\d+)-(EOF|\d+)$/.exec($);if(!Z)return{path:$,startLine:null,endLine:null};return{path:Z[1],startLine:Number(Z[2]),endLine:Z[3]==="EOF"?null:Number(Z[3])}}dedupeReadLocators($){let Z=new Map;for(let Q of $)Z.set(this.toReadLocatorKey(Q),Q);return Array.from(Z.values())}toReadLocatorKey($){if(this.isFullFileRead($))return $.path;return`${$.path}:${$.startLine??1}-${$.endLine??"EOF"}`}isFullFileRead($){return $.startLine==null&&$.endLine==null}isOutdatedReadLocator($,Z){let Q=this.latestFullContentOwnerByPathCache.get($.path);if(Q&&Q!==Z)return!0;return this.latestReadToolUseByLocatorCache.get(this.toReadLocatorKey($))!==Z}replaceOutdatedReadContent($,Z){let Q=new Set(Z.map((W)=>this.toReadLocatorKey(W))),J=new Set(Z.map((W)=>W.path));if(typeof $==="string")return this.replaceOutdatedInString($,Q)??n2;let X=0;for(let W of $)if(W.type==="text")X+=this.countOutdatedImageEntries(W.text,Q);return $.map((W)=>{if(W.type==="file"){if(!J.has(W.path))return W;return{...W,content:n2}}if(W.type==="image"){if(X===0)return W;return X-=1,{type:"text",text:n2}}if(X2(W))return this.replaceOutdatedReadEntry(W,Q);if(W.type!=="text")return W;let Y=this.replaceOutdatedInString(W.text,Q);if(Y===null)return{...W,text:n2};return Y===W.text?W:{...W,text:Y}})}countOutdatedImageEntries($,Z){let Q;try{Q=JSON.parse($)}catch{return 0}let J=Array.isArray(Q)?Q:[Q],X=0;for(let W of J){if(!W||typeof W!=="object")continue;let Y=W,j=this.extractLocatorFromResultEntry(Y);if(!j)continue;if(!Z.has(this.toReadLocatorKey(j)))continue;if(Y.result==="Successfully read image"||Y.content==="Successfully read image")X+=1}return X}replaceOutdatedInString($,Z){let Q;try{Q=JSON.parse($)}catch{return null}let J=Array.isArray(Q)?Q.map((X)=>this.replaceOutdatedReadEntry(X,Z)):this.replaceOutdatedReadEntry(Q,Z);return JSON.stringify(J)}replaceOutdatedReadEntry($,Z){if(!$||typeof $!=="object")return $;let Q=this.extractLocatorFromResultEntry($);if(!Q||!Z.has(this.toReadLocatorKey(Q)))return $;let J={...$};if(typeof J.result==="string")J.result=n2;else if(typeof J.content==="string")J.content=n2;else J.result=n2;return J}isReadTool($){return!!$&&hb.has($)}resolveToolName($){let Z=this.toolNameByIdCache.get($.tool_use_id);if(Z!==void 0)return Z;return typeof $.name==="string"&&$.name.length>0?$.name.toLowerCase():void 0}truncateToolResultContent($){if(typeof $==="string")return this.truncateMiddle($);return $.map((Z)=>{if(Z.type==="file"){let Q=this.truncateMiddle(Z.content);return Q===Z.content?Z:{...Z,content:Q}}if(Z.type==="text"){let Q=this.truncateMiddle(Z.text);return Q===Z.text?Z:{...Z,text:Q}}if(X2(Z))return this.truncateNestedStrings(Z);return Z})}truncateNestedStrings($){if(typeof $==="string")return this.truncateMiddle($);if(Array.isArray($)){let Z=!1,Q=$.map((J)=>{let X=this.truncateNestedStrings(J);if(X!==J)Z=!0;return X});return Z?Q:$}if($!==null&&typeof $==="object"){if(VW($))return $;let Z=!1,Q={};for(let[J,X]of Object.entries($)){let W=this.truncateNestedStrings(X);if(W!==X)Z=!0;Q[J]=W}return Z?Q:$}return $}truncateMiddle($){return H8($,this.maxToolResultChars,VF)}truncateAssistantText($){if(this.hasRepeatedToolCallMarkup($))return H8($,this.maxAssistantToolMarkupChars,gb);return H8($,this.maxAssistantTextChars,vb)}hasRepeatedToolCallMarkup($){if($.length<=this.maxAssistantToolMarkupChars)return!1;let Z=0;for(let Q of $.matchAll(mb))if(Z+=1,Z>=Ib)return!0;return!1}truncateToTotalTextBudget($){let Z=this.countMessageTextBytes($);if(Z<=this.maxTotalTextBytes)return $;let Q=$.map((X)=>{if(!Array.isArray(X.content))return{...X};return{...X,content:X.content.map((W)=>pb(W))}}),J=this.collectTruncationCandidates(Q);for(let X of J){if(Z<=this.maxTotalTextBytes)break;let W=X.byteLength;if(W<=X.minBytes)continue;let Y=Z-this.maxTotalTextBytes,j=Math.max(X.minBytes,W-Y),V=db(X.get(),j,X.makeMarker);X.set(V),Z-=W-O0(V)}return Q}countMessageTextBytes($){let Z=0;for(let Q of $){if(typeof Q.content==="string"){Z+=O0(Q.content);continue}for(let J of Q.content)if(J.type==="text")Z+=O0(J.text);else if(J.type==="thinking")Z+=O0(J.thinking);else if(J.type==="file")Z+=O0(J.content);else if(J.type==="tool_use")Z+=G7(J.input);else if(J.type==="tool_result"){if(typeof J.content==="string")Z+=O0(J.content);else for(let X of J.content)if(X.type==="text")Z+=O0(X.text);else if(X.type==="file")Z+=O0(X.content);else if(X2(X))Z+=G7(X)}}return Z}collectTruncationCandidates($){let Z=[],Q=[];for(let J of $){if(J.role==="assistant"&&typeof J.content==="string"){Z.push({byteLength:O0(J.content),minBytes:YF,makeMarker:KF,get:()=>J.content,set:(X)=>{J.content=X}});continue}if(!Array.isArray(J.content))continue;for(let X of J.content){if(X.type==="tool_use"){U7(X.input,Q);continue}if(J.role==="assistant"&&X.type==="text"){Z.push({byteLength:O0(X.text),minBytes:YF,makeMarker:KF,get:()=>X.text,set:(W)=>{X.text=W}});continue}if(X.type!=="tool_result")continue;if(typeof X.content==="string"){Z.push({byteLength:O0(X.content),minBytes:Q5,makeMarker:J5,get:()=>X.content,set:(W)=>{X.content=W}});continue}for(let W of X.content)if(W.type==="text")Z.push({byteLength:O0(W.text),minBytes:Q5,makeMarker:J5,get:()=>W.text,set:(Y)=>{W.text=Y}});else if(W.type==="file")Z.push({byteLength:O0(W.content),minBytes:Q5,makeMarker:J5,get:()=>W.content,set:(Y)=>{W.content=Y}});else if(X2(W))U7(W,Z)}}return Z.sort((J,X)=>X.byteLength-J.byteLength),Q.sort((J,X)=>X.byteLength-J.byteLength),[...Z,...Q]}applyMediaBudget($){let Z=this.resolveMediaBudget();if(Z.maxImageEncodedBytes===Number.POSITIVE_INFINITY&&Z.maxImageDecodedBytes===Number.POSITIVE_INFINITY&&Z.maxTotalMediaBytes===Number.POSITIVE_INFINITY)return $;let Q=Cb(),J=!1,X=$.map((W)=>{if(!Array.isArray(W.content))return W;let Y=!1,j=W.content.map((V)=>{let K=this.applyMediaBudgetToBlock(V,Z,Q);if(K!==V)Y=!0;return K});if(!Y)return W;return J=!0,{...W,content:j}});return J?X:$}resolveMediaBudget(){return Pb(this.mediaBudget)}applyMediaBudgetToBlock($,Z,Q){if(YW($))return this.limitImageContent($,Z,Q);if($.type!=="tool_result"||typeof $.content==="string")return $;let J=!1,X=$.content.map((W)=>{let Y=this.applyMediaBudgetToToolResultEntry(W,Z,Q);if(Y!==W)J=!0;return Y});return J?{...$,content:X}:$}applyMediaBudgetToToolResultEntry($,Z,Q){if(YW($))return this.limitImageContent($,Z,Q);if(X2($))return this.limitNestedMedia($,Z,Q);return $}limitNestedMedia($,Z,Q){if(YW($)){let J=this.limitImageContent($,Z,Q);return J.type==="text"?J.text:J}if(Array.isArray($)){let J=!1,X=$.map((W)=>{let Y=this.limitNestedMedia(W,Z,Q);if(Y!==W)J=!0;return Y});return J?X:$}if($!==null&&typeof $==="object"){let J=!1,X={};for(let[W,Y]of Object.entries($)){let j=this.limitNestedMedia(Y,Z,Q);if(j!==Y)J=!0;X[W]=j}return J?X:$}return $}limitImageContent($,Z,Q){if(!HF($))return{type:"text",text:XF};let J=wb($.mediaType,$.data,{maxImageEncodedBytes:Z.maxImageEncodedBytes,maxImageDecodedBytes:Z.maxImageDecodedBytes,maxTotalMediaBytes:Z.maxTotalMediaBytes},Q);if(!J.ok)return{type:"text",text:XF};return{...$,data:J.base64,mediaType:J.mediaType}}}var BF=String.raw`[\|\uFF5C]`,mb=new RegExp(String.raw`<\s*(?:${BF}\s*)?DSML\s*(?:${BF}\s*)?(?:tool_calls|invoke)\b[^>]*>|<\s*/?\s*(?:tool_calls?|tool_call|function_calls?|function_call|invoke)\b[^>]*>`,"gi");function O0($){return Buffer.byteLength($,"utf8")}function GF($){if($===void 0)return;let Z=Number.parseInt($,10);return Number.isFinite(Z)&&Z>0?Z:void 0}function cb($){if($===void 0)return;let Z=$.trim().toLowerCase();if(Z==="infinity"||Z==="disable")return Number.POSITIVE_INFINITY;let Q=Number.parseInt($,10);return Number.isFinite(Q)&&Q>=0?Q:void 0}function Z5($,Z){return typeof $==="number"&&Number.isFinite($)&&$>0?Math.floor($):Z}function ub($,Z){if(typeof $!=="number"||Number.isNaN($)||$<0)return Z;return Number.isFinite($)?Math.floor($):$}function H8($,Z,Q){if($.length<=Z)return $;let J=Q($.length-Z),X=Math.max(0,Math.floor((Z-J.length)/2)),W=Math.max(0,$.length-X*2),Y=Q(W),j=Math.max(0,Math.floor((Z-Y.length)/2)),V=$.slice(0,j),K=j>0?$.slice(-j):"";return`${V}${Y}${K}`}function db($,Z,Q){if(O0($)<=Z)return $;let J=0,X=$.length,W=H8($,0,Q);while(J<=X){let Y=J+X>>>1,j=H8($,Y,Q);if(O0(j)<=Z)W=j,J=Y+1;else X=Y-1}return W}function pb($){if($.type==="tool_use")return{...$,input:H7($.input)};if($.type!=="tool_result"||typeof $.content==="string")return{...$};return{...$,content:$.content.map((Z)=>X2(Z)?H7(Z):{...Z})}}function X2($){if($===null||typeof $!=="object")return!1;let Z=$.type;return Z!=="text"&&Z!=="image"&&Z!=="file"}function YW($){return $!==null&&typeof $==="object"&&$.type==="image"}function HF($){return $!==null&&typeof $==="object"&&$.type==="image"&&typeof $.data==="string"&&typeof $.mediaType==="string"}function VW($){return HF($)}function G7($){if(typeof $==="string")return O0($);if(Array.isArray($)){let Z=0;for(let Q of $)Z+=G7(Q);return Z}if($!==null&&typeof $==="object"){if(VW($))return 0;let Z=0;for(let Q of Object.values($))Z+=G7(Q);return Z}return 0}function U7($,Z){if(Array.isArray($)){$.forEach((Q,J)=>{if(typeof Q==="string")Z.push({byteLength:O0(Q),minBytes:Q5,makeMarker:J5,get:()=>$[J],set:(X)=>{$[J]=X}});else U7(Q,Z)});return}if($!==null&&typeof $==="object"){if(VW($))return;let Q=$;for(let J of Object.keys(Q)){let X=Q[J];if(typeof X==="string")Z.push({byteLength:O0(X),minBytes:Q5,makeMarker:J5,get:()=>Q[J],set:(W)=>{Q[J]=W}});else U7(X,Z)}}}function H7($){if(Array.isArray($))return $.map(H7);if($!==null&&typeof $==="object"){let Z={};for(let[Q,J]of Object.entries($))Z[Q]=H7(J);return Z}return $}function KW(){return`conv_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}class BW{messages=[];conversationId=KW();sessionStarted=!1;constructor($){if(($?.length??0)>0)this.restore($??[])}getConversationId(){return this.conversationId}getMessages(){return[...this.messages]}appendMessage($){this.messages.push($)}appendMessages($){if($.length===0)return;this.messages.push(...$)}replaceMessages($){this.messages=[...$]}resetForRun(){this.messages=[],this.conversationId=KW(),this.sessionStarted=!1}clearHistory(){this.messages=[],this.conversationId=KW(),this.sessionStarted=!1}restore($){this.messages=[...$],this.sessionStarted=!1}isSessionStarted(){return this.sessionStarted}markSessionStarted(){this.sessionStarted=!0}}var W2="0.0.85";var o2={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:W2,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"},"./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:{"@cline/agents":"workspace:*","@cline/shared":"workspace:*","@cline/llms":"workspace:*","@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",jiti:"^2.7.0","node-machine-id":"^1.1.12",nanoid:"^5.1.7","simple-git":"3.36.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/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["dist","!dist/**/*.d.ts.map"]};function LF($){let{agentConfig:Z}=$,Q=lb(Z),J=ib(Z),X=$.hooks,W=ab(Z.maxParallelToolCalls);return{distinctId:Z.distinctId,clientName:Z.extensionContext?.client?.name,clientVersion:Z.extensionContext?.client?.version,clineCoreVersion:W2,sessionId:$.sessionId??Z.sessionId,agentId:$.agentId,conversationId:$.conversationId,parentAgentId:$.parentAgentId,agentRole:$.agentRole,systemPrompt:$.systemPrompt??Z.systemPrompt,messageModelInfo:J,model:$.model,modelOptions:Q,modelTools:Z.modelTools,tools:$.tools,hooks:X,prepareTurn:$.prepareTurn,consumePendingUserMessage:Z.consumePendingUserMessage,plugins:$.plugins,logger:$.logger??Z.logger,telemetry:$.telemetry??Z.telemetry,initialMessages:$.initialMessages,completionPolicy:$.completionPolicy===null?void 0:$.completionPolicy??Z.completionPolicy,maxIterations:Z.maxIterations,toolExecution:W,toolPolicies:Z.toolPolicies,toolContextMetadata:$.toolContextMetadata,requestToolApproval:Z.requestToolApproval}}function lb($){let Z={};if($.thinking!==void 0)Z.thinking=$.thinking;if($.reasoningEffort!==void 0)Z.reasoningEffort=$.reasoningEffort;if($.thinkingBudgetTokens!==void 0)Z.thinkingBudgetTokens=$.thinkingBudgetTokens;if($.maxTokensPerTurn!==void 0)Z.maxTokensPerTurn=$.maxTokensPerTurn;if($.temperature!==void 0)Z.temperature=$.temperature;if($.apiTimeoutMs!==void 0)Z.apiTimeoutMs=$.apiTimeoutMs;return Object.keys(Z).length>0?Z:void 0}function ib($){let Z=$.providerConfig?.family;return{id:$.modelId,provider:$.providerId,family:Z}}function ab($){if($===void 0)return;return $>=2?"parallel":"sequential"}function rb($){let Z={};if($.providerId!==void 0)Z.providerId=$.providerId;if($.modelId!==void 0)Z.modelId=$.modelId;if($.apiKey!==void 0)Z.apiKey=$.apiKey;if($.baseUrl!==void 0)Z.baseUrl=$.baseUrl;if($.headers!==void 0)Z.headers=$.headers;if($.providerConfig!==void 0)Z.providerConfig=$.providerConfig;if($.thinking===!1)return Z.thinking=!1,Z.reasoningEffort=null,Z.thinkingBudgetTokens=null,Z;if($.thinking===!0)Z.thinking=!0,Z.reasoningEffort=$.reasoningEffort??null,Z.thinkingBudgetTokens=null;else if($.reasoningEffort!==void 0)Z.thinking=!0,Z.reasoningEffort=$.reasoningEffort;if(typeof $.thinkingBudgetTokens==="number"&&Number.isFinite($.thinkingBudgetTokens)&&$.thinkingBudgetTokens>0)Z.thinking=!0,Z.thinkingBudgetTokens=Math.trunc($.thinkingBudgetTokens);return Z}function F8($){let Z={...$},Q=Object.hasOwn($,"thinking"),J=Object.hasOwn($,"thinkingBudgetTokens");if($.thinking===!1||$.thinking===null)return Z.reasoningEffort=void 0,Z.thinkingBudgetTokens=void 0,Z;if(!Q&&J&&typeof $.thinkingBudgetTokens==="number"&&Number.isFinite($.thinkingBudgetTokens)&&$.thinkingBudgetTokens>0)Z.thinking=!0;return Z}function nb(){return{lastToolName:"",lastToolSignature:"",consecutiveIdenticalCount:0}}function ob($){$.lastToolName="",$.lastToolSignature="",$.consecutiveIdenticalCount=0}function GW($){if($==null||typeof $!=="object")return $;if(Array.isArray($))return $.map(GW);let Z={};for(let Q of Object.keys($).sort())Z[Q]=GW($[Q]);return Z}function sb($){if($==null)return"null";if(typeof $==="string")return $;if(typeof $!=="object")return String($);try{return JSON.stringify(GW($))}catch{return String($)}}function tb($,Z,Q,J){if(Z===$.lastToolName&&Q===$.lastToolSignature)$.consecutiveIdenticalCount++;else $.consecutiveIdenticalCount=1;return $.lastToolName=Z,$.lastToolSignature=Q,{softWarning:$.consecutiveIdenticalCount===J.softThreshold,hardEscalation:$.consecutiveIdenticalCount>=J.hardThreshold}}var DF={softThreshold:3,hardThreshold:5};class UW{config;state=nb();constructor($){this.config={softThreshold:$?.softThreshold??DF.softThreshold,hardThreshold:$?.hardThreshold??DF.hardThreshold}}inspect($){let Z=sb($.input),Q=tb(this.state,$.name,Z,this.config);if(Q.hardEscalation)return{kind:"hard",message:`Detected ${this.state.consecutiveIdenticalCount} consecutive identical calls to \`${$.name}\`; stopping to avoid a loop.`};if(Q.softWarning)return{kind:"soft",message:`Detected ${this.state.consecutiveIdenticalCount} consecutive identical calls to \`${$.name}\`; consider trying a different approach.`};return{kind:"ok"}}reset(){ob(this.state)}}class HW{consecutiveMistakes=0;options;constructor($){this.options=$}async record($){let Z=this.options.maxConsecutiveMistakes,Q=$.forceAtLimit&&Z?Z:this.consecutiveMistakes+1;this.consecutiveMistakes=Q;let J=$.details?.trim()||`consecutive mistake (${$.reason})`;if(this.options.emit({type:"error",error:Error(J),recoverable:!0,iteration:$.iteration}),this.options.log("warn","Recorded consecutive mistake",{agentId:this.options.agentId,conversationId:this.options.getConversationId(),runId:this.options.getActiveRunId(),iteration:$.iteration,reason:$.reason,details:$.details,consecutiveMistakes:Q,maxConsecutiveMistakes:this.options.maxConsecutiveMistakes}),!Z||Q<Z)return{action:"continue"};let X={iteration:$.iteration,consecutiveMistakes:Q,maxConsecutiveMistakes:Z,reason:$.reason,details:$.details};this.options.onLimitTelemetry?.(X);let W=await $k(X,this.options.onLimitReached);if(W.action==="continue"){let Y=W.guidance?.trim();if(Y)this.options.appendRecoveryNotice(Y,$.reason);return this.consecutiveMistakes=0,{action:"continue",guidance:Y}}return{action:"stop",reason:W.reason?.trim()||void 0,message:eb({iteration:$.iteration,consecutiveMistakes:Q,maxConsecutiveMistakes:Z,reason:$.reason,details:$.details,stopReason:W.reason})}}reset(){this.consecutiveMistakes=0}get value(){return this.consecutiveMistakes}}function eb($){let Z=[`Stopped after ${$.consecutiveMistakes}/${$.maxConsecutiveMistakes} consecutive mistakes (${$.reason}) at iteration ${$.iteration}.`],Q=$.details?.trim();if(Q)Z.push(`Error: ${Q}`);let J=$.stopReason?.trim();if(J)Z.push(`Decision: ${J}`);return Z.push("Session state was preserved. Send a new prompt to resume from the latest state."),Z.join(" ")}async function $k($,Z){if(!Z)return{action:"stop",reason:`maximum consecutive mistakes reached (${$.maxConsecutiveMistakes})`};try{return await Z($)}catch(Q){return{action:"stop",reason:Q instanceof Error?Q.message:`maximum consecutive mistakes reached (${$.maxConsecutiveMistakes})`}}}function Zk($){switch($){case"auto_compaction":case"manual_compaction":case"compaction_budget_emergency":return $;default:return}}function Qk($){let Z=$.content.filter((Q)=>Q.type==="text");if(Z.length===0)return;return Z.map((Q)=>Q.text).join("")}function Jk($){let Z=$.content.filter((Q)=>Q.type==="reasoning");if(Z.length===0)return;return{reasoning:Z.map((Q)=>Q.text).join(""),redacted:Z.some((Q)=>Q.redacted===!0)}}function Xk($){return $.content.find((Z)=>Z.type==="tool-result")}function Wk($){switch($){case"completed":return"completed";case"aborted":return"aborted";case"failed":return"error"}}function Yk($){if(!$||$.isError!==!0)return;if(typeof $.output==="string")return $.output;if($.output instanceof Error)return $.output.message;try{return JSON.stringify($.output)}catch{return String($.output)}}class FW{lastUsage={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0};toolStartedAt=new Map;translate($){switch($.type){case"run-started":return[];case"message-added":return[];case"turn-started":return[{type:"iteration_start",iteration:$.iteration}];case"turn-finished":return[{type:"iteration_end",iteration:$.iteration,hadToolCalls:$.toolCallCount>0,toolCallCount:$.toolCallCount}];case"assistant-text-delta":return[{type:"content_start",contentType:"text",text:$.text,accumulated:$.accumulatedText}];case"assistant-reasoning-delta":return[{type:"content_start",contentType:"reasoning",reasoning:$.text,redacted:$.redacted===!0}];case"assistant-media":return[{type:"content_end",contentType:"media",media:$.media}];case"assistant-message":return this.translateAssistantMessage($.message);case"tool-started":return this.translateToolStarted($);case"tool-updated":return[{type:"content_update",contentType:"tool",toolName:$.toolCall.toolName,toolCallId:$.toolCall.toolCallId,update:$.update}];case"tool-finished":return this.translateToolFinished($);case"usage-updated":return this.translateUsage($.usage);case"status-notice":return[{type:"notice",noticeType:"status",displayRole:"status",message:$.message,reason:Zk($.metadata?.reason),metadata:$.metadata}];case"run-finished":return this.translateRunFinished($.result);case"run-failed":return[{type:"error",error:$.error,errorClass:$.errorClass,recoverable:!1,iteration:$.snapshot.iteration}];default:return $}}reset(){this.lastUsage={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0},this.toolStartedAt.clear()}translateAssistantMessage($){let Z=[],Q=Qk($);if(Q!==void 0)Z.push({type:"content_end",contentType:"text",text:Q});let J=Jk($);if(J!==void 0)Z.push({type:"content_end",contentType:"reasoning",reasoning:J.reasoning});return Z}translateToolStarted($){return this.toolStartedAt.set($.toolCall.toolCallId,Date.now()),[{type:"content_start",contentType:"tool",toolName:$.toolCall.toolName,toolCallId:$.toolCall.toolCallId,input:$.toolCall.input,execution:$.toolCall.execution}]}translateToolFinished($){let Z=this.toolStartedAt.get($.toolCall.toolCallId),Q=Z===void 0?void 0:Date.now()-Z;this.toolStartedAt.delete($.toolCall.toolCallId);let J=Xk($.message),X=J?.output,W=Yk(J);return[{type:"content_end",contentType:"tool",toolName:$.toolCall.toolName,toolCallId:$.toolCall.toolCallId,output:X,error:W,durationMs:Q,execution:$.toolCall.execution}]}translateUsage($){let Z=$.inputTokens-this.lastUsage.inputTokens,Q=$.outputTokens-this.lastUsage.outputTokens,J=$.cacheReadTokens-this.lastUsage.cacheReadTokens,X=$.cacheWriteTokens-this.lastUsage.cacheWriteTokens,W=this.lastUsage.totalCost??0,j=($.totalCost??0)-W;return this.lastUsage={inputTokens:$.inputTokens,outputTokens:$.outputTokens,cacheReadTokens:$.cacheReadTokens,cacheWriteTokens:$.cacheWriteTokens,totalCost:$.totalCost},[{type:"usage",inputTokens:Math.max(0,Z),outputTokens:Math.max(0,Q),cacheReadTokens:J===0?void 0:Math.max(0,J),cacheWriteTokens:X===0?void 0:Math.max(0,X),cost:j===0?void 0:j,totalInputTokens:$.inputTokens,totalOutputTokens:$.outputTokens,totalCacheReadTokens:$.cacheReadTokens===0?void 0:$.cacheReadTokens,totalCacheWriteTokens:$.cacheWriteTokens===0?void 0:$.cacheWriteTokens,totalCost:$.totalCost}]}translateRunFinished($){let Z={inputTokens:$.usage.inputTokens,outputTokens:$.usage.outputTokens,cacheReadTokens:$.usage.cacheReadTokens===0?void 0:$.usage.cacheReadTokens,cacheWriteTokens:$.usage.cacheWriteTokens===0?void 0:$.usage.cacheWriteTokens,totalCost:$.usage.totalCost};return[{type:"done",reason:Wk($.status),text:$.outputText,iterations:$.iterations,usage:Z}]}}var zk="session_run_in_progress";class NF extends Error{agentId;code=zk;constructor($){super(`SessionRuntime.shutdown called while a run is in progress${$?` (agentId=${$})`:""}`);this.agentId=$;this.name="SessionRunInProgressError"}}function Ok($){if(typeof $==="string")return $;if($ instanceof Error)return $.message;try{return JSON.stringify($)}catch{return String($)}}async function qk($){let Q=(typeof $.content==="function"?await $.content():$.content).trim();return Q.length>0?Q:void 0}function Nk($,Z){let Q=$.trim(),J=Z.map((X)=>X.trim()).filter(Boolean).join(`
|
|
203
203
|
|
|
204
204
|
`);if(Q&&J)return`${Q}
|
|
205
205
|
|
|
@@ -537,7 +537,7 @@ ${JSON.stringify(J,null,2)}`}startClaimLeaseHeartbeat($){let Z=Math.max(1000,Mat
|
|
|
537
537
|
`)[0]?.trim())}function T$($){if(!$)return;let Z={...$},Q=j6(typeof Z.title==="string"?Z.title:void 0);if(Q)Z.title=Q;else delete Z.title;return Object.keys(Z).length>0?Z:void 0}function y5($){let Z=T$($.metadata)??{},Q=$.title!==void 0?j6($.title):FY($.prompt);if(Q)Z.title=Q;return Object.keys(Z).length>0?Z:void 0}function LY($){let Z=U$($.metadata),Q={source:$.source,mode:Z?.mode??"user",sessionId:$.sessionId,...$.parentSessionId?{parentThreadId:$.parentSessionId}:{},...$.agentId?{subagent:$.agentId}:{},...Z?.version?{version:Z.version}:{},...Z?.trigger?{trigger:Z.trigger}:{}};if(k5($.sessionId))return{agent:"teammate",sessionId:$.sessionId,taskType:"team",origin:Q};if(p7($.sessionId))return{agent:"subagent",sessionId:$.sessionId,taskType:"subagent_task",origin:Q};return{agent:"lead",sessionId:$.sessionId,origin:Q}}function DY($){return{version:1,updated_at:$.updatedAt,agent:$.context.agent,sessionId:$.context.sessionId,...$.context.taskType?{taskType:$.context.taskType}:{},origin:$.context.origin,messages:l7($.messages),...$.systemPrompt?{system_prompt:$.systemPrompt}:{}}}function pD($,Z,Q){Uh(Fh($),{recursive:!0}),Hh($,`${JSON.stringify(DY({updatedAt:Z,context:Q,messages:[]}),null,2)}
|
|
538
538
|
`,"utf8")}function lD($,Z){return G1.parse({version:1,session_id:$.sessionId,source:$.source,pid:$.pid,started_at:$.startedAt,ended_at:Z?.endedAt??$.endedAt??void 0,exit_code:Z?.exitCode??$.exitCode??void 0,status:Z?.status??$.status,interactive:$.interactive,provider:$.provider,model:$.model,cwd:$.cwd,workspace_root:$.workspaceRoot,team_name:$.teamName??void 0,enable_tools:$.enableTools,enable_spawn:$.enableSpawn,enable_teams:$.enableTeams,prompt:$.prompt??void 0,metadata:Z?.metadata??$.metadata??void 0,messages_path:$.messagesPath??void 0})}async function iD($,Z,Q){let J=0;while(!0){let X=await $();if(X===void 0)return{updated:!1};let W=await Z(X);if(typeof W==="object"&&W!==null&&"updated"in W&&W.updated===!1){if(J+=1,J>=Q)return W;continue}return W}}import{existsSync as Oh}from"node:fs";import{readFile as qh}from"node:fs/promises";class I5{listeners=new Set;subscribe($,Z){let Q={listener:$,sessionId:Z?.sessionId?.trim()||void 0};return this.listeners.add(Q),()=>{this.listeners.delete(Q)}}emit($){let Z=$.payload.sessionId?.trim();for(let Q of this.listeners){if(Q.sessionId&&Q.sessionId!==Z)continue;Q.listener($)}}get size(){return this.listeners.size}}async function U2($){let Z=$?.trim();if(!Z||!Oh(Z))return[];try{let Q=(await qh(Z,"utf8")).trim();if(!Q)return[];let J=JSON.parse(Q);if(Array.isArray(J))return J;if(J&&typeof J==="object"&&!Array.isArray(J)){let X=J.messages;if(Array.isArray(X))return X}return[]}catch{return[]}}function _Y($){return $?{...$}:void 0}async function aD($,Z){if(!($.hookName==="tool_call"||!!$.parent_agent_id))return;await Z.queueSpawnRequest($);let J=await Z.upsertSubagentSessionFromHook($);if(!J)return;await Z.appendSubagentHookAudit(J,$),await Z.applySubagentStatus(J,$)}function h5($){if(typeof $!=="string")return;let Z=$.trim();return Z.length>0?Z:void 0}function M1($){let Z=h5($);if(!Z)return;return Z.toLowerCase()==="unknown"?void 0:Z}function a7($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function Mh($){if(!$||typeof $!=="object"||Array.isArray($))return;return{...$}}function qY($){let Z=$??200;return Number.isFinite(Z)?Math.max(0,Math.floor(Z)):200}var zY=2000;function Eh($){if($===0)return 0;return Math.min(Math.max($*2,20),zY)}function Rh($){return $.isSubagent!==!0&&!h5($.parentSessionId)}function Ch($){let Z=$.match(/\d{13,}/g);if(!Z||Z.length===0)return 0;let Q=0;for(let J of Z){let X=Number.parseInt(J,10);if(Number.isFinite(X)&&X>Q)Q=X}return Q}function NY($){return{sessionId:$.session_id,source:$.source,pid:$.pid,startedAt:$.started_at,endedAt:$.ended_at??null,exitCode:$.exit_code??null,status:$.status,interactive:$.interactive,provider:$.provider,model:$.model,cwd:$.cwd,workspaceRoot:$.workspace_root,teamName:$.team_name,enableTools:$.enable_tools,enableSpawn:$.enable_spawn,enableTeams:$.enable_teams,isSubagent:!1,prompt:$.prompt,metadata:$.metadata,messagesPath:$.messages_path,updatedAt:$.ended_at??$.started_at}}async function Ph($){let Z=qY($);if(Z===0)return[];let Q=sD(),X=(await Nh(Q,{withFileTypes:!0}).catch(()=>[])).filter((Y)=>Y.isDirectory()).map((Y)=>({entry:Y,recency:Ch(Y.name.trim())})).sort((Y,j)=>j.recency-Y.recency||j.entry.name.localeCompare(Y.entry.name));return(await Promise.all(X.map(async({entry:Y})=>{let j=Y.name.trim();if(!j)return;let V=oD(Q,j,`${j}.json`),K=await nD(V,"utf8").catch(()=>{return});if(!K)return;let B;try{B=JSON.parse(K)}catch{return}let G=G1.safeParse(B);if(!G.success)return;return NY(G.data)}))).filter((Y)=>Boolean(Y)).sort((Y,j)=>j.startedAt.localeCompare(Y.startedAt)).slice(0,Z)}async function wh($,Z,Q){let J=qY(Z);if(J===0)return await $.listSessions(0),[];if(Q.includeSubagents)return(await $.listSessions(J)).slice(0,J);let X=Eh(J);for(;;){let W=await $.listSessions(X,{rootOnly:!0}),Y=W.filter(Rh);if(Y.length>=J||W.length<X||X>=zY)return Y.slice(0,J);X=Math.min(X*2,zY)}}function fh($){if(typeof $==="string")return $.trim();let Z=[];for(let Q of $){if(!Q||typeof Q!=="object")continue;let J=Q;if(J.type!=="text")continue;let X=J.text?.trim();if(X)Z.push(X)}return Z.join(`
|
|
539
539
|
`).trim()}function rD($){return $.replace(/\s+/g," ").trim()}function Sh($,Z){if($.length<=Z)return $;return`${$.slice(0,Math.max(0,Z-3)).trimEnd()}...`}function bh($){for(let Z of["user","assistant"])for(let Q of $){if(Q.role!==Z)continue;let J=rD(fh(Q.content));if(!J)continue;let X=Z==="user"?rD(Ah(J)):J,W=Th(X.split(`
|
|
540
|
-
`)[0]??X);return Sh(W,50)}return}function kh($){let Z=0;for(let Q of $)Z+=a7(Q.metrics?.cost)??0;return Z}function xh($){let Z,Q;for(let J=$.length-1;J>=0;J-=1){let X=$[J];if(!Z)Z=M1(X.modelInfo?.provider);if(!Q)Q=M1(X.modelInfo?.id);if(Z&&Q)break}return{provider:Z,model:Q}}function yh($){return M1($?.provider)??M1($?.provider&&typeof $.provider==="object"&&!Array.isArray($.provider)?$.provider.id:void 0)}function Ih($){return M1($?.model)??M1($?.model&&typeof $.model==="object"&&!Array.isArray($.model)?$.model.id:void 0)}function OY($,Z){let Q=Mh($.metadata),J=h5(Z?.title)??h5(Q?.title),X=a7(Z?.totalCost)??a7(Q?.totalCost),W=Q||J!==void 0||X!==void 0?{...Q??{},...J!==void 0?{title:J}:{},...X!==void 0?{totalCost:X}:{}}:void 0;return{...$,provider:M1(Z?.provider)??M1($.provider)??yh(Q)??"",model:M1(Z?.model)??M1($.model)??Ih(Q)??"",metadata:W}}function hh($){let Z=$.content;if(!Array.isArray(Z))return!1;return Z.some((Q)=>!!Q&&typeof Q==="object"&&Q.type==="tool-call")}function vh($,Z){if($.status!=="running"||$.interactive!==!0)return!1;let Q=Z.at(-1);return Q?.role==="assistant"&&!hh(Q)}async function gh($,Z){return await Promise.all(Z.map(async(Q)=>{if(Q.status!=="running"||Q.interactive!==!0)return Q;let J=await $.readSessionMessages(Q.sessionId);return vh(Q,J)?{...Q,status:"idle"}:Q}))}async function mh($,Z){return await Promise.all(Z.map(async(Q)=>{let J=OY(Q),X=Boolean(h5(J.metadata?.title)),W=Boolean(M1(J.provider)),Y=Boolean(M1(J.model)),j=a7(J.metadata?.totalCost),V=j!==void 0&&j>0;if(X&&W&&Y&&V)return J;let K=await $.readSessionMessages(Q.sessionId);if(K.length===0)return J;let B=xh(K),G=kh(K);return OY(Q,{title:X?void 0:bh(K),provider:W?void 0:B.provider,model:Y?void 0:B.model,totalCost:V||G<=0?void 0:G})}))}async function AY($,Z={}){let Q=qY(Z.limit),J=Z.includeSubagents===!0,X=await wh($,Q,{includeSubagents:J}),W=Z.includeManifestFallback===!0&&X.length<Q?await Ph(Math.min(Math.max(Q*2,100),500)):[],Y=new Map;for(let K of[...X,...W]){if(Y.has(K.sessionId))continue;Y.set(K.sessionId,K)}let j=W.length===0?X:Array.from(Y.values()).sort((K,B)=>B.startedAt.localeCompare(K.startedAt)).slice(0,Q),V=await gh($,j);if(Z.hydrate===!1)return V.map((K)=>OY(K));return await mh($,V)}async function ch($){let Z=$.trim();if(!Z)return;let Q=oD(sD(),Z,`${Z}.json`),J=await nD(Q,"utf8").catch(()=>{return});if(!J)return;try{let X=G1.safeParse(JSON.parse(J));return X.success?X.data.messages_path:void 0}catch{return}}async function uh($,Z={}){let Q=new Map;return await AY({listSessions:async(X,W)=>{let Y=await $.listSessions(X,W);Q.clear();for(let j of Y)Q.set(j.sessionId,j);return Y.map(x5)},readSessionMessages:async(X)=>{let W=Q.get(X)?.messagesPath??await ch(X);return await U2(W)}},Z)}import{captureSdkError as tq}from"@cline/shared";import{createSessionId as $g,isHubProtocolCompatible as Zg,resolveClineBuildEnv as Qg,resolveHubCommandTimeoutMs as Jg}from"@cline/shared";import Xg from"ws";import{spawn as Nv}from"node:child_process";import{closeSync as Av,mkdirSync as Tv,openSync as Mv,readFileSync as Ev,unlinkSync as Rv}from"node:fs";import{basename as Cv,dirname as Pv,join as wv}from"node:path";import{fileURLToPath as fv}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as Sv,isHubDaemonProcess as F_,resolveClineBuildEnv as L_,withResolvedClineBuildEnv as bv}from"@cline/shared";import{createHash as dh,randomBytes as J_}from"node:crypto";import{existsSync as ph}from"node:fs";import{mkdir as MY,open as tD,readFile as X_,rename as lh,rm as r7,writeFile as ih}from"node:fs/promises";import{dirname as W_,join as EY}from"node:path";import{isHubProtocolCompatible as ah}from"@cline/shared";import{resolveClineDataDir as v5,resolveClineDir as h70}from"@cline/shared/storage";var rh="CLINE_HUB_DISCOVERY_PATH",nh="CLINE_HUB_BUILD_ID",oh="CLINE_HUB_BUILD_EPOCH_MS",sh=30000,th=15000,eD=100;function eh($){return $.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function $v($){return dh("sha256").update($).digest("hex").slice(0,12)}function Zv($){if(!Number.isInteger($)||!$||$<=0)return!1;try{return process.kill($,0),!0}catch(Z){return Z instanceof Error&&"code"in Z?String(Z.code)==="EPERM":!1}}function Y_(){return J_(32).toString("hex")}function $_($){return new Promise((Z)=>setTimeout(Z,$))}function Qv($){return`${$}.lock`}async function Jv($){try{let Z=JSON.parse(await X_(EY($,"owner.json"),"utf8"));if(typeof Z.pid!=="number"||typeof Z.acquiredAt!=="string")return;return{pid:Z.pid,acquiredAt:Z.acquiredAt}}catch{return}}async function TY($){await r7($,{recursive:!0,force:!0}).catch(()=>{return})}function $$(){let $=process.env[nh]?.trim();if($)return $;return"sdk-v1-
|
|
540
|
+
`)[0]??X);return Sh(W,50)}return}function kh($){let Z=0;for(let Q of $)Z+=a7(Q.metrics?.cost)??0;return Z}function xh($){let Z,Q;for(let J=$.length-1;J>=0;J-=1){let X=$[J];if(!Z)Z=M1(X.modelInfo?.provider);if(!Q)Q=M1(X.modelInfo?.id);if(Z&&Q)break}return{provider:Z,model:Q}}function yh($){return M1($?.provider)??M1($?.provider&&typeof $.provider==="object"&&!Array.isArray($.provider)?$.provider.id:void 0)}function Ih($){return M1($?.model)??M1($?.model&&typeof $.model==="object"&&!Array.isArray($.model)?$.model.id:void 0)}function OY($,Z){let Q=Mh($.metadata),J=h5(Z?.title)??h5(Q?.title),X=a7(Z?.totalCost)??a7(Q?.totalCost),W=Q||J!==void 0||X!==void 0?{...Q??{},...J!==void 0?{title:J}:{},...X!==void 0?{totalCost:X}:{}}:void 0;return{...$,provider:M1(Z?.provider)??M1($.provider)??yh(Q)??"",model:M1(Z?.model)??M1($.model)??Ih(Q)??"",metadata:W}}function hh($){let Z=$.content;if(!Array.isArray(Z))return!1;return Z.some((Q)=>!!Q&&typeof Q==="object"&&Q.type==="tool-call")}function vh($,Z){if($.status!=="running"||$.interactive!==!0)return!1;let Q=Z.at(-1);return Q?.role==="assistant"&&!hh(Q)}async function gh($,Z){return await Promise.all(Z.map(async(Q)=>{if(Q.status!=="running"||Q.interactive!==!0)return Q;let J=await $.readSessionMessages(Q.sessionId);return vh(Q,J)?{...Q,status:"idle"}:Q}))}async function mh($,Z){return await Promise.all(Z.map(async(Q)=>{let J=OY(Q),X=Boolean(h5(J.metadata?.title)),W=Boolean(M1(J.provider)),Y=Boolean(M1(J.model)),j=a7(J.metadata?.totalCost),V=j!==void 0&&j>0;if(X&&W&&Y&&V)return J;let K=await $.readSessionMessages(Q.sessionId);if(K.length===0)return J;let B=xh(K),G=kh(K);return OY(Q,{title:X?void 0:bh(K),provider:W?void 0:B.provider,model:Y?void 0:B.model,totalCost:V||G<=0?void 0:G})}))}async function AY($,Z={}){let Q=qY(Z.limit),J=Z.includeSubagents===!0,X=await wh($,Q,{includeSubagents:J}),W=Z.includeManifestFallback===!0&&X.length<Q?await Ph(Math.min(Math.max(Q*2,100),500)):[],Y=new Map;for(let K of[...X,...W]){if(Y.has(K.sessionId))continue;Y.set(K.sessionId,K)}let j=W.length===0?X:Array.from(Y.values()).sort((K,B)=>B.startedAt.localeCompare(K.startedAt)).slice(0,Q),V=await gh($,j);if(Z.hydrate===!1)return V.map((K)=>OY(K));return await mh($,V)}async function ch($){let Z=$.trim();if(!Z)return;let Q=oD(sD(),Z,`${Z}.json`),J=await nD(Q,"utf8").catch(()=>{return});if(!J)return;try{let X=G1.safeParse(JSON.parse(J));return X.success?X.data.messages_path:void 0}catch{return}}async function uh($,Z={}){let Q=new Map;return await AY({listSessions:async(X,W)=>{let Y=await $.listSessions(X,W);Q.clear();for(let j of Y)Q.set(j.sessionId,j);return Y.map(x5)},readSessionMessages:async(X)=>{let W=Q.get(X)?.messagesPath??await ch(X);return await U2(W)}},Z)}import{captureSdkError as tq}from"@cline/shared";import{createSessionId as $g,isHubProtocolCompatible as Zg,resolveClineBuildEnv as Qg,resolveHubCommandTimeoutMs as Jg}from"@cline/shared";import Xg from"ws";import{spawn as Nv}from"node:child_process";import{closeSync as Av,mkdirSync as Tv,openSync as Mv,readFileSync as Ev,unlinkSync as Rv}from"node:fs";import{basename as Cv,dirname as Pv,join as wv}from"node:path";import{fileURLToPath as fv}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as Sv,isHubDaemonProcess as F_,resolveClineBuildEnv as L_,withResolvedClineBuildEnv as bv}from"@cline/shared";import{createHash as dh,randomBytes as J_}from"node:crypto";import{existsSync as ph}from"node:fs";import{mkdir as MY,open as tD,readFile as X_,rename as lh,rm as r7,writeFile as ih}from"node:fs/promises";import{dirname as W_,join as EY}from"node:path";import{isHubProtocolCompatible as ah}from"@cline/shared";import{resolveClineDataDir as v5,resolveClineDir as h70}from"@cline/shared/storage";var rh="CLINE_HUB_DISCOVERY_PATH",nh="CLINE_HUB_BUILD_ID",oh="CLINE_HUB_BUILD_EPOCH_MS",sh=30000,th=15000,eD=100;function eh($){return $.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function $v($){return dh("sha256").update($).digest("hex").slice(0,12)}function Zv($){if(!Number.isInteger($)||!$||$<=0)return!1;try{return process.kill($,0),!0}catch(Z){return Z instanceof Error&&"code"in Z?String(Z.code)==="EPERM":!1}}function Y_(){return J_(32).toString("hex")}function $_($){return new Promise((Z)=>setTimeout(Z,$))}function Qv($){return`${$}.lock`}async function Jv($){try{let Z=JSON.parse(await X_(EY($,"owner.json"),"utf8"));if(typeof Z.pid!=="number"||typeof Z.acquiredAt!=="string")return;return{pid:Z.pid,acquiredAt:Z.acquiredAt}}catch{return}}async function TY($){await r7($,{recursive:!0,force:!0}).catch(()=>{return})}function $$(){let $=process.env[nh]?.trim();if($)return $;return"sdk-v1-7a06925efdddafd91fa32d8c54bdc4f26c316a2e7a7db1f707c69264416f8117".trim()||`source-${String(o2.version)}`}function RY(){let $=Number(process.env[oh]);if(Number.isFinite($)&&$>0)return $;return Number.isFinite(1790064761572)?1790064761572:void 0}function V6($,Z=$$()){let Q=ah($);if(!Q.compatible)return Q;let J=$.buildId?.trim();if(!J)return{compatible:!1,reason:"missing_build"};if(J!==Z)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function Z_($){return typeof $==="number"&&Number.isFinite($)&&$>0?$:void 0}function Q_($){let Z=$?.trim().split(/[-+]/,1)[0];if(!Z)return;let Q=Z.split(".").map((J)=>Number(J));if(Q.length===0||Q.some((J)=>!Number.isInteger(J)||J<0))return;return Q}function Xv($,Z){for(let Q=0;Q<Math.max($.length,Z.length);Q++){let J=$[Q]??0,X=Z[Q]??0;if(J!==X)return J<X?-1:1}return 0}function g5($,Z){let Q=$.buildId?.trim(),J=Z.buildId?.trim();if(Q&&J&&Q===J)return 0;let X=Z_($.buildEpochMs),W=Z_(Z.buildEpochMs);if(X!==void 0&&W!==void 0&&X!==W)return X<W?-1:1;let Y=Q_($.coreVersion),j=Q_(Z.coreVersion);if(Y&&j){let V=Xv(Y,j);if(V!==0)return V}if(Q&&J&&Q!==J)return Q<J?-1:1;return 0}function m5(){return{buildId:$$(),buildEpochMs:RY(),coreVersion:String(o2.version)}}function f8($,Z){let Q=Z?.self??m5(),J=V6($,Q.buildId??"");if(J.compatible)return!0;if(J.reason!=="build_mismatch"&&J.reason!=="missing_build")return!1;return g5(Q,$)<=0}function K6($=process.argv[1]?.trim()||process.cwd()){let Z=`hub-${$v($)}`,Q=process.env[rh]?.trim()||EY(v5(),"locks","hub","owners",`${eh(Z)}.json`);return{ownerId:Z,discoveryPath:Q}}function g70($=`hub-${Date.now().toString(36)}`){return K6($)}async function m0($){try{let Z=JSON.parse(await X_($,"utf8"));if(typeof Z.hubId!=="string"||typeof Z.protocolVersion!=="string"||typeof Z.authToken!=="string"||typeof Z.host!=="string"||typeof Z.port!=="number"||typeof Z.url!=="string"||typeof Z.startedAt!=="string"||typeof Z.updatedAt!=="string")return;return{hubId:Z.hubId,protocolVersion:Z.protocolVersion,minClientProtocolVersion:typeof Z.minClientProtocolVersion==="string"?Z.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof Z.maxClientProtocolVersion==="string"?Z.maxClientProtocolVersion:void 0,capabilities:Array.isArray(Z.capabilities)?Z.capabilities.filter((Q)=>typeof Q==="string"):void 0,coreVersion:typeof Z.coreVersion==="string"?Z.coreVersion:void 0,buildId:typeof Z.buildId==="string"?Z.buildId:void 0,buildEpochMs:typeof Z.buildEpochMs==="number"?Z.buildEpochMs:void 0,authToken:Z.authToken,host:Z.host,port:Z.port,url:Z.url,pid:typeof Z.pid==="number"?Z.pid:void 0,startedAt:Z.startedAt,updatedAt:Z.updatedAt}}catch{return}}async function n7($,Z){await CY($,async()=>{let Q=W_($);await MY(Q,{recursive:!0});let J=`${$}.${process.pid}.${J_(6).toString("hex")}.tmp`,X;try{X=await tD(J,"wx",384),await X.writeFile(`${JSON.stringify(Z,null,2)}
|
|
541
541
|
`,{encoding:"utf8"}),await X.sync(),await X.close(),X=void 0,await lh(J,$);let W;try{W=await tD(Q,"r"),await W.sync()}catch{}finally{await W?.close().catch(()=>{return})}}catch(W){throw await X?.close().catch(()=>{return}),await r7(J,{force:!0}).catch(()=>{return}),W}})}async function M$($){await CY($,async()=>{await r7($,{force:!0}).catch(()=>{return})})}async function j_($,Z){return await CY($,async()=>{if((await m0($))?.hubId!==Z)return!1;return await r7($,{force:!0}),!0})}async function V_($,Z,Q){let J=Qv($);await MY(W_(J),{recursive:!0});let X=Date.now()+th;while(!0){try{await MY(J,{recursive:!1})}catch(W){if((W instanceof Error&&"code"in W?String(W.code):"")!=="EEXIST")throw W;let j=await Jv(J);if(!j){if(Date.now()>=X){await TY(J);continue}await $_(eD);continue}let V=Date.now()-Date.parse(j.acquiredAt);if(!Zv(j.pid)||V>sh){await TY(J);continue}if(Date.now()>=X)throw Error(`Timed out waiting for hub ${Z} lock ${J}`);await $_(eD);continue}try{return await ih(EY(J,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
542
542
|
`,"utf8"),await Q()}finally{await TY(J)}}}function CY($,Z){return V_(`${$}.mutation`,"discovery mutation",Z)}function o7($,Z){return V_($,"startup",Z)}async function E$($,Z){try{let Q=await fetch(Z?.authToken?Wv($):K_($),{headers:Z?.authToken?{authorization:`Bearer ${Z.authToken}`}:void 0});if(!Q.ok)return;let J=await Q.json();if(typeof J.protocolVersion!=="string"||typeof J.host!=="string"||typeof J.port!=="number"||typeof J.url!=="string")return;return{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((X)=>typeof X==="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,host:J.host,port:J.port,url:J.url,hubId:typeof J.hubId==="string"?J.hubId:void 0,authToken:typeof J.authToken==="string"?J.authToken:void 0,pid:typeof J.pid==="number"?J.pid:void 0,startedAt:typeof J.startedAt==="string"?J.startedAt:void 0,updatedAt:typeof J.updatedAt==="string"?J.updatedAt:void 0}}catch{return}}function R$($,Z,Q="/hub"){return new URL(`ws://${$}:${Z}${Q}`).toString()}function K_($){let Z=new URL($);return Z.protocol=Z.protocol==="wss:"?"https:":"http:",Z.pathname="/health",Z.search="",Z.toString()}function Wv($){let Z=new URL(K_($));return Z.pathname="/status",Z.toString()}function m70($){return ph($)}import{CLINE_HUB_DEV_PORT as Yv,CLINE_HUB_PORT as jv,resolveClineBuildEnv as Vv}from"@cline/shared";var Kv="CLINE_HUB_HOST",Bv="CLINE_HUB_PORT",Gv="CLINE_HUB_PATHNAME",Uv="127.0.0.1",Hv=jv,Fv="/hub";function B_($){return Vv($)==="development"?Yv:Hv}function Lv($={}){return($.env??process.env)[Kv]?.trim()||Uv}function s7($={}){let Q=($.env??process.env)[Bv]?.trim();if(!Q)return B_($);let J=Number.parseInt(Q,10);if(!Number.isInteger(J)||J<1||J>65535)return B_($);return J}function Dv($={}){return($.env??process.env)[Gv]?.trim()||Fv}function B6($={},Z={}){return{host:$.host??Lv(Z),port:$.port??s7(Z),pathname:$.pathname??Dv(Z)}}import{join as _v}from"node:path";var zv="shared:cline",Ov="CLINE_HUB_DISCOVERY_PATH",qv="hub-production";function a70($){let Z=K2($.trim());return K6(`workspace:${Z||$.trim()}`)}function m1($=zv){return K6(`${$}@${$$()}`)}function Z$(){return{ownerId:qv,discoveryPath:process.env[Ov]?.trim()||_v(v5(),"locks","hub","production.json")}}var kv=8000,xv=200,G_=3000,yv=100,Iv=[100,250,500,1000,2000],hv="--cline-hub-daemon",vv=3,gv=60000,fY=new Map,X30={resetRetireAttempts(){fY.clear()}};function mv($,Z=Date.now()){let Q=fY.get($);if(!Q||Z-Q.windowStartedAt>gv)return fY.set($,{count:1,windowStartedAt:Z}),!0;return Q.count+=1,Q.count<=vv}function cv($){return[...$.host?["--host",$.host]:[],...typeof $.port==="number"?["--port",String($.port)]:[],...$.pathname?["--pathname",$.pathname]:[]]}function uv(){try{let $=wv(v5(),"logs","hub-daemon.log");return Tv(Pv($),{recursive:!0}),{fd:Mv($,"a"),logPath:$}}catch{return}}function D_(){return L_()==="production"?Z$():m1()}function c5($){return f8($)}function dv($){try{let Z=JSON.parse(Ev(`${$}.superseded`,"utf8"));return{url:typeof Z.url==="string"?Z.url:void 0,authToken:typeof Z.authToken==="string"?Z.authToken:void 0,pid:typeof Z.pid==="number"?Z.pid:void 0}}catch{return}}function PY($){try{Rv(`${$}.superseded`)}catch{}}function U_($,Z,Q){if(!Z||Z.url!==Q)return $;return{...$,authToken:$.authToken??Z.authToken,pid:$.pid??Z.pid}}async function S8($,Z){try{return await E$($,{authToken:Z})}catch{return}}async function H_($,Z){let Q=Date.now()+Z;while(Date.now()<Q){if(!(await S8($))?.url)return!0;await new Promise((X)=>setTimeout(X,yv))}return!1}async function b8($,Z){if(!mv($.url))return!1;await G6($.url,$.authToken,"retired by newer install").catch(()=>!1),await d5($.url,$.authToken).catch(()=>!1);let Q=await H_($.url,G_);if(!Q&&$.pid&&pv($.pid)){try{process.kill($.pid,"SIGTERM")}catch{}Q=await H_($.url,G_)}if(Q)await M$(Z).catch(()=>{return});return Q}function pv($){try{return process.kill($,0),!0}catch(Z){return Z?.code==="EPERM"}}async function SY($){try{return(await x8($.url,$.authToken)).activeSessionCount>0}catch{return!1}}async function wY($,Z){if(c5($))return"reusable";let Q=await G6($.url,$.authToken,"retired by newer install").catch(()=>!1);if(await SY($)){if(Q)await G6($.url,$.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let J=await b8($,Z);if(!J&&Q)await G6($.url,$.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return J?"retired":"failed"}async function lv($){if(L_()!=="production")return;let Z=m1();if(Z.discoveryPath===$.discoveryPath)return;let Q=await m0(Z.discoveryPath);if(Q?.url)await b8(Q,Z.discoveryPath);else await M$(Z.discoveryPath).catch(()=>{return})}function iv(){let $=import.meta.url.endsWith(".ts")?"ts":"js";return fv(new URL(`./entry.${$}`,import.meta.url))}function av($,Z){let Q=iv(),J=process.execPath?.trim();if(!J)throw Error("unable to resolve runtime executable for hub daemon");let X=Cv(J).toLowerCase().includes("bun"),W=Q.startsWith("/$bunfs/"),Y=X&&Q.toLowerCase().endsWith(".ts"),j=W?[hv]:[...Y?["--conditions=development"]:[],Q];return{launcher:J,args:[...j,"--cwd",$,...cv(Z),...Z.manageConnectors===!1?["--no-connectors"]:[]],cwd:$,env:{...bv(process.env),CLINE_NO_INTERACTIVE:"1",[Sv]:"1"}}}function rv($){if(!$||typeof $!=="object")return!1;if(("code"in $?$.code:void 0)==="ETXTBSY")return!0;let Q="message"in $?$.message:void 0;return typeof Q==="string"&&Q.includes("ETXTBSY")}function nv($,Z={}){if(F_())return;let Q=av($,Z),J=uv();try{Nv(Q.launcher,Q.args,{detached:!0,stdio:J?["ignore",J.fd,J.fd]:"ignore",env:Q.env,cwd:Q.cwd,windowsHide:!0}).unref()}finally{if(J)Av(J.fd)}}async function ov($,Z={}){for(let Q=0;;Q++)try{nv($,Z);return}catch(J){let X=Iv[Q];if(!rv(J)||X===void 0)throw J;await new Promise((W)=>setTimeout(W,X))}}function __($,Z={}){if(F_())return;u5($,Z).catch(()=>{})}async function sv($,Z,Q={}){let J=Q.host!==void 0||Q.port!==void 0||Q.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),X=B6(Q),W=R$(X.host,X.port,X.pathname),Y=(F)=>{if(!J)k8(F.url,F.authToken);return F};await lv($).catch(()=>{return});let j=await m0($.discoveryPath),V=j?.url?void 0:dv($.discoveryPath),K=!1;if(j?.url){let F=j.authToken;if(!F)K=!0,await b8(j,$.discoveryPath);else{let L=await S8(j.url,F);if(L?.url&&c5(L)&&await E1(L.url,{authToken:F}))return PY($.discoveryPath),Y({url:L.url,authToken:F});if(L?.url){if(await wY({...L,authToken:F},$.discoveryPath)==="deferred_busy"&&await E1(L.url,{authToken:F}))return Y({url:L.url,authToken:F})}else await M$($.discoveryPath).catch(()=>{return})}}let B=await S8(W);if(B?.url){let F=U_(B,j??V,W);if(c5(B)){let D=[B.authToken,j?.authToken,V?.authToken].filter((z)=>typeof z==="string"&&z.trim().length>0);for(let z of D){if(!await E1(B.url,{authToken:z}))continue;let O={hubId:B.hubId??`repaired-${B.port}`,protocolVersion:B.protocolVersion,minClientProtocolVersion:B.minClientProtocolVersion,maxClientProtocolVersion:B.maxClientProtocolVersion,capabilities:B.capabilities,coreVersion:B.coreVersion,buildId:B.buildId,authToken:z,host:B.host,port:B.port,url:B.url,pid:B.pid??j?.pid??V?.pid,startedAt:B.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await n7($.discoveryPath,O)}catch{}return PY($.discoveryPath),Y({url:B.url,authToken:z})}throw Error(`A compatible Cline Hub is already running at ${W}, but its discovery record is missing or unreadable and no usable auth token is available. Run 'cline doctor fix' to repair local hub discovery.${K?" 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 L=await wY(F,$.discoveryPath);if(L==="deferred_busy"){for(let D of[F.authToken,j?.authToken].filter((_)=>typeof _==="string"&&_.trim().length>0))if(await E1(B.url,{authToken:D}))return Y({url:B.url,authToken:D});if(Q.allowPortFallback!==!0&&X.port!==0)throw Error(`An older Cline Hub is running at ${W} 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(L==="failed"&&Q.allowPortFallback!==!0&&X.port!==0)throw Error(`An incompatible Cline Hub is already running at ${W} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}let U=Q.allowPortFallback===!0&&X.port!==0?{...X,port:0}:X;await ov(Z,{...U,manageConnectors:Q.manageConnectors});let H=Date.now()+kv;while(Date.now()<H){let F=await m0($.discoveryPath);if(F?.url&&F.authToken){let D=await S8(F.url,F.authToken);if(D?.url&&c5(D)&&await E1(D.url,{authToken:F.authToken}))return PY($.discoveryPath),Y({url:D.url,authToken:F.authToken})}let L=await S8(W);if(L?.url&&!c5(L)){let D=U_(L,F??V,W),_=await wY(D,$.discoveryPath);if(_==="deferred_busy"&&F?.authToken&&await E1(L.url,{authToken:F.authToken}))return Y({url:L.url,authToken:F.authToken});if(_==="failed"&&Q.allowPortFallback!==!0&&X.port!==0)throw Error(`An incompatible Cline Hub is still running at ${W} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}await new Promise((D)=>setTimeout(D,xv))}throw Error("Timed out waiting for detached hub startup.")}async function u5($,Z={}){let Q=D_();return await o7(Q.discoveryPath,async()=>sv(Q,$,Z))}var tv=5000,ev=500;async function W30($={}){let Z=D_(),Q=$.workspaceRoot??process.cwd(),J=await m0(Z.discoveryPath),X=J?.url?await S8(J.url,J.authToken):void 0;if(!X?.url)return{outcome:"started",...await u5(Q)};let W={...X,authToken:X.authToken??J?.authToken,pid:X.pid??J?.pid};if(V6(X).compatible)return{outcome:"already_current",url:X.url,authToken:W.authToken};if(g5(m5(),X)<=0)return{outcome:"hub_not_older",url:X.url,authToken:W.authToken};if(!await G6(W.url,W.authToken,$.reason??"hub upgrade requested").catch(()=>!1))throw Error(`The running Cline Hub at ${W.url} did not accept a drain request, so it was not replaced. It is replaced automatically once idle when a Cline client next starts, or run 'cline doctor fix' to stop it now.`);let j=async()=>{await G6(W.url,W.authToken,"hub upgrade aborted",{off:!0}).catch(()=>!1)},V=Date.now()+($.waitForIdleMs??tv),K;for(;;){try{if(K=(await x8(W.url,W.authToken)).activeSessionCount,K===0)break}catch{}if(Date.now()>=V)break;await new Promise((U)=>setTimeout(U,ev))}if(K!==0&&$.force!==!0)return await j(),{outcome:"still_busy",url:W.url,authToken:W.authToken,...K!==void 0?{activeSessionCount:K}:{}};if(!await b8(W,Z.discoveryPath))throw await j(),Error(`The running Cline Hub at ${W.url} could not be stopped. Run 'cline doctor fix' to stop stale hub daemons, then try again.`);return{outcome:"replaced",...await u5(Q),activeSessionCount:K??0}}function IY(){return Qg()==="production"?Z$():m1()}function Wg(){let $=globalThis.WebSocket;if(!$)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return $}function N_($){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((Z)=>Buffer.from(Z))).toString();if($&&typeof $==="object"&&"data"in $&&typeof $.data<"u")return N_($.data);return String($)}function Yg($){if(typeof $==="string")return $;if($ instanceof Uint8Array)return Buffer.from($).toString("utf8");if($ instanceof ArrayBuffer)return Buffer.from($).toString("utf8");return""}function z_($){let Z=$,Q=Yg(Z.reason);return new i0("hub_connection_closed",Z.code||Q?`Hub connection closed (code=${Z.code??0}${Q?`, reason=${Q}`:""})`:kY,{closeCode:Z.code,closeReason:Q||void 0})}function O_($,Z){if($ instanceof i0)return $;if($ instanceof Error)return new i0("hub_connect_failed",$.message);if($&&typeof $==="object"&&"error"in $&&$.error instanceof Error)return new i0("hub_connect_failed",$.error.message);let Q=$&&typeof $==="object"&&"message"in $&&typeof $.message==="string"?$.message.trim():"";if(Q)return new i0("hub_connect_failed",Q);let J=$&&typeof $==="object"&&"type"in $&&typeof $.type==="string"?$.type.trim():"";return new i0("hub_connect_failed",J?`Failed to connect to hub at ${Z.toString()} (${J} event before socket open).`:`Failed to connect to hub at ${Z.toString()}.`)}var bY="*",t7=8000,jg="cline-hub-auth.",A_=new Map,T_=new Set,Vg=3000,Kg=3000,Bg=100,kY="Hub connection closed",Gg=250,Ug=5000,q_=0.5;class i0 extends Error{code;details;constructor($,Z,Q){super(Z);this.code=$;this.details=Q;this.name="HubTransportError"}}function Hg($){return $ instanceof i0}class e7 extends Error{command;code;constructor($,Z,Q){super(Q);this.command=$;this.code=Z;this.name="HubCommandError"}}function M_($,Z){return $ instanceof e7&&$.code==="hub_command_timeout"&&(Z===void 0||$.command===Z)}function hY($,Z={}){let Q=$.searchParams.get("authToken")?.trim();if($.searchParams.delete("authToken"),Q)return Q;if(Z.skipRegistry)return;let J=vY($.toString());return J?A_.get(J):void 0}function Fg($){try{let Q=new URL($).hostname.toLowerCase().replace(/^\[|\]$/g,"");return Q==="localhost"||Q==="127.0.0.1"||Q==="::1"}catch{return!1}}function vY($){if(!Fg($))return;let Z=new URL(y8($));return Z.search="",Z.hash="",Z.toString()}function xY($){let Z=vY($);return!!Z&&T_.has(Z)}function k8($,Z){let Q=vY($);if(Q){if(T_.add(Q),Z?.trim())A_.set(Q,Z)}return $}class C${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 i0("hub_connection_closed",kY);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((Z)=>({...Z})),!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),Z=this.options.authToken?.trim()||hY($,{skipRegistry:Boolean(this.options.resolveConnectionHeaders)});if($.hash="",Z&&this.options.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");let Q=++this.connectGeneration,J=this.openSocket($,Z,Q),X;this.connectPromise=J.then(async(Y)=>{if(X=Y,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,workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),Q!==this.connectGeneration||this.closedByClient){try{Y.close()}catch{}throw this.lastCloseError}this.registered=!0;for(let j of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(j));this.reconnectAttempt=0});let W=this.connectPromise;try{await W}catch(Y){if(this.connectPromise===W)this.connectPromise=void 0;if(X&&this.socket===X){this.lastCloseError=O_(Y,$),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{X.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw Y}}async openSocket($,Z,Q){let J=this.options.resolveConnectionHeaders,X;if(J){let V;try{X=await Promise.race([Promise.resolve().then(()=>J()),new Promise((K,B)=>{V=setTimeout(()=>{B(new i0("hub_connect_timeout",`Timed out resolving hub connection headers after ${t7}ms`))},t7)})])}catch(K){let B=K instanceof i0?K:new i0("hub_connect_failed",K instanceof Error?K.message:String(K));if(Q===this.connectGeneration)this.lastCloseError=B;throw B}finally{clearTimeout(V)}}if(Q!==this.connectGeneration||this.closedByClient)throw this.lastCloseError;if(X&&Object.keys(X).some((V)=>V.toLowerCase()==="sec-websocket-protocol")){let V=new i0("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(Q===this.connectGeneration)this.lastCloseError=V;throw V}let W=X?new Xg($.toString(),{headers:{...X}}):new(Wg())($.toString(),Z?[`${jg}${Z}`]:void 0);this.socket=W;let Y=!1,j=new Promise((V,K)=>{let B=!1,G=setTimeout(()=>{if(B)return;B=!0,Y=!0;let U=new i0("hub_connect_timeout",`Timed out connecting to hub after ${t7}ms`);if(this.socket===W)this.lastCloseError=U,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{W.close()}catch{}K(U)},t7);W.addEventListener("open",()=>{if(B)return;B=!0,clearTimeout(G),V()}),W.addEventListener("error",(U)=>{if(B)return;B=!0,clearTimeout(G);let H=O_(U,$);if(this.socket===W)this.lastCloseError=H,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;K(H)}),W.addEventListener("close",(U)=>{if(B)return;B=!0,clearTimeout(G);let H=Y?this.lastCloseError:z_(U);if(this.socket===W){if(!Y)this.lastCloseError=H,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}K(H)})});return W.addEventListener("message",(V)=>{this.handleFrame(JSON.parse(N_(V)))}),W.addEventListener("close",(V)=>{if(this.socket!==W)return;if(!Y)this.lastCloseError=z_(V),this.sawSocketClose=!0;this.registered=!1;for(let K of this.pendingReplies.values())K.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await j,W}subscribe($,Z){let Q=Z?.sessionId?.trim()||void 0,J={listener:$,sessionId:Q};return this.listeners.add(J),this.adjustSubscriptionCount(Q,1),()=>{if(!this.listeners.delete(J))return;this.adjustSubscriptionCount(Q,-1)}}async command($,Z,Q,J){let X=0,W=$!=="client.register"&&$!=="client.unregister";while(!0)try{return await this.commandOnce($,Z,Q,J)}catch(Y){if(!W||X>=1||!await this.recoverLocalHubTransport(Y))throw Y;X+=1}}async commandOnce($,Z,Q,J,X=!0){if(X)await this.connect();J?.beforeDispatch?.();let W=$g("hubreq_"),Y=Jg($,J?.timeoutMs),j=new Promise((K,B)=>{let G=Y===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(W))return;B(new e7($,"hub_command_timeout",`Hub command ${$} timed out after ${Y}ms (hub=${this.currentUrl}, requestId=${W}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},Y);this.pendingReplies.set(W,{resolve:(U)=>{if(G)clearTimeout(G);K(U)},reject:(U)=>{if(G)clearTimeout(G);B(U)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:$,requestId:W,clientId:this.clientId,sessionId:Q,timeoutMs:Y,payload:Z}})}catch(K){throw this.pendingReplies.delete(W),K}let V=await j;if(!V.ok){if(V.error?.code===_4){let K=Q??(typeof Z?.sessionId==="string"?Z.sessionId:void 0);throw new P2(K,V.error.message)}throw new e7($,V.error?.code,V.error?.message??`Hub command ${$} failed`)}return V}async recoverLocalHubTransport($){if(!xY(this.currentUrl)||!Hg($))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let Z=await p5({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!Z)return!1;return this.currentUrl=Z,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(Gg*2**this.reconnectAttempt,Ug),Z=Math.round($*(1-q_)+Math.random()*$*q_);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},Z)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!xY(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let $=await p5({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 i0("hub_connection_closed",kY);for(let Z of this.pendingReplies.values())Z.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 i0("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify($))}sendSubscriptionFrame($,Z){let Q=$==="stream.subscribe"?this.lastEventSequenceByKey.get(this.subscriptionKeyForSessionId(Z)):void 0;this.sendFrame({kind:$,clientId:this.clientId,...Z?{sessionId:Z}:{},...Q!==void 0?{sinceSequence:Q}:{}})}adjustSubscriptionCount($,Z){let Q=this.subscriptionKeyForSessionId($),J=(this.subscriptionCounts.get(Q)??0)+Z;if(J<=0){if(this.subscriptionCounts.delete(Q),!this.hasActiveSubscriptions())this.clearReconnectTimer();if(Z<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",$);return}if(this.subscriptionCounts.set(Q,J),Z>0&&J===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",$)}subscriptionKeyForSessionId($){return $??bY}subscriptionSessionIdFromKey($){return $===bY?void 0:$}handleFrame($){switch($.kind){case"reply":{let Z=$.envelope.requestId;if(!Z)return;let Q=this.pendingReplies.get(Z);if(!Q)return;this.pendingReplies.delete(Z),Q.resolve($.envelope);return}case"event":{let Z=$.envelope.sequence;if(typeof Z==="number"){let Q=$.envelope.sessionId?.trim();for(let J of[bY,Q]){if(!J||!this.subscriptionCounts.has(J))continue;let X=this.lastEventSequenceByKey.get(J)??0;if(Z>X)this.lastEventSequenceByKey.set(J,Z)}}for(let Q of this.listeners){if(Q.sessionId&&Q.sessionId!==$.envelope.sessionId?.trim())continue;Q.listener($.envelope)}return}case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function y8($){let Z=new URL($);if(Z.protocol==="http:")Z.protocol="ws:";else if(Z.protocol==="https:")Z.protocol="wss:";return Z.toString()}async function E1($,Z){let Q=new C$({url:$,authToken:Z?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:Z?.workspaceRoot,cwd:Z?.cwd});try{return await Q.connect(),!0}catch{return!1}finally{Q.close()}}async function yY($,Z){let Q=y8($),J=await E$(Q,{authToken:Z?.authToken});if(!J)return{status:"unreachable",url:Q};if(Z?.requireCurrentBuild){let X=$$(),W=V6(J,X);if(!W.compatible&&!f8(J))return{status:W.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:Q}}else if(!Zg(J).compatible)return{status:"protocol_mismatch",url:Q};if(Z?.verifyConnection===!0&&!await E1(Q,{workspaceRoot:Z.workspaceRoot,cwd:Z.cwd,authToken:Z.authToken}))return{status:"unreachable",url:Q};return{status:"compatible",url:Q}}async function Lg($){let Z=Date.now()+Kg;while(Date.now()<Z){if(!(await E$($).catch(()=>{return}))?.url)return!0;await new Promise((J)=>setTimeout(J,Bg))}return!1}function Dg($,Z){try{return y8($)===y8(Z)}catch{return!1}}function E_($){let Z=$&&typeof $==="object"&&Array.isArray($.sessions)?$.sessions:[],Q=0,J=new Set;for(let X of Z){if(!X||typeof X!=="object")continue;let W=X.participants;if(!Array.isArray(W)||W.length===0)continue;Q+=1;for(let Y of W){let j=Y&&typeof Y==="object"?Y.clientId:void 0;if(typeof j==="string"&&j.trim())J.add(j)}}return{activeSessionCount:Q,participantClientCount:J.size}}function H30($){return E_($).activeSessionCount>0}async function x8($,Z,Q){let J=new C$({url:$,authToken:Z,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:Q?.workspaceRoot,cwd:Q?.cwd});try{let X=await J.command("session.list",{limit:500},void 0,{timeoutMs:Vg});return E_(X.payload)}finally{await J.dispose().catch(()=>{return})}}async function R_($,Z,Q){try{return(await x8($,Z,Q)).activeSessionCount===0}catch{return!1}}async function _g($,Z){let Q=`${$.discoveryPath}.superseded`,J=await m0(Q);if(!J?.url||!J.authToken)return;let X=await yY(J.url,{authToken:J.authToken});if(X.status!=="compatible")return;if(await R_(X.url,J.authToken,Z))return;return k8(X.url,J.authToken)}async function gY($={}){if($.endpoint?.trim()){let X=await yY($.endpoint);return X.status==="compatible"?X.url:void 0}let Z=IY(),Q=await m0(Z.discoveryPath);if(!Q?.url)return await _g(Z,$);let J=await yY(Q.url,{authToken:Q.authToken,requireCurrentBuild:!0});if(J.status==="compatible")return k8(J.url,Q.authToken);if(J.status==="protocol_mismatch")await M$(Z.discoveryPath).catch(()=>{return});return}async function p5($={}){let Z=await gY($);if(Z&&await E1(Z,{workspaceRoot:$.workspaceRoot,cwd:$.cwd}))return Z;if($.endpoint?.trim())return;try{return(await u5($.workspaceRoot??process.cwd())).url}catch{return}}async function G6($,Z,Q,J){let X=new URL($),W=Z?.trim()||hY(X);if(X.protocol==="ws:")X.protocol="http:";else if(X.protocol==="wss:")X.protocol="https:";if(X.pathname="/drain",X.hash="",Q)X.searchParams.set("reason",Q);if(J?.off)X.searchParams.set("off","1");return(await fetch(X,{method:"POST",headers:W?{authorization:`Bearer ${W}`}:void 0})).ok}async function d5($,Z){let Q=new URL($),J=Z?.trim()||hY(Q);if(Q.protocol==="ws:")Q.protocol="http:";else if(Q.protocol==="wss:")Q.protocol="https:";return Q.pathname="/shutdown",Q.hash="",(await fetch(Q,{method:"POST",headers:J?{authorization:`Bearer ${J}`}:void 0})).ok}async function zg($=IY()){let Z=await m0($.discoveryPath);if(!Z?.url)return!1;try{if(await d5(Z.url,Z.authToken))return!0}catch{}return!1}async function C_($){if(!xY($.url))return;let Z=IY(),Q=await m0(Z.discoveryPath);if(!Q?.url||!Dg(Q.url,$.url))return;if(!await R_(Q.url,Q.authToken,{workspaceRoot:$.workspaceRoot,cwd:$.cwd}))return;if(!await zg())return;if(!await Lg(Q.url))return;return await M$(Z.discoveryPath).catch(()=>{return}),await p5({workspaceRoot:$.workspaceRoot,cwd:$.cwd})}import{resolveProviderRequestHeaders as Rg}from"@cline/llms";import{captureSdkError as uY,createSessionId as k_,HUB_CHECKPOINT_CAPABILITY as Cg,HUB_COMPACTION_CAPABILITY as Pg,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as wg,HUB_HOOK_CAPABILITY_PREFIX as fg,HUB_MISTAKE_LIMIT_CAPABILITY as Sg,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as bg,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as kg,isGeneratedMedia as xg,isHubToolExecutorName as yg}from"@cline/shared";_1();import{createHash as Og}from"node:crypto";import{formatDisplayUserInput as P_}from"@cline/shared";import{z as Q$}from"zod";function qg($){if(!$||typeof $!=="object"||Array.isArray($))return!1;let Z=$;if(Z.role!=="user"&&Z.role!=="assistant")return!1;return typeof Z.content==="string"||Array.isArray(Z.content)}var Ng=Q$.custom(qg),$3=Q$.object({version:Q$.literal(1),updated_at:Q$.string().datetime(),conversation_id:Q$.string().min(1).optional(),source_message_count:Q$.number().int().nonnegative(),source_prefix_hash:Q$.string().min(1).optional(),source_last_message_key:Q$.string().min(1).optional(),messages:Q$.array(Ng),system_prompt:Q$.string().optional()});function mY($){return JSON.parse(JSON.stringify($))}function w_($){if($.role!=="user")return $;if(typeof $.content==="string")return{...$,content:P_($.content)};return{...$,content:$.content.map((Z)=>Z.type==="text"?{...Z,text:P_(Z.text)}:Z)}}function f_($){if($.includes(":"))throw TypeError("Message role cannot contain ':' in compaction boundary keys")}function Ag($){let Z=w_($);return f_(Z.role),[["role",Z.role],["content",Z.content],["agent",Z.agent??null],["sessionId",Z.sessionId??null],["metadata",Z.metadata??null],["modelInfo",Z.modelInfo??null],["metrics",Z.metrics??null]]}function S_($){if(!$)return"";let Z=w_($);if(typeof Z.id==="string"&&Z.id.trim())return`id:${Z.id.trim()}`;if(f_(Z.role),typeof Z.ts==="number"&&Number.isFinite(Z.ts))return`ts:${Z.role}:${Z.ts}`;return`content:${Z.role}:${JSON.stringify(Z.content)}`}function b_($,Z=$.length){let Q=Og("sha256");Q.update(`cline-session-compaction-source-v2
|
|
543
543
|
`),Q.update(`${Z}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createRequire as n0}from"node:module";var s0=n0(import.meta.url);import{homedir as y2}from"node:os";import{claimHubDaemonProcess as b2}from"@cline/shared";import{setHomeDirIfUnset as h2}from"@cline/shared/storage";import{createSessionId as N2,isHubProtocolCompatible as K2,resolveClineBuildEnv as W2,resolveHubCommandTimeoutMs as G2}from"@cline/shared";import q2 from"ws";var $0="session_not_found";class v extends Error{sessionId;code="session_not_found";constructor(J,Q){super(Q??(J?`session not found: ${J}`:"session not found"));this.sessionId=J;this.name="SessionNotFoundError"}}import{spawn as g1}from"node:child_process";import{closeSync as T1,mkdirSync as I1,openSync as P1,readFileSync as w1,unlinkSync as H1}from"node:fs";import{basename as k1,dirname as y1,join as b1}from"node:path";import{fileURLToPath as h1}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as m1,isHubDaemonProcess as v1,resolveClineBuildEnv as R0,withResolvedClineBuildEnv as u1}from"@cline/shared";import{createHash as d0,randomBytes as a0}from"node:crypto";import{mkdir as p,open as X0,readFile as N0,rename as o0,rm as T,writeFile as r0}from"node:fs/promises";import{dirname as K0,join as l}from"node:path";import{isHubProtocolCompatible as e0}from"@cline/shared";import{resolveClineDataDir as _,resolveClineDir as d2}from"@cline/shared/storage";var g={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.
|
|
1
|
+
import{createRequire as n0}from"node:module";var s0=n0(import.meta.url);import{homedir as y2}from"node:os";import{claimHubDaemonProcess as b2}from"@cline/shared";import{setHomeDirIfUnset as h2}from"@cline/shared/storage";import{createSessionId as N2,isHubProtocolCompatible as K2,resolveClineBuildEnv as W2,resolveHubCommandTimeoutMs as G2}from"@cline/shared";import q2 from"ws";var $0="session_not_found";class v extends Error{sessionId;code="session_not_found";constructor(J,Q){super(Q??(J?`session not found: ${J}`:"session not found"));this.sessionId=J;this.name="SessionNotFoundError"}}import{spawn as g1}from"node:child_process";import{closeSync as T1,mkdirSync as I1,openSync as P1,readFileSync as w1,unlinkSync as H1}from"node:fs";import{basename as k1,dirname as y1,join as b1}from"node:path";import{fileURLToPath as h1}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as m1,isHubDaemonProcess as v1,resolveClineBuildEnv as R0,withResolvedClineBuildEnv as u1}from"@cline/shared";import{createHash as d0,randomBytes as a0}from"node:crypto";import{mkdir as p,open as X0,readFile as N0,rename as o0,rm as T,writeFile as r0}from"node:fs/promises";import{dirname as K0,join as l}from"node:path";import{isHubProtocolCompatible as e0}from"@cline/shared";import{resolveClineDataDir as _,resolveClineDir as d2}from"@cline/shared/storage";var g={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.85",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"},"./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:{"@cline/agents":"workspace:*","@cline/shared":"workspace:*","@cline/llms":"workspace:*","@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",jiti:"^2.7.0","node-machine-id":"^1.1.12",nanoid:"^5.1.7","simple-git":"3.36.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/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["dist","!dist/**/*.d.ts.map"]};var J1="CLINE_HUB_DISCOVERY_PATH",Q1="CLINE_HUB_BUILD_ID",Z1="CLINE_HUB_BUILD_EPOCH_MS",$1=30000,X1=15000,j0=100;function j1(J){return J.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function z1(J){return d0("sha256").update(J).digest("hex").slice(0,12)}function V1(J){if(!Number.isInteger(J)||!J||J<=0)return!1;try{return process.kill(J,0),!0}catch(Q){return Q instanceof Error&&"code"in Q?String(Q.code)==="EPERM":!1}}function z0(J){return new Promise((Q)=>setTimeout(Q,J))}function Y1(J){return`${J}.lock`}async function N1(J){try{let Q=JSON.parse(await N0(l(J,"owner.json"),"utf8"));if(typeof Q.pid!=="number"||typeof Q.acquiredAt!=="string")return;return{pid:Q.pid,acquiredAt:Q.acquiredAt}}catch{return}}async function u(J){await T(J,{recursive:!0,force:!0}).catch(()=>{return})}function C(){let J=process.env[Q1]?.trim();if(J)return J;return"sdk-v1-7a06925efdddafd91fa32d8c54bdc4f26c316a2e7a7db1f707c69264416f8117".trim()||`source-${String(g.version)}`}function K1(){let J=Number(process.env[Z1]);if(Number.isFinite(J)&&J>0)return J;return Number.isFinite(1790064761572)?1790064761572:void 0}function I(J,Q=C()){let Z=e0(J);if(!Z.compatible)return Z;let $=J.buildId?.trim();if(!$)return{compatible:!1,reason:"missing_build"};if($!==Q)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function V0(J){return typeof J==="number"&&Number.isFinite(J)&&J>0?J:void 0}function Y0(J){let Q=J?.trim().split(/[-+]/,1)[0];if(!Q)return;let Z=Q.split(".").map(($)=>Number($));if(Z.length===0||Z.some(($)=>!Number.isInteger($)||$<0))return;return Z}function W1(J,Q){for(let Z=0;Z<Math.max(J.length,Q.length);Z++){let $=J[Z]??0,X=Q[Z]??0;if($!==X)return $<X?-1:1}return 0}function W0(J,Q){let Z=J.buildId?.trim(),$=Q.buildId?.trim();if(Z&&$&&Z===$)return 0;let X=V0(J.buildEpochMs),j=V0(Q.buildEpochMs);if(X!==void 0&&j!==void 0&&X!==j)return X<j?-1:1;let V=Y0(J.coreVersion),N=Y0(Q.coreVersion);if(V&&N){let Y=W1(V,N);if(Y!==0)return Y}if(Z&&$&&Z!==$)return Z<$?-1:1;return 0}function G0(){return{buildId:C(),buildEpochMs:K1(),coreVersion:String(g.version)}}function P(J,Q){let Z=Q?.self??G0(),$=I(J,Z.buildId??"");if($.compatible)return!0;if($.reason!=="build_mismatch"&&$.reason!=="missing_build")return!1;return W0(Z,J)<=0}function q0(J=process.argv[1]?.trim()||process.cwd()){let Q=`hub-${z1(J)}`,Z=process.env[J1]?.trim()||l(_(),"locks","hub","owners",`${j1(Q)}.json`);return{ownerId:Q,discoveryPath:Z}}async function O(J){try{let Q=JSON.parse(await N0(J,"utf8"));if(typeof Q.hubId!=="string"||typeof Q.protocolVersion!=="string"||typeof Q.authToken!=="string"||typeof Q.host!=="string"||typeof Q.port!=="number"||typeof Q.url!=="string"||typeof Q.startedAt!=="string"||typeof Q.updatedAt!=="string")return;return{hubId:Q.hubId,protocolVersion:Q.protocolVersion,minClientProtocolVersion:typeof Q.minClientProtocolVersion==="string"?Q.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof Q.maxClientProtocolVersion==="string"?Q.maxClientProtocolVersion:void 0,capabilities:Array.isArray(Q.capabilities)?Q.capabilities.filter((Z)=>typeof Z==="string"):void 0,coreVersion:typeof Q.coreVersion==="string"?Q.coreVersion:void 0,buildId:typeof Q.buildId==="string"?Q.buildId:void 0,buildEpochMs:typeof Q.buildEpochMs==="number"?Q.buildEpochMs:void 0,authToken:Q.authToken,host:Q.host,port:Q.port,url:Q.url,pid:typeof Q.pid==="number"?Q.pid:void 0,startedAt:Q.startedAt,updatedAt:Q.updatedAt}}catch{return}}async function F0(J,Q){await c(J,async()=>{let Z=K0(J);await p(Z,{recursive:!0});let $=`${J}.${process.pid}.${a0(6).toString("hex")}.tmp`,X;try{X=await X0($,"wx",384),await X.writeFile(`${JSON.stringify(Q,null,2)}
|
|
2
2
|
`,{encoding:"utf8"}),await X.sync(),await X.close(),X=void 0,await o0($,J);let j;try{j=await X0(Z,"r"),await j.sync()}catch{}finally{await j?.close().catch(()=>{return})}}catch(j){throw await X?.close().catch(()=>{return}),await T($,{force:!0}).catch(()=>{return}),j}})}async function x(J){await c(J,async()=>{await T(J,{force:!0}).catch(()=>{return})})}async function L0(J,Q){return await c(J,async()=>{if((await O(J))?.hubId!==Q)return!1;return await T(J,{force:!0}),!0})}async function B0(J,Q,Z){let $=Y1(J);await p(K0($),{recursive:!0});let X=Date.now()+X1;while(!0){try{await p($,{recursive:!1})}catch(j){if((j instanceof Error&&"code"in j?String(j.code):"")!=="EEXIST")throw j;let N=await N1($);if(!N){if(Date.now()>=X){await u($);continue}await z0(j0);continue}let Y=Date.now()-Date.parse(N.acquiredAt);if(!V1(N.pid)||Y>$1){await u($);continue}if(Date.now()>=X)throw Error(`Timed out waiting for hub ${Q} lock ${$}`);await z0(j0);continue}try{return await r0(l($,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
3
3
|
`,"utf8"),await Z()}finally{await u($)}}}function c(J,Q){return B0(`${J}.mutation`,"discovery mutation",Q)}function O0(J,Q){return B0(J,"startup",Q)}async function w(J,Q){try{let Z=await fetch(Q?.authToken?G1(J):U0(J),{headers:Q?.authToken?{authorization:`Bearer ${Q.authToken}`}:void 0});if(!Z.ok)return;let $=await Z.json();if(typeof $.protocolVersion!=="string"||typeof $.host!=="string"||typeof $.port!=="number"||typeof $.url!=="string")return;return{protocolVersion:$.protocolVersion,minClientProtocolVersion:typeof $.minClientProtocolVersion==="string"?$.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof $.maxClientProtocolVersion==="string"?$.maxClientProtocolVersion:void 0,capabilities:Array.isArray($.capabilities)?$.capabilities.filter((X)=>typeof X==="string"):void 0,coreVersion:typeof $.coreVersion==="string"?$.coreVersion:void 0,buildId:typeof $.buildId==="string"?$.buildId:void 0,buildEpochMs:typeof $.buildEpochMs==="number"?$.buildEpochMs:void 0,host:$.host,port:$.port,url:$.url,hubId:typeof $.hubId==="string"?$.hubId:void 0,authToken:typeof $.authToken==="string"?$.authToken:void 0,pid:typeof $.pid==="number"?$.pid:void 0,startedAt:typeof $.startedAt==="string"?$.startedAt:void 0,updatedAt:typeof $.updatedAt==="string"?$.updatedAt:void 0}}catch{return}}function A0(J,Q,Z="/hub"){return new URL(`ws://${J}:${Q}${Z}`).toString()}function U0(J){let Q=new URL(J);return Q.protocol=Q.protocol==="wss:"?"https:":"http:",Q.pathname="/health",Q.search="",Q.toString()}function G1(J){let Q=new URL(U0(J));return Q.pathname="/status",Q.toString()}import{CLINE_HUB_DEV_PORT as q1,CLINE_HUB_PORT as F1,resolveClineBuildEnv as L1}from"@cline/shared";var B1="CLINE_HUB_HOST",O1="CLINE_HUB_PORT",A1="CLINE_HUB_PATHNAME",U1="127.0.0.1",M1=F1,f1="/hub";function M0(J){return L1(J)==="development"?q1:M1}function C1(J={}){return(J.env??process.env)[B1]?.trim()||U1}function x1(J={}){let Z=(J.env??process.env)[O1]?.trim();if(!Z)return M0(J);let $=Number.parseInt(Z,10);if(!Number.isInteger($)||$<1||$>65535)return M0(J);return $}function _1(J={}){return(J.env??process.env)[A1]?.trim()||f1}function f0(J={},Q={}){return{host:J.host??C1(Q),port:J.port??x1(Q),pathname:J.pathname??_1(Q)}}import{join as D1}from"node:path";import{processWorkspaceInfo as Q4}from"@cline/shared";import $4 from"simple-git";var R1="shared:cline",S1="CLINE_HUB_DISCOVERY_PATH",E1="hub-production";function D(J=R1){return q0(`${J}@${C()}`)}function H(){return{ownerId:E1,discoveryPath:process.env[S1]?.trim()||D1(_(),"locks","hub","production.json")}}var p1=8000,l1=200,C0=3000,c1=100,i1=[100,250,500,1000,2000],n1="--cline-hub-daemon",s1=3,t1=60000,x0=new Map;function d1(J,Q=Date.now()){let Z=x0.get(J);if(!Z||Q-Z.windowStartedAt>t1)return x0.set(J,{count:1,windowStartedAt:Q}),!0;return Z.count+=1,Z.count<=s1}function a1(J){return[...J.host?["--host",J.host]:[],...typeof J.port==="number"?["--port",String(J.port)]:[],...J.pathname?["--pathname",J.pathname]:[]]}function o1(){try{let J=b1(_(),"logs","hub-daemon.log");return I1(y1(J),{recursive:!0}),{fd:P1(J,"a"),logPath:J}}catch{return}}function r1(){return R0()==="production"?H():D()}function R(J){return P(J)}function e1(J){try{let Q=JSON.parse(w1(`${J}.superseded`,"utf8"));return{url:typeof Q.url==="string"?Q.url:void 0,authToken:typeof Q.authToken==="string"?Q.authToken:void 0,pid:typeof Q.pid==="number"?Q.pid:void 0}}catch{return}}function i(J){try{H1(`${J}.superseded`)}catch{}}function _0(J,Q,Z){if(!Q||Q.url!==Z)return J;return{...J,authToken:J.authToken??Q.authToken,pid:J.pid??Q.pid}}async function S(J,Q){try{return await w(J,{authToken:Q})}catch{return}}async function D0(J,Q){let Z=Date.now()+Q;while(Date.now()<Z){if(!(await S(J))?.url)return!0;await new Promise((X)=>setTimeout(X,c1))}return!1}async function s(J,Q){if(!d1(J.url))return!1;await E(J.url,J.authToken,"retired by newer install").catch(()=>!1),await b(J.url,J.authToken).catch(()=>!1);let Z=await D0(J.url,C0);if(!Z&&J.pid&&J2(J.pid)){try{process.kill(J.pid,"SIGTERM")}catch{}Z=await D0(J.url,C0)}if(Z)await x(Q).catch(()=>{return});return Z}function J2(J){try{return process.kill(J,0),!0}catch(Q){return Q?.code==="EPERM"}}async function Q2(J){try{return(await t(J.url,J.authToken)).activeSessionCount>0}catch{return!1}}async function n(J,Q){if(R(J))return"reusable";let Z=await E(J.url,J.authToken,"retired by newer install").catch(()=>!1);if(await Q2(J)){if(Z)await E(J.url,J.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let $=await s(J,Q);if(!$&&Z)await E(J.url,J.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return $?"retired":"failed"}async function Z2(J){if(R0()!=="production")return;let Q=D();if(Q.discoveryPath===J.discoveryPath)return;let Z=await O(Q.discoveryPath);if(Z?.url)await s(Z,Q.discoveryPath);else await x(Q.discoveryPath).catch(()=>{return})}function $2(){let J=import.meta.url.endsWith(".ts")?"ts":"js";return h1(new URL(`./entry.${J}`,import.meta.url))}function X2(J,Q){let Z=$2(),$=process.execPath?.trim();if(!$)throw Error("unable to resolve runtime executable for hub daemon");let X=k1($).toLowerCase().includes("bun"),j=Z.startsWith("/$bunfs/"),V=X&&Z.toLowerCase().endsWith(".ts"),N=j?[n1]:[...V?["--conditions=development"]:[],Z];return{launcher:$,args:[...N,"--cwd",J,...a1(Q),...Q.manageConnectors===!1?["--no-connectors"]:[]],cwd:J,env:{...u1(process.env),CLINE_NO_INTERACTIVE:"1",[m1]:"1"}}}function j2(J){if(!J||typeof J!=="object")return!1;if(("code"in J?J.code:void 0)==="ETXTBSY")return!0;let Z="message"in J?J.message:void 0;return typeof Z==="string"&&Z.includes("ETXTBSY")}function z2(J,Q={}){if(v1())return;let Z=X2(J,Q),$=o1();try{g1(Z.launcher,Z.args,{detached:!0,stdio:$?["ignore",$.fd,$.fd]:"ignore",env:Z.env,cwd:Z.cwd,windowsHide:!0}).unref()}finally{if($)T1($.fd)}}async function V2(J,Q={}){for(let Z=0;;Z++)try{z2(J,Q);return}catch($){let X=i1[Z];if(!j2($)||X===void 0)throw $;await new Promise((j)=>setTimeout(j,X))}}async function Y2(J,Q,Z={}){let $=Z.host!==void 0||Z.port!==void 0||Z.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),X=f0(Z),j=A0(X.host,X.port,X.pathname),V=(W)=>{if(!$)y(W.url,W.authToken);return W};await Z2(J).catch(()=>{return});let N=await O(J.discoveryPath),Y=N?.url?void 0:e1(J.discoveryPath),K=!1;if(N?.url){let W=N.authToken;if(!W)K=!0,await s(N,J.discoveryPath);else{let G=await S(N.url,W);if(G?.url&&R(G)&&await A(G.url,{authToken:W}))return i(J.discoveryPath),V({url:G.url,authToken:W});if(G?.url){if(await n({...G,authToken:W},J.discoveryPath)==="deferred_busy"&&await A(G.url,{authToken:W}))return V({url:G.url,authToken:W})}else await x(J.discoveryPath).catch(()=>{return})}}let z=await S(j);if(z?.url){let W=_0(z,N??Y,j);if(R(z)){let L=[z.authToken,N?.authToken,Y?.authToken].filter((f)=>typeof f==="string"&&f.trim().length>0);for(let f of L){if(!await A(z.url,{authToken:f}))continue;let i0={hubId:z.hubId??`repaired-${z.port}`,protocolVersion:z.protocolVersion,minClientProtocolVersion:z.minClientProtocolVersion,maxClientProtocolVersion:z.maxClientProtocolVersion,capabilities:z.capabilities,coreVersion:z.coreVersion,buildId:z.buildId,authToken:f,host:z.host,port:z.port,url:z.url,pid:z.pid??N?.pid??Y?.pid,startedAt:z.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await F0(J.discoveryPath,i0)}catch{}return i(J.discoveryPath),V({url:z.url,authToken:f})}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.${K?" 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 G=await n(W,J.discoveryPath);if(G==="deferred_busy"){for(let L of[W.authToken,N?.authToken].filter((M)=>typeof M==="string"&&M.trim().length>0))if(await A(z.url,{authToken:L}))return V({url:z.url,authToken:L});if(Z.allowPortFallback!==!0&&X.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(G==="failed"&&Z.allowPortFallback!==!0&&X.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 B=Z.allowPortFallback===!0&&X.port!==0?{...X,port:0}:X;await V2(Q,{...B,manageConnectors:Z.manageConnectors});let U=Date.now()+p1;while(Date.now()<U){let W=await O(J.discoveryPath);if(W?.url&&W.authToken){let L=await S(W.url,W.authToken);if(L?.url&&R(L)&&await A(L.url,{authToken:W.authToken}))return i(J.discoveryPath),V({url:L.url,authToken:W.authToken})}let G=await S(j);if(G?.url&&!R(G)){let L=_0(G,W??Y,j),M=await n(L,J.discoveryPath);if(M==="deferred_busy"&&W?.authToken&&await A(G.url,{authToken:W.authToken}))return V({url:G.url,authToken:W.authToken});if(M==="failed"&&Z.allowPortFallback!==!0&&X.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((L)=>setTimeout(L,l1))}throw Error("Timed out waiting for detached hub startup.")}async function k(J,Q={}){let Z=r1();return await O0(Z.discoveryPath,async()=>Y2(Z,J,Q))}function F2(){return W2()==="production"?H():D()}function L2(){let J=globalThis.WebSocket;if(!J)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return J}function P0(J){if(typeof J==="string")return J;if(J instanceof Uint8Array)return Buffer.from(J).toString();if(J instanceof ArrayBuffer)return Buffer.from(J).toString();if(Array.isArray(J))return Buffer.concat(J.map((Q)=>Buffer.from(Q))).toString();if(J&&typeof J==="object"&&"data"in J&&typeof J.data<"u")return P0(J.data);return String(J)}function B2(J){if(typeof J==="string")return J;if(J instanceof Uint8Array)return Buffer.from(J).toString("utf8");if(J instanceof ArrayBuffer)return Buffer.from(J).toString("utf8");return""}function S0(J){let Q=J,Z=B2(Q.reason);return new q("hub_connection_closed",Q.code||Z?`Hub connection closed (code=${Q.code??0}${Z?`, reason=${Z}`:""})`:a,{closeCode:Q.code,closeReason:Z||void 0})}function E0(J,Q){if(J instanceof q)return J;if(J instanceof Error)return new q("hub_connect_failed",J.message);if(J&&typeof J==="object"&&"error"in J&&J.error instanceof Error)return new q("hub_connect_failed",J.error.message);let Z=J&&typeof J==="object"&&"message"in J&&typeof J.message==="string"?J.message.trim():"";if(Z)return new q("hub_connect_failed",Z);let $=J&&typeof J==="object"&&"type"in J&&typeof J.type==="string"?J.type.trim():"";return new q("hub_connect_failed",$?`Failed to connect to hub at ${Q.toString()} (${$} event before socket open).`:`Failed to connect to hub at ${Q.toString()}.`)}var d="*",h=8000,O2="cline-hub-auth.",w0=new Map,H0=new Set,A2=3000;var a="Hub connection closed",U2=250,M2=5000,g0=0.5;class q extends Error{code;details;constructor(J,Q,Z){super(Q);this.code=J;this.details=Z;this.name="HubTransportError"}}function f2(J){return J instanceof q}class o extends Error{command;code;constructor(J,Q,Z){super(Z);this.command=J;this.code=Q;this.name="HubCommandError"}}function e(J,Q={}){let Z=J.searchParams.get("authToken")?.trim();if(J.searchParams.delete("authToken"),Z)return Z;if(Q.skipRegistry)return;let $=J0(J.toString());return $?w0.get($):void 0}function C2(J){try{let Z=new URL(J).hostname.toLowerCase().replace(/^\[|\]$/g,"");return Z==="localhost"||Z==="127.0.0.1"||Z==="::1"}catch{return!1}}function J0(J){if(!C2(J))return;let Q=new URL(k0(J));return Q.search="",Q.hash="",Q.toString()}function T0(J){let Q=J0(J);return!!Q&&H0.has(Q)}function y(J,Q){let Z=J0(J);if(Z){if(H0.add(Z),Q?.trim())w0.set(Z,Q)}return J}class Q0{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 q("hub_connection_closed",a);sawSocketClose=!1;registered=!1;capabilities;constructor(J){this.options=J;if(J.authToken?.trim()&&J.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");this.clientId=J.clientId??`core-${Math.random().toString(36).slice(2,10)}-${Date.now().toString(36)}`,this.currentUrl=J.url,this.capabilities=[...J.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(J){if(this.capabilities=J.map((Q)=>({...Q})),!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 J=new URL(this.currentUrl),Q=this.options.authToken?.trim()||e(J,{skipRegistry:Boolean(this.options.resolveConnectionHeaders)});if(J.hash="",Q&&this.options.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");let Z=++this.connectGeneration,$=this.openSocket(J,Q,Z),X;this.connectPromise=$.then(async(V)=>{if(X=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,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 N of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(N));this.reconnectAttempt=0});let j=this.connectPromise;try{await j}catch(V){if(this.connectPromise===j)this.connectPromise=void 0;if(X&&this.socket===X){this.lastCloseError=E0(V,J),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{X.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw V}}async openSocket(J,Q,Z){let $=this.options.resolveConnectionHeaders,X;if($){let Y;try{X=await Promise.race([Promise.resolve().then(()=>$()),new Promise((K,z)=>{Y=setTimeout(()=>{z(new q("hub_connect_timeout",`Timed out resolving hub connection headers after ${h}ms`))},h)})])}catch(K){let z=K instanceof q?K:new q("hub_connect_failed",K instanceof Error?K.message:String(K));if(Z===this.connectGeneration)this.lastCloseError=z;throw z}finally{clearTimeout(Y)}}if(Z!==this.connectGeneration||this.closedByClient)throw this.lastCloseError;if(X&&Object.keys(X).some((Y)=>Y.toLowerCase()==="sec-websocket-protocol")){let Y=new q("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(Z===this.connectGeneration)this.lastCloseError=Y;throw Y}let j=X?new q2(J.toString(),{headers:{...X}}):new(L2())(J.toString(),Q?[`${O2}${Q}`]:void 0);this.socket=j;let V=!1,N=new Promise((Y,K)=>{let z=!1,F=setTimeout(()=>{if(z)return;z=!0,V=!0;let B=new q("hub_connect_timeout",`Timed out connecting to hub after ${h}ms`);if(this.socket===j)this.lastCloseError=B,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{j.close()}catch{}K(B)},h);j.addEventListener("open",()=>{if(z)return;z=!0,clearTimeout(F),Y()}),j.addEventListener("error",(B)=>{if(z)return;z=!0,clearTimeout(F);let U=E0(B,J);if(this.socket===j)this.lastCloseError=U,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;K(U)}),j.addEventListener("close",(B)=>{if(z)return;z=!0,clearTimeout(F);let U=V?this.lastCloseError:S0(B);if(this.socket===j){if(!V)this.lastCloseError=U,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}K(U)})});return j.addEventListener("message",(Y)=>{this.handleFrame(JSON.parse(P0(Y)))}),j.addEventListener("close",(Y)=>{if(this.socket!==j)return;if(!V)this.lastCloseError=S0(Y),this.sawSocketClose=!0;this.registered=!1;for(let K of this.pendingReplies.values())K.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await N,j}subscribe(J,Q){let Z=Q?.sessionId?.trim()||void 0,$={listener:J,sessionId:Z};return this.listeners.add($),this.adjustSubscriptionCount(Z,1),()=>{if(!this.listeners.delete($))return;this.adjustSubscriptionCount(Z,-1)}}async command(J,Q,Z,$){let X=0,j=J!=="client.register"&&J!=="client.unregister";while(!0)try{return await this.commandOnce(J,Q,Z,$)}catch(V){if(!j||X>=1||!await this.recoverLocalHubTransport(V))throw V;X+=1}}async commandOnce(J,Q,Z,$,X=!0){if(X)await this.connect();$?.beforeDispatch?.();let j=N2("hubreq_"),V=G2(J,$?.timeoutMs),N=new Promise((K,z)=>{let F=V===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(j))return;z(new o(J,"hub_command_timeout",`Hub command ${J} 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:(B)=>{if(F)clearTimeout(F);K(B)},reject:(B)=>{if(F)clearTimeout(F);z(B)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:J,requestId:j,clientId:this.clientId,sessionId:Z,timeoutMs:V,payload:Q}})}catch(K){throw this.pendingReplies.delete(j),K}let Y=await N;if(!Y.ok){if(Y.error?.code===$0){let K=Z??(typeof Q?.sessionId==="string"?Q.sessionId:void 0);throw new v(K,Y.error.message)}throw new o(J,Y.error?.code,Y.error?.message??`Hub command ${J} failed`)}return Y}async recoverLocalHubTransport(J){if(!T0(this.currentUrl)||!f2(J))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let Q=await I0({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!Q)return!1;return this.currentUrl=Q,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 J=Math.min(U2*2**this.reconnectAttempt,M2),Q=Math.round(J*(1-g0)+Math.random()*J*g0);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},Q)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!T0(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let J=await I0({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd});if(J){this.currentUrl=J,await this.connect(),this.reconnectAttempt=0;return}}catch{}this.reconnectAttempt+=1,this.scheduleReconnect()}}close(){let J=this.socket;if(this.closedByClient=!0,this.connectGeneration+=1,this.clearReconnectTimer(),this.registered=!1,J)this.lastCloseError=new q("hub_connection_closed",a);for(let Q of this.pendingReplies.values())Q.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,!J)return;this.sawSocketClose=!1,this.socket=void 0;try{J.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(J){if(!this.socket||this.socket.readyState!==1){if(this.lastCloseError.code==="hub_connection_closed"&&!this.sawSocketClose)throw new q("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify(J))}sendSubscriptionFrame(J,Q){let Z=J==="stream.subscribe"?this.lastEventSequenceByKey.get(this.subscriptionKeyForSessionId(Q)):void 0;this.sendFrame({kind:J,clientId:this.clientId,...Q?{sessionId:Q}:{},...Z!==void 0?{sinceSequence:Z}:{}})}adjustSubscriptionCount(J,Q){let Z=this.subscriptionKeyForSessionId(J),$=(this.subscriptionCounts.get(Z)??0)+Q;if($<=0){if(this.subscriptionCounts.delete(Z),!this.hasActiveSubscriptions())this.clearReconnectTimer();if(Q<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",J);return}if(this.subscriptionCounts.set(Z,$),Q>0&&$===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",J)}subscriptionKeyForSessionId(J){return J??d}subscriptionSessionIdFromKey(J){return J===d?void 0:J}handleFrame(J){switch(J.kind){case"reply":{let Q=J.envelope.requestId;if(!Q)return;let Z=this.pendingReplies.get(Q);if(!Z)return;this.pendingReplies.delete(Q),Z.resolve(J.envelope);return}case"event":{let Q=J.envelope.sequence;if(typeof Q==="number"){let Z=J.envelope.sessionId?.trim();for(let $ of[d,Z]){if(!$||!this.subscriptionCounts.has($))continue;let X=this.lastEventSequenceByKey.get($)??0;if(Q>X)this.lastEventSequenceByKey.set($,Q)}}for(let Z of this.listeners){if(Z.sessionId&&Z.sessionId!==J.envelope.sessionId?.trim())continue;Z.listener(J.envelope)}return}case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function k0(J){let Q=new URL(J);if(Q.protocol==="http:")Q.protocol="ws:";else if(Q.protocol==="https:")Q.protocol="wss:";return Q.toString()}async function A(J,Q){let Z=new Q0({url:J,authToken:Q?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:Q?.workspaceRoot,cwd:Q?.cwd});try{return await Z.connect(),!0}catch{return!1}finally{Z.close()}}async function r(J,Q){let Z=k0(J),$=await w(Z,{authToken:Q?.authToken});if(!$)return{status:"unreachable",url:Z};if(Q?.requireCurrentBuild){let X=C(),j=I($,X);if(!j.compatible&&!P($))return{status:j.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:Z}}else if(!K2($).compatible)return{status:"protocol_mismatch",url:Z};if(Q?.verifyConnection===!0&&!await A(Z,{workspaceRoot:Q.workspaceRoot,cwd:Q.cwd,authToken:Q.authToken}))return{status:"unreachable",url:Z};return{status:"compatible",url:Z}}function x2(J){let Q=J&&typeof J==="object"&&Array.isArray(J.sessions)?J.sessions:[],Z=0,$=new Set;for(let X of Q){if(!X||typeof X!=="object")continue;let j=X.participants;if(!Array.isArray(j)||j.length===0)continue;Z+=1;for(let V of j){let N=V&&typeof V==="object"?V.clientId:void 0;if(typeof N==="string"&&N.trim())$.add(N)}}return{activeSessionCount:Z,participantClientCount:$.size}}async function t(J,Q,Z){let $=new Q0({url:J,authToken:Q,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:Z?.workspaceRoot,cwd:Z?.cwd});try{let X=await $.command("session.list",{limit:500},void 0,{timeoutMs:A2});return x2(X.payload)}finally{await $.dispose().catch(()=>{return})}}async function _2(J,Q,Z){try{return(await t(J,Q,Z)).activeSessionCount===0}catch{return!1}}async function D2(J,Q){let Z=`${J.discoveryPath}.superseded`,$=await O(Z);if(!$?.url||!$.authToken)return;let X=await r($.url,{authToken:$.authToken});if(X.status!=="compatible")return;if(await _2(X.url,$.authToken,Q))return;return y(X.url,$.authToken)}async function R2(J={}){if(J.endpoint?.trim()){let X=await r(J.endpoint);return X.status==="compatible"?X.url:void 0}let Q=F2(),Z=await O(Q.discoveryPath);if(!Z?.url)return await D2(Q,J);let $=await r(Z.url,{authToken:Z.authToken,requireCurrentBuild:!0});if($.status==="compatible")return y($.url,Z.authToken);if($.status==="protocol_mismatch")await x(Q.discoveryPath).catch(()=>{return});return}async function I0(J={}){let Q=await R2(J);if(Q&&await A(Q,{workspaceRoot:J.workspaceRoot,cwd:J.cwd}))return Q;if(J.endpoint?.trim())return;try{return(await k(J.workspaceRoot??process.cwd())).url}catch{return}}async function E(J,Q,Z,$){let X=new URL(J),j=Q?.trim()||e(X);if(X.protocol==="ws:")X.protocol="http:";else if(X.protocol==="wss:")X.protocol="https:";if(X.pathname="/drain",X.hash="",Z)X.searchParams.set("reason",Z);if($?.off)X.searchParams.set("off","1");return(await fetch(X,{method:"POST",headers:j?{authorization:`Bearer ${j}`}:void 0})).ok}async function b(J,Q){let Z=new URL(J),$=Q?.trim()||e(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:$?{authorization:`Bearer ${$}`}:void 0})).ok}import{spawn as S2}from"node:child_process";import{userInfo as E2}from"node:os";import{basename as g2,delimiter as m}from"node:path";var Z0="__CLINE_SIDECAR_PATH_START__",b0="__CLINE_SIDECAR_PATH_END__",h0=5000,T2=`/bin/sh -c 'printf "%s%s%s" "${Z0}" "$PATH" "${b0}"'`,y0="CLINE_SIDECAR_SKIP_SHELL_PATH";function m0(J){return J==="darwin"?"/bin/zsh":"/bin/bash"}function I2(J,Q){try{let Z=E2().shell?.trim();if(Z)return Z}catch{}return Q.SHELL?.trim()||m0(J)}function P2(J,Q){let Z=g2(J);if(Z==="csh"||Z==="tcsh")return{args:["-c",Q],argv0:`-${Z}`};return{args:["-i","-l","-c",Q]}}function w2(J){let Q=J.indexOf(Z0);if(Q===-1)return;let Z=J.indexOf(b0,Q);if(Z===-1)return;let $=J.slice(Q+Z0.length,Z).trim();return $.length>0?$:void 0}function H2(J,Q){let Z=[...J.split(m),...Q.split(m)].map(($)=>$.trim()).filter(($)=>$.length>0);return Array.from(new Set(Z)).join(m)}function k2(J,Q=h0){return new Promise((Z)=>{let $=P2(J,T2),X=S2(J,$.args,{argv0:$.argv0,stdio:["ignore","pipe","ignore"],detached:!0}),j="",V=0,N=()=>{try{if(X.pid)process.kill(-X.pid,"SIGKILL")}catch{X.kill("SIGKILL")}},Y=!1,K=(F)=>{if(Y)return;Y=!0,clearTimeout(z),X.stdout?.destroy(),N(),Z(F)},z=setTimeout(()=>{try{if(X.pid)process.kill(-X.pid,"SIGKILL")}catch{X.kill("SIGKILL")}K(void 0)},Q);X.stdout?.on("data",(F)=>{if(Y)return;if(V+=F.length,V>65536){K(void 0);return}j+=F.toString("utf8")}),X.on("error",()=>K(void 0)),X.on("close",()=>K(w2(j)))})}async function v0(J){let Q=J?.platform??process.platform,Z=J?.env??process.env;if(Q==="win32")return{status:"skipped",reason:"windows"};if(Z[y0]?.trim())return{status:"skipped",reason:y0};let $=J?.userShell??I2(Q,Z),X=J?.fallbackShell??m0(Q),j=J?.timeoutMs??h0,V=$===X?[[$,j]]:[[$,j],[X,j/2]];for(let[N,Y]of V){let K=await k2(N,Y);if(!K)continue;let z=H2(K,Z.PATH??"");return Z.PATH=z,{status:"applied",pathEntries:z.split(m).length,shell:N}}return{status:"failed",shell:$}}var u0={readHubDiscovery:O,clearHubDiscoveryIfOwned:L0,probeProcess:(J)=>{process.kill(J,0)},requestHubShutdown:b,ensureDetachedHubServer:k,claimHubDaemonProcess:b2,loadHubDaemon:()=>import("@cline/core/hub/daemon-entry"),ensureLoginShellPath:v0,setHomeDirIfUnset:h2,homeDir:y2,cwd:()=>process.cwd(),env:process.env,writeOutput:(J)=>process.stdout.write(J)};function p0(J,Q){let Z=J.indexOf(Q);return(Z>=0?J[Z+1]:void 0)?.trim()||void 0}function l0(J,Q){let Z=p0(J,"--discovery-path");if(!Z)throw Error("--discovery-path is required for remote Hub management");return Q.env.CLINE_HUB_DISCOVERY_PATH=Z,Z}async function m2(J=process.argv,Q=u0){Q.setHomeDirIfUnset(Q.homeDir()),await Q.ensureLoginShellPath();let Z=p0(J,"--cwd")??Q.cwd();l0(J,Q);let $=await Q.ensureDetachedHubServer(Z,{host:"127.0.0.1",port:0,pathname:"/hub",allowPortFallback:!0,manageConnectors:!1});Q.writeOutput(`${JSON.stringify({...$,cwd:Z,platform:process.platform,arch:process.arch})}
|
|
4
4
|
`)}async function c0(J=process.argv,Q=u0){if(J.includes("--remote-hub-stop")){let Z=l0(J,Q),$=await Q.readHubDiscovery(Z);if($&&typeof $.pid==="number"&&Number.isInteger($.pid)&&$.pid>0)try{Q.probeProcess($.pid)}catch(X){if(X?.code==="ESRCH")return await Q.clearHubDiscoveryIfOwned(Z,$.hubId),!0}if($&&!await Q.requestHubShutdown($.url,$.authToken))throw Error("Remote Hub shutdown failed");return!0}if(J.includes("--remote-hub-ensure"))return await m2(J,Q),!0;if(Q.claimHubDaemonProcess())return await Q.loadHubDaemon(),!0;return!1}(async()=>{if(!await c0())throw Error("A remote helper command is required")})().catch((J)=>{process.stderr.write(`${J instanceof Error?J.message:String(J)}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createRequire as i0}from"node:module";var n0=i0(import.meta.url);import{homedir as k2}from"node:os";import{claimHubDaemonProcess as y2}from"@cline/shared";import{setHomeDirIfUnset as b2}from"@cline/shared/storage";import{createSessionId as Y2,isHubProtocolCompatible as N2,resolveClineBuildEnv as K2,resolveHubCommandTimeoutMs as W2}from"@cline/shared";import G2 from"ws";var $0="session_not_found";class v extends Error{sessionId;code="session_not_found";constructor(J,Q){super(Q??(J?`session not found: ${J}`:"session not found"));this.sessionId=J;this.name="SessionNotFoundError"}}import{spawn as S1}from"node:child_process";import{closeSync as g1,mkdirSync as T1,openSync as I1,readFileSync as P1,unlinkSync as w1}from"node:fs";import{basename as H1,dirname as k1,join as y1}from"node:path";import{fileURLToPath as b1}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as h1,isHubDaemonProcess as m1,resolveClineBuildEnv as R0,withResolvedClineBuildEnv as v1}from"@cline/shared";import{createHash as t0,randomBytes as d0}from"node:crypto";import{mkdir as p,open as X0,readFile as N0,rename as a0,rm as T,writeFile as o0}from"node:fs/promises";import{dirname as K0,join as l}from"node:path";import{isHubProtocolCompatible as r0}from"@cline/shared";import{resolveClineDataDir as _,resolveClineDir as t2}from"@cline/shared/storage";var g={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.
|
|
1
|
+
import{createRequire as i0}from"node:module";var n0=i0(import.meta.url);import{homedir as k2}from"node:os";import{claimHubDaemonProcess as y2}from"@cline/shared";import{setHomeDirIfUnset as b2}from"@cline/shared/storage";import{createSessionId as Y2,isHubProtocolCompatible as N2,resolveClineBuildEnv as K2,resolveHubCommandTimeoutMs as W2}from"@cline/shared";import G2 from"ws";var $0="session_not_found";class v extends Error{sessionId;code="session_not_found";constructor(J,Q){super(Q??(J?`session not found: ${J}`:"session not found"));this.sessionId=J;this.name="SessionNotFoundError"}}import{spawn as S1}from"node:child_process";import{closeSync as g1,mkdirSync as T1,openSync as I1,readFileSync as P1,unlinkSync as w1}from"node:fs";import{basename as H1,dirname as k1,join as y1}from"node:path";import{fileURLToPath as b1}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as h1,isHubDaemonProcess as m1,resolveClineBuildEnv as R0,withResolvedClineBuildEnv as v1}from"@cline/shared";import{createHash as t0,randomBytes as d0}from"node:crypto";import{mkdir as p,open as X0,readFile as N0,rename as a0,rm as T,writeFile as o0}from"node:fs/promises";import{dirname as K0,join as l}from"node:path";import{isHubProtocolCompatible as r0}from"@cline/shared";import{resolveClineDataDir as _,resolveClineDir as t2}from"@cline/shared/storage";var g={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.85",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"},"./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:{"@cline/agents":"workspace:*","@cline/shared":"workspace:*","@cline/llms":"workspace:*","@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",jiti:"^2.7.0","node-machine-id":"^1.1.12",nanoid:"^5.1.7","simple-git":"3.36.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/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["dist","!dist/**/*.d.ts.map"]};var e0="CLINE_HUB_DISCOVERY_PATH",J1="CLINE_HUB_BUILD_ID",Q1="CLINE_HUB_BUILD_EPOCH_MS",Z1=30000,$1=15000,j0=100;function X1(J){return J.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function j1(J){return t0("sha256").update(J).digest("hex").slice(0,12)}function z1(J){if(!Number.isInteger(J)||!J||J<=0)return!1;try{return process.kill(J,0),!0}catch(Q){return Q instanceof Error&&"code"in Q?String(Q.code)==="EPERM":!1}}function z0(J){return new Promise((Q)=>setTimeout(Q,J))}function V1(J){return`${J}.lock`}async function Y1(J){try{let Q=JSON.parse(await N0(l(J,"owner.json"),"utf8"));if(typeof Q.pid!=="number"||typeof Q.acquiredAt!=="string")return;return{pid:Q.pid,acquiredAt:Q.acquiredAt}}catch{return}}async function u(J){await T(J,{recursive:!0,force:!0}).catch(()=>{return})}function C(){let J=process.env[J1]?.trim();if(J)return J;return"sdk-v1-7a06925efdddafd91fa32d8c54bdc4f26c316a2e7a7db1f707c69264416f8117".trim()||`source-${String(g.version)}`}function N1(){let J=Number(process.env[Q1]);if(Number.isFinite(J)&&J>0)return J;return Number.isFinite(1790064761572)?1790064761572:void 0}function I(J,Q=C()){let Z=r0(J);if(!Z.compatible)return Z;let $=J.buildId?.trim();if(!$)return{compatible:!1,reason:"missing_build"};if($!==Q)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function V0(J){return typeof J==="number"&&Number.isFinite(J)&&J>0?J:void 0}function Y0(J){let Q=J?.trim().split(/[-+]/,1)[0];if(!Q)return;let Z=Q.split(".").map(($)=>Number($));if(Z.length===0||Z.some(($)=>!Number.isInteger($)||$<0))return;return Z}function K1(J,Q){for(let Z=0;Z<Math.max(J.length,Q.length);Z++){let $=J[Z]??0,X=Q[Z]??0;if($!==X)return $<X?-1:1}return 0}function W0(J,Q){let Z=J.buildId?.trim(),$=Q.buildId?.trim();if(Z&&$&&Z===$)return 0;let X=V0(J.buildEpochMs),j=V0(Q.buildEpochMs);if(X!==void 0&&j!==void 0&&X!==j)return X<j?-1:1;let V=Y0(J.coreVersion),N=Y0(Q.coreVersion);if(V&&N){let Y=K1(V,N);if(Y!==0)return Y}if(Z&&$&&Z!==$)return Z<$?-1:1;return 0}function G0(){return{buildId:C(),buildEpochMs:N1(),coreVersion:String(g.version)}}function P(J,Q){let Z=Q?.self??G0(),$=I(J,Z.buildId??"");if($.compatible)return!0;if($.reason!=="build_mismatch"&&$.reason!=="missing_build")return!1;return W0(Z,J)<=0}function q0(J=process.argv[1]?.trim()||process.cwd()){let Q=`hub-${j1(J)}`,Z=process.env[e0]?.trim()||l(_(),"locks","hub","owners",`${X1(Q)}.json`);return{ownerId:Q,discoveryPath:Z}}async function O(J){try{let Q=JSON.parse(await N0(J,"utf8"));if(typeof Q.hubId!=="string"||typeof Q.protocolVersion!=="string"||typeof Q.authToken!=="string"||typeof Q.host!=="string"||typeof Q.port!=="number"||typeof Q.url!=="string"||typeof Q.startedAt!=="string"||typeof Q.updatedAt!=="string")return;return{hubId:Q.hubId,protocolVersion:Q.protocolVersion,minClientProtocolVersion:typeof Q.minClientProtocolVersion==="string"?Q.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof Q.maxClientProtocolVersion==="string"?Q.maxClientProtocolVersion:void 0,capabilities:Array.isArray(Q.capabilities)?Q.capabilities.filter((Z)=>typeof Z==="string"):void 0,coreVersion:typeof Q.coreVersion==="string"?Q.coreVersion:void 0,buildId:typeof Q.buildId==="string"?Q.buildId:void 0,buildEpochMs:typeof Q.buildEpochMs==="number"?Q.buildEpochMs:void 0,authToken:Q.authToken,host:Q.host,port:Q.port,url:Q.url,pid:typeof Q.pid==="number"?Q.pid:void 0,startedAt:Q.startedAt,updatedAt:Q.updatedAt}}catch{return}}async function F0(J,Q){await c(J,async()=>{let Z=K0(J);await p(Z,{recursive:!0});let $=`${J}.${process.pid}.${d0(6).toString("hex")}.tmp`,X;try{X=await X0($,"wx",384),await X.writeFile(`${JSON.stringify(Q,null,2)}
|
|
2
2
|
`,{encoding:"utf8"}),await X.sync(),await X.close(),X=void 0,await a0($,J);let j;try{j=await X0(Z,"r"),await j.sync()}catch{}finally{await j?.close().catch(()=>{return})}}catch(j){throw await X?.close().catch(()=>{return}),await T($,{force:!0}).catch(()=>{return}),j}})}async function x(J){await c(J,async()=>{await T(J,{force:!0}).catch(()=>{return})})}async function L0(J,Q){return await c(J,async()=>{if((await O(J))?.hubId!==Q)return!1;return await T(J,{force:!0}),!0})}async function B0(J,Q,Z){let $=V1(J);await p(K0($),{recursive:!0});let X=Date.now()+$1;while(!0){try{await p($,{recursive:!1})}catch(j){if((j instanceof Error&&"code"in j?String(j.code):"")!=="EEXIST")throw j;let N=await Y1($);if(!N){if(Date.now()>=X){await u($);continue}await z0(j0);continue}let Y=Date.now()-Date.parse(N.acquiredAt);if(!z1(N.pid)||Y>Z1){await u($);continue}if(Date.now()>=X)throw Error(`Timed out waiting for hub ${Q} lock ${$}`);await z0(j0);continue}try{return await o0(l($,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
3
3
|
`,"utf8"),await Z()}finally{await u($)}}}function c(J,Q){return B0(`${J}.mutation`,"discovery mutation",Q)}function O0(J,Q){return B0(J,"startup",Q)}async function w(J,Q){try{let Z=await fetch(Q?.authToken?W1(J):U0(J),{headers:Q?.authToken?{authorization:`Bearer ${Q.authToken}`}:void 0});if(!Z.ok)return;let $=await Z.json();if(typeof $.protocolVersion!=="string"||typeof $.host!=="string"||typeof $.port!=="number"||typeof $.url!=="string")return;return{protocolVersion:$.protocolVersion,minClientProtocolVersion:typeof $.minClientProtocolVersion==="string"?$.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof $.maxClientProtocolVersion==="string"?$.maxClientProtocolVersion:void 0,capabilities:Array.isArray($.capabilities)?$.capabilities.filter((X)=>typeof X==="string"):void 0,coreVersion:typeof $.coreVersion==="string"?$.coreVersion:void 0,buildId:typeof $.buildId==="string"?$.buildId:void 0,buildEpochMs:typeof $.buildEpochMs==="number"?$.buildEpochMs:void 0,host:$.host,port:$.port,url:$.url,hubId:typeof $.hubId==="string"?$.hubId:void 0,authToken:typeof $.authToken==="string"?$.authToken:void 0,pid:typeof $.pid==="number"?$.pid:void 0,startedAt:typeof $.startedAt==="string"?$.startedAt:void 0,updatedAt:typeof $.updatedAt==="string"?$.updatedAt:void 0}}catch{return}}function A0(J,Q,Z="/hub"){return new URL(`ws://${J}:${Q}${Z}`).toString()}function U0(J){let Q=new URL(J);return Q.protocol=Q.protocol==="wss:"?"https:":"http:",Q.pathname="/health",Q.search="",Q.toString()}function W1(J){let Q=new URL(U0(J));return Q.pathname="/status",Q.toString()}import{CLINE_HUB_DEV_PORT as G1,CLINE_HUB_PORT as q1,resolveClineBuildEnv as F1}from"@cline/shared";var L1="CLINE_HUB_HOST",B1="CLINE_HUB_PORT",O1="CLINE_HUB_PATHNAME",A1="127.0.0.1",U1=q1,M1="/hub";function M0(J){return F1(J)==="development"?G1:U1}function f1(J={}){return(J.env??process.env)[L1]?.trim()||A1}function C1(J={}){let Z=(J.env??process.env)[B1]?.trim();if(!Z)return M0(J);let $=Number.parseInt(Z,10);if(!Number.isInteger($)||$<1||$>65535)return M0(J);return $}function x1(J={}){return(J.env??process.env)[O1]?.trim()||M1}function f0(J={},Q={}){return{host:J.host??f1(Q),port:J.port??C1(Q),pathname:J.pathname??x1(Q)}}import{join as _1}from"node:path";import{processWorkspaceInfo as J4}from"@cline/shared";import Z4 from"simple-git";var D1="shared:cline",R1="CLINE_HUB_DISCOVERY_PATH",E1="hub-production";function D(J=D1){return q0(`${J}@${C()}`)}function H(){return{ownerId:E1,discoveryPath:process.env[R1]?.trim()||_1(_(),"locks","hub","production.json")}}var u1=8000,p1=200,C0=3000,l1=100,c1=[100,250,500,1000,2000],i1="--cline-hub-daemon",n1=3,s1=60000,x0=new Map;function t1(J,Q=Date.now()){let Z=x0.get(J);if(!Z||Q-Z.windowStartedAt>s1)return x0.set(J,{count:1,windowStartedAt:Q}),!0;return Z.count+=1,Z.count<=n1}function d1(J){return[...J.host?["--host",J.host]:[],...typeof J.port==="number"?["--port",String(J.port)]:[],...J.pathname?["--pathname",J.pathname]:[]]}function a1(){try{let J=y1(_(),"logs","hub-daemon.log");return T1(k1(J),{recursive:!0}),{fd:I1(J,"a"),logPath:J}}catch{return}}function o1(){return R0()==="production"?H():D()}function R(J){return P(J)}function r1(J){try{let Q=JSON.parse(P1(`${J}.superseded`,"utf8"));return{url:typeof Q.url==="string"?Q.url:void 0,authToken:typeof Q.authToken==="string"?Q.authToken:void 0,pid:typeof Q.pid==="number"?Q.pid:void 0}}catch{return}}function i(J){try{w1(`${J}.superseded`)}catch{}}function _0(J,Q,Z){if(!Q||Q.url!==Z)return J;return{...J,authToken:J.authToken??Q.authToken,pid:J.pid??Q.pid}}async function E(J,Q){try{return await w(J,{authToken:Q})}catch{return}}async function D0(J,Q){let Z=Date.now()+Q;while(Date.now()<Z){if(!(await E(J))?.url)return!0;await new Promise((X)=>setTimeout(X,l1))}return!1}async function s(J,Q){if(!t1(J.url))return!1;await S(J.url,J.authToken,"retired by newer install").catch(()=>!1),await b(J.url,J.authToken).catch(()=>!1);let Z=await D0(J.url,C0);if(!Z&&J.pid&&e1(J.pid)){try{process.kill(J.pid,"SIGTERM")}catch{}Z=await D0(J.url,C0)}if(Z)await x(Q).catch(()=>{return});return Z}function e1(J){try{return process.kill(J,0),!0}catch(Q){return Q?.code==="EPERM"}}async function J2(J){try{return(await t(J.url,J.authToken)).activeSessionCount>0}catch{return!1}}async function n(J,Q){if(R(J))return"reusable";let Z=await S(J.url,J.authToken,"retired by newer install").catch(()=>!1);if(await J2(J)){if(Z)await S(J.url,J.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let $=await s(J,Q);if(!$&&Z)await S(J.url,J.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return $?"retired":"failed"}async function Q2(J){if(R0()!=="production")return;let Q=D();if(Q.discoveryPath===J.discoveryPath)return;let Z=await O(Q.discoveryPath);if(Z?.url)await s(Z,Q.discoveryPath);else await x(Q.discoveryPath).catch(()=>{return})}function Z2(){let J=import.meta.url.endsWith(".ts")?"ts":"js";return b1(new URL(`./entry.${J}`,import.meta.url))}function $2(J,Q){let Z=Z2(),$=process.execPath?.trim();if(!$)throw Error("unable to resolve runtime executable for hub daemon");let X=H1($).toLowerCase().includes("bun"),j=Z.startsWith("/$bunfs/"),V=X&&Z.toLowerCase().endsWith(".ts"),N=j?[i1]:[...V?["--conditions=development"]:[],Z];return{launcher:$,args:[...N,"--cwd",J,...d1(Q),...Q.manageConnectors===!1?["--no-connectors"]:[]],cwd:J,env:{...v1(process.env),CLINE_NO_INTERACTIVE:"1",[h1]:"1"}}}function X2(J){if(!J||typeof J!=="object")return!1;if(("code"in J?J.code:void 0)==="ETXTBSY")return!0;let Z="message"in J?J.message:void 0;return typeof Z==="string"&&Z.includes("ETXTBSY")}function j2(J,Q={}){if(m1())return;let Z=$2(J,Q),$=a1();try{S1(Z.launcher,Z.args,{detached:!0,stdio:$?["ignore",$.fd,$.fd]:"ignore",env:Z.env,cwd:Z.cwd,windowsHide:!0}).unref()}finally{if($)g1($.fd)}}async function z2(J,Q={}){for(let Z=0;;Z++)try{j2(J,Q);return}catch($){let X=c1[Z];if(!X2($)||X===void 0)throw $;await new Promise((j)=>setTimeout(j,X))}}async function V2(J,Q,Z={}){let $=Z.host!==void 0||Z.port!==void 0||Z.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),X=f0(Z),j=A0(X.host,X.port,X.pathname),V=(W)=>{if(!$)y(W.url,W.authToken);return W};await Q2(J).catch(()=>{return});let N=await O(J.discoveryPath),Y=N?.url?void 0:r1(J.discoveryPath),K=!1;if(N?.url){let W=N.authToken;if(!W)K=!0,await s(N,J.discoveryPath);else{let G=await E(N.url,W);if(G?.url&&R(G)&&await A(G.url,{authToken:W}))return i(J.discoveryPath),V({url:G.url,authToken:W});if(G?.url){if(await n({...G,authToken:W},J.discoveryPath)==="deferred_busy"&&await A(G.url,{authToken:W}))return V({url:G.url,authToken:W})}else await x(J.discoveryPath).catch(()=>{return})}}let z=await E(j);if(z?.url){let W=_0(z,N??Y,j);if(R(z)){let L=[z.authToken,N?.authToken,Y?.authToken].filter((f)=>typeof f==="string"&&f.trim().length>0);for(let f of L){if(!await A(z.url,{authToken:f}))continue;let c0={hubId:z.hubId??`repaired-${z.port}`,protocolVersion:z.protocolVersion,minClientProtocolVersion:z.minClientProtocolVersion,maxClientProtocolVersion:z.maxClientProtocolVersion,capabilities:z.capabilities,coreVersion:z.coreVersion,buildId:z.buildId,authToken:f,host:z.host,port:z.port,url:z.url,pid:z.pid??N?.pid??Y?.pid,startedAt:z.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await F0(J.discoveryPath,c0)}catch{}return i(J.discoveryPath),V({url:z.url,authToken:f})}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.${K?" 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 G=await n(W,J.discoveryPath);if(G==="deferred_busy"){for(let L of[W.authToken,N?.authToken].filter((M)=>typeof M==="string"&&M.trim().length>0))if(await A(z.url,{authToken:L}))return V({url:z.url,authToken:L});if(Z.allowPortFallback!==!0&&X.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(G==="failed"&&Z.allowPortFallback!==!0&&X.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 B=Z.allowPortFallback===!0&&X.port!==0?{...X,port:0}:X;await z2(Q,{...B,manageConnectors:Z.manageConnectors});let U=Date.now()+u1;while(Date.now()<U){let W=await O(J.discoveryPath);if(W?.url&&W.authToken){let L=await E(W.url,W.authToken);if(L?.url&&R(L)&&await A(L.url,{authToken:W.authToken}))return i(J.discoveryPath),V({url:L.url,authToken:W.authToken})}let G=await E(j);if(G?.url&&!R(G)){let L=_0(G,W??Y,j),M=await n(L,J.discoveryPath);if(M==="deferred_busy"&&W?.authToken&&await A(G.url,{authToken:W.authToken}))return V({url:G.url,authToken:W.authToken});if(M==="failed"&&Z.allowPortFallback!==!0&&X.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((L)=>setTimeout(L,p1))}throw Error("Timed out waiting for detached hub startup.")}async function k(J,Q={}){let Z=o1();return await O0(Z.discoveryPath,async()=>V2(Z,J,Q))}function q2(){return K2()==="production"?H():D()}function F2(){let J=globalThis.WebSocket;if(!J)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return J}function P0(J){if(typeof J==="string")return J;if(J instanceof Uint8Array)return Buffer.from(J).toString();if(J instanceof ArrayBuffer)return Buffer.from(J).toString();if(Array.isArray(J))return Buffer.concat(J.map((Q)=>Buffer.from(Q))).toString();if(J&&typeof J==="object"&&"data"in J&&typeof J.data<"u")return P0(J.data);return String(J)}function L2(J){if(typeof J==="string")return J;if(J instanceof Uint8Array)return Buffer.from(J).toString("utf8");if(J instanceof ArrayBuffer)return Buffer.from(J).toString("utf8");return""}function E0(J){let Q=J,Z=L2(Q.reason);return new q("hub_connection_closed",Q.code||Z?`Hub connection closed (code=${Q.code??0}${Z?`, reason=${Z}`:""})`:a,{closeCode:Q.code,closeReason:Z||void 0})}function S0(J,Q){if(J instanceof q)return J;if(J instanceof Error)return new q("hub_connect_failed",J.message);if(J&&typeof J==="object"&&"error"in J&&J.error instanceof Error)return new q("hub_connect_failed",J.error.message);let Z=J&&typeof J==="object"&&"message"in J&&typeof J.message==="string"?J.message.trim():"";if(Z)return new q("hub_connect_failed",Z);let $=J&&typeof J==="object"&&"type"in J&&typeof J.type==="string"?J.type.trim():"";return new q("hub_connect_failed",$?`Failed to connect to hub at ${Q.toString()} (${$} event before socket open).`:`Failed to connect to hub at ${Q.toString()}.`)}var d="*",h=8000,B2="cline-hub-auth.",w0=new Map,H0=new Set,O2=3000;var a="Hub connection closed",A2=250,U2=5000,g0=0.5;class q extends Error{code;details;constructor(J,Q,Z){super(Q);this.code=J;this.details=Z;this.name="HubTransportError"}}function M2(J){return J instanceof q}class o extends Error{command;code;constructor(J,Q,Z){super(Z);this.command=J;this.code=Q;this.name="HubCommandError"}}function e(J,Q={}){let Z=J.searchParams.get("authToken")?.trim();if(J.searchParams.delete("authToken"),Z)return Z;if(Q.skipRegistry)return;let $=J0(J.toString());return $?w0.get($):void 0}function f2(J){try{let Z=new URL(J).hostname.toLowerCase().replace(/^\[|\]$/g,"");return Z==="localhost"||Z==="127.0.0.1"||Z==="::1"}catch{return!1}}function J0(J){if(!f2(J))return;let Q=new URL(k0(J));return Q.search="",Q.hash="",Q.toString()}function T0(J){let Q=J0(J);return!!Q&&H0.has(Q)}function y(J,Q){let Z=J0(J);if(Z){if(H0.add(Z),Q?.trim())w0.set(Z,Q)}return J}class Q0{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 q("hub_connection_closed",a);sawSocketClose=!1;registered=!1;capabilities;constructor(J){this.options=J;if(J.authToken?.trim()&&J.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");this.clientId=J.clientId??`core-${Math.random().toString(36).slice(2,10)}-${Date.now().toString(36)}`,this.currentUrl=J.url,this.capabilities=[...J.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(J){if(this.capabilities=J.map((Q)=>({...Q})),!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 J=new URL(this.currentUrl),Q=this.options.authToken?.trim()||e(J,{skipRegistry:Boolean(this.options.resolveConnectionHeaders)});if(J.hash="",Q&&this.options.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");let Z=++this.connectGeneration,$=this.openSocket(J,Q,Z),X;this.connectPromise=$.then(async(V)=>{if(X=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,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 N of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(N));this.reconnectAttempt=0});let j=this.connectPromise;try{await j}catch(V){if(this.connectPromise===j)this.connectPromise=void 0;if(X&&this.socket===X){this.lastCloseError=S0(V,J),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{X.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw V}}async openSocket(J,Q,Z){let $=this.options.resolveConnectionHeaders,X;if($){let Y;try{X=await Promise.race([Promise.resolve().then(()=>$()),new Promise((K,z)=>{Y=setTimeout(()=>{z(new q("hub_connect_timeout",`Timed out resolving hub connection headers after ${h}ms`))},h)})])}catch(K){let z=K instanceof q?K:new q("hub_connect_failed",K instanceof Error?K.message:String(K));if(Z===this.connectGeneration)this.lastCloseError=z;throw z}finally{clearTimeout(Y)}}if(Z!==this.connectGeneration||this.closedByClient)throw this.lastCloseError;if(X&&Object.keys(X).some((Y)=>Y.toLowerCase()==="sec-websocket-protocol")){let Y=new q("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(Z===this.connectGeneration)this.lastCloseError=Y;throw Y}let j=X?new G2(J.toString(),{headers:{...X}}):new(F2())(J.toString(),Q?[`${B2}${Q}`]:void 0);this.socket=j;let V=!1,N=new Promise((Y,K)=>{let z=!1,F=setTimeout(()=>{if(z)return;z=!0,V=!0;let B=new q("hub_connect_timeout",`Timed out connecting to hub after ${h}ms`);if(this.socket===j)this.lastCloseError=B,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{j.close()}catch{}K(B)},h);j.addEventListener("open",()=>{if(z)return;z=!0,clearTimeout(F),Y()}),j.addEventListener("error",(B)=>{if(z)return;z=!0,clearTimeout(F);let U=S0(B,J);if(this.socket===j)this.lastCloseError=U,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;K(U)}),j.addEventListener("close",(B)=>{if(z)return;z=!0,clearTimeout(F);let U=V?this.lastCloseError:E0(B);if(this.socket===j){if(!V)this.lastCloseError=U,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}K(U)})});return j.addEventListener("message",(Y)=>{this.handleFrame(JSON.parse(P0(Y)))}),j.addEventListener("close",(Y)=>{if(this.socket!==j)return;if(!V)this.lastCloseError=E0(Y),this.sawSocketClose=!0;this.registered=!1;for(let K of this.pendingReplies.values())K.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await N,j}subscribe(J,Q){let Z=Q?.sessionId?.trim()||void 0,$={listener:J,sessionId:Z};return this.listeners.add($),this.adjustSubscriptionCount(Z,1),()=>{if(!this.listeners.delete($))return;this.adjustSubscriptionCount(Z,-1)}}async command(J,Q,Z,$){let X=0,j=J!=="client.register"&&J!=="client.unregister";while(!0)try{return await this.commandOnce(J,Q,Z,$)}catch(V){if(!j||X>=1||!await this.recoverLocalHubTransport(V))throw V;X+=1}}async commandOnce(J,Q,Z,$,X=!0){if(X)await this.connect();$?.beforeDispatch?.();let j=Y2("hubreq_"),V=W2(J,$?.timeoutMs),N=new Promise((K,z)=>{let F=V===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(j))return;z(new o(J,"hub_command_timeout",`Hub command ${J} 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:(B)=>{if(F)clearTimeout(F);K(B)},reject:(B)=>{if(F)clearTimeout(F);z(B)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:J,requestId:j,clientId:this.clientId,sessionId:Z,timeoutMs:V,payload:Q}})}catch(K){throw this.pendingReplies.delete(j),K}let Y=await N;if(!Y.ok){if(Y.error?.code===$0){let K=Z??(typeof Q?.sessionId==="string"?Q.sessionId:void 0);throw new v(K,Y.error.message)}throw new o(J,Y.error?.code,Y.error?.message??`Hub command ${J} failed`)}return Y}async recoverLocalHubTransport(J){if(!T0(this.currentUrl)||!M2(J))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let Q=await I0({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!Q)return!1;return this.currentUrl=Q,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 J=Math.min(A2*2**this.reconnectAttempt,U2),Q=Math.round(J*(1-g0)+Math.random()*J*g0);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},Q)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!T0(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let J=await I0({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd});if(J){this.currentUrl=J,await this.connect(),this.reconnectAttempt=0;return}}catch{}this.reconnectAttempt+=1,this.scheduleReconnect()}}close(){let J=this.socket;if(this.closedByClient=!0,this.connectGeneration+=1,this.clearReconnectTimer(),this.registered=!1,J)this.lastCloseError=new q("hub_connection_closed",a);for(let Q of this.pendingReplies.values())Q.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,!J)return;this.sawSocketClose=!1,this.socket=void 0;try{J.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(J){if(!this.socket||this.socket.readyState!==1){if(this.lastCloseError.code==="hub_connection_closed"&&!this.sawSocketClose)throw new q("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify(J))}sendSubscriptionFrame(J,Q){let Z=J==="stream.subscribe"?this.lastEventSequenceByKey.get(this.subscriptionKeyForSessionId(Q)):void 0;this.sendFrame({kind:J,clientId:this.clientId,...Q?{sessionId:Q}:{},...Z!==void 0?{sinceSequence:Z}:{}})}adjustSubscriptionCount(J,Q){let Z=this.subscriptionKeyForSessionId(J),$=(this.subscriptionCounts.get(Z)??0)+Q;if($<=0){if(this.subscriptionCounts.delete(Z),!this.hasActiveSubscriptions())this.clearReconnectTimer();if(Q<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",J);return}if(this.subscriptionCounts.set(Z,$),Q>0&&$===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",J)}subscriptionKeyForSessionId(J){return J??d}subscriptionSessionIdFromKey(J){return J===d?void 0:J}handleFrame(J){switch(J.kind){case"reply":{let Q=J.envelope.requestId;if(!Q)return;let Z=this.pendingReplies.get(Q);if(!Z)return;this.pendingReplies.delete(Q),Z.resolve(J.envelope);return}case"event":{let Q=J.envelope.sequence;if(typeof Q==="number"){let Z=J.envelope.sessionId?.trim();for(let $ of[d,Z]){if(!$||!this.subscriptionCounts.has($))continue;let X=this.lastEventSequenceByKey.get($)??0;if(Q>X)this.lastEventSequenceByKey.set($,Q)}}for(let Z of this.listeners){if(Z.sessionId&&Z.sessionId!==J.envelope.sessionId?.trim())continue;Z.listener(J.envelope)}return}case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function k0(J){let Q=new URL(J);if(Q.protocol==="http:")Q.protocol="ws:";else if(Q.protocol==="https:")Q.protocol="wss:";return Q.toString()}async function A(J,Q){let Z=new Q0({url:J,authToken:Q?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:Q?.workspaceRoot,cwd:Q?.cwd});try{return await Z.connect(),!0}catch{return!1}finally{Z.close()}}async function r(J,Q){let Z=k0(J),$=await w(Z,{authToken:Q?.authToken});if(!$)return{status:"unreachable",url:Z};if(Q?.requireCurrentBuild){let X=C(),j=I($,X);if(!j.compatible&&!P($))return{status:j.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:Z}}else if(!N2($).compatible)return{status:"protocol_mismatch",url:Z};if(Q?.verifyConnection===!0&&!await A(Z,{workspaceRoot:Q.workspaceRoot,cwd:Q.cwd,authToken:Q.authToken}))return{status:"unreachable",url:Z};return{status:"compatible",url:Z}}function C2(J){let Q=J&&typeof J==="object"&&Array.isArray(J.sessions)?J.sessions:[],Z=0,$=new Set;for(let X of Q){if(!X||typeof X!=="object")continue;let j=X.participants;if(!Array.isArray(j)||j.length===0)continue;Z+=1;for(let V of j){let N=V&&typeof V==="object"?V.clientId:void 0;if(typeof N==="string"&&N.trim())$.add(N)}}return{activeSessionCount:Z,participantClientCount:$.size}}async function t(J,Q,Z){let $=new Q0({url:J,authToken:Q,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:Z?.workspaceRoot,cwd:Z?.cwd});try{let X=await $.command("session.list",{limit:500},void 0,{timeoutMs:O2});return C2(X.payload)}finally{await $.dispose().catch(()=>{return})}}async function x2(J,Q,Z){try{return(await t(J,Q,Z)).activeSessionCount===0}catch{return!1}}async function _2(J,Q){let Z=`${J.discoveryPath}.superseded`,$=await O(Z);if(!$?.url||!$.authToken)return;let X=await r($.url,{authToken:$.authToken});if(X.status!=="compatible")return;if(await x2(X.url,$.authToken,Q))return;return y(X.url,$.authToken)}async function D2(J={}){if(J.endpoint?.trim()){let X=await r(J.endpoint);return X.status==="compatible"?X.url:void 0}let Q=q2(),Z=await O(Q.discoveryPath);if(!Z?.url)return await _2(Q,J);let $=await r(Z.url,{authToken:Z.authToken,requireCurrentBuild:!0});if($.status==="compatible")return y($.url,Z.authToken);if($.status==="protocol_mismatch")await x(Q.discoveryPath).catch(()=>{return});return}async function I0(J={}){let Q=await D2(J);if(Q&&await A(Q,{workspaceRoot:J.workspaceRoot,cwd:J.cwd}))return Q;if(J.endpoint?.trim())return;try{return(await k(J.workspaceRoot??process.cwd())).url}catch{return}}async function S(J,Q,Z,$){let X=new URL(J),j=Q?.trim()||e(X);if(X.protocol==="ws:")X.protocol="http:";else if(X.protocol==="wss:")X.protocol="https:";if(X.pathname="/drain",X.hash="",Z)X.searchParams.set("reason",Z);if($?.off)X.searchParams.set("off","1");return(await fetch(X,{method:"POST",headers:j?{authorization:`Bearer ${j}`}:void 0})).ok}async function b(J,Q){let Z=new URL(J),$=Q?.trim()||e(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:$?{authorization:`Bearer ${$}`}:void 0})).ok}import{spawn as R2}from"node:child_process";import{userInfo as E2}from"node:os";import{basename as S2,delimiter as m}from"node:path";var Z0="__CLINE_SIDECAR_PATH_START__",b0="__CLINE_SIDECAR_PATH_END__",h0=5000,g2=`/bin/sh -c 'printf "%s%s%s" "${Z0}" "$PATH" "${b0}"'`,y0="CLINE_SIDECAR_SKIP_SHELL_PATH";function m0(J){return J==="darwin"?"/bin/zsh":"/bin/bash"}function T2(J,Q){try{let Z=E2().shell?.trim();if(Z)return Z}catch{}return Q.SHELL?.trim()||m0(J)}function I2(J,Q){let Z=S2(J);if(Z==="csh"||Z==="tcsh")return{args:["-c",Q],argv0:`-${Z}`};return{args:["-i","-l","-c",Q]}}function P2(J){let Q=J.indexOf(Z0);if(Q===-1)return;let Z=J.indexOf(b0,Q);if(Z===-1)return;let $=J.slice(Q+Z0.length,Z).trim();return $.length>0?$:void 0}function w2(J,Q){let Z=[...J.split(m),...Q.split(m)].map(($)=>$.trim()).filter(($)=>$.length>0);return Array.from(new Set(Z)).join(m)}function H2(J,Q=h0){return new Promise((Z)=>{let $=I2(J,g2),X=R2(J,$.args,{argv0:$.argv0,stdio:["ignore","pipe","ignore"],detached:!0}),j="",V=0,N=()=>{try{if(X.pid)process.kill(-X.pid,"SIGKILL")}catch{X.kill("SIGKILL")}},Y=!1,K=(F)=>{if(Y)return;Y=!0,clearTimeout(z),X.stdout?.destroy(),N(),Z(F)},z=setTimeout(()=>{try{if(X.pid)process.kill(-X.pid,"SIGKILL")}catch{X.kill("SIGKILL")}K(void 0)},Q);X.stdout?.on("data",(F)=>{if(Y)return;if(V+=F.length,V>65536){K(void 0);return}j+=F.toString("utf8")}),X.on("error",()=>K(void 0)),X.on("close",()=>K(P2(j)))})}async function v0(J){let Q=J?.platform??process.platform,Z=J?.env??process.env;if(Q==="win32")return{status:"skipped",reason:"windows"};if(Z[y0]?.trim())return{status:"skipped",reason:y0};let $=J?.userShell??T2(Q,Z),X=J?.fallbackShell??m0(Q),j=J?.timeoutMs??h0,V=$===X?[[$,j]]:[[$,j],[X,j/2]];for(let[N,Y]of V){let K=await H2(N,Y);if(!K)continue;let z=w2(K,Z.PATH??"");return Z.PATH=z,{status:"applied",pathEntries:z.split(m).length,shell:N}}return{status:"failed",shell:$}}var u0={readHubDiscovery:O,clearHubDiscoveryIfOwned:L0,probeProcess:(J)=>{process.kill(J,0)},requestHubShutdown:b,ensureDetachedHubServer:k,claimHubDaemonProcess:y2,loadHubDaemon:()=>import("@cline/core/hub/daemon-entry"),ensureLoginShellPath:v0,setHomeDirIfUnset:b2,homeDir:k2,cwd:()=>process.cwd(),env:process.env,writeOutput:(J)=>process.stdout.write(J)};function p0(J,Q){let Z=J.indexOf(Q);return(Z>=0?J[Z+1]:void 0)?.trim()||void 0}function l0(J,Q){let Z=p0(J,"--discovery-path");if(!Z)throw Error("--discovery-path is required for remote Hub management");return Q.env.CLINE_HUB_DISCOVERY_PATH=Z,Z}async function h2(J=process.argv,Q=u0){Q.setHomeDirIfUnset(Q.homeDir()),await Q.ensureLoginShellPath();let Z=p0(J,"--cwd")??Q.cwd();l0(J,Q);let $=await Q.ensureDetachedHubServer(Z,{host:"127.0.0.1",port:0,pathname:"/hub",allowPortFallback:!0,manageConnectors:!1});Q.writeOutput(`${JSON.stringify({...$,cwd:Z,platform:process.platform,arch:process.arch})}
|
|
4
4
|
`)}async function b4(J=process.argv,Q=u0){if(J.includes("--remote-hub-stop")){let Z=l0(J,Q),$=await Q.readHubDiscovery(Z);if($&&typeof $.pid==="number"&&Number.isInteger($.pid)&&$.pid>0)try{Q.probeProcess($.pid)}catch(X){if(X?.code==="ESRCH")return await Q.clearHubDiscoveryIfOwned(Z,$.hubId),!0}if($&&!await Q.requestHubShutdown($.url,$.authToken))throw Error("Remote Hub shutdown failed");return!0}if(J.includes("--remote-hub-ensure"))return await h2(J,Q),!0;if(Q.claimHubDaemonProcess())return await Q.loadHubDaemon(),!0;return!1}export{h2 as runRemoteHubEnsure,b4 as runRemoteHelperEntrypoint};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cline/core",
|
|
3
3
|
"description": "Cline Core SDK for Node Runtime",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.85",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/cline/cline",
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
"test:watch": "vitest --config vitest.config.ts"
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"@cline/agents": "0.0.
|
|
61
|
-
"@cline/shared": "0.0.
|
|
62
|
-
"@cline/llms": "0.0.
|
|
60
|
+
"@cline/agents": "0.0.85",
|
|
61
|
+
"@cline/shared": "0.0.85",
|
|
62
|
+
"@cline/llms": "0.0.85",
|
|
63
63
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
64
64
|
"@opentelemetry/api": "^1.9.0",
|
|
65
65
|
"@opentelemetry/api-logs": "^0.214.0",
|