@cline/core 0.0.80 → 0.0.81
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
|
@@ -191,7 +191,7 @@ Searched ${D} files.`;let z=[`Found ${F.length} result${F.length===1?"":"s"} for
|
|
|
191
191
|
|
|
192
192
|
...[assistant text truncated: omitted ${$} chars due to repeated tool-call markup]...
|
|
193
193
|
|
|
194
|
-
`;function eG($=process.env){return{maxToolResultChars:tG($[_J.maxToolResultChars]),maxTotalTextBytes:tG($[_J.maxTotalTextBytes]),minOutdatedRewriteBytes:SP($[_J.minOutdatedRewriteBytes])}}class OJ{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=i8($.maxToolResultChars,NP),this.maxFileContentChars=i8($.maxFileContentChars,qP),this.maxTotalTextBytes=i8($.maxTotalTextBytes,AP),this.mediaBudget=$.mediaBudget??{},this.maxAssistantTextChars=i8($.maxAssistantTextChars,TP),this.maxAssistantToolMarkupChars=i8($.maxAssistantToolMarkupChars,EP),this.minOutdatedRewriteBytes=bP($.minOutdatedRewriteBytes,MP)}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 Y=iG(X.content);if(Y!==X.content)return{...X,content:Y}}if(X.role==="assistant"&&typeof X.content==="string"){let Y=this.truncateAssistantText(X.content);if(Y!==X.content)return{...X,content:Y}}return X}let W=!1,j=X.content.map((Y)=>{let V=this.transformBlock(Y,X.role);if(V!==Y)W=!0;return V});return W?{...X,content:j}:X}),J=this.applyMediaBudget(Q);return this.truncateToTotalTextBudget(J)}transformBlock($,Z){if(Z==="user"&&$.type==="text"&&typeof $.text==="string"){let X=iG($.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=C6($.content,this.maxFileContentChars,nG);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 j=this.getReadLocators($).filter((Y)=>X.has(this.toReadLocatorKey(Y))&&this.isOutdatedReadLocator(Y,$.tool_use_id));if(j.length>0)J=this.replaceOutdatedReadContent(J,j)}}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 j=W.name.toLowerCase();if(this.toolNameByIdCache.set(W.id,j),this.isReadTool(j)){let Y=this.extractLocatorsFromReadToolInput(W.input);if(Y.length>0)this.readLocatorsByToolUseIdCache.set(W.id,Y)}}else if(W.type==="tool_result"){let j=this.resolveToolName(W);if(!this.isReadTool(j)||W.is_error===!0)continue;let Y=this.getReadLocators(W);for(let V of Y)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 j=this.resolveToolName(W);if(!this.isReadTool(j))continue;Q.add(W.tool_use_id);let Y=this.committedOutdatedRewrites.get(W.tool_use_id),V=new Set,K=new Set;for(let G of this.getReadLocators(W)){let H=this.toReadLocatorKey(G);if(!this.isOutdatedReadLocator(G,W.tool_use_id))continue;if(K.add(H),!Y?.has(H))V.add(H)}if(Y){for(let G of Y)if(!K.has(G))Y.delete(G);if(Y.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 j=this.committedOutdatedRewrites.get(X);if(!j)j=new Set,this.committedOutdatedRewrites.set(X,j);for(let Y of W)j.add(Y)}}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?D0(this.truncateMiddle(V)):0}let B=Array.isArray(K)?K:[K],G=0;for(let H of B){let U=this.extractLocatorFromResultEntry(H);if(U&&Z.has(this.toReadLocatorKey(U)))G+=this.providerBoundEntryBytes(H)}return G};if(typeof $==="string")return X($);let W=new Set(Z),j=0;for(let V of $)if(V.type==="text")j+=this.countOutdatedImageEntries(V.text,W);let Y=0;for(let V of $)if(V.type==="text")Y+=X(V.text);else if(V.type==="image"){if(j>0)j-=1,Y+=D0(V.data)}else if(k$(V)){let K=this.extractLocatorFromResultEntry(V);if(K&&Z.has(this.toReadLocatorKey(K)))Y+=this.providerBoundEntryBytes(V)}else if(V.type==="file"){if(Z.has(this.toReadLocatorKey({path:V.path,startLine:null,endLine:null})))Y+=D0(this.truncateMiddle(V.content))}return Y}providerBoundEntryBytes($){let Z=this.truncateNestedStrings($);return D0(JSON.stringify(Z))}addMissingToolResults($){let Z=this.collectToolResultIds($),Q=[],J=new Map,X=!1,W=()=>{if(J.size===0)return;j(this.createMissingToolResultMessage(J)),J.clear(),X=!0},j=(Y)=>{let V=Q.at(-1);if(this.shouldMergeUserAfterToolResults(V,Y)){Q[Q.length-1]={...V,content:[...V.content,...this.contentBlocksForUserMerge(Y.content)]},X=!0;return}Q.push(Y)};for(let Y of $){if(this.isToolResultOnlyMessage(Y)){if(j(this.appendMissingToolResults(Y,J)),J.size>0)J.clear(),X=!0;continue}if(Array.isArray(Y.content)){let V=Y.content.filter((B)=>B.type==="tool_result"),K=Y.content.filter((B)=>B.type!=="tool_result");if(V.length>0){let B=this.appendMissingToolResults({...Y,role:"user",content:V},J);if(j(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?{...Y,content:K}:Y;if(j(B),B.role==="assistant")this.trackMissingToolCalls(B,Z,J)}continue}W(),j(Y)}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 $?`${aG} Tool: ${$}.`:aG}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(k$(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)??q2;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:q2}}if(W.type==="image"){if(X===0)return W;return X-=1,{type:"text",text:q2}}if(k$(W))return this.replaceOutdatedReadEntry(W,Q);if(W.type!=="text")return W;let j=this.replaceOutdatedInString(W.text,Q);if(j===null)return{...W,text:q2};return j===W.text?W:{...W,text:j}})}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 j=W,Y=this.extractLocatorFromResultEntry(j);if(!Y)continue;if(!Z.has(this.toReadLocatorKey(Y)))continue;if(j.result==="Successfully read image"||j.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=q2;else if(typeof J.content==="string")J.content=q2;else J.result=q2;return J}isReadTool($){return!!$&&CP.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(k$(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(NJ($))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 C6($,this.maxToolResultChars,nG)}truncateAssistantText($){if(this.hasRepeatedToolCallMarkup($))return C6($,this.maxAssistantToolMarkupChars,fP);return C6($,this.maxAssistantTextChars,PP)}hasRepeatedToolCallMarkup($){if($.length<=this.maxAssistantToolMarkupChars)return!1;let Z=0;for(let Q of $.matchAll(wP))if(Z+=1,Z>=RP)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)=>xP(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 j=Z-this.maxTotalTextBytes,Y=Math.max(X.minBytes,W-j),V=kP(X.get(),Y,X.makeMarker);X.set(V),Z-=W-D0(V)}return Q}countMessageTextBytes($){let Z=0;for(let Q of $){if(typeof Q.content==="string"){Z+=D0(Q.content);continue}for(let J of Q.content)if(J.type==="text")Z+=D0(J.text);else if(J.type==="thinking")Z+=D0(J.thinking);else if(J.type==="file")Z+=D0(J.content);else if(J.type==="tool_use")Z+=Q7(J.input);else if(J.type==="tool_result"){if(typeof J.content==="string")Z+=D0(J.content);else for(let X of J.content)if(X.type==="text")Z+=D0(X.text);else if(X.type==="file")Z+=D0(X.content);else if(k$(X))Z+=Q7(X)}}return Z}collectTruncationCandidates($){let Z=[],Q=[];for(let J of $){if(J.role==="assistant"&&typeof J.content==="string"){Z.push({byteLength:D0(J.content),minBytes:rG,makeMarker:oG,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"){J7(X.input,Q);continue}if(J.role==="assistant"&&X.type==="text"){Z.push({byteLength:D0(X.text),minBytes:rG,makeMarker:oG,get:()=>X.text,set:(W)=>{X.text=W}});continue}if(X.type!=="tool_result")continue;if(typeof X.content==="string"){Z.push({byteLength:D0(X.content),minBytes:r8,makeMarker:a8,get:()=>X.content,set:(W)=>{X.content=W}});continue}for(let W of X.content)if(W.type==="text")Z.push({byteLength:D0(W.text),minBytes:r8,makeMarker:a8,get:()=>W.text,set:(j)=>{W.text=j}});else if(W.type==="file")Z.push({byteLength:D0(W.content),minBytes:r8,makeMarker:a8,get:()=>W.content,set:(j)=>{W.content=j}});else if(k$(W))J7(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=_P(),J=!1,X=$.map((W)=>{if(!Array.isArray(W.content))return W;let j=!1,Y=W.content.map((V)=>{let K=this.applyMediaBudgetToBlock(V,Z,Q);if(K!==V)j=!0;return K});if(!j)return W;return J=!0,{...W,content:Y}});return J?X:$}resolveMediaBudget(){return zP(this.mediaBudget)}applyMediaBudgetToBlock($,Z,Q){if(zJ($))return this.limitImageContent($,Z,Q);if($.type!=="tool_result"||typeof $.content==="string")return $;let J=!1,X=$.content.map((W)=>{let j=this.applyMediaBudgetToToolResultEntry(W,Z,Q);if(j!==W)J=!0;return j});return J?{...$,content:X}:$}applyMediaBudgetToToolResultEntry($,Z,Q){if(zJ($))return this.limitImageContent($,Z,Q);if(k$($))return this.limitNestedMedia($,Z,Q);return $}limitNestedMedia($,Z,Q){if(zJ($)){let J=this.limitImageContent($,Z,Q);return J.type==="text"?J.text:J}if(Array.isArray($)){let J=!1,X=$.map((W)=>{let j=this.limitNestedMedia(W,Z,Q);if(j!==W)J=!0;return j});return J?X:$}if($!==null&&typeof $==="object"){let J=!1,X={};for(let[W,j]of Object.entries($)){let Y=this.limitNestedMedia(j,Z,Q);if(Y!==j)J=!0;X[W]=Y}return J?X:$}return $}limitImageContent($,Z,Q){if(!$H($))return{type:"text",text:pG};let J=OP($.mediaType,$.data,{maxImageEncodedBytes:Z.maxImageEncodedBytes,maxImageDecodedBytes:Z.maxImageDecodedBytes,maxTotalMediaBytes:Z.maxTotalMediaBytes},Q);if(!J.ok)return{type:"text",text:pG};return{...$,data:J.base64,mediaType:J.mediaType}}}var sG=String.raw`[\|\uFF5C]`,wP=new RegExp(String.raw`<\s*(?:${sG}\s*)?DSML\s*(?:${sG}\s*)?(?:tool_calls|invoke)\b[^>]*>|<\s*/?\s*(?:tool_calls?|tool_call|function_calls?|function_call|invoke)\b[^>]*>`,"gi");function D0($){return Buffer.byteLength($,"utf8")}function tG($){if($===void 0)return;let Z=Number.parseInt($,10);return Number.isFinite(Z)&&Z>0?Z:void 0}function SP($){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 i8($,Z){return typeof $==="number"&&Number.isFinite($)&&$>0?Math.floor($):Z}function bP($,Z){if(typeof $!=="number"||Number.isNaN($)||$<0)return Z;return Number.isFinite($)?Math.floor($):$}function C6($,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),j=Q(W),Y=Math.max(0,Math.floor((Z-j.length)/2)),V=$.slice(0,Y),K=Y>0?$.slice(-Y):"";return`${V}${j}${K}`}function kP($,Z,Q){if(D0($)<=Z)return $;let J=0,X=$.length,W=C6($,0,Q);while(J<=X){let j=J+X>>>1,Y=C6($,j,Q);if(D0(Y)<=Z)W=Y,J=j+1;else X=j-1}return W}function xP($){if($.type==="tool_use")return{...$,input:X7($.input)};if($.type!=="tool_result"||typeof $.content==="string")return{...$};return{...$,content:$.content.map((Z)=>k$(Z)?X7(Z):{...Z})}}function k$($){if($===null||typeof $!=="object")return!1;let Z=$.type;return Z!=="text"&&Z!=="image"&&Z!=="file"}function zJ($){return $!==null&&typeof $==="object"&&$.type==="image"}function $H($){return $!==null&&typeof $==="object"&&$.type==="image"&&typeof $.data==="string"&&typeof $.mediaType==="string"}function NJ($){return $H($)}function Q7($){if(typeof $==="string")return D0($);if(Array.isArray($)){let Z=0;for(let Q of $)Z+=Q7(Q);return Z}if($!==null&&typeof $==="object"){if(NJ($))return 0;let Z=0;for(let Q of Object.values($))Z+=Q7(Q);return Z}return 0}function J7($,Z){if(Array.isArray($)){$.forEach((Q,J)=>{if(typeof Q==="string")Z.push({byteLength:D0(Q),minBytes:r8,makeMarker:a8,get:()=>$[J],set:(X)=>{$[J]=X}});else J7(Q,Z)});return}if($!==null&&typeof $==="object"){if(NJ($))return;let Q=$;for(let J of Object.keys(Q)){let X=Q[J];if(typeof X==="string")Z.push({byteLength:D0(X),minBytes:r8,makeMarker:a8,get:()=>Q[J],set:(W)=>{Q[J]=W}});else J7(X,Z)}}}function X7($){if(Array.isArray($))return $.map(X7);if($!==null&&typeof $==="object"){let Z={};for(let[Q,J]of Object.entries($))Z[Q]=X7(J);return Z}return $}function qJ(){return`conv_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}class AJ{messages=[];conversationId=qJ();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=qJ(),this.sessionStarted=!1}clearHistory(){this.messages=[],this.conversationId=qJ(),this.sessionStarted=!1}restore($){this.messages=[...$],this.sessionStarted=!1}isSessionStarted(){return this.sessionStarted}markSessionStarted(){this.sessionStarted=!0}}var x$="0.0.80";var A2={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:x$,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"}},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 QH($){let{agentConfig:Z}=$,Q=yP(Z),J=IP(Z),X=$.hooks,W=hP(Z.maxParallelToolCalls);return{distinctId:Z.distinctId,clientName:Z.extensionContext?.client?.name,clientVersion:Z.extensionContext?.client?.version,clineCoreVersion:x$,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 yP($){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 IP($){let Z=$.providerConfig?.family;return{id:$.modelId,provider:$.providerId,family:Z}}function hP($){if($===void 0)return;return $>=2?"parallel":"sequential"}function vP($){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 P6($){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 gP(){return{lastToolName:"",lastToolSignature:"",consecutiveIdenticalCount:0}}function mP($){$.lastToolName="",$.lastToolSignature="",$.consecutiveIdenticalCount=0}function TJ($){if($==null||typeof $!=="object")return $;if(Array.isArray($))return $.map(TJ);let Z={};for(let Q of Object.keys($).sort())Z[Q]=TJ($[Q]);return Z}function cP($){if($==null)return"null";if(typeof $==="string")return $;if(typeof $!=="object")return String($);try{return JSON.stringify(TJ($))}catch{return String($)}}function uP($,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 JH={softThreshold:3,hardThreshold:5};class EJ{config;state=gP();constructor($){this.config={softThreshold:$?.softThreshold??JH.softThreshold,hardThreshold:$?.hardThreshold??JH.hardThreshold}}inspect($){let Z=cP($.input),Q=uP(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(){mP(this.state)}}class MJ{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 lP(X,this.options.onLimitReached);if(W.action==="continue"){let j=W.guidance?.trim();if(j)this.options.appendRecoveryNotice(j,$.reason);return this.consecutiveMistakes=0,{action:"continue",guidance:j}}return{action:"stop",reason:W.reason?.trim()||void 0,message:dP({iteration:$.iteration,consecutiveMistakes:Q,maxConsecutiveMistakes:Z,reason:$.reason,details:$.details,stopReason:W.reason})}}reset(){this.consecutiveMistakes=0}get value(){return this.consecutiveMistakes}}function dP($){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 lP($,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 pP($){switch($){case"auto_compaction":case"manual_compaction":case"compaction_budget_emergency":return $;default:return}}function iP($){let Z=$.content.filter((Q)=>Q.type==="text");if(Z.length===0)return;return Z.map((Q)=>Q.text).join("")}function rP($){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 aP($){return $.content.find((Z)=>Z.type==="tool-result")}function nP($){switch($){case"completed":return"completed";case"aborted":return"aborted";case"failed":return"error"}}function oP($){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 RJ{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:pP($.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=iP($);if(Q!==void 0)Z.push({type:"content_end",contentType:"text",text:Q});let J=rP($);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=aP($.message),X=J?.output,W=oP(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,Y=($.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:Y===0?void 0:Y,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:nP($.status),text:$.outputText,iterations:$.iterations,usage:Z}]}}var Yf="session_run_in_progress";class VH extends Error{agentId;code=Yf;constructor($){super(`SessionRuntime.shutdown called while a run is in progress${$?` (agentId=${$})`:""}`);this.agentId=$;this.name="SessionRunInProgressError"}}function Vf($){if(typeof $==="string")return $;if($ instanceof Error)return $.message;try{return JSON.stringify($)}catch{return String($)}}async function Kf($){let Q=(typeof $.content==="function"?await $.content():$.content).trim();return Q.length>0?Q:void 0}function Bf($,Z){let Q=$.trim(),J=Z.map((X)=>X.trim()).filter(Boolean).join(`
|
|
194
|
+
`;function eG($=process.env){return{maxToolResultChars:tG($[_J.maxToolResultChars]),maxTotalTextBytes:tG($[_J.maxTotalTextBytes]),minOutdatedRewriteBytes:SP($[_J.minOutdatedRewriteBytes])}}class OJ{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=i8($.maxToolResultChars,NP),this.maxFileContentChars=i8($.maxFileContentChars,qP),this.maxTotalTextBytes=i8($.maxTotalTextBytes,AP),this.mediaBudget=$.mediaBudget??{},this.maxAssistantTextChars=i8($.maxAssistantTextChars,TP),this.maxAssistantToolMarkupChars=i8($.maxAssistantToolMarkupChars,EP),this.minOutdatedRewriteBytes=bP($.minOutdatedRewriteBytes,MP)}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 Y=iG(X.content);if(Y!==X.content)return{...X,content:Y}}if(X.role==="assistant"&&typeof X.content==="string"){let Y=this.truncateAssistantText(X.content);if(Y!==X.content)return{...X,content:Y}}return X}let W=!1,j=X.content.map((Y)=>{let V=this.transformBlock(Y,X.role);if(V!==Y)W=!0;return V});return W?{...X,content:j}:X}),J=this.applyMediaBudget(Q);return this.truncateToTotalTextBudget(J)}transformBlock($,Z){if(Z==="user"&&$.type==="text"&&typeof $.text==="string"){let X=iG($.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=C6($.content,this.maxFileContentChars,nG);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 j=this.getReadLocators($).filter((Y)=>X.has(this.toReadLocatorKey(Y))&&this.isOutdatedReadLocator(Y,$.tool_use_id));if(j.length>0)J=this.replaceOutdatedReadContent(J,j)}}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 j=W.name.toLowerCase();if(this.toolNameByIdCache.set(W.id,j),this.isReadTool(j)){let Y=this.extractLocatorsFromReadToolInput(W.input);if(Y.length>0)this.readLocatorsByToolUseIdCache.set(W.id,Y)}}else if(W.type==="tool_result"){let j=this.resolveToolName(W);if(!this.isReadTool(j)||W.is_error===!0)continue;let Y=this.getReadLocators(W);for(let V of Y)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 j=this.resolveToolName(W);if(!this.isReadTool(j))continue;Q.add(W.tool_use_id);let Y=this.committedOutdatedRewrites.get(W.tool_use_id),V=new Set,K=new Set;for(let G of this.getReadLocators(W)){let H=this.toReadLocatorKey(G);if(!this.isOutdatedReadLocator(G,W.tool_use_id))continue;if(K.add(H),!Y?.has(H))V.add(H)}if(Y){for(let G of Y)if(!K.has(G))Y.delete(G);if(Y.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 j=this.committedOutdatedRewrites.get(X);if(!j)j=new Set,this.committedOutdatedRewrites.set(X,j);for(let Y of W)j.add(Y)}}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?D0(this.truncateMiddle(V)):0}let B=Array.isArray(K)?K:[K],G=0;for(let H of B){let U=this.extractLocatorFromResultEntry(H);if(U&&Z.has(this.toReadLocatorKey(U)))G+=this.providerBoundEntryBytes(H)}return G};if(typeof $==="string")return X($);let W=new Set(Z),j=0;for(let V of $)if(V.type==="text")j+=this.countOutdatedImageEntries(V.text,W);let Y=0;for(let V of $)if(V.type==="text")Y+=X(V.text);else if(V.type==="image"){if(j>0)j-=1,Y+=D0(V.data)}else if(k$(V)){let K=this.extractLocatorFromResultEntry(V);if(K&&Z.has(this.toReadLocatorKey(K)))Y+=this.providerBoundEntryBytes(V)}else if(V.type==="file"){if(Z.has(this.toReadLocatorKey({path:V.path,startLine:null,endLine:null})))Y+=D0(this.truncateMiddle(V.content))}return Y}providerBoundEntryBytes($){let Z=this.truncateNestedStrings($);return D0(JSON.stringify(Z))}addMissingToolResults($){let Z=this.collectToolResultIds($),Q=[],J=new Map,X=!1,W=()=>{if(J.size===0)return;j(this.createMissingToolResultMessage(J)),J.clear(),X=!0},j=(Y)=>{let V=Q.at(-1);if(this.shouldMergeUserAfterToolResults(V,Y)){Q[Q.length-1]={...V,content:[...V.content,...this.contentBlocksForUserMerge(Y.content)]},X=!0;return}Q.push(Y)};for(let Y of $){if(this.isToolResultOnlyMessage(Y)){if(j(this.appendMissingToolResults(Y,J)),J.size>0)J.clear(),X=!0;continue}if(Array.isArray(Y.content)){let V=Y.content.filter((B)=>B.type==="tool_result"),K=Y.content.filter((B)=>B.type!=="tool_result");if(V.length>0){let B=this.appendMissingToolResults({...Y,role:"user",content:V},J);if(j(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?{...Y,content:K}:Y;if(j(B),B.role==="assistant")this.trackMissingToolCalls(B,Z,J)}continue}W(),j(Y)}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 $?`${aG} Tool: ${$}.`:aG}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(k$(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)??q2;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:q2}}if(W.type==="image"){if(X===0)return W;return X-=1,{type:"text",text:q2}}if(k$(W))return this.replaceOutdatedReadEntry(W,Q);if(W.type!=="text")return W;let j=this.replaceOutdatedInString(W.text,Q);if(j===null)return{...W,text:q2};return j===W.text?W:{...W,text:j}})}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 j=W,Y=this.extractLocatorFromResultEntry(j);if(!Y)continue;if(!Z.has(this.toReadLocatorKey(Y)))continue;if(j.result==="Successfully read image"||j.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=q2;else if(typeof J.content==="string")J.content=q2;else J.result=q2;return J}isReadTool($){return!!$&&CP.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(k$(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(NJ($))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 C6($,this.maxToolResultChars,nG)}truncateAssistantText($){if(this.hasRepeatedToolCallMarkup($))return C6($,this.maxAssistantToolMarkupChars,fP);return C6($,this.maxAssistantTextChars,PP)}hasRepeatedToolCallMarkup($){if($.length<=this.maxAssistantToolMarkupChars)return!1;let Z=0;for(let Q of $.matchAll(wP))if(Z+=1,Z>=RP)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)=>xP(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 j=Z-this.maxTotalTextBytes,Y=Math.max(X.minBytes,W-j),V=kP(X.get(),Y,X.makeMarker);X.set(V),Z-=W-D0(V)}return Q}countMessageTextBytes($){let Z=0;for(let Q of $){if(typeof Q.content==="string"){Z+=D0(Q.content);continue}for(let J of Q.content)if(J.type==="text")Z+=D0(J.text);else if(J.type==="thinking")Z+=D0(J.thinking);else if(J.type==="file")Z+=D0(J.content);else if(J.type==="tool_use")Z+=Q7(J.input);else if(J.type==="tool_result"){if(typeof J.content==="string")Z+=D0(J.content);else for(let X of J.content)if(X.type==="text")Z+=D0(X.text);else if(X.type==="file")Z+=D0(X.content);else if(k$(X))Z+=Q7(X)}}return Z}collectTruncationCandidates($){let Z=[],Q=[];for(let J of $){if(J.role==="assistant"&&typeof J.content==="string"){Z.push({byteLength:D0(J.content),minBytes:rG,makeMarker:oG,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"){J7(X.input,Q);continue}if(J.role==="assistant"&&X.type==="text"){Z.push({byteLength:D0(X.text),minBytes:rG,makeMarker:oG,get:()=>X.text,set:(W)=>{X.text=W}});continue}if(X.type!=="tool_result")continue;if(typeof X.content==="string"){Z.push({byteLength:D0(X.content),minBytes:r8,makeMarker:a8,get:()=>X.content,set:(W)=>{X.content=W}});continue}for(let W of X.content)if(W.type==="text")Z.push({byteLength:D0(W.text),minBytes:r8,makeMarker:a8,get:()=>W.text,set:(j)=>{W.text=j}});else if(W.type==="file")Z.push({byteLength:D0(W.content),minBytes:r8,makeMarker:a8,get:()=>W.content,set:(j)=>{W.content=j}});else if(k$(W))J7(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=_P(),J=!1,X=$.map((W)=>{if(!Array.isArray(W.content))return W;let j=!1,Y=W.content.map((V)=>{let K=this.applyMediaBudgetToBlock(V,Z,Q);if(K!==V)j=!0;return K});if(!j)return W;return J=!0,{...W,content:Y}});return J?X:$}resolveMediaBudget(){return zP(this.mediaBudget)}applyMediaBudgetToBlock($,Z,Q){if(zJ($))return this.limitImageContent($,Z,Q);if($.type!=="tool_result"||typeof $.content==="string")return $;let J=!1,X=$.content.map((W)=>{let j=this.applyMediaBudgetToToolResultEntry(W,Z,Q);if(j!==W)J=!0;return j});return J?{...$,content:X}:$}applyMediaBudgetToToolResultEntry($,Z,Q){if(zJ($))return this.limitImageContent($,Z,Q);if(k$($))return this.limitNestedMedia($,Z,Q);return $}limitNestedMedia($,Z,Q){if(zJ($)){let J=this.limitImageContent($,Z,Q);return J.type==="text"?J.text:J}if(Array.isArray($)){let J=!1,X=$.map((W)=>{let j=this.limitNestedMedia(W,Z,Q);if(j!==W)J=!0;return j});return J?X:$}if($!==null&&typeof $==="object"){let J=!1,X={};for(let[W,j]of Object.entries($)){let Y=this.limitNestedMedia(j,Z,Q);if(Y!==j)J=!0;X[W]=Y}return J?X:$}return $}limitImageContent($,Z,Q){if(!$H($))return{type:"text",text:pG};let J=OP($.mediaType,$.data,{maxImageEncodedBytes:Z.maxImageEncodedBytes,maxImageDecodedBytes:Z.maxImageDecodedBytes,maxTotalMediaBytes:Z.maxTotalMediaBytes},Q);if(!J.ok)return{type:"text",text:pG};return{...$,data:J.base64,mediaType:J.mediaType}}}var sG=String.raw`[\|\uFF5C]`,wP=new RegExp(String.raw`<\s*(?:${sG}\s*)?DSML\s*(?:${sG}\s*)?(?:tool_calls|invoke)\b[^>]*>|<\s*/?\s*(?:tool_calls?|tool_call|function_calls?|function_call|invoke)\b[^>]*>`,"gi");function D0($){return Buffer.byteLength($,"utf8")}function tG($){if($===void 0)return;let Z=Number.parseInt($,10);return Number.isFinite(Z)&&Z>0?Z:void 0}function SP($){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 i8($,Z){return typeof $==="number"&&Number.isFinite($)&&$>0?Math.floor($):Z}function bP($,Z){if(typeof $!=="number"||Number.isNaN($)||$<0)return Z;return Number.isFinite($)?Math.floor($):$}function C6($,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),j=Q(W),Y=Math.max(0,Math.floor((Z-j.length)/2)),V=$.slice(0,Y),K=Y>0?$.slice(-Y):"";return`${V}${j}${K}`}function kP($,Z,Q){if(D0($)<=Z)return $;let J=0,X=$.length,W=C6($,0,Q);while(J<=X){let j=J+X>>>1,Y=C6($,j,Q);if(D0(Y)<=Z)W=Y,J=j+1;else X=j-1}return W}function xP($){if($.type==="tool_use")return{...$,input:X7($.input)};if($.type!=="tool_result"||typeof $.content==="string")return{...$};return{...$,content:$.content.map((Z)=>k$(Z)?X7(Z):{...Z})}}function k$($){if($===null||typeof $!=="object")return!1;let Z=$.type;return Z!=="text"&&Z!=="image"&&Z!=="file"}function zJ($){return $!==null&&typeof $==="object"&&$.type==="image"}function $H($){return $!==null&&typeof $==="object"&&$.type==="image"&&typeof $.data==="string"&&typeof $.mediaType==="string"}function NJ($){return $H($)}function Q7($){if(typeof $==="string")return D0($);if(Array.isArray($)){let Z=0;for(let Q of $)Z+=Q7(Q);return Z}if($!==null&&typeof $==="object"){if(NJ($))return 0;let Z=0;for(let Q of Object.values($))Z+=Q7(Q);return Z}return 0}function J7($,Z){if(Array.isArray($)){$.forEach((Q,J)=>{if(typeof Q==="string")Z.push({byteLength:D0(Q),minBytes:r8,makeMarker:a8,get:()=>$[J],set:(X)=>{$[J]=X}});else J7(Q,Z)});return}if($!==null&&typeof $==="object"){if(NJ($))return;let Q=$;for(let J of Object.keys(Q)){let X=Q[J];if(typeof X==="string")Z.push({byteLength:D0(X),minBytes:r8,makeMarker:a8,get:()=>Q[J],set:(W)=>{Q[J]=W}});else J7(X,Z)}}}function X7($){if(Array.isArray($))return $.map(X7);if($!==null&&typeof $==="object"){let Z={};for(let[Q,J]of Object.entries($))Z[Q]=X7(J);return Z}return $}function qJ(){return`conv_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}class AJ{messages=[];conversationId=qJ();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=qJ(),this.sessionStarted=!1}clearHistory(){this.messages=[],this.conversationId=qJ(),this.sessionStarted=!1}restore($){this.messages=[...$],this.sessionStarted=!1}isSessionStarted(){return this.sessionStarted}markSessionStarted(){this.sessionStarted=!0}}var x$="0.0.81";var A2={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:x$,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"}},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 QH($){let{agentConfig:Z}=$,Q=yP(Z),J=IP(Z),X=$.hooks,W=hP(Z.maxParallelToolCalls);return{distinctId:Z.distinctId,clientName:Z.extensionContext?.client?.name,clientVersion:Z.extensionContext?.client?.version,clineCoreVersion:x$,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 yP($){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 IP($){let Z=$.providerConfig?.family;return{id:$.modelId,provider:$.providerId,family:Z}}function hP($){if($===void 0)return;return $>=2?"parallel":"sequential"}function vP($){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 P6($){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 gP(){return{lastToolName:"",lastToolSignature:"",consecutiveIdenticalCount:0}}function mP($){$.lastToolName="",$.lastToolSignature="",$.consecutiveIdenticalCount=0}function TJ($){if($==null||typeof $!=="object")return $;if(Array.isArray($))return $.map(TJ);let Z={};for(let Q of Object.keys($).sort())Z[Q]=TJ($[Q]);return Z}function cP($){if($==null)return"null";if(typeof $==="string")return $;if(typeof $!=="object")return String($);try{return JSON.stringify(TJ($))}catch{return String($)}}function uP($,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 JH={softThreshold:3,hardThreshold:5};class EJ{config;state=gP();constructor($){this.config={softThreshold:$?.softThreshold??JH.softThreshold,hardThreshold:$?.hardThreshold??JH.hardThreshold}}inspect($){let Z=cP($.input),Q=uP(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(){mP(this.state)}}class MJ{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 lP(X,this.options.onLimitReached);if(W.action==="continue"){let j=W.guidance?.trim();if(j)this.options.appendRecoveryNotice(j,$.reason);return this.consecutiveMistakes=0,{action:"continue",guidance:j}}return{action:"stop",reason:W.reason?.trim()||void 0,message:dP({iteration:$.iteration,consecutiveMistakes:Q,maxConsecutiveMistakes:Z,reason:$.reason,details:$.details,stopReason:W.reason})}}reset(){this.consecutiveMistakes=0}get value(){return this.consecutiveMistakes}}function dP($){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 lP($,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 pP($){switch($){case"auto_compaction":case"manual_compaction":case"compaction_budget_emergency":return $;default:return}}function iP($){let Z=$.content.filter((Q)=>Q.type==="text");if(Z.length===0)return;return Z.map((Q)=>Q.text).join("")}function rP($){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 aP($){return $.content.find((Z)=>Z.type==="tool-result")}function nP($){switch($){case"completed":return"completed";case"aborted":return"aborted";case"failed":return"error"}}function oP($){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 RJ{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:pP($.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=iP($);if(Q!==void 0)Z.push({type:"content_end",contentType:"text",text:Q});let J=rP($);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=aP($.message),X=J?.output,W=oP(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,Y=($.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:Y===0?void 0:Y,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:nP($.status),text:$.outputText,iterations:$.iterations,usage:Z}]}}var Yf="session_run_in_progress";class VH extends Error{agentId;code=Yf;constructor($){super(`SessionRuntime.shutdown called while a run is in progress${$?` (agentId=${$})`:""}`);this.agentId=$;this.name="SessionRunInProgressError"}}function Vf($){if(typeof $==="string")return $;if($ instanceof Error)return $.message;try{return JSON.stringify($)}catch{return String($)}}async function Kf($){let Q=(typeof $.content==="function"?await $.content():$.content).trim();return Q.length>0?Q:void 0}function Bf($,Z){let Q=$.trim(),J=Z.map((X)=>X.trim()).filter(Boolean).join(`
|
|
195
195
|
|
|
196
196
|
`);if(Q&&J)return`${Q}
|
|
197
197
|
|
|
@@ -505,7 +505,7 @@ ${JSON.stringify(J,null,2)}`}startClaimLeaseHeartbeat($){let Z=Math.max(1000,Mat
|
|
|
505
505
|
`)[0]?.trim())}function c$($){if(!$)return;let Z={...$},Q=b2(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 P4($){let Z=c$($.metadata)??{},Q=$.title!==void 0?b2($.title):CX($.prompt);if(Q)Z.title=Q;return Object.keys(Z).length>0?Z:void 0}function PX($){let Z=V6($.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(R4($.sessionId))return{agent:"teammate",sessionId:$.sessionId,taskType:"team",origin:Q};if(S7($.sessionId))return{agent:"subagent",sessionId:$.sessionId,taskType:"subagent_task",origin:Q};return{agent:"lead",sessionId:$.sessionId,origin:Q}}function fX($){return{version:1,updated_at:$.updatedAt,agent:$.context.agent,sessionId:$.context.sessionId,...$.context.taskType?{taskType:$.context.taskType}:{},origin:$.context.origin,messages:b7($.messages),...$.systemPrompt?{system_prompt:$.systemPrompt}:{}}}function TF($,Z,Q){db(pb($),{recursive:!0}),lb($,`${JSON.stringify(fX({updatedAt:Z,context:Q,messages:[]}),null,2)}
|
|
506
506
|
`,"utf8")}function EF($,Z){return Z1.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 MF($,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 ob}from"node:fs";import{readFile as sb}from"node:fs/promises";class f4{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 u$($){let Z=$?.trim();if(!Z||!ob(Z))return[];try{let Q=(await sb(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 wX($){return $?{...$}:void 0}async function RF($,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 w4($){if(typeof $!=="string")return;let Z=$.trim();return Z.length>0?Z:void 0}function U1($){let Z=w4($);if(!Z)return;return Z.toLowerCase()==="unknown"?void 0:Z}function x7($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function Zk($){if(!$||typeof $!=="object"||Array.isArray($))return;return{...$}}function bX($){let Z=$??200;return Number.isFinite(Z)?Math.max(0,Math.floor(Z)):200}function Qk($){if($===0)return 0;return Math.min(Math.max($*2,20),2000)}function Jk($){return $.isSubagent!==!0&&!w4($.parentSessionId)}function Xk($){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 kX($){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 Wk($){let Z=bX($);if(Z===0)return[];let Q=wF(),X=(await tb(Q,{withFileTypes:!0}).catch(()=>[])).filter((j)=>j.isDirectory()).map((j)=>({entry:j,recency:Xk(j.name.trim())})).sort((j,Y)=>Y.recency-j.recency||Y.entry.name.localeCompare(j.entry.name));return(await Promise.all(X.map(async({entry:j})=>{let Y=j.name.trim();if(!Y)return;let V=fF(Q,Y,`${Y}.json`),K=await PF(V,"utf8").catch(()=>{return});if(!K)return;let B;try{B=JSON.parse(K)}catch{return}let G=Z1.safeParse(B);if(!G.success)return;return kX(G.data)}))).filter((j)=>Boolean(j)).sort((j,Y)=>Y.startedAt.localeCompare(j.startedAt)).slice(0,Z)}async function jk($,Z,Q){let J=bX(Z);if(J===0)return await $.listSessions(0),[];let X=Q.includeSubagents?J:Qk(J),W=await $.listSessions(X);return(Q.includeSubagents?W:W.filter(Jk)).slice(0,J)}function Yk($){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(`
|
|
507
507
|
`).trim()}function CF($){return $.replace(/\s+/g," ").trim()}function Vk($,Z){if($.length<=Z)return $;return`${$.slice(0,Math.max(0,Z-3)).trimEnd()}...`}function Kk($){for(let Z of["user","assistant"])for(let Q of $){if(Q.role!==Z)continue;let J=CF(Yk(Q.content));if(!J)continue;let X=Z==="user"?CF(eb(J)):J,W=$k(X.split(`
|
|
508
|
-
`)[0]??X);return Vk(W,50)}return}function Bk($){let Z=0;for(let Q of $)Z+=x7(Q.metrics?.cost)??0;return Z}function Gk($){let Z,Q;for(let J=$.length-1;J>=0;J-=1){let X=$[J];if(!Z)Z=U1(X.modelInfo?.provider);if(!Q)Q=U1(X.modelInfo?.id);if(Z&&Q)break}return{provider:Z,model:Q}}function Hk($){return U1($?.provider)??U1($?.provider&&typeof $.provider==="object"&&!Array.isArray($.provider)?$.provider.id:void 0)}function Uk($){return U1($?.model)??U1($?.model&&typeof $.model==="object"&&!Array.isArray($.model)?$.model.id:void 0)}function SX($,Z){let Q=Zk($.metadata),J=w4(Z?.title)??w4(Q?.title),X=x7(Z?.totalCost)??x7(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:U1(Z?.provider)??U1($.provider)??Hk(Q)??"",model:U1(Z?.model)??U1($.model)??Uk(Q)??"",metadata:W}}function Fk($){let Z=$.content;if(!Array.isArray(Z))return!1;return Z.some((Q)=>!!Q&&typeof Q==="object"&&Q.type==="tool-call")}function Dk($,Z){if($.status!=="running"||$.interactive!==!0)return!1;let Q=Z.at(-1);return Q?.role==="assistant"&&!Fk(Q)}async function Lk($,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 Dk(Q,J)?{...Q,status:"idle"}:Q}))}async function _k($,Z){return await Promise.all(Z.map(async(Q)=>{let J=SX(Q),X=Boolean(w4(J.metadata?.title)),W=Boolean(U1(J.provider)),j=Boolean(U1(J.model)),Y=x7(J.metadata?.totalCost),V=Y!==void 0&&Y>0;if(X&&W&&j&&V)return J;let K=await $.readSessionMessages(Q.sessionId);if(K.length===0)return J;let B=Gk(K),G=Bk(K);return SX(Q,{title:X?void 0:Kk(K),provider:W?void 0:B.provider,model:j?void 0:B.model,totalCost:V||G<=0?void 0:G})}))}async function xX($,Z={}){let Q=bX(Z.limit),J=Z.includeSubagents===!0,X=await jk($,Q,{includeSubagents:J}),W=Z.includeManifestFallback===!0&&X.length<Q?await Wk(Math.min(Math.max(Q*2,100),500)):[],j=new Map;for(let K of[...X,...W]){if(j.has(K.sessionId))continue;j.set(K.sessionId,K)}let Y=W.length===0?X:Array.from(j.values()).sort((K,B)=>B.startedAt.localeCompare(K.startedAt)).slice(0,Q),V=await Lk($,Y);if(Z.hydrate===!1)return V.map((K)=>SX(K));return await _k($,V)}async function zk($){let Z=$.trim();if(!Z)return;let Q=fF(wF(),Z,`${Z}.json`),J=await PF(Q,"utf8").catch(()=>{return});if(!J)return;try{let X=Z1.safeParse(JSON.parse(J));return X.success?X.data.messages_path:void 0}catch{return}}async function Ok($,Z={}){let Q=new Map;return await xX({listSessions:async(X)=>{let W=await $.listSessions(X);Q.clear();for(let j of W)Q.set(j.sessionId,j);return W.map(C4)},readSessionMessages:async(X)=>{let W=Q.get(X)?.messagesPath??await zk(X);return await u$(W)}},Z)}import{captureSdkError as u_}from"@cline/shared";import{createSessionId as wx,isHubProtocolCompatible as Sx,resolveClineBuildEnv as bx,resolveHubCommandTimeoutMs as kx}from"@cline/shared";import{spawn as tk}from"node:child_process";import{closeSync as ek,mkdirSync as $x,openSync as Zx,readFileSync as Qx,unlinkSync as Jx}from"node:fs";import{basename as Xx,dirname as Wx,join as jx}from"node:path";import{fileURLToPath as Yx}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as Vx,isHubDaemonProcess as rF,resolveClineBuildEnv as aF,withResolvedClineBuildEnv as Kx}from"@cline/shared";import{createHash as Nk,randomBytes as IF}from"node:crypto";import{existsSync as qk}from"node:fs";import{mkdir as IX,open as SF,readFile as hF,rename as Ak,rm as y7,writeFile as Tk}from"node:fs/promises";import{dirname as vF,join as hX}from"node:path";import{isHubProtocolCompatible as Ek}from"@cline/shared";import{resolveClineDataDir as S4,resolveClineDir as R20}from"@cline/shared/storage";var Mk="CLINE_HUB_DISCOVERY_PATH",Rk="CLINE_HUB_BUILD_ID",Ck="CLINE_HUB_BUILD_EPOCH_MS",Pk=30000,fk=15000,bF=100;function wk($){return $.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function Sk($){return Nk("sha256").update($).digest("hex").slice(0,12)}function bk($){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 gF(){return IF(32).toString("hex")}function kF($){return new Promise((Z)=>setTimeout(Z,$))}function kk($){return`${$}.lock`}async function xk($){try{let Z=JSON.parse(await hF(hX($,"owner.json"),"utf8"));if(typeof Z.pid!=="number"||typeof Z.acquiredAt!=="string")return;return{pid:Z.pid,acquiredAt:Z.acquiredAt}}catch{return}}async function yX($){await y7($,{recursive:!0,force:!0}).catch(()=>{return})}function h1(){let $=process.env[Rk]?.trim();if($)return $;return"sdk-v1-
|
|
508
|
+
`)[0]??X);return Vk(W,50)}return}function Bk($){let Z=0;for(let Q of $)Z+=x7(Q.metrics?.cost)??0;return Z}function Gk($){let Z,Q;for(let J=$.length-1;J>=0;J-=1){let X=$[J];if(!Z)Z=U1(X.modelInfo?.provider);if(!Q)Q=U1(X.modelInfo?.id);if(Z&&Q)break}return{provider:Z,model:Q}}function Hk($){return U1($?.provider)??U1($?.provider&&typeof $.provider==="object"&&!Array.isArray($.provider)?$.provider.id:void 0)}function Uk($){return U1($?.model)??U1($?.model&&typeof $.model==="object"&&!Array.isArray($.model)?$.model.id:void 0)}function SX($,Z){let Q=Zk($.metadata),J=w4(Z?.title)??w4(Q?.title),X=x7(Z?.totalCost)??x7(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:U1(Z?.provider)??U1($.provider)??Hk(Q)??"",model:U1(Z?.model)??U1($.model)??Uk(Q)??"",metadata:W}}function Fk($){let Z=$.content;if(!Array.isArray(Z))return!1;return Z.some((Q)=>!!Q&&typeof Q==="object"&&Q.type==="tool-call")}function Dk($,Z){if($.status!=="running"||$.interactive!==!0)return!1;let Q=Z.at(-1);return Q?.role==="assistant"&&!Fk(Q)}async function Lk($,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 Dk(Q,J)?{...Q,status:"idle"}:Q}))}async function _k($,Z){return await Promise.all(Z.map(async(Q)=>{let J=SX(Q),X=Boolean(w4(J.metadata?.title)),W=Boolean(U1(J.provider)),j=Boolean(U1(J.model)),Y=x7(J.metadata?.totalCost),V=Y!==void 0&&Y>0;if(X&&W&&j&&V)return J;let K=await $.readSessionMessages(Q.sessionId);if(K.length===0)return J;let B=Gk(K),G=Bk(K);return SX(Q,{title:X?void 0:Kk(K),provider:W?void 0:B.provider,model:j?void 0:B.model,totalCost:V||G<=0?void 0:G})}))}async function xX($,Z={}){let Q=bX(Z.limit),J=Z.includeSubagents===!0,X=await jk($,Q,{includeSubagents:J}),W=Z.includeManifestFallback===!0&&X.length<Q?await Wk(Math.min(Math.max(Q*2,100),500)):[],j=new Map;for(let K of[...X,...W]){if(j.has(K.sessionId))continue;j.set(K.sessionId,K)}let Y=W.length===0?X:Array.from(j.values()).sort((K,B)=>B.startedAt.localeCompare(K.startedAt)).slice(0,Q),V=await Lk($,Y);if(Z.hydrate===!1)return V.map((K)=>SX(K));return await _k($,V)}async function zk($){let Z=$.trim();if(!Z)return;let Q=fF(wF(),Z,`${Z}.json`),J=await PF(Q,"utf8").catch(()=>{return});if(!J)return;try{let X=Z1.safeParse(JSON.parse(J));return X.success?X.data.messages_path:void 0}catch{return}}async function Ok($,Z={}){let Q=new Map;return await xX({listSessions:async(X)=>{let W=await $.listSessions(X);Q.clear();for(let j of W)Q.set(j.sessionId,j);return W.map(C4)},readSessionMessages:async(X)=>{let W=Q.get(X)?.messagesPath??await zk(X);return await u$(W)}},Z)}import{captureSdkError as u_}from"@cline/shared";import{createSessionId as wx,isHubProtocolCompatible as Sx,resolveClineBuildEnv as bx,resolveHubCommandTimeoutMs as kx}from"@cline/shared";import{spawn as tk}from"node:child_process";import{closeSync as ek,mkdirSync as $x,openSync as Zx,readFileSync as Qx,unlinkSync as Jx}from"node:fs";import{basename as Xx,dirname as Wx,join as jx}from"node:path";import{fileURLToPath as Yx}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as Vx,isHubDaemonProcess as rF,resolveClineBuildEnv as aF,withResolvedClineBuildEnv as Kx}from"@cline/shared";import{createHash as Nk,randomBytes as IF}from"node:crypto";import{existsSync as qk}from"node:fs";import{mkdir as IX,open as SF,readFile as hF,rename as Ak,rm as y7,writeFile as Tk}from"node:fs/promises";import{dirname as vF,join as hX}from"node:path";import{isHubProtocolCompatible as Ek}from"@cline/shared";import{resolveClineDataDir as S4,resolveClineDir as R20}from"@cline/shared/storage";var Mk="CLINE_HUB_DISCOVERY_PATH",Rk="CLINE_HUB_BUILD_ID",Ck="CLINE_HUB_BUILD_EPOCH_MS",Pk=30000,fk=15000,bF=100;function wk($){return $.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function Sk($){return Nk("sha256").update($).digest("hex").slice(0,12)}function bk($){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 gF(){return IF(32).toString("hex")}function kF($){return new Promise((Z)=>setTimeout(Z,$))}function kk($){return`${$}.lock`}async function xk($){try{let Z=JSON.parse(await hF(hX($,"owner.json"),"utf8"));if(typeof Z.pid!=="number"||typeof Z.acquiredAt!=="string")return;return{pid:Z.pid,acquiredAt:Z.acquiredAt}}catch{return}}async function yX($){await y7($,{recursive:!0,force:!0}).catch(()=>{return})}function h1(){let $=process.env[Rk]?.trim();if($)return $;return"sdk-v1-de9deb37f4cb8cc9eb360a3aafe9a44f52cc6b6ca6b75b2a98c16c7a5d68a027".trim()||`source-${String(A2.version)}`}function vX(){let $=Number(process.env[Ck]);if(Number.isFinite($)&&$>0)return $;return Number.isFinite(1787736998718)?1787736998718:void 0}function b4($,Z=h1()){let Q=Ek($);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 xF($){return typeof $==="number"&&Number.isFinite($)&&$>0?$:void 0}function yF($){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 yk($,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 gX($,Z){let Q=$.buildId?.trim(),J=Z.buildId?.trim();if(Q&&J&&Q===J)return 0;let X=xF($.buildEpochMs),W=xF(Z.buildEpochMs);if(X!==void 0&&W!==void 0&&X!==W)return X<W?-1:1;let j=yF($.coreVersion),Y=yF(Z.coreVersion);if(j&&Y){let V=yk(j,Y);if(V!==0)return V}if(Q&&J&&Q!==J)return Q<J?-1:1;return 0}function mX(){return{buildId:h1(),buildEpochMs:vX(),coreVersion:String(A2.version)}}function u6($,Z){let Q=Z?.self??mX(),J=b4($,Q.buildId??"");if(J.compatible)return!0;if(J.reason!=="build_mismatch"&&J.reason!=="missing_build")return!1;return gX(Q,$)<=0}function k2($=process.argv[1]?.trim()||process.cwd()){let Z=`hub-${Sk($)}`,Q=process.env[Mk]?.trim()||hX(S4(),"locks","hub","owners",`${wk(Z)}.json`);return{ownerId:Z,discoveryPath:Q}}function P20($=`hub-${Date.now().toString(36)}`){return k2($)}async function x0($){try{let Z=JSON.parse(await hF($,"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 I7($,Z){await cX($,async()=>{let Q=vF($);await IX(Q,{recursive:!0});let J=`${$}.${process.pid}.${IF(6).toString("hex")}.tmp`,X;try{X=await SF(J,"wx",384),await X.writeFile(`${JSON.stringify(Z,null,2)}
|
|
509
509
|
`,{encoding:"utf8"}),await X.sync(),await X.close(),X=void 0,await Ak(J,$);let W;try{W=await SF(Q,"r"),await W.sync()}catch{}finally{await W?.close().catch(()=>{return})}}catch(W){throw await X?.close().catch(()=>{return}),await y7(J,{force:!0}).catch(()=>{return}),W}})}async function X$($){await cX($,async()=>{await y7($,{force:!0}).catch(()=>{return})})}async function mF($,Z){return await cX($,async()=>{if((await x0($))?.hubId!==Z)return!1;return await y7($,{force:!0}),!0})}async function cF($,Z,Q){let J=kk($);await IX(vF(J),{recursive:!0});let X=Date.now()+fk;while(!0){try{await IX(J,{recursive:!1})}catch(W){if((W instanceof Error&&"code"in W?String(W.code):"")!=="EEXIST")throw W;let Y=await xk(J);if(!Y){if(Date.now()>=X){await yX(J);continue}await kF(bF);continue}let V=Date.now()-Date.parse(Y.acquiredAt);if(!bk(Y.pid)||V>Pk){await yX(J);continue}if(Date.now()>=X)throw Error(`Timed out waiting for hub ${Z} lock ${J}`);await kF(bF);continue}try{return await Tk(hX(J,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
510
510
|
`,"utf8"),await Q()}finally{await yX(J)}}}function cX($,Z){return cF(`${$}.mutation`,"discovery mutation",Z)}function h7($,Z){return cF($,"startup",Z)}async function W$($,Z){try{let Q=await fetch(Z?.authToken?Ik($):uF($),{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 j$($,Z,Q="/hub"){return new URL(`ws://${$}:${Z}${Q}`).toString()}function uF($){let Z=new URL($);return Z.protocol=Z.protocol==="wss:"?"https:":"http:",Z.pathname="/health",Z.search="",Z.toString()}function Ik($){let Z=new URL(uF($));return Z.pathname="/status",Z.toString()}function f20($){return qk($)}import{CLINE_HUB_DEV_PORT as hk,CLINE_HUB_PORT as vk,resolveClineBuildEnv as gk}from"@cline/shared";var mk="CLINE_HUB_HOST",ck="CLINE_HUB_PORT",uk="CLINE_HUB_PATHNAME",dk="127.0.0.1",lk=vk,pk="/hub";function dF($){return gk($)==="development"?hk:lk}function ik($={}){return($.env??process.env)[mk]?.trim()||dk}function v7($={}){let Q=($.env??process.env)[ck]?.trim();if(!Q)return dF($);let J=Number.parseInt(Q,10);if(!Number.isInteger(J)||J<1||J>65535)return dF($);return J}function rk($={}){return($.env??process.env)[uk]?.trim()||pk}function x2($={},Z={}){return{host:$.host??ik(Z),port:$.port??v7(Z),pathname:$.pathname??rk(Z)}}import{join as ak}from"node:path";var nk="shared:cline",ok="CLINE_HUB_DISCOVERY_PATH",sk="hub-production";function I20($){let Z=v$($.trim());return k2(`workspace:${Z||$.trim()}`)}function P1($=nk){return k2(`${$}@${h1()}`)}function v1(){return{ownerId:sk,discoveryPath:process.env[ok]?.trim()||ak(S4(),"locks","hub","production.json")}}var Bx=8000,Gx=200,lF=3000,Hx=100,Ux=[100,250,500,1000,2000],Fx="--cline-hub-daemon",Dx=3,Lx=60000,lX=new Map,r20={resetRetireAttempts(){lX.clear()}};function _x($,Z=Date.now()){let Q=lX.get($);if(!Q||Z-Q.windowStartedAt>Lx)return lX.set($,{count:1,windowStartedAt:Z}),!0;return Q.count+=1,Q.count<=Dx}function zx($){return[...$.host?["--host",$.host]:[],...typeof $.port==="number"?["--port",String($.port)]:[],...$.pathname?["--pathname",$.pathname]:[]]}function Ox(){try{let $=jx(S4(),"logs","hub-daemon.log");return $x(Wx($),{recursive:!0}),{fd:Zx($,"a"),logPath:$}}catch{return}}function Nx(){return aF()==="production"?v1():P1()}function k4($){return u6($)}function qx($){try{let Z=JSON.parse(Qx(`${$}.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 uX($){try{Jx(`${$}.superseded`)}catch{}}function pF($,Z,Q){if(!Z||Z.url!==Q)return $;return{...$,authToken:$.authToken??Z.authToken,pid:$.pid??Z.pid}}async function x4($,Z){try{return await W$($,{authToken:Z})}catch{return}}async function iF($,Z){let Q=Date.now()+Z;while(Date.now()<Q){if(!(await x4($))?.url)return!0;await new Promise((X)=>setTimeout(X,Hx))}return!1}async function y4($,Z){if(!_x($.url))return!1;await oF($.url,$.authToken,"retired by newer install").catch(()=>!1),await rX($.url,$.authToken).catch(()=>!1);let Q=await iF($.url,lF);if(!Q&&$.pid&&Ax($.pid)){try{process.kill($.pid,"SIGTERM")}catch{}Q=await iF($.url,lF)}if(Q)await X$(Z).catch(()=>{return});return Q}function Ax($){try{return process.kill($,0),!0}catch(Z){return Z?.code==="EPERM"}}async function pX($){try{return!await g7($.url,$.authToken)}catch{return!1}}async function dX($,Z){if(k4($))return"reusable";if(await pX($))return"deferred_busy";return await y4($,Z)?"retired":"failed"}async function Tx($){if(aF()!=="production")return;let Z=P1();if(Z.discoveryPath===$.discoveryPath)return;let Q=await x0(Z.discoveryPath);if(Q?.url)await y4(Q,Z.discoveryPath);else await X$(Z.discoveryPath).catch(()=>{return})}function Ex(){let $=import.meta.url.endsWith(".ts")?"ts":"js";return Yx(new URL(`./entry.${$}`,import.meta.url))}function Mx($,Z){let Q=Ex(),J=process.execPath?.trim();if(!J)throw Error("unable to resolve runtime executable for hub daemon");let X=Xx(J).toLowerCase().includes("bun"),W=Q.startsWith("/$bunfs/"),j=X&&Q.toLowerCase().endsWith(".ts"),Y=W?[Fx]:[...j?["--conditions=development"]:[],Q];return{launcher:J,args:[...Y,"--cwd",$,...zx(Z)],cwd:$,env:{...Kx(process.env),CLINE_NO_INTERACTIVE:"1",[Vx]:"1"}}}function Rx($){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 Cx($,Z={}){if(rF())return;let Q=Mx($,Z),J=Ox();try{tk(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)ek(J.fd)}}async function Px($,Z={}){for(let Q=0;;Q++)try{Cx($,Z);return}catch(J){let X=Ux[Q];if(!Rx(J)||X===void 0)throw J;await new Promise((W)=>setTimeout(W,X))}}function nF($,Z={}){if(rF())return;iX($,Z).catch(()=>{})}async function fx($,Z,Q={}){let J=Q.host!==void 0||Q.port!==void 0||Q.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),X=x2(Q),W=j$(X.host,X.port,X.pathname),j=(F)=>{if(!J)d6(F.url,F.authToken);return F};await Tx($).catch(()=>{return});let Y=await x0($.discoveryPath),V=Y?.url?void 0:qx($.discoveryPath),K=!1;if(Y?.url){let F=Y.authToken;if(!F)K=!0,await y4(Y,$.discoveryPath);else{let D=await x4(Y.url,F);if(D?.url&&k4(D)&&await F1(D.url,{authToken:F}))return uX($.discoveryPath),j({url:D.url,authToken:F});if(D?.url){if(await dX({...D,authToken:F},$.discoveryPath)==="deferred_busy"&&await F1(D.url,{authToken:F}))return j({url:D.url,authToken:F})}else await X$($.discoveryPath).catch(()=>{return})}}let B=await x4(W);if(B?.url){let F=pF(B,Y??V,W);if(k4(B)){let L=[B.authToken,Y?.authToken,V?.authToken].filter((_)=>typeof _==="string"&&_.trim().length>0);for(let _ of L){if(!await F1(B.url,{authToken:_}))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:_,host:B.host,port:B.port,url:B.url,pid:B.pid??Y?.pid??V?.pid,startedAt:B.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await I7($.discoveryPath,O)}catch{}return uX($.discoveryPath),j({url:B.url,authToken:_})}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 D=await dX(F,$.discoveryPath);if(D==="deferred_busy"){for(let L of[F.authToken,Y?.authToken].filter((z)=>typeof z==="string"&&z.trim().length>0))if(await F1(B.url,{authToken:L}))return j({url:B.url,authToken:L});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(D==="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 H=Q.allowPortFallback===!0&&X.port!==0?{...X,port:0}:X;await Px(Z,H);let U=Date.now()+Bx;while(Date.now()<U){let F=await x0($.discoveryPath);if(F?.url&&F.authToken){let L=await x4(F.url,F.authToken);if(L?.url&&k4(L)&&await F1(L.url,{authToken:F.authToken}))return uX($.discoveryPath),j({url:L.url,authToken:F.authToken})}let D=await x4(W);if(D?.url&&!k4(D)){let L=pF(D,F??V,W),z=await dX(L,$.discoveryPath);if(z==="deferred_busy"&&F?.authToken&&await F1(D.url,{authToken:F.authToken}))return j({url:D.url,authToken:F.authToken});if(z==="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((L)=>setTimeout(L,Gx))}throw Error("Timed out waiting for detached hub startup.")}async function iX($,Z={}){let Q=Nx();return await h7(Q.discoveryPath,async()=>fx(Q,$,Z))}function tX(){return bx()==="production"?v1():P1()}function xx(){let $=globalThis.WebSocket;if(!$)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return $}function $D($){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 $D($.data);return String($)}function yx($){if(typeof $==="string")return $;if($ instanceof Uint8Array)return Buffer.from($).toString("utf8");if($ instanceof ArrayBuffer)return Buffer.from($).toString("utf8");return""}function sF($){let Z=$,Q=yx(Z.reason);return new D1("hub_connection_closed",Z.code||Q?`Hub connection closed (code=${Z.code??0}${Q?`, reason=${Q}`:""})`:nX,{closeCode:Z.code,closeReason:Q||void 0})}function Ix($,Z){if($ instanceof D1)return $;if($ instanceof Error)return new D1("hub_connect_failed",$.message);if($&&typeof $==="object"&&"error"in $&&$.error instanceof Error)return new D1("hub_connect_failed",$.error.message);let Q=$&&typeof $==="object"&&"message"in $&&typeof $.message==="string"?$.message.trim():"";if(Q)return new D1("hub_connect_failed",Q);let J=$&&typeof $==="object"&&"type"in $&&typeof $.type==="string"?$.type.trim():"";return new D1("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 aX="*",tF=8000,hx="cline-hub-auth.",ZD=new Map,QD=new Set,vx=3000,gx=3000,mx=100,nX="Hub connection closed",cx=250,ux=5000,eF=0.5;class D1 extends Error{code;details;constructor($,Z,Q){super(Z);this.code=$;this.details=Q;this.name="HubTransportError"}}function dx($){return $ instanceof D1}class m7 extends Error{command;code;constructor($,Z,Q){super(Q);this.command=$;this.code=Z;this.name="HubCommandError"}}function JD($,Z){return $ instanceof m7&&$.code==="hub_command_timeout"&&(Z===void 0||$.command===Z)}function eX($){let Z=$.searchParams.get("authToken")?.trim();if($.searchParams.delete("authToken"),Z)return Z;let Q=$W($.toString());return Q?ZD.get(Q):void 0}function lx($){try{let Q=new URL($).hostname.toLowerCase().replace(/^\[|\]$/g,"");return Q==="localhost"||Q==="127.0.0.1"||Q==="::1"}catch{return!1}}function $W($){if(!lx($))return;let Z=new URL(l6($));return Z.search="",Z.hash="",Z.toString()}function oX($){let Z=$W($);return!!Z&&QD.has(Z)}function d6($,Z){let Q=$W($);if(Q){if(QD.add(Q),Z?.trim())ZD.set(Q,Z)}return $}class Y${options;socket;connectPromise;clientId;currentUrl;recoveryPromise;pendingReplies=new Map;listeners=new Set;subscriptionCounts=new Map;lastEventSequenceByKey=new Map;reconnectTimer;reconnectAttempt=0;closedByClient=!1;lastCloseError=new D1("hub_connection_closed",nX);sawSocketClose=!1;registered=!1;capabilities;constructor($){this.options=$;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.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()||eX($);$.hash="";let J=new(xx())($.toString(),Z?[`${hx}${Z}`]:void 0);this.socket=J;let X=!1;this.connectPromise=new Promise((W,j)=>{let Y=!1,V=setTimeout(()=>{if(Y)return;Y=!0,X=!0,this.lastCloseError=new D1("hub_connect_timeout",`Timed out connecting to hub after ${tF}ms`),this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{J.close()}catch{}j(this.lastCloseError)},tF);J.addEventListener("open",()=>{if(Y)return;Y=!0,clearTimeout(V),W()}),J.addEventListener("error",(K)=>{if(Y)return;Y=!0,clearTimeout(V),this.lastCloseError=Ix(K,$),this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0,j(this.lastCloseError)}),J.addEventListener("close",(K)=>{if(Y)return;if(Y=!0,clearTimeout(V),!X)this.lastCloseError=sF(K),this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0,j(this.lastCloseError)})}),J.addEventListener("message",(W)=>{this.handleFrame(JSON.parse($D(W)))}),J.addEventListener("close",(W)=>{if(this.socket!==J)return;if(!X)this.lastCloseError=sF(W),this.sawSocketClose=!0;this.registered=!1;for(let j of this.pendingReplies.values())j.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await this.connectPromise,await this.command("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}}),this.registered=!0;for(let W of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(W));this.reconnectAttempt=0}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(j){if(!W||X>=1||!await this.recoverLocalHubTransport(j))throw j;X+=1}}async commandOnce($,Z,Q,J){await this.connect();let X=wx("hubreq_"),W=kx($,J?.timeoutMs),j=new Promise((V,K)=>{let B=W===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(X))return;K(new m7($,"hub_command_timeout",`Hub command ${$} timed out after ${W}ms (hub=${this.currentUrl}, requestId=${X}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},W);this.pendingReplies.set(X,{resolve:(G)=>{if(B)clearTimeout(B);V(G)},reject:(G)=>{if(B)clearTimeout(B);K(G)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:$,requestId:X,clientId:this.clientId,sessionId:Q,timeoutMs:W,payload:Z}})}catch(V){throw this.pendingReplies.delete(X),V}let Y=await j;if(!Y.ok){if(Y.error?.code===D4){let V=Q??(typeof Z?.sessionId==="string"?Z.sessionId:void 0);throw new f2(V,Y.error.message)}throw new m7($,Y.error?.code,Y.error?.message??`Hub command ${$} failed`)}return Y}async recoverLocalHubTransport($){if(!oX(this.currentUrl)||!dx($))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let Z=await I4({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(cx*2**this.reconnectAttempt,ux),Z=Math.round($*(1-eF)+Math.random()*$*eF);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(!oX(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let $=await I4({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.clearReconnectTimer(),this.registered=!1,!$)return;this.lastCloseError=new D1("hub_connection_closed",nX),this.sawSocketClose=!1;for(let Z of this.pendingReplies.values())Z.reject(this.lastCloseError);this.pendingReplies.clear(),this.connectPromise=void 0,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 D1("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 $??aX}subscriptionSessionIdFromKey($){return $===aX?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[aX,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 l6($){let Z=new URL($);if(Z.protocol==="http:")Z.protocol="ws:";else if(Z.protocol==="https:")Z.protocol="wss:";return Z.toString()}async function F1($,Z){let Q=new Y$({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 sX($,Z){let Q=l6($),J=await W$(Q,{authToken:Z?.authToken});if(!J)return{status:"unreachable",url:Q};if(Z?.requireCurrentBuild){let X=h1(),W=b4(J,X);if(!W.compatible&&!u6(J))return{status:W.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:Q}}else if(!Sx(J).compatible)return{status:"protocol_mismatch",url:Q};if(Z?.verifyConnection===!0&&!await F1(Q,{workspaceRoot:Z.workspaceRoot,cwd:Z.cwd,authToken:Z.authToken}))return{status:"unreachable",url:Q};return{status:"compatible",url:Q}}async function px($){let Z=Date.now()+gx;while(Date.now()<Z){if(!(await W$($).catch(()=>{return}))?.url)return!0;await new Promise((J)=>setTimeout(J,mx))}return!1}function ix($,Z){try{return l6($)===l6(Z)}catch{return!1}}function rx($){return($&&typeof $==="object"&&Array.isArray($.sessions)?$.sessions:[]).some((Q)=>{if(!Q||typeof Q!=="object")return!1;let J=Q;return Array.isArray(J.participants)&&J.participants.length>0})}async function g7($,Z,Q){let J=new Y$({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:vx});return!rx(X.payload)}catch{return!1}finally{await J.dispose().catch(()=>{return})}}async function ax($,Z){let Q=`${$.discoveryPath}.superseded`,J=await x0(Q);if(!J?.url||!J.authToken)return;let X=await sX(J.url,{authToken:J.authToken});if(X.status!=="compatible")return;if(await g7(X.url,J.authToken,Z))return;return d6(X.url,J.authToken)}async function ZW($={}){if($.endpoint?.trim()){let X=await sX($.endpoint);return X.status==="compatible"?X.url:void 0}let Z=tX(),Q=await x0(Z.discoveryPath);if(!Q?.url)return await ax(Z,$);let J=await sX(Q.url,{authToken:Q.authToken,requireCurrentBuild:!0});if(J.status==="compatible")return d6(J.url,Q.authToken);if(J.status==="protocol_mismatch")await X$(Z.discoveryPath).catch(()=>{return});return}async function I4($={}){let Z=await ZW($);if(Z&&await F1(Z,{workspaceRoot:$.workspaceRoot,cwd:$.cwd}))return Z;if($.endpoint?.trim())return;try{return(await iX($.workspaceRoot??process.cwd())).url}catch{return}}async function oF($,Z,Q,J){let X=new URL($),W=Z?.trim()||eX(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 rX($,Z){let Q=new URL($),J=Z?.trim()||eX(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 nx($=tX()){let Z=await x0($.discoveryPath);if(!Z?.url)return!1;try{if(await rX(Z.url,Z.authToken))return!0}catch{}return!1}async function XD($){if(!oX($.url))return;let Z=tX(),Q=await x0(Z.discoveryPath);if(!Q?.url||!ix(Q.url,$.url))return;if(!await g7(Q.url,Q.authToken,{workspaceRoot:$.workspaceRoot,cwd:$.cwd}))return;if(!await nx())return;if(!await px(Q.url))return;return await X$(Z.discoveryPath).catch(()=>{return}),await I4({workspaceRoot:$.workspaceRoot,cwd:$.cwd})}import{resolveProviderRequestHeaders as Jy}from"@cline/llms";import{captureSdkError as XW,createSessionId as BD,HUB_CHECKPOINT_CAPABILITY as Xy,HUB_COMPACTION_CAPABILITY as Wy,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as jy,HUB_HOOK_CAPABILITY_PREFIX as Yy,HUB_MISTAKE_LIMIT_CAPABILITY as Vy,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as Ky,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as By,isGeneratedMedia as Gy,isHubToolExecutorName as Hy}from"@cline/shared";import{createHash as ox}from"node:crypto";import{formatDisplayUserInput as WD}from"@cline/shared";import{z as g1}from"zod";function sx($){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 tx=g1.custom(sx),c7=g1.object({version:g1.literal(1),updated_at:g1.string().datetime(),conversation_id:g1.string().min(1).optional(),source_message_count:g1.number().int().nonnegative(),source_prefix_hash:g1.string().min(1).optional(),source_last_message_key:g1.string().min(1).optional(),messages:g1.array(tx),system_prompt:g1.string().optional()});function QW($){return JSON.parse(JSON.stringify($))}function jD($){if($.role!=="user")return $;if(typeof $.content==="string")return{...$,content:WD($.content)};return{...$,content:$.content.map((Z)=>Z.type==="text"?{...Z,text:WD(Z.text)}:Z)}}function YD($){if($.includes(":"))throw TypeError("Message role cannot contain ':' in compaction boundary keys")}function ex($){let Z=jD($);return YD(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 VD($){if(!$)return"";let Z=jD($);if(typeof Z.id==="string"&&Z.id.trim())return`id:${Z.id.trim()}`;if(YD(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 KD($,Z=$.length){let Q=ox("sha256");Q.update(`cline-session-compaction-source-v2
|
|
511
511
|
`),Q.update(`${Z}
|
|
@@ -792,7 +792,7 @@ ${qL($)}${Q}</SYSTEM_NOTICE>`}}function XZ($,Z){if(typeof $.content==="string")r
|
|
|
792
792
|
reviewed_at = excluded.reviewed_at,
|
|
793
793
|
version = team_outcome_fragments.version + 1`,[J,W.outcomeId,W.id,W.section,W.sourceAgentId,W.sourceRunId??null,W.content,W.status,W.reviewedBy??null,W.reviewedAt?W.reviewedAt.toISOString():null])})}markInProgressRunsInterrupted($,Z){let Q=W8($),J=this.queryAll("SELECT run_id FROM team_runs WHERE team_name = ? AND status IN ('queued', 'running')",[Q]);if(J.length===0)return[];let X=_j();return this.run(`UPDATE team_runs SET status = 'interrupted', error = ?, ended_at = ?, version = version + 1
|
|
794
794
|
WHERE team_name = ? AND status IN ('queued', 'running')`,[Z,X,Q]),J.map((W)=>W.run_id)}handleTeamEvent($,Z){this.appendTeamEvent($,Z.type,Z)}}function S_($={}){try{let Z=new X5($);return Z.init(),Z}catch{let Z=new EZ({teamDir:$.teamDir});return Z.init(),Z}}function MZ($,Z){return Hm($,Z)}function Dm($,Z){let Q=Z?.["*"]??{},J=Z?.[$]??{};return{...Q,...J}.enabled!==!1}function Lm($,Z){return $.filter((Q)=>Dm(Q.name,Z))}function zj($,Z){return E$(Lm($,Z))}var _m={apply_diff:"editor",attempt_completion:"submit_and_exit",bash:"run_commands",execute_command:"run_commands",list_code_definition_names:"search_codebase",list_files:"run_commands",read_file:"read_files",replace_in_file:"editor",search_files:"search_codebase",use_skill:"skills",write_to_file:"editor"};function zm($){let Z=$.trim().toLowerCase();return _m[Z]??Z}function Om($,Z){if(Z.tools===void 0)return $;let Q=new Set(Z.tools.map(zm));if(Z.skills!==void 0)Q.add("skills");return $.filter((J)=>Q.has(J.name))}function k_(){return`team-${Fm(5)}`}function RZ($,Z,Q,J,X,W,j,Y,V,K){let B=k1[b$({mode:Q})],G=p8(Z,J,Q,X??l8);return zj(e8({cwd:$,telemetry:V,executorOptions:{bash:{executionController:K}},...B,enableSkills:!!j,...G,executors:{...j?{skills:j}:{},...Y??{}}}),W)}function Nm($){return RZ($.cwd,$.providerId,$.mode,$.modelId,$.toolRoutingRules,$.toolPolicies,qm,$.toolExecutors).some((Z)=>Z.name==="skills")}var qm=async()=>"";async function Am($){let Z=V0();if(!M2({filePath:Z}))return{tools:[]};let Q=new G4({clientFactory:B4({settingsPath:Z})}),J;try{J=await j4(Q,{filePath:Z})}catch(Y){await Q.dispose().catch(()=>{});let V=Y instanceof Error?Y.message:String(Y);return $?.log(`[mcp] Failed to load MCP settings, skipping MCP tools: ${V}`),{tools:[]}}let X=J.filter((Y)=>Y.disabled!==!0),W=await Promise.allSettled(X.map((Y)=>A7({serverName:Y.name,provider:Q,timeoutMs:Um(Y.timeoutSeconds)*1000}))),j=[];for(let[Y,V]of W.entries())if(V.status==="fulfilled")j.push(...V.value);else{let K=V.reason instanceof Error?V.reason.message:String(V.reason);$?.log(`[mcp] Failed to load tools from MCP server "${X[Y].name}", skipping: ${K}`)}return{tools:j,shutdown:async()=>{await Q.dispose()}}}function Tm($,Z){if(!$)return;for(let Q of $.getTeammateIds())try{$.shutdownTeammate(Q,Z)}catch{}}function Em($){if($===void 0)return!0;switch($){case"session_stop":case"session_complete":case"session_error":case"session_manager_dispose":case"cli_run_shutdown":case"cli_interactive_shutdown":case"cli_interactive_startup_cancelled":case"provider_change":case"acp_shutdown":case"hub_server_stop":case"vscode_webview_dispose":return!0;default:return!1}}function Mm($){let Z=k1[b$({mode:$.mode})];return{sessionId:$.sessionId||"",mode:$.mode==="plan"?"plan":$.mode==="yolo"?"yolo":"act",enableTools:$.enableTools!==!1,enableSpawnAgent:$.enableSpawnAgent??Z.enableSpawnAgent??!0,enableAgentTeams:$.enableAgentTeams??Z.enableAgentTeams??!0,disableMcpSettingsTools:$.disableMcpSettingsTools===!0,yolo:$.yolo===!0,missionLogIntervalSteps:typeof $.missionLogIntervalSteps==="number"&&Number.isFinite($.missionLogIntervalSteps)?$.missionLogIntervalSteps:3,missionLogIntervalMs:typeof $.missionLogIntervalMs==="number"&&Number.isFinite($.missionLogIntervalMs)?$.missionLogIntervalMs:120000}}class CZ{teamRuntimeEntries=new Map;async build($){let{config:Z,hooks:Q,extensions:J,logger:X,telemetry:W,createSpawnTool:j,onTeamRestored:Y,userInstructionService:V,configExtensions:K,toolExecutors:B}=$,G=$.onTeamEvent??(()=>{}),H=Mm(Z),U=[];if(H.enableTools&&M8("web_search")&&b_({providerId:Z.providerId,modelId:Z.modelId},"web_search"))U.push({name:"web_search"});if(H.enableTools&&b_({providerId:Z.providerId,modelId:Z.modelId},"image_generation"))U.push({name:"image_generation",outputFormat:"png"});let F=Z.workspaceRoot??Z.cwd,D=$.toolPolicies??Z.toolPolicies,L=t1(),z=[],_=Z.teamName?.trim()||k_(),O=Z.sessionId?.trim()||_,A=H.enableSpawnAgent?r7({workspaceRoot:F}):{configs:[],errors:[]},q=A.configs.some((a)=>a.skills!==void 0),N=MZ(K,"rules"),T=MZ(K,"skills"),M=T||q,d=MZ(K,"workflows"),b=MZ(K,"plugins"),S=N||T||d,E=!1,I=Boolean(V),P=V,i;for(let a of A.errors)(X??Z.logger)?.log?.(`[agents] Failed to load agent config at ${a.path}: ${a.error.message}`);if(!P&&(S||q))P=k6({skills:M?{workspacePath:F,includePluginSkills:b,pluginSkillDirectories:b?$.pluginSkillDirectories:void 0,pluginPaths:Z.pluginPaths,cwd:Z.cwd}:{workspacePath:F},rules:{workspacePath:Z.cwd},workflows:{workspacePath:Z.cwd}});if(P)await P.start().catch(()=>{});let w=H.enableTools&&T&&Boolean(P)&&P?.hasConfiguredSkills(Z.skills)===!0&&Nm({cwd:Z.cwd,providerId:Z.providerId,mode:H.mode,modelId:Z.modelId,toolRoutingRules:Z.toolRoutingRules,toolPolicies:D,toolExecutors:B}),k=P&&S?P.createExtension({includeRules:N,includeSkills:T,includeWorkflows:d,registerSkillsTool:w,allowedSkillNames:Z.skills}):void 0,m=H.mode==="plan"&&H.enableTools?jJ({telemetry:W??Z.telemetry}):void 0,t=[k,m].filter((a)=>a!==void 0),y0=t.length>0?[...J??Z.extensions??[],...t]:J??Z.extensions;if(H.enableTools){if(z.push(...RZ(Z.cwd,Z.providerId,H.mode,Z.modelId,Z.toolRoutingRules,D,void 0,B,W??Z.telemetry,$.runCommandExecutionController)),!H.disableMcpSettingsTools){let a=await Am(Z.logger);z.push(...a.tools),i=a.shutdown}}let Y0,J1=H.enableAgentTeams?S_():void 0,m0=J1?.loadRuntime(O),r1=m0?.state,X1=m0?.teammates??[],I0=new Map(X1.map((a)=>[a.agentId,a])),r0=Z.sessionId||_,r,W1=[],g=!1,G0=f6({providerId:Z.providerId,modelId:Z.modelId,distinctId:$.distinctId,sessionId:Z.sessionId,cwd:Z.cwd,apiKey:Z.apiKey??"",baseUrl:Z.baseUrl,headers:Z.headers,providerConfig:Z.providerConfig,knownModels:Z.knownModels,thinking:Z.thinking,reasoningEffort:Z.reasoningEffort,thinkingBudgetTokens:Z.thinkingBudgetTokens,maxTokensPerTurn:Z.maxTokensPerTurn,temperature:Z.temperature,maxIterations:Z.maxIterations,hooks:Q,extensions:y0,logger:X??Z.logger,telemetry:$.telemetry??Z.telemetry,workspaceMetadata:Z.workspaceMetadata});if(H.enableSpawnAgent){if(A.configs.length>0)z.push(...zj(n7({configProvider:G0,agents:A.configs,createSubAgentTools:(a)=>H.enableTools?Om(RZ(Z.cwd,a.providerId??Z.providerId,H.mode,a.modelId??Z.modelId,Z.toolRoutingRules,D,a.skills!==void 0&&P?.createSkillsExecutor?P.createSkillsExecutor(a.skills):void 0,B,W??Z.telemetry,$.runCommandExecutionController),a):[],hookErrorMode:Z.hookErrorMode,toolPolicies:D,requestToolApproval:$.requestToolApproval,onSubAgentEvent:$.onSubAgentEvent,onSubAgentStart:$.onSubAgentStart,onSubAgentEnd:$.onSubAgentEnd}),D))}if(!this.teamRuntimeEntries.has(r0))this.teamRuntimeEntries.set(r0,{delegatedAgentConfigProvider:G0});let C0=()=>{if(!H.enableAgentTeams)return;let a=this.teamRuntimeEntries.get(r0)??{delegatedAgentConfigProvider:G0};if(this.teamRuntimeEntries.set(r0,a),Y0=a.runtime,!Y0){if(Y0=new d4({teamName:_,leadAgentId:Z.sessionId||"lead",missionLogIntervalSteps:H.missionLogIntervalSteps,missionLogIntervalMs:H.missionLogIntervalMs,onTeamEvent:(N0)=>{if(G(N0),Y0&&J1){if(N0.type==="teammate_spawned"&&N0.teammate?.rolePrompt){let a1={agentId:N0.agentId,rolePrompt:N0.teammate.rolePrompt,modelId:N0.teammate.modelId,maxIterations:N0.teammate.maxIterations};I0.set(a1.agentId,a1)}if(N0.type==="teammate_shutdown"&&!Em(N0.reason))I0.delete(N0.agentId);J1.handleTeamEvent(O,N0),J1.persistRuntime(O,Y0.exportState(),Array.from(I0.values()))}}}),r1)Y0.hydrateState(r1),g=!0;a.runtime=Y0}if(!E){if(!Y0)return;E=!0;let N0=Y7({runtime:Y0,leadAgentId:Z.sessionId||"lead",restoredFromPersistence:Boolean(r1),restoredTeammates:X1,includeLeadSpawnTool:!0,includeLeadManagementTools:!0,onLeadToolsUnlocked:(a1)=>{W1=a1,r?.addTools(a1)},createBaseTools:H.enableTools?()=>RZ(Z.cwd,Z.providerId,H.mode,Z.modelId,Z.toolRoutingRules,D,void 0,B,W??Z.telemetry,$.runCommandExecutionController):void 0,teammateConfigProvider:G0});if(g)Y0.recoverActiveRuns("runtime_recovered");if(N0.restoredFromPersistence)Y?.();z.push(...N0.tools)}return Y0};if(H.enableSpawnAgent&&j){let a=j();z.push({...a,execute:async(N0,a1)=>{return C0(),a.execute(N0,a1)}})}if(H.enableAgentTeams)C0();let c0=zj(z,D),j2=c0.some((a)=>a.name==="submit_and_exit"&&a.lifecycle?.completesRun===!0),y5=H.enableAgentTeams?()=>{let a=this.teamRuntimeEntries.get(r0)?.runtime;if(!a)return;let N0=a.listTasks(),a1=N0.some((z$)=>z$.status==="in_progress"||z$.status==="pending"),qV=a.listRuns({}),kq=qV.some((z$)=>z$.status==="running"||z$.status==="queued");if(a1||kq){let z$=N0.filter((j1)=>j1.status==="in_progress"||j1.status==="pending").map((j1)=>`${j1.id} (${j1.status}): ${j1.title}`).join(", "),AV=qV.filter((j1)=>j1.status==="running"||j1.status==="queued").map((j1)=>`${j1.id} (${j1.status})`).join(", "),TQ=[];if(z$)TQ.push(`Unfinished tasks: ${z$}`);if(AV)TQ.push(`Active runs: ${AV}`);return`[SYSTEM] You still have team obligations. ${TQ.join(". ")}. Use team_run_task to delegate work, or team_task with action=complete to mark tasks done, or team_await_runs to wait for active runs. Do NOT stop until all tasks are completed.`}return}:void 0,bq=j2?{requireCompletionTool:!0,...y5?{completionGuard:y5}:{}}:y5?{completionGuard:y5}:void 0;return{tools:c0,modelTools:U,logger:X??Z.logger,telemetry:W??Z.telemetry,teamRuntime:Y0,teamRestoredFromPersistence:Boolean(r1),delegatedAgentConfigProvider:this.teamRuntimeEntries.get(r0)?.delegatedAgentConfigProvider??G0,extensions:y0,completionPolicy:bq,registerLeadAgent:(a)=>{if(r=a,W1.length>0)a.addTools(E$(W1,[...L]))},shutdown:async(a)=>{if(Tm(Y0,a),this.teamRuntimeEntries.delete(r0),await i?.(),!I)P?.stop()}}}}function Rm($,Z){let Q=$?.expiresAt,J=Z?.expiresAt;return $?.accessToken===Z?.accessToken&&$?.refreshToken===Z?.refreshToken&&$?.accountId===Z?.accountId&&Q===J}class W5 extends Error{providerId;constructor($){super(`OAuth credentials for provider "${$}" are no longer valid. Re-run authentication for this provider.`);this.name="OAuthReauthRequiredError",this.providerId=$}}class PZ{providerSettingsManager;telemetry;refreshInFlight=new Map;constructor($){this.providerSettingsManager=$?.providerSettingsManager??new s$,this.telemetry=$?.telemetry}async resolveProviderApiKey($){let Z=b0($.providerId);if(!Z)return null;return this.resolveWithSingleFlight(Z.providerId,Z.storageProviderId,$.forceRefresh)}async resolveWithSingleFlight($,Z,Q=!1){let J=this.refreshInFlight.get(Z);if(J)return J;let X=this.resolveProviderApiKeyInternal($,Z,Q).catch((W)=>{throw W}).finally(()=>{this.refreshInFlight.delete(Z)});return this.refreshInFlight.set(Z,X),X}async resolveProviderApiKeyInternal($,Z,Q){let J=b0($);if(!J)return null;let X=this.providerSettingsManager.getProviderSettings(Z);if(!X)return j0(`oauth.resolve providerId=${$} storageProviderId=${Z} outcome=no_settings`),null;let W=V3($,X);if(!W)return j0(`oauth.resolve providerId=${$} storageProviderId=${Z} outcome=no_credentials`),null;j0(`oauth.resolve.start providerId=${$} storageProviderId=${Z} forceRefresh=${Q} accessTokenHash=${a0(W.access)} refreshTokenHash=${a0(W.refresh)}`);let j=await J.refresh({settings:X,credentials:W,forceRefresh:Q,telemetry:this.telemetry});if(!j)throw j0(`oauth.resolve providerId=${$} outcome=refresh_returned_null`),new W5($);let Y=A8({manager:this.providerSettingsManager,providerId:$,settings:X,credentials:j,setLastUsed:!1,save:!1}),V=!Rm(X.auth,Y.auth);if(V)j0(`oauth.resolve.refreshed providerId=${$} newAccessTokenHash=${a0(j.access)} newRefreshTokenHash=${a0(j.refresh)} savingToDisk=true`),this.providerSettingsManager.saveProviderSettings(Y,{setLastUsed:!1,tokenSource:"oauth"});else j0(`oauth.resolve providerId=${$} outcome=not_refreshed`);return{apiKey:J.getApiKey(Y)??j.access,accountId:j.accountId,refreshed:V}}}import{normalizeUserInput as Cm}from"@cline/shared";import{nanoid as Pm}from"nanoid";class x_{list($){return $?N1($):[]}update($,Z){if(!$)return{sessionId:Z.sessionId,prompts:[],updated:!1};let Q=Z.promptId.trim(),J=$.pendingPrompts.findIndex((V)=>V.id===Q);if(J<0)return{sessionId:Z.sessionId,prompts:N1($),updated:!1};let X=$.pendingPrompts[J];if(!X)return{sessionId:Z.sessionId,prompts:N1($),updated:!1};let W=Z.prompt===void 0?X.prompt:Cm(Z.prompt).trim();if(!W)throw Error("prompt cannot be empty");let j=Z.delivery??X.delivery,Y={...X,prompt:W,mode:Z.mode??X.mode,delivery:j};return $.pendingPrompts.splice(J,1),wm($,Y,J,X.delivery),{sessionId:Z.sessionId,prompts:N1($),prompt:fZ(Y),updated:!0}}delete($,Z){if(!$)return{sessionId:Z.sessionId,prompts:[],removed:!1};let Q=Z.promptId.trim(),J=$.pendingPrompts.findIndex((W)=>W.id===Q);if(J<0)return{sessionId:Z.sessionId,prompts:N1($),removed:!1};let[X]=$.pendingPrompts.splice(J,1);return{sessionId:Z.sessionId,prompts:N1($),prompt:X?fZ(X):void 0,removed:!0}}enqueue($,Z){let{prompt:Q,mode:J,delivery:X,userImages:W,userFiles:j}=Z,Y=$.pendingPrompts.findIndex((V)=>V.prompt===Q);if(Y>=0){let[V]=$.pendingPrompts.splice(Y,1),K={...V,prompt:Q,mode:J??V.mode,userImages:W??V.userImages,userFiles:j??V.userFiles};if(X==="steer"||V.delivery==="steer")$.pendingPrompts.unshift({...K,delivery:"steer"});else $.pendingPrompts.push(K)}else{let V={id:`pending_${Date.now()}_${Pm(5)}`,prompt:Q,mode:J,delivery:X,userImages:W,userFiles:j};if(X==="steer")$.pendingPrompts.unshift(V);else $.pendingPrompts.push(V)}return N1($)}consumeSteer($){let Z=$.pendingPrompts.findIndex((J)=>J.delivery==="steer");if(Z<0)return{prompts:N1($)};let[Q]=$.pendingPrompts.splice(Z,1);return{entry:Q,prompts:N1($)}}shiftNext($){return{entry:$.pendingPrompts.shift(),prompts:N1($)}}requeueFront($,Z){return $.pendingPrompts.unshift(Z),N1($)}clear($){return $.pendingPrompts.length=0,[]}}class Oj{deps;service=new x_;constructor($){this.deps=$}list($){return this.service.list(this.deps.getSession($))}update($){let Z=this.deps.getSession($.sessionId);if(!Z)return{sessionId:$.sessionId,prompts:[],updated:!1};let Q=this.service.update(Z,$);return this.emitPrompts(Z),this.scheduleDrain($.sessionId,Z),Q}delete($){let Z=this.deps.getSession($.sessionId);if(!Z)return{sessionId:$.sessionId,prompts:[],removed:!1};let Q=this.service.delete(Z,$);return this.emitPrompts(Z),this.scheduleDrain($.sessionId,Z),Q}enqueue($,Z){let Q=this.deps.getSession($);if(!Q)return;this.service.enqueue(Q,Z),this.emitPrompts(Q),this.scheduleDrain($,Q)}consumeSteer($){let Z=this.deps.getSession($);if(!Z)return;let{entry:Q}=this.service.consumeSteer(Z);if(!Q)return;return this.emitPrompts(Z),this.emitSubmitted(Z,Q),Q}discardQueue($){if($.pendingPrompts.length===0)return;this.service.clear($),this.emitPrompts($)}emitPrompts($){this.deps.emit({type:"pending_prompts",payload:{sessionId:$.sessionId,prompts:N1($)}})}scheduleDrain($,Z){if(Z.pendingPrompts.length===0||Z.aborting||Z.drainingPendingPrompts||!Z.agent.canStartRun())return;queueMicrotask(()=>{this.drain($)})}async drain($){let Z=this.deps.getSession($);if(!Z)return;if(Z.aborting||Z.drainingPendingPrompts)return;if(!Z.agent.canStartRun())return;let{entry:Q}=this.service.shiftNext(Z);if(!Q)return;this.emitPrompts(Z),this.emitSubmitted(Z,Q),Z.drainingPendingPrompts=!0;let J=!0;try{let X=await this.deps.send({sessionId:$,prompt:Q.prompt,...Q.mode?{mode:Q.mode}:{},userImages:Q.userImages,userFiles:Q.userFiles});if(fm(X))J=!1}catch{J=!1,this.service.requeueFront(Z,Q),this.emitPrompts(Z)}finally{if(Z.drainingPendingPrompts=!1,J&&Z.pendingPrompts.length>0&&Z.status!=="failed"&&Z.status!=="cancelled")queueMicrotask(()=>{this.drain($)})}}emitSubmitted($,Z){let Q=fZ(Z);this.deps.emit({type:"pending_prompt_submitted",payload:{sessionId:$.sessionId,id:Q.id,prompt:Q.prompt,delivery:Q.delivery,attachmentCount:Q.attachmentCount,userImages:Q.userImages,userFiles:Q.userFiles}})}}function fm($){return typeof $==="object"&&$!==null&&"finishReason"in $&&$.finishReason==="error"}function fZ($){return{id:$.id,prompt:$.prompt,delivery:$.delivery,attachmentCount:($.userImages?.length??0)+($.userFiles?.length??0),userImages:$.userImages,userFiles:$.userFiles}}function N1($){return $.pendingPrompts.map(fZ)}function wm($,Z,Q,J){if(Z.delivery==="steer")$.pendingPrompts.unshift(Z);else if(J==="steer")$.pendingPrompts.push(Z);else $.pendingPrompts.splice(Q,0,Z)}_0();class wZ{deps;constructor($){this.deps=$}lastKnownIdentityBySession=new Map;static MAX_IDENTITY_SNAPSHOTS=512;dispatchAgentEvent($,Z,Q){let J=this.deps.getSession($),X={sessionId:$,config:Z,liveSession:J,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit},W=lW(Q);if(!!J&&(!W.agentId||W.agentId===Nj(J.agent))){let Y={agentId:Nj(J.agent),conversationId:J.agent.getConversationId(),...J?.runtime.teamRuntime?{teamRole:"lead"}:{}};this.rememberSessionIdentity($,Y),YZ(X,Q,{...Y,isPrimaryAgentEvent:!0});return}YZ(X,Q,{...J?{}:this.lastKnownIdentityBySession.get($),isPrimaryAgentEvent:!1})}rememberSessionIdentity($,Z){if(this.lastKnownIdentityBySession.delete($),this.lastKnownIdentityBySession.set($,Z),this.lastKnownIdentityBySession.size>wZ.MAX_IDENTITY_SNAPSHOTS){let Q=this.lastKnownIdentityBySession.keys().next().value;if(Q!==void 0)this.lastKnownIdentityBySession.delete(Q)}}async handleTeamEvent($,Z){let Q=this.deps.getSession($);if(Q){if(NW(Q,Z),Z.type==="agent_event"){let J={sessionId:$,config:Q.config,liveSession:Q,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit};YZ(J,Z.event,{agentId:Z.agentId,teamRole:"teammate",teamAgentId:Z.agentId,isPrimaryAgentEvent:!1})}if(Z.type==="teammate_spawned"){let J=G$({agentId:Z.teammate.runtimeAgentId??Z.agentId,conversationId:Z.teammate.conversationId,parentAgentId:Z.teammate.parentAgentId,createdByAgentId:Nj(Q.agent),teamId:Q.runtime.teamRuntime?.getTeamId(),teamName:Q.runtime.teamRuntime?.getTeamName(),teamRole:"teammate",teamAgentId:Z.agentId});if(J)K2(Q.config.telemetry,{ulid:$,modelId:Z.teammate.modelId??Q.config.modelId,provider:Q.config.providerId,...J})}}if(await qW($,Z,this.deps.invokeBackendOptional),Q)AW(Q,$,Z,this.deps.emit)}async handlePluginEvent($,Z,Q,J){if(Z.name==="plugin_log"){this.handlePluginLog($,Z.payload);return}if(Z.name==="plugin_telemetry"){this.handlePluginTelemetry($,Z.payload,J);return}if(Z.name==="automation_event"){let K=this.deps.getSession($)?.config.extensionContext?.automation??Q;if(!K)return;let B=Z.payload&&typeof Z.payload==="object"?Z.payload:void 0;if(!B)return;await K.ingestEvent(B);return}if(Z.name!=="steer_message"&&Z.name!=="queue_message"&&Z.name!=="pending_prompt")return;let X=Z.payload&&typeof Z.payload==="object"?Z.payload:void 0,W=typeof X?.sessionId==="string"&&X.sessionId.trim().length>0?X.sessionId.trim():$,j=typeof X?.prompt==="string"?X.prompt.trim():"";if(!j)return;let Y=Z.name==="steer_message"?"steer":Z.name==="queue_message"?"queue":X?.delivery==="steer"?"steer":"queue";this.deps.enqueuePendingPrompt(W,{prompt:j,delivery:Y})}handlePluginTelemetry($,Z,Q){let X=this.deps.getSession($)?.config.telemetry??Q;if(!X||!Z||typeof Z!=="object")return;let W=Z,j=typeof W.pluginName==="string"&&W.pluginName?W.pluginName:"unknown";if(W.kind==="event"){let Y=typeof W.event==="string"?W.event.trim():"";if(!Y)return;let V={...W.properties&&typeof W.properties==="object"?W.properties:{},plugin_name:j,session_id:$};if(W.required===!0)X.captureRequired(`plugin.${Y}`,V);else X.capture({event:`plugin.${Y}`,properties:V});return}if(W.kind==="metric"){let Y=typeof W.name==="string"?W.name.trim():"",V=typeof W.value==="number"?W.value:NaN;if(!Y||Number.isNaN(V))return;let K={...W.attributes&&typeof W.attributes==="object"?W.attributes:{},plugin_name:j},B=typeof W.description==="string"?W.description:void 0,G=W.required===!0,H=`plugin.${Y}`;if(W.metric==="counter")X.recordCounter(H,V,K,B,G);else if(W.metric==="histogram")X.recordHistogram(H,V,K,B,G);else if(W.metric==="gauge")X.recordGauge(H,V,K,B,G)}}handlePluginLog($,Z,Q){let J=this.deps.getSession($),X=Q??J?.config.extensionContext?.logger??J?.config.logger;if(!X||!Z||typeof Z!=="object")return;let W=Z,j=typeof W.message==="string"?W.message:"";if(!j)return;let Y=W.metadata&&typeof W.metadata==="object"?{...W.metadata}:{};if(Y.sessionId??=$,typeof W.pluginName==="string"&&W.pluginName)Y.pluginName=W.pluginName;if(W.level==="debug"){X.debug(j,Y);return}if(W.level==="error"){if(X.error)X.error(j,Y);else X.log(j,{...Y,severity:"error"});return}X.log(j,Y)}}function Nj($){return $.getAgentId()}function qj($){return{sessionId:$.sessionId,source:$.source,pid:process.pid,startedAt:$.startedAt,endedAt:$.endedAt??null,exitCode:$.exitCode??null,status:$.status,interactive:$.interactive,provider:$.config.providerId,model:$.config.modelId,cwd:$.config.cwd,workspaceRoot:H$($.config),teamName:$.config.teamName?.trim()||void 0,enableTools:$.config.enableTools,enableSpawn:$.config.enableSpawnAgent,enableTeams:$.config.enableAgentTeams,parentSessionId:typeof $.sessionMetadata?.parentSessionId==="string"?$.sessionMetadata.parentSessionId:void 0,parentAgentId:typeof $.sessionMetadata?.parentAgentId==="string"?$.sessionMetadata.parentAgentId:void 0,agentId:typeof $.sessionMetadata?.agentId==="string"?$.sessionMetadata.agentId:void 0,conversationId:typeof $.sessionMetadata?.conversationId==="string"?$.sessionMetadata.conversationId:void 0,isSubagent:typeof $.sessionMetadata?.isSubagent==="boolean"?$.sessionMetadata.isSubagent:!1,prompt:$.pendingPrompt,metadata:$.sessionMetadata,messagesPath:$.artifacts?.messagesPath,updatedAt:$.updatedAt??$.endedAt??$.startedAt}}function Aj($,Z){let Q=$[Z];return typeof Q==="function"?Q:null}async function y_($,Z,...Q){let J=Aj($,Z);if(!J)throw Error(`session service method not available: ${Z}`);return Promise.resolve(J.apply($,Q))}async function I_($,Z,...Q){let J=Aj($,Z);if(!J)return;await Promise.resolve(J.apply($,Q))}async function h_($,Z,...Q){let J=Aj($,Z);if(!J)return;return await Promise.resolve(J.apply($,Q))}M1();_0();function Tj($,Z,Q){return{onSubAgentEvent:(J)=>$.onAgentEvent(Q,Z,J),onSubAgentStart:(J)=>{let X=$.getSession(Q)?.runtime.teamRuntime;$.subAgentStarts.set(J.subAgentId,{startedAt:Date.now(),rootSessionId:Q});let W=G$({agentId:J.subAgentId,conversationId:J.conversationId,parentAgentId:J.parentAgentId,teamId:X?.getTeamId(),teamName:X?.getTeamName(),createdByAgentId:J.parentAgentId});if(W)K2(Z.telemetry,{ulid:Q,modelId:Z.modelId,provider:Z.providerId,...W});m5(Z.telemetry,{event:"started",ulid:Q,durationMs:0,parentId:J.parentAgentId,agentId:J.subAgentId,...W}),$.invokeBackendOptional("handleSubAgentStart",Q,J)},onSubAgentEnd:(J)=>{let X=$.getSession(Q)?.runtime.teamRuntime,W=$.subAgentStarts.get(J.subAgentId),j=W?Date.now()-W.startedAt:0,Y=J.result?.text?J.result.text.split(`
|
|
795
|
-
`).length:0;m5(Z.telemetry,{event:"ended",ulid:Q,durationMs:j,outputLines:Y,errorMessage:J.error?String(J.error):void 0,agentId:J.subAgentId,parentId:J.parentAgentId,...G$({agentId:J.subAgentId,conversationId:J.conversationId,parentAgentId:J.parentAgentId,teamId:X?.getTeamId(),teamName:X?.getTeamName(),createdByAgentId:J.parentAgentId})}),$.subAgentStarts.delete(J.subAgentId),$.invokeBackendOptional("handleSubAgentEnd",Q,J)}}}function Ej($,Z,Q,J){let X=Tj($,Z,Q);return S6({configProvider:{getRuntimeConfig:()=>$.getSession(Q)?.runtime.delegatedAgentConfigProvider?.getRuntimeConfig()??{providerId:Z.providerId,modelId:Z.modelId,cwd:Z.cwd,apiKey:Z.apiKey,baseUrl:Z.baseUrl,headers:Z.headers,providerConfig:Z.providerConfig,knownModels:Z.knownModels,thinking:Z.thinking,maxIterations:Z.maxIterations,hooks:Z.hooks,extensions:Z.extensions,logger:Z.logger,telemetry:Z.telemetry},getConnectionConfig:()=>$.getSession(Q)?.runtime.delegatedAgentConfigProvider?.getConnectionConfig()??{providerId:Z.providerId,modelId:Z.modelId,apiKey:Z.apiKey,baseUrl:Z.baseUrl,headers:Z.headers,providerConfig:Z.providerConfig,knownModels:Z.knownModels,thinking:Z.thinking},updateConnectionDefaults:()=>{}},createSubAgentTools:()=>{let j=Z.enableTools?e8({cwd:Z.cwd,telemetry:Z.telemetry,...k1[b$({mode:Z.mode})],executors:J}):[];if(Z.enableSpawnAgent)j.push(Ej($,Z,Q,J));return E$(j)},...X})}import{readFile as Sm,stat as bm}from"node:fs/promises";var km=20480000;async function v_($){let Z=await bm($);if(!Z.isFile())throw Error("Path is not a file");if(Z.size>km)throw Error("File is too large to read into context.");let Q=await Sm($,"utf8");if(Q.includes("\x00"))throw Error("Cannot read binary file into context.");return Q}var g_=5000,Cj;function cm($,Z){if(Cj)return;Cj=jG().then(()=>{return}).catch((Q)=>{Cj=void 0,$?.error?.("Detached command log recovery failed",{error:Q}),q1(Z,{component:"core",operation:"command.detached_log_recovery",error:Q,severity:"warn",handled:!0})})}function j5($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function um($){if(!$||typeof $!=="object"||Array.isArray($))return;let Z=$,Q=j5(Z.inputTokens),J=j5(Z.outputTokens),X=j5(Z.cacheReadTokens),W=j5(Z.cacheWriteTokens),j=j5(Z.totalCost);if(Q===void 0||J===void 0||X===void 0||W===void 0||j===void 0)return;return{inputTokens:Q,outputTokens:J,cacheReadTokens:X,cacheWriteTokens:W,totalCost:j}}function dm($,Z){return{inputTokens:Math.max($.inputTokens,Z.inputTokens),outputTokens:Math.max($.outputTokens,Z.outputTokens),cacheReadTokens:Math.max($.cacheReadTokens,Z.cacheReadTokens),cacheWriteTokens:Math.max($.cacheWriteTokens,Z.cacheWriteTokens),totalCost:Math.max($.totalCost,Z.totalCost)}}function m_($,Z){if(!Z)return!1;if($.source_message_count!==Z.source_message_count)return $.source_message_count<Z.source_message_count;return Date.parse($.updated_at)<Date.parse(Z.updated_at)}class t${runtimeAddress=void 0;pendingPrompts;sessionService;runtimeBuilder;createAgentInstance;toolExecutors;defaultCapabilities;defaultToolPolicies;providerSettingsManager;oauthTokenManager;defaultTelemetry;distinctId;defaultLogger;defaultFetch;events=new f4;sessions=new Map;manifestMutationQueues=new Map;usageBySession=new Map;aggregateUsageBySession=new Map;subAgentStarts=new Map;pendingPromptsController;eventBridge;sessionVersioning=new J8;runCommandExecutionController=new d8;constructor($){let Z=ym();if(Z)mm(Z);let Q=L1($.distinctId);this.distinctId=Q,this.sessionService=$.sessionService,this.runtimeBuilder=$.runtimeBuilder??new CZ,this.createAgentInstance=$.createAgent??((J)=>new y$(J)),this.defaultCapabilities=o0($.capabilities),this.toolExecutors=this.defaultCapabilities?.toolExecutors,this.defaultToolPolicies=$.toolPolicies,this.providerSettingsManager=$.providerSettingsManager??new s$,this.oauthTokenManager=$.oauthTokenManager??new PZ({providerSettingsManager:this.providerSettingsManager,telemetry:$.telemetry}),this.defaultTelemetry=$.telemetry,this.defaultLogger=$.logger,this.defaultTelemetry?.setDistinctId(Q),this.defaultFetch=$.fetch,cm(this.defaultLogger,this.defaultTelemetry),this.pendingPromptsController=new Oj({getSession:(J)=>this.sessions.get(J),emit:(J)=>this.emit(J),send:(J)=>this.runTurn(J)}),this.pendingPrompts={list:async(J)=>this.pendingPromptsController.list(J.sessionId),update:async(J)=>this.pendingPromptsController.update(J),delete:async(J)=>this.pendingPromptsController.delete(J)},this.eventBridge=new wZ({getSession:(J)=>this.sessions.get(J),usageBySession:this.usageBySession,aggregateUsageBySession:this.aggregateUsageBySession,emit:(J)=>this.emit(J),persistMessages:(J,X,W)=>{this.invoke("persistSessionMessages",J,X,W).catch((j)=>{let Y=this.sessions.get(J);(Y?.config.logger??this.defaultLogger)?.error?.("Failed to persist session messages from agent event",{sessionId:J,error:j}),q1(Y?.config.telemetry??this.defaultTelemetry,{component:"core",operation:"session.persist_messages_on_agent_event",error:j,severity:"warn",handled:!0,context:{sessionId:J,providerId:Y?.config.providerId,modelId:Y?.config.modelId}})})},enqueuePendingPrompt:(J,X)=>this.pendingPromptsController.enqueue(J,X),invokeBackendOptional:(J,...X)=>this.invokeOptional(J,...X)})}async applyInitialOAuthCredentials($){if($.config.apiKey?.trim())return $;let Z=await this.oauthTokenManager.resolveProviderApiKey({providerId:$.config.providerId});if(!Z?.apiKey)return $;return{...$,config:{...$.config,apiKey:Z.apiKey}}}async startSession($){let Z=$.config.sessionId?.trim()??"",Q=Z||hm(),J=Z.length>0&&($.initialMessages?.length??0)>0&&!$.prompt?.trim(),X=Boolean($.config.cwd?.trim()||$.config.workspaceRoot?.trim()),W=J&&!X?await this.invokeOptionalValue("readSessionManifest",Q):void 0,j=W?{...$.config,cwd:W.cwd,workspaceRoot:W.workspace_root}:await MG($.config);return await this.startResolvedSession({...$,config:j},Q,Z.length>0,W)}async startResolvedSession($,Z,Q,J){let X=$.source??Z0.CLI,W=U0(),j=await this.applyInitialOAuthCredentials($),Y=j.initialMessages??[],V=Y.length>0?jZ(Y):p0(),K=await this.invokeOptionalValue("ensureSessionsDir")??"";if(!K)throw Error("session service method not available: ensureSessionsDir");let B=Mj(K,Z),G=Mj(B,`${Z}.messages.json`),H=Mj(B,`${Z}.json`),U=H$($.config),F=$.interactive===!0&&!j.prompt?.trim(),D=Z1.parse({version:1,session_id:Z,source:X,pid:process.pid,started_at:W,status:F?"idle":"running",interactive:$.interactive===!0,provider:j.config.providerId,model:j.config.modelId,cwd:j.config.cwd,workspace_root:U,team_name:j.config.teamName,enable_tools:j.config.enableTools,enable_spawn:j.config.enableSpawnAgent,enable_teams:j.config.enableAgentTeams,prompt:j.prompt?.trim()||void 0,messages_path:G}),L,z;if(Q&&Y.length>0&&!j.prompt?.trim()){let g=J??await this.invokeOptionalValue("readSessionManifest",Z);if(g)D=g,L={manifestPath:H,messagesPath:g.messages_path||G,compactionPath:g.compaction_path,manifest:g},z=await this.invokeOptionalValue("readSessionCompactionState",Z)}let O=await this.seedAggregateUsageFromArtifacts({initialUsage:V,sessionDir:B,rootMessagesPath:L?.messagesPath??G,manifest:D});this.usageBySession.set(Z,V),this.aggregateUsageBySession.set(Z,O);let A=o0(this.defaultCapabilities,$.capabilities),q=A?.toolExecutors??this.toolExecutors,N=$.localRuntime,T=N?.extensionContext?.logger??N?.logger,M=N?.extensionContext?.automation,d=N?.extensionContext?.telemetry??N?.telemetry??this.defaultTelemetry,b,S={getSession:(g)=>this.sessions.get(g),subAgentStarts:this.subAgentStarts,onAgentEvent:(g,G0,C0)=>this.eventBridge.dispatchAgentEvent(g,G0,C0),invokeBackendOptional:(g,...G0)=>this.invokeOptional(g,...G0)};b=await Q_({input:j,localRuntime:$.localRuntime,sessionId:Z,providerSettingsManager:this.providerSettingsManager,defaultTelemetry:this.defaultTelemetry,defaultLogger:this.defaultLogger,defaultCapabilities:A,defaultToolPolicies:this.defaultToolPolicies,defaultFetch:this.defaultFetch,onPluginEvent:(g)=>{if(g.name==="plugin_log"){this.eventBridge.handlePluginLog(Z,g.payload,T);return}this.eventBridge.handlePluginEvent(Z,g,M,d)},onTeamEvent:(g)=>{this.eventBridge.handleTeamEvent(Z,g),b.config.onTeamEvent?.(g)},createSpawnTool:()=>Ej(S,b.config,Z,q),createSubAgentLifecycleCallbacks:(g)=>Tj(S,g,Z),readSessionMetadata:async()=>(await this.getSession(Z))?.metadata,writeSessionMetadata:async(g)=>{await this.persistSessionMetadata(Z,()=>g)}});let E=k0(WX({...L?.manifest.metadata??{},...j.sessionMetadata??{}},b.gitState),{mode:j.mode,version:b.config.extensionContext?.client?.version});if(!L)D.metadata=E;let I=await this.runtimeBuilder.build({...b.runtimeBuilderInput,distinctId:this.distinctId,runCommandExecutionController:this.runCommandExecutionController}),P=b.config,i=b.providerConfig;if(I.teamRuntime&&!P.teamName?.trim())P.teamName=I.teamRuntime.getTeamName();let w=async()=>{let g=this.sessions.get(Z);if(!g||!X6(g.config.providerId))return!1;try{return await this.syncOAuthCredentials(g,{forceRefresh:!0}),!0}catch{return!1}};I.delegatedAgentConfigProvider?.updateConnectionDefaults({onAuthError:w});let k=[...I.tools,...P.extraTools??[]],m=I.extensions??b.extensions,t=j.initialCompactionState,y0,Y0=uW(P),J1=t??z,m0=J1?{...J1,conversation_id:J1.conversation_id?.trim()||Z}:void 0,r1=dW({compact:Y0,getState:()=>y0?.compactionState,saveState:async(g,G0)=>{let C0=y0;if(!C0)return;let c0={...g,conversation_id:C0.sessionId};try{if(!(await this.persistActiveSessionCompactionState(C0,c0,G0)).updated)P.logger?.debug?.("Skipped stale session compaction state",{sessionId:C0.sessionId,sourceMessageCount:c0.source_message_count})}catch(j2){P.logger?.error?.("Failed to persist session compaction state",{sessionId:C0.sessionId,error:j2}),q1(P.telemetry,{component:"core",operation:"session.persist_compaction_state",severity:"warn",handled:!0,error:j2,context:{sessionId:C0.sessionId,providerId:P.providerId,modelId:P.modelId}})}}}),X1={distinctId:this.distinctId,sessionId:Z,providerId:i.providerId,modelId:i.modelId,apiKey:i.apiKey,baseUrl:i.baseUrl,headers:i.headers,onAuthError:w,knownModels:i.knownModels,providerConfig:i,thinking:P.thinking,reasoningEffort:P.reasoningEffort??i.reasoningEffort,thinkingBudgetTokens:P.thinkingBudgetTokens,maxTokensPerTurn:P.maxTokensPerTurn,temperature:P.temperature,systemPrompt:P.systemPrompt,maxIterations:P.maxIterations,execution:P.execution,prepareTurn:r1,tools:k,modelTools:I.modelTools,hooks:b.hooks,extensions:m,hookErrorMode:P.hookErrorMode,initialMessages:b.effectiveInput.initialMessages,userFileContentLoader:v_,toolPolicies:b.toolPolicies,requestToolApproval:b.requestToolApproval?async(g)=>{let G0=b.requestToolApproval,C0=this.sessions.get(Z);if(C0)await this.markTurnPending(C0);try{if(!G0)return{approved:!1,reason:"Tool approval callback is not configured."};return await G0(g)}finally{let c0=this.sessions.get(Z);if(c0?.status==="pending")await this.markTurnRunning(c0)}}:void 0,telemetry:P.telemetry,onConsecutiveMistakeLimitReached:P.onConsecutiveMistakeLimitReached,completionPolicy:I.completionPolicy,consumePendingUserMessage:()=>{let g=this.pendingPromptsController.consumeSteer(Z);return g?p4(g.prompt,g.mode??P.mode):void 0},logger:I.logger??P.logger,extensionContext:P.extensionContext,onEvent:(g)=>this.eventBridge.dispatchAgentEvent(Z,P,g)};X1.hooks={...X1.hooks,onEvent:async(g)=>{if(await b.hooks?.onEvent?.(g),g.type!=="assistant-message")return;let G0=this.sessions.get(Z);if(!G0)return;let C0=G0.agent.getMessages();try{await this.invoke("persistSessionMessages",Z,C0,P.systemPrompt)}catch(c0){P.logger?.error?.("Failed to persist session messages after assistant response",{sessionId:Z,error:c0}),q1(P.telemetry,{component:"core",operation:"session.persist_messages_after_assistant_response",error:c0,severity:"warn",handled:!0,context:{sessionId:Z,providerId:P.providerId,modelId:P.modelId}})}}};let I0=this.createAgentInstance(X1);if(X1.onEvent)I0.subscribeEvents(X1.onEvent);I.registerLeadAgent?.(I0);let r0=G$({agentId:I0.getAgentId(),conversationId:I0.getConversationId(),teamId:I.teamRuntime?.getTeamId(),teamName:I.teamRuntime?.getTeamName(),teamRole:I.teamRuntime?"lead":void 0});if(J_(P,Z,Q,U,r0),r0)K2(P.telemetry,{ulid:Z,modelId:P.modelId,provider:P.providerId,...r0});if(I.teamRuntime)gQ(P.telemetry,{ulid:Z,teamId:I.teamRuntime.getTeamId(),teamName:I.teamRuntime.getTeamName(),leadAgentId:I0.getAgentId(),restoredFromPersistence:I.teamRestoredFromPersistence===!0});let r={sessionId:Z,config:P,sessionMetadata:E,...L?{artifacts:L}:{},source:X,startedAt:L?.manifest.started_at??W,updatedAt:L?.manifest.ended_at??L?.manifest.started_at??W,pendingPrompt:D.prompt,runtime:I,agent:I0,started:!1,status:L?.manifest.status??(F?"idle":"running"),aborting:!1,interactive:$.interactive===!0,persistedMessages:Y,compactionState:m0,activeTeamRunIds:new Set,pendingTeamRunUpdates:[],teamRunWaiters:[],pendingPrompts:[],drainingPendingPrompts:!1,pluginSandboxShutdown:b.pluginSandboxShutdown,submitAndExitObserved:!1,taskCompletedEmitted:!1,lastInteractiveTurnFinishReason:void 0};if(y0=r,r.compactionState&&!this.isCompactionStateForSession(r.sessionId,r.compactionState,r))r.config.logger?.log?.("Ignoring session compaction state for a different conversation",{severity:"warn",sessionId:r.sessionId,conversationId:r.compactionState.conversation_id}),r.compactionState=void 0;if(this.sessions.set(Z,r),L)await this.refreshActiveSessionGitMetadata(r,b.gitState);if(Y.length>0&&!L)try{await this.ensureSessionPersisted(r),await this.invoke("persistSessionMessages",Z,Y,r.config.systemPrompt)}catch(g){r.config.logger?.error?.("Failed to persist seeded session messages at start",{sessionId:Z,error:g}),q1(r.config.telemetry,{component:"core",operation:"session.persist_seeded_messages",error:g,severity:"warn",handled:!0,context:{sessionId:Z,providerId:r.config.providerId,modelId:r.config.modelId}})}this.emitStatus(Z,r.status);let W1;try{if(j.prompt?.trim())if(W1=await this.executeTurn(r,{prompt:j.prompt,userImages:j.userImages,userFiles:j.userFiles}),!r.interactive)await this.finalizeSingleRun(r,W1.finishReason);else await this.completeInteractiveTurn(r,W1.finishReason)}catch(g){if(r.interactive&&r.aborting)W1=await this.completeAbortedInteractiveTurn(r);else{q1(r.config.telemetry,{component:"core",operation:"session.start",error:g,severity:"error",handled:!1,context:{sessionId:r.sessionId,providerId:r.config.providerId,modelId:r.config.modelId}});try{await this.failSession(r)}catch(G0){r.config.logger?.error?.("Session failure cleanup threw",{sessionId:r.sessionId,error:G0})}throw g}}return{sessionId:Z,manifest:D,manifestPath:H,messagesPath:G,result:W1}}async restoreSession($){return this.sessionVersioning.restoreCheckpoint({...$,getSession:(Z)=>this.getSession(Z),readMessages:(Z)=>this.readSessionMessages(Z),buildStartInput:(Z,Q)=>{let J=Z.restoredCheckpointMetadata?{...Q.sessionMetadata??{},checkpoint:Z.restoredCheckpointMetadata}:Q.sessionMetadata;return{...Q,...J?{sessionMetadata:J}:{},initialMessages:Z.initialMessages}},startSession:(Z)=>this.startSession(Z),getStartedSessionId:(Z)=>Z.sessionId,cleanupStartedSession:async(Z)=>{if(!await this.deleteSession(Z.sessionId))throw Error(`Failed to clean up restored session ${Z.sessionId}`)},readRestoredSession:(Z)=>this.getSession(Z)})}async runTurn($){let Z=this.getSessionOrThrow($.sessionId),Q=Z.agent.canStartRun(),J=$.delivery??(Z.interactive&&!Q?"queue":void 0);if(Z.config.telemetry?.capture({event:"session.input_sent",properties:{sessionId:$.sessionId,promptLength:$.prompt.length,userImageCount:$.userImages?.length??0,userFileCount:$.userFiles?.length??0,delivery:J??"immediate"}}),J==="queue"||J==="steer"){this.pendingPromptsController.enqueue($.sessionId,{prompt:$.prompt,mode:$.mode,delivery:J,userImages:$.userImages,userFiles:$.userFiles});return}try{let X=await this.executeTurn(Z,{prompt:$.prompt,mode:$.mode,userImages:$.userImages,userFiles:$.userFiles});if(!Z.interactive)await this.finalizeSingleRun(Z,X.finishReason);else await this.completeInteractiveTurn(Z,X.finishReason);if(X.finishReason!=="error")queueMicrotask(()=>{this.pendingPromptsController.drain($.sessionId)});return X}catch(X){if(Z.interactive&&Z.aborting)return await this.completeAbortedInteractiveTurn(Z);throw q1(Z.config.telemetry,{component:"core",operation:"session.submit",error:X,severity:"error",handled:!1,context:{sessionId:Z.sessionId,providerId:Z.config.providerId,modelId:Z.config.modelId}}),await this.failSession(Z),X}}async getAccumulatedUsage($){let Z=wX(this.usageBySession.get($)),Q=wX(this.aggregateUsageBySession.get($));return Z||Q?{usage:Z,aggregateUsage:Q}:void 0}async abort($,Z){let Q=this.sessions.get($);if(!Q)return;if(Q.config.telemetry?.capture({event:"session.aborted",properties:{sessionId:$}}),Q.aborting=!0,Q.drainingPendingPrompts)this.pendingPromptsController.discardQueue(Q);Q.agent.abort(Z)}async proceedWhileRunning($,Z){return this.runCommandExecutionController.proceedWhileRunning($,Z)}async stopSession($){let Z=this.sessions.get($);if(!Z)return;if(Z.config.telemetry?.capture({event:"session.stopped",properties:{sessionId:$}}),Z.interactive&&!P0(Z.status)){await this.releaseSessionRuntime(Z,"session_stop");return}if(Z.interactive&&Z.agent.canStartRun()){await this.shutdownSession(Z,{status:this.resolveInteractiveStopStatus(Z),exitCode:this.resolveInteractiveStopExitCode(Z),shutdownReason:"session_stop",endReason:"stopped"});return}Z.aborting=!0,Z.agent.abort(Error("session_stop")),await this.shutdownSession(Z,{status:"cancelled",exitCode:0,shutdownReason:"session_stop",endReason:"stopped"})}async dispose($="session_manager_dispose"){let Z=[...this.sessions.values()];if(Z.length===0)return;await Promise.allSettled(Z.map((Q)=>Q.interactive&&!P0(Q.status)?this.releaseSessionRuntime(Q,$):Q.interactive&&Q.agent.canStartRun()?this.shutdownSession(Q,{status:this.resolveInteractiveStopStatus(Q),exitCode:this.resolveInteractiveStopExitCode(Q),shutdownReason:$,endReason:"disposed"}):this.shutdownSession(Q,{status:"cancelled",exitCode:0,shutdownReason:$,endReason:"disposed"}))),this.usageBySession.clear(),this.aggregateUsageBySession.clear()}async getSession($){let Z=this.sessions.get($);if(Z)return qj(Z);let Q=$.trim();if(!Q)return;let J=await this.getRow(Q);if(J)return C4(J);let X=await this.readManifest(Q);return X?kX(X):void 0}async listSessions($=200){let Q=(await this.listRows($)).map(C4),J=new Set(Q.map((X)=>X.sessionId));for(let X of this.sessions.values()){if(J.has(X.sessionId))continue;Q.unshift(qj(X))}return Q.slice(0,$)}async deleteSession($){if(this.sessions.has($))await this.stopSession($);let Z=await this.invoke("deleteSession",$);if(Z.deleted)this.usageBySession.delete($),this.aggregateUsageBySession.delete($);return Z.deleted}async updateSession($,Z){return{updated:(await this.invokeOptionalValue("updateSession",{sessionId:$,prompt:Z.prompt,metadata:Z.metadata,title:Z.title}))?.updated===!0}}async updateSessionCompactionState($,Z){let Q=$.trim();if(!Q)return{updated:!1};let J=this.sessions.get(Q),X=J?void 0:await this.getSession(Q);if(!(J??X))return{updated:!1};if(J){let Y=await this.readSessionMessages(Q),V=Z.source_message_count>0&&Y.length>=Z.source_message_count,K=V?Y:void 0;if(V){if(!await this.canPersistCompactionState(Q,Z,J,void 0,Y))return{updated:!1};J.agent.restore(Y)}return await this.persistActiveSessionCompactionState(J,Z,K)}if(!await this.canPersistCompactionState(Q,Z,void 0,X))return{updated:!1};let j=await this.invokeOptionalValue("readSessionCompactionState",Q);if(m_(Z,j))return{updated:!1};return await this.invoke("persistSessionCompactionState",Q,Z),{updated:!0}}async readSessionCompactionState($){let Z=$.trim();if(!Z)return;let Q=this.sessions.get(Z);if(Q)for(;;){let J=Q.compactionStateWriteQueue;if(!J)return Q.compactionState;await J.catch(()=>{return})}return await this.invokeOptionalValue("readSessionCompactionState",Z)}isCompactionStateForSession($,Z,Q,J){let X=Z.conversation_id?.trim();if(!X)return!0;if(X===$)return!0;let W=Q?.agent.getConversationId()?.trim()||J?.conversationId?.trim();return W?X===W:!1}async canPersistCompactionState($,Z,Q,J,X){if(!Z.conversation_id?.trim())return!1;if(!this.isCompactionStateForSession($,Z,Q,J))return!1;let W=X??Q?.agent.getMessages()??await this.readSessionMessages($);return p6(Z,W)!==void 0}async persistActiveSessionCompactionState($,Z,Q){if(!await this.canPersistCompactionState($.sessionId,Z,$,void 0,Q))return{updated:!1};return await this.enqueueCompactionStateWrite($,async()=>{let J=$.compactionState,X=J!==void 0&&p6(J,Q??$.agent.getMessages())!==void 0;if(J&&(X?m_(Z,J):Date.parse(Z.updated_at)<Date.parse(J.updated_at)))return{updated:!1};return await this.invoke("persistSessionCompactionState",$.sessionId,Z),$.compactionState=Z,{updated:!0}})}async enqueueCompactionStateWrite($,Z){let J=($.compactionStateWriteQueue??Promise.resolve()).catch(()=>{return}).then(Z),X=J.then(()=>{return},()=>{return});$.compactionStateWriteQueue=X;try{return await J}finally{if($.compactionStateWriteQueue===X)$.compactionStateWriteQueue=void 0}}async readLiveSessionMessages($){let Z=$.trim();if(!Z)return[];let Q=this.sessions.get(Z);if(Q){let J=Q.agent.getMessages();if(J.length>0)return J}return this.readSessionMessages(Z)}async readSessionMessages($){let Z=$.trim();if(!Z)return[];let Q=await this.getRow(Z);if(Q?.messagesPath)return u$(Q.messagesPath);let J=await this.readManifest(Z);return u$(J?.messages_path)}async dispatchHookEvent($){await RF($,{queueSpawnRequest:(Z)=>this.invokeOptional("queueSpawnRequest",Z),upsertSubagentSessionFromHook:(Z)=>this.invokeOptionalValue("upsertSubagentSessionFromHook",Z),appendSubagentHookAudit:(Z,Q)=>this.invokeOptional("appendSubagentHookAudit",Z,Q),applySubagentStatus:(Z,Q)=>this.invokeOptional("applySubagentStatus",Z,Q)})}subscribe($,Z){return this.events.subscribe($,Z)}async updateSessionModel($,Z){await this.updateSessionConnection($,{modelId:Z})}async updateSessionConnection($,Z){let Q=P6(Z),J=this.getSessionOrThrow($);if(Q.providerId!==void 0)J.config.providerId=Q.providerId;if(Q.modelId!==void 0)J.config.modelId=Q.modelId;if(Q.apiKey!==void 0)J.config.apiKey=Q.apiKey;if(Q.baseUrl!==void 0)J.config.baseUrl=Q.baseUrl;if(Q.headers!==void 0)J.config.headers=Q.headers;if(Q.providerConfig!==void 0)J.config.providerConfig=Q.providerConfig;if(Object.hasOwn(Q,"reasoningEffort"))J.config.reasoningEffort=Q.reasoningEffort??void 0;if(Object.hasOwn(Q,"thinkingBudgetTokens"))J.config.thinkingBudgetTokens=Q.thinkingBudgetTokens??void 0;if(Object.hasOwn(Q,"thinking")){if(J.config.thinking=Q.thinking??void 0,Q.thinking===!1||Q.thinking===null)J.config.reasoningEffort=void 0,J.config.thinkingBudgetTokens=void 0}let X={...Q.providerId!==void 0?{providerId:Q.providerId}:{},...Q.modelId!==void 0?{modelId:Q.modelId}:{},...Q.apiKey!==void 0?{apiKey:Q.apiKey}:{},...Q.baseUrl!==void 0?{baseUrl:Q.baseUrl}:{},...Q.headers!==void 0?{headers:Q.headers}:{},...Q.providerConfig!==void 0?{providerConfig:Q.providerConfig}:{},...Object.hasOwn(Q,"reasoningEffort")?{reasoningEffort:Q.reasoningEffort??void 0}:{},...Object.hasOwn(Q,"thinking")?{thinking:Q.thinking??void 0}:{},...Object.hasOwn(Q,"thinkingBudgetTokens")?{thinkingBudgetTokens:Q.thinkingBudgetTokens??void 0}:{}};if(Q.thinking===!1||Q.thinking===null)X.reasoningEffort=void 0,X.thinkingBudgetTokens=void 0;let W={...Q.apiKey!==void 0?{apiKey:Q.apiKey}:{},...Q.baseUrl!==void 0?{baseUrl:Q.baseUrl}:{},...Q.headers!==void 0?{headers:Q.headers}:{}};if(J.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults(X),J.agent.updateConnection(Q),J.runtime.teamRuntime?.updateTeammateConnections(W),Q.providerId||Q.modelId)await this.mutateSessionManifest(J,(j)=>{if(Q.providerId)j.provider=Q.providerId;if(Q.modelId)j.model=Q.modelId})}async mutateSessionManifest($,Z){let Q=$.artifacts;if(!Q)return;let J=$.sessionId,W=(this.manifestMutationQueues.get(J)??Promise.resolve()).then(async()=>{let Y=await this.invokeOptionalValue("readSessionManifest",J)??Q.manifest;return Z(Y),Q.manifest=Y,await this.invoke("writeSessionManifest",Q.manifestPath,Y),Y}),j=W.then(()=>{return},()=>{return});this.manifestMutationQueues.set(J,j);try{return await W}finally{if(this.manifestMutationQueues.get(J)===j)this.manifestMutationQueues.delete(J)}}handlePluginEvent($,Z,Q){return this.eventBridge.handlePluginEvent($,Z,Q)}async executeTurn($,Z){let Q=await this.prepareTurnInput($,Z),J=Q.prompt.trim(),X=Q?.userImages?.length,W=Q?.userFiles?.length;if(!J&&!X&&!W)throw Error("prompt cannot be empty");if(!$.artifacts&&!$.pendingPrompt)$.pendingPrompt=J;if(await this.ensureSessionPersisted($),!$.pendingPrompt){$.pendingPrompt=J;try{await this.invokeOptionalValue("updateSession",{sessionId:$.sessionId,prompt:J})}catch(j){$.config.logger?.log?.("Failed to backfill seeded session prompt",{severity:"warn",sessionId:$.sessionId,error:j})}}await this.refreshActiveSessionGitMetadata($),await this.syncOAuthCredentials($),await this.markTurnRunning($);try{let j=await this.executeAgentTurn($,J,Q.userImages,Q.userFiles);while(TW($,j.finishReason)){let Y=await EW($);if(Y.length===0)break;let V=MW($,Y);j=await this.executeAgentTurn($,V)}return j}finally{await this.refreshActiveSessionGitMetadata($)}}async completeInteractiveTurn($,Z){if(l4($))return;$.lastInteractiveTurnFinishReason=Z,await this.markTurnIdle($),$.aborting=!1}resolveInteractiveStopStatus($){let Z=$.lastInteractiveTurnFinishReason;if(!Z)return"cancelled";switch(Z){case"completed":return"completed";case"error":return"failed";case"aborted":case"max_iterations":case"mistake_limit":return"cancelled"}return Z}resolveInteractiveStopExitCode($){return $.lastInteractiveTurnFinishReason==="error"?1:0}async completeAbortedInteractiveTurn($){let Z=new Date,Q=$.agent.getMessages(),J=p0();if($.persistedMessages=Q,$.started=$.started||Q.length>0,Q.length>0)try{await this.ensureSessionPersisted($),await this.invoke("persistSessionMessages",$.sessionId,Q,$.config.systemPrompt)}catch(X){$.config.logger?.error?.("Failed to persist session messages after abort",{sessionId:$.sessionId,error:X}),q1($.config.telemetry,{component:"core",operation:"session.persist_messages_after_abort",error:X,severity:"warn",handled:!0,context:{sessionId:$.sessionId,providerId:$.config.providerId,modelId:$.config.modelId}})}return this.eventBridge.dispatchAgentEvent($.sessionId,$.config,{type:"done",reason:"aborted",text:"",iterations:0,usage:J}),await this.completeInteractiveTurn($,"aborted"),queueMicrotask(()=>{this.pendingPromptsController.drain($.sessionId)}),{text:"",usage:J,messages:Q,toolCalls:[],iterations:0,finishReason:"aborted",model:{id:$.config.modelId,provider:$.config.providerId},startedAt:Z,endedAt:Z,durationMs:0}}async executeAgentTurn($,Z,Q,J){let X=$.started||$.agent.getMessages().length>0,W=$.persistedMessages??$.agent.getMessages(),j=this.usageBySession.get($.sessionId)??p0(),Y=this.aggregateUsageBySession.get($.sessionId)??j;$.turnUsageBaseline=j,$.turnAggregateUsageBaseline=Y,$.turnPrimaryUsage=p0(),$.turnUsageByAgent=new Map,bQ($.config.telemetry,$.sessionId,$.config.mode),O8($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,model:$.config.modelId,source:"user",mode:$.config.mode,...this.getSessionAgentTelemetryIdentity($)});try{let V=X?()=>$.agent.continue(Z,Q,J):()=>$.agent.run(Z,Q,J),K=await this.runWithAuthRetry($,V,W);$.started=!0;let B=k7(K.messages,K,W);$.persistedMessages=B;let G=WZ($.turnUsageByAgent?.values()??[]),H=v0(j,K.usage),U=v0(v0(p0(),K.usage),G),F=v0(Y,U);return this.usageBySession.set($.sessionId,H),this.aggregateUsageBySession.set($.sessionId,F),await this.persistSessionMetadata($.sessionId,(D)=>({...D??{},totalCost:H.totalCost,aggregatedAgentsCost:F.totalCost,usage:H,aggregateUsage:F})),await this.invoke("persistSessionMessages",$.sessionId,B,$.config.systemPrompt),this.observeTaskCompletionTool($,K),K}catch(V){q1($.config.telemetry,{component:"core",operation:"session.turn",error:V,severity:"error",handled:!1,context:{sessionId:$.sessionId,providerId:$.config.providerId,modelId:$.config.modelId}});try{await this.invoke("persistSessionMessages",$.sessionId,$.agent.getMessages(),$.config.systemPrompt)}catch(K){$.config.logger?.error?.("Failed to persist session messages after turn error",{sessionId:$.sessionId,error:K})}throw V}finally{$.turnUsageBaseline=void 0,$.turnAggregateUsageBaseline=void 0,$.turnPrimaryUsage=void 0,$.turnUsageByAgent=void 0}}observeTaskCompletionTool($,Z){if($.submitAndExitObserved)return;if(!Z.toolCalls.some((J)=>J.name===A0.SUBMIT_AND_EXIT&&J.error===void 0))return;$.submitAndExitObserved=!0,$.taskCompletedEmitted=!0,g5($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,modelId:$.config.modelId,mode:$.config.mode,durationMs:Date.now()-Date.parse($.startedAt),source:"submit_and_exit",...this.getSessionAgentTelemetryIdentity($)})}emitTaskCompletedOnTeardown($,Z){if($.taskCompletedEmitted||$.submitAndExitObserved)return;if(!($.interactive?$.lastInteractiveTurnFinishReason==="completed"&&!$.aborting&&$.agent.canStartRun():Z==="completed"))return;$.taskCompletedEmitted=!0,g5($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,modelId:$.config.modelId,mode:$.config.mode,durationMs:Date.now()-Date.parse($.startedAt),source:"shutdown",...this.getSessionAgentTelemetryIdentity($)})}async prepareTurnInput($,Z){let Q=H$($.config),J=gm(Z.prompt).trim();if(!J)return{prompt:"",userImages:Z.userImages,userFiles:this.resolveAbsoluteFilePaths($.config.cwd,Z.userFiles)};let X=await a9(J,Q);X_($.config.telemetry,X);let W=p4(X.prompt,Z.mode??$.config.mode),j=this.resolveAbsoluteFilePaths($.config.cwd,Z.userFiles),Y=this.resolveAbsoluteFilePaths(Q,X.matchedFiles),V=Array.from(new Set([...j,...Y]));return{prompt:W,userImages:Z.userImages,userFiles:V.length>0?V:void 0}}async ensureSessionPersisted($){if($.artifacts)return;let Z=H$($.config);if($.artifacts=await this.invoke("createRootSessionWithArtifacts",{sessionId:$.sessionId,source:$.source,pid:process.pid,interactive:$.interactive,provider:$.config.providerId,model:$.config.modelId,cwd:$.config.cwd,workspaceRoot:Z,teamName:$.config.teamName,enableTools:$.config.enableTools,enableSpawn:$.config.enableSpawnAgent,enableTeams:$.config.enableAgentTeams,prompt:$.pendingPrompt,metadata:$.sessionMetadata,startedAt:$.startedAt}),$.compactionState){if(!(await this.persistActiveSessionCompactionState($,$.compactionState)).updated)$.compactionState=void 0}}async markTurnRunning($){if($.status==="running")return;await this.updateStatus($,"running",null)}async refreshActiveSessionGitMetadata($,Z){try{let Q=Z??await $F(H$($.config));if(!Q||!$.artifacts)return;if(tU($.artifacts.manifest.metadata,Q))return;await this.persistSessionMetadata($.sessionId,(J)=>WX({...J??{},...$.sessionMetadata??{}},Q))}catch(Q){$.config.logger?.debug?.("Failed to refresh session git metadata",{sessionId:$.sessionId,error:Q})}}async markTurnPending($){if($.status==="pending")return;await this.updateStatus($,"pending",null)}async markTurnIdle($){if($.status==="idle")return;await this.updateStatus($,"idle",null)}async persistSessionMetadata($,Z){let Q=this.sessions.get($),J=await this.invokeOptionalValue("readSessionManifest",$)??Q?.artifacts?.manifest,X=Z(J?.metadata);if(!Q?.artifacts)return;if((await this.invokeOptionalValue("updateSession",{sessionId:$,metadata:X}))?.updated===!1)return;Q.sessionMetadata=X,Q.artifacts.manifest.metadata=X}async finalizeSingleRun($,Z){if(l4($))return;let Q=Z==="aborted"||$.aborting,J=Z==="error";await this.shutdownSession($,{status:Q?"cancelled":J?"failed":"completed",exitCode:J?1:0,shutdownReason:J?"session_error":"session_complete",endReason:Z})}async failSession($){$.lastInteractiveTurnFinishReason="error",await this.shutdownSession($,{status:"failed",exitCode:1,shutdownReason:"session_error",endReason:"error"})}async shutdownSession($,Z){if(this.emitTaskCompletedOnTeardown($,Z.status),t7($),!$.aborting&&!$.agent.canStartRun())$.aborting=!0,$.agent.abort(Error(Z.shutdownReason));let Q=[],J=(X,W)=>{Q.push(W),$.config.logger?.log("Session shutdown cleanup failed",{sessionId:$.sessionId,stage:X,error:W,severity:"warn"}),q1($.config.telemetry,{component:"core",operation:"session.shutdown_cleanup",error:W,severity:"warn",handled:!0,context:{sessionId:$.sessionId,stage:X,status:Z.status,shutdownReason:Z.shutdownReason,providerId:$.config.providerId,modelId:$.config.modelId}})};if($.artifacts){await this.refreshActiveSessionGitMetadata($);try{await this.updateStatus($,Z.status,Z.exitCode)}catch(X){J("update_status",X)}}try{await $.agent.shutdown(Z.shutdownReason)}catch(X){J("agent_shutdown",X)}try{await Promise.resolve($.runtime.shutdown(Z.shutdownReason))}catch(X){J("runtime_shutdown",X)}try{await $.pluginSandboxShutdown?.()}catch(X){J("plugin_sandbox_shutdown",X)}if(this.sessions.delete($.sessionId),this.emit({type:"ended",payload:{sessionId:$.sessionId,reason:Z.endReason,ts:Date.now()}}),Q.length>0&&Z.status==="failed")throw Q[0]}async releaseSessionRuntime($,Z){this.emitTaskCompletedOnTeardown($);let Q=[],J=(X,W)=>{Q.push(W),$.config.logger?.log("Session runtime cleanup failed",{sessionId:$.sessionId,stage:X,error:W,severity:"warn"}),q1($.config.telemetry,{component:"core",operation:"session.runtime_cleanup",error:W,severity:"warn",handled:!0,context:{sessionId:$.sessionId,stage:X,reason:Z,providerId:$.config.providerId,modelId:$.config.modelId}})};if(!$.aborting&&!$.agent.canStartRun())$.aborting=!0,$.agent.abort(Error(Z));try{await $.agent.shutdown(Z)}catch(X){J("agent_shutdown",X)}try{await Promise.resolve($.runtime.shutdown(Z))}catch(X){J("runtime_shutdown",X)}try{await $.pluginSandboxShutdown?.()}catch(X){J("plugin_sandbox_shutdown",X)}if(this.sessions.delete($.sessionId),Q.length>0)throw Q[0]}async updateStatus($,Z,Q){if(!$.artifacts)return;let J=await this.invoke("updateSessionStatus",$.sessionId,Z,Q);if(!J.updated)return;let X=await this.mutateSessionManifest($,(W)=>{if(W.status=Z,P0(Z))delete W.ended_at,W.exit_code=null;else W.ended_at=J.endedAt??U0(),W.exit_code=typeof Q==="number"?Q:null});if(!X)return;$.status=Z,$.updatedAt=J.endedAt??U0(),$.endedAt=P0(Z)?null:X.ended_at,$.exitCode=X.exit_code,this.emitStatus($.sessionId,Z)}async runWithAuthRetry($,Z,Q){try{return await Z()}catch(J){if(!X6($.config.providerId)||!vm(J))throw J;return await this.syncOAuthCredentials($,{forceRefresh:!0}),$.agent.restore(Q),Z()}}async syncOAuthCredentials($,Z){let Q=null;try{Q=await this.oauthTokenManager.resolveProviderApiKey({providerId:$.config.providerId,forceRefresh:Z?.forceRefresh})}catch(J){if(J instanceof W5)throw Error(`${J.providerId} requires re-authentication.`);throw J}if(!Q?.apiKey||$.config.apiKey===Q.apiKey)return;$.config.apiKey=Q.apiKey,$.agent.updateConnection({apiKey:Q.apiKey}),$.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults({apiKey:Q.apiKey}),$.runtime.teamRuntime?.updateTeammateConnections({apiKey:Q.apiKey})}getSessionOrThrow($){let Z=this.sessions.get($);if(!Z){let Q=new f2($);throw q1(this.defaultTelemetry,{component:"core",operation:"session.active_lookup",error:Q,severity:"warn",handled:!0,context:{sessionId:$,activeSessionCount:this.sessions.size}}),Q}return Z}resolveAbsoluteFilePaths($,Z){if(!Z||Z.length===0)return[];let Q=Z.map((J)=>J.trim()).filter((J)=>J.length>0).map((J)=>Im(J)?J:Rj($,J));return Array.from(new Set(Q))}getSessionAgentTelemetryIdentity($){return G$({agentId:$.agent.getAgentId(),conversationId:$.agent.getConversationId(),teamId:$.runtime.teamRuntime?.getTeamId(),teamName:$.runtime.teamRuntime?.getTeamName(),teamRole:$.runtime.teamRuntime?"lead":void 0})}async seedAggregateUsageFromArtifacts($){let Z=await this.summarizePersistedTeammateUsage($.sessionDir,$.rootMessagesPath,$.manifest.session_id),Q=v0($.initialUsage,Z);return this.withPersistedAggregateUsageFloor(Q,$.manifest)}async summarizePersistedTeammateUsage($,Z,Q){let J=Rj(Z),X=`${Q}.messages.json`,W;try{W=xm($)}catch{return p0()}let j=p0();for(let Y of W){if(!Y.endsWith(".messages.json"))continue;if(Y===X)continue;let V=Rj($,Y);if(V===J)continue;let K=await u$(V);if(K.length===0)continue;j=v0(j,jZ(K))}return j}withPersistedAggregateUsageFloor($,Z){let Q=um(Z.metadata?.aggregateUsage);if(Q)return dm($,Q);let J=Z.metadata?.aggregatedAgentsCost;if(typeof J!=="number"||!Number.isFinite(J)||J<=$.totalCost)return $;return{...$,totalCost:J}}emitStatus($,Z){this.emitSessionSnapshot($),this.emit({type:"status",payload:{sessionId:$,status:Z}})}async emitSessionSnapshot($){let Z=await this.getSession($);if(!Z)return;this.emit({type:"session_snapshot",payload:{sessionId:$,snapshot:d$({session:Z,messages:await this.readSessionMessages($),usage:this.usageBySession.get($),aggregateUsage:this.aggregateUsageBySession.get($)})}})}emit($){this.events.emit($)}async listRows($){return this.invoke("listSessions",Math.min(Math.max(1,Math.floor($)),g_))}async getRow($){let Z=$.trim();if(!Z)return;return(await this.listRows(g_)).find((J)=>J.sessionId===Z)}async readManifest($){let Z=$.trim();if(!Z)return;return await this.invokeOptionalValue("readSessionManifest",Z)}invoke($,...Z){return y_(this.sessionService,$,...Z)}invokeOptional($,...Z){return I_(this.sessionService,$,...Z)}invokeOptionalValue($,...Z){return h_(this.sessionService,$,...Z)}}function lm($){if($.backendMode)return $.backendMode;if(process.env.CLINE_VCR?.trim())return"local";let Z=process.env.CLINE_SESSION_BACKEND_MODE?.trim().toLowerCase();if(Z==="local"||Z==="hub"||Z==="remote")return Z;return"auto"}var Y5,V5;function pm($,Z){if($!=="auto"&&$!=="hub")return;if(Z.hub?.endpoint?.trim())return;nF(Z.hub?.workspaceRoot?.trim()||Z.hub?.cwd?.trim()||process.cwd())}async function im($){await $.reconcileDeadSessions?.().catch(()=>{})}function d_($){try{let Z=new i$;return Z.init(),new a$(Z,{messagesArtifactUploader:$.messagesArtifactUploader,logger:$.logger})}catch(Z){return $.telemetry?.capture({event:"session_backend_fallback",properties:{requestedBackend:"sqlite",fallbackBackend:"file"}}),u_($.telemetry,{component:"core",operation:"session_backend.sqlite_init",error:Z,severity:"warn",handled:!0,context:{requestedBackend:"sqlite",fallbackBackend:"file"}}),new fW(void 0,{messagesArtifactUploader:$.messagesArtifactUploader,logger:$.logger})}}function c_($,Z,Q){return new t$({sessionService:Q??$.sessionService??d_($),capabilities:$.capabilities,logger:$.logger,telemetry:$.telemetry,toolPolicies:$.toolPolicies,distinctId:Z,fetch:$.fetch})}async function rm($){if(Y5)return Y5;if(V5)return await V5;return V5=(async()=>{return Y5=d_($),await im(Y5),Y5})().finally(()=>{V5=void 0}),await V5}async function SZ($){let Z=L1($.distinctId);$.telemetry?.setDistinctId(Z);let Q=lm($);if(Q==="remote"){let J=$.remote?.endpoint?.trim();if(!J)throw Error("Remote runtime mode requires `remote.endpoint` to be configured.");return $.logger?.log("Using remote runtime host",{endpoint:J}),new d7({endpoint:J,authToken:$.remote?.authToken,clientType:$.remote?.clientType,displayName:$.remote?.displayName,workspaceRoot:$.remote?.workspaceRoot,cwd:$.remote?.cwd,capabilities:$.capabilities})}if(Q==="hub"){let J=$.hub?.endpoint?.trim(),X=J||await I4({strategy:$.hub?.strategy??"require-hub",workspaceRoot:$.hub?.workspaceRoot,cwd:$.hub?.cwd});if(!X)throw Error("No compatible hub runtime is available.");return $.logger?.log("Using hub runtime host",{url:X,explicitEndpoint:J||void 0}),new h2({url:X,authToken:$.hub?.authToken,clientType:$.hub?.clientType,displayName:$.hub?.displayName,capabilities:$.capabilities,telemetry:$.telemetry},{workspaceRoot:$.hub?.workspaceRoot,cwd:$.hub?.cwd})}if(Q==="auto"){let J=await ZW({endpoint:$.hub?.endpoint,strategy:$.hub?.strategy??"prefer-hub",workspaceRoot:$.hub?.workspaceRoot,cwd:$.hub?.cwd});if(J){$.logger?.log("Using discovered local hub runtime host",{url:J});let X=new h2({url:J,authToken:$.hub?.authToken,clientType:$.hub?.clientType,displayName:$.hub?.displayName,capabilities:$.capabilities,telemetry:$.telemetry},{workspaceRoot:$.hub?.workspaceRoot,cwd:$.hub?.cwd});try{return await X.connect(),X}catch(W){$.logger?.log("Falling back to local runtime host",{reason:"hub_connect_failed",severity:"warn",error:W}),u_($.telemetry,{component:"core",operation:"runtime_host.hub_connect",error:W,severity:"warn",handled:!0,context:{backendMode:"auto",fallbackBackend:"local"}})}}return pm(Q,$),$.logger?.log("Falling back to local runtime host",{reason:"compatible_hub_unavailable",severity:"warn"}),c_($,Z)}return c_($,Z)}import{existsSync as am,mkdirSync as nm,readFileSync as om,writeFileSync as sm}from"node:fs";import{dirname as tm}from"node:path";import{FEATURE_FLAGS as l_,FeatureFlagDefaultValue as Pj}from"@cline/shared";var em=3600000,$c=604800000,p_=1;class K5{provider;telemetry;logger;cacheTtlMs;cacheFilePath;persistentCacheMaxAgeMs;context;cache=new Map;cacheInfo={updateTime:0,userId:null};constructor($){this.provider=$.provider,this.telemetry=$.telemetry,this.logger=$.logger,this.cacheTtlMs=$.cacheTtlMs??em,this.cacheFilePath=$.cacheFilePath,this.persistentCacheMaxAgeMs=$.persistentCacheMaxAgeMs??$c,this.context={...$.context??{}},this.hydrateFromPersistentCache()}setContext($){this.context={...$}}hydrateCache($){this.cacheInfo={updateTime:$.updateTime,userId:$.userId,flagsPayload:$.flagsPayload},this.rebuildCacheFromSnapshot($.flagsPayload)}getCacheSnapshot(){return{updateTime:this.cacheInfo.updateTime,userId:this.cacheInfo.userId,flagsPayload:this.cacheInfo.flagsPayload}}async poll($){let Z=$??this.context.userId??null,Q=Date.now();if(Q-this.cacheInfo.updateTime<this.cacheTtlMs){if(this.cacheInfo.userId===Z)return}let J=this.cacheInfo;this.cacheInfo={updateTime:Q,userId:Z||null};try{let X=await this.provider.getAllFlagsAndPayloads({flagKeys:l_.length>0?l_:void 0,context:{...this.context,userId:Z}});if(this.cacheInfo.userId!==Z)return;this.cacheInfo.flagsPayload=X,this.rebuildCacheFromSnapshot(X),this.writePersistentCache()}catch(X){if(this.cacheInfo.userId!==Z)return;throw this.cacheInfo=J.updateTime?J:{updateTime:0,userId:null},this.logger?.error?.("Error polling SDK feature flags",{error:X}),X}}hydrateFromPersistentCache(){let $=this.readPersistentCache();if($)this.hydrateCache($)}isFeatureFlagPayload($){if($===null||typeof $==="string"||typeof $==="number"||typeof $==="boolean")return!0;if(Array.isArray($))return $.every((Z)=>this.isFeatureFlagPayload(Z));if(typeof $==="object")return Object.values($).every((Z)=>this.isFeatureFlagPayload(Z));return!1}readPayloadRecord($){if(!$||typeof $!=="object"||Array.isArray($))return;let Z=Object.entries($).filter(([,J])=>this.isFeatureFlagPayload(J));if(Z.length===0)return;let Q={};for(let[J,X]of Z)Q[J]=X;return Q}readPersistentCache(){try{if(!this.cacheFilePath||!am(this.cacheFilePath))return;let $=JSON.parse(om(this.cacheFilePath,"utf8"));if(!$||typeof $!=="object")return;let Z=$;if(Z.version!==p_||typeof Z.updatedAt!=="number"||!Number.isFinite(Z.updatedAt)||Date.now()-Z.updatedAt>this.persistentCacheMaxAgeMs)return;return{updateTime:Z.updatedAt,userId:Z.userId??null,flagsPayload:{featureFlags:this.readPayloadRecord(Z.flagsPayload?.featureFlags),featureFlagPayloads:this.readPayloadRecord(Z.flagsPayload?.featureFlagPayloads)}}}catch($){this.logger?.error?.("Error reading SDK feature flags cache",{error:$});return}}writePersistentCache(){try{if(!this.cacheFilePath)return;nm(tm(this.cacheFilePath),{recursive:!0,mode:448});let $=this.getCacheSnapshot(),Z={version:p_,updatedAt:$.updateTime,userId:$.userId,flagsPayload:$.flagsPayload};sm(this.cacheFilePath,`${JSON.stringify(Z,null,2)}
|
|
795
|
+
`).length:0;m5(Z.telemetry,{event:"ended",ulid:Q,durationMs:j,outputLines:Y,errorMessage:J.error?String(J.error):void 0,agentId:J.subAgentId,parentId:J.parentAgentId,...G$({agentId:J.subAgentId,conversationId:J.conversationId,parentAgentId:J.parentAgentId,teamId:X?.getTeamId(),teamName:X?.getTeamName(),createdByAgentId:J.parentAgentId})}),$.subAgentStarts.delete(J.subAgentId),$.invokeBackendOptional("handleSubAgentEnd",Q,J)}}}function Ej($,Z,Q,J){let X=Tj($,Z,Q);return S6({configProvider:{getRuntimeConfig:()=>$.getSession(Q)?.runtime.delegatedAgentConfigProvider?.getRuntimeConfig()??{providerId:Z.providerId,modelId:Z.modelId,cwd:Z.cwd,apiKey:Z.apiKey,baseUrl:Z.baseUrl,headers:Z.headers,providerConfig:Z.providerConfig,knownModels:Z.knownModels,thinking:Z.thinking,maxIterations:Z.maxIterations,hooks:Z.hooks,extensions:Z.extensions,logger:Z.logger,telemetry:Z.telemetry},getConnectionConfig:()=>$.getSession(Q)?.runtime.delegatedAgentConfigProvider?.getConnectionConfig()??{providerId:Z.providerId,modelId:Z.modelId,apiKey:Z.apiKey,baseUrl:Z.baseUrl,headers:Z.headers,providerConfig:Z.providerConfig,knownModels:Z.knownModels,thinking:Z.thinking},updateConnectionDefaults:()=>{}},createSubAgentTools:()=>{let j=Z.enableTools?e8({cwd:Z.cwd,telemetry:Z.telemetry,...k1[b$({mode:Z.mode})],executors:J}):[];if(Z.enableSpawnAgent)j.push(Ej($,Z,Q,J));return E$(j)},...X})}import{readFile as Sm,stat as bm}from"node:fs/promises";var km=20480000;async function v_($){let Z=await bm($);if(!Z.isFile())throw Error("Path is not a file");if(Z.size>km)throw Error("File is too large to read into context.");let Q=await Sm($,"utf8");if(Q.includes("\x00"))throw Error("Cannot read binary file into context.");return Q}var g_=5000,Cj;function cm($,Z){if(Cj)return;Cj=jG().then(()=>{return}).catch((Q)=>{Cj=void 0,$?.error?.("Detached command log recovery failed",{error:Q}),q1(Z,{component:"core",operation:"command.detached_log_recovery",error:Q,severity:"warn",handled:!0})})}function j5($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function um($){if(!$||typeof $!=="object"||Array.isArray($))return;let Z=$,Q=j5(Z.inputTokens),J=j5(Z.outputTokens),X=j5(Z.cacheReadTokens),W=j5(Z.cacheWriteTokens),j=j5(Z.totalCost);if(Q===void 0||J===void 0||X===void 0||W===void 0||j===void 0)return;return{inputTokens:Q,outputTokens:J,cacheReadTokens:X,cacheWriteTokens:W,totalCost:j}}function dm($,Z){return{inputTokens:Math.max($.inputTokens,Z.inputTokens),outputTokens:Math.max($.outputTokens,Z.outputTokens),cacheReadTokens:Math.max($.cacheReadTokens,Z.cacheReadTokens),cacheWriteTokens:Math.max($.cacheWriteTokens,Z.cacheWriteTokens),totalCost:Math.max($.totalCost,Z.totalCost)}}function m_($,Z){if(!Z)return!1;if($.source_message_count!==Z.source_message_count)return $.source_message_count<Z.source_message_count;return Date.parse($.updated_at)<Date.parse(Z.updated_at)}class t${runtimeAddress=void 0;pendingPrompts;sessionService;runtimeBuilder;createAgentInstance;toolExecutors;defaultCapabilities;defaultToolPolicies;providerSettingsManager;oauthTokenManager;defaultTelemetry;distinctId;defaultLogger;defaultFetch;events=new f4;sessions=new Map;manifestMutationQueues=new Map;usageBySession=new Map;aggregateUsageBySession=new Map;subAgentStarts=new Map;pendingPromptsController;eventBridge;sessionVersioning=new J8;runCommandExecutionController=new d8;constructor($){let Z=ym();if(Z)mm(Z);let Q=L1($.distinctId);this.distinctId=Q,this.sessionService=$.sessionService,this.runtimeBuilder=$.runtimeBuilder??new CZ,this.createAgentInstance=$.createAgent??((J)=>new y$(J)),this.defaultCapabilities=o0($.capabilities),this.toolExecutors=this.defaultCapabilities?.toolExecutors,this.defaultToolPolicies=$.toolPolicies,this.providerSettingsManager=$.providerSettingsManager??new s$,this.oauthTokenManager=$.oauthTokenManager??new PZ({providerSettingsManager:this.providerSettingsManager,telemetry:$.telemetry}),this.defaultTelemetry=$.telemetry,this.defaultLogger=$.logger,this.defaultTelemetry?.setDistinctId(Q),this.defaultFetch=$.fetch,cm(this.defaultLogger,this.defaultTelemetry),this.pendingPromptsController=new Oj({getSession:(J)=>this.sessions.get(J),emit:(J)=>this.emit(J),send:(J)=>this.runTurn(J)}),this.pendingPrompts={list:async(J)=>this.pendingPromptsController.list(J.sessionId),update:async(J)=>this.pendingPromptsController.update(J),delete:async(J)=>this.pendingPromptsController.delete(J)},this.eventBridge=new wZ({getSession:(J)=>this.sessions.get(J),usageBySession:this.usageBySession,aggregateUsageBySession:this.aggregateUsageBySession,emit:(J)=>this.emit(J),persistMessages:(J,X,W)=>{this.invoke("persistSessionMessages",J,X,W).catch((j)=>{let Y=this.sessions.get(J);(Y?.config.logger??this.defaultLogger)?.error?.("Failed to persist session messages from agent event",{sessionId:J,error:j}),q1(Y?.config.telemetry??this.defaultTelemetry,{component:"core",operation:"session.persist_messages_on_agent_event",error:j,severity:"warn",handled:!0,context:{sessionId:J,providerId:Y?.config.providerId,modelId:Y?.config.modelId}})})},enqueuePendingPrompt:(J,X)=>this.pendingPromptsController.enqueue(J,X),invokeBackendOptional:(J,...X)=>this.invokeOptional(J,...X)})}async applyInitialOAuthCredentials($){if($.config.apiKey?.trim())return $;let Z=await this.oauthTokenManager.resolveProviderApiKey({providerId:$.config.providerId});if(!Z?.apiKey)return $;return{...$,config:{...$.config,apiKey:Z.apiKey}}}async startSession($){let Z=$.config.sessionId?.trim()??"",Q=Z||hm(),J=Z.length>0&&($.initialMessages?.length??0)>0&&!$.prompt?.trim(),X=Boolean($.config.cwd?.trim()||$.config.workspaceRoot?.trim()),W=J&&!X?await this.invokeOptionalValue("readSessionManifest",Q):void 0,j=W?{...$.config,cwd:W.cwd,workspaceRoot:W.workspace_root}:await MG($.config);return await this.startResolvedSession({...$,config:j},Q,Z.length>0,W)}async startResolvedSession($,Z,Q,J){let X=$.source??Z0.CLI,W=U0(),j=await this.applyInitialOAuthCredentials($),Y=j.initialMessages??[],V=Y.length>0?jZ(Y):p0(),K=await this.invokeOptionalValue("ensureSessionsDir")??"";if(!K)throw Error("session service method not available: ensureSessionsDir");let B=Mj(K,Z),G=Mj(B,`${Z}.messages.json`),H=Mj(B,`${Z}.json`),U=H$($.config),F=$.interactive===!0&&!j.prompt?.trim(),D=Z1.parse({version:1,session_id:Z,source:X,pid:process.pid,started_at:W,status:F?"idle":"running",interactive:$.interactive===!0,provider:j.config.providerId,model:j.config.modelId,cwd:j.config.cwd,workspace_root:U,team_name:j.config.teamName,enable_tools:j.config.enableTools,enable_spawn:j.config.enableSpawnAgent,enable_teams:j.config.enableAgentTeams,prompt:j.prompt?.trim()||void 0,messages_path:G}),L,z;if(Q&&Y.length>0&&!j.prompt?.trim()){let g=J??await this.invokeOptionalValue("readSessionManifest",Z);if(g)D=g,L={manifestPath:H,messagesPath:g.messages_path||G,compactionPath:g.compaction_path,manifest:g},z=await this.invokeOptionalValue("readSessionCompactionState",Z)}let O=await this.seedAggregateUsageFromArtifacts({initialUsage:V,sessionDir:B,rootMessagesPath:L?.messagesPath??G,manifest:D});this.usageBySession.set(Z,V),this.aggregateUsageBySession.set(Z,O);let A=o0(this.defaultCapabilities,$.capabilities),q=A?.toolExecutors??this.toolExecutors,N=$.localRuntime,T=N?.extensionContext?.logger??N?.logger,M=N?.extensionContext?.automation,d=N?.extensionContext?.telemetry??N?.telemetry??this.defaultTelemetry,b,S={getSession:(g)=>this.sessions.get(g),subAgentStarts:this.subAgentStarts,onAgentEvent:(g,G0,C0)=>this.eventBridge.dispatchAgentEvent(g,G0,C0),invokeBackendOptional:(g,...G0)=>this.invokeOptional(g,...G0)};b=await Q_({input:j,localRuntime:$.localRuntime,sessionId:Z,providerSettingsManager:this.providerSettingsManager,defaultTelemetry:this.defaultTelemetry,defaultLogger:this.defaultLogger,defaultCapabilities:A,defaultToolPolicies:this.defaultToolPolicies,defaultFetch:this.defaultFetch,onPluginEvent:(g)=>{if(g.name==="plugin_log"){this.eventBridge.handlePluginLog(Z,g.payload,T);return}this.eventBridge.handlePluginEvent(Z,g,M,d)},onTeamEvent:(g)=>{this.eventBridge.handleTeamEvent(Z,g),b.config.onTeamEvent?.(g)},createSpawnTool:()=>Ej(S,b.config,Z,q),createSubAgentLifecycleCallbacks:(g)=>Tj(S,g,Z),readSessionMetadata:async()=>(await this.getSession(Z))?.metadata,writeSessionMetadata:async(g)=>{await this.persistSessionMetadata(Z,()=>g)}});let E=k0(WX({...L?.manifest.metadata??{},...j.sessionMetadata??{}},b.gitState),{mode:j.mode,version:b.config.extensionContext?.client?.version});if(!L)D.metadata=E;let I=await this.runtimeBuilder.build({...b.runtimeBuilderInput,distinctId:this.distinctId,runCommandExecutionController:this.runCommandExecutionController}),P=b.config,i=b.providerConfig;if(I.teamRuntime&&!P.teamName?.trim())P.teamName=I.teamRuntime.getTeamName();let w=async()=>{let g=this.sessions.get(Z);if(!g||!X6(g.config.providerId))return!1;try{return await this.syncOAuthCredentials(g,{forceRefresh:!0}),!0}catch{return!1}};I.delegatedAgentConfigProvider?.updateConnectionDefaults({onAuthError:w});let k=[...I.tools,...P.extraTools??[]],m=I.extensions??b.extensions,t=j.initialCompactionState,y0,Y0=uW(P),J1=t??z,m0=J1?{...J1,conversation_id:J1.conversation_id?.trim()||Z}:void 0,r1=dW({compact:Y0,getState:()=>y0?.compactionState,saveState:async(g,G0)=>{let C0=y0;if(!C0)return;let c0={...g,conversation_id:C0.sessionId};try{if(!(await this.persistActiveSessionCompactionState(C0,c0,G0)).updated)P.logger?.debug?.("Skipped stale session compaction state",{sessionId:C0.sessionId,sourceMessageCount:c0.source_message_count})}catch(j2){P.logger?.error?.("Failed to persist session compaction state",{sessionId:C0.sessionId,error:j2}),q1(P.telemetry,{component:"core",operation:"session.persist_compaction_state",severity:"warn",handled:!0,error:j2,context:{sessionId:C0.sessionId,providerId:P.providerId,modelId:P.modelId}})}}}),X1={distinctId:this.distinctId,sessionId:Z,providerId:i.providerId,modelId:i.modelId,apiKey:i.apiKey,baseUrl:i.baseUrl,headers:i.headers,onAuthError:w,knownModels:i.knownModels,providerConfig:i,thinking:P.thinking,reasoningEffort:P.reasoningEffort??i.reasoningEffort,thinkingBudgetTokens:P.thinkingBudgetTokens,maxTokensPerTurn:P.maxTokensPerTurn,temperature:P.temperature,systemPrompt:P.systemPrompt,maxIterations:P.maxIterations,execution:P.execution,prepareTurn:r1,tools:k,modelTools:I.modelTools,hooks:b.hooks,extensions:m,hookErrorMode:P.hookErrorMode,initialMessages:b.effectiveInput.initialMessages,userFileContentLoader:v_,toolPolicies:b.toolPolicies,requestToolApproval:b.requestToolApproval?async(g)=>{let G0=b.requestToolApproval,C0=this.sessions.get(Z);if(C0)await this.markTurnPending(C0);try{if(!G0)return{approved:!1,reason:"Tool approval callback is not configured."};return await G0(g)}finally{let c0=this.sessions.get(Z);if(c0?.status==="pending")await this.markTurnRunning(c0)}}:void 0,telemetry:P.telemetry,onConsecutiveMistakeLimitReached:P.onConsecutiveMistakeLimitReached,completionPolicy:I.completionPolicy,consumePendingUserMessage:()=>{let g=this.pendingPromptsController.consumeSteer(Z);return g?p4(g.prompt,g.mode??P.mode):void 0},logger:I.logger??P.logger,extensionContext:P.extensionContext,onEvent:(g)=>this.eventBridge.dispatchAgentEvent(Z,P,g)};X1.hooks={...X1.hooks,onEvent:async(g)=>{if(await b.hooks?.onEvent?.(g),g.type!=="assistant-message")return;let G0=this.sessions.get(Z);if(!G0)return;let C0=G0.agent.getMessages();try{await this.invoke("persistSessionMessages",Z,C0,P.systemPrompt)}catch(c0){P.logger?.error?.("Failed to persist session messages after assistant response",{sessionId:Z,error:c0}),q1(P.telemetry,{component:"core",operation:"session.persist_messages_after_assistant_response",error:c0,severity:"warn",handled:!0,context:{sessionId:Z,providerId:P.providerId,modelId:P.modelId}})}}};let I0=this.createAgentInstance(X1);if(X1.onEvent)I0.subscribeEvents(X1.onEvent);I.registerLeadAgent?.(I0);let r0=G$({agentId:I0.getAgentId(),conversationId:I0.getConversationId(),teamId:I.teamRuntime?.getTeamId(),teamName:I.teamRuntime?.getTeamName(),teamRole:I.teamRuntime?"lead":void 0});if(J_(P,Z,Q,U,r0),r0)K2(P.telemetry,{ulid:Z,modelId:P.modelId,provider:P.providerId,...r0});if(I.teamRuntime)gQ(P.telemetry,{ulid:Z,teamId:I.teamRuntime.getTeamId(),teamName:I.teamRuntime.getTeamName(),leadAgentId:I0.getAgentId(),restoredFromPersistence:I.teamRestoredFromPersistence===!0});let r={sessionId:Z,config:P,sessionMetadata:E,...L?{artifacts:L}:{},source:X,startedAt:L?.manifest.started_at??W,updatedAt:L?.manifest.ended_at??L?.manifest.started_at??W,pendingPrompt:D.prompt,runtime:I,agent:I0,started:!1,status:L?.manifest.status??(F?"idle":"running"),aborting:!1,interactive:$.interactive===!0,persistedMessages:Y,compactionState:m0,activeTeamRunIds:new Set,pendingTeamRunUpdates:[],teamRunWaiters:[],pendingPrompts:[],drainingPendingPrompts:!1,pluginSandboxShutdown:b.pluginSandboxShutdown,submitAndExitObserved:!1,taskCompletedEmitted:!1,lastInteractiveTurnFinishReason:void 0};if(y0=r,r.compactionState&&!this.isCompactionStateForSession(r.sessionId,r.compactionState,r))r.config.logger?.log?.("Ignoring session compaction state for a different conversation",{severity:"warn",sessionId:r.sessionId,conversationId:r.compactionState.conversation_id}),r.compactionState=void 0;if(this.sessions.set(Z,r),L)await this.refreshActiveSessionGitMetadata(r,b.gitState);if(Y.length>0&&!L)try{await this.ensureSessionPersisted(r),await this.invoke("persistSessionMessages",Z,Y,r.config.systemPrompt)}catch(g){r.config.logger?.error?.("Failed to persist seeded session messages at start",{sessionId:Z,error:g}),q1(r.config.telemetry,{component:"core",operation:"session.persist_seeded_messages",error:g,severity:"warn",handled:!0,context:{sessionId:Z,providerId:r.config.providerId,modelId:r.config.modelId}})}this.emitStatus(Z,r.status);let W1;try{if(j.prompt?.trim())if(W1=await this.executeTurn(r,{prompt:j.prompt,userImages:j.userImages,userFiles:j.userFiles}),!r.interactive)await this.finalizeSingleRun(r,W1.finishReason);else await this.completeInteractiveTurn(r,W1.finishReason)}catch(g){if(r.interactive&&r.aborting)W1=await this.completeAbortedInteractiveTurn(r);else{q1(r.config.telemetry,{component:"core",operation:"session.start",error:g,severity:"error",handled:!1,context:{sessionId:r.sessionId,providerId:r.config.providerId,modelId:r.config.modelId}});try{await this.failSession(r)}catch(G0){r.config.logger?.error?.("Session failure cleanup threw",{sessionId:r.sessionId,error:G0})}throw g}}return{sessionId:Z,manifest:D,manifestPath:H,messagesPath:G,result:W1}}async restoreSession($){return this.sessionVersioning.restoreCheckpoint({...$,getSession:(Z)=>this.getSession(Z),readMessages:(Z)=>this.readSessionMessages(Z),buildStartInput:(Z,Q)=>{let J=Z.restoredCheckpointMetadata?{...Q.sessionMetadata??{},checkpoint:Z.restoredCheckpointMetadata}:Q.sessionMetadata;return{...Q,...J?{sessionMetadata:J}:{},initialMessages:Z.initialMessages}},startSession:(Z)=>this.startSession(Z),getStartedSessionId:(Z)=>Z.sessionId,cleanupStartedSession:async(Z)=>{if(!await this.deleteSession(Z.sessionId))throw Error(`Failed to clean up restored session ${Z.sessionId}`)},readRestoredSession:(Z)=>this.getSession(Z)})}async runTurn($){let Z=this.getSessionOrThrow($.sessionId),Q=Z.agent.canStartRun(),J=$.delivery??(Z.interactive&&!Q?"queue":void 0);if(Z.config.telemetry?.capture({event:"session.input_sent",properties:{sessionId:$.sessionId,promptLength:$.prompt.length,userImageCount:$.userImages?.length??0,userFileCount:$.userFiles?.length??0,delivery:J??"immediate"}}),J==="queue"||J==="steer"){this.pendingPromptsController.enqueue($.sessionId,{prompt:$.prompt,mode:$.mode,delivery:J,userImages:$.userImages,userFiles:$.userFiles});return}try{let X=await this.executeTurn(Z,{prompt:$.prompt,mode:$.mode,userImages:$.userImages,userFiles:$.userFiles});if(!Z.interactive)await this.finalizeSingleRun(Z,X.finishReason);else await this.completeInteractiveTurn(Z,X.finishReason);if(X.finishReason!=="error")queueMicrotask(()=>{this.pendingPromptsController.drain($.sessionId)});return X}catch(X){if(Z.interactive&&Z.aborting)return await this.completeAbortedInteractiveTurn(Z);throw q1(Z.config.telemetry,{component:"core",operation:"session.submit",error:X,severity:"error",handled:!1,context:{sessionId:Z.sessionId,providerId:Z.config.providerId,modelId:Z.config.modelId}}),await this.failSession(Z),X}}async getAccumulatedUsage($){let Z=wX(this.usageBySession.get($)),Q=wX(this.aggregateUsageBySession.get($));return Z||Q?{usage:Z,aggregateUsage:Q}:void 0}async abort($,Z){let Q=this.sessions.get($);if(!Q)return;if(Q.config.telemetry?.capture({event:"session.aborted",properties:{sessionId:$}}),Q.aborting=!0,Q.drainingPendingPrompts)this.pendingPromptsController.discardQueue(Q);Q.agent.abort(Z)}async proceedWhileRunning($,Z){return this.runCommandExecutionController.proceedWhileRunning($,Z)}async stopSession($){let Z=this.sessions.get($);if(!Z)return;if(Z.config.telemetry?.capture({event:"session.stopped",properties:{sessionId:$}}),Z.interactive&&!P0(Z.status)){await this.releaseSessionRuntime(Z,"session_stop");return}if(Z.interactive&&Z.agent.canStartRun()){await this.shutdownSession(Z,{status:this.resolveInteractiveStopStatus(Z),exitCode:this.resolveInteractiveStopExitCode(Z),shutdownReason:"session_stop",endReason:"stopped"});return}Z.aborting=!0,Z.agent.abort(Error("session_stop")),await this.shutdownSession(Z,{status:"cancelled",exitCode:0,shutdownReason:"session_stop",endReason:"stopped"})}async dispose($="session_manager_dispose"){let Z=[...this.sessions.values()];if(Z.length===0)return;await Promise.allSettled(Z.map((Q)=>Q.interactive&&!P0(Q.status)?this.releaseSessionRuntime(Q,$):Q.interactive&&Q.agent.canStartRun()?this.shutdownSession(Q,{status:this.resolveInteractiveStopStatus(Q),exitCode:this.resolveInteractiveStopExitCode(Q),shutdownReason:$,endReason:"disposed"}):this.shutdownSession(Q,{status:"cancelled",exitCode:0,shutdownReason:$,endReason:"disposed"}))),this.usageBySession.clear(),this.aggregateUsageBySession.clear()}async getSession($){let Z=this.sessions.get($);if(Z)return qj(Z);let Q=$.trim();if(!Q)return;let J=await this.getRow(Q);if(J)return C4(J);let X=await this.readManifest(Q);return X?kX(X):void 0}async listSessions($=200){let Q=(await this.listRows($)).map(C4),J=new Set(Q.map((X)=>X.sessionId));for(let X of this.sessions.values()){if(J.has(X.sessionId))continue;Q.unshift(qj(X))}return Q.slice(0,$)}async deleteSession($){if(this.sessions.has($))await this.stopSession($);let Z=await this.invoke("deleteSession",$);if(Z.deleted)this.usageBySession.delete($),this.aggregateUsageBySession.delete($);return Z.deleted}async updateSession($,Z){return{updated:(await this.invokeOptionalValue("updateSession",{sessionId:$,prompt:Z.prompt,metadata:Z.metadata,title:Z.title}))?.updated===!0}}async updateSessionCompactionState($,Z){let Q=$.trim();if(!Q)return{updated:!1};let J=this.sessions.get(Q),X=J?void 0:await this.getSession(Q);if(!(J??X))return{updated:!1};if(J){let Y=await this.readSessionMessages(Q),V=Z.source_message_count>0&&Y.length>=Z.source_message_count,K=V?Y:void 0;if(V){if(!await this.canPersistCompactionState(Q,Z,J,void 0,Y))return{updated:!1};J.agent.restore(Y)}return await this.persistActiveSessionCompactionState(J,Z,K)}if(!await this.canPersistCompactionState(Q,Z,void 0,X))return{updated:!1};let j=await this.invokeOptionalValue("readSessionCompactionState",Q);if(m_(Z,j))return{updated:!1};return await this.invoke("persistSessionCompactionState",Q,Z),{updated:!0}}async readSessionCompactionState($){let Z=$.trim();if(!Z)return;let Q=this.sessions.get(Z);if(Q)for(;;){let J=Q.compactionStateWriteQueue;if(!J)return Q.compactionState;await J.catch(()=>{return})}return await this.invokeOptionalValue("readSessionCompactionState",Z)}isCompactionStateForSession($,Z,Q,J){let X=Z.conversation_id?.trim();if(!X)return!0;if(X===$)return!0;let W=Q?.agent.getConversationId()?.trim()||J?.conversationId?.trim();return W?X===W:!1}async canPersistCompactionState($,Z,Q,J,X){if(!Z.conversation_id?.trim())return!1;if(!this.isCompactionStateForSession($,Z,Q,J))return!1;let W=X??Q?.agent.getMessages()??await this.readSessionMessages($);return p6(Z,W)!==void 0}async persistActiveSessionCompactionState($,Z,Q){if(!await this.canPersistCompactionState($.sessionId,Z,$,void 0,Q))return{updated:!1};return await this.enqueueCompactionStateWrite($,async()=>{let J=$.compactionState,X=J!==void 0&&p6(J,Q??$.agent.getMessages())!==void 0;if(J&&(X?m_(Z,J):Date.parse(Z.updated_at)<Date.parse(J.updated_at)))return{updated:!1};return await this.invoke("persistSessionCompactionState",$.sessionId,Z),$.compactionState=Z,{updated:!0}})}async enqueueCompactionStateWrite($,Z){let J=($.compactionStateWriteQueue??Promise.resolve()).catch(()=>{return}).then(Z),X=J.then(()=>{return},()=>{return});$.compactionStateWriteQueue=X;try{return await J}finally{if($.compactionStateWriteQueue===X)$.compactionStateWriteQueue=void 0}}async readLiveSessionMessages($){let Z=$.trim();if(!Z)return[];let Q=this.sessions.get(Z);if(Q){let J=Q.agent.getMessages();if(J.length>0)return J}return this.readSessionMessages(Z)}async readSessionMessages($){let Z=$.trim();if(!Z)return[];let Q=await this.getRow(Z);if(Q?.messagesPath)return u$(Q.messagesPath);let J=await this.readManifest(Z);return u$(J?.messages_path)}async dispatchHookEvent($){await RF($,{queueSpawnRequest:(Z)=>this.invokeOptional("queueSpawnRequest",Z),upsertSubagentSessionFromHook:(Z)=>this.invokeOptionalValue("upsertSubagentSessionFromHook",Z),appendSubagentHookAudit:(Z,Q)=>this.invokeOptional("appendSubagentHookAudit",Z,Q),applySubagentStatus:(Z,Q)=>this.invokeOptional("applySubagentStatus",Z,Q)})}subscribe($,Z){return this.events.subscribe($,Z)}async updateSessionModel($,Z){await this.updateSessionConnection($,{modelId:Z})}async updateSessionConnection($,Z){let Q=P6(Z),J=this.getSessionOrThrow($);if(Q.providerId!==void 0)J.config.providerId=Q.providerId;if(Q.modelId!==void 0)J.config.modelId=Q.modelId;if(Q.apiKey!==void 0)J.config.apiKey=Q.apiKey;if(Q.baseUrl!==void 0)J.config.baseUrl=Q.baseUrl;if(Q.headers!==void 0)J.config.headers=Q.headers;if(Q.providerConfig!==void 0)J.config.providerConfig=Q.providerConfig;if(Object.hasOwn(Q,"reasoningEffort"))J.config.reasoningEffort=Q.reasoningEffort??void 0;if(Object.hasOwn(Q,"thinkingBudgetTokens"))J.config.thinkingBudgetTokens=Q.thinkingBudgetTokens??void 0;if(Object.hasOwn(Q,"thinking")){if(J.config.thinking=Q.thinking??void 0,Q.thinking===!1||Q.thinking===null)J.config.reasoningEffort=void 0,J.config.thinkingBudgetTokens=void 0}let X={...Q.providerId!==void 0?{providerId:Q.providerId}:{},...Q.modelId!==void 0?{modelId:Q.modelId}:{},...Q.apiKey!==void 0?{apiKey:Q.apiKey}:{},...Q.baseUrl!==void 0?{baseUrl:Q.baseUrl}:{},...Q.headers!==void 0?{headers:Q.headers}:{},...Q.providerConfig!==void 0?{providerConfig:Q.providerConfig}:{},...Object.hasOwn(Q,"reasoningEffort")?{reasoningEffort:Q.reasoningEffort??void 0}:{},...Object.hasOwn(Q,"thinking")?{thinking:Q.thinking??void 0}:{},...Object.hasOwn(Q,"thinkingBudgetTokens")?{thinkingBudgetTokens:Q.thinkingBudgetTokens??void 0}:{}};if(Q.thinking===!1||Q.thinking===null)X.reasoningEffort=void 0,X.thinkingBudgetTokens=void 0;let W={...Q.apiKey!==void 0?{apiKey:Q.apiKey}:{},...Q.baseUrl!==void 0?{baseUrl:Q.baseUrl}:{},...Q.headers!==void 0?{headers:Q.headers}:{}};if(J.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults(X),J.agent.updateConnection(Q),J.runtime.teamRuntime?.updateTeammateConnections(W),Q.providerId||Q.modelId)await this.mutateSessionManifest(J,(j)=>{if(Q.providerId)j.provider=Q.providerId;if(Q.modelId)j.model=Q.modelId})}async mutateSessionManifest($,Z){let Q=$.artifacts;if(!Q)return;let J=$.sessionId,W=(this.manifestMutationQueues.get(J)??Promise.resolve()).then(async()=>{let Y=await this.invokeOptionalValue("readSessionManifest",J)??Q.manifest;return Z(Y),Q.manifest=Y,await this.invoke("writeSessionManifest",Q.manifestPath,Y),Y}),j=W.then(()=>{return},()=>{return});this.manifestMutationQueues.set(J,j);try{return await W}finally{if(this.manifestMutationQueues.get(J)===j)this.manifestMutationQueues.delete(J)}}handlePluginEvent($,Z,Q){return this.eventBridge.handlePluginEvent($,Z,Q)}async executeTurn($,Z){let Q=await this.prepareTurnInput($,Z),J=Q.prompt.trim(),X=Q?.userImages?.length,W=Q?.userFiles?.length;if(!J&&!X&&!W)throw Error("prompt cannot be empty");if(!$.artifacts&&!$.pendingPrompt)$.pendingPrompt=J;if(await this.ensureSessionPersisted($),!$.pendingPrompt){$.pendingPrompt=J;try{await this.invokeOptionalValue("updateSession",{sessionId:$.sessionId,prompt:J})}catch(j){$.config.logger?.log?.("Failed to backfill seeded session prompt",{severity:"warn",sessionId:$.sessionId,error:j})}}await this.refreshActiveSessionGitMetadata($),await this.syncOAuthCredentials($),await this.markTurnRunning($);try{let j=await this.executeAgentTurn($,J,Q.userImages,Q.userFiles);while(TW($,j.finishReason)){let Y=await EW($);if(Y.length===0)break;let V=MW($,Y);j=await this.executeAgentTurn($,V)}return j}finally{await this.refreshActiveSessionGitMetadata($)}}async completeInteractiveTurn($,Z){if(l4($))return;$.lastInteractiveTurnFinishReason=Z,await this.markTurnIdle($),$.aborting=!1}resolveInteractiveStopStatus($){let Z=$.lastInteractiveTurnFinishReason;if(!Z)return"cancelled";switch(Z){case"completed":return"completed";case"error":return"failed";case"aborted":case"max_iterations":case"mistake_limit":return"cancelled"}return Z}resolveInteractiveStopExitCode($){return $.lastInteractiveTurnFinishReason==="error"?1:0}async completeAbortedInteractiveTurn($){let Z=new Date,Q=$.agent.getMessages(),J=p0();if($.persistedMessages=Q,$.started=$.started||Q.length>0,Q.length>0)try{await this.ensureSessionPersisted($),await this.invoke("persistSessionMessages",$.sessionId,Q,$.config.systemPrompt)}catch(X){$.config.logger?.error?.("Failed to persist session messages after abort",{sessionId:$.sessionId,error:X}),q1($.config.telemetry,{component:"core",operation:"session.persist_messages_after_abort",error:X,severity:"warn",handled:!0,context:{sessionId:$.sessionId,providerId:$.config.providerId,modelId:$.config.modelId}})}return this.eventBridge.dispatchAgentEvent($.sessionId,$.config,{type:"done",reason:"aborted",text:"",iterations:0,usage:J}),await this.completeInteractiveTurn($,"aborted"),queueMicrotask(()=>{this.pendingPromptsController.drain($.sessionId)}),{text:"",usage:J,messages:Q,toolCalls:[],iterations:0,finishReason:"aborted",model:{id:$.config.modelId,provider:$.config.providerId},startedAt:Z,endedAt:Z,durationMs:0}}async executeAgentTurn($,Z,Q,J){let X=$.started||$.agent.getMessages().length>0,W=$.persistedMessages??$.agent.getMessages(),j=this.usageBySession.get($.sessionId)??p0(),Y=this.aggregateUsageBySession.get($.sessionId)??j;$.turnUsageBaseline=j,$.turnAggregateUsageBaseline=Y,$.turnPrimaryUsage=p0(),$.turnUsageByAgent=new Map,bQ($.config.telemetry,$.sessionId,$.config.mode),O8($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,model:$.config.modelId,source:"user",mode:$.config.mode,...this.getSessionAgentTelemetryIdentity($)});try{let V=X?()=>$.agent.continue(Z,Q,J):()=>$.agent.run(Z,Q,J),K=await this.runWithAuthRetry($,V,W);$.started=!0;let B=k7(K.messages,K,W);$.persistedMessages=B;let G=WZ($.turnUsageByAgent?.values()??[]),H=v0(j,K.usage),U=v0(v0(p0(),K.usage),G),F=v0(Y,U);return this.usageBySession.set($.sessionId,H),this.aggregateUsageBySession.set($.sessionId,F),await this.persistSessionMetadata($.sessionId,(D)=>({...D??{},totalCost:H.totalCost,aggregatedAgentsCost:F.totalCost,usage:H,aggregateUsage:F})),await this.invoke("persistSessionMessages",$.sessionId,B,$.config.systemPrompt),this.observeTaskCompletionTool($,K),K}catch(V){q1($.config.telemetry,{component:"core",operation:"session.turn",error:V,severity:"error",handled:!1,context:{sessionId:$.sessionId,providerId:$.config.providerId,modelId:$.config.modelId}});try{await this.invoke("persistSessionMessages",$.sessionId,$.agent.getMessages(),$.config.systemPrompt)}catch(K){$.config.logger?.error?.("Failed to persist session messages after turn error",{sessionId:$.sessionId,error:K})}throw V}finally{$.turnUsageBaseline=void 0,$.turnAggregateUsageBaseline=void 0,$.turnPrimaryUsage=void 0,$.turnUsageByAgent=void 0}}observeTaskCompletionTool($,Z){if($.submitAndExitObserved)return;if(!Z.toolCalls.some((J)=>J.name===A0.SUBMIT_AND_EXIT&&J.error===void 0))return;$.submitAndExitObserved=!0,$.taskCompletedEmitted=!0,g5($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,modelId:$.config.modelId,mode:$.config.mode,durationMs:Date.now()-Date.parse($.startedAt),source:"submit_and_exit",...this.getSessionAgentTelemetryIdentity($)})}emitTaskCompletedOnTeardown($,Z){if($.taskCompletedEmitted||$.submitAndExitObserved)return;if(!($.interactive?$.lastInteractiveTurnFinishReason==="completed"&&!$.aborting&&$.agent.canStartRun():Z==="completed"))return;$.taskCompletedEmitted=!0,g5($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,modelId:$.config.modelId,mode:$.config.mode,durationMs:Date.now()-Date.parse($.startedAt),source:"shutdown",...this.getSessionAgentTelemetryIdentity($)})}async prepareTurnInput($,Z){let Q=H$($.config),J=gm(Z.prompt).trim();if(!J)return{prompt:"",userImages:Z.userImages,userFiles:this.resolveAbsoluteFilePaths($.config.cwd,Z.userFiles)};let X=await a9(J,Q);X_($.config.telemetry,X);let W=p4(X.prompt,Z.mode??$.config.mode),j=this.resolveAbsoluteFilePaths($.config.cwd,Z.userFiles),Y=this.resolveAbsoluteFilePaths(Q,X.matchedFiles),V=Array.from(new Set([...j,...Y]));return{prompt:W,userImages:Z.userImages,userFiles:V.length>0?V:void 0}}async ensureSessionPersisted($){if($.artifacts)return;let Z=H$($.config);if($.artifacts=await this.invoke("createRootSessionWithArtifacts",{sessionId:$.sessionId,source:$.source,pid:process.pid,interactive:$.interactive,provider:$.config.providerId,model:$.config.modelId,cwd:$.config.cwd,workspaceRoot:Z,teamName:$.config.teamName,enableTools:$.config.enableTools,enableSpawn:$.config.enableSpawnAgent,enableTeams:$.config.enableAgentTeams,prompt:$.pendingPrompt,metadata:$.sessionMetadata,startedAt:$.startedAt}),$.compactionState){if(!(await this.persistActiveSessionCompactionState($,$.compactionState)).updated)$.compactionState=void 0}}async markTurnRunning($){if($.status==="running")return;await this.updateStatus($,"running",null)}async refreshActiveSessionGitMetadata($,Z){try{let Q=Z??await $F(H$($.config));if(!Q||!$.artifacts)return;if(tU($.artifacts.manifest.metadata,Q))return;await this.persistSessionMetadata($.sessionId,(J)=>WX({...J??{},...$.sessionMetadata??{}},Q))}catch(Q){$.config.logger?.debug?.("Failed to refresh session git metadata",{sessionId:$.sessionId,error:Q})}}async markTurnPending($){if($.status==="pending")return;await this.updateStatus($,"pending",null)}async markTurnIdle($){if($.status==="idle")return;await this.updateStatus($,"idle",null)}async persistSessionMetadata($,Z){let Q=this.sessions.get($),J=await this.invokeOptionalValue("readSessionManifest",$)??Q?.artifacts?.manifest,X=Z(J?.metadata);if(!Q?.artifacts)return;if((await this.invokeOptionalValue("updateSession",{sessionId:$,metadata:X}))?.updated===!1)return;Q.sessionMetadata=X,Q.artifacts.manifest.metadata=X}async finalizeSingleRun($,Z){if(l4($))return;let Q=Z==="aborted"||$.aborting,J=Z==="error";await this.shutdownSession($,{status:Q?"cancelled":J?"failed":"completed",exitCode:J?1:0,shutdownReason:J?"session_error":"session_complete",endReason:Z})}async failSession($){$.lastInteractiveTurnFinishReason="error",await this.shutdownSession($,{status:"failed",exitCode:1,shutdownReason:"session_error",endReason:"error"})}async shutdownSession($,Z){if(this.emitTaskCompletedOnTeardown($,Z.status),t7($),!$.aborting&&!$.agent.canStartRun())$.aborting=!0,$.agent.abort(Error(Z.shutdownReason));let Q=[],J=(X,W)=>{Q.push(W),$.config.logger?.log("Session shutdown cleanup failed",{sessionId:$.sessionId,stage:X,error:W,severity:"warn"}),q1($.config.telemetry,{component:"core",operation:"session.shutdown_cleanup",error:W,severity:"warn",handled:!0,context:{sessionId:$.sessionId,stage:X,status:Z.status,shutdownReason:Z.shutdownReason,providerId:$.config.providerId,modelId:$.config.modelId}})};if($.artifacts){await this.refreshActiveSessionGitMetadata($);try{await this.updateStatus($,Z.status,Z.exitCode)}catch(X){J("update_status",X)}}try{await $.agent.shutdown(Z.shutdownReason)}catch(X){J("agent_shutdown",X)}try{await Promise.resolve($.runtime.shutdown(Z.shutdownReason))}catch(X){J("runtime_shutdown",X)}try{await $.pluginSandboxShutdown?.()}catch(X){J("plugin_sandbox_shutdown",X)}if(this.sessions.delete($.sessionId),this.emit({type:"ended",payload:{sessionId:$.sessionId,reason:Z.endReason,ts:Date.now()}}),Q.length>0&&Z.status==="failed")throw Q[0]}async releaseSessionRuntime($,Z){this.emitTaskCompletedOnTeardown($);let Q=[],J=(X,W)=>{Q.push(W),$.config.logger?.log("Session runtime cleanup failed",{sessionId:$.sessionId,stage:X,error:W,severity:"warn"}),q1($.config.telemetry,{component:"core",operation:"session.runtime_cleanup",error:W,severity:"warn",handled:!0,context:{sessionId:$.sessionId,stage:X,reason:Z,providerId:$.config.providerId,modelId:$.config.modelId}})};if(!$.aborting&&!$.agent.canStartRun())$.aborting=!0,$.agent.abort(Error(Z));try{await $.agent.shutdown(Z)}catch(X){J("agent_shutdown",X)}try{await Promise.resolve($.runtime.shutdown(Z))}catch(X){J("runtime_shutdown",X)}try{await $.pluginSandboxShutdown?.()}catch(X){J("plugin_sandbox_shutdown",X)}if(this.sessions.delete($.sessionId),Q.length>0)throw Q[0]}async updateStatus($,Z,Q){if(!$.artifacts)return;let J=await this.invoke("updateSessionStatus",$.sessionId,Z,Q);if(!J.updated)return;let X=await this.mutateSessionManifest($,(W)=>{if(W.status=Z,P0(Z))delete W.ended_at,W.exit_code=null;else W.ended_at=J.endedAt??U0(),W.exit_code=typeof Q==="number"?Q:null});if(!X)return;$.status=Z,$.updatedAt=J.endedAt??U0(),$.endedAt=P0(Z)?null:X.ended_at,$.exitCode=X.exit_code,this.emitStatus($.sessionId,Z)}async runWithAuthRetry($,Z,Q){try{return await Z()}catch(J){if(!X6($.config.providerId)||!vm(J))throw J;return await this.syncOAuthCredentials($,{forceRefresh:!0}),$.agent.restore(Q),Z()}}async syncOAuthCredentials($,Z){let Q=null;try{Q=await this.oauthTokenManager.resolveProviderApiKey({providerId:$.config.providerId,forceRefresh:Z?.forceRefresh})}catch(J){if(J instanceof W5)throw Error(`${J.providerId} requires re-authentication.`);throw J}if(!Q?.apiKey||$.config.apiKey===Q.apiKey)return;$.config.apiKey=Q.apiKey,$.agent.updateConnection({apiKey:Q.apiKey}),$.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults({apiKey:Q.apiKey}),$.runtime.teamRuntime?.updateTeammateConnections({apiKey:Q.apiKey})}getSessionOrThrow($){let Z=this.sessions.get($);if(!Z){let Q=new f2($);throw q1(this.defaultTelemetry,{component:"core",operation:"session.active_lookup",error:Q,severity:"warn",handled:!0,context:{sessionId:$,activeSessionCount:this.sessions.size}}),Q}return Z}resolveAbsoluteFilePaths($,Z){if(!Z||Z.length===0)return[];let Q=Z.map((J)=>J.trim()).filter((J)=>J.length>0).map((J)=>Im(J)?J:Rj($,J));return Array.from(new Set(Q))}getSessionAgentTelemetryIdentity($){return G$({agentId:$.agent.getAgentId(),conversationId:$.agent.getConversationId(),teamId:$.runtime.teamRuntime?.getTeamId(),teamName:$.runtime.teamRuntime?.getTeamName(),teamRole:$.runtime.teamRuntime?"lead":void 0})}async seedAggregateUsageFromArtifacts($){let Z=await this.summarizePersistedTeammateUsage($.sessionDir,$.rootMessagesPath,$.manifest.session_id),Q=v0($.initialUsage,Z);return this.withPersistedAggregateUsageFloor(Q,$.manifest)}async summarizePersistedTeammateUsage($,Z,Q){let J=Rj(Z),X=`${Q}.messages.json`,W;try{W=xm($)}catch{return p0()}let j=p0();for(let Y of W){if(!Y.endsWith(".messages.json"))continue;if(Y===X)continue;let V=Rj($,Y);if(V===J)continue;let K=await u$(V);if(K.length===0)continue;j=v0(j,jZ(K))}return j}withPersistedAggregateUsageFloor($,Z){let Q=um(Z.metadata?.aggregateUsage);if(Q)return dm($,Q);let J=Z.metadata?.aggregatedAgentsCost;if(typeof J!=="number"||!Number.isFinite(J)||J<=$.totalCost)return $;return{...$,totalCost:J}}emitStatus($,Z){this.emitSessionSnapshot($),this.emit({type:"status",payload:{sessionId:$,status:Z}})}async emitSessionSnapshot($){let Z=await this.getSession($);if(!Z)return;this.emit({type:"session_snapshot",payload:{sessionId:$,snapshot:d$({session:Z,usage:this.usageBySession.get($),aggregateUsage:this.aggregateUsageBySession.get($)})}})}emit($){this.events.emit($)}async listRows($){return this.invoke("listSessions",Math.min(Math.max(1,Math.floor($)),g_))}async getRow($){let Z=$.trim();if(!Z)return;return(await this.listRows(g_)).find((J)=>J.sessionId===Z)}async readManifest($){let Z=$.trim();if(!Z)return;return await this.invokeOptionalValue("readSessionManifest",Z)}invoke($,...Z){return y_(this.sessionService,$,...Z)}invokeOptional($,...Z){return I_(this.sessionService,$,...Z)}invokeOptionalValue($,...Z){return h_(this.sessionService,$,...Z)}}function lm($){if($.backendMode)return $.backendMode;if(process.env.CLINE_VCR?.trim())return"local";let Z=process.env.CLINE_SESSION_BACKEND_MODE?.trim().toLowerCase();if(Z==="local"||Z==="hub"||Z==="remote")return Z;return"auto"}var Y5,V5;function pm($,Z){if($!=="auto"&&$!=="hub")return;if(Z.hub?.endpoint?.trim())return;nF(Z.hub?.workspaceRoot?.trim()||Z.hub?.cwd?.trim()||process.cwd())}async function im($){await $.reconcileDeadSessions?.().catch(()=>{})}function d_($){try{let Z=new i$;return Z.init(),new a$(Z,{messagesArtifactUploader:$.messagesArtifactUploader,logger:$.logger})}catch(Z){return $.telemetry?.capture({event:"session_backend_fallback",properties:{requestedBackend:"sqlite",fallbackBackend:"file"}}),u_($.telemetry,{component:"core",operation:"session_backend.sqlite_init",error:Z,severity:"warn",handled:!0,context:{requestedBackend:"sqlite",fallbackBackend:"file"}}),new fW(void 0,{messagesArtifactUploader:$.messagesArtifactUploader,logger:$.logger})}}function c_($,Z,Q){return new t$({sessionService:Q??$.sessionService??d_($),capabilities:$.capabilities,logger:$.logger,telemetry:$.telemetry,toolPolicies:$.toolPolicies,distinctId:Z,fetch:$.fetch})}async function rm($){if(Y5)return Y5;if(V5)return await V5;return V5=(async()=>{return Y5=d_($),await im(Y5),Y5})().finally(()=>{V5=void 0}),await V5}async function SZ($){let Z=L1($.distinctId);$.telemetry?.setDistinctId(Z);let Q=lm($);if(Q==="remote"){let J=$.remote?.endpoint?.trim();if(!J)throw Error("Remote runtime mode requires `remote.endpoint` to be configured.");return $.logger?.log("Using remote runtime host",{endpoint:J}),new d7({endpoint:J,authToken:$.remote?.authToken,clientType:$.remote?.clientType,displayName:$.remote?.displayName,workspaceRoot:$.remote?.workspaceRoot,cwd:$.remote?.cwd,capabilities:$.capabilities})}if(Q==="hub"){let J=$.hub?.endpoint?.trim(),X=J||await I4({strategy:$.hub?.strategy??"require-hub",workspaceRoot:$.hub?.workspaceRoot,cwd:$.hub?.cwd});if(!X)throw Error("No compatible hub runtime is available.");return $.logger?.log("Using hub runtime host",{url:X,explicitEndpoint:J||void 0}),new h2({url:X,authToken:$.hub?.authToken,clientType:$.hub?.clientType,displayName:$.hub?.displayName,capabilities:$.capabilities,telemetry:$.telemetry},{workspaceRoot:$.hub?.workspaceRoot,cwd:$.hub?.cwd})}if(Q==="auto"){let J=await ZW({endpoint:$.hub?.endpoint,strategy:$.hub?.strategy??"prefer-hub",workspaceRoot:$.hub?.workspaceRoot,cwd:$.hub?.cwd});if(J){$.logger?.log("Using discovered local hub runtime host",{url:J});let X=new h2({url:J,authToken:$.hub?.authToken,clientType:$.hub?.clientType,displayName:$.hub?.displayName,capabilities:$.capabilities,telemetry:$.telemetry},{workspaceRoot:$.hub?.workspaceRoot,cwd:$.hub?.cwd});try{return await X.connect(),X}catch(W){$.logger?.log("Falling back to local runtime host",{reason:"hub_connect_failed",severity:"warn",error:W}),u_($.telemetry,{component:"core",operation:"runtime_host.hub_connect",error:W,severity:"warn",handled:!0,context:{backendMode:"auto",fallbackBackend:"local"}})}}return pm(Q,$),$.logger?.log("Falling back to local runtime host",{reason:"compatible_hub_unavailable",severity:"warn"}),c_($,Z)}return c_($,Z)}import{existsSync as am,mkdirSync as nm,readFileSync as om,writeFileSync as sm}from"node:fs";import{dirname as tm}from"node:path";import{FEATURE_FLAGS as l_,FeatureFlagDefaultValue as Pj}from"@cline/shared";var em=3600000,$c=604800000,p_=1;class K5{provider;telemetry;logger;cacheTtlMs;cacheFilePath;persistentCacheMaxAgeMs;context;cache=new Map;cacheInfo={updateTime:0,userId:null};constructor($){this.provider=$.provider,this.telemetry=$.telemetry,this.logger=$.logger,this.cacheTtlMs=$.cacheTtlMs??em,this.cacheFilePath=$.cacheFilePath,this.persistentCacheMaxAgeMs=$.persistentCacheMaxAgeMs??$c,this.context={...$.context??{}},this.hydrateFromPersistentCache()}setContext($){this.context={...$}}hydrateCache($){this.cacheInfo={updateTime:$.updateTime,userId:$.userId,flagsPayload:$.flagsPayload},this.rebuildCacheFromSnapshot($.flagsPayload)}getCacheSnapshot(){return{updateTime:this.cacheInfo.updateTime,userId:this.cacheInfo.userId,flagsPayload:this.cacheInfo.flagsPayload}}async poll($){let Z=$??this.context.userId??null,Q=Date.now();if(Q-this.cacheInfo.updateTime<this.cacheTtlMs){if(this.cacheInfo.userId===Z)return}let J=this.cacheInfo;this.cacheInfo={updateTime:Q,userId:Z||null};try{let X=await this.provider.getAllFlagsAndPayloads({flagKeys:l_.length>0?l_:void 0,context:{...this.context,userId:Z}});if(this.cacheInfo.userId!==Z)return;this.cacheInfo.flagsPayload=X,this.rebuildCacheFromSnapshot(X),this.writePersistentCache()}catch(X){if(this.cacheInfo.userId!==Z)return;throw this.cacheInfo=J.updateTime?J:{updateTime:0,userId:null},this.logger?.error?.("Error polling SDK feature flags",{error:X}),X}}hydrateFromPersistentCache(){let $=this.readPersistentCache();if($)this.hydrateCache($)}isFeatureFlagPayload($){if($===null||typeof $==="string"||typeof $==="number"||typeof $==="boolean")return!0;if(Array.isArray($))return $.every((Z)=>this.isFeatureFlagPayload(Z));if(typeof $==="object")return Object.values($).every((Z)=>this.isFeatureFlagPayload(Z));return!1}readPayloadRecord($){if(!$||typeof $!=="object"||Array.isArray($))return;let Z=Object.entries($).filter(([,J])=>this.isFeatureFlagPayload(J));if(Z.length===0)return;let Q={};for(let[J,X]of Z)Q[J]=X;return Q}readPersistentCache(){try{if(!this.cacheFilePath||!am(this.cacheFilePath))return;let $=JSON.parse(om(this.cacheFilePath,"utf8"));if(!$||typeof $!=="object")return;let Z=$;if(Z.version!==p_||typeof Z.updatedAt!=="number"||!Number.isFinite(Z.updatedAt)||Date.now()-Z.updatedAt>this.persistentCacheMaxAgeMs)return;return{updateTime:Z.updatedAt,userId:Z.userId??null,flagsPayload:{featureFlags:this.readPayloadRecord(Z.flagsPayload?.featureFlags),featureFlagPayloads:this.readPayloadRecord(Z.flagsPayload?.featureFlagPayloads)}}}catch($){this.logger?.error?.("Error reading SDK feature flags cache",{error:$});return}}writePersistentCache(){try{if(!this.cacheFilePath)return;nm(tm(this.cacheFilePath),{recursive:!0,mode:448});let $=this.getCacheSnapshot(),Z={version:p_,updatedAt:$.updateTime,userId:$.userId,flagsPayload:$.flagsPayload};sm(this.cacheFilePath,`${JSON.stringify(Z,null,2)}
|
|
796
796
|
`,"utf8")}catch($){this.logger?.error?.("Error writing SDK feature flags cache",{error:$})}}getReturnedFlagKeys($){return[...new Set([...Object.keys($?.featureFlags??{}),...Object.keys($?.featureFlagPayloads??{})])]}rebuildCacheFromSnapshot($){let Z=new Map;for(let Q of this.getReturnedFlagKeys($)){let J=this.getFeatureFlag(Q);Z.set(Q,J??!1)}this.cache=Z}getFeatureFlag($){try{let Z=this.cacheInfo.flagsPayload?.featureFlagPayloads?.[$],Q=this.cacheInfo.flagsPayload?.featureFlags?.[$],J=Z??Q??Pj[$]??void 0;if(!this.cache.has($)||this.cache.get($)!==J)this.telemetry?.capture({event:l.FEATURE_FLAGS.FLAG_CALLED,properties:{$feature_flag:$,$feature_flag_response:Q}});return J}catch(Z){return this.logger?.error?.(`Error checking SDK feature flag ${$}`,{error:Z}),Pj[$]??!1}}getBooleanFlagEnabled($){return this.cache.get($)===!0}getFlagPayload($){return this.cache.get($)??Pj[$]}getProvider(){return this.provider}get enabled(){return this.provider.enabled}getSettings(){return this.provider.getSettings()}test($,Z){if(process.env.IS_TEST==="true")this.cache.set($,Z)}async dispose(){await this.provider.dispose()}}class B5{async getAllFlagsAndPayloads(){return{}}enabled=!1;getSettings(){return{enabled:!1,timeoutMs:1000}}async dispose(){}}v2();import{execFile as Zc}from"node:child_process";import*as i_ from"node:fs/promises";import*as Y8 from"node:path";import{promisify as Qc}from"node:util";var Jc=Qc(Zc),Xc=52428800;async function j8($,Z){let{stdout:Q}=await Jc("git",["-C",$,...Z],{windowsHide:!0,maxBuffer:Xc,encoding:"utf8"});return Q}function fj($){return $.split("\x00").filter(Boolean)}function r_($,Z){let Q=Y8.resolve($,Z),J=Y8.relative($,Q);if(J.startsWith("..")||Y8.isAbsolute(J))throw Error(`Checkpoint diff path escapes workspace: ${Z}`);return Q}async function Wc($,Z,Q){try{return await j8($,["show",`${Z}:${Q}`])}catch{try{return await j8($,["show",`${Z}^3:${Q}`])}catch{return""}}}async function jc($,Z){try{return await i_.readFile(r_($,Z),"utf8")}catch{return""}}async function Yc($,Z){try{return fj(await j8($,["ls-tree","-r","-z","--name-only",`${Z}^3`]))}catch{return[]}}async function Vc($,Z){await j8($,["cat-file","-e",`${Z.ref}^{tree}`]);let[Q,J,X]=await Promise.all([j8($,["diff","--name-only","-z",Z.ref,"--"]),j8($,["ls-files","--others","--exclude-standard","-z"]),Yc($,Z.ref)]);return[...new Set([...fj(Q),...fj(J),...X])].sort((j,Y)=>j.localeCompare(Y))}function a_($){let Z=$.checkpointRunCount;if(!Number.isInteger(Z)||Z<1)throw Error("checkpointRunCount must be a positive integer");let Q=TZ(J5($.session),Z);if(!Q)throw Error(`No checkpoint found at or before run ${Z} in session ${$.session.sessionId}`);let J=($.cwd?.trim()||$.session.cwd||$.session.workspaceRoot).trim();if(!J)throw Error("cwd or workspaceRoot is required to compare a checkpoint");return{checkpoint:Q,cwd:J}}async function n_($,Z){let Q=await Vc($,Z);return(await Promise.all(Q.map(async(X)=>{let[W,j]=await Promise.all([Wc($,Z.ref,X),jc($,X)]);return{filePath:r_($,X),leftContent:W,rightContent:j}}))).filter((X)=>X.leftContent!==X.rightContent)}async function wj($){let Z=a_($),Q=await n_(Z.cwd,Z.checkpoint);return{...Z,diffs:Q}}var Sj="modelToolActivities";function Kc($){if($.role!=="assistant")return[];let Z=$.metadata?.[Sj];if(!Array.isArray(Z))return[];let Q=[];for(let J of Z){if(!J||typeof J!=="object"||Array.isArray(J))continue;let X=J,W=typeof X.toolCallId==="string"?X.toolCallId.trim():"",j=typeof X.toolName==="string"?X.toolName.trim():"",Y=X.execution;if(!W||!j||Y!=="client"&&Y!=="provider")continue;Q.push({toolCallId:W,toolName:j,execution:Y,input:X.input,output:X.output,isError:X.isError===!0,hasResult:Object.hasOwn(X,"output")||Object.hasOwn(X,"isError")})}return Q}function Bc($){if(!$||!Object.hasOwn($,Sj))return $;let Z={...$};return delete Z[Sj],Object.keys(Z).length>0?Z:void 0}function bZ($,Z,Q,J){return{kind:"session_display_message",origin:Q,execution:J,message:$,sourceIndex:Z}}function bj($){let Z=[];for(let[Q,J]of $.entries()){if(!J||typeof J!=="object"||Array.isArray(J)||J.role!=="user"&&J.role!=="assistant")continue;let X=J,W=Kc(X);if(W.length===0){Z.push(bZ(X,Q,"history"));continue}for(let[j,Y]of W.entries()){let K=(typeof X.id==="string"?X.id.trim():"")||`model_tool_${Y.toolCallId||`history_message_${Q}`}`,B={agent:X.agent,sessionId:X.sessionId,ts:X.ts},G={type:"tool_use",id:Y.toolCallId,name:Y.toolName,input:Y.input??{}};if(Z.push(bZ({...B,id:`${K}_model_tool_${j}_use`,role:"assistant",content:[G],metadata:{userRunSpan:0},modelInfo:X.modelInfo},Q,"model_tool_activity",Y.execution)),Y.hasResult)Z.push(bZ({...B,id:`${K}_model_tool_${j}_result`,role:"user",content:[{type:"tool_result",tool_use_id:Y.toolCallId,name:Y.toolName,content:e9(Y.output),is_error:Y.isError||void 0}],metadata:{userRunSpan:0}},Q,"model_tool_activity",Y.execution))}Z.push(bZ({...X,metadata:Bc(X.metadata)},Q,"history"))}return Z}class kj{clientName;runtimeAddress;automation;settings;featureFlags;pendingPrompts;host;prepare;capabilities;logger;telemetry;distinctId;automationService;activeSessionBootstraps=new Map;unsubscribeBootstrapCleanup;constructor($,Z,Q,J,X,W,j,Y,V,K){this.clientName=Z,this.runtimeAddress=Q,this.host=$,this.prepare=J,this.capabilities=X,this.logger=W,this.telemetry=j,this.distinctId=Y,this.featureFlags=V,this.settings=uU($),this.pendingPrompts=dU($),this.automation=new O3(()=>{if(!this.automationService)throw Error("ClineCore automation is not enabled. Pass `automation: true` or automation options to ClineCore.create().");return this.automationService}),this.automationService=K?new E4({workspaceRoot:K.workspaceRoot??process.cwd(),specs:{cronSpecsDir:K.cronSpecsDir??K.cronDir,scope:EK(K.cronScope),workspaceRoot:K.workspaceRoot},runtimeHandlers:MK({host:$,getExtensionContext:()=>J9({automationService:this.automationService,automation:this.automation,clientName:this.clientName,distinctId:this.distinctId,logger:this.logger,telemetry:this.telemetry})}),dbPath:K.dbPath,logger:K.logger,pollIntervalMs:K.pollIntervalMs,claimLeaseSeconds:K.claimLeaseSeconds,globalMaxConcurrency:K.globalMaxConcurrency,watcherDebounceMs:K.watcherDebounceMs}):void 0,this.unsubscribeBootstrapCleanup=this.host.subscribe((B)=>{if(B.type!=="ended")return;this.disposeSessionBootstrap(B.payload.sessionId)})}static async create($={}){let Z=L1($.distinctId),Q=o0($.capabilities),J={...$,capabilities:Q,distinctId:Z},X=await SZ(J),W=TK($.automation),j=$.featureFlags||new K5({provider:new B5,telemetry:$.telemetry,logger:$.logger,context:{distinctId:Z,clientName:$.clientName}}),Y=new kj(X,$.clientName,X.runtimeAddress,$.prepare,Q,$.logger,$.telemetry,Z,j,W?{...W,logger:$.logger}:void 0);if(W&&W.autoStart!==!1)await Y.automation.start();return Y}async disposeSessionBootstrap($){let Z=this.activeSessionBootstraps.get($);if(!Z)return;this.activeSessionBootstraps.delete($),await Promise.resolve(Z.dispose?.())}async start($){let Z=lU($),Q=await this.prepare?.(Z);try{let J=Q?await Q.applyToStartSessionInput(Z):Z,X=await this.host.startSession(ZX(J,{defaultCapabilities:this.capabilities,withExtensionContext:(W)=>J9({automationService:this.automationService,automation:this.automation,context:W,clientName:this.clientName,distinctId:this.distinctId,logger:this.logger,telemetry:this.telemetry})}));if(Q)if(await this.host.getSession(X.sessionId))this.activeSessionBootstraps.set(X.sessionId,Q);else await Promise.resolve(Q.dispose?.());return pU({input:J,sessionId:X.sessionId,telemetry:this.telemetry,clientName:this.clientName,runtimeAddress:this.runtimeAddress}),X}catch(J){throw await Promise.resolve(Q?.dispose?.()),J}}send=(...$)=>this.host.runTurn(...$);getAccumulatedUsage=(...$)=>{return this.host.getAccumulatedUsage?.(...$)??Promise.resolve(void 0)};abort=(...$)=>this.host.abort(...$);stop=async($)=>{await this.host.stopSession($),await this.disposeSessionBootstrap($)};dispose=async(...$)=>{try{await this.automationService?.dispose(),await this.host.dispose(...$)}finally{this.unsubscribeBootstrapCleanup();let Z=[...this.activeSessionBootstraps.keys()];await Promise.allSettled(Z.map((Q)=>this.disposeSessionBootstrap(Q)))}};get=(...$)=>this.host.getSession(...$);listHistory=async($={})=>await xX(this.host,$);list=async($=200,Z={})=>await this.listHistory({...Z,limit:$});delete=async($)=>{let Z=await this.host.deleteSession($);if(Z)await this.disposeSessionBootstrap($);return Z};update=(...$)=>this.host.updateSession(...$);updateSessionCompactionState=(...$)=>this.host.updateSessionCompactionState(...$);readSessionCompactionState=(...$)=>this.host.readSessionCompactionState(...$);readMessages=(...$)=>this.host.readSessionMessages(...$);async readDisplayMessages($){return bj(await this.host.readSessionMessages($))}readLiveMessages=($)=>this.host.readLiveSessionMessages?this.host.readLiveSessionMessages($):this.host.readSessionMessages($);async restore($){let Z=$.start?ZX($.start,{defaultCapabilities:this.capabilities,withExtensionContext:(Q)=>J9({automationService:this.automationService,automation:this.automation,context:Q,clientName:this.clientName,distinctId:this.distinctId,logger:this.logger,telemetry:this.telemetry})}):void 0;return this.host.restoreSession({sessionId:$.sessionId,checkpointRunCount:$.checkpointRunCount,cwd:$.cwd,restore:$.restore,start:Z})}async compareCheckpoint($){let Z=$.sessionId.trim();if(!Z)throw Error("sessionId is required");let Q=await this.host.getSession(Z);if(!Q)throw Error(`Session ${Z} not found`);return wj({session:Q,checkpointRunCount:$.checkpointRunCount,cwd:$.cwd})}ingestHookEvent=(...$)=>this.host.dispatchHookEvent(...$);subscribe($,Z){return this.host.subscribe($,Z)}updateSessionModel=(...$)=>{return this.host.updateSessionModel?.(...$)??Promise.resolve()};updateSessionConnection=(...$)=>{return this.host.updateSessionConnection?.(...$)??Promise.resolve()}}import{isAbsolute as Gc,relative as Hc,resolve as kZ,sep as Uc}from"node:path";import{createSessionId as Fc,readHubScheduleMode as o_}from"@cline/shared";function s_($,Z){if(typeof Z!=="string"||!Z.trim())return;let Q=kZ($.workspaceRoot,Z);if(!e_($.workspaceRoot,Q))throw Error("schedule cwd is outside the client workspace scope");return Q}function e_($,Z){let Q=Hc($,Z);return Q!==".."&&!Q.startsWith(`..${Uc}`)&&!Gc(Q)}function A1($,Z){return{version:$.version,requestId:$.requestId,ok:!0,payload:Z}}function t_($,Z,Q){return{version:$.version,requestId:$.requestId??Fc("hubreq_"),ok:!1,error:{code:Z,message:Q}}}class xZ{schedules;constructor($){this.schedules=$}async handleCommand($,Z){try{let Q=this.resolveScope(Z);switch($.command){case"schedule.create":return A1($,{schedule:this.schedules.createSchedule(this.toCreateInput($.payload??{},Q))});case"schedule.list":return A1($,{schedules:this.schedules.listSchedules({enabled:typeof $.payload?.enabled==="boolean"?$.payload.enabled:void 0,limit:typeof $.payload?.limit==="number"?$.payload.limit:void 0,tags:Array.isArray($.payload?.tags)?$.payload?.tags:void 0,workspaceRoot:Q.workspaceRoot})});case"schedule.get":return A1($,{schedule:this.requireScopedSchedule($,Q)});case"schedule.update":return A1($,{schedule:this.schedules.updateSchedule(this.requireScopedSchedule($,Q).scheduleId,this.toUpdateInput($.payload??{},Q))});case"schedule.delete":return A1($,{deleted:this.schedules.deleteSchedule(this.requireScopedSchedule($,Q).scheduleId)});case"schedule.enable":return A1($,{schedule:this.schedules.resumeSchedule(this.requireScopedSchedule($,Q).scheduleId)});case"schedule.disable":return A1($,{schedule:this.schedules.pauseSchedule(this.requireScopedSchedule($,Q).scheduleId)});case"schedule.trigger":return A1($,{execution:$.payload?.wait===!1?this.schedules.triggerScheduleNowDetached(this.requireScopedSchedule($,Q).scheduleId):await this.schedules.triggerScheduleNow(this.requireScopedSchedule($,Q).scheduleId)});case"schedule.list_executions":return A1($,{executions:this.listScopedExecutions($,Q)});case"schedule.stats":return A1($,{stats:this.schedules.getScheduleStats(this.requireScopedSchedule($,Q).scheduleId)});case"schedule.active":{let J=this.scopedScheduleIds(Q);return A1($,{executions:this.schedules.getActiveExecutions().filter((X)=>J.has(X.scheduleId))})}case"schedule.upcoming":{let J=this.scopedScheduleIds(Q);return A1($,{runs:this.schedules.getUpcomingRuns(typeof $.payload?.limit==="number"?$.payload.limit:void 0).filter((X)=>J.has(X.scheduleId))})}default:return t_($,"unsupported_command",`Unsupported hub schedule command: ${$.command}`)}}catch(Q){return t_($,"schedule_command_failed",Q instanceof Error?Q.message:String(Q))}}resolveScope($){let Z=$?.workspaceContext;if(!$?.clientId||!Z?.workspaceRoot?.trim())throw Error("schedule commands require a registered workspace client");let Q=kZ(Z.workspaceRoot),J=kZ(Z.cwd?.trim()||Q);if(!e_(Q,J))throw Error("client cwd is outside its workspace scope");return{workspaceRoot:Q,cwd:J}}requireScopedSchedule($,Z){let Q=String($.payload?.scheduleId??"").trim(),J=Q?this.schedules.getSchedule(Q):void 0;if(!J||kZ(J.workspaceRoot)!==Z.workspaceRoot)throw Error("schedule does not exist in this workspace");return J}scopedScheduleIds($){return new Set(this.schedules.listSchedules({workspaceRoot:$.workspaceRoot}).map((Z)=>Z.scheduleId))}listScopedExecutions($,Z){let Q=typeof $.payload?.scheduleId==="string"?$.payload.scheduleId.trim():void 0;if(Q)this.requireScopedSchedule($,Z);let J=this.scopedScheduleIds(Z);return this.schedules.listScheduleExecutions({scheduleId:Q,status:typeof $.payload?.status==="string"?$.payload.status:void 0,limit:typeof $.payload?.limit==="number"?$.payload.limit:void 0}).filter((X)=>J.has(X.scheduleId))}toCreateInput($,Z){let Q=o_($,"yolo"),J=$.modelSelection&&typeof $.modelSelection==="object"&&!Array.isArray($.modelSelection)?$.modelSelection:$.provider&&$.model?{providerId:String($.provider),modelId:String($.model)}:void 0;return{...$,modelSelection:J,mode:Q,workspaceRoot:Z.workspaceRoot,cwd:s_(Z,$.cwd)??Z.cwd}}toUpdateInput($,Z){let Q=o_($),J=$.modelSelection&&typeof $.modelSelection==="object"&&!Array.isArray($.modelSelection)?$.modelSelection:$.provider||$.model?{providerId:typeof $.provider==="string"?$.provider:"",modelId:typeof $.model==="string"?$.model:""}:void 0;return{...$,modelSelection:J,...Q===void 0?{}:{mode:Q},workspaceRoot:Z.workspaceRoot,...Object.hasOwn($,"cwd")?{cwd:$.cwd===null?Z.workspaceRoot:s_(Z,$.cwd)??Z.cwd}:{}}}}import{ONE_TIME_SCHEDULE_CRON_PATTERN as yZ,ONE_TIME_SCHEDULE_RUN_AT_METADATA_KEY as Dc}from"@cline/shared";function IZ($){return $?new Date($).getTime():void 0}function Lc($){let Z=$.metadata?{...$.metadata}:void 0;if(Z)delete Z.__hubScheduleCreatedBy,delete Z.__hubScheduleCwd,delete Z.__hubRuntimeOptions;return Z}function G5($){let Z=$.metadata;return{scheduleId:$.externalId,name:$.title,cronPattern:$.triggerKind==="one_off"?yZ:$.scheduleExpr??"",timezone:$.triggerKind==="schedule"?$.timezone:void 0,prompt:$.prompt??"",workspaceRoot:$.workspaceRoot??"",cwd:typeof Z?.__hubScheduleCwd==="string"?Z.__hubScheduleCwd:void 0,modelSelection:$.providerId||$.modelId?{providerId:$.providerId??"",modelId:$.modelId??""}:void 0,enabled:$.enabled&&!$.removed&&$.parseStatus==="valid",mode:$.mode==="plan"?"plan":$.mode==="act"?"act":"yolo",systemPrompt:$.systemPrompt,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,maxParallel:$.maxParallel??1,createdAt:new Date($.createdAt).getTime(),updatedAt:new Date($.updatedAt).getTime(),nextRunAt:IZ($.nextRunAt),lastRunAt:IZ($.lastRunAt),createdBy:typeof Z?.__hubScheduleCreatedBy==="string"?Z.__hubScheduleCreatedBy:void 0,tags:$.tags,runtimeOptions:Z?.__hubRuntimeOptions&&typeof Z.__hubRuntimeOptions==="object"&&!Array.isArray(Z.__hubRuntimeOptions)?Z.__hubRuntimeOptions:void 0,metadata:Lc($)}}function _c($){switch($){case"done":return"success";case"cancelled":return"aborted";case"running":return"running";case"queued":return"pending";default:return"failed"}}function xj($,Z){return{executionId:$.runId,scheduleId:Z,sessionId:$.sessionId,triggeredAt:new Date($.scheduledFor??$.createdAt).getTime(),startedAt:IZ($.startedAt),endedAt:IZ($.completedAt),status:_c($.status),errorMessage:$.error}}class hZ{store;materializer;runner;started=!1;disposed=!1;constructor($){this.store=new T4({dbPath:$.dbPath}),this.materializer=new _4({store:this.store}),this.runner=new z4({store:this.store,materializer:this.materializer,runtimeHandlers:$.runtimeHandlers,eventPublisher:$.eventPublisher,workspaceRoot:"",specs:$.specs,logger:$.logger,pollIntervalMs:$.pollIntervalMs,claimLeaseSeconds:$.claimLeaseSeconds,globalMaxConcurrency:$.globalMaxConcurrency})}async start(){if(this.disposed)throw Error("HubScheduleService has been disposed");if(this.started)return;this.started=!0,await this.runner.start()}async stop(){await this.runner.stop(),this.started=!1}async dispose(){if(this.disposed)return;this.disposed=!0,await this.runner.dispose(),this.store.close()}createSchedule($){if(this.validateScheduleTiming($.cronPattern,$.timezone,$.metadata,!0),!$.workspaceRoot?.trim())throw Error("workspaceRoot is required for schedules");return G5(this.store.createHubSchedule($))}getSchedule($){let Z=this.store.getHubSchedule($);return Z?G5(Z):void 0}listSchedules($={}){return this.store.listHubSchedules($).map((Z)=>G5(Z))}updateSchedule($,Z){let Q=this.store.getHubSchedule($);if(!Q)return;let J=Z.workspaceRoot!==void 0?Z.workspaceRoot.trim():Q.workspaceRoot,X=Z.enabled??Q.enabled,W=G5(Q),j=Z.cronPattern??W.cronPattern;if(j.trim()===yZ&&typeof Z.timezone==="string"&&Z.timezone.trim())throw Error("timezone is only supported for recurring schedules");if(this.validateScheduleTiming(j,j.trim()===yZ?void 0:Z.timezone===null?void 0:Z.timezone??W.timezone,Z.metadata??W.metadata,X),X&&!J)throw Error("workspaceRoot is required for enabled schedules");let Y=this.store.updateHubSchedule($,{...Z,scheduleId:$});return Y?G5(Y):void 0}validateScheduleTiming($,Z,Q,J){if($.trim()!==yZ){KF($),FX(Z);return}if(Z?.trim())throw Error("timezone is only supported for recurring schedules");let X=Q?.[Dc];if(typeof X!=="number"||!Number.isFinite(X)||J&&X<=Date.now())throw Error("runAt must be a future timestamp")}deleteSchedule($){return this.store.deleteHubSchedule($)}pauseSchedule($){return this.updateSchedule($,{scheduleId:$,enabled:!1})}resumeSchedule($){return this.updateSchedule($,{scheduleId:$,enabled:!0})}async triggerScheduleNow($){let Z=this.store.enqueueHubScheduleRun($,"manual");if(!Z)return;await this.runner.tick();let Q=this.store.getRun(Z.runId)??Z;return xj(Q,$)}triggerScheduleNowDetached($){let Z=this.store.enqueueHubScheduleRun($,"manual");if(!Z)return;return this.runner.tick().catch(()=>{return}),xj(Z,$)}listScheduleExecutions($){let Z=$.scheduleId?this.store.getHubSchedule($.scheduleId):void 0,Q={specId:Z?.specId,limit:$.limit};return this.store.listRuns(Q).map((X)=>{let W=Z??this.store.getSpec(X.specId);if(!W||W.source!=="hub-schedule")return;return xj(X,W.externalId)}).filter((X)=>{if(!X)return!1;return!$.status||X.status===$.status})}getScheduleStats($){let Z=this.listScheduleExecutions({scheduleId:$,limit:1e4});if(Z.length===0)return{totalRuns:0,successRate:0,avgDurationSeconds:0};let Q=0,J=0,X=0,W;for(let j of Z){if(j.status==="success"||j.status==="completed")Q+=1;if(!W&&j.status!=="success"&&j.status!=="completed")W=j;if(j.startedAt&&j.endedAt)X+=j.endedAt-j.startedAt,J+=1}return{totalRuns:Z.length,successRate:Q/Z.length,avgDurationSeconds:J>0?X/J/1000:0,lastFailure:W}}getActiveExecutions(){return this.runner.getActiveRuns().flatMap(($)=>{let Z=this.store.getSpec($.specId);if(!Z||Z.source!=="hub-schedule"||!$.sessionId)return[];return[{executionId:$.runId,scheduleId:Z.externalId,sessionId:$.sessionId,startedAt:$.startedAt??new Date().toISOString(),timeoutAt:Z.timeoutSeconds&&$.startedAt?new Date(new Date($.startedAt).getTime()+Z.timeoutSeconds*1000).toISOString():void 0}]})}getUpcomingRuns($=20){let Z={triggerKind:"schedule",enabled:!0,limit:$};return this.store.listSpecs(Z).flatMap((Q)=>Q.source==="hub-schedule"&&Q.nextRunAt?[{spec:Q,nextRunAt:Q.nextRunAt}]:[]).sort((Q,J)=>String(Q.nextRunAt).localeCompare(String(J.nextRunAt))).slice(0,$).map(({spec:Q,nextRunAt:J})=>({scheduleId:Q.externalId,name:Q.title,nextRunAt:J}))}}_0();import{realpathSync as Ij,statSync as zc}from"node:fs";import{isAbsolute as Zz,relative as Oc,sep as Qz}from"node:path";import{ONE_TIME_SCHEDULE_CRON_PATTERN as Jz,ONE_TIME_SCHEDULE_RUN_AT_METADATA_KEY as Xz}from"@cline/shared";import{z as L0}from"zod";var Nc=L0.enum(["create","update","list","get","pause","resume","delete","run_now"]),qc=L0.object({provider_id:L0.string().min(1),model_id:L0.string().min(1).optional()}),G8=L0.object({operation:Nc,schedule_id:L0.string().min(1).optional(),schedule_type:L0.enum(["once","recurring"]).optional(),name:L0.string().min(1).optional(),prompt:L0.string().min(1).optional(),run_at:L0.string().datetime({offset:!0}).optional(),cron_pattern:L0.string().min(1).optional(),timezone:L0.string().min(1).nullable().optional(),enabled:L0.boolean().optional(),mode:L0.enum(["act","plan","yolo"]).optional(),system_prompt:L0.string().nullable().optional(),max_iterations:L0.number().int().positive().nullable().optional(),timeout_seconds:L0.number().int().positive().nullable().optional(),max_parallel:L0.number().int().positive().max(32).optional(),tags:L0.array(L0.string().min(1)).optional(),model_selection:qc.optional(),limit:L0.number().int().positive().max(200).optional()});function V8($,Z,Q,J){if(!Wz.has(Z.operation))return;n1($.telemetry,{ulid:Q.sessionId??Q.conversationId??Q.agentId,tool:`tasks.scheduled.${Z.operation}`,success:J,agentId:Q.agentId})}var Wz=new Set(["create","update","pause","resume","delete","run_now"]);function B8($,Z){let Q=$?.trim();if(!Q)throw Error(`${Z} is required for this operation`);return Q}function hj($,Z){try{let Q=Ij.native($);if(!zc(Q).isDirectory())throw Error("not a directory");return Q}catch{throw Error(`${Z} does not resolve to an existing safe path`)}}function Ac($,Z){try{return Ij.native($)===Ij.native(Z)}catch{return!1}}function jz($,Z,Q){let J=Oc($,Z);if(J===".."||J.startsWith(`..${Qz}`)||Zz(J))throw Error(`${Q} is outside the workspace scope`)}function Yz($,Z,Q){return hj(Zz(Z)?Z:`${$}${Qz}${Z}`,Q)}function Tc($){let Z=hj($.workspaceRoot,"workspaceRoot"),Q=$.cwd?Yz(Z,$.cwd,"cwd"):Z;return jz(Z,Q,"cwd"),{...$,workspaceRoot:Z,cwd:Q}}function K8($,Z){if(!$)throw Error("schedule does not exist");if(!Ac($.workspaceRoot,Z.workspaceRoot))throw Error("schedule is outside this session's workspace scope");let Q=hj($.workspaceRoot,"schedule workspaceRoot");if($.cwd){let J=Yz(Q,$.cwd,"schedule cwd");jz(Q,J,"schedule cwd")}}function $z($){if(!$)return;return{providerId:$.provider_id.trim(),modelId:$.model_id?.trim()||void 0}}function yj($){if(!$)return;return[...new Set($.map((Z)=>Z.trim()).filter(Boolean))]}function Vz($){let Z=Date.parse(B8($,"run_at"));if(!Number.isFinite(Z))throw Error("run_at must be an ISO timestamp");if(Z<=Date.now())throw Error("run_at must be in the future");return Z}function Ec($){if($.schedule_type==="once"){if($.cron_pattern)throw Error("cron_pattern cannot be used with a one-time schedule");if($.timezone)throw Error("timezone is encoded in run_at for a one-time schedule");return{cronPattern:Jz,metadata:{[Xz]:Vz($.run_at)}}}if($.schedule_type==="recurring"){if($.run_at)throw Error("run_at cannot be used with a recurring schedule");return{cronPattern:B8($.cron_pattern,"cron_pattern"),timezone:$.timezone?.trim()||void 0}}throw Error("schedule_type is required for create")}function Mc($){if($.run_at&&$.cron_pattern)throw Error("run_at and cron_pattern cannot be updated together");if($.schedule_type==="once"||$.run_at){if($.cron_pattern)throw Error("cron_pattern cannot be used with a one-time schedule");if($.timezone)throw Error("timezone is encoded in run_at for a one-time schedule");return{cronPattern:Jz,timezone:null,metadata:{[Xz]:Vz($.run_at)}}}if($.schedule_type==="recurring"||$.cron_pattern)return{cronPattern:B8($.cron_pattern,"cron_pattern"),timezone:$.timezone===null?null:$.timezone?.trim()||void 0};return{timezone:$.timezone===null?null:$.timezone?.trim()||void 0}}function H5($){return B8($.schedule_id,"schedule_id")}async function vj($,Z,Q){let J=G8.safeParse(Z);if(!J.success)return{ok:!1,error:{code:"invalid_schedule_input",message:J.error.issues[0]?.message??"Invalid schedule input"}};let X=J.data;try{if(!Q.sessionId)throw Error("tasks requires a Hub session");let W=await $.resolveSessionDefaults(Q.sessionId);if(!W?.workspaceRoot.trim())throw Error("tasks could not resolve the current workspace");let j=Tc(W);if(Wz.has(X.operation)&&!j.interactive)throw Error("schedule mutations require an interactive user session");switch(X.operation){case"create":{let Y=$.schedules.createSchedule({name:B8(X.name,"name"),...Ec(X),prompt:B8(X.prompt,"prompt"),workspaceRoot:j.workspaceRoot,cwd:j.cwd,modelSelection:$z(X.model_selection)??j.modelSelection,enabled:X.enabled,mode:X.mode??"yolo",systemPrompt:X.system_prompt??void 0,maxIterations:X.max_iterations??void 0,timeoutSeconds:X.timeout_seconds??void 0,maxParallel:X.max_parallel??1,createdBy:`agent:${Q.agentId}`,tags:yj(X.tags)});return $.publish?.("schedule.created",{schedule:Y},Q.sessionId),V8($,X,Q,!0),{ok:!0,operation:X.operation,schedule:Y}}case"update":{let Y=H5(X);K8($.schedules.getSchedule(Y),j);let V=$.schedules.updateSchedule(Y,{scheduleId:Y,...Mc(X),name:X.name?.trim()||void 0,prompt:X.prompt?.trim()||void 0,modelSelection:$z(X.model_selection),enabled:X.enabled,mode:X.mode,systemPrompt:X.system_prompt,maxIterations:X.max_iterations,timeoutSeconds:X.timeout_seconds,maxParallel:X.max_parallel,tags:yj(X.tags)});if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.updated",{schedule:V},Q.sessionId),V8($,X,Q,!0),{ok:!0,operation:X.operation,schedule:V}}case"list":{let Y=$.schedules.listSchedules({enabled:X.enabled,tags:yj(X.tags),workspaceRoot:j.workspaceRoot,limit:X.limit??50}).filter((V)=>{try{return K8(V,j),!0}catch{return!1}}).slice(0,X.limit??50);return{ok:!0,operation:X.operation,schedules:Y}}case"get":{let Y=$.schedules.getSchedule(H5(X));return K8(Y,j),{ok:!0,operation:X.operation,schedule:Y}}case"pause":case"resume":{let Y=H5(X);K8($.schedules.getSchedule(Y),j);let V=X.operation==="pause"?$.schedules.pauseSchedule(Y):$.schedules.resumeSchedule(Y);if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.updated",{schedule:V},Q.sessionId),V8($,X,Q,!0),{ok:!0,operation:X.operation,schedule:V}}case"delete":{let Y=H5(X);K8($.schedules.getSchedule(Y),j);let V=$.schedules.deleteSchedule(Y);if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.deleted",{deleted:V,scheduleId:Y},Q.sessionId),V8($,X,Q,!0),{ok:!0,operation:X.operation,deleted:V}}case"run_now":{let Y=H5(X);K8($.schedules.getSchedule(Y),j);let V=$.schedules.triggerScheduleNowDetached(Y);if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.triggered",{execution:V},Q.sessionId),V8($,X,Q,!0),{ok:!0,operation:X.operation,execution:V}}}}catch(W){return V8($,X,Q,!1),{ok:!1,operation:X.operation,error:{code:"schedule_operation_failed",message:W instanceof Error?W.message:String(W)}}}}cZ();import{createTool as tc,zodToJsonSchema as ec}from"@cline/shared";import{z as l1}from"zod";_0();import{resolve as Gz}from"node:path";import{z as o}from"zod";var Hz=o.enum(["suggestion","follow-up","todo","handoff","idea","reminder"]),ac=o.enum(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),Uz=o.union([o.literal(0),o.literal(1),o.literal(2),o.literal(3),o.literal(4),o.literal(5)]),nc=o.object({provider_id:o.string().min(1),model_id:o.string().min(1).optional()}),uZ=o.object({operation:o.enum(["create","update","list","get"]),task_id:o.string().min(1).optional(),expected_revision:o.number().int().positive().optional(),type:Hz.optional(),title:o.string().min(1).optional(),description:o.string().nullable().optional(),instructions:o.string().min(1).optional(),scope:o.enum(["workspace","global"]).optional(),workspace_root:o.string().min(1).nullable().optional(),cwd:o.string().min(1).nullable().optional(),resource_paths:o.array(o.string().min(1)).optional(),priority:Uz.optional(),assignee:o.string().min(1).nullable().optional(),model_selection:nc.nullable().optional(),mode:o.enum(["act","plan","yolo"]).nullable().optional(),system_prompt:o.string().nullable().optional(),max_iterations:o.number().int().positive().nullable().optional(),timeout_seconds:o.number().int().positive().nullable().optional(),available_at:o.string().datetime().optional(),expires_at:o.string().datetime().optional(),automation_eligible:o.boolean().optional(),statuses:o.array(ac).optional(),types:o.array(Hz).optional(),priorities:o.array(Uz).optional(),limit:o.number().int().positive().max(500).optional()}),oc=new Set(["create","update"]);function uj($,Z,Q,J){if(!oc.has(Z.operation))return;n1($.telemetry,{ulid:Q.sessionId??Q.conversationId??Q.agentId,tool:`tasks.todo.${Z.operation}`,success:J,agentId:Q.agentId})}function H8($,Z){let Q=$?.trim();if(!Q)throw Error(`${Z} is required for this operation`);return Q}function Fz($){if($===void 0||$===null)return $;return{providerId:$.provider_id,modelId:$.model_id}}function Lz($,Z){return Gz($)===Gz(Z)}function Dz($,Z){if(!$)throw Error("task does not exist");if(Z.workspaceRoot){if($.scope!=="workspace"||!$.workspaceRoot||!Lz($.workspaceRoot,Z.workspaceRoot))throw Error("task is outside this session's workspace scope");return}if($.scope!=="global")throw Error("task is outside this session's global scope")}function sc($,Z){let Q=Z.workspaceRoot?"workspace":"global";if($.scope&&$.scope!==Q)throw Error(`this session can only manage ${Q} tasks`);if($.workspace_root!==void 0){if(!Z.workspaceRoot||$.workspace_root===null||!Lz($.workspace_root,Z.workspaceRoot))throw Error(`this session can only manage ${Q} tasks`)}return Q}async function _z($,Z,Q){let J=uZ.safeParse(Z);if(!J.success)return{ok:!1,error:{code:"invalid_task_input",message:J.error.issues[0]?.message??"Invalid task input"}};let X=J.data,W={kind:"agent",id:Q.agentId,agentId:Q.agentId,sessionId:Q.sessionId};try{if(!Q.sessionId)throw Error("tasks requires a Hub session");let j=await $.resolveSessionDefaults(Q.sessionId);if(!j)throw Error("tasks could not resolve the current session");let Y=sc(X,j);switch(X.operation){case"create":{let V={type:H8(X.type,"type"),title:H8(X.title,"title"),description:X.description??void 0,instructions:H8(X.instructions,"instructions"),scope:Y,workspaceRoot:j.workspaceRoot,cwd:Y==="workspace"?(X.cwd??j.cwd)?.trim()||void 0:void 0,resourcePaths:X.resource_paths,priority:X.priority,assignee:X.assignee??void 0,modelSelection:Fz(X.model_selection)??j.modelSelection,mode:X.mode??void 0,systemPrompt:X.system_prompt??void 0,maxIterations:X.max_iterations??void 0,timeoutSeconds:X.timeout_seconds??void 0,availableAt:X.available_at,expiresAt:H8(X.expires_at,"expires_at"),automationEligible:X.automation_eligible,createdBy:W,originSessionId:Q.sessionId,originTaskId:j.originTaskId},K={ok:!0,operation:X.operation,task:await $.manager.createTask(V)};return uj($,X,Q,!0),K}case"update":{let V=H8(X.task_id,"task_id");if(Dz(await $.manager.getTask(V),j),!X.expected_revision)throw Error("expected_revision is required for update");let K={ok:!0,operation:X.operation,task:await $.manager.updateTask({taskId:V,expectedRevision:X.expected_revision,type:X.type,title:X.title,description:X.description,instructions:X.instructions,scope:Y,workspaceRoot:j.workspaceRoot??null,cwd:X.cwd,resourcePaths:X.resource_paths,priority:X.priority,assignee:X.assignee,modelSelection:Fz(X.model_selection),mode:X.mode,systemPrompt:X.system_prompt,maxIterations:X.max_iterations,timeoutSeconds:X.timeout_seconds,availableAt:X.available_at,expiresAt:X.expires_at,automationEligible:X.automation_eligible,updatedBy:W})};return uj($,X,Q,!0),K}case"list":{let V={statuses:X.statuses,types:X.types,scope:Y,workspaceRoot:j.workspaceRoot,priorities:X.priorities,automationEligible:X.automation_eligible,limit:X.limit};return{ok:!0,operation:X.operation,tasks:await $.manager.listTasks(V)}}case"get":{let V=await $.manager.getTask(H8(X.task_id,"task_id"));return Dz(V,j),{ok:!0,operation:X.operation,task:V}}}}catch(j){return uj($,X,Q,!1),{ok:!1,operation:X.operation,error:{code:"task_operation_failed",message:j instanceof Error?j.message:String(j)}}}}var L5="tasks",zz='# Tasks\n\nUse the `tasks` tool to manage durable Todo items and explicitly requested scheduled agent work.\n\n- Use `kind: "todo"` for meaningful follow-ups, handoffs, ideas, reminders, and other work that should remain visible after this session. This includes useful work you identify and suggest proactively. Agent-created Todos require user approval; Todos created directly by the user are approved immediately. Todo `available_at` controls availability in the list; it never schedules execution.\n- Use `kind: "scheduled"` only when the user explicitly asks Cline to execute work once at a future time or on a recurrence. One-time schedules require an exact future ISO 8601 `run_at` with an offset or Z. Recurring schedules require a five-field `cron_pattern` and may include an IANA `timezone`.\n- "Remind me" is ambiguous: ask whether the user wants a reviewed Todo note or an agent to execute work at that time when intent is unclear.\n- Never create both kinds for the same request unless the user explicitly requests both. Check existing items before creating a likely duplicate.\n- Todo instructions and scheduled prompts must be self-contained. Include the goal, constraints, relevant project context, and expected output.\n- Never approve or start a Todo yourself. Only mutate schedules from an interactive user session, and only update, pause, resume, delete, or run one immediately when the user asks.',$u='# Tasks\n\nUse the `tasks` tool only when the user explicitly asks Cline to execute work once at a future time or on a recurrence. Always pass `kind: "scheduled"`.\n\n- One-time schedules require an exact future ISO 8601 `run_at` with an offset or Z. Recurring schedules require a five-field `cron_pattern` and may include an IANA `timezone`.\n- Never create a schedule proactively. Check existing schedules before creating a likely duplicate.\n- Make the scheduled `prompt` self-contained because it runs in a new unattended session. Include the goal, constraints, relevant project context, and expected output.\n- Only update, pause, resume, delete, or run a schedule immediately when the user asks for that action.',Zu=uZ.extend({kind:l1.literal("todo")}).strict(),Oz=G8.extend({kind:l1.literal("scheduled")}).strict(),Nz=l1.discriminatedUnion("kind",[Zu,Oz]),Qu=l1.discriminatedUnion("kind",[Oz]),qz=["create","update","list","get","pause","resume","delete","run_now"],Ju=l1.object({...G8.shape,...uZ.shape,kind:l1.enum(["todo","scheduled"]),operation:l1.enum(qz)}).strict(),Xu=l1.object({...G8.shape,kind:l1.enum(["scheduled"]),operation:l1.enum(qz)}).strict();function dj($){let Z=$.todo;return tc({name:L5,description:Z?'Create and manage reviewed Todo items or explicitly requested scheduled agent work. Use kind "todo" for durable Agenda items that require user or automation approval. Use kind "scheduled" for one-time or recurring autonomous execution. Todo available_at is not an execution timer; schedules use run_at or cron_pattern.':'Create and manage explicitly requested scheduled agent work with kind "scheduled". One-time schedules use a future ISO 8601 run_at; recurring schedules use a five-field cron_pattern.',inputSchema:ec(Z?Ju:Xu),retryable:!1,maxRetries:0,execute:async(Q,J)=>{let X=(Z?Nz:Qu).safeParse(Q);if(!X.success)return{ok:!1,kind:typeof Q==="object"&&Q!==null&&"kind"in Q&&(Q.kind==="todo"||Q.kind==="scheduled")?Q.kind:void 0,error:{code:"invalid_tasks_input",message:X.error.issues[0]?.message??"Invalid tasks input"}};if(X.data.kind==="todo"){if(!Z)return{ok:!1,kind:"todo",error:{code:"invalid_tasks_input",message:'kind "todo" is not available in this session'}};return{kind:"todo",...await _z(Z,X.data,J)}}return{kind:"scheduled",...await vj($.scheduled,X.data,J)}}})}function lj($){return{name:"hub-task-guidance",manifest:{capabilities:["rules"]},setup:(Z)=>{Z.registerRule({id:"hub:task-guidance",content:$?.todoEnabled===!1?$u:zz,whenToolAvailable:L5})}}}import{resolveClineBuildEnv as Wu}from"@cline/shared";function ju($,Z){if($ instanceof Error)return $;if($&&typeof $==="object"&&"message"in $&&typeof $.message==="string"&&$.message.trim())return Error($.message.trim());let Q=$&&typeof $==="object"&&"type"in $&&typeof $.type==="string"?$.type.trim():"";return Error(Q?`Failed to connect to hub at ${Z} (${Q} event before socket open).`:`Failed to connect to hub at ${Z}.`)}var Yu="cline-hub-auth.";function Vu($){return $.host!==void 0||$.port!==void 0||$.pathname!==void 0}function Ku($,Z){let Q=new URL($),J=new URL(Z);return Q.search="",Q.hash="",J.search="",J.hash="",Q.toString()===J.toString()}function Az(){return Wu()==="production"?v1():P1()}async function Bu($){let Z=$.searchParams.get("authToken")?.trim();if($.searchParams.delete("authToken"),Z)return Z;let Q=Az(),J=await x0(Q.discoveryPath);if(J?.url&&Ku($.toString(),J.url))return J.authToken;return}async function Gu($={}){let Z=x2($);if(!Vu($)){let Q=Az(),J=await x0(Q.discoveryPath);if(J?.url)return J.url}return j$(Z.host,Z.port,Z.pathname)}async function Tz($){return await new Promise((Z,Q)=>{(async()=>{let J=new URL($),X=await Bu(J);J.hash="";let W=new WebSocket(J.toString(),X?[`${Yu}${X}`]:void 0),j=new Map,Y=0;W.addEventListener("open",()=>{Z({send(V){let K=V.requestId??`hub-client-${++Y}`;return new Promise((B,G)=>{j.set(K,{resolve:B,reject:G});let H={kind:"command",envelope:{...V,requestId:K}};W.send(JSON.stringify(H))})},close(){W.close()}})}),W.addEventListener("message",(V)=>{let K=JSON.parse(String(V.data));if(K.kind==="reply"&&K.envelope.requestId){let B=j.get(K.envelope.requestId);if(B)j.delete(K.envelope.requestId),B.resolve(K.envelope)}}),W.addEventListener("close",()=>{for(let V of j.values())V.reject(Error("Hub connection closed"));j.clear()}),W.addEventListener("error",(V)=>{Q(ju(V,$))})})().catch(Q)})}async function Z30($){try{return(await Tz($)).close(),!0}catch{return!1}}async function Q30($,Z){let Q=await Gu($),J=await Tz(Q);try{return await J.send({version:Z.version??"v1",clientId:Z.clientId??"hub-client",...Z})}finally{J.close()}}import{existsSync as Hu}from"node:fs";import{isHubDaemonProcess as Uu,resolveClineBuildEnv as Fu}from"@cline/shared";var Du=1e4,Lu="CLINE_HUB_BUILD_WATCH_INTERVAL_MS";function _u(){let $=Number(process.env[Lu]);return Number.isFinite($)&&$>0?$:Du}function zu(){return Fu()==="production"?v1():P1()}function Ou($){try{return Hu(`${$}.lock`)}catch{return!1}}async function Nu(){let $=zu();if(Ou($.discoveryPath))return;let Z=await x0($.discoveryPath).catch(()=>{return});if(!Z?.url)return;let Q=await W$(Z.url).catch(()=>{return});if(!Q?.url)return;let J=h1(),X=b4(Q,J);if(X.compatible)return;let W=(j)=>({url:Q.url,reason:j,hubBuildId:Q.buildId,hubCoreVersion:Q.coreVersion,expectedBuildId:J});if(X.reason==="unsupported_protocol")return W("unsupported_protocol");if(gX(mX(),Q)>0)return W("outdated_hub");return W("build_mismatch")}function V30($){if(Uu()||process.env.CLINE_HUB_PORT?.trim())return()=>{};let Z=$.intervalMs??_u(),Q,J,X=!1,W=setInterval(()=>{if(X)return;X=!0,Nu().then((j)=>{if(!j){Q=void 0,J=void 0;return}let Y=`${j.reason}:${j.hubBuildId??""}`;if(Y===Q)return;if(j.reason==="outdated_hub"&&J!==Y){J=Y;return}J=void 0,Q=Y,$.onMismatch(j)}).catch(()=>{return}).finally(()=>{X=!1})},Z);return W.unref?.(),()=>{clearInterval(W)}}function pj($){return $?JSON.parse(JSON.stringify($)):{}}function dZ($){let Z=$?.session&&typeof $.session==="object"?$.session:void 0;if(!Z)return;let Q=Z.metadata&&typeof Z.metadata==="object"?pj(Z.metadata):void 0;return{sessionId:typeof Z.sessionId==="string"?Z.sessionId:"",parentSessionId:typeof Q?.parentSessionId==="string"?Q.parentSessionId:void 0,status:typeof Z.status==="string"?Z.status:void 0,messagesPath:typeof Q?.messagesPath==="string"?Q.messagesPath:void 0,metadata:Q}}function Ez($,Z){return $.error?.message??`hub command failed: ${Z}`}function qu($){let Z=pj($);if(typeof Z.error==="string"&&Z.error.trim())return{...Z,error:Z.error.trim()};let Q=Z.result&&typeof Z.result==="object"?Z.result:void 0;if(typeof Q?.text==="string"&&Q.text.trim())return{...Z,error:Q.text.trim()};let J=Q?.error&&typeof Q.error==="object"?Q.error:void 0;if(typeof J?.message==="string"&&J.message.trim())return{...Z,error:J.message.trim()};return Z}function Mz($){let Z=$?.sessionId;return typeof Z==="string"&&Z.trim()?Z.trim():void 0}function Au($){let Z=$?.checkpoint;if(!Z||typeof Z!=="object"||Array.isArray(Z))throw Error("hub checkpoint restore returned no checkpoint");let Q=Z;if(typeof Q.ref!=="string"||typeof Q.createdAt!=="number"||typeof Q.runCount!=="number")throw Error("hub checkpoint restore returned an invalid checkpoint");return Q}function Tu($){let Z=pj($.payload);if($.event==="schedule.execution_completed")return{sessionId:$.sessionId?.trim()||Mz(Z)||"",eventType:"schedule.execution.completed",payload:Z};if($.event==="schedule.execution_failed")return{sessionId:$.sessionId?.trim()||Mz(Z)||"",eventType:"schedule.execution.failed",payload:Z};let Q=$.sessionId?.trim();if(!Q)return;switch($.event){case"iteration.started":return{sessionId:Q,eventType:"runtime.chat.iteration_start",payload:Z};case"iteration.finished":return{sessionId:Q,eventType:"runtime.chat.iteration_end",payload:Z};case"assistant.delta":return{sessionId:Q,eventType:"runtime.chat.text_delta",payload:Z};case"assistant.media":return{sessionId:Q,eventType:"runtime.chat.media",payload:Z};case"usage.updated":return{sessionId:Q,eventType:"runtime.chat.usage",payload:Z};case"session.notice":return{sessionId:Q,eventType:"runtime.chat.notice",payload:Z};case"tool.started":return{sessionId:Q,eventType:"runtime.chat.tool_call_start",payload:Z};case"tool.updated":return{sessionId:Q,eventType:"runtime.chat.tool_call_update",payload:Z};case"tool.finished":return{sessionId:Q,eventType:"runtime.chat.tool_call_end",payload:Z};case"approval.requested":return{sessionId:Q,eventType:"approval.requested",payload:Z};case"run.aborted":return{sessionId:Q,eventType:"runtime.chat.aborted",payload:Z};case"run.failed":return{sessionId:Q,eventType:"runtime.chat.failed",payload:qu($.payload)};case"run.completed":return{sessionId:Q,eventType:"runtime.chat.completed",payload:Z};default:return}}class Eu{options;client;metadataApplied=!1;constructor($){this.options=$;this.client=new Y$({url:$.address,authToken:$.authToken,clientId:$.clientId,clientType:$.clientType??"hub-session-client",displayName:$.displayName??"hub session client",workspaceRoot:$.workspaceRoot,cwd:$.cwd})}async ensureMetadataApplied(){if(this.metadataApplied||!this.options.metadata){if(!this.options.metadata)await this.client.connect();return}await this.client.connect(),await this.client.command("client.update",{metadata:this.options.metadata}),this.metadataApplied=!0}async connect(){await this.ensureMetadataApplied()}async taskCommand($,Z){return await this.ensureMetadataApplied(),(await this.client.command($,Z)).payload??{}}close(){this.client.close()}async dispose(){await this.client.dispose()}async startRuntimeSession($){await this.ensureMetadataApplied();let Z=await this.client.command("session.create",{workspaceRoot:$.workspaceRoot,cwd:$.cwd,sessionConfig:{providerId:$.provider,modelId:$.model,apiKey:$.apiKey,cwd:$.cwd??$.workspaceRoot,workspaceRoot:$.workspaceRoot,systemPrompt:$.systemPrompt??"",mode:$.mode??"act",rules:$.rules,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,enableTools:$.enableTools,enableSpawnAgent:$.enableSpawn!==!1,enableAgentTeams:$.enableTeams!==!1,disableMcpSettingsTools:$.disableMcpSettingsTools,missionLogIntervalSteps:$.missionStepInterval,missionLogIntervalMs:$.missionTimeIntervalMs},metadata:{source:$.source??"cli",provider:$.provider,model:$.model,enableTools:$.enableTools,enableSpawn:$.enableSpawn,enableTeams:$.enableTeams,prompt:void 0,interactive:$.interactive!==!1},runtimeOptions:{mode:$.mode,systemPrompt:$.systemPrompt,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,enableTools:$.enableTools,enableSpawn:$.enableSpawn,enableTeams:$.enableTeams,autoApproveTools:$.autoApproveTools,toolExecutors:$.toolExecutors,configExtensions:$.configExtensions},modelSelection:{provider:$.provider,model:$.model,apiKey:$.apiKey},toolPolicies:$.toolPolicies}),Q=dZ(Z.payload);if(!Q?.sessionId)throw Error("hub session create returned no session id");return{sessionId:Q.sessionId,startResult:{sessionId:Q.sessionId,manifestPath:"",messagesPath:Q.messagesPath??""}}}async sendRuntimeSession($,Z,Q){return await this.ensureMetadataApplied(),{result:(await this.client.command("session.send_input",{prompt:Z.prompt,mode:Z.config.mode,attachments:Z.attachments,delivery:Z.delivery,timeoutSeconds:Z.config.timeoutSeconds},$,Q)).payload?.result}}async stopRuntimeSession($){return await this.ensureMetadataApplied(),await this.client.command("session.detach",{sessionId:$},$),{applied:!0}}async abortRuntimeSession($){return await this.ensureMetadataApplied(),await this.client.command("run.abort",{sessionId:$},$),{applied:!0}}async updateSession($){return await this.ensureMetadataApplied(),await this.client.command("session.update",{sessionId:$.sessionId,metadata:$.metadata},$.sessionId),{updated:!0}}async getSession($){await this.ensureMetadataApplied();let Z;try{Z=await this.client.command("session.get",void 0,$)}catch(Q){if(h$(Q))return;throw Q}return dZ(Z.payload)}async readMessages($){let Z=$.trim();if(!Z)return[];await this.ensureMetadataApplied();let Q=await this.client.command("session.messages",{sessionId:Z},Z);if(!Q.ok)throw Error(Ez(Q,"session.messages"));let J=Q.payload?.messages;return Array.isArray(J)?J:[]}async restore($){let Z=$.sessionId.trim();if(!Z)throw Error("sessionId is required");let Q=$.restore?.messages!==!1;if(Q&&!$.config)throw Error("config is required when restore.messages is true");await this.ensureMetadataApplied();let J=$.config,X=await this.client.command("session.restore",{sessionId:Z,checkpointRunCount:$.checkpointRunCount,restore:$.restore,...J?{workspaceRoot:J.workspaceRoot,cwd:J.cwd,sessionConfig:{providerId:J.provider,modelId:J.model,apiKey:J.apiKey,cwd:J.cwd??J.workspaceRoot,workspaceRoot:J.workspaceRoot,systemPrompt:J.systemPrompt??"",mode:J.mode??"act",rules:J.rules,maxIterations:J.maxIterations,enableTools:J.enableTools,enableSpawnAgent:J.enableSpawn!==!1,enableAgentTeams:J.enableTeams!==!1,disableMcpSettingsTools:J.disableMcpSettingsTools,missionLogIntervalSteps:J.missionStepInterval,missionLogIntervalMs:J.missionTimeIntervalMs},metadata:{source:J.source??"cli",provider:J.provider,model:J.model,enableTools:J.enableTools,enableSpawn:J.enableSpawn,enableTeams:J.enableTeams,prompt:void 0,interactive:J.interactive!==!1},runtimeOptions:{mode:J.mode,systemPrompt:J.systemPrompt,maxIterations:J.maxIterations,enableTools:J.enableTools,enableSpawn:J.enableSpawn,enableTeams:J.enableTeams,autoApproveTools:J.autoApproveTools,configExtensions:J.configExtensions},modelSelection:{provider:J.provider,model:J.model,apiKey:J.apiKey},toolPolicies:J.toolPolicies}:{}},Z);if(!X.ok)throw Error(Ez(X,"session.restore"));let W=dZ(X.payload);if(Q&&!W?.sessionId)throw Error("hub checkpoint restore returned no session id");let j=Array.isArray(X.payload?.messages)?X.payload.messages:void 0,Y=Au(X.payload);return{sessionId:W?.sessionId,startResult:W?.sessionId?{sessionId:W.sessionId,manifestPath:"",messagesPath:W.messagesPath??""}:void 0,...j?{messages:j}:{},checkpoint:Y}}async listSessions($){await this.ensureMetadataApplied();let Z=await this.client.command("session.list",{limit:$?.limit??200});return(Array.isArray(Z.payload?.sessions)?Z.payload?.sessions:[]).map((J)=>dZ({session:J})).filter((J)=>Boolean(J?.sessionId))}async deleteSession($,Z=!0){return await this.ensureMetadataApplied(),(await this.client.command("session.delete",{sessionId:$,deleteCheckpointRefs:Z})).payload?.deleted===!0}async respondToolApproval($){await this.ensureMetadataApplied(),await this.client.command("approval.respond",{approvalId:$.approvalId,approved:$.approved,payload:$.reason?{reason:$.reason}:void 0,responderClientId:$.responderClientId})}streamEvents($,Z){let Q=new Set(($.sessionIds??[]).map((X)=>X.trim()).filter(Boolean)),J=this.client.subscribe((X)=>{let W=Tu(X);if(!W)return;if(Q.size>0&&!Q.has(W.sessionId))return;Z.onEvent?.(W)});return this.ensureMetadataApplied().catch((X)=>{Z.onError?.(X instanceof Error?X:Error(String(X)))}),J}streamTeamProgress($,Z){let Q=this.client.subscribe((J)=>{if(J.event!=="team.progress"||!J.payload)return;Z.onProjection?.(J.payload)});return this.ensureMetadataApplied().catch((J)=>{Z.onError?.(J instanceof Error?J:Error(String(J)))}),Q}async createSchedule($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.create",$)).payload?.schedule}async listSchedules($){await this.ensureMetadataApplied();let Z=await this.client.command("schedule.list");return Array.isArray(Z.payload?.schedules)?Z.payload?.schedules:[]}async getSchedule($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.get",{scheduleId:$})).payload?.schedule}async updateSchedule($,Z){return await this.ensureMetadataApplied(),(await this.client.command("schedule.update",{scheduleId:$,...Z})).payload?.schedule}async pauseSchedule($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.disable",{scheduleId:$})).payload?.schedule}async resumeSchedule($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.enable",{scheduleId:$})).payload?.schedule}async deleteSchedule($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.delete",{scheduleId:$})).payload?.deleted===!0}async triggerScheduleNow($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.trigger",{scheduleId:$})).payload?.execution}async listScheduleExecutions($,Z){await this.ensureMetadataApplied();let Q=await this.client.command("schedule.list_executions",{scheduleId:$,limit:Z});return Array.isArray(Q.payload?.executions)?Q.payload?.executions:[]}async getScheduleStats(){return await this.ensureMetadataApplied(),(await this.client.command("schedule.stats")).payload?.stats}async getActiveScheduledExecutions(){await this.ensureMetadataApplied();let $=await this.client.command("schedule.active");return Array.isArray($.payload?.executions)?$.payload?.executions:[]}async getUpcomingScheduledRuns($){await this.ensureMetadataApplied();let Z=await this.client.command("schedule.upcoming",{limit:$});return Array.isArray(Z.payload?.upcoming)?Z.payload?.upcoming:[]}async createTask($){return(await this.taskCommand("task.create",$)).task}async listTasks($={}){let Z=await this.taskCommand("task.list",$);return Array.isArray(Z.tasks)?Z.tasks:[]}async getTask($){return(await this.taskCommand("task.get",{taskId:$})).task}async updateTask($){return(await this.taskCommand("task.update",$)).task}async approveTask($,Z){return(await this.taskCommand("task.approve",{taskId:$,expectedRevision:Z})).task}async cancelTask($,Z,Q){return(await this.taskCommand("task.cancel",{taskId:$,reason:Q,expectedRevision:Z})).task}async runTask($,Z){return await this.taskCommand("task.run",{taskId:$,expectedRevision:Z})}async getTaskAutomation(){return(await this.taskCommand("task.automation.get",{})).policy}async setTaskAutomation($){return(await this.taskCommand("task.automation.set",{policy:$})).policy}}class Mu{client;constructor($){this.client=new Y$({url:$.address,authToken:$.authToken,clientId:$.clientId,clientType:$.clientType??"hub-ui-client",displayName:$.displayName??"hub ui client"})}async connect(){await this.client.connect()}close(){this.client.close()}async dispose(){await this.client.dispose()}getClientId(){return this.client.getClientId()}async sendNotify($){await this.client.command("ui.notify",$)}async sendShowWindow($){await this.client.command("ui.show_window",$??{})}async listClients(){let $=await this.client.command("client.list");return Array.isArray($.payload?.clients)?$.payload.clients:[]}async listSessions($=200){let Z=await this.client.command("session.list",{limit:$});return Array.isArray(Z.payload?.sessions)?Z.payload.sessions:[]}async toggleSetting($){let Z=await this.client.command("settings.toggle",$);if(!Z.ok)throw Error(Z.error?.message??"settings.toggle failed");return Z.payload}subscribeUI($){return this.client.subscribe((Z)=>{switch(Z.event){case"ui.notify":$.onNotify?.(Z.payload);break;case"ui.show_window":$.onShowWindow?.(Z.payload);break;case"hub.client.registered":$.onClientRegistered?.(Z.payload??{});break;case"hub.client.disconnected":$.onClientDisconnected?.(Z.payload??{});break;case"session.created":$.onSessionCreated?.(Z.payload??{});break;case"session.updated":$.onSessionUpdated?.(Z.payload??{});break;case"session.detached":$.onSessionDetached?.(Z.payload??{});break}})}}import{normalizeProviderId as Ru}from"@cline/llms";function Cu($){return{text:$.text,usage:$.usage,inputTokens:$.usage.inputTokens,outputTokens:$.usage.outputTokens,iterations:$.iterations,finishReason:$.finishReason,toolCalls:$.toolCalls.map((Z)=>({name:Z.name,input:Z.input,output:Z.output,error:Z.error,durationMs:Z.durationMs}))}}function Pu($){return $.mode==="plan"?"plan":$.mode==="yolo"?"yolo":"act"}function q30($={}){let Z=async(J)=>J,Q=new t$({sessionService:new a$(new i$),capabilities:{toolExecutors:{submit:Z}},fetch:$.fetch,telemetry:$.telemetry});return{async startSession(J){let X=(J.cwd?.trim()||J.workspaceRoot).trim(),W=await Q.startSession({source:Z0.CORE,mode:"automation",sessionMetadata:k0(void 0,{mode:"automation",trigger:J.source}),interactive:!1,config:{providerId:Ru(J.provider),modelId:J.model,apiKey:J.apiKey?.trim()||void 0,cwd:X,workspaceRoot:J.workspaceRoot,systemPrompt:J.systemPrompt??"",mode:Pu(J),maxIterations:J.maxIterations,enableTools:J.enableTools!==!1,enableSpawnAgent:J.enableSpawn!==!1,enableAgentTeams:J.enableTeams!==!1,disableMcpSettingsTools:J.disableMcpSettingsTools,missionLogIntervalSteps:J.missionStepInterval,missionLogIntervalMs:J.missionTimeIntervalMs},toolPolicies:J.toolPolicies??{"*":{autoApprove:J.autoApproveTools!==!1}},localRuntime:{configExtensions:J.configExtensions}});return{sessionId:W.sessionId,startResult:{sessionId:W.sessionId,manifestPath:W.manifestPath,messagesPath:W.messagesPath}}},async sendSession(J,X){let W=await Q.runTurn({sessionId:J,prompt:X.prompt,userImages:X.attachments?.userImages,userFiles:X.attachments?.userFiles?.map((j)=>j.content)});if(!W)throw Error("local hub schedule runtime returned no turn result");return{result:Cu(W)}},async abortSession(J){return await Q.abort(J,Error("hub schedule abort")),{applied:!0}},async stopSession(J){return await Q.stopSession(J),{applied:!0}}}}import{resolveClineBuildEnv as TN}from"@cline/shared";function fu($){if(typeof $==="string")return $.trim()||void 0;if(!Array.isArray($))return;return $.map((Q)=>{if(Q&&typeof Q==="object"&&"type"in Q&&Q.type==="text"&&"text"in Q&&typeof Q.text==="string")return Q.text.trim();return""}).filter(Boolean).join(`
|
|
797
797
|
`).trim()||void 0}var Rz=120,ij="...";function rj($){let Z=$.trim();if(!Z)return"";if(Buffer.byteLength(Z,"utf8")<=Rz)return Z;let Q=Rz-Buffer.byteLength(ij,"utf8");if(Q<=0)return ij;let J="";for(let X of Z){if(Buffer.byteLength(J+X,"utf8")>Q)break;J+=X}return`${J}${ij}`}async function Cz($){let Z=$?.sessionId?.trim()||"unknown",Q=typeof $?.metadata?.messagesPath==="string"?$.metadata.messagesPath:void 0,X=[...await u$(Q)].reverse().find((V)=>V.role==="assistant"),W=X?fu(X.content):void 0,j=$?.workspaceRoot?.trim()||"workspace",Y=typeof $?.metadata?.prompt==="string"?$.metadata.prompt.trim():j;return{title:`Task completed (${Z})`,body:rj(W&&W.length>0?W:Y.length>0?Y:j),severity:"info"}}import{resolve as rl}from"node:path";import{CLINE_DEFAULT_MODEL_ID as al,captureSdkError as ZQ,createSessionId as RY,HUB_CLIENT_TOOL_APPROVAL_CAPABILITY as nl}from"@cline/shared";import{isChatWorkspacePath as ol}from"@cline/shared/storage";import{existsSync as jY,realpathSync as Zd,statSync as Qd,watch as Jd}from"node:fs";import{relative as Xd}from"node:path";import{createSessionId as nz,noopBasicLogger as Wd}from"@cline/shared";import{existsSync as f1,linkSync as mu,lstatSync as tj,mkdirSync as cu,readdirSync as uu,readFileSync as du,realpathSync as hz,renameSync as lu,rmSync as vz,writeFileSync as pu}from"node:fs";import{basename as iu,dirname as ru,isAbsolute as $Y,join as ej,relative as mz,resolve as gz,sep as au}from"node:path";import{resolveTaskSpecsDir as nu}from"@cline/shared/storage";import{createHash as ku}from"node:crypto";import xz from"yaml";import{existsSync as aj,realpathSync as Pz}from"node:fs";import{dirname as wu,isAbsolute as nj,relative as oj,resolve as wz,sep as Su}from"node:path";function lZ($){return $?.trim()||void 0}function Sz($,Z){let Q=oj($,Z);return Q===""||!Q.startsWith(`..${Su}`)&&Q!==".."&&!nj(Q)}function bu($,Z,Q){if(!aj($))return;let J=Pz($),X=Z;while(!aj(X)){let j=wu(X);if(j===X)break;X=j}if(!aj(X))return;let W=Pz(X);if(!Sz(J,W))throw Error(`${Q} escapes the workspace through a symbolic link`)}function fz($,Z,Q,J){let X=wz($,nj(Z)?oj($,Z):Z);if(!Sz($,X)||!J&&X===$)throw Error(`${Q} must stay within the task workspace`);return bu($,X,Q),X}function e$($){let Z=$.resourcePaths??[];if($.scope==="global"){if(lZ($.workspaceRoot))throw Error("global tasks cannot set workspaceRoot");if(lZ($.cwd))throw Error("global tasks cannot set cwd");if(Z.some((V)=>V.trim()))throw Error("global tasks cannot reference workspace files");return{resourcePaths:[]}}let Q=lZ($.workspaceRoot);if(!Q)throw Error("workspaceRoot is required for workspace tasks");let J=wz(Q),X=lZ($.cwd),W=X?fz(J,X,"cwd",!0):void 0,j=[],Y=new Set;for(let V of Z){let K=V.trim();if(!K)throw Error("resourcePaths must contain only non-empty paths");if(nj(K)||K.split(/[\\/]+/u).includes(".."))throw Error("resourcePaths must be workspace-relative without '..'");let B=fz(J,K,"resourcePaths",!1),G=oj(J,B);if(!Y.has(G))Y.add(G),j.push(G)}return{workspaceRoot:J,cwd:W,resourcePaths:j}}var xu=new Set(["suggestion","follow-up","todo","handoff","idea","reminder"]),yu=new Set(["status","instructions","revision","approvedRevision","createdBy","updatedBy","currentRunId","lastRunId","lastSessionId","error","createdAt","updatedAt","completedAt","archivedAt"]),Iu=new Set(["taskId","type","priority","title","description","availableAt","expiresAt","cwd","resourcePaths","assignee","modelSelection","mode","systemPrompt","maxIterations","timeoutSeconds","automationEligible"]);function hu($){let Z=$.replace(/\r\n/g,`
|
|
798
798
|
`);if(!Z.startsWith(`---
|
|
@@ -934,7 +934,7 @@ ${$.instructions.trim()}
|
|
|
934
934
|
max_starts_per_hour = excluded.max_starts_per_hour,
|
|
935
935
|
enabled_by_json = excluded.enabled_by_json,
|
|
936
936
|
enabled_at = excluded.enabled_at,
|
|
937
|
-
updated_at = excluded.updated_at`).run(Z,$.mode,$.applyToAgentCreated?1:0,Q,J,X,$.enabledBy?JSON.stringify($.enabledBy):null,rz($.enabledAt,"enabledAt")??null,W),this.getAutomationPolicy(Z)}}var U8={kind:"system",id:"file_reconciler"},r2={kind:"system",id:"task_manager"},oz={kind:"automation_policy",id:"global"},O5=new Set(["completed","failed","cancelled","interrupted"]),jd=30000,Yd=250;function p1(){return new Date().toISOString()}function sz($){return typeof $==="string"&&$.trim()?$.trim():void 0}function tz($){let Z=Date.parse($);if(!Number.isFinite(Z))throw Error("expiresAt must be a valid ISO-8601 timestamp");if(Z<=Date.now())throw Error("expiresAt must be in the future")}function ez($,Z){let Q=Xd($,Z);return Q!==""&&!Q.startsWith("..")&&!Q.startsWith("/")}function N5($){if(!$||!jY($))return!1;try{return Qd($).isDirectory()}catch{return!1}}function XY($,Z){return JSON.stringify({type:$.type,title:$.title,description:$.description,instructions:$.instructions,scope:$.scope,workspaceRoot:$.workspaceRoot,cwd:$.cwd,resourcePaths:$.resourcePaths,priority:$.priority,assignee:$.assignee,modelSelection:$.modelSelection,mode:$.mode,systemPrompt:$.systemPrompt,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,availableAt:$.availableAt??Z.availableAt,expiresAt:$.expiresAt,automationEligible:$.automationEligible})}function WY($){return JSON.stringify({type:$.type,title:$.title,description:$.description,instructions:$.instructions,scope:$.scope,workspaceRoot:$.workspaceRoot,cwd:$.cwd,resourcePaths:$.resourcePaths,priority:$.priority,assignee:$.assignee,modelSelection:$.modelSelection,mode:$.mode,systemPrompt:$.systemPrompt,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,availableAt:$.availableAt,expiresAt:$.expiresAt,automationEligible:$.automationEligible})}function Vd($,Z){return{taskId:Z.taskId,expectedRevision:Z.revision,type:$.type,title:$.title,description:$.description??null,instructions:$.instructions,scope:$.scope,workspaceRoot:$.workspaceRoot??null,cwd:$.cwd??null,resourcePaths:$.resourcePaths,priority:$.priority,assignee:$.assignee??null,modelSelection:$.modelSelection??null,mode:$.mode??null,systemPrompt:$.systemPrompt??null,maxIterations:$.maxIterations??null,timeoutSeconds:$.timeoutSeconds??null,availableAt:$.availableAt??Z.availableAt,expiresAt:$.expiresAt,automationEligible:$.automationEligible,updatedBy:U8}}function Kd($,Z){return{...$,type:Z.type??$.type,title:Z.title??$.title,description:Z.description===null?void 0:Z.description??$.description,instructions:Z.instructions??$.instructions,scope:Z.scope??$.scope,workspaceRoot:Z.workspaceRoot===null?void 0:Z.workspaceRoot??$.workspaceRoot,cwd:Z.cwd===null?void 0:Z.cwd??$.cwd,resourcePaths:Z.resourcePaths??$.resourcePaths,priority:Z.priority??$.priority,assignee:Z.assignee===null?void 0:Z.assignee??$.assignee,modelSelection:Z.modelSelection===null?void 0:Z.modelSelection??$.modelSelection,mode:Z.mode===null?void 0:Z.mode??$.mode,systemPrompt:Z.systemPrompt===null?void 0:Z.systemPrompt??$.systemPrompt,maxIterations:Z.maxIterations===null?void 0:Z.maxIterations??$.maxIterations,timeoutSeconds:Z.timeoutSeconds===null?void 0:Z.timeoutSeconds??$.timeoutSeconds,availableAt:Z.availableAt??$.availableAt,expiresAt:Z.expiresAt??$.expiresAt,automationEligible:Z.automationEligible??$.automationEligible}}class YY{runtime;store;ownsStore;globalSpecsDir;watcherDebounceMs;watchFiles;logger;publishEvent;scopes=new Map;activeRuns=new Map;backgroundRuns=new Set;maintenanceTimer;queuedAutomationScopes=new Set;automationEnabled;automationPumping=!1;automationPolicyGeneration=0;started=!1;disposed=!1;constructor($){this.runtime=$.runtime,this.ownsStore=!$.store,this.store=$.store??new JY({dbPath:$.dbPath}),this.globalSpecsDir=$.globalSpecsDir,this.watcherDebounceMs=Math.max(0,$.watcherDebounceMs??Yd),this.watchFiles=$.watchFiles!==!1,this.automationEnabled=$.automationEnabled!==!1,this.logger=$.logger??Wd,this.publishEvent=$.publish??(()=>{})}async start(){if(this.disposed)throw Error("AgendaTaskManager disposed");if(this.started)return;this.started=!0,this.recoverInterruptedRuns(),await this.reconcileSourceForProjection("global",void 0,"startup");for(let $ of this.store.listWorkspaceRoots())if(N5($))await this.reconcileSourceForProjection("workspace",$,"startup");this.expireTasks(),this.maintenanceTimer=setInterval(()=>{this.expireTasks(),this.queueAutomation()},jd),this.maintenanceTimer.unref?.(),this.queueAutomation()}async dispose(){if(this.disposed)return;if(this.disposed=!0,this.maintenanceTimer)clearInterval(this.maintenanceTimer);for(let $ of this.scopes.values()){if($.timer)clearTimeout($.timer);$.watcher?.close()}this.scopes.clear();for(let $ of this.activeRuns.values())if($.sessionId)await this.runtime.abortSession($.sessionId,"Hub task manager stopped").catch(()=>{});await Promise.allSettled(this.backgroundRuns);for(let[$,Z]of this.activeRuns)this.store.updateRun(Z.runId,{status:"interrupted",completedAt:p1(),error:"Hub task manager stopped before the run completed."}),this.store.updateTaskState($,{status:"failed",currentRunId:null,error:"Hub task manager stopped before the run completed.",updatedBy:r2});if(this.activeRuns.clear(),this.ownsStore)this.store.close()}async createTask($){this.assertUsable(),tz($.expiresAt);let Z=e$($),Q={...$,...Z},J=sz(Q.taskId)??nz("task_");if(await this.reconcileScope(Q.scope,Q.workspaceRoot),this.store.getTask(J))throw Error(`task ${J} already exists`);let X=this.ensureScope(Q.scope,Q.workspaceRoot),W=X.resolveWritePath(J,Q.specPath);if(jY(W)||this.store.getTaskBySpecPath(W))throw Error(`task spec already exists: ${W}`);let j=this.store.createTask({...Q,taskId:J,specPath:W});try{X.writeSpec({...Q,taskId:J},{specPath:W,createOnly:!0})}catch(Y){throw this.store.deleteTask(J),Y}return this.publish("task.created",j),this.expireTask(j),this.queueAutomation(),this.requireTask(J)}async listTasks($={}){if(this.assertUsable(),!$.scope||$.scope==="global")await this.reconcileSourceForProjection("global",void 0,"list");if($.workspaceRoot){if(N5($.workspaceRoot))await this.reconcileSourceForProjection("workspace",$.workspaceRoot,"list")}else if($.scope!=="global"){for(let Z of this.store.listWorkspaceRoots())if(N5(Z))await this.reconcileSourceForProjection("workspace",Z,"list")}return this.expireTasks(),this.store.listTasks($)}async getTask($){this.assertUsable();let Z=this.store.getTask($.trim());if(Z?.scope==="workspace"&&N5(Z.workspaceRoot))await this.reconcileSourceForProjection("workspace",Z.workspaceRoot,"read");else if(Z?.scope==="global")await this.reconcileSourceForProjection("global",void 0,"read");let Q=this.store.getTask($.trim());if(Q)this.expireTask(Q);return this.store.getTask($.trim())}async updateTask($){this.assertUsable();let Z=this.requireTask($.taskId);if(Z.revision!==$.expectedRevision)this.store.updateTask($);if(Z.status==="in_progress")throw Error("an in-progress task cannot be edited");if(Z.status==="completed"||Z.status==="cancelled"||Z.status==="expired")throw Error(`task ${Z.taskId} cannot be edited from ${Z.status}; create a new task instead`);let Q=Kd(Z,$);tz(Q.expiresAt);let J=e$(Q),X={...Q,...J},W={...$,scope:X.scope,workspaceRoot:X.workspaceRoot??null,cwd:X.cwd??null,resourcePaths:X.resourcePaths},j=this.ensureScope(X.scope,X.workspaceRoot),Y=Z.specPath!==void 0&&ez(j.specsDir,Z.specPath);if(!Y)await this.reconcileFileStore(j);let V=j.resolveWritePath(Z.taskId,Y?Z.specPath:void 0);if(V!==Z.specPath&&(jY(V)||this.store.getTaskBySpecPath(V)))throw Error(`task spec already exists: ${V}`);let K;if(Y&&Z.specPath){let F=j.readSpec(Z.specPath);if(!F.ok)throw Error(`task spec is invalid: ${F.error}`);if($.updatedBy.id!==U8.id&&XY(F.spec,Z)!==WY(Z))throw Error(`task spec changed outside the manager; reconcile task ${Z.taskId} and retry`);K=F.contentHash}let B,G;try{B=j.writeSpec(X,{specPath:V,expectedContentHash:K,createOnly:!Y}),G=this.store.updateTask(W)}catch(F){try{if(B&&Y&&Z.specPath)j.writeSpec(Z,{specPath:Z.specPath,expectedContentHash:B.contentHash});else if(B)j.deleteSpec(V,{expectedContentHash:B.contentHash})}catch(D){this.logError("agenda task update rollback failed",D,{taskId:Z.taskId,specPath:V})}throw F}if(!G||!B)throw Error(`unknown task: ${$.taskId}`);let H=this.store.updateTaskState(G.taskId,{status:"pending_approval",approvedRevision:null,currentRunId:null,specPath:B.specPath,error:null,completedAt:null,archivedAt:null,updatedBy:$.updatedBy},G.revision);if(Z.specPath&&Z.specPath!==B.specPath)this.fileStoreForTask(Z).deleteSpec(Z.specPath);let U=H??this.requireTask($.taskId);return this.publish("task.updated",U),this.expireTask(U),this.queueAutomation(),this.requireTask($.taskId)}async approveTask($,Z,Q){this.assertUsable();let J=await this.refreshAndVerifyTaskIntent($);if(this.assertRevision(J,Q),this.isExpired(J))throw this.expireTask(J),Error(`task ${$} has expired`);if(J.status==="approved"&&J.approvedRevision===J.revision)return J;if(J.status!=="pending_approval"&&J.status!=="failed")throw Error(`task ${$} cannot be approved from ${J.status}`);let X=this.store.updateTaskState($,{status:"approved",approvedRevision:J.revision,error:null,updatedBy:Z},J.revision);if(!X)throw Error(`unknown task: ${$}`);return this.publish("task.updated",X),this.queueAutomation(),X}async cancelTask($,Z,Q,J){this.assertUsable();let X=this.requireTask($);if(this.assertRevision(X,Q),X.status==="cancelled")return X;if(X.status==="completed"||X.status==="expired")throw Error(`task ${$} cannot be cancelled from ${X.status}`);let W=X.currentRunId?this.store.getRun(X.currentRunId):void 0,j=J?.trim()||"Agenda task cancelled";if(W&&!O5.has(W.status))this.store.updateRun(W.runId,{status:"cancelled",completedAt:p1(),error:J?.trim()||void 0});this.activeRuns.delete($);let Y=this.store.updateTaskState($,{status:"cancelled",approvedRevision:null,currentRunId:null,error:J?.trim()||null,updatedBy:Z},X.revision);if(!Y)throw Error(`unknown task: ${$}`);if(this.publish("task.updated",Y,W),W?.sessionId)try{await this.runtime.abortSession(W.sessionId,j)}catch(V){this.logError("agenda task session abort failed",V,{taskId:$,runId:W.runId,sessionId:W.sessionId})}return Y}async runTask($,Z,Q,J){this.assertUsable();let X=await this.refreshAndVerifyTaskIntent($);if(this.assertRevision(X,Q),this.isExpired(X))throw this.expireTask(X),Error(`task ${$} has expired`);if(Date.parse(X.availableAt)>Date.now())throw Error(`task ${$} is not available yet`);if(X.status!=="approved"&&X.status!=="failed")throw Error(`task ${$} must be approved before it can run`);if(X.approvedRevision!==X.revision)throw Error(`task ${$} approval is stale`);if(this.activeRuns.has($)||X.currentRunId)throw Error(`task ${$} already has an active run`);let W=this.store.createRun({taskId:$,taskRevision:X.revision,requestedByClientId:J}),j=this.store.updateTaskState($,{currentRunId:W.runId,lastRunId:W.runId,error:null,completedAt:null,updatedBy:Z},X.revision);if(!j)throw Error(`unknown task: ${$}`);this.activeRuns.set($,{runId:W.runId}),this.publish("task.updated",j,W);try{let Y=await this.runtime.startSession(j,W,J,{unattended:Z.kind==="automation_policy"&&this.store.getAutomationPolicy(j.scope==="workspace"&&j.workspaceRoot?j.workspaceRoot:"global").mode==="unattended"}),V=this.store.getRun(W.runId),K=this.store.getTask($);if(!V||O5.has(V.status)||K?.status!==X.status||K.currentRunId!==W.runId){if(V&&!O5.has(V.status))this.store.updateRun(W.runId,{status:"cancelled",sessionId:Y.sessionId,completedAt:p1(),error:"Task changed or was cancelled while its session was starting."});else if(V)this.store.updateRun(W.runId,{sessionId:Y.sessionId});throw this.activeRuns.delete($),await this.runtime.abortSession(Y.sessionId,"Agenda task was cancelled while its session was starting").catch((G)=>this.logError("cancelled agenda task session abort failed",G,{taskId:$,runId:W.runId,sessionId:Y.sessionId})),Error(`task ${$} changed or was cancelled while starting`)}W=this.store.updateRun(W.runId,{status:"running",sessionId:Y.sessionId,startedAt:p1()})??W,j=this.store.updateTaskState($,{status:"in_progress",lastSessionId:Y.sessionId,updatedBy:Z})??j,this.activeRuns.set($,{runId:W.runId,sessionId:Y.sessionId}),this.publish("task.run.started",j,W);let B=this.finishRun(j,W,Y.sessionId);return this.backgroundRuns.add(B),B.finally(()=>this.backgroundRuns.delete(B)),{task:j,run:W}}catch(Y){throw await this.finishRunFailure(j,W,Y),Y}}async getAutomationPolicy($="global"){return this.assertUsable(),this.store.getAutomationPolicy($)}async setAutomationPolicy($,Z){this.assertUsable();let Q=p1(),J=this.store.setAutomationPolicy({...$,enabledBy:$.mode==="manual"?void 0:Z,enabledAt:$.mode==="manual"?void 0:Q});return this.automationPolicyGeneration+=1,this.publishEvent("task.automation.updated",{policy:J}),this.queueAutomation(J.scopeKey),J}notifyAutomationReadinessChanged(){if(!this.disposed)this.queueAutomation()}async finishRun($,Z,Q){try{let J=await this.runtime.runSession(Q,$,Z),X=this.store.getRun(Z.runId);if(!X||O5.has(X.status))return;if(J.status==="completed"){let W=p1(),j=this.store.updateRun(Z.runId,{status:"completed",completedAt:W,resultSummary:J.summary,error:null})??X,Y=this.store.updateTaskState($.taskId,{status:"completed",currentRunId:null,error:null,completedAt:W,updatedBy:r2})??this.requireTask($.taskId);this.publish("task.run.completed",Y,j)}else if(J.status==="cancelled")await this.cancelTask($.taskId,r2,$.revision,J.error||"Task session was cancelled");else await this.finishRunFailure($,Z,Error(J.error||J.summary||"Task session failed"))}catch(J){await this.finishRunFailure($,Z,J)}finally{this.activeRuns.delete($.taskId);let J=this.store.getTask($.taskId);(J?.scope==="workspace"&&J.workspaceRoot?this.reconcileScope("workspace",J.workspaceRoot):this.reconcileScope("global")).catch((W)=>this.logError("post-run agenda task reconciliation failed",W,{taskId:$.taskId})),this.queueAutomation()}}async finishRunFailure($,Z,Q){let J=this.store.getRun(Z.runId);if(!J||O5.has(J.status))return;let X=Q instanceof Error?Q.message:String(Q),W=this.store.updateRun(Z.runId,{status:"failed",completedAt:p1(),error:X})??J,j=this.store.getTask($.taskId);if(!j||j.status==="cancelled")return;if(j.currentRunId!==Z.runId){this.activeRuns.delete($.taskId),this.publish("task.run.failed",j,W);return}let Y=this.store.updateTaskState($.taskId,{status:"failed",currentRunId:null,error:X,updatedBy:r2})??j;this.activeRuns.delete($.taskId),this.publish("task.run.failed",Y,W)}ensureScope($,Z){let Q=sz(Z);if($==="workspace"&&!Q)throw Error("workspaceRoot is required for workspace task scope");if($==="workspace"&&!N5(Q))throw Error("workspaceRoot must be an existing directory");let J=$==="global"?"global":`workspace:${Q}`,X=this.scopes.get(J);if(X)return X.store;let W=new ZY({scope:$,workspaceRoot:Q,taskSpecsDir:$==="global"?this.globalSpecsDir:void 0}),j={store:W},Y=!0;try{W.ensureSpecsDir();let V=this.watchFiles?this.resolveWatchRoot(W.specsDir):void 0;if(V!==void 0)j.watcher=Jd(V,(K,B)=>{if(!B||!String(B).endsWith(".task.md"))return;if(j.timer)clearTimeout(j.timer);j.timer=setTimeout(()=>{j.timer=void 0,this.reconcileFileStore(W).catch((G)=>this.logError("agenda task watcher reconciliation failed",G,{specsDir:W.specsDir}))},this.watcherDebounceMs)}),j.watcher.on("error",(K)=>this.logError("agenda task watcher failed",K,{specsDir:W.specsDir}))}catch(V){Y=!1,this.logError("agenda task source could not be attached",V,{specsDir:W.specsDir})}if(Y)this.scopes.set(J,j);return W}async reconcileScope($,Z){let Q=this.ensureScope($,Z);await this.reconcileFileStore(Q)}async reconcileSourceForProjection($,Z,Q){try{await this.reconcileScope($,Z)}catch(J){this.logError(`agenda task source ${Q} reconciliation failed`,J,{scope:$,...Z?{workspaceRoot:Z}:{}})}}async reconcileFileStore($){if(this.disposed)return;let Z=new Set;for(let J of $.listSpecs()){if(Z.add(J.specPath),!J.ok){this.logger.log("agenda task spec is invalid",{severity:"warn",specPath:J.specPath,error:J.error});continue}try{let X=J.spec;if(!X.taskId)X=$.writeSpec({...X,taskId:nz("task_")},{specPath:X.specPath,expectedContentHash:X.contentHash});let W=this.store.getTaskBySpecPath(X.specPath);if(W&&X.taskId&&X.taskId!==W.taskId)this.logger.log("agenda task id is immutable for an existing spec",{severity:"warn",taskId:W.taskId,requestedTaskId:X.taskId,specPath:X.specPath}),X=$.writeSpec({...X,taskId:W.taskId},{specPath:X.specPath,expectedContentHash:X.contentHash});let j=X.taskId?this.store.getTask(X.taskId):void 0,Y=W??j;if(j?.specPath&&j.specPath!==X.specPath){this.logger.log("agenda task id is already owned by another spec",{severity:"warn",taskId:X.taskId,specPath:X.specPath});continue}if(!Y){let V=this.store.createTask(Iz(X,U8));this.publish("task.created",V),this.expireTask(V);continue}if(Y.archivedAt){let V=Y.status==="cancelled"&&Y.error==="Task spec was deleted.",K=this.store.updateTaskState(Y.taskId,{status:V?"pending_approval":Y.status,approvedRevision:V?null:Y.approvedRevision,archivedAt:null,error:V?null:Y.error,updatedBy:U8});if(K)Y=K,this.publish("task.updated",K)}if(XY(X,Y)===WY(Y))continue;if(Y.status==="in_progress"){this.logger.log("agenda task edit deferred until its run completes",{severity:"warn",taskId:Y.taskId});continue}if(Y.status==="completed"||Y.status==="cancelled"||Y.status==="expired"){this.logger.log("terminal agenda task edits are not applied",{severity:"warn",taskId:Y.taskId,status:Y.status}),$.writeSpec(Y,{specPath:X.specPath,expectedContentHash:X.contentHash});continue}await this.updateTask(Vd(X,Y))}catch(X){this.logError("agenda task spec reconciliation failed",X,{specPath:J.spec.specPath})}}let Q=this.store.listTasks({scope:$.scope,workspaceRoot:$.workspaceRoot,includeArchived:!0,limit:1000});for(let J of Q){if(!J.specPath||!ez($.specsDir,J.specPath)||Z.has(J.specPath)||J.archivedAt)continue;if(J.status==="in_progress")await this.cancelTask(J.taskId,U8,J.revision,"Task spec was deleted.");let X=this.store.updateTaskState(J.taskId,{status:J.status==="completed"||J.status==="expired"?J.status:"cancelled",approvedRevision:null,currentRunId:null,error:J.status==="cancelled"?J.error??null:"Task spec was deleted.",archivedAt:p1(),updatedBy:U8});if(X)this.publish("task.deleted",X)}this.queueAutomation()}expireTasks(){for(let $ of this.store.listTasks({limit:1000}))this.expireTask($)}expireTask($){if(!this.isExpired($))return;if($.currentRunId||$.status==="in_progress"||$.status==="completed"||$.status==="cancelled"||$.status==="expired")return;let Z=this.store.updateTaskState($.taskId,{status:"expired",approvedRevision:null,currentRunId:null,error:"Task expired before it was started.",updatedBy:r2});if(Z)this.publish("task.updated",Z)}isExpired($){return Date.parse($.expiresAt)<=Date.now()}recoverInterruptedRuns(){let $=p1();for(let Z of this.store.listRuns({status:["starting","running"],limit:1000})){this.store.updateRun(Z.runId,{status:"interrupted",completedAt:$,error:"Hub restarted while this task was running."});let Q=this.store.getTask(Z.taskId);if(!Q||Q.currentRunId!==Z.runId)continue;if(Q.status==="completed"||Q.status==="cancelled"||Q.status==="expired"){this.store.updateTaskState(Q.taskId,{currentRunId:null});continue}if(Z.status==="starting"&&Q.approvedRevision===Z.taskRevision&&Q.revision===Z.taskRevision&&!this.isExpired(Q)){this.store.updateTaskState(Q.taskId,{status:"approved",currentRunId:null,error:"Hub restarted before this task session was linked.",updatedBy:r2});continue}this.store.updateTaskState(Q.taskId,{status:Z.status==="starting"?"pending_approval":"failed",approvedRevision:Z.status==="starting"?null:Q.approvedRevision,currentRunId:null,error:"Hub restarted while this task was running.",updatedBy:r2})}}queueAutomation($){if(this.disposed||!this.automationEnabled)return;if($)this.queuedAutomationScopes.add($);else for(let Z of this.store.listAutomationPolicies())this.queuedAutomationScopes.add(Z.scopeKey);if(this.automationPumping)return;queueMicrotask(()=>{this.pumpAutomation().catch((Z)=>this.logError("agenda task automation pump failed",Z,{}))})}async pumpAutomation(){if(this.disposed||this.automationPumping)return;this.automationPumping=!0;let $=this.automationPolicyGeneration;try{while(this.queuedAutomationScopes.size>0){let Z=this.queuedAutomationScopes.values().next().value;if(!Z)break;this.queuedAutomationScopes.delete(Z);let Q=this.store.getAutomationPolicy(Z);if(Q.mode==="manual")continue;this.expireTasks();let J=this.store.listRuns({limit:1000}).filter((j)=>Date.parse(j.claimedAt)>=Date.now()-3600000).length,X=Math.min(Math.max(0,Q.maxConcurrentRuns-this.activeRuns.size),Math.max(0,Q.maxStartsPerHour-J));if(X<=0)continue;let W=this.store.listTasks({statuses:["pending_approval","approved"],...Z==="global"?{}:{scope:"workspace",workspaceRoot:Z},automationEligible:!0,availableBefore:p1(),limit:1000});for(let j of W){if(X<=0)break;if($!==this.automationPolicyGeneration)return;try{let Y=j;if(Y.status==="pending_approval"){if(!this.canAutomaticallyApprove(Y,Q))continue;Y=await this.approveTask(Y.taskId,oz,Y.revision)}if($!==this.automationPolicyGeneration)return;if(Q.mode==="auto_start"&&this.runtime.isInteractiveClientAvailable?.()!==!0)continue;await this.runTask(Y.taskId,oz,Y.revision),X-=1}catch(Y){this.logError("agenda task automation start failed",Y,{taskId:j.taskId})}}}}finally{if(this.automationPumping=!1,this.queuedAutomationScopes.size>0)this.queueAutomation()}}canAutomaticallyApprove($,Z){let Q=[$.createdBy,$.updatedBy];if(Q.some((J)=>J.kind==="system"&&J.id==="file_reconciler"))return!1;if(!Z.applyToAgentCreated&&Q.some((J)=>J.kind==="agent"))return!1;return this.taskChainDepth($)<=Z.maxChainDepth}taskChainDepth($){let Z=0,Q=$,J=new Set([$.taskId]);while(Q.originTaskId){if(J.has(Q.originTaskId))return Number.POSITIVE_INFINITY;J.add(Q.originTaskId);let X=this.store.getTask(Q.originTaskId);if(!X)break;Z+=1,Q=X}return Z}fileStoreForTask($){return this.ensureScope($.scope,$.workspaceRoot)}async refreshAndVerifyTaskIntent($){let Z=this.requireTask($);await this.reconcileScope(Z.scope,Z.workspaceRoot);let Q=this.requireTask($);if(Q.archivedAt)throw Error(`task ${$} no longer has an active task spec`);if(!Q.specPath)throw Error(`task ${$} has no canonical task spec`);let J;try{J=this.fileStoreForTask(Q).readSpec(Q.specPath)}catch(X){throw Error(`task ${$} task spec is unavailable: ${X instanceof Error?X.message:String(X)}`)}if(!J.ok)throw Error(`task ${$} task spec is invalid: ${J.error}`);if(J.spec.taskId!==Q.taskId||XY(J.spec,Q)!==WY(Q))throw Error(`task ${$} task spec does not match revision ${Q.revision}`);return Q}requireTask($){let Z=$.trim();if(!Z)throw Error("taskId is required");let Q=this.store.getTask(Z);if(!Q)throw Error(`unknown task: ${Z}`);return Q}assertRevision($,Z){if($.revision!==Z)throw Error(`task ${$.taskId} is at revision ${$.revision}; the requested revision is stale`)}publish($,Z,Q){this.publishEvent($,{task:Z,...Q?{run:Q}:{}},Q?.sessionId??Z.lastSessionId)}resolveWatchRoot($){try{return Zd.native($)}catch(Z){this.logError("agenda task watcher disabled: specs dir could not be resolved",Z,{specsDir:$});return}}logError($,Z,Q){if(this.logger.error)this.logger.error($,{...Q,error:Z});else this.logger.log($,{...Q,error:Z,severity:"error"})}assertUsable(){if(this.disposed)throw Error("AgendaTaskManager disposed")}}import{createSessionId as Ud}from"@cline/shared";import{createSessionId as Hd}from"@cline/shared";function Bd($){switch($){case"idle":return"idle";case"pending":return"pending";case"completed":return"completed";case"failed":return"failed";case"cancelled":return"aborted";default:return"running"}}function Gd($){let Z=$.metadata&&typeof $.metadata==="object"?JSON.parse(JSON.stringify($.metadata)):{};if($.parentSessionId?.trim())Z.parentSessionId=$.parentSessionId;if($.parentAgentId?.trim())Z.parentAgentId=$.parentAgentId;if($.agentId?.trim())Z.agentId=$.agentId;if($.conversationId?.trim())Z.conversationId=$.conversationId;if($.messagesPath?.trim())Z.messagesPath=$.messagesPath;if($.prompt?.trim())Z.prompt=$.prompt;if($.provider?.trim())Z.provider=$.provider;if($.model?.trim())Z.model=$.model;if($.source?.trim())Z.source=$.source;if(typeof $.pid==="number")Z.pid=$.pid;return Object.keys(Z).length>0?Z:void 0}function aZ($,Z,Q,J){return{sessionId:$.sessionId,workspaceRoot:$.workspaceRoot,cwd:$.cwd,createdAt:Date.parse($.startedAt),updatedAt:Date.parse($.updatedAt),createdByClientId:Z?.createdByClientId??"hub",status:Bd($.status),participants:Z?[...Z.participants.values()]:[],metadata:Gd($),runtimeOptions:{enableTools:$.enableTools,enableSpawn:$.enableSpawn,enableTeams:$.enableTeams,mode:typeof $.metadata?.mode==="string"?$.metadata.mode:void 0,systemPrompt:typeof $.metadata?.systemPrompt==="string"?$.metadata.systemPrompt:void 0},runtimeSession:$.agentId?{agentId:$.agentId,team:$.teamName?{teamId:$.teamName}:void 0}:void 0,...Q?{usage:{...Q}}:{},...J?{aggregateUsage:{...J}}:{}}}function x($,Z){return{version:$.version,requestId:$.requestId,ok:!0,...Z!==void 0?{payload:Z}:{}}}function h($,Z,Q){return{version:$.version,requestId:$.requestId,ok:!1,error:{code:Z,message:Q}}}function Z2($){return $&&typeof $==="object"&&!Array.isArray($)?$:void 0}function O0($){if(typeof $.payload?.sessionId==="string")return $.payload.sessionId.trim();return $.sessionId?.trim()??""}function S1($,Z,Q){return{version:"v1",event:$,eventId:Hd("hevt_"),sessionId:Q,timestamp:Date.now(),payload:Z}}async function i0($,Z){let Q=await $.sessionHost.getSession(Z);if(!Q)return;let J=await $.sessionHost.getAccumulatedUsage?.(Z);return aZ(Q,$.sessionState.get(Z),J?.usage,J?.aggregateUsage)}async function t0($,Z){let Q=await $.sessionHost.getSession(Z);if(!Q)return;let[J,X]=await Promise.all([typeof $.sessionHost.readSessionMessages==="function"?$.sessionHost.readSessionMessages(Z):[],$.sessionHost.getAccumulatedUsage?.(Z)]);return d$({session:Q,messages:J,usage:X?.usage,aggregateUsage:X?.aggregateUsage})}function VY($,Z,Q,J,X={}){let W=$.sessionState.get(Z);if(W){if(X.interactive!==void 0)W.interactive=X.interactive;if(J==="creator"&&!W.createdByClientId)W.createdByClientId=Q;if(!W.participants.has(Q))W.participants.set(Q,{clientId:Q,attachedAt:Date.now(),role:J});return W}let j={createdByClientId:Q,interactive:X.interactive??!0,participants:new Map([[Q,{clientId:Q,attachedAt:Date.now(),role:J}]])};return $.sessionState.set(Z,j),j}function $O($,Z,Q,J,X={}){let W=$.sessionState.get(Z);if(W){if(X.interactive!==void 0)W.interactive=X.interactive;if(!W.participants.has(Q))W.participants.set(Q,{clientId:Q,attachedAt:Date.now(),role:J});return W}let j={interactive:X.interactive??!0,participants:new Map([[Q,{clientId:Q,attachedAt:Date.now(),role:J}]])};return $.sessionState.set(Z,j),j}async function nZ($,Z){let Q=Ud("approval_"),J=Z.sessionId;if($.sessionState.get(J)?.interactive===!1)return{approved:!1,reason:"Tool approval requires an interactive session, but this session is non-interactive."};let W;try{W=await $.sessionHost.getSession(J)}catch{W=void 0}let j=typeof W?.metadata?.agendaTaskId==="string"?W.metadata.agendaTaskId:void 0;return await new Promise((Y)=>{let V=$.buildEvent("approval.requested",{approvalId:Q,sessionId:Z.sessionId,agentId:Z.agentId,conversationId:Z.conversationId,iteration:Z.iteration,toolCallId:Z.toolCallId,toolName:Z.toolName,inputJson:JSON.stringify(Z.input??null),policy:Z.policy,agendaTaskId:j},J);$.pendingApprovals.set(Q,{sessionId:J,resolve:Y,requestedEvent:V}),$.publish(V)})}function ZO($,Z){let Q=[];for(let J of $.pendingApprovals.values()){if(!J.requestedEvent)continue;if(Z&&J.sessionId!==Z)continue;Q.push(J.requestedEvent)}return Q}function KY($,Z,Q){let J=$.pendingApprovals.get(Z);if(!J)return;return $.pendingApprovals.delete(Z),J.resolve(Q),{sessionId:J.sessionId}}function BY($,Z,Q){let J=0;for(let[X,W]of[...$.pendingApprovals.entries()]){if(!Z({approvalId:X,sessionId:W.sessionId}))continue;$.pendingApprovals.delete(X),W.resolve({approved:!1,reason:Q}),$.publish($.buildEvent("approval.resolved",{approvalId:X,approved:!1,cancelled:!0,reason:Q},W.sessionId)),J+=1}return J}async function QO($,Z){let Q=typeof Z.payload?.approvalId==="string"?Z.payload.approvalId.trim():"";if(!$.pendingApprovals.get(Q))return h(Z,"approval_not_found",`Unknown approval: ${Q}`);let X=typeof Z.payload?.reason==="string"?Z.payload.reason:Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)&&typeof Z.payload.payload.reason==="string"?Z.payload.payload.reason:void 0,W=Z.payload?.approved===!0,j=KY($,Q,{approved:W,reason:X});if(!j)return h(Z,"approval_not_found",`Unknown approval: ${Q}`);return $.publish($.buildEvent("approval.resolved",{approvalId:Q,approved:W,reason:X},j.sessionId)),x(Z,{approvalId:Q,approved:W})}import{createSessionId as Ld}from"@cline/shared";function Fd($){if($ instanceof Error)return{name:$.name,message:$.message,stack:$.stack};if($===void 0)return;return $}var JO={debug:10,info:20,warn:30,error:40,silent:50};function Dd(){let $=process.env.CLINE_HUB_LOG_LEVEL?.trim().toLowerCase();if($==="debug"||$==="info"||$==="warn"||$==="error"||$==="silent")return $;return process.env.VITEST?"error":"info"}function p($,Z,Q={}){if(JO[$]<JO[Dd()])return;let J=JSON.stringify({ts:new Date().toISOString(),level:$,component:"hub",message:Z,...Object.fromEntries(Object.entries(Q).map(([X,W])=>[X,Fd(W)]).filter(([,X])=>X!==void 0))});if($==="error"||$==="warn"){console.error(`[hub] ${J}`);return}console.log(`[hub] ${J}`)}function q5($,Z){let Q=Z instanceof Error?Z.stack||Z.message:String(Z);p("error",$,{error:Q})}async function XO($,Z,Q,J,X,W){let j=Ld("capreq_"),Y=performance.now();return p("info","capability.request.start",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X}),await new Promise((V,K)=>{$.pendingCapabilityRequests.set(j,{sessionId:Z,targetClientId:X,capabilityName:Q,onProgress:W,resolve:(B)=>{if(p(B.ok?"info":"warn","capability.request.end",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X,ok:B.ok,error:B.error,durationMs:Math.round(performance.now()-Y)}),!B.ok){K(Error(B.error||`Capability ${Q} was rejected by ${X}.`));return}V(B.payload)}}),$.publish($.buildEvent("capability.requested",{requestId:j,targetClientId:X,capabilityName:Q,payload:J},Z)),p("info","capability.request.published",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X})})}function WO($,Z){let Q=typeof Z.payload?.requestId==="string"?Z.payload.requestId.trim():"",J=$.pendingCapabilityRequests.get(Q);if(!J)return x(Z,{requestId:Q,ignored:!0});if((Z.clientId?.trim()||"")!==J.targetClientId)return h(Z,"capability_wrong_client",`Capability request ${Q} is owned by ${J.targetClientId}`);if(Z.sessionId?.trim()&&Z.sessionId.trim()!==J.sessionId)return h(Z,"capability_wrong_session",`Capability request ${Q} belongs to session ${J.sessionId}`);let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:{};return J.onProgress?.(W),x(Z,{requestId:Q})}function Q2($,Z,Q){let J=0;for(let[X,W]of[...$.pendingCapabilityRequests.entries()]){if(!Z({requestId:X,...W}))continue;$.pendingCapabilityRequests.delete(X),p("warn","capability.request.cancelled",{requestId:X,sessionId:W.sessionId,capabilityName:W.capabilityName,targetClientId:W.targetClientId,reason:Q}),W.resolve({ok:!1,error:Q}),$.publish($.buildEvent("capability.resolved",{requestId:X,capabilityName:W.capabilityName,targetClientId:W.targetClientId,ok:!1,cancelled:!0,error:Q},W.sessionId)),J+=1}return J}async function jO($,Z){let Q=typeof Z.payload?.sessionId==="string"?Z.payload.sessionId.trim():Z.sessionId?.trim()||"",J=typeof Z.payload?.capabilityName==="string"?Z.payload.capabilityName.trim():"",X=typeof Z.payload?.targetClientId==="string"?Z.payload.targetClientId.trim():"";if(!Q||!J||!X)return h(Z,"invalid_capability_request","capability.request requires sessionId, capabilityName, and targetClientId");try{let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:{},j=await $.requestCapability(Q,J,W,X);return x(Z,j)}catch(W){return h(Z,"capability_request_failed",W instanceof Error?W.message:String(W))}}function YO($,Z){let Q=typeof Z.payload?.requestId==="string"?Z.payload.requestId.trim():"",J=$.pendingCapabilityRequests.get(Q);if(!J)return x(Z,{requestId:Q,ignored:!0});let X=Z.clientId?.trim()||"";if(X!==J.targetClientId)return h(Z,"capability_wrong_client",`Capability request ${Q} is owned by ${J.targetClientId}`);if(Z.sessionId?.trim()&&Z.sessionId.trim()!==J.sessionId)return h(Z,"capability_wrong_session",`Capability request ${Q} belongs to session ${J.sessionId}`);$.pendingCapabilityRequests.delete(Q);let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:void 0,j=typeof Z.payload?.error==="string"?Z.payload.error:void 0,Y=Z.payload?.ok===!0;return p(Y?"info":"warn","capability.respond",{requestId:Q,sessionId:J.sessionId,capabilityName:J.capabilityName,targetClientId:J.targetClientId,respondedByClientId:X,ok:Y,error:j}),J.resolve({ok:Y,payload:W,error:j}),$.publish($.buildEvent("capability.resolved",{requestId:Q,capabilityName:J.capabilityName,targetClientId:J.targetClientId,respondedByClientId:X,ok:Y,payload:W,error:j},J.sessionId)),x(Z,{requestId:Q,ok:Y})}import{createSessionId as _d}from"@cline/shared";function VO($,Z){let Q=Z.payload,J=Q?.clientId?.trim()||Z.clientId?.trim()||_d("client_");return $.clients.set(J,{clientId:J,clientType:Q?.clientType??"unknown",displayName:Q?.displayName,actorKind:Q?.actorKind??"client",connectedAt:Date.now(),lastSeenAt:Date.now(),transport:Q?.transport??"native",capabilities:Q?.capabilities??[],metadata:Q?.metadata,workspaceContext:Q?.workspaceContext}),$.publish($.buildEvent("hub.client.registered",{clientId:J,clientType:Q?.clientType??"unknown",displayName:Q?.displayName,connectedAt:Date.now()})),x(Z,{clientId:J})}function KO($,Z){let Q=Z.clientId?.trim(),J=Q?$.clients.get(Q):void 0;if(!Q||!J)return h(Z,"client_not_found","Client is not registered with this hub.");let X=Z2(Z.payload?.metadata);if(J.lastSeenAt=Date.now(),X)J.metadata=JSON.parse(JSON.stringify(X));if(Array.isArray(Z.payload?.capabilities))J.capabilities=Z.payload.capabilities.flatMap((W)=>{if(!W||typeof W!=="object"||Array.isArray(W))return[];let j=W;if(typeof j.name!=="string"||!j.name.trim())return[];return[{name:j.name.trim(),...typeof j.description==="string"?{description:j.description}:{},...Array.isArray(j.scopes)&&j.scopes.every((Y)=>typeof Y==="string")?{scopes:j.scopes}:{}}]});return x(Z)}function BO($,Z,Q){let J=Z.clientId?.trim();if(J)$.clients.delete(J),Q(J),$.publish($.buildEvent("hub.client.disconnected",{clientId:J}));return x(Z)}function GO($,Z){return x(Z,{clients:[...$.clients.values()]})}import{buildConnectorConnectArgs as dd,CONNECTOR_PLATFORMS as ld,connectorChannelsFromPlatforms as pd,listConnectorCatalog as id,mergeConnectorConnectArgs as rd,shouldIncludeConnectorField as ad}from"@cline/shared";import{withConnectorStore as FY}from"@cline/shared/db";import{existsSync as zd,readdirSync as Od,readFileSync as Nd}from"node:fs";import{join as HO}from"node:path";import{listConnectorCatalog as qd}from"@cline/shared";import{resolveConnectorDataDir as Ad}from"@cline/shared/storage";var UO={startedAt:($)=>typeof $.startedAt==="string"?$.startedAt:void 0,port:($)=>typeof $.port==="number"?$.port:void 0,baseUrl:($)=>typeof $.baseUrl==="string"?$.baseUrl:void 0,connectionMode:($)=>typeof $.connectionMode==="string"?$.connectionMode:void 0,userName:($)=>typeof $.userName==="string"?$.userName:void 0,botUsername:($)=>typeof $.botUsername==="string"?$.botUsername:void 0,applicationId:($)=>typeof $.applicationId==="string"?$.applicationId:void 0,phoneNumberId:($)=>typeof $.phoneNumberId==="string"?$.phoneNumberId:void 0},Td={discord:{required:["userName","applicationId"],optional:["startedAt","port","baseUrl"]},telegram:{required:["botUsername"],optional:["startedAt"]},gchat:{required:["userName"],optional:["startedAt","port","baseUrl"]},linear:{required:["userName"],optional:["startedAt","port","baseUrl"]},slack:{required:["userName"],optional:["startedAt","connectionMode","port","baseUrl"]},whatsapp:{required:["userName"],optional:["startedAt","phoneNumberId","port","baseUrl"]}};function Ed($){if(!Number.isInteger($)||$<=0)return!1;try{return process.kill($,0),!0}catch{return!1}}function Md($,Z){let Q;try{let V=JSON.parse(Nd(Z,"utf8"));if(!V||typeof V!=="object"||Array.isArray(V))return;Q=V}catch{return}let J=typeof Q.pid==="number"?Q.pid:void 0,X=typeof Q.hubUrl==="string"?Q.hubUrl:typeof Q.rpcAddress==="string"?Q.rpcAddress:void 0;if(!J||!X||!Ed(J))return;let W=Td[$];if(!W)return;let j={};for(let V of W.required){let K=UO[V](Q);if(!K||typeof K==="string"&&!K.trim())return;j[V]=K}for(let V of W.optional){let K=UO[V](Q);if(K!==void 0)j[V]=K}let Y=$==="telegram"?j.botUsername:$==="discord"?j.applicationId:$==="whatsapp"&&typeof Q.instanceKey==="string"?Q.instanceKey:j.userName;if(!Y)return;return{id:`${$}:${Y}`,type:$,instanceId:Y,pid:J,hubUrl:X,...j}}function A5(){let $=[];for(let{name:Z}of qd()){let Q=HO(Ad(),Z);if(!zd(Q))continue;for(let J of Od(Q)){if(!J.endsWith(".json")||J.endsWith(".threads.json"))continue;let X=Md(Z,HO(Q,J));if(X)$.push(X)}}return $.sort((Z,Q)=>{if(Z.type!==Q.type)return Z.type.localeCompare(Q.type);let J=Z.botUsername??Z.userName??"",X=Q.botUsername??Q.userName??"";return J.localeCompare(X)})}import{spawn as xd}from"node:child_process";import{openSync as yd}from"node:fs";import{CLINE_CONNECTOR_SUPERVISED_ENV as Id,readConnectorCliLaunchSpec as hd}from"@cline/shared";import{ensureParentDir as vd,resolveConnectorLogPath as gd}from"@cline/shared/storage";import{withConnectorStore as T5}from"@cline/shared/db";var Rd=new Set(["-i","--interactive"]);function Cd($,Z){let Q=$.filter((X)=>!Rd.has(X));return Q.some((X)=>X==="--cwd"||X.startsWith("--cwd="))?Q:[...Q,"--cwd",Z]}function Pd($,Z,Q,J=process.cwd()){try{let X=Cd(Q,J);T5((W)=>W.recordConnected($,Z,X))}catch{}}function GY($,Z){try{T5((Q)=>{if($)Q.setEnabled($,!1,Z);else Q.disableAll()})}catch{}}function oZ($,Z){try{return T5((Q)=>Q.getConnection($,Z))}catch{return}}function fd($,Z){try{T5((Q)=>Q.deleteConnection($,Z))}catch{}}async function wd($){let Z=$.log??(()=>{}),Q;try{Q=T5((X)=>X.listConnections()).filter((X)=>X.enabled).map((X)=>({channel:X.channel,instanceId:X.instanceId,args:X.connectArgs}))}catch(X){return Z(`[connect] failed to read persisted connectors: ${X instanceof Error?X.message:String(X)}`),[]}let J=[];for(let X of Q){let{channel:W,instanceId:j}=X;if($.isHealthy?.(X)){Z(`[connect] skipping ${W} connector ${j}: already live in this host`);continue}Z(`[connect] reconnecting ${W} connector ${j}`);try{let Y=await $.start(X);if(J.push({channel:W,instanceId:j,ok:Y}),!Y)Z(`[connect] failed to reconnect ${W} connector ${j}`)}catch(Y){let V=Y instanceof Error?Y.message:String(Y);J.push({channel:W,instanceId:j,ok:!1,error:V}),Z(`[connect] failed to reconnect ${W} connector ${j}: ${V}`)}}return J}import{CLINE_CONNECTOR_STARTING_INSTANCE_ENV as Sd,CLINE_RUN_AS_HUB_DAEMON_ENV as bd}from"@cline/shared";var kd=/^CLINE_(?:CONNECTOR_DETACHED_CHILD|[A-Z0-9]+_CONNECT_CHILD)$/;function E5($=process.env){let Z={...$};delete Z[bd],delete Z[Sd];for(let Q of Object.keys(Z))if(kd.test(Q))delete Z[Q];return Z}var DO=1000,LO=60000,_O=5,zO=60000,HY=5000,OO=5000,NO=2000,md=100;function a2($,Z){return`${$}\x00${Z}`}function cd($){if(!Number.isInteger($)||$<=0)return!1;try{return process.kill($,0),!0}catch{return!1}}function FO($){return $===void 0?void 0:new Date($).toISOString()}class qO{entries=new Map;instanceLocks=new Map;pollTimer;disposed=!1;launchSpec;spawnProcess;isProcessRunning;killProcess;listActive;cleanupInstance;isAutostartEnabled;log;now;setTimer;clearTimer;constructor($={}){this.launchSpec=$.launchSpec??hd,this.spawnProcess=$.spawnProcess??xd,this.isProcessRunning=$.isProcessRunning??cd,this.killProcess=$.killProcess??((Z,Q)=>process.kill(Z,Q)),this.listActive=$.listActive??A5,this.cleanupInstance=$.cleanupInstance,this.isAutostartEnabled=$.isAutostartEnabled??((Z,Q)=>oZ(Z,Q)?.enabled===!0),this.log=$.log??((Z)=>process.stderr.write(`[hub-daemon] ${Z}
|
|
937
|
+
updated_at = excluded.updated_at`).run(Z,$.mode,$.applyToAgentCreated?1:0,Q,J,X,$.enabledBy?JSON.stringify($.enabledBy):null,rz($.enabledAt,"enabledAt")??null,W),this.getAutomationPolicy(Z)}}var U8={kind:"system",id:"file_reconciler"},r2={kind:"system",id:"task_manager"},oz={kind:"automation_policy",id:"global"},O5=new Set(["completed","failed","cancelled","interrupted"]),jd=30000,Yd=250;function p1(){return new Date().toISOString()}function sz($){return typeof $==="string"&&$.trim()?$.trim():void 0}function tz($){let Z=Date.parse($);if(!Number.isFinite(Z))throw Error("expiresAt must be a valid ISO-8601 timestamp");if(Z<=Date.now())throw Error("expiresAt must be in the future")}function ez($,Z){let Q=Xd($,Z);return Q!==""&&!Q.startsWith("..")&&!Q.startsWith("/")}function N5($){if(!$||!jY($))return!1;try{return Qd($).isDirectory()}catch{return!1}}function XY($,Z){return JSON.stringify({type:$.type,title:$.title,description:$.description,instructions:$.instructions,scope:$.scope,workspaceRoot:$.workspaceRoot,cwd:$.cwd,resourcePaths:$.resourcePaths,priority:$.priority,assignee:$.assignee,modelSelection:$.modelSelection,mode:$.mode,systemPrompt:$.systemPrompt,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,availableAt:$.availableAt??Z.availableAt,expiresAt:$.expiresAt,automationEligible:$.automationEligible})}function WY($){return JSON.stringify({type:$.type,title:$.title,description:$.description,instructions:$.instructions,scope:$.scope,workspaceRoot:$.workspaceRoot,cwd:$.cwd,resourcePaths:$.resourcePaths,priority:$.priority,assignee:$.assignee,modelSelection:$.modelSelection,mode:$.mode,systemPrompt:$.systemPrompt,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,availableAt:$.availableAt,expiresAt:$.expiresAt,automationEligible:$.automationEligible})}function Vd($,Z){return{taskId:Z.taskId,expectedRevision:Z.revision,type:$.type,title:$.title,description:$.description??null,instructions:$.instructions,scope:$.scope,workspaceRoot:$.workspaceRoot??null,cwd:$.cwd??null,resourcePaths:$.resourcePaths,priority:$.priority,assignee:$.assignee??null,modelSelection:$.modelSelection??null,mode:$.mode??null,systemPrompt:$.systemPrompt??null,maxIterations:$.maxIterations??null,timeoutSeconds:$.timeoutSeconds??null,availableAt:$.availableAt??Z.availableAt,expiresAt:$.expiresAt,automationEligible:$.automationEligible,updatedBy:U8}}function Kd($,Z){return{...$,type:Z.type??$.type,title:Z.title??$.title,description:Z.description===null?void 0:Z.description??$.description,instructions:Z.instructions??$.instructions,scope:Z.scope??$.scope,workspaceRoot:Z.workspaceRoot===null?void 0:Z.workspaceRoot??$.workspaceRoot,cwd:Z.cwd===null?void 0:Z.cwd??$.cwd,resourcePaths:Z.resourcePaths??$.resourcePaths,priority:Z.priority??$.priority,assignee:Z.assignee===null?void 0:Z.assignee??$.assignee,modelSelection:Z.modelSelection===null?void 0:Z.modelSelection??$.modelSelection,mode:Z.mode===null?void 0:Z.mode??$.mode,systemPrompt:Z.systemPrompt===null?void 0:Z.systemPrompt??$.systemPrompt,maxIterations:Z.maxIterations===null?void 0:Z.maxIterations??$.maxIterations,timeoutSeconds:Z.timeoutSeconds===null?void 0:Z.timeoutSeconds??$.timeoutSeconds,availableAt:Z.availableAt??$.availableAt,expiresAt:Z.expiresAt??$.expiresAt,automationEligible:Z.automationEligible??$.automationEligible}}class YY{runtime;store;ownsStore;globalSpecsDir;watcherDebounceMs;watchFiles;logger;publishEvent;scopes=new Map;activeRuns=new Map;backgroundRuns=new Set;maintenanceTimer;queuedAutomationScopes=new Set;automationEnabled;automationPumping=!1;automationPolicyGeneration=0;started=!1;disposed=!1;constructor($){this.runtime=$.runtime,this.ownsStore=!$.store,this.store=$.store??new JY({dbPath:$.dbPath}),this.globalSpecsDir=$.globalSpecsDir,this.watcherDebounceMs=Math.max(0,$.watcherDebounceMs??Yd),this.watchFiles=$.watchFiles!==!1,this.automationEnabled=$.automationEnabled!==!1,this.logger=$.logger??Wd,this.publishEvent=$.publish??(()=>{})}async start(){if(this.disposed)throw Error("AgendaTaskManager disposed");if(this.started)return;this.started=!0,this.recoverInterruptedRuns(),await this.reconcileSourceForProjection("global",void 0,"startup");for(let $ of this.store.listWorkspaceRoots())if(N5($))await this.reconcileSourceForProjection("workspace",$,"startup");this.expireTasks(),this.maintenanceTimer=setInterval(()=>{this.expireTasks(),this.queueAutomation()},jd),this.maintenanceTimer.unref?.(),this.queueAutomation()}async dispose(){if(this.disposed)return;if(this.disposed=!0,this.maintenanceTimer)clearInterval(this.maintenanceTimer);for(let $ of this.scopes.values()){if($.timer)clearTimeout($.timer);$.watcher?.close()}this.scopes.clear();for(let $ of this.activeRuns.values())if($.sessionId)await this.runtime.abortSession($.sessionId,"Hub task manager stopped").catch(()=>{});await Promise.allSettled(this.backgroundRuns);for(let[$,Z]of this.activeRuns)this.store.updateRun(Z.runId,{status:"interrupted",completedAt:p1(),error:"Hub task manager stopped before the run completed."}),this.store.updateTaskState($,{status:"failed",currentRunId:null,error:"Hub task manager stopped before the run completed.",updatedBy:r2});if(this.activeRuns.clear(),this.ownsStore)this.store.close()}async createTask($){this.assertUsable(),tz($.expiresAt);let Z=e$($),Q={...$,...Z},J=sz(Q.taskId)??nz("task_");if(await this.reconcileScope(Q.scope,Q.workspaceRoot),this.store.getTask(J))throw Error(`task ${J} already exists`);let X=this.ensureScope(Q.scope,Q.workspaceRoot),W=X.resolveWritePath(J,Q.specPath);if(jY(W)||this.store.getTaskBySpecPath(W))throw Error(`task spec already exists: ${W}`);let j=this.store.createTask({...Q,taskId:J,specPath:W});try{X.writeSpec({...Q,taskId:J},{specPath:W,createOnly:!0})}catch(Y){throw this.store.deleteTask(J),Y}return this.publish("task.created",j),this.expireTask(j),this.queueAutomation(),this.requireTask(J)}async listTasks($={}){if(this.assertUsable(),!$.scope||$.scope==="global")await this.reconcileSourceForProjection("global",void 0,"list");if($.workspaceRoot){if(N5($.workspaceRoot))await this.reconcileSourceForProjection("workspace",$.workspaceRoot,"list")}else if($.scope!=="global"){for(let Z of this.store.listWorkspaceRoots())if(N5(Z))await this.reconcileSourceForProjection("workspace",Z,"list")}return this.expireTasks(),this.store.listTasks($)}async getTask($){this.assertUsable();let Z=this.store.getTask($.trim());if(Z?.scope==="workspace"&&N5(Z.workspaceRoot))await this.reconcileSourceForProjection("workspace",Z.workspaceRoot,"read");else if(Z?.scope==="global")await this.reconcileSourceForProjection("global",void 0,"read");let Q=this.store.getTask($.trim());if(Q)this.expireTask(Q);return this.store.getTask($.trim())}async updateTask($){this.assertUsable();let Z=this.requireTask($.taskId);if(Z.revision!==$.expectedRevision)this.store.updateTask($);if(Z.status==="in_progress")throw Error("an in-progress task cannot be edited");if(Z.status==="completed"||Z.status==="cancelled"||Z.status==="expired")throw Error(`task ${Z.taskId} cannot be edited from ${Z.status}; create a new task instead`);let Q=Kd(Z,$);tz(Q.expiresAt);let J=e$(Q),X={...Q,...J},W={...$,scope:X.scope,workspaceRoot:X.workspaceRoot??null,cwd:X.cwd??null,resourcePaths:X.resourcePaths},j=this.ensureScope(X.scope,X.workspaceRoot),Y=Z.specPath!==void 0&&ez(j.specsDir,Z.specPath);if(!Y)await this.reconcileFileStore(j);let V=j.resolveWritePath(Z.taskId,Y?Z.specPath:void 0);if(V!==Z.specPath&&(jY(V)||this.store.getTaskBySpecPath(V)))throw Error(`task spec already exists: ${V}`);let K;if(Y&&Z.specPath){let F=j.readSpec(Z.specPath);if(!F.ok)throw Error(`task spec is invalid: ${F.error}`);if($.updatedBy.id!==U8.id&&XY(F.spec,Z)!==WY(Z))throw Error(`task spec changed outside the manager; reconcile task ${Z.taskId} and retry`);K=F.contentHash}let B,G;try{B=j.writeSpec(X,{specPath:V,expectedContentHash:K,createOnly:!Y}),G=this.store.updateTask(W)}catch(F){try{if(B&&Y&&Z.specPath)j.writeSpec(Z,{specPath:Z.specPath,expectedContentHash:B.contentHash});else if(B)j.deleteSpec(V,{expectedContentHash:B.contentHash})}catch(D){this.logError("agenda task update rollback failed",D,{taskId:Z.taskId,specPath:V})}throw F}if(!G||!B)throw Error(`unknown task: ${$.taskId}`);let H=this.store.updateTaskState(G.taskId,{status:"pending_approval",approvedRevision:null,currentRunId:null,specPath:B.specPath,error:null,completedAt:null,archivedAt:null,updatedBy:$.updatedBy},G.revision);if(Z.specPath&&Z.specPath!==B.specPath)this.fileStoreForTask(Z).deleteSpec(Z.specPath);let U=H??this.requireTask($.taskId);return this.publish("task.updated",U),this.expireTask(U),this.queueAutomation(),this.requireTask($.taskId)}async approveTask($,Z,Q){this.assertUsable();let J=await this.refreshAndVerifyTaskIntent($);if(this.assertRevision(J,Q),this.isExpired(J))throw this.expireTask(J),Error(`task ${$} has expired`);if(J.status==="approved"&&J.approvedRevision===J.revision)return J;if(J.status!=="pending_approval"&&J.status!=="failed")throw Error(`task ${$} cannot be approved from ${J.status}`);let X=this.store.updateTaskState($,{status:"approved",approvedRevision:J.revision,error:null,updatedBy:Z},J.revision);if(!X)throw Error(`unknown task: ${$}`);return this.publish("task.updated",X),this.queueAutomation(),X}async cancelTask($,Z,Q,J){this.assertUsable();let X=this.requireTask($);if(this.assertRevision(X,Q),X.status==="cancelled")return X;if(X.status==="completed"||X.status==="expired")throw Error(`task ${$} cannot be cancelled from ${X.status}`);let W=X.currentRunId?this.store.getRun(X.currentRunId):void 0,j=J?.trim()||"Agenda task cancelled";if(W&&!O5.has(W.status))this.store.updateRun(W.runId,{status:"cancelled",completedAt:p1(),error:J?.trim()||void 0});this.activeRuns.delete($);let Y=this.store.updateTaskState($,{status:"cancelled",approvedRevision:null,currentRunId:null,error:J?.trim()||null,updatedBy:Z},X.revision);if(!Y)throw Error(`unknown task: ${$}`);if(this.publish("task.updated",Y,W),W?.sessionId)try{await this.runtime.abortSession(W.sessionId,j)}catch(V){this.logError("agenda task session abort failed",V,{taskId:$,runId:W.runId,sessionId:W.sessionId})}return Y}async runTask($,Z,Q,J){this.assertUsable();let X=await this.refreshAndVerifyTaskIntent($);if(this.assertRevision(X,Q),this.isExpired(X))throw this.expireTask(X),Error(`task ${$} has expired`);if(Date.parse(X.availableAt)>Date.now())throw Error(`task ${$} is not available yet`);if(X.status!=="approved"&&X.status!=="failed")throw Error(`task ${$} must be approved before it can run`);if(X.approvedRevision!==X.revision)throw Error(`task ${$} approval is stale`);if(this.activeRuns.has($)||X.currentRunId)throw Error(`task ${$} already has an active run`);let W=this.store.createRun({taskId:$,taskRevision:X.revision,requestedByClientId:J}),j=this.store.updateTaskState($,{currentRunId:W.runId,lastRunId:W.runId,error:null,completedAt:null,updatedBy:Z},X.revision);if(!j)throw Error(`unknown task: ${$}`);this.activeRuns.set($,{runId:W.runId}),this.publish("task.updated",j,W);try{let Y=await this.runtime.startSession(j,W,J,{unattended:Z.kind==="automation_policy"&&this.store.getAutomationPolicy(j.scope==="workspace"&&j.workspaceRoot?j.workspaceRoot:"global").mode==="unattended"}),V=this.store.getRun(W.runId),K=this.store.getTask($);if(!V||O5.has(V.status)||K?.status!==X.status||K.currentRunId!==W.runId){if(V&&!O5.has(V.status))this.store.updateRun(W.runId,{status:"cancelled",sessionId:Y.sessionId,completedAt:p1(),error:"Task changed or was cancelled while its session was starting."});else if(V)this.store.updateRun(W.runId,{sessionId:Y.sessionId});throw this.activeRuns.delete($),await this.runtime.abortSession(Y.sessionId,"Agenda task was cancelled while its session was starting").catch((G)=>this.logError("cancelled agenda task session abort failed",G,{taskId:$,runId:W.runId,sessionId:Y.sessionId})),Error(`task ${$} changed or was cancelled while starting`)}W=this.store.updateRun(W.runId,{status:"running",sessionId:Y.sessionId,startedAt:p1()})??W,j=this.store.updateTaskState($,{status:"in_progress",lastSessionId:Y.sessionId,updatedBy:Z})??j,this.activeRuns.set($,{runId:W.runId,sessionId:Y.sessionId}),this.publish("task.run.started",j,W);let B=this.finishRun(j,W,Y.sessionId);return this.backgroundRuns.add(B),B.finally(()=>this.backgroundRuns.delete(B)),{task:j,run:W}}catch(Y){throw await this.finishRunFailure(j,W,Y),Y}}async getAutomationPolicy($="global"){return this.assertUsable(),this.store.getAutomationPolicy($)}async setAutomationPolicy($,Z){this.assertUsable();let Q=p1(),J=this.store.setAutomationPolicy({...$,enabledBy:$.mode==="manual"?void 0:Z,enabledAt:$.mode==="manual"?void 0:Q});return this.automationPolicyGeneration+=1,this.publishEvent("task.automation.updated",{policy:J}),this.queueAutomation(J.scopeKey),J}notifyAutomationReadinessChanged(){if(!this.disposed)this.queueAutomation()}async finishRun($,Z,Q){try{let J=await this.runtime.runSession(Q,$,Z),X=this.store.getRun(Z.runId);if(!X||O5.has(X.status))return;if(J.status==="completed"){let W=p1(),j=this.store.updateRun(Z.runId,{status:"completed",completedAt:W,resultSummary:J.summary,error:null})??X,Y=this.store.updateTaskState($.taskId,{status:"completed",currentRunId:null,error:null,completedAt:W,updatedBy:r2})??this.requireTask($.taskId);this.publish("task.run.completed",Y,j)}else if(J.status==="cancelled")await this.cancelTask($.taskId,r2,$.revision,J.error||"Task session was cancelled");else await this.finishRunFailure($,Z,Error(J.error||J.summary||"Task session failed"))}catch(J){await this.finishRunFailure($,Z,J)}finally{this.activeRuns.delete($.taskId);let J=this.store.getTask($.taskId);(J?.scope==="workspace"&&J.workspaceRoot?this.reconcileScope("workspace",J.workspaceRoot):this.reconcileScope("global")).catch((W)=>this.logError("post-run agenda task reconciliation failed",W,{taskId:$.taskId})),this.queueAutomation()}}async finishRunFailure($,Z,Q){let J=this.store.getRun(Z.runId);if(!J||O5.has(J.status))return;let X=Q instanceof Error?Q.message:String(Q),W=this.store.updateRun(Z.runId,{status:"failed",completedAt:p1(),error:X})??J,j=this.store.getTask($.taskId);if(!j||j.status==="cancelled")return;if(j.currentRunId!==Z.runId){this.activeRuns.delete($.taskId),this.publish("task.run.failed",j,W);return}let Y=this.store.updateTaskState($.taskId,{status:"failed",currentRunId:null,error:X,updatedBy:r2})??j;this.activeRuns.delete($.taskId),this.publish("task.run.failed",Y,W)}ensureScope($,Z){let Q=sz(Z);if($==="workspace"&&!Q)throw Error("workspaceRoot is required for workspace task scope");if($==="workspace"&&!N5(Q))throw Error("workspaceRoot must be an existing directory");let J=$==="global"?"global":`workspace:${Q}`,X=this.scopes.get(J);if(X)return X.store;let W=new ZY({scope:$,workspaceRoot:Q,taskSpecsDir:$==="global"?this.globalSpecsDir:void 0}),j={store:W},Y=!0;try{W.ensureSpecsDir();let V=this.watchFiles?this.resolveWatchRoot(W.specsDir):void 0;if(V!==void 0)j.watcher=Jd(V,(K,B)=>{if(!B||!String(B).endsWith(".task.md"))return;if(j.timer)clearTimeout(j.timer);j.timer=setTimeout(()=>{j.timer=void 0,this.reconcileFileStore(W).catch((G)=>this.logError("agenda task watcher reconciliation failed",G,{specsDir:W.specsDir}))},this.watcherDebounceMs)}),j.watcher.on("error",(K)=>this.logError("agenda task watcher failed",K,{specsDir:W.specsDir}))}catch(V){Y=!1,this.logError("agenda task source could not be attached",V,{specsDir:W.specsDir})}if(Y)this.scopes.set(J,j);return W}async reconcileScope($,Z){let Q=this.ensureScope($,Z);await this.reconcileFileStore(Q)}async reconcileSourceForProjection($,Z,Q){try{await this.reconcileScope($,Z)}catch(J){this.logError(`agenda task source ${Q} reconciliation failed`,J,{scope:$,...Z?{workspaceRoot:Z}:{}})}}async reconcileFileStore($){if(this.disposed)return;let Z=new Set;for(let J of $.listSpecs()){if(Z.add(J.specPath),!J.ok){this.logger.log("agenda task spec is invalid",{severity:"warn",specPath:J.specPath,error:J.error});continue}try{let X=J.spec;if(!X.taskId)X=$.writeSpec({...X,taskId:nz("task_")},{specPath:X.specPath,expectedContentHash:X.contentHash});let W=this.store.getTaskBySpecPath(X.specPath);if(W&&X.taskId&&X.taskId!==W.taskId)this.logger.log("agenda task id is immutable for an existing spec",{severity:"warn",taskId:W.taskId,requestedTaskId:X.taskId,specPath:X.specPath}),X=$.writeSpec({...X,taskId:W.taskId},{specPath:X.specPath,expectedContentHash:X.contentHash});let j=X.taskId?this.store.getTask(X.taskId):void 0,Y=W??j;if(j?.specPath&&j.specPath!==X.specPath){this.logger.log("agenda task id is already owned by another spec",{severity:"warn",taskId:X.taskId,specPath:X.specPath});continue}if(!Y){let V=this.store.createTask(Iz(X,U8));this.publish("task.created",V),this.expireTask(V);continue}if(Y.archivedAt){let V=Y.status==="cancelled"&&Y.error==="Task spec was deleted.",K=this.store.updateTaskState(Y.taskId,{status:V?"pending_approval":Y.status,approvedRevision:V?null:Y.approvedRevision,archivedAt:null,error:V?null:Y.error,updatedBy:U8});if(K)Y=K,this.publish("task.updated",K)}if(XY(X,Y)===WY(Y))continue;if(Y.status==="in_progress"){this.logger.log("agenda task edit deferred until its run completes",{severity:"warn",taskId:Y.taskId});continue}if(Y.status==="completed"||Y.status==="cancelled"||Y.status==="expired"){this.logger.log("terminal agenda task edits are not applied",{severity:"warn",taskId:Y.taskId,status:Y.status}),$.writeSpec(Y,{specPath:X.specPath,expectedContentHash:X.contentHash});continue}await this.updateTask(Vd(X,Y))}catch(X){this.logError("agenda task spec reconciliation failed",X,{specPath:J.spec.specPath})}}let Q=this.store.listTasks({scope:$.scope,workspaceRoot:$.workspaceRoot,includeArchived:!0,limit:1000});for(let J of Q){if(!J.specPath||!ez($.specsDir,J.specPath)||Z.has(J.specPath)||J.archivedAt)continue;if(J.status==="in_progress")await this.cancelTask(J.taskId,U8,J.revision,"Task spec was deleted.");let X=this.store.updateTaskState(J.taskId,{status:J.status==="completed"||J.status==="expired"?J.status:"cancelled",approvedRevision:null,currentRunId:null,error:J.status==="cancelled"?J.error??null:"Task spec was deleted.",archivedAt:p1(),updatedBy:U8});if(X)this.publish("task.deleted",X)}this.queueAutomation()}expireTasks(){for(let $ of this.store.listTasks({limit:1000}))this.expireTask($)}expireTask($){if(!this.isExpired($))return;if($.currentRunId||$.status==="in_progress"||$.status==="completed"||$.status==="cancelled"||$.status==="expired")return;let Z=this.store.updateTaskState($.taskId,{status:"expired",approvedRevision:null,currentRunId:null,error:"Task expired before it was started.",updatedBy:r2});if(Z)this.publish("task.updated",Z)}isExpired($){return Date.parse($.expiresAt)<=Date.now()}recoverInterruptedRuns(){let $=p1();for(let Z of this.store.listRuns({status:["starting","running"],limit:1000})){this.store.updateRun(Z.runId,{status:"interrupted",completedAt:$,error:"Hub restarted while this task was running."});let Q=this.store.getTask(Z.taskId);if(!Q||Q.currentRunId!==Z.runId)continue;if(Q.status==="completed"||Q.status==="cancelled"||Q.status==="expired"){this.store.updateTaskState(Q.taskId,{currentRunId:null});continue}if(Z.status==="starting"&&Q.approvedRevision===Z.taskRevision&&Q.revision===Z.taskRevision&&!this.isExpired(Q)){this.store.updateTaskState(Q.taskId,{status:"approved",currentRunId:null,error:"Hub restarted before this task session was linked.",updatedBy:r2});continue}this.store.updateTaskState(Q.taskId,{status:Z.status==="starting"?"pending_approval":"failed",approvedRevision:Z.status==="starting"?null:Q.approvedRevision,currentRunId:null,error:"Hub restarted while this task was running.",updatedBy:r2})}}queueAutomation($){if(this.disposed||!this.automationEnabled)return;if($)this.queuedAutomationScopes.add($);else for(let Z of this.store.listAutomationPolicies())this.queuedAutomationScopes.add(Z.scopeKey);if(this.automationPumping)return;queueMicrotask(()=>{this.pumpAutomation().catch((Z)=>this.logError("agenda task automation pump failed",Z,{}))})}async pumpAutomation(){if(this.disposed||this.automationPumping)return;this.automationPumping=!0;let $=this.automationPolicyGeneration;try{while(this.queuedAutomationScopes.size>0){let Z=this.queuedAutomationScopes.values().next().value;if(!Z)break;this.queuedAutomationScopes.delete(Z);let Q=this.store.getAutomationPolicy(Z);if(Q.mode==="manual")continue;this.expireTasks();let J=this.store.listRuns({limit:1000}).filter((j)=>Date.parse(j.claimedAt)>=Date.now()-3600000).length,X=Math.min(Math.max(0,Q.maxConcurrentRuns-this.activeRuns.size),Math.max(0,Q.maxStartsPerHour-J));if(X<=0)continue;let W=this.store.listTasks({statuses:["pending_approval","approved"],...Z==="global"?{}:{scope:"workspace",workspaceRoot:Z},automationEligible:!0,availableBefore:p1(),limit:1000});for(let j of W){if(X<=0)break;if($!==this.automationPolicyGeneration)return;try{let Y=j;if(Y.status==="pending_approval"){if(!this.canAutomaticallyApprove(Y,Q))continue;Y=await this.approveTask(Y.taskId,oz,Y.revision)}if($!==this.automationPolicyGeneration)return;if(Q.mode==="auto_start"&&this.runtime.isInteractiveClientAvailable?.()!==!0)continue;await this.runTask(Y.taskId,oz,Y.revision),X-=1}catch(Y){this.logError("agenda task automation start failed",Y,{taskId:j.taskId})}}}}finally{if(this.automationPumping=!1,this.queuedAutomationScopes.size>0)this.queueAutomation()}}canAutomaticallyApprove($,Z){let Q=[$.createdBy,$.updatedBy];if(Q.some((J)=>J.kind==="system"&&J.id==="file_reconciler"))return!1;if(!Z.applyToAgentCreated&&Q.some((J)=>J.kind==="agent"))return!1;return this.taskChainDepth($)<=Z.maxChainDepth}taskChainDepth($){let Z=0,Q=$,J=new Set([$.taskId]);while(Q.originTaskId){if(J.has(Q.originTaskId))return Number.POSITIVE_INFINITY;J.add(Q.originTaskId);let X=this.store.getTask(Q.originTaskId);if(!X)break;Z+=1,Q=X}return Z}fileStoreForTask($){return this.ensureScope($.scope,$.workspaceRoot)}async refreshAndVerifyTaskIntent($){let Z=this.requireTask($);await this.reconcileScope(Z.scope,Z.workspaceRoot);let Q=this.requireTask($);if(Q.archivedAt)throw Error(`task ${$} no longer has an active task spec`);if(!Q.specPath)throw Error(`task ${$} has no canonical task spec`);let J;try{J=this.fileStoreForTask(Q).readSpec(Q.specPath)}catch(X){throw Error(`task ${$} task spec is unavailable: ${X instanceof Error?X.message:String(X)}`)}if(!J.ok)throw Error(`task ${$} task spec is invalid: ${J.error}`);if(J.spec.taskId!==Q.taskId||XY(J.spec,Q)!==WY(Q))throw Error(`task ${$} task spec does not match revision ${Q.revision}`);return Q}requireTask($){let Z=$.trim();if(!Z)throw Error("taskId is required");let Q=this.store.getTask(Z);if(!Q)throw Error(`unknown task: ${Z}`);return Q}assertRevision($,Z){if($.revision!==Z)throw Error(`task ${$.taskId} is at revision ${$.revision}; the requested revision is stale`)}publish($,Z,Q){this.publishEvent($,{task:Z,...Q?{run:Q}:{}},Q?.sessionId??Z.lastSessionId)}resolveWatchRoot($){try{return Zd.native($)}catch(Z){this.logError("agenda task watcher disabled: specs dir could not be resolved",Z,{specsDir:$});return}}logError($,Z,Q){if(this.logger.error)this.logger.error($,{...Q,error:Z});else this.logger.log($,{...Q,error:Z,severity:"error"})}assertUsable(){if(this.disposed)throw Error("AgendaTaskManager disposed")}}import{createSessionId as Ud}from"@cline/shared";import{createSessionId as Hd}from"@cline/shared";function Bd($){switch($){case"idle":return"idle";case"pending":return"pending";case"completed":return"completed";case"failed":return"failed";case"cancelled":return"aborted";default:return"running"}}function Gd($){let Z=$.metadata&&typeof $.metadata==="object"?JSON.parse(JSON.stringify($.metadata)):{};if($.parentSessionId?.trim())Z.parentSessionId=$.parentSessionId;if($.parentAgentId?.trim())Z.parentAgentId=$.parentAgentId;if($.agentId?.trim())Z.agentId=$.agentId;if($.conversationId?.trim())Z.conversationId=$.conversationId;if($.messagesPath?.trim())Z.messagesPath=$.messagesPath;if($.prompt?.trim())Z.prompt=$.prompt;if($.provider?.trim())Z.provider=$.provider;if($.model?.trim())Z.model=$.model;if($.source?.trim())Z.source=$.source;if(typeof $.pid==="number")Z.pid=$.pid;return Object.keys(Z).length>0?Z:void 0}function aZ($,Z,Q,J){return{sessionId:$.sessionId,workspaceRoot:$.workspaceRoot,cwd:$.cwd,createdAt:Date.parse($.startedAt),updatedAt:Date.parse($.updatedAt),createdByClientId:Z?.createdByClientId??"hub",status:Bd($.status),participants:Z?[...Z.participants.values()]:[],metadata:Gd($),runtimeOptions:{enableTools:$.enableTools,enableSpawn:$.enableSpawn,enableTeams:$.enableTeams,mode:typeof $.metadata?.mode==="string"?$.metadata.mode:void 0,systemPrompt:typeof $.metadata?.systemPrompt==="string"?$.metadata.systemPrompt:void 0},runtimeSession:$.agentId?{agentId:$.agentId,team:$.teamName?{teamId:$.teamName}:void 0}:void 0,...Q?{usage:{...Q}}:{},...J?{aggregateUsage:{...J}}:{}}}function x($,Z){return{version:$.version,requestId:$.requestId,ok:!0,...Z!==void 0?{payload:Z}:{}}}function h($,Z,Q){return{version:$.version,requestId:$.requestId,ok:!1,error:{code:Z,message:Q}}}function Z2($){return $&&typeof $==="object"&&!Array.isArray($)?$:void 0}function O0($){if(typeof $.payload?.sessionId==="string")return $.payload.sessionId.trim();return $.sessionId?.trim()??""}function S1($,Z,Q){return{version:"v1",event:$,eventId:Hd("hevt_"),sessionId:Q,timestamp:Date.now(),payload:Z}}async function i0($,Z){let Q=await $.sessionHost.getSession(Z);if(!Q)return;let J=await $.sessionHost.getAccumulatedUsage?.(Z);return aZ(Q,$.sessionState.get(Z),J?.usage,J?.aggregateUsage)}async function t0($,Z){let Q=await $.sessionHost.getSession(Z);if(!Q)return;let J=await $.sessionHost.getAccumulatedUsage?.(Z);return d$({session:Q,usage:J?.usage,aggregateUsage:J?.aggregateUsage})}function VY($,Z,Q,J,X={}){let W=$.sessionState.get(Z);if(W){if(X.interactive!==void 0)W.interactive=X.interactive;if(J==="creator"&&!W.createdByClientId)W.createdByClientId=Q;if(!W.participants.has(Q))W.participants.set(Q,{clientId:Q,attachedAt:Date.now(),role:J});return W}let j={createdByClientId:Q,interactive:X.interactive??!0,participants:new Map([[Q,{clientId:Q,attachedAt:Date.now(),role:J}]])};return $.sessionState.set(Z,j),j}function $O($,Z,Q,J,X={}){let W=$.sessionState.get(Z);if(W){if(X.interactive!==void 0)W.interactive=X.interactive;if(!W.participants.has(Q))W.participants.set(Q,{clientId:Q,attachedAt:Date.now(),role:J});return W}let j={interactive:X.interactive??!0,participants:new Map([[Q,{clientId:Q,attachedAt:Date.now(),role:J}]])};return $.sessionState.set(Z,j),j}async function nZ($,Z){let Q=Ud("approval_"),J=Z.sessionId;if($.sessionState.get(J)?.interactive===!1)return{approved:!1,reason:"Tool approval requires an interactive session, but this session is non-interactive."};let W;try{W=await $.sessionHost.getSession(J)}catch{W=void 0}let j=typeof W?.metadata?.agendaTaskId==="string"?W.metadata.agendaTaskId:void 0;return await new Promise((Y)=>{let V=$.buildEvent("approval.requested",{approvalId:Q,sessionId:Z.sessionId,agentId:Z.agentId,conversationId:Z.conversationId,iteration:Z.iteration,toolCallId:Z.toolCallId,toolName:Z.toolName,inputJson:JSON.stringify(Z.input??null),policy:Z.policy,agendaTaskId:j},J);$.pendingApprovals.set(Q,{sessionId:J,resolve:Y,requestedEvent:V}),$.publish(V)})}function ZO($,Z){let Q=[];for(let J of $.pendingApprovals.values()){if(!J.requestedEvent)continue;if(Z&&J.sessionId!==Z)continue;Q.push(J.requestedEvent)}return Q}function KY($,Z,Q){let J=$.pendingApprovals.get(Z);if(!J)return;return $.pendingApprovals.delete(Z),J.resolve(Q),{sessionId:J.sessionId}}function BY($,Z,Q){let J=0;for(let[X,W]of[...$.pendingApprovals.entries()]){if(!Z({approvalId:X,sessionId:W.sessionId}))continue;$.pendingApprovals.delete(X),W.resolve({approved:!1,reason:Q}),$.publish($.buildEvent("approval.resolved",{approvalId:X,approved:!1,cancelled:!0,reason:Q},W.sessionId)),J+=1}return J}async function QO($,Z){let Q=typeof Z.payload?.approvalId==="string"?Z.payload.approvalId.trim():"";if(!$.pendingApprovals.get(Q))return h(Z,"approval_not_found",`Unknown approval: ${Q}`);let X=typeof Z.payload?.reason==="string"?Z.payload.reason:Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)&&typeof Z.payload.payload.reason==="string"?Z.payload.payload.reason:void 0,W=Z.payload?.approved===!0,j=KY($,Q,{approved:W,reason:X});if(!j)return h(Z,"approval_not_found",`Unknown approval: ${Q}`);return $.publish($.buildEvent("approval.resolved",{approvalId:Q,approved:W,reason:X},j.sessionId)),x(Z,{approvalId:Q,approved:W})}import{createSessionId as Ld}from"@cline/shared";function Fd($){if($ instanceof Error)return{name:$.name,message:$.message,stack:$.stack};if($===void 0)return;return $}var JO={debug:10,info:20,warn:30,error:40,silent:50};function Dd(){let $=process.env.CLINE_HUB_LOG_LEVEL?.trim().toLowerCase();if($==="debug"||$==="info"||$==="warn"||$==="error"||$==="silent")return $;return process.env.VITEST?"error":"info"}function p($,Z,Q={}){if(JO[$]<JO[Dd()])return;let J=JSON.stringify({ts:new Date().toISOString(),level:$,component:"hub",message:Z,...Object.fromEntries(Object.entries(Q).map(([X,W])=>[X,Fd(W)]).filter(([,X])=>X!==void 0))});if($==="error"||$==="warn"){console.error(`[hub] ${J}`);return}console.log(`[hub] ${J}`)}function q5($,Z){let Q=Z instanceof Error?Z.stack||Z.message:String(Z);p("error",$,{error:Q})}async function XO($,Z,Q,J,X,W){let j=Ld("capreq_"),Y=performance.now();return p("info","capability.request.start",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X}),await new Promise((V,K)=>{$.pendingCapabilityRequests.set(j,{sessionId:Z,targetClientId:X,capabilityName:Q,onProgress:W,resolve:(B)=>{if(p(B.ok?"info":"warn","capability.request.end",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X,ok:B.ok,error:B.error,durationMs:Math.round(performance.now()-Y)}),!B.ok){K(Error(B.error||`Capability ${Q} was rejected by ${X}.`));return}V(B.payload)}}),$.publish($.buildEvent("capability.requested",{requestId:j,targetClientId:X,capabilityName:Q,payload:J},Z)),p("info","capability.request.published",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X})})}function WO($,Z){let Q=typeof Z.payload?.requestId==="string"?Z.payload.requestId.trim():"",J=$.pendingCapabilityRequests.get(Q);if(!J)return x(Z,{requestId:Q,ignored:!0});if((Z.clientId?.trim()||"")!==J.targetClientId)return h(Z,"capability_wrong_client",`Capability request ${Q} is owned by ${J.targetClientId}`);if(Z.sessionId?.trim()&&Z.sessionId.trim()!==J.sessionId)return h(Z,"capability_wrong_session",`Capability request ${Q} belongs to session ${J.sessionId}`);let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:{};return J.onProgress?.(W),x(Z,{requestId:Q})}function Q2($,Z,Q){let J=0;for(let[X,W]of[...$.pendingCapabilityRequests.entries()]){if(!Z({requestId:X,...W}))continue;$.pendingCapabilityRequests.delete(X),p("warn","capability.request.cancelled",{requestId:X,sessionId:W.sessionId,capabilityName:W.capabilityName,targetClientId:W.targetClientId,reason:Q}),W.resolve({ok:!1,error:Q}),$.publish($.buildEvent("capability.resolved",{requestId:X,capabilityName:W.capabilityName,targetClientId:W.targetClientId,ok:!1,cancelled:!0,error:Q},W.sessionId)),J+=1}return J}async function jO($,Z){let Q=typeof Z.payload?.sessionId==="string"?Z.payload.sessionId.trim():Z.sessionId?.trim()||"",J=typeof Z.payload?.capabilityName==="string"?Z.payload.capabilityName.trim():"",X=typeof Z.payload?.targetClientId==="string"?Z.payload.targetClientId.trim():"";if(!Q||!J||!X)return h(Z,"invalid_capability_request","capability.request requires sessionId, capabilityName, and targetClientId");try{let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:{},j=await $.requestCapability(Q,J,W,X);return x(Z,j)}catch(W){return h(Z,"capability_request_failed",W instanceof Error?W.message:String(W))}}function YO($,Z){let Q=typeof Z.payload?.requestId==="string"?Z.payload.requestId.trim():"",J=$.pendingCapabilityRequests.get(Q);if(!J)return x(Z,{requestId:Q,ignored:!0});let X=Z.clientId?.trim()||"";if(X!==J.targetClientId)return h(Z,"capability_wrong_client",`Capability request ${Q} is owned by ${J.targetClientId}`);if(Z.sessionId?.trim()&&Z.sessionId.trim()!==J.sessionId)return h(Z,"capability_wrong_session",`Capability request ${Q} belongs to session ${J.sessionId}`);$.pendingCapabilityRequests.delete(Q);let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:void 0,j=typeof Z.payload?.error==="string"?Z.payload.error:void 0,Y=Z.payload?.ok===!0;return p(Y?"info":"warn","capability.respond",{requestId:Q,sessionId:J.sessionId,capabilityName:J.capabilityName,targetClientId:J.targetClientId,respondedByClientId:X,ok:Y,error:j}),J.resolve({ok:Y,payload:W,error:j}),$.publish($.buildEvent("capability.resolved",{requestId:Q,capabilityName:J.capabilityName,targetClientId:J.targetClientId,respondedByClientId:X,ok:Y,payload:W,error:j},J.sessionId)),x(Z,{requestId:Q,ok:Y})}import{createSessionId as _d}from"@cline/shared";function VO($,Z){let Q=Z.payload,J=Q?.clientId?.trim()||Z.clientId?.trim()||_d("client_");return $.clients.set(J,{clientId:J,clientType:Q?.clientType??"unknown",displayName:Q?.displayName,actorKind:Q?.actorKind??"client",connectedAt:Date.now(),lastSeenAt:Date.now(),transport:Q?.transport??"native",capabilities:Q?.capabilities??[],metadata:Q?.metadata,workspaceContext:Q?.workspaceContext}),$.publish($.buildEvent("hub.client.registered",{clientId:J,clientType:Q?.clientType??"unknown",displayName:Q?.displayName,connectedAt:Date.now()})),x(Z,{clientId:J})}function KO($,Z){let Q=Z.clientId?.trim(),J=Q?$.clients.get(Q):void 0;if(!Q||!J)return h(Z,"client_not_found","Client is not registered with this hub.");let X=Z2(Z.payload?.metadata);if(J.lastSeenAt=Date.now(),X)J.metadata=JSON.parse(JSON.stringify(X));if(Array.isArray(Z.payload?.capabilities))J.capabilities=Z.payload.capabilities.flatMap((W)=>{if(!W||typeof W!=="object"||Array.isArray(W))return[];let j=W;if(typeof j.name!=="string"||!j.name.trim())return[];return[{name:j.name.trim(),...typeof j.description==="string"?{description:j.description}:{},...Array.isArray(j.scopes)&&j.scopes.every((Y)=>typeof Y==="string")?{scopes:j.scopes}:{}}]});return x(Z)}function BO($,Z,Q){let J=Z.clientId?.trim();if(J)$.clients.delete(J),Q(J),$.publish($.buildEvent("hub.client.disconnected",{clientId:J}));return x(Z)}function GO($,Z){return x(Z,{clients:[...$.clients.values()]})}import{buildConnectorConnectArgs as dd,CONNECTOR_PLATFORMS as ld,connectorChannelsFromPlatforms as pd,listConnectorCatalog as id,mergeConnectorConnectArgs as rd,shouldIncludeConnectorField as ad}from"@cline/shared";import{withConnectorStore as FY}from"@cline/shared/db";import{existsSync as zd,readdirSync as Od,readFileSync as Nd}from"node:fs";import{join as HO}from"node:path";import{listConnectorCatalog as qd}from"@cline/shared";import{resolveConnectorDataDir as Ad}from"@cline/shared/storage";var UO={startedAt:($)=>typeof $.startedAt==="string"?$.startedAt:void 0,port:($)=>typeof $.port==="number"?$.port:void 0,baseUrl:($)=>typeof $.baseUrl==="string"?$.baseUrl:void 0,connectionMode:($)=>typeof $.connectionMode==="string"?$.connectionMode:void 0,userName:($)=>typeof $.userName==="string"?$.userName:void 0,botUsername:($)=>typeof $.botUsername==="string"?$.botUsername:void 0,applicationId:($)=>typeof $.applicationId==="string"?$.applicationId:void 0,phoneNumberId:($)=>typeof $.phoneNumberId==="string"?$.phoneNumberId:void 0},Td={discord:{required:["userName","applicationId"],optional:["startedAt","port","baseUrl"]},telegram:{required:["botUsername"],optional:["startedAt"]},gchat:{required:["userName"],optional:["startedAt","port","baseUrl"]},linear:{required:["userName"],optional:["startedAt","port","baseUrl"]},slack:{required:["userName"],optional:["startedAt","connectionMode","port","baseUrl"]},whatsapp:{required:["userName"],optional:["startedAt","phoneNumberId","port","baseUrl"]}};function Ed($){if(!Number.isInteger($)||$<=0)return!1;try{return process.kill($,0),!0}catch{return!1}}function Md($,Z){let Q;try{let V=JSON.parse(Nd(Z,"utf8"));if(!V||typeof V!=="object"||Array.isArray(V))return;Q=V}catch{return}let J=typeof Q.pid==="number"?Q.pid:void 0,X=typeof Q.hubUrl==="string"?Q.hubUrl:typeof Q.rpcAddress==="string"?Q.rpcAddress:void 0;if(!J||!X||!Ed(J))return;let W=Td[$];if(!W)return;let j={};for(let V of W.required){let K=UO[V](Q);if(!K||typeof K==="string"&&!K.trim())return;j[V]=K}for(let V of W.optional){let K=UO[V](Q);if(K!==void 0)j[V]=K}let Y=$==="telegram"?j.botUsername:$==="discord"?j.applicationId:$==="whatsapp"&&typeof Q.instanceKey==="string"?Q.instanceKey:j.userName;if(!Y)return;return{id:`${$}:${Y}`,type:$,instanceId:Y,pid:J,hubUrl:X,...j}}function A5(){let $=[];for(let{name:Z}of qd()){let Q=HO(Ad(),Z);if(!zd(Q))continue;for(let J of Od(Q)){if(!J.endsWith(".json")||J.endsWith(".threads.json"))continue;let X=Md(Z,HO(Q,J));if(X)$.push(X)}}return $.sort((Z,Q)=>{if(Z.type!==Q.type)return Z.type.localeCompare(Q.type);let J=Z.botUsername??Z.userName??"",X=Q.botUsername??Q.userName??"";return J.localeCompare(X)})}import{spawn as xd}from"node:child_process";import{openSync as yd}from"node:fs";import{CLINE_CONNECTOR_SUPERVISED_ENV as Id,readConnectorCliLaunchSpec as hd}from"@cline/shared";import{ensureParentDir as vd,resolveConnectorLogPath as gd}from"@cline/shared/storage";import{withConnectorStore as T5}from"@cline/shared/db";var Rd=new Set(["-i","--interactive"]);function Cd($,Z){let Q=$.filter((X)=>!Rd.has(X));return Q.some((X)=>X==="--cwd"||X.startsWith("--cwd="))?Q:[...Q,"--cwd",Z]}function Pd($,Z,Q,J=process.cwd()){try{let X=Cd(Q,J);T5((W)=>W.recordConnected($,Z,X))}catch{}}function GY($,Z){try{T5((Q)=>{if($)Q.setEnabled($,!1,Z);else Q.disableAll()})}catch{}}function oZ($,Z){try{return T5((Q)=>Q.getConnection($,Z))}catch{return}}function fd($,Z){try{T5((Q)=>Q.deleteConnection($,Z))}catch{}}async function wd($){let Z=$.log??(()=>{}),Q;try{Q=T5((X)=>X.listConnections()).filter((X)=>X.enabled).map((X)=>({channel:X.channel,instanceId:X.instanceId,args:X.connectArgs}))}catch(X){return Z(`[connect] failed to read persisted connectors: ${X instanceof Error?X.message:String(X)}`),[]}let J=[];for(let X of Q){let{channel:W,instanceId:j}=X;if($.isHealthy?.(X)){Z(`[connect] skipping ${W} connector ${j}: already live in this host`);continue}Z(`[connect] reconnecting ${W} connector ${j}`);try{let Y=await $.start(X);if(J.push({channel:W,instanceId:j,ok:Y}),!Y)Z(`[connect] failed to reconnect ${W} connector ${j}`)}catch(Y){let V=Y instanceof Error?Y.message:String(Y);J.push({channel:W,instanceId:j,ok:!1,error:V}),Z(`[connect] failed to reconnect ${W} connector ${j}: ${V}`)}}return J}import{CLINE_CONNECTOR_STARTING_INSTANCE_ENV as Sd,CLINE_RUN_AS_HUB_DAEMON_ENV as bd}from"@cline/shared";var kd=/^CLINE_(?:CONNECTOR_DETACHED_CHILD|[A-Z0-9]+_CONNECT_CHILD)$/;function E5($=process.env){let Z={...$};delete Z[bd],delete Z[Sd];for(let Q of Object.keys(Z))if(kd.test(Q))delete Z[Q];return Z}var DO=1000,LO=60000,_O=5,zO=60000,HY=5000,OO=5000,NO=2000,md=100;function a2($,Z){return`${$}\x00${Z}`}function cd($){if(!Number.isInteger($)||$<=0)return!1;try{return process.kill($,0),!0}catch{return!1}}function FO($){return $===void 0?void 0:new Date($).toISOString()}class qO{entries=new Map;instanceLocks=new Map;pollTimer;disposed=!1;launchSpec;spawnProcess;isProcessRunning;killProcess;listActive;cleanupInstance;isAutostartEnabled;log;now;setTimer;clearTimer;constructor($={}){this.launchSpec=$.launchSpec??hd,this.spawnProcess=$.spawnProcess??xd,this.isProcessRunning=$.isProcessRunning??cd,this.killProcess=$.killProcess??((Z,Q)=>process.kill(Z,Q)),this.listActive=$.listActive??A5,this.cleanupInstance=$.cleanupInstance,this.isAutostartEnabled=$.isAutostartEnabled??((Z,Q)=>oZ(Z,Q)?.enabled===!0),this.log=$.log??((Z)=>process.stderr.write(`[hub-daemon] ${Z}
|
|
938
938
|
`)),this.now=$.now??(()=>Date.now()),this.setTimer=$.setTimer??((Z,Q)=>{let J=setTimeout(Z,Q);return J.unref?.(),J}),this.clearTimer=$.clearTimer??((Z)=>clearTimeout(Z))}adoptRunningConnectors(){let $=[];for(let Z of this.listActive()){let Q=a2(Z.type,Z.instanceId);if(this.entries.has(Q))continue;let J={channel:Z.type,instanceId:Z.instanceId,args:[],argsKnown:!1,origin:"adopted",state:"running",pid:Z.pid,startedAt:Z.startedAt?Date.parse(Z.startedAt):this.now(),restarts:0};this.entries.set(Q,J),$.push(this.toRecord(J)),this.log(`[connect] adopted running ${Z.type} connector ${Z.instanceId} pid=${Z.pid}`)}if($.length>0)this.ensurePolling();return $}withInstanceLock($,Z){let J=(this.instanceLocks.get($)??Promise.resolve()).then(Z,Z),X=J.then(()=>{return},()=>{return});return this.instanceLocks.set($,X),X.then(()=>{if(this.instanceLocks.get($)===X)this.instanceLocks.delete($)}),J}async start($){return this.withInstanceLock(a2($.channel,$.instanceId),()=>this.startLocked($))}async startLocked($){let{channel:Z,instanceId:Q}=$,J=a2(Z,Q),X=this.entries.get(J);if(X&&this.isEntryAlive(X)){if(!$.restart)return{started:!1,reason:"already_running",record:this.toRecord(X)};await this.stopLocked({channel:Z,instanceId:Q,disableAutostart:!1})}else if(X)this.cancelRestart(X),X.state="stopped",X.child?.removeAllListeners("exit");let W={channel:Z,instanceId:Q,args:[...$.args],argsKnown:!0,origin:"spawned",state:"running",restarts:X?.restarts??0};if(this.entries.set(J,W),this.spawnEntry(W),W.state!=="running")return{started:!1,record:this.toRecord(W)};return{started:!0,record:this.toRecord(W)}}async stop($){return this.withInstanceLock(a2($.channel,$.instanceId),()=>this.stopLocked($))}async stopLocked($){let Z=a2($.channel,$.instanceId),Q=this.entries.get(Z);if($.disableAutostart!==!1)GY($.channel,$.instanceId);if(!Q)return!1;this.cancelRestart(Q),Q.state="stopped";let J=Q.child?.pid??Q.pid;if(J&&this.isProcessRunning(J)){if(this.signal(J,"SIGTERM"),!await this.waitForProcessExit(J,OO))this.signal(J,"SIGKILL"),await this.waitForProcessExit(J,NO)}return await this.runCleanup(Q),this.entries.delete(Z),!0}signal($,Z){try{this.killProcess($,Z)}catch{}}async waitForProcessExit($,Z){let Q=this.now()+Z;while(this.isProcessRunning($)){if(this.now()>=Q)return!1;await new Promise((J)=>{this.setTimer(J,md)})}return!0}list(){return[...this.entries.values()].map(($)=>this.toRecord($)).sort(($,Z)=>$.channel.localeCompare(Z.channel)||$.instanceId.localeCompare(Z.instanceId))}dispose(){this.disposed=!0;for(let $ of this.entries.values())this.cancelRestart($),$.child?.removeAllListeners("exit");if(this.pollTimer!==void 0)this.clearTimer(this.pollTimer),this.pollTimer=void 0;this.entries.clear(),this.instanceLocks.clear()}spawnEntry($){let Z=this.launchSpec();if(!Z){$.state="failed",$.lastError="connector CLI launch information is unavailable",this.log(`[connect] cannot start ${$.channel} connector ${$.instanceId}: ${$.lastError}`);return}let Q=gd($.channel,$.instanceId),J=["ignore","ignore","ignore"];try{vd(Q);let X=yd(Q,"a");J=["ignore",X,X]}catch{}try{let X=this.spawnProcess(Z.launcher,[...Z.connectArgsPrefix,$.channel,...$.args],{cwd:Z.cwd,env:{...E5(),[Id]:"1"},detached:!0,stdio:J,windowsHide:!0});$.child=X,$.pid=X.pid??void 0,$.startedAt=this.now(),$.state="running",$.lastError=void 0,X.unref?.(),X.once("error",(W)=>{$.lastError=W instanceof Error?W.message:String(W),this.handleExit($,void 0,void 0)}),X.once("exit",(W,j)=>{this.handleExit($,W??void 0,j??void 0)}),this.log(`[connect] started ${$.channel} connector ${$.instanceId} pid=${$.pid}`)}catch(X){$.state="backoff",$.lastError=X instanceof Error?X.message:String(X),this.log(`[connect] failed to spawn ${$.channel} connector ${$.instanceId}: ${$.lastError}`),this.scheduleRestart($)}}handleExit($,Z,Q){if(this.disposed||$.state==="stopped")return;if($.child=void 0,$.pid=void 0,$.lastExitCode=Z,$.lastExitSignal=Q,$.startedAt!==void 0&&this.now()-$.startedAt>=zO)$.restarts=0;this.log(`[connect] ${$.channel} connector ${$.instanceId} exited${Z===void 0?"":` code=${Z}`}${Q?` signal=${Q}`:""}`),this.runCleanup($).then(()=>{let X=a2($.channel,$.instanceId);if(this.disposed||$.state==="stopped"||this.entries.get(X)!==$)return;if(!this.isAutostartEnabled($.channel,$.instanceId)){this.log(`[connect] not restarting ${$.channel} connector ${$.instanceId}: autostart is disabled`),this.entries.delete(X);return}this.scheduleRestart($)})}scheduleRestart($){if($.restarts>=_O){$.state="failed",$.nextRestartAt=void 0,this.log(`[connect] giving up on ${$.channel} connector ${$.instanceId} after ${$.restarts} failed restarts${$.lastError?`: ${$.lastError}`:""}`);return}let Z=Math.min(DO*2**$.restarts,LO);$.restarts+=1,$.state="backoff",$.nextRestartAt=this.now()+Z,this.log(`[connect] restarting ${$.channel} connector ${$.instanceId} in ${Z}ms (attempt ${$.restarts})`);let Q=a2($.channel,$.instanceId);$.restartTimer=this.setTimer(()=>{$.restartTimer=void 0,$.nextRestartAt=void 0,this.withInstanceLock(Q,async()=>{if(this.disposed||$.state==="stopped"||this.entries.get(Q)!==$)return;let J=this.resolveRestartArgs($);if(!J){$.state="failed",this.log(`[connect] cannot restart ${$.channel} connector ${$.instanceId}: no stored launch arguments`);return}$.args=J,$.argsKnown=!0,$.origin="spawned",this.spawnEntry($)})},Z)}resolveRestartArgs($){if($.argsKnown)return $.args;let Z=oZ($.channel,$.instanceId);return Z?.connectArgs?.length?Z.connectArgs:void 0}cancelRestart($){if($.restartTimer!==void 0)this.clearTimer($.restartTimer),$.restartTimer=void 0;$.nextRestartAt=void 0}async runCleanup($){if(!this.cleanupInstance)return;try{await this.cleanupInstance($.channel,$.instanceId)}catch(Z){this.log(`[connect] cleanup failed for ${$.channel} connector ${$.instanceId}: ${Z instanceof Error?Z.message:String(Z)}`)}}isEntryAlive($){if($.state==="backoff"||$.state==="failed")return!1;let Z=$.child?.pid??$.pid;return Z!==void 0&&this.isProcessRunning(Z)}ensurePolling(){if(this.pollTimer!==void 0||this.disposed)return;let $=()=>{if(this.pollTimer=void 0,this.disposed)return;for(let Z of[...this.entries.values()]){if(Z.origin!=="adopted"||Z.state!=="running"||Z.child)continue;if(Z.pid===void 0||!this.isProcessRunning(Z.pid))this.handleExit(Z,void 0,void 0)}if(this.hasAdoptedRunning())this.pollTimer=this.setTimer($,HY)};this.pollTimer=this.setTimer($,HY)}hasAdoptedRunning(){for(let $ of this.entries.values())if($.origin==="adopted"&&$.state==="running")return!0;return!1}toRecord($){return{channel:$.channel,instanceId:$.instanceId,state:$.state,origin:$.origin,restarts:$.restarts,...$.pid===void 0?{}:{pid:$.pid},...$.startedAt===void 0?{}:{startedAt:FO($.startedAt)},...$.nextRestartAt===void 0?{}:{nextRestartAt:FO($.nextRestartAt)},...$.lastExitCode===void 0?{}:{lastExitCode:$.lastExitCode},...$.lastExitSignal===void 0?{}:{lastExitSignal:$.lastExitSignal},...$.lastError===void 0?{}:{lastError:$.lastError}}}}var AO;function ud($){AO=$}function UY(){return AO}_0();function n2($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function sZ($){return typeof $==="string"?$.trim():void 0}function TO($){if(!n2($))return{};let Z={};for(let[Q,J]of Object.entries($))if(typeof J==="string")Z[Q]=J.trim();return Z}function nd(){return FY(($)=>$.listConfigs()).map(($)=>({id:$.channel,type:$.type,configuredAt:$.configuredAt,updatedAt:$.updatedAt})).sort(($,Z)=>$.type.localeCompare(Z.type))}function DY(){return{available:pd(),active:A5(),configured:nd()}}function od($,Z){if($.required&&!Z[$.flag]?.trim())throw Error(`${$.label} is required`)}function sd($,Z){let Q={};for(let X of $.fields)Q[X.flag]=Z[X.flag]??X.initialValue??"";let J={};for(let X of $.fields){if(!ad(X,Q))continue;od(X,Q),J[X.flag]=Q[X.flag]}return J}function td($){if(!n2($))throw Error("connector.configure payload must be an object.");let Z=sZ($.channel);if(!Z)throw Error("channel is required");let Q=ld.find((G)=>G.id===Z);if(!Q)throw Error(`unknown connector channel: ${Z}`);if(!new Set(id().map((G)=>G.name)).has(Q.id))throw Error(`connector channel is not available: ${Z}`);let X=TO($.values),W=sd(Q,X),j=n2($.security)?$.security:{},Y=j.enabled===!0,V=TO(j.values);if(Y&&Q.security)for(let G of Q.security.fields){let H=V[G.key];if(!H)throw Error(G.requiredMessage);let U=G.validate?.(H);if(U)throw Error(U)}let K=Y?{enabled:!0,values:V}:{enabled:!1,values:{}},B=dd(Q,W,K);return FY((G)=>G.upsertConfig({channel:Z,type:Z,values:W,security:K,updateConnectArgs:(H)=>rd(Q,H.connection.connectArgs,B,{replaceSecurityArgs:H.config?.security?.enabled===!0||K.enabled})})),DY()}function ed($){if(!n2($))throw Error("connector.delete_config payload must be an object.");let Z=sZ($.channel);if(!Z)throw Error("channel is required");return FY((Q)=>Q.deleteConfig(Z)),DY()}function $l($){return Array.isArray($)?$.filter((Z)=>typeof Z==="string"):[]}function LY(){let $=UY();if(!$)throw Error("connector supervision is unavailable in this hub; start connectors with the CLI instead");return $}function EO($){if(!n2($))throw Error("payload must be an object.");let Z=sZ($.channel);if(!Z)throw Error("channel is required");let Q=sZ($.instanceId);if(!Q)throw Error("instanceId is required");return{channel:Z,instanceId:Q}}async function Zl($){let{channel:Z,instanceId:Q}=EO($),J=n2($)?$:{};return await LY().start({channel:Z,instanceId:Q,args:$l(J.args),restart:J.restart===!0})}async function Ql($){let{channel:Z,instanceId:Q}=EO($),J=n2($)?$:{};return{stopped:await LY().stop({channel:Z,instanceId:Q,disableAutostart:J.disableAutostart!==!1}),channel:Z,instanceId:Q}}function Jl($){return $==="connector.configure"||$==="connector.delete_config"||$==="connector.start"||$==="connector.stop"}function M5($,Z,Q){if(!Jl(Z.command))return;n1($.telemetry,{ulid:Z.sessionId??Z.requestId??"hub",tool:Z.command,success:Q})}async function MO($,Z){try{if(Z.command==="connector.channels")return x(Z,DY());if(Z.command==="connector.configure"){let Q=td(Z.payload);return M5($,Z,!0),x(Z,Q)}if(Z.command==="connector.delete_config"){let Q=ed(Z.payload);return M5($,Z,!0),x(Z,Q)}if(Z.command==="connector.start"){let Q=await Zl(Z.payload);return M5($,Z,!0),x(Z,Q)}if(Z.command==="connector.stop"){let Q=await Ql(Z.payload);return M5($,Z,!0),x(Z,Q)}if(Z.command==="connector.supervised")return x(Z,{supervised:LY().list()});return h(Z,"unsupported_connector_command",`unsupported connector command: ${Z.command}`)}catch(Q){return M5($,Z,!1),h(Z,"connector_command_failed",Q instanceof Error?Q.message:String(Q))}}var Xl=30000;function Wl($){if($==="aborted")return"run.aborted";if($==="error"||$==="failed")return"run.failed";return"run.completed"}function jl($){if($.finishReason!=="error")return;return $.text.trim()||void 0}function Yl($,Z){let Q=$.activeRpcTurnCountBySession;Q.set(Z,(Q.get(Z)??0)+1);let J=!1;return()=>{if(J)return;J=!0;let X=(Q.get(Z)??1)-1;if(X<=0)Q.delete(Z);else Q.set(Z,X)}}function RO($,Z,Q){let J=Q instanceof Error&&Q.message.trim()?Q.message:`Unknown session: ${Z}`;return h($,D4,J)}function Vl($){return $?$:void 0}function Kl($){let Z=typeof $.timeoutMs==="number"?$.timeoutMs:typeof $.timeout_ms==="number"?$.timeout_ms:void 0;if(Z&&Number.isFinite(Z)&&Z>0)return Math.floor(Z);let Q=typeof $.timeoutSeconds==="number"?$.timeoutSeconds:typeof $.timeout_seconds==="number"?$.timeout_seconds:void 0;if(Q&&Number.isFinite(Q)&&Q>0)return Math.floor(Q*1000);return}async function Bl($,Z,Q,J){let X=performance.now(),W=!1,j={command:Z.command,requestId:Z.requestId,clientId:Z.clientId,sessionId:Q.sessionId,timeoutMs:J},Y=setInterval(()=>{if(W)return;let B=Math.round(performance.now()-X);p("warn","run.heartbeat",{...j,elapsedMs:B}),$.publish($.buildEvent("run.heartbeat",{requestId:Z.requestId,elapsedMs:B,...J?{timeoutMs:J}:{}},Q.sessionId))},Xl),V=$.sessionHost.runTurn(Q);V.then((B)=>{if(!W)return;p("warn","run.late_end",{...j,elapsedMs:Math.round(performance.now()-X),finishReason:B?.finishReason})},(B)=>{if(!W)return;p("error","run.late_error",{...j,elapsedMs:Math.round(performance.now()-X),error:B})});let K;try{if(!J)return await V;return await Promise.race([V,new Promise((B,G)=>{K=setTimeout(()=>{let H=`Hub run ${Z.command} timed out after ${J}ms.`;W=!0,clearInterval(Y),G(Error(H)),p("error","run.timeout",{...j,elapsedMs:Math.round(performance.now()-X)}),BY($,(U)=>U.sessionId===Q.sessionId,H),Q2($,(U)=>U.sessionId===Q.sessionId,H),$.sessionHost.abort(Q.sessionId,H).catch((U)=>{p("error","run.timeout_abort_failed",{...j,error:U})})},J)})])}finally{if(W=!0,clearInterval(Y),K)clearTimeout(K)}}async function R5($,Z){let Q=O0(Z),J=Z.payload&&typeof Z.payload==="object"?Z.payload:{},X=typeof J.prompt==="string"?J.prompt:typeof J.input==="string"?J.input:"";if(!X.trim())return h(Z,"invalid_session_input","session input requires a prompt string");if(!await $.sessionHost.getSession(Q))return RO(Z,Q);$.publish($.buildEvent("run.started",{...Z.requestId?{requestId:Z.requestId}:{},...Z.clientId?{clientId:Z.clientId}:{}},Q));let j=J.attachments&&typeof J.attachments==="object"&&!Array.isArray(J.attachments)?J.attachments:void 0,Y=Array.isArray(j?.userFiles)?j.userFiles.filter((H)=>typeof H==="string"):void 0,V=Kl(J);$.suppressNextTerminalEventBySession.set(Q,"run.start.reply");let K=Yl($,Q),B;try{try{B=await Bl($,Z,{sessionId:Q,prompt:X,mode:Vl(J.mode),delivery:J.delivery==="queue"||J.delivery==="steer"?J.delivery:void 0,userImages:Array.isArray(j?.userImages)?j.userImages:void 0,userFiles:Y,timeoutMs:V},V)}catch(H){if($.suppressNextTerminalEventBySession.get(Q)==="run.start.reply")$.suppressNextTerminalEventBySession.delete(Q);if(h$(H))return RO(Z,Q,H);throw $.publish($.buildEvent("run.failed",{reason:"error",error:H instanceof Error?H.message:String(H)},Q)),H}if(B){let H=await t0($,Q),U=jl(B);if($.publish($.buildEvent(Wl(B.finishReason),{reason:B.finishReason,...U?{error:U}:{},result:B,...H?{snapshot:H}:{}},Q)),$.suppressNextTerminalEventBySession.get(Q)==="run.start.reply")$.suppressNextTerminalEventBySession.delete(Q)}else $.suppressNextTerminalEventBySession.delete(Q)}finally{K()}let G=await t0($,Q);return x(Z,B||G?{...B?{result:B}:{},...G?{snapshot:G}:{}}:void 0)}async function CO($,Z){let Q=O0(Z),J=typeof Z.payload?.reason==="string"?Z.payload.reason:"Run was aborted before pending approval or capability request was resolved.";BY($,(X)=>X.sessionId===Q,J);try{await $.sessionHost.abort(Q,Z.payload?.reason)}catch(X){p("warn","run.abort_failed",{command:Z.command,requestId:Z.requestId,clientId:Z.clientId,sessionId:Q,error:X})}finally{Q2($,(X)=>X.sessionId===Q,J)}return x(Z,{applied:!0})}async function PO($,Z){let Q=O0(Z);if(!Q)return h(Z,"invalid_session_id","run.proceed_while_running requires a sessionId");if(typeof $.sessionHost.proceedWhileRunning!=="function")return h(Z,"unsupported_command","This runtime does not support proceeding while commands are running.");let J=typeof Z.payload?.toolCallId==="string"&&Z.payload.toolCallId.trim().length>0?Z.payload.toolCallId.trim():void 0,X=await $.sessionHost.proceedWhileRunning(Q,J);return x(Z,{detachedCount:X})}async function fO($,Z){let Q=BZ(Z.payload?.payload);if(!Q)return h(Z,"invalid_hook_payload","session.hook requires a valid hook event payload");return await $.sessionHost.dispatchHookEvent(Q),x(Z,{applied:!0})}import{join as Gl}from"node:path";import{createSessionId as Hl}from"@cline/shared";import{loadSqliteDb as Ul}from"@cline/shared/db";import{resolveDbDataDir as Fl}from"@cline/shared/storage";var Dl=32,Ll=604800000;class tZ extends Error{retryable=!0;constructor($,Z,Q){super(`Session ${$} queue is full (${Z} pending runs, limit ${Q}); retry later.`);this.name="HubRunAdmissionRejectedError"}}function _l($){let Z=$?.replace(/[^a-zA-Z0-9_-]/g,"-");return Gl(Fl(),Z?`hub-runs-${Z}.db`:"hub-runs.db")}class _Y{db;maxPendingPerSession;closed=!1;constructor($={}){this.db=Ul($.dbPath??_l($.ownerId)),this.maxPendingPerSession=$.maxPendingPerSession??Dl,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
|
|
939
939
|
CREATE TABLE IF NOT EXISTS hub_runs (
|
|
940
940
|
accepted_seq INTEGER PRIMARY KEY AUTOINCREMENT,
|